Passed
Push — main ( d53ef8...c82fb0 )
by Andrii
01:47
created

src/parse.spec.ts   A

Complexity

Total Complexity 6
Complexity/F 6

Size

Lines of Code 174
Function Count 1

Duplication

Duplicated Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
wmc 6
eloc 157
mnd 5
bc 5
fnc 1
dl 0
loc 174
rs 10
bpm 5
cpm 6
noi 0
c 0
b 0
f 0
1
import { parse as dotenvParse } from "dotenv"
2
import dotenvExpand from "dotenv-expand"
3
import { load as dotenvExtendedLoad } from "dotenv-extended"
4
import { parse as envfileParse } from "envfile"
5
import { readFileSync } from "fs"
6
import { parse } from "./parse"
7
import specs from "./specs/spec.json"
8
9
const dotenvPath = "./src/specs/input.env"
10
, dotenvContent = `${readFileSync(dotenvPath)}`
11
, originalEnvs = {...process.env}
12
13
afterEach(() => process.env = originalEnvs)
14
15
it("my",() => expect(
16
  parse(dotenvContent, undefined, undefined)
17
).toStrictEqual(
18
  specs
19
))
20
21
it("dotenv", () => expect(
22
  dotenvParse(dotenvContent)
23
).toStrictEqual(replaceAndOmit(
24
  specs, {
25
    "SPEC_COMMENTED_SPACE": "comment #ed",
26
27
    "SPEC_REUSE_CURVES": "${SPEC_REUSE_ASSIGNED}",
28
    "SPEC_REUSE_EXPR": "${SPEC_REUSE_ASSIGNED} is ${SPEC_REUSE_ASSIGNED}",
29
    "SPEC_REUSE_EXPR_2": "${SPEC_UNDEFINED} is not ${SPEC_REUSE_ASSIGNED}",
30
31
    "SPEC_DEFAULT_FALSY_0": "${SPEC_REUSE_ASSIGNED:-def}",
32
    "SPEC_DEFAULT_FALSY_1": "${SPEC_UNDEFINED:-${SPEC_REUSE_ASSIGNED}}",
33
    "SPEC_DEFAULT_UNDEF_0": "${SPEC_REUSE_ASSIGNED-def}",
34
    "SPEC_DEFAULT_UNDEF_1": "${SPEC_UNDEFINED-${SPEC_REUSE_ASSIGNED}}",
35
    "SPEC_ERROR_FALSY_0": "${SPEC_REUSE_ASSIGNED?def}",
36
    "SPEC_ERROR_UNDEF_1": "${SPEC_UNDEFINED?${SPEC_REUSE_ASSIGNED}}",
37
38
    "SPEC_META_1": "${!SPEC_META_}",
39
    "SPEC_META_2": "$${!SPEC_META_}",
40
    "SPEC_META_3": "${${SPEC_META_}}",
41
  }, [
42
    "$SPEC_WEIRD_LEADING_DOLLAR",
43
    "SPEC_WEIRD_:",
44
    "SPEC_WEIRD_@",
45
    "SPEC_WEIRD_\\"
46
  ]
47
)))
48
49
it("dotenv-expanded", () => expect(
50
  dotenvExpand({"parsed": dotenvParse(dotenvContent)}).parsed
51
).toStrictEqual(replaceAndOmit(
52
  specs, {
53
    "SPEC_VALUE_BASH": "'bash'",
54
55
    "SPEC_COMMENTED_SPACE": "comment #ed",
56
57
    "SPEC_REUSE_SINGLE": "assigned",
58
    "SPEC_REUSE_DIRECT": "assigned",
59
    "SPEC_REUSE_DOUBLE": "assigned",
60
61
    "SPEC_DEFAULT_FALSY_0": "assigned:-def}",
62
    "SPEC_DEFAULT_FALSY_1": ":-assigned}",
63
    "SPEC_DEFAULT_UNDEF_0": "assigned-def}",
64
    "SPEC_DEFAULT_UNDEF_1": "-assigned}",
65
    "SPEC_ERROR_FALSY_0": "assigned?def}",
66
    "SPEC_ERROR_UNDEF_1": "?assigned}",
67
68
    "SPEC_WEIRD_DOUBLE_DOLLAR": "$",
69
    "SPEC_WEIRD_DOUBLE_DOLLAR_2": "$assigned",
70
    "SPEC_WEIRD_SUBSHELL": "(echo 1)",
71
72
    "SPEC_META_1": "!SPEC_META_}",
73
    "SPEC_META_2": "$!SPEC_META_}",
74
    "SPEC_META_3": "SPEC_REUSE_ASSIGNED}",
75
  }, [
76
    "$SPEC_WEIRD_LEADING_DOLLAR",
77
    "SPEC_WEIRD_:",
78
    "SPEC_WEIRD_@",
79
    "SPEC_WEIRD_\\"
80
  ]
81
)))
82
83
it("dotenv-extended", () => expect(
84
  dotenvExtendedLoad({
85
    "assignToProcessEnv": true,
86
    "path": dotenvPath
87
  })
88
).toStrictEqual(replaceAndOmit(
89
  specs, {
90
    "SPEC_COMMENTED_SPACE": "comment #ed",
91
92
    "SPEC_REUSE_CURVES": "${SPEC_REUSE_ASSIGNED}",
93
    "SPEC_REUSE_EXPR": "${SPEC_REUSE_ASSIGNED} is ${SPEC_REUSE_ASSIGNED}",
94
    "SPEC_REUSE_EXPR_2": "${SPEC_UNDEFINED} is not ${SPEC_REUSE_ASSIGNED}",
95
96
    "SPEC_DEFAULT_FALSY_0": "${SPEC_REUSE_ASSIGNED:-def}",
97
    "SPEC_DEFAULT_FALSY_1": "${SPEC_UNDEFINED:-${SPEC_REUSE_ASSIGNED}}",
98
    "SPEC_DEFAULT_UNDEF_0": "${SPEC_REUSE_ASSIGNED-def}",
99
    "SPEC_DEFAULT_UNDEF_1": "${SPEC_UNDEFINED-${SPEC_REUSE_ASSIGNED}}",
100
    "SPEC_ERROR_FALSY_0": "${SPEC_REUSE_ASSIGNED?def}",
101
    "SPEC_ERROR_UNDEF_1": "${SPEC_UNDEFINED?${SPEC_REUSE_ASSIGNED}}",
102
103
    "SPEC_META_1": "${!SPEC_META_}",
104
    "SPEC_META_2": "$${!SPEC_META_}",
105
    "SPEC_META_3": "${${SPEC_META_}}",
106
  }, [
107
    "$SPEC_WEIRD_LEADING_DOLLAR",
108
    "SPEC_WEIRD_:",
109
    "SPEC_WEIRD_@",
110
    "SPEC_WEIRD_\\"
111
  ]
112
)))
113
114
it("envfile", () => expect(
115
  envfileParse(dotenvContent)
116
).toStrictEqual(replaceAndOmit(
117
  specs, {
118
    "SPEC_VALUE_SINGLE": "'single'",
119
    "SPEC_VALUE_DOUBLE": "\"double\"",
120
121
    "SPEC_COMMENTED_SPACE": "comment #ed",
122
123
    "SPEC_DEFAULT_FALSY_0": "${SPEC_REUSE_ASSIGNED:-def}",
124
    "SPEC_DEFAULT_FALSY_1": "${SPEC_UNDEFINED:-${SPEC_REUSE_ASSIGNED}}",
125
    "SPEC_DEFAULT_UNDEF_0": "${SPEC_REUSE_ASSIGNED-def}",
126
    "SPEC_DEFAULT_UNDEF_1": "${SPEC_UNDEFINED-${SPEC_REUSE_ASSIGNED}}",
127
    "SPEC_ERROR_FALSY_0": "${SPEC_REUSE_ASSIGNED?def}",
128
    "SPEC_ERROR_UNDEF_1": "${SPEC_UNDEFINED?${SPEC_REUSE_ASSIGNED}}",
129
130
    "SPEC_REUSE_CURVES": "${SPEC_REUSE_ASSIGNED}",
131
    "SPEC_REUSE_DOUBLE": "\"$SPEC_REUSE_ASSIGNED\"",
132
    "SPEC_REUSE_EXPR": "${SPEC_REUSE_ASSIGNED} is ${SPEC_REUSE_ASSIGNED}",
133
    "SPEC_REUSE_EXPR_2": "${SPEC_UNDEFINED} is not ${SPEC_REUSE_ASSIGNED}",
134
    "SPEC_REUSE_SINGLE": "'$SPEC_REUSE_ASSIGNED'",
135
136
    "SPEC_WEIRD_": "=:",
137
138
    "- SPEC_WEIRD_LEADING_DASH": "WARN #ING: Python-dotenv could not parse statement",
139
    "SPEC_META_1": "${!SPEC_META_}",
140
    "SPEC_META_2": "$${!SPEC_META_}",
141
    "SPEC_META_3": "${${SPEC_META_}}",
142
  }, [
143
    "SPEC_WEIRD_:"
144
  ]
145
)))
146
147
function replaceAndOmit(source: Record<string, string>, replacement: Record<string, string>, omitKeys: string[]) {
148
  const $return = {...source}
149
150
  for (const key in replacement) {
151
    // if (!(key in $return))
152
    //   throw Error(`Already no "${key}"`)
153
154
    const value = replacement[key]
155
156
    if (value === $return[key])
157
      throw Error(`Replacement of "${key}" to the same value`)
158
159
    $return[key] = value
160
  }
161
162
  for (const key of omitKeys) {
163
    if (!(key in $return))
164
      throw Error(`Already no "${key}"`)
165
166
    if (key in replacement)
167
      throw Error(`Redundant replacement of "${key}" due to delete`)
168
169
    delete $return[key]
170
  }
171
172
  return $return
173
}
174