1
|
|
|
import { join } from "../research/utils" |
2
|
|
|
import { parse } from "./parse" |
3
|
|
|
|
4
|
|
|
describe(parse.name, () => { |
5
|
|
|
describe("Complex input", () => { |
6
|
|
|
it(...p(Buffer.from("SPEC_DIRECT=direct"), {"SPEC_DIRECT": "direct"})) |
7
|
|
|
it(...p(["A=1", "B=2"], {"A": "1", "B": "2"})) |
8
|
|
|
}) |
9
|
|
|
|
10
|
|
|
describe("Straight stuff", () => { |
11
|
|
|
it(...p("SPEC_" , {})) |
12
|
|
|
it(...p("SPEC_EMPTY=" , {"SPEC_EMPTY": ""})) |
13
|
|
|
it(...p("SPEC_DIRECT=direct" , {"SPEC_DIRECT": "direct"})) |
14
|
|
|
it(...p("SPEC_SINGLE='single'" , {"SPEC_SINGLE": "single"})) |
15
|
|
|
it(...p("SPEC_DOUBLE=\"double\"" , {"SPEC_DOUBLE": "double"})) |
16
|
|
|
it(...p("SPEC_BACKTICK=`backtick`", {"SPEC_BACKTICK": "`backtick`"})) |
17
|
|
|
it(...p("SPEC_BASH=$'bash'" , {"SPEC_BASH": "$'bash'"})) |
18
|
|
|
it(...p("SPEC_SPACE=abc def" , {"SPEC_SPACE": "abc def"})) |
19
|
|
|
}) |
20
|
|
|
|
21
|
|
|
describe("Commented value", () => { |
22
|
|
|
it(...p("SPEC_COMMENTED_VALUE=#commented" , {"SPEC_COMMENTED_VALUE": "#commented"})) |
23
|
|
|
it(...p("SPEC_COMMENTED_MIDDLE=comment#ed", {"SPEC_COMMENTED_MIDDLE": "comment#ed"})) |
24
|
|
|
it(...p("SPEC_COMMENTED_SPACE=comment #ed", {"SPEC_COMMENTED_SPACE": "comment"})) |
25
|
|
|
it(...p("# SPEC_COMMENT=comment" , {})) |
26
|
|
|
}) |
27
|
|
|
|
28
|
|
|
describe("Tricky", () => { |
29
|
|
|
it(...p("SPEC_ONELINE_1=1; SPEC_ONELINE_2=1", {"SPEC_ONELINE_1": "1; SPEC_ONELINE_2=1"})) |
30
|
|
|
it(...p("SPEC_SUBSHELL=$(echo 1)" , {"SPEC_SUBSHELL": "$(echo 1)"})) |
31
|
|
|
it(...p(" SPEC_LEADING_SPACE=space" , {"SPEC_LEADING_SPACE": "space"})) |
32
|
|
|
it(...p("- SPEC_LEADING_DASH=WARN" , {})) |
33
|
|
|
it(...p("$SPEC_LEADING_DOLLAR=l$" , {"$SPEC_LEADING_DOLLAR": "l$"})) |
34
|
|
|
it(...p("1SPEC_LEADING_DIGIT=1" , {"1SPEC_LEADING_DIGIT": "1"})) |
35
|
|
|
it(...p("=SPEC_LEADING_EQ=WARN" , {})) |
36
|
|
|
it.skip(...p("SPEC_UNQUOTED=\" #WARN" , {})) |
37
|
|
|
it.skip(...p('"SPEC_ESCAPE": "\""' , {"SPEC_ESCAPE": "\""})) |
38
|
|
|
}) |
39
|
|
|
|
40
|
|
|
describe("Not standard names", () => { |
41
|
|
|
it(...p("SPEC_lowercase=Lowercase", {"SPEC_lowercase": "Lowercase"})) |
42
|
|
|
it(...p("SPEC_-=-" , {"SPEC_-": "-"})) |
43
|
|
|
it(...p("SPEC_:=:" , {"SPEC_:": ":"})) |
44
|
|
|
it(...p("SPEC_@=@" , {"SPEC_@": "@"})) |
45
|
|
|
it(...p("SPEC_\\==`=`" , {"SPEC_\\": "=`=`"})) |
46
|
|
|
}) |
47
|
|
|
|
48
|
|
|
describe("Reuse", () => { |
49
|
|
|
it(...p("Straight", [ |
50
|
|
|
"SPEC_ASSIGNED=assigned", |
51
|
|
|
"SPEC_REUSE_DIRECT=$SPEC_ASSIGNED", |
52
|
|
|
"SPEC_REUSE_SINGLE='$SPEC_ASSIGNED'", |
53
|
|
|
"SPEC_REUSE_DOUBLE=\"$SPEC_ASSIGNED\"", |
54
|
|
|
"SPEC_REUSE_CURVES=${SPEC_ASSIGNED}", |
55
|
|
|
"SPEC_REUSE_EXPR=${SPEC_ASSIGNED} is ${SPEC_ASSIGNED}", |
56
|
|
|
"SPEC_REUSE_EXPR_2=${X} is not ${SPEC_ASSIGNED}" |
57
|
|
|
], { |
58
|
|
|
"SPEC_ASSIGNED": "assigned", |
59
|
|
|
"SPEC_REUSE_DIRECT": "$SPEC_ASSIGNED", |
60
|
|
|
"SPEC_REUSE_SINGLE": "$SPEC_ASSIGNED", |
61
|
|
|
"SPEC_REUSE_DOUBLE": "$SPEC_ASSIGNED", |
62
|
|
|
"SPEC_REUSE_CURVES": "assigned", |
63
|
|
|
"SPEC_REUSE_EXPR": "assigned is assigned", |
64
|
|
|
"SPEC_REUSE_EXPR_2": " is not assigned", |
65
|
|
|
})) |
66
|
|
|
}) |
67
|
|
|
|
68
|
|
|
describe("Defaults and Errors",() => { |
69
|
|
|
it(...p("Done", [ |
70
|
|
|
"SPEC_ASSIGNED=assigned", |
71
|
|
|
// Works |
72
|
|
|
"SPEC_DEFAULT_FALSY_0=${SPEC_ASSIGNED:-def}", |
73
|
|
|
"SPEC_DEFAULT_FALSY_1=${X:-${SPEC_ASSIGNED}}", |
74
|
|
|
// Whatever |
75
|
|
|
"SPEC_DEFAULT_UNDEF_0=${SPEC_ASSIGNED-def}", |
76
|
|
|
"SPEC_ERROR_FALSY_0=${SPEC_ASSIGNED?def}", |
77
|
|
|
"SPEC_DEFAULT_UNDEF_1=${X-${SPEC_ASSIGNED}}", |
78
|
|
|
"SPEC_ERROR_UNDEF_1=${X?${SPEC_ASSIGNED}}", |
79
|
|
|
], { |
80
|
|
|
"SPEC_ASSIGNED": "assigned", |
81
|
|
|
// Works |
82
|
|
|
"SPEC_DEFAULT_FALSY_0": "assigned", |
83
|
|
|
"SPEC_DEFAULT_FALSY_1": "${SPEC_ASSIGNED}", |
84
|
|
|
// Whatever |
85
|
|
|
"SPEC_DEFAULT_UNDEF_0": "", |
86
|
|
|
"SPEC_ERROR_FALSY_0": "", |
87
|
|
|
"SPEC_DEFAULT_UNDEF_1": "}", |
88
|
|
|
"SPEC_ERROR_UNDEF_1": "}" |
89
|
|
|
})) |
90
|
|
|
|
91
|
|
|
it.skip(...p("Ununderstandable Errors", [ |
92
|
|
|
"SPEC_ASSIGNED=assigned", |
93
|
|
|
"SPEC_ERROR_UNDEF_0=${SPEC_ASSIGNED:?def}", |
94
|
|
|
"SPEC_ERROR_FALSY_1=${X:?${SPEC_ASSIGNED}}" |
95
|
|
|
], { |
96
|
|
|
"SPEC_ASSIGNED": "assigned", |
97
|
|
|
"SPEC_ERROR_UNDEF_0": "${SPEC_ASSIGNED:?def}", |
98
|
|
|
"SPEC_ERROR_FALSY_1": "${X:?assigned}" |
99
|
|
|
})) |
100
|
|
|
}) |
101
|
|
|
|
102
|
|
|
describe("Scope, reserved", () => { |
103
|
|
|
it("Scope", () => expect(parse( |
104
|
|
|
join( |
105
|
|
|
"ME=me", |
106
|
|
|
"GLOBAL=me", |
107
|
|
|
"FROM_ME=${ME}", |
108
|
|
|
"FROM_GLOBAL=${GLOBAL}" |
109
|
|
|
), |
110
|
|
|
{"GLOBAL": "global"}, |
111
|
|
|
undefined |
112
|
|
|
)).toStrictEqual({ |
113
|
|
|
"ME": "me", |
114
|
|
|
"FROM_ME": "me", |
115
|
|
|
"FROM_GLOBAL": "global" |
116
|
|
|
})) |
117
|
|
|
|
118
|
|
|
it("Reserved", () => expect(parse( |
119
|
|
|
"OVERWRITE=me", |
120
|
|
|
undefined, |
121
|
|
|
{"OVERWRITE": undefined}, |
122
|
|
|
)).toStrictEqual({ |
123
|
|
|
})) |
124
|
|
|
}) |
125
|
|
|
|
126
|
|
|
it("Process.ENV values", () => expect(parse( |
127
|
|
|
join( |
128
|
|
|
"U=${Undefined}", |
129
|
|
|
"N=${Null}", |
130
|
|
|
"F=${False}", |
131
|
|
|
"Z=${Zero}" |
132
|
|
|
), |
133
|
|
|
{ |
134
|
|
|
"Undefined": undefined, |
135
|
|
|
"Null": null, |
136
|
|
|
//@ts-expect-error |
137
|
|
|
"False": false, |
138
|
|
|
//@ts-expect-error |
139
|
|
|
"Zero": 0 |
140
|
|
|
}, |
141
|
|
|
undefined |
142
|
|
|
)).toStrictEqual({ |
143
|
|
|
"U": "", |
144
|
|
|
"N": "", |
145
|
|
|
"F": "false", |
146
|
|
|
"Z": "0" |
147
|
|
|
})) |
148
|
|
|
}) |
149
|
|
|
|
150
|
|
|
|
151
|
|
|
function p(input: Buffer|string|string[], output: unknown): ReturnType<typeof _p> |
152
|
|
|
function p(title: string, input: Buffer|string|string[], output: unknown): ReturnType<typeof _p> |
153
|
|
|
function p(...args: any[]) { |
154
|
|
|
//@ts-expect-error |
155
|
|
|
return _p(...args.reverse()) |
156
|
|
|
} |
157
|
|
|
|
158
|
|
|
function _p(output: unknown, input: Buffer|string|string[], title?: string) { |
159
|
|
|
const arg = input instanceof Buffer ? input : join(input) |
160
|
|
|
|
161
|
|
|
return [`${title ?? arg}`, () => expect(parse( |
162
|
|
|
arg, |
163
|
|
|
undefined, |
164
|
|
|
undefined |
165
|
|
|
)).toStrictEqual(output)] as const |
166
|
|
|
} |
167
|
|
|
|