varlock 0.0.6 → 0.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/auto-load.js +6 -5
- package/dist/{chunk-X3HJMANF.js → chunk-5B7JZEDE.js} +6 -5
- package/dist/chunk-5B7JZEDE.js.map +1 -0
- package/dist/{chunk-USSBWRQF.js → chunk-6FFRZOIK.js} +8 -8
- package/dist/{chunk-USSBWRQF.js.map → chunk-6FFRZOIK.js.map} +1 -1
- package/dist/{chunk-7TXRGZZC.js → chunk-7OHVYEDG.js} +4 -3
- package/dist/chunk-7OHVYEDG.js.map +1 -0
- package/dist/{chunk-656FP6YP.js → chunk-BM3UAHAH.js} +5 -6
- package/dist/chunk-BM3UAHAH.js.map +1 -0
- package/dist/chunk-CQHOPN6M.js +14 -0
- package/dist/{chunk-YSPDPNBR.js.map → chunk-CQHOPN6M.js.map} +1 -1
- package/dist/{chunk-WGUFO7CT.js → chunk-GYHC6Y7D.js} +7 -8
- package/dist/chunk-GYHC6Y7D.js.map +1 -0
- package/dist/{chunk-DAZNZPLN.js → chunk-H5PNRKYP.js} +559 -75
- package/dist/chunk-H5PNRKYP.js.map +1 -0
- package/dist/chunk-LZ45SLAI.js +12 -0
- package/dist/chunk-LZ45SLAI.js.map +1 -0
- package/dist/{chunk-ANHWU7RB.js → chunk-MPS3IXAW.js} +18 -7
- package/dist/chunk-MPS3IXAW.js.map +1 -0
- package/dist/{chunk-ASGIMFTP.js → chunk-P74HB2II.js} +4 -3
- package/dist/chunk-P74HB2II.js.map +1 -0
- package/dist/{chunk-JX4PYL7V.js → chunk-PQPGBNGV.js} +6 -7
- package/dist/chunk-PQPGBNGV.js.map +1 -0
- package/dist/{chunk-46HUIBFX.js → chunk-SHQHITWV.js} +9 -12
- package/dist/chunk-SHQHITWV.js.map +1 -0
- package/dist/{chunk-HBCSJWPN.js → chunk-UFPWQAFZ.js} +14 -14
- package/dist/chunk-UFPWQAFZ.js.map +1 -0
- package/dist/{chunk-INMYFAWB.js → chunk-Y2RFMQ5X.js} +342 -60
- package/dist/chunk-Y2RFMQ5X.js.map +1 -0
- package/dist/{chunk-BIYA4LBB.js → chunk-YK4SATSE.js} +7 -8
- package/dist/chunk-YK4SATSE.js.map +1 -0
- package/dist/cli/cli-executable.js +25 -33
- package/dist/cli/cli-executable.js.map +1 -1
- package/dist/dotenv-compat.js +6 -5
- package/dist/{env-B8lQt2sl.d.ts → env-k8iRuXIH.d.ts} +2 -2
- package/dist/index.d.ts +27 -2
- package/dist/index.js +28 -12
- package/dist/index.js.map +1 -1
- package/dist/init.command-L4HF4372.js +9 -0
- package/dist/{init.command-3DHC5DNC.js.map → init.command-L4HF4372.js.map} +1 -1
- package/dist/load.command-VHNPXTDI.js +9 -0
- package/dist/{load.command-CTOV5PYR.js.map → load.command-VHNPXTDI.js.map} +1 -1
- package/dist/login.command-OIQBNMNZ.js +8 -0
- package/dist/{login.command-UZBZIPP3.js.map → login.command-OIQBNMNZ.js.map} +1 -1
- package/dist/run.command-2OE432A5.js +9 -0
- package/dist/{run.command-5276KIMX.js.map → run.command-2OE432A5.js.map} +1 -1
- package/dist/runtime/env.d.ts +1 -1
- package/dist/runtime/env.js +1 -1
- package/dist/runtime/patch-console.js +3 -2
- package/dist/runtime/patch-response.js +3 -2
- package/dist/runtime/patch-server-response.js +3 -2
- package/dist/telemetry.command-MYQU7FPB.js +8 -0
- package/dist/{telemetry.command-UHJTZULL.js.map → telemetry.command-MYQU7FPB.js.map} +1 -1
- package/package.json +9 -9
- package/dist/chunk-3NTATUIY.js +0 -17
- package/dist/chunk-3NTATUIY.js.map +0 -1
- package/dist/chunk-46HUIBFX.js.map +0 -1
- package/dist/chunk-5URKU5HG.js +0 -172
- package/dist/chunk-5URKU5HG.js.map +0 -1
- package/dist/chunk-656FP6YP.js.map +0 -1
- package/dist/chunk-7TXRGZZC.js.map +0 -1
- package/dist/chunk-ANHWU7RB.js.map +0 -1
- package/dist/chunk-ASGIMFTP.js.map +0 -1
- package/dist/chunk-BIYA4LBB.js.map +0 -1
- package/dist/chunk-DAZNZPLN.js.map +0 -1
- package/dist/chunk-HBCSJWPN.js.map +0 -1
- package/dist/chunk-HH7DAS63.js +0 -540
- package/dist/chunk-HH7DAS63.js.map +0 -1
- package/dist/chunk-I3J2UCH7.js +0 -32
- package/dist/chunk-I3J2UCH7.js.map +0 -1
- package/dist/chunk-INMYFAWB.js.map +0 -1
- package/dist/chunk-JX4PYL7V.js.map +0 -1
- package/dist/chunk-LHTLO65N.js +0 -99
- package/dist/chunk-LHTLO65N.js.map +0 -1
- package/dist/chunk-PUGFIZE3.js +0 -143
- package/dist/chunk-PUGFIZE3.js.map +0 -1
- package/dist/chunk-WGUFO7CT.js.map +0 -1
- package/dist/chunk-X3HJMANF.js.map +0 -1
- package/dist/chunk-YSPDPNBR.js +0 -14
- package/dist/doctor.command-SBG4H7Z4.js +0 -7
- package/dist/doctor.command-SBG4H7Z4.js.map +0 -1
- package/dist/encrypt.command-AGHQ4KTI.js +0 -7
- package/dist/encrypt.command-AGHQ4KTI.js.map +0 -1
- package/dist/init.command-3DHC5DNC.js +0 -13
- package/dist/load.command-CTOV5PYR.js +0 -12
- package/dist/login.command-UZBZIPP3.js +0 -10
- package/dist/run.command-5276KIMX.js +0 -12
- package/dist/telemetry.command-UHJTZULL.js +0 -10
package/dist/chunk-HH7DAS63.js
DELETED
|
@@ -1,540 +0,0 @@
|
|
|
1
|
-
import { detectJsPackageManager, logLines, fmt, pathExists, installJsDependency } from './chunk-WGUFO7CT.js';
|
|
2
|
-
import { ve, pD, dD, SD, LD } from './chunk-DAZNZPLN.js';
|
|
3
|
-
import { define } from './chunk-33ROL4J5.js';
|
|
4
|
-
import { loadVarlockEnvGraph } from './chunk-3NTATUIY.js';
|
|
5
|
-
import { ansis_default } from './chunk-5URKU5HG.js';
|
|
6
|
-
import { gracefulExit } from './chunk-LHTLO65N.js';
|
|
7
|
-
import { StaticValueResolver, DotEnvFileDataSource, checkIsFileGitIgnored } from './chunk-INMYFAWB.js';
|
|
8
|
-
import { __name } from './chunk-XN24GZXQ.js';
|
|
9
|
-
import path from 'node:path';
|
|
10
|
-
import fs2 from 'node:fs/promises';
|
|
11
|
-
import { envSpecUpdater, ParsedEnvSpecStaticValue, parseEnvSpecDotEnvFile } from '@env-spec/parser';
|
|
12
|
-
import { WriteStream } from 'node:tty';
|
|
13
|
-
import process2 from 'node:process';
|
|
14
|
-
|
|
15
|
-
function isUnicodeSupported() {
|
|
16
|
-
const { env } = process2;
|
|
17
|
-
const { TERM, TERM_PROGRAM } = env;
|
|
18
|
-
if (process2.platform !== "win32") {
|
|
19
|
-
return TERM !== "linux";
|
|
20
|
-
}
|
|
21
|
-
return Boolean(env.WT_SESSION) || Boolean(env.TERMINUS_SUBLIME) || env.ConEmuTask === "{cmd::Cmder}" || TERM_PROGRAM === "Terminus-Sublime" || TERM_PROGRAM === "vscode" || TERM === "xterm-256color" || TERM === "alacritty" || TERM === "rxvt-unicode" || TERM === "rxvt-unicode-256color" || env.TERMINAL_EMULATOR === "JetBrains-JediTerm";
|
|
22
|
-
}
|
|
23
|
-
__name(isUnicodeSupported, "isUnicodeSupported");
|
|
24
|
-
|
|
25
|
-
// src/cli/helpers/prompts.ts
|
|
26
|
-
var unicode = isUnicodeSupported();
|
|
27
|
-
var unicodeOr = /* @__PURE__ */ __name((c, fallback) => unicode ? c : fallback, "unicodeOr");
|
|
28
|
-
var S_STEP_ACTIVE = unicodeOr("\u25C6", "*");
|
|
29
|
-
var S_STEP_CANCEL = unicodeOr("\u25A0", "x");
|
|
30
|
-
var S_STEP_ERROR = unicodeOr("\u25B2", "x");
|
|
31
|
-
var S_STEP_SUBMIT = unicodeOr("\u25C7", "o");
|
|
32
|
-
unicodeOr("\u250C", "T");
|
|
33
|
-
var S_BAR = unicodeOr("\u2502", "|");
|
|
34
|
-
var S_BAR_END = unicodeOr("\u2514", "\u2014");
|
|
35
|
-
var S_RADIO_ACTIVE = unicodeOr("\u25CF", ">");
|
|
36
|
-
var S_RADIO_INACTIVE = unicodeOr("\u25CB", " ");
|
|
37
|
-
var S_CHECKBOX_ACTIVE = unicodeOr("\u25FB", "[\u2022]");
|
|
38
|
-
var S_CHECKBOX_SELECTED = unicodeOr("\u25FC", "[+]");
|
|
39
|
-
var S_CHECKBOX_INACTIVE = unicodeOr("\u25FB", "[ ]");
|
|
40
|
-
unicodeOr("\u25AA", "\u2022");
|
|
41
|
-
unicodeOr("\u2500", "-");
|
|
42
|
-
unicodeOr("\u256E", "+");
|
|
43
|
-
unicodeOr("\u251C", "+");
|
|
44
|
-
unicodeOr("\u256F", "+");
|
|
45
|
-
unicodeOr("\u25CF", "\u2022");
|
|
46
|
-
unicodeOr("\u25C6", "*");
|
|
47
|
-
unicodeOr("\u25B2", "!");
|
|
48
|
-
unicodeOr("\u25A0", "x");
|
|
49
|
-
var symbol = /* @__PURE__ */ __name((state) => {
|
|
50
|
-
switch (state) {
|
|
51
|
-
case "initial":
|
|
52
|
-
case "active":
|
|
53
|
-
return ansis_default.cyan(S_STEP_ACTIVE);
|
|
54
|
-
case "cancel":
|
|
55
|
-
return ansis_default.red(S_STEP_CANCEL);
|
|
56
|
-
case "error":
|
|
57
|
-
return ansis_default.yellow(S_STEP_ERROR);
|
|
58
|
-
case "submit":
|
|
59
|
-
return ansis_default.green(S_STEP_SUBMIT);
|
|
60
|
-
}
|
|
61
|
-
}, "symbol");
|
|
62
|
-
var limitOptions = /* @__PURE__ */ __name((params) => {
|
|
63
|
-
const { cursor, options, style } = params;
|
|
64
|
-
const output = params.output ?? process.stdout;
|
|
65
|
-
const rows = output instanceof WriteStream && output.rows !== void 0 ? output.rows : 10;
|
|
66
|
-
const paramMaxItems = params.maxItems ?? Number.POSITIVE_INFINITY;
|
|
67
|
-
const outputMaxItems = Math.max(rows - 4, 0);
|
|
68
|
-
const maxItems = Math.min(outputMaxItems, Math.max(paramMaxItems, 5));
|
|
69
|
-
let slidingWindowLocation = 0;
|
|
70
|
-
if (cursor >= slidingWindowLocation + maxItems - 3) {
|
|
71
|
-
slidingWindowLocation = Math.max(Math.min(cursor - maxItems + 3, options.length - maxItems), 0);
|
|
72
|
-
} else if (cursor < slidingWindowLocation + 2) {
|
|
73
|
-
slidingWindowLocation = Math.max(cursor - 2, 0);
|
|
74
|
-
}
|
|
75
|
-
const shouldRenderTopEllipsis = maxItems < options.length && slidingWindowLocation > 0;
|
|
76
|
-
const shouldRenderBottomEllipsis = maxItems < options.length && slidingWindowLocation + maxItems < options.length;
|
|
77
|
-
return options.slice(slidingWindowLocation, slidingWindowLocation + maxItems).map((option, i, arr) => {
|
|
78
|
-
const isTopLimit = i === 0 && shouldRenderTopEllipsis;
|
|
79
|
-
const isBottomLimit = i === arr.length - 1 && shouldRenderBottomEllipsis;
|
|
80
|
-
return isTopLimit || isBottomLimit ? ansis_default.dim("...") : style(option, i + slidingWindowLocation === cursor);
|
|
81
|
-
});
|
|
82
|
-
}, "limitOptions");
|
|
83
|
-
var confirm = /* @__PURE__ */ __name((opts) => {
|
|
84
|
-
const active = opts.active ?? "Yes";
|
|
85
|
-
const inactive = opts.inactive ?? "No";
|
|
86
|
-
return new dD({
|
|
87
|
-
active,
|
|
88
|
-
inactive,
|
|
89
|
-
input: opts.input,
|
|
90
|
-
output: opts.output,
|
|
91
|
-
initialValue: opts.initialValue ?? true,
|
|
92
|
-
render() {
|
|
93
|
-
const title = `
|
|
94
|
-
${symbol(this.state)} ${opts.message}
|
|
95
|
-
`;
|
|
96
|
-
const value = this.value ? active : inactive;
|
|
97
|
-
switch (this.state) {
|
|
98
|
-
case "submit":
|
|
99
|
-
return `${title}\u200E ${ansis_default.dim(value)}`;
|
|
100
|
-
case "cancel":
|
|
101
|
-
return `${title}\u200E ${ansis_default.strikethrough(
|
|
102
|
-
ansis_default.dim(value)
|
|
103
|
-
)}
|
|
104
|
-
`;
|
|
105
|
-
default: {
|
|
106
|
-
return `${title}\u200E ${this.value ? `${ansis_default.green(S_RADIO_ACTIVE)} ${active}` : `${ansis_default.dim(S_RADIO_INACTIVE)} ${ansis_default.dim(active)}`} ${ansis_default.dim("/")} ${!this.value ? `${ansis_default.green(S_RADIO_ACTIVE)} ${inactive}` : `${ansis_default.dim(S_RADIO_INACTIVE)} ${ansis_default.dim(inactive)}`}
|
|
107
|
-
`;
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
}).prompt();
|
|
112
|
-
}, "confirm");
|
|
113
|
-
var select = /* @__PURE__ */ __name((opts) => {
|
|
114
|
-
const opt = /* @__PURE__ */ __name((option, state) => {
|
|
115
|
-
const label = option.label ?? String(option.value);
|
|
116
|
-
switch (state) {
|
|
117
|
-
case "selected":
|
|
118
|
-
return `${ansis_default.dim(label)}`;
|
|
119
|
-
case "active":
|
|
120
|
-
return `${ansis_default.green(S_RADIO_ACTIVE)} ${label} ${option.hint ? ansis_default.dim(`(${option.hint})`) : ""}`;
|
|
121
|
-
case "cancelled":
|
|
122
|
-
return `${ansis_default.strikethrough(ansis_default.dim(label))}`;
|
|
123
|
-
default:
|
|
124
|
-
return `${ansis_default.dim(S_RADIO_INACTIVE)} ${ansis_default.dim(label)}`;
|
|
125
|
-
}
|
|
126
|
-
}, "opt");
|
|
127
|
-
return new LD({
|
|
128
|
-
options: opts.options,
|
|
129
|
-
input: opts.input,
|
|
130
|
-
output: opts.output,
|
|
131
|
-
initialValue: opts.initialValue,
|
|
132
|
-
render() {
|
|
133
|
-
const title = `${ansis_default.gray(S_BAR)}
|
|
134
|
-
${symbol(this.state)} ${opts.message}
|
|
135
|
-
`;
|
|
136
|
-
switch (this.state) {
|
|
137
|
-
case "submit":
|
|
138
|
-
return `${title}${ansis_default.gray(S_BAR)} ${opt(this.options[this.cursor], "selected")}`;
|
|
139
|
-
case "cancel":
|
|
140
|
-
return `${title}${ansis_default.gray(S_BAR)} ${opt(
|
|
141
|
-
this.options[this.cursor],
|
|
142
|
-
"cancelled"
|
|
143
|
-
)}
|
|
144
|
-
${ansis_default.gray(S_BAR)}`;
|
|
145
|
-
default: {
|
|
146
|
-
return `${title}${ansis_default.cyan(S_BAR)} ${limitOptions({
|
|
147
|
-
output: opts.output,
|
|
148
|
-
cursor: this.cursor,
|
|
149
|
-
options: this.options,
|
|
150
|
-
maxItems: opts.maxItems,
|
|
151
|
-
style: /* @__PURE__ */ __name((item, active) => opt(item, active ? "active" : "inactive"), "style")
|
|
152
|
-
}).join(`
|
|
153
|
-
${ansis_default.cyan(S_BAR)} `)}
|
|
154
|
-
${ansis_default.cyan(S_BAR_END)}
|
|
155
|
-
`;
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
}).prompt();
|
|
160
|
-
}, "select");
|
|
161
|
-
var multiselect = /* @__PURE__ */ __name((opts) => {
|
|
162
|
-
const opt = /* @__PURE__ */ __name((option, state) => {
|
|
163
|
-
const label = option.label ?? String(option.value);
|
|
164
|
-
if (state === "active") {
|
|
165
|
-
return `${ansis_default.cyan(S_CHECKBOX_ACTIVE)} ${label} ${option.hint ? ansis_default.dim(`(${option.hint})`) : ""}`;
|
|
166
|
-
}
|
|
167
|
-
if (state === "selected") {
|
|
168
|
-
return `${ansis_default.green(S_CHECKBOX_SELECTED)} ${ansis_default.dim(label)} ${option.hint ? ansis_default.dim(`(${option.hint})`) : ""}`;
|
|
169
|
-
}
|
|
170
|
-
if (state === "cancelled") {
|
|
171
|
-
return `${ansis_default.strikethrough(ansis_default.dim(label))}`;
|
|
172
|
-
}
|
|
173
|
-
if (state === "active-selected") {
|
|
174
|
-
return `${ansis_default.green(S_CHECKBOX_SELECTED)} ${label} ${option.hint ? ansis_default.dim(`(${option.hint})`) : ""}`;
|
|
175
|
-
}
|
|
176
|
-
if (state === "submitted") {
|
|
177
|
-
return `${ansis_default.dim(label)}`;
|
|
178
|
-
}
|
|
179
|
-
return `${ansis_default.dim(S_CHECKBOX_INACTIVE)} ${ansis_default.dim(label)}`;
|
|
180
|
-
}, "opt");
|
|
181
|
-
return new SD({
|
|
182
|
-
options: opts.options,
|
|
183
|
-
input: opts.input,
|
|
184
|
-
output: opts.output,
|
|
185
|
-
initialValues: opts.initialValues,
|
|
186
|
-
required: opts.required ?? true,
|
|
187
|
-
cursorAt: opts.cursorAt,
|
|
188
|
-
validate(selected) {
|
|
189
|
-
if (this.required && selected.length === 0) {
|
|
190
|
-
return `Please select at least one option.
|
|
191
|
-
${ansis_default.reset(
|
|
192
|
-
ansis_default.dim(
|
|
193
|
-
`Press ${ansis_default.gray(ansis_default.bgWhite(ansis_default.inverse(" space ")))} to select, ${ansis_default.gray(
|
|
194
|
-
ansis_default.bgWhite(ansis_default.inverse(" enter "))
|
|
195
|
-
)} to submit`
|
|
196
|
-
)
|
|
197
|
-
)}`;
|
|
198
|
-
}
|
|
199
|
-
},
|
|
200
|
-
render() {
|
|
201
|
-
let title = `${ansis_default.gray(S_BAR)}
|
|
202
|
-
${symbol(this.state)} ${opts.message}
|
|
203
|
-
`;
|
|
204
|
-
if (opts.details) title += `${ansis_default.gray(S_BAR)} ${opts.details}
|
|
205
|
-
`;
|
|
206
|
-
const styleOption = /* @__PURE__ */ __name((option, active) => {
|
|
207
|
-
const selected = this.value.includes(option.value);
|
|
208
|
-
if (active && selected) {
|
|
209
|
-
return opt(option, "active-selected");
|
|
210
|
-
}
|
|
211
|
-
if (selected) {
|
|
212
|
-
return opt(option, "selected");
|
|
213
|
-
}
|
|
214
|
-
return opt(option, active ? "active" : "inactive");
|
|
215
|
-
}, "styleOption");
|
|
216
|
-
switch (this.state) {
|
|
217
|
-
case "submit": {
|
|
218
|
-
return `${title}${ansis_default.gray(S_BAR)} ${this.options.filter(({ value }) => this.value.includes(value)).map((option) => opt(option, "submitted")).join(ansis_default.dim(", ")) || ansis_default.dim("none")}`;
|
|
219
|
-
}
|
|
220
|
-
case "cancel": {
|
|
221
|
-
const label = this.options.filter(({ value }) => this.value.includes(value)).map((option) => opt(option, "cancelled")).join(ansis_default.dim(", "));
|
|
222
|
-
return `${title}${ansis_default.gray(S_BAR)} ${label.trim() ? `${label}
|
|
223
|
-
${ansis_default.gray(S_BAR)}` : ""}`;
|
|
224
|
-
}
|
|
225
|
-
case "error": {
|
|
226
|
-
const footer = this.error.split("\n").map((ln, i) => i === 0 ? `${ansis_default.yellow(S_BAR_END)} ${ansis_default.yellow(ln)}` : ` ${ln}`).join("\n");
|
|
227
|
-
return `${title + ansis_default.yellow(S_BAR)} ${limitOptions({
|
|
228
|
-
output: opts.output,
|
|
229
|
-
options: this.options,
|
|
230
|
-
cursor: this.cursor,
|
|
231
|
-
maxItems: opts.maxItems,
|
|
232
|
-
style: styleOption
|
|
233
|
-
}).join(`
|
|
234
|
-
${ansis_default.yellow(S_BAR)} `)}
|
|
235
|
-
${footer}
|
|
236
|
-
`;
|
|
237
|
-
}
|
|
238
|
-
default: {
|
|
239
|
-
return `${title}${ansis_default.cyan(S_BAR)} ${limitOptions({
|
|
240
|
-
output: opts.output,
|
|
241
|
-
options: this.options,
|
|
242
|
-
cursor: this.cursor,
|
|
243
|
-
maxItems: opts.maxItems,
|
|
244
|
-
style: styleOption
|
|
245
|
-
}).join(`
|
|
246
|
-
${ansis_default.cyan(S_BAR)} `)}
|
|
247
|
-
${ansis_default.cyan(S_BAR_END)}
|
|
248
|
-
`;
|
|
249
|
-
}
|
|
250
|
-
}
|
|
251
|
-
}
|
|
252
|
-
}).prompt();
|
|
253
|
-
}, "multiselect");
|
|
254
|
-
var prompts = {
|
|
255
|
-
confirm,
|
|
256
|
-
select,
|
|
257
|
-
multiselect
|
|
258
|
-
};
|
|
259
|
-
var prompts_default = prompts;
|
|
260
|
-
var PUBLIC_PREFIXES = [
|
|
261
|
-
"PUBLIC",
|
|
262
|
-
"VITE",
|
|
263
|
-
"NEXT_PUBLIC",
|
|
264
|
-
"NUXT_PUBLIC"
|
|
265
|
-
];
|
|
266
|
-
var PUBLIC_KEYWORDS = ["PUBLIC"];
|
|
267
|
-
var SENSITIVE_KEYWORDS = [
|
|
268
|
-
"SECRET",
|
|
269
|
-
"API_KEY",
|
|
270
|
-
"PASSWORD",
|
|
271
|
-
"TOKEN",
|
|
272
|
-
"PRIVATE",
|
|
273
|
-
"CREDENTIALS"
|
|
274
|
-
];
|
|
275
|
-
function isValidUrl(val) {
|
|
276
|
-
try {
|
|
277
|
-
const u = new URL(val);
|
|
278
|
-
return true;
|
|
279
|
-
} catch (err) {
|
|
280
|
-
return false;
|
|
281
|
-
}
|
|
282
|
-
}
|
|
283
|
-
__name(isValidUrl, "isValidUrl");
|
|
284
|
-
var EMAIL_REGEX = /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
|
|
285
|
-
var VALID_NUMBER_REGEX = /^(0|([1-9][0-9]*))?(\.[0-9]+)?$/;
|
|
286
|
-
function inferItemDecorators(file, itemKey, valueStr) {
|
|
287
|
-
let itemIsPublic = false;
|
|
288
|
-
if (PUBLIC_PREFIXES.some((prefix) => itemKey.startsWith(prefix))) itemIsPublic = true;
|
|
289
|
-
if (PUBLIC_KEYWORDS.some((keyword) => itemKey.includes(keyword))) itemIsPublic = true;
|
|
290
|
-
let itemIsSensitive = false;
|
|
291
|
-
if (SENSITIVE_KEYWORDS.some((keyword) => itemKey.includes(keyword))) itemIsSensitive = true;
|
|
292
|
-
if (itemIsPublic) ; else if (itemIsSensitive) {
|
|
293
|
-
envSpecUpdater.setItemDecorator(file, itemKey, "sensitive", "true");
|
|
294
|
-
}
|
|
295
|
-
if (itemKey === "PORT" || itemKey.endsWith("_PORT")) {
|
|
296
|
-
envSpecUpdater.setItemDecorator(file, itemKey, "type", "port");
|
|
297
|
-
} else if (itemKey.endsWith("_EMAIL")) {
|
|
298
|
-
envSpecUpdater.setItemDecorator(file, itemKey, "type", "email");
|
|
299
|
-
} else if (itemKey.endsWith("_URL") || itemKey.endsWith("_URI")) {
|
|
300
|
-
envSpecUpdater.setItemDecorator(file, itemKey, "type", "url");
|
|
301
|
-
} else if (valueStr) {
|
|
302
|
-
if (valueStr.startsWith("<") && valueStr.endsWith(">")) {
|
|
303
|
-
envSpecUpdater.setItemDecorator(file, itemKey, "example", valueStr);
|
|
304
|
-
}
|
|
305
|
-
if (valueStr === "true" || valueStr === "false") {
|
|
306
|
-
envSpecUpdater.setItemDecorator(file, itemKey, "type", "boolean");
|
|
307
|
-
} else if (EMAIL_REGEX.test(valueStr)) {
|
|
308
|
-
envSpecUpdater.setItemDecorator(file, itemKey, "type", "email");
|
|
309
|
-
} else if (valueStr !== "0" && valueStr !== "1" && VALID_NUMBER_REGEX.test(valueStr)) {
|
|
310
|
-
envSpecUpdater.setItemDecorator(file, itemKey, "type", "number");
|
|
311
|
-
} else if (isValidUrl(valueStr)) {
|
|
312
|
-
envSpecUpdater.setItemDecorator(file, itemKey, "type", "url");
|
|
313
|
-
}
|
|
314
|
-
}
|
|
315
|
-
}
|
|
316
|
-
__name(inferItemDecorators, "inferItemDecorators");
|
|
317
|
-
function inferSchemaUpdates(file) {
|
|
318
|
-
for (const item of file.configItems) {
|
|
319
|
-
const valueStr = item.value instanceof ParsedEnvSpecStaticValue && item.value.value?.toString() || "";
|
|
320
|
-
inferItemDecorators(file, item.key, valueStr);
|
|
321
|
-
}
|
|
322
|
-
}
|
|
323
|
-
__name(inferSchemaUpdates, "inferSchemaUpdates");
|
|
324
|
-
function ensureAllItemsExist(envGraph, schemaFile) {
|
|
325
|
-
const addedItemKeys = [];
|
|
326
|
-
for (const itemKey in envGraph.configSchema) {
|
|
327
|
-
const item = envGraph.configSchema[itemKey];
|
|
328
|
-
const itemInSchema = schemaFile.configItems.find((i) => i.key === itemKey);
|
|
329
|
-
if (!itemInSchema) {
|
|
330
|
-
if (addedItemKeys.length === 0) {
|
|
331
|
-
envSpecUpdater.injectFromStr(schemaFile, [
|
|
332
|
-
"",
|
|
333
|
-
"# items added to schema by `varlock init`",
|
|
334
|
-
"# that were missing in example, but detected in other env files",
|
|
335
|
-
"# PLEASE REVIEW THESE!",
|
|
336
|
-
"# ---",
|
|
337
|
-
""
|
|
338
|
-
].join("\n"), { location: "end" });
|
|
339
|
-
}
|
|
340
|
-
addedItemKeys.push(itemKey);
|
|
341
|
-
envSpecUpdater.injectFromStr(schemaFile, [`${itemKey}=`].join("\n"));
|
|
342
|
-
const itemValue = item.valueResolver instanceof StaticValueResolver && item.valueResolver.staticValue || "";
|
|
343
|
-
inferItemDecorators(schemaFile, itemKey, String(itemValue));
|
|
344
|
-
}
|
|
345
|
-
}
|
|
346
|
-
}
|
|
347
|
-
__name(ensureAllItemsExist, "ensureAllItemsExist");
|
|
348
|
-
async function detectRedundantValues(envGraph, opts = {}) {
|
|
349
|
-
const schema = envGraph.schemaDataSource;
|
|
350
|
-
if (!schema) return {};
|
|
351
|
-
const redundantItemsBySourcePath = {};
|
|
352
|
-
const schemaValues = schema.getStaticValues();
|
|
353
|
-
for (const source of envGraph.dataSources) {
|
|
354
|
-
if (source === schema) continue;
|
|
355
|
-
if (source.type === "example") continue;
|
|
356
|
-
if (!(source instanceof DotEnvFileDataSource) || !source.parsedFile) continue;
|
|
357
|
-
const sourceValues = source.getStaticValues();
|
|
358
|
-
for (const [key, value] of Object.entries(sourceValues)) {
|
|
359
|
-
if (schemaValues[key] !== value) continue;
|
|
360
|
-
redundantItemsBySourcePath[source.fullPath] ||= [];
|
|
361
|
-
redundantItemsBySourcePath[source.fullPath].push(key);
|
|
362
|
-
if (opts.delete) {
|
|
363
|
-
envSpecUpdater.deleteItem(source.parsedFile, key);
|
|
364
|
-
}
|
|
365
|
-
}
|
|
366
|
-
if (opts.delete) {
|
|
367
|
-
await fs2.writeFile(source.fullPath, source.parsedFile.toString(), "utf8");
|
|
368
|
-
}
|
|
369
|
-
}
|
|
370
|
-
return redundantItemsBySourcePath;
|
|
371
|
-
}
|
|
372
|
-
__name(detectRedundantValues, "detectRedundantValues");
|
|
373
|
-
|
|
374
|
-
// src/cli/commands/init.command.ts
|
|
375
|
-
var commandSpec = define({
|
|
376
|
-
name: "init",
|
|
377
|
-
description: "Set up varlock in the current project",
|
|
378
|
-
args: {}
|
|
379
|
-
});
|
|
380
|
-
var commandFn = /* @__PURE__ */ __name(async (ctx) => {
|
|
381
|
-
const jsPackageManager = detectJsPackageManager();
|
|
382
|
-
console.log("\u{1F9D9} Hello and welcome to Varlock \u{1F512}\u{1F525}\u2728");
|
|
383
|
-
let envGraph = await loadVarlockEnvGraph();
|
|
384
|
-
const existingSchemaFile = envGraph.dataSources.find((dataSource) => {
|
|
385
|
-
return dataSource.type === "schema";
|
|
386
|
-
});
|
|
387
|
-
if (existingSchemaFile) {
|
|
388
|
-
logLines([
|
|
389
|
-
`It looks like you already have a ${fmt.fileName(".env.schema")} file \u{1F389}`,
|
|
390
|
-
"This init helper is meant to help you get a new project set up.",
|
|
391
|
-
"If you need to make changes to your schema or values, you can update your files directly.",
|
|
392
|
-
"See more docs at https://varlock.dev/guides/schema"
|
|
393
|
-
]);
|
|
394
|
-
} else {
|
|
395
|
-
let exampleFileToConvert = null;
|
|
396
|
-
const allExampleFiles = envGraph.dataSources.filter((dataSource) => {
|
|
397
|
-
return dataSource instanceof DotEnvFileDataSource && dataSource.type === "example";
|
|
398
|
-
});
|
|
399
|
-
if (allExampleFiles.length === 1) {
|
|
400
|
-
exampleFileToConvert = allExampleFiles[0];
|
|
401
|
-
} else if (allExampleFiles.length > 1) {
|
|
402
|
-
console.log("");
|
|
403
|
-
const selectedExample = await ve({
|
|
404
|
-
message: `We detected more than one example .env file. Which one should we use to create your new ${fmt.fileName(".env.schema")}?`,
|
|
405
|
-
options: allExampleFiles.map((file) => ({
|
|
406
|
-
label: file.fileName,
|
|
407
|
-
value: file
|
|
408
|
-
}))
|
|
409
|
-
});
|
|
410
|
-
if (pD(selectedExample)) return gracefulExit(0);
|
|
411
|
-
exampleFileToConvert = selectedExample;
|
|
412
|
-
}
|
|
413
|
-
const parsedEnvFile = exampleFileToConvert?.parsedFile || parseEnvSpecDotEnvFile("");
|
|
414
|
-
if (!parsedEnvFile) throw new Error("No parsed .env file found");
|
|
415
|
-
envSpecUpdater.ensureHeader(parsedEnvFile, [
|
|
416
|
-
"This env file uses @env-spec - see https://varlock.dev/env-spec for more info",
|
|
417
|
-
""
|
|
418
|
-
// TODO: add env spec version? real links?
|
|
419
|
-
].join("\n"));
|
|
420
|
-
envSpecUpdater.setRootDecorator(parsedEnvFile, "defaultRequired", "false", { explicitTrue: true });
|
|
421
|
-
envSpecUpdater.setRootDecorator(parsedEnvFile, "defaultSensitive", "false", { explicitTrue: true });
|
|
422
|
-
envSpecUpdater.setRootDecorator(parsedEnvFile, "generateTypes", "lang=ts, path=env.d.ts", { bareFnArgs: true });
|
|
423
|
-
envSpecUpdater.injectFromStr(parsedEnvFile, [
|
|
424
|
-
"",
|
|
425
|
-
"# example env variable injected by `varlock init` \u26A0\uFE0F DELETE THIS ITEM! \u26A0\uFE0F",
|
|
426
|
-
'# @required @sensitive @example="example value"',
|
|
427
|
-
'EXAMPLE_ITEM="delete me!"',
|
|
428
|
-
""
|
|
429
|
-
].join("\n"), { location: "after_header" });
|
|
430
|
-
inferSchemaUpdates(parsedEnvFile);
|
|
431
|
-
ensureAllItemsExist(envGraph, parsedEnvFile);
|
|
432
|
-
const schemaFilePath = path.join(process.cwd(), ".env.schema");
|
|
433
|
-
await fs2.writeFile(schemaFilePath, parsedEnvFile.toString());
|
|
434
|
-
if (exampleFileToConvert) {
|
|
435
|
-
logLines([
|
|
436
|
-
"",
|
|
437
|
-
`Your ${fmt.fileName(exampleFileToConvert.fileName)} has been used to generate your new ${fmt.fileName(".env.schema")}:`,
|
|
438
|
-
fmt.filePath(schemaFilePath)
|
|
439
|
-
]);
|
|
440
|
-
} else {
|
|
441
|
-
logLines([
|
|
442
|
-
"",
|
|
443
|
-
`Your new ${fmt.fileName(".env.schema")} file has been created:`,
|
|
444
|
-
fmt.filePath(schemaFilePath)
|
|
445
|
-
]);
|
|
446
|
-
}
|
|
447
|
-
if (await checkIsFileGitIgnored(schemaFilePath)) {
|
|
448
|
-
logLines([ansis_default.dim(`(and updated ${fmt.fileName(".gitignore")} to ensure it will be tracked by git)`)]);
|
|
449
|
-
await fs2.appendFile(".gitignore", "\n!.env.schema");
|
|
450
|
-
}
|
|
451
|
-
logLines([
|
|
452
|
-
"",
|
|
453
|
-
ansis_default.bold(`\u{1F6A7} Please review and update your new ${fmt.fileName(".env.schema")} file! \u{1F6A7}`),
|
|
454
|
-
`We've done our best to get you started, but you must review and make sure it is correct!`,
|
|
455
|
-
"",
|
|
456
|
-
`\u{1F449} Some helpful pointers to get you started:`,
|
|
457
|
-
`- add a description to each item when the name is not self explanitory - it will come through in generated types`,
|
|
458
|
-
`- use ${fmt.decorator("@required")} (or ${fmt.decorator("@optional")}) to tag items that should fail validation when empty`,
|
|
459
|
-
`- use ${fmt.decorator("@sensitive")} to tag items that contain sensitive secrets, and must be handled accordingly`,
|
|
460
|
-
`- use ${fmt.decorator("@type")} to set an item's data type (if not a basic string), which affects validation and coercion logic`,
|
|
461
|
-
`- if an item value is a ${ansis_default.italic("useful example")} rather than a default, use ${fmt.decorator("@example")}`,
|
|
462
|
-
`- if an item value is just a dummy placeholder, delete it`
|
|
463
|
-
]);
|
|
464
|
-
const confirmReviewed = await prompts_default.confirm({
|
|
465
|
-
message: `Have you reviewed and updated your new ${fmt.fileName(".env.schema")} file?`
|
|
466
|
-
});
|
|
467
|
-
if (pD(confirmReviewed)) return gracefulExit(0);
|
|
468
|
-
envGraph = await loadVarlockEnvGraph();
|
|
469
|
-
if (envGraph.configSchema.EXAMPLE_ITEM) {
|
|
470
|
-
logLines([
|
|
471
|
-
"",
|
|
472
|
-
ansis_default.bold(`\u{1F6A8} Really? ${ansis_default.red("You didn't remove the EXAMPLE_ITEM!")}`),
|
|
473
|
-
`Please make sure your schema is all correct before using it...`
|
|
474
|
-
]);
|
|
475
|
-
}
|
|
476
|
-
if (exampleFileToConvert) {
|
|
477
|
-
const confirmDeleteExample = await prompts_default.confirm({
|
|
478
|
-
message: `Should we delete your ${fmt.fileName(exampleFileToConvert.fileName)} file? ${ansis_default.italic.gray("(you can always do this yourself later)")}`
|
|
479
|
-
});
|
|
480
|
-
if (pD(confirmDeleteExample)) return gracefulExit(0);
|
|
481
|
-
if (confirmDeleteExample) {
|
|
482
|
-
await fs2.unlink(exampleFileToConvert.fullPath);
|
|
483
|
-
}
|
|
484
|
-
}
|
|
485
|
-
const defaultsFile = envGraph.dataSources.find((dataSource) => {
|
|
486
|
-
return dataSource instanceof DotEnvFileDataSource && dataSource.type === "defaults";
|
|
487
|
-
});
|
|
488
|
-
if (defaultsFile) {
|
|
489
|
-
logLines([
|
|
490
|
-
"",
|
|
491
|
-
`\u{1F6A7} We detected a ${fmt.fileName(defaultsFile.fileName)} file in your project`,
|
|
492
|
-
`You should migrate these default values into ${fmt.fileName(".env.schema")} and delete ${fmt.fileName(defaultsFile.fileName)}`
|
|
493
|
-
]);
|
|
494
|
-
}
|
|
495
|
-
const redundantInfo = await detectRedundantValues(envGraph);
|
|
496
|
-
if (Object.keys(redundantInfo).length > 0) {
|
|
497
|
-
logLines([
|
|
498
|
-
"",
|
|
499
|
-
ansis_default.bold("\u203C\uFE0F Now that your schema contains defaults, some values in your other .env files are redundant:")
|
|
500
|
-
]);
|
|
501
|
-
for (const [sourcePath, itemKeys] of Object.entries(redundantInfo)) {
|
|
502
|
-
console.log(fmt.filePath(sourcePath));
|
|
503
|
-
console.log(" ", itemKeys.map((k) => ansis_default.italic(k)).join(", "));
|
|
504
|
-
}
|
|
505
|
-
const confirmDeleteRedundant = await prompts_default.confirm({
|
|
506
|
-
message: "Should we delete these redundant values from your other .env files?"
|
|
507
|
-
});
|
|
508
|
-
if (pD(confirmDeleteRedundant)) return gracefulExit(0);
|
|
509
|
-
if (confirmDeleteRedundant) {
|
|
510
|
-
await detectRedundantValues(envGraph, { delete: true });
|
|
511
|
-
}
|
|
512
|
-
}
|
|
513
|
-
logLines([
|
|
514
|
-
"",
|
|
515
|
-
ansis_default.bold("\u{1F389} Great!"),
|
|
516
|
-
`You can run ${fmt.command("varlock load", { jsPackageManager })} to attempt loading your env vars validate against your new schema.`,
|
|
517
|
-
"",
|
|
518
|
-
"Check out our docs for more info about integrating into your application.",
|
|
519
|
-
"",
|
|
520
|
-
"\u{1F4D6} https://varlock.dev \u{1F448}",
|
|
521
|
-
""
|
|
522
|
-
]);
|
|
523
|
-
}
|
|
524
|
-
if (jsPackageManager && await pathExists(path.join(process.cwd(), "package.json"))) {
|
|
525
|
-
const installResult = installJsDependency({
|
|
526
|
-
packageManager: jsPackageManager.name,
|
|
527
|
-
packageName: "varlock"
|
|
528
|
-
});
|
|
529
|
-
if (installResult) {
|
|
530
|
-
logLines([
|
|
531
|
-
"",
|
|
532
|
-
`\u2705 Added ${fmt.packageName("varlock")} as a dependency in your package.json`
|
|
533
|
-
]);
|
|
534
|
-
}
|
|
535
|
-
}
|
|
536
|
-
}, "commandFn");
|
|
537
|
-
|
|
538
|
-
export { commandFn, commandSpec };
|
|
539
|
-
//# sourceMappingURL=chunk-HH7DAS63.js.map
|
|
540
|
-
//# sourceMappingURL=chunk-HH7DAS63.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../node_modules/.pnpm/is-unicode-supported@2.1.0/node_modules/is-unicode-supported/index.js","../src/cli/helpers/prompts.ts","../src/cli/helpers/infer-schema.ts","../src/cli/commands/init.command.ts"],"names":["process","fs","parseEnvSpecDotEnvFile","envSpecUpdater"],"mappings":"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","file":"chunk-HH7DAS63.js","sourcesContent":["import process from 'node:process';\n\nexport default function isUnicodeSupported() {\n\tconst {env} = process;\n\tconst {TERM, TERM_PROGRAM} = env;\n\n\tif (process.platform !== 'win32') {\n\t\treturn TERM !== 'linux'; // Linux console (kernel)\n\t}\n\n\treturn Boolean(env.WT_SESSION) // Windows Terminal\n\t\t|| Boolean(env.TERMINUS_SUBLIME) // Terminus (<0.2.27)\n\t\t|| env.ConEmuTask === '{cmd::Cmder}' // ConEmu and cmder\n\t\t|| TERM_PROGRAM === 'Terminus-Sublime'\n\t\t|| TERM_PROGRAM === 'vscode'\n\t\t|| TERM === 'xterm-256color'\n\t\t|| TERM === 'alacritty'\n\t\t|| TERM === 'rxvt-unicode'\n\t\t|| TERM === 'rxvt-unicode-256color'\n\t\t|| env.TERMINAL_EMULATOR === 'JetBrains-JediTerm';\n}\n","// this is a slightly modified version of @clack/prompts\n// mostly to remove the additional left border\n\nimport type { Readable, Writable } from 'node:stream';\nimport { WriteStream } from 'node:tty';\nimport {\n ConfirmPrompt, SelectPrompt, MultiSelectPrompt, type State,\n} from '@clack/core';\nimport color from 'ansis';\nimport isUnicodeSupported from 'is-unicode-supported';\n\nconst unicode = isUnicodeSupported();\nconst isCI = (): boolean => process.env.CI === 'true';\nconst unicodeOr = (c: string, fallback: string) => (unicode ? c : fallback);\nconst S_STEP_ACTIVE = unicodeOr('◆', '*');\nconst S_STEP_CANCEL = unicodeOr('■', 'x');\nconst S_STEP_ERROR = unicodeOr('▲', 'x');\nconst S_STEP_SUBMIT = unicodeOr('◇', 'o');\n\nconst S_BAR_START = unicodeOr('┌', 'T');\nconst S_BAR = unicodeOr('│', '|');\nconst S_BAR_END = unicodeOr('└', '—');\n\nconst S_RADIO_ACTIVE = unicodeOr('●', '>');\nconst S_RADIO_INACTIVE = unicodeOr('○', ' ');\nconst S_CHECKBOX_ACTIVE = unicodeOr('◻', '[•]');\nconst S_CHECKBOX_SELECTED = unicodeOr('◼', '[+]');\nconst S_CHECKBOX_INACTIVE = unicodeOr('◻', '[ ]');\nconst S_PASSWORD_MASK = unicodeOr('▪', '•');\n\nconst S_BAR_H = unicodeOr('─', '-');\nconst S_CORNER_TOP_RIGHT = unicodeOr('╮', '+');\nconst S_CONNECT_LEFT = unicodeOr('├', '+');\nconst S_CORNER_BOTTOM_RIGHT = unicodeOr('╯', '+');\n\nconst S_INFO = unicodeOr('●', '•');\nconst S_SUCCESS = unicodeOr('◆', '*');\nconst S_WARN = unicodeOr('▲', '!');\nconst S_ERROR = unicodeOr('■', 'x');\n\nconst symbol = (state: State) => {\n // eslint-disable-next-line default-case\n switch (state) {\n case 'initial':\n case 'active':\n return color.cyan(S_STEP_ACTIVE);\n case 'cancel':\n return color.red(S_STEP_CANCEL);\n case 'error':\n return color.yellow(S_STEP_ERROR);\n case 'submit':\n return color.green(S_STEP_SUBMIT);\n }\n};\n\nexport interface CommonOptions {\n input?: Readable;\n output?: Writable;\n}\n\n\n\n\n/// /\nexport interface LimitOptionsParams<TOption> extends CommonOptions {\n options: Array<TOption>;\n maxItems: number | undefined;\n cursor: number;\n style: (option: TOption, active: boolean) => string;\n}\n\nexport const limitOptions = <TOption>(params: LimitOptionsParams<TOption>): Array<string> => {\n const { cursor, options, style } = params;\n const output: Writable = params.output ?? process.stdout;\n const rows = output instanceof WriteStream && output.rows !== undefined ? output.rows : 10;\n\n const paramMaxItems = params.maxItems ?? Number.POSITIVE_INFINITY;\n const outputMaxItems = Math.max(rows - 4, 0);\n // We clamp to minimum 5 because anything less doesn't make sense UX wise\n const maxItems = Math.min(outputMaxItems, Math.max(paramMaxItems, 5));\n let slidingWindowLocation = 0;\n\n if (cursor >= slidingWindowLocation + maxItems - 3) {\n slidingWindowLocation = Math.max(Math.min(cursor - maxItems + 3, options.length - maxItems), 0);\n } else if (cursor < slidingWindowLocation + 2) {\n slidingWindowLocation = Math.max(cursor - 2, 0);\n }\n\n const shouldRenderTopEllipsis = maxItems < options.length && slidingWindowLocation > 0;\n const shouldRenderBottomEllipsis = maxItems < options.length && slidingWindowLocation + maxItems < options.length;\n\n return options\n .slice(slidingWindowLocation, slidingWindowLocation + maxItems)\n .map((option, i, arr) => {\n const isTopLimit = i === 0 && shouldRenderTopEllipsis;\n const isBottomLimit = i === arr.length - 1 && shouldRenderBottomEllipsis;\n return isTopLimit || isBottomLimit\n ? color.dim('...')\n : style(option, i + slidingWindowLocation === cursor);\n });\n};\n\n\n///\n\nexport interface ConfirmOptions extends CommonOptions {\n message: string;\n active?: string;\n inactive?: string;\n initialValue?: boolean;\n}\nexport const confirm = (opts: ConfirmOptions) => {\n const active = opts.active ?? 'Yes';\n const inactive = opts.inactive ?? 'No';\n return new ConfirmPrompt({\n active,\n inactive,\n input: opts.input,\n output: opts.output,\n initialValue: opts.initialValue ?? true,\n render() {\n const title = `\\n${symbol(this.state)} ${opts.message}\\n`;\n const value = this.value ? active : inactive;\n\n // NOTE it's trimming leading spaces, so we use an invisible character at the beginnign of the line to add some spacing\n switch (this.state) {\n case 'submit':\n return `${title} ${color.dim(value)}`;\n case 'cancel':\n return `${title} ${color.strikethrough(\n color.dim(value),\n )}\\n`;\n default: {\n return `${title} ${\n this.value\n ? `${color.green(S_RADIO_ACTIVE)} ${active}`\n : `${color.dim(S_RADIO_INACTIVE)} ${color.dim(active)}`\n } ${color.dim('/')} ${\n !this.value\n ? `${color.green(S_RADIO_ACTIVE)} ${inactive}`\n : `${color.dim(S_RADIO_INACTIVE)} ${color.dim(inactive)}`\n }\\n`;\n }\n }\n },\n }).prompt() as Promise<boolean | symbol>;\n};\n\n\n\ntype Primitive = Readonly<string | boolean | number>;\n\nexport type Option<Value> = Value extends Primitive\n ? {\n /**\n * Internal data for this option.\n */\n value: Value;\n /**\n * The optional, user-facing text for this option.\n *\n * By default, the `value` is converted to a string.\n */\n label?: string;\n /**\n * An optional hint to display to the user when\n * this option might be selected.\n *\n * By default, no `hint` is displayed.\n */\n hint?: string;\n }\n : {\n /**\n * Internal data for this option.\n */\n value: Value;\n /**\n * Required. The user-facing text for this option.\n */\n label: string;\n /**\n * An optional hint to display to the user when\n * this option might be selected.\n *\n * By default, no `hint` is displayed.\n */\n hint?: string;\n };\n\nexport interface SelectOptions<Value> extends CommonOptions {\n message: string;\n options: Array<Option<Value>>;\n initialValue?: Value;\n maxItems?: number;\n}\n\nexport const select = <Value>(opts: SelectOptions<Value>) => {\n const opt = (option: Option<Value>, state: 'inactive' | 'active' | 'selected' | 'cancelled') => {\n const label = option.label ?? String(option.value);\n switch (state) {\n case 'selected':\n return `${color.dim(label)}`;\n case 'active':\n return `${color.green(S_RADIO_ACTIVE)} ${label} ${\n option.hint ? color.dim(`(${option.hint})`) : ''\n }`;\n case 'cancelled':\n return `${color.strikethrough(color.dim(label))}`;\n default:\n return `${color.dim(S_RADIO_INACTIVE)} ${color.dim(label)}`;\n }\n };\n\n return new SelectPrompt({\n options: opts.options,\n input: opts.input,\n output: opts.output,\n initialValue: opts.initialValue,\n render() {\n const title = `${color.gray(S_BAR)}\\n${symbol(this.state)} ${opts.message}\\n`;\n\n switch (this.state) {\n case 'submit':\n return `${title}${color.gray(S_BAR)} ${opt(this.options[this.cursor], 'selected')}`;\n case 'cancel':\n return `${title}${color.gray(S_BAR)} ${opt(\n this.options[this.cursor],\n 'cancelled',\n )}\\n${color.gray(S_BAR)}`;\n default: {\n return `${title}${color.cyan(S_BAR)} ${limitOptions({\n output: opts.output,\n cursor: this.cursor,\n options: this.options,\n maxItems: opts.maxItems,\n style: (item, active) => opt(item, active ? 'active' : 'inactive'),\n }).join(`\\n${color.cyan(S_BAR)} `)}\\n${color.cyan(S_BAR_END)}\\n`;\n }\n }\n },\n }).prompt() as Promise<Value | symbol>;\n};\n\n\nexport interface MultiSelectOptions<Value> extends CommonOptions {\n message: string;\n details?: string;\n options: Array<Option<Value>>;\n initialValues?: Array<Value>;\n maxItems?: number;\n required?: boolean;\n cursorAt?: Value;\n}\nexport const multiselect = <Value>(opts: MultiSelectOptions<Value>) => {\n const opt = (\n option: Option<Value>,\n state: 'inactive' | 'active' | 'selected' | 'active-selected' | 'submitted' | 'cancelled',\n ) => {\n const label = option.label ?? String(option.value);\n if (state === 'active') {\n return `${color.cyan(S_CHECKBOX_ACTIVE)} ${label} ${\n option.hint ? color.dim(`(${option.hint})`) : ''\n }`;\n }\n if (state === 'selected') {\n return `${color.green(S_CHECKBOX_SELECTED)} ${color.dim(label)} ${\n option.hint ? color.dim(`(${option.hint})`) : ''\n }`;\n }\n if (state === 'cancelled') {\n return `${color.strikethrough(color.dim(label))}`;\n }\n if (state === 'active-selected') {\n return `${color.green(S_CHECKBOX_SELECTED)} ${label} ${\n option.hint ? color.dim(`(${option.hint})`) : ''\n }`;\n }\n if (state === 'submitted') {\n return `${color.dim(label)}`;\n }\n return `${color.dim(S_CHECKBOX_INACTIVE)} ${color.dim(label)}`;\n };\n\n return new MultiSelectPrompt({\n options: opts.options,\n input: opts.input,\n output: opts.output,\n initialValues: opts.initialValues,\n required: opts.required ?? true,\n cursorAt: opts.cursorAt,\n validate(selected: Array<Value>) {\n if (this.required && selected.length === 0) {\n return `Please select at least one option.\\n${color.reset(\n color.dim(\n `Press ${color.gray(color.bgWhite(color.inverse(' space ')))} to select, ${color.gray(\n color.bgWhite(color.inverse(' enter ')),\n )} to submit`,\n ),\n )}`;\n }\n },\n render() {\n let title = `${color.gray(S_BAR)}\\n${symbol(this.state)} ${opts.message}\\n`;\n if (opts.details) title += `${color.gray(S_BAR)} ${opts.details}\\n`;\n\n const styleOption = (option: Option<Value>, active: boolean) => {\n const selected = this.value.includes(option.value);\n if (active && selected) {\n return opt(option, 'active-selected');\n }\n if (selected) {\n return opt(option, 'selected');\n }\n return opt(option, active ? 'active' : 'inactive');\n };\n\n switch (this.state) {\n case 'submit': {\n return `${title}${color.gray(S_BAR)} ${\n this.options\n .filter(({ value }) => this.value.includes(value))\n .map((option) => opt(option, 'submitted'))\n .join(color.dim(', ')) || color.dim('none')\n }`;\n }\n case 'cancel': {\n const label = this.options\n .filter(({ value }) => this.value.includes(value))\n .map((option) => opt(option, 'cancelled'))\n .join(color.dim(', '));\n return `${title}${color.gray(S_BAR)} ${\n label.trim() ? `${label}\\n${color.gray(S_BAR)}` : ''\n }`;\n }\n case 'error': {\n const footer = this.error\n .split('\\n')\n .map((ln, i) => (i === 0 ? `${color.yellow(S_BAR_END)} ${color.yellow(ln)}` : ` ${ln}`))\n .join('\\n');\n return `${title + color.yellow(S_BAR)} ${limitOptions({\n output: opts.output,\n options: this.options,\n cursor: this.cursor,\n maxItems: opts.maxItems,\n style: styleOption,\n }).join(`\\n${color.yellow(S_BAR)} `)}\\n${footer}\\n`;\n }\n default: {\n return `${title}${color.cyan(S_BAR)} ${limitOptions({\n output: opts.output,\n options: this.options,\n cursor: this.cursor,\n maxItems: opts.maxItems,\n style: styleOption,\n }).join(`\\n${color.cyan(S_BAR)} `)}\\n${color.cyan(S_BAR_END)}\\n`;\n }\n }\n },\n }).prompt() as Promise<Array<Value> | symbol>;\n};\n\n\n\n/// ////\n\nconst prompts = {\n confirm,\n select,\n multiselect,\n};\n\nexport default prompts;\n","import fs from 'node:fs/promises';\nimport { DotEnvFileDataSource, EnvGraph } from '@env-spec/env-graph';\nimport {\n envSpecUpdater, ParsedEnvSpecFile, ParsedEnvSpecStaticValue, parseEnvSpecDotEnvFile,\n} from '@env-spec/parser';\nimport { StaticValueResolver } from '../../../../env-graph/src/lib/resolver';\n\n\nconst PUBLIC_PREFIXES = [\n 'PUBLIC',\n 'VITE',\n 'NEXT_PUBLIC',\n 'NUXT_PUBLIC',\n];\nconst PUBLIC_KEYWORDS = ['PUBLIC'];\nconst SENSITIVE_KEYWORDS = [\n 'SECRET',\n 'API_KEY',\n 'PASSWORD',\n 'TOKEN',\n 'PRIVATE',\n 'CREDENTIALS',\n];\n\nfunction isValidUrl(val: string) {\n try {\n const u = new URL(val);\n return true;\n } catch (err) {\n return false;\n }\n}\n\nconst EMAIL_REGEX = /^(([^<>()[\\]\\\\.,;:\\s@\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\nconst VALID_NUMBER_REGEX = /^(0|([1-9][0-9]*))?(\\.[0-9]+)?$/;\n\n\nfunction inferItemDecorators(file: ParsedEnvSpecFile, itemKey: string, valueStr: string) {\n // infer @sensitive\n let itemIsPublic = false;\n if (PUBLIC_PREFIXES.some((prefix) => itemKey.startsWith(prefix))) itemIsPublic = true;\n if (PUBLIC_KEYWORDS.some((keyword) => itemKey.includes(keyword))) itemIsPublic = true;\n\n let itemIsSensitive = false;\n if (SENSITIVE_KEYWORDS.some((keyword) => itemKey.includes(keyword))) itemIsSensitive = true;\n\n if (itemIsPublic) {\n // not marking these for now, since we've already made the default not sensitive\n // envSpecUpdater.setItemDecorator(file, itemKey, 'sensitive', 'false');\n } else if (itemIsSensitive) {\n envSpecUpdater.setItemDecorator(file, itemKey, 'sensitive', 'true');\n }\n\n // infer @type\n // > from key\n if (itemKey === 'PORT' || itemKey.endsWith('_PORT')) {\n envSpecUpdater.setItemDecorator(file, itemKey, 'type', 'port');\n } else if (itemKey.endsWith('_EMAIL')) {\n envSpecUpdater.setItemDecorator(file, itemKey, 'type', 'email');\n } else if (itemKey.endsWith('_URL') || itemKey.endsWith('_URI')) {\n envSpecUpdater.setItemDecorator(file, itemKey, 'type', 'url');\n\n\n // > from value\n } else if (valueStr) {\n // move obvious examples to @example\n if (valueStr.startsWith('<') && valueStr.endsWith('>')) {\n envSpecUpdater.setItemDecorator(file, itemKey, 'example', valueStr);\n // remove example from value\n }\n\n if (valueStr === 'true' || valueStr === 'false') {\n envSpecUpdater.setItemDecorator(file, itemKey, 'type', 'boolean');\n } else if (EMAIL_REGEX.test(valueStr)) {\n envSpecUpdater.setItemDecorator(file, itemKey, 'type', 'email');\n } else if (valueStr !== '0' && valueStr !== '1' && VALID_NUMBER_REGEX.test(valueStr)) {\n envSpecUpdater.setItemDecorator(file, itemKey, 'type', 'number');\n } else if (isValidUrl(valueStr)) {\n envSpecUpdater.setItemDecorator(file, itemKey, 'type', 'url');\n }\n // TODO: more...\n }\n}\n\nexport function inferSchemaUpdates(file: ParsedEnvSpecFile) {\n for (const item of file.configItems) {\n const valueStr = (\n item.value instanceof ParsedEnvSpecStaticValue && item.value.value?.toString()\n ) || '';\n // console.log(item.key, '-', valueStr);\n inferItemDecorators(file, item.key, valueStr);\n }\n}\n\n\nexport function ensureAllItemsExist(envGraph: EnvGraph, schemaFile: ParsedEnvSpecFile) {\n const addedItemKeys: Array<string> = [];\n for (const itemKey in envGraph.configSchema) {\n const item = envGraph.configSchema[itemKey];\n const itemInSchema = schemaFile.configItems.find((i) => i.key === itemKey);\n\n if (!itemInSchema) {\n if (addedItemKeys.length === 0) {\n envSpecUpdater.injectFromStr(schemaFile, [\n '',\n '# items added to schema by `varlock init`',\n '# that were missing in example, but detected in other env files',\n '# PLEASE REVIEW THESE!',\n '# ---',\n '',\n ].join('\\n'), { location: 'end' });\n }\n addedItemKeys.push(itemKey);\n envSpecUpdater.injectFromStr(schemaFile, [`${itemKey}=`].join('\\n'));\n const itemValue = (\n item.valueResolver instanceof StaticValueResolver && item.valueResolver.staticValue\n ) || '';\n inferItemDecorators(schemaFile, itemKey, String(itemValue));\n }\n }\n}\n\nexport async function detectRedundantValues(envGraph: EnvGraph, opts: { delete?: boolean } = {}) {\n const schema = envGraph.schemaDataSource;\n if (!schema) return {};\n const redundantItemsBySourcePath: Record<string, Array<string>> = {};\n const schemaValues = schema.getStaticValues();\n for (const source of envGraph.dataSources) {\n if (source === schema) continue;\n // we'll skip example files, since it is expected to be deleted and full of redundant values\n if (source.type === 'example') continue;\n if (!(source instanceof DotEnvFileDataSource) || !source.parsedFile) continue;\n\n const sourceValues = source.getStaticValues();\n for (const [key, value] of Object.entries(sourceValues)) {\n if (schemaValues[key] !== value) continue;\n\n redundantItemsBySourcePath[source.fullPath] ||= [];\n redundantItemsBySourcePath[source.fullPath].push(key);\n if (opts.delete) {\n envSpecUpdater.deleteItem(source.parsedFile, key);\n }\n }\n\n if (opts.delete) {\n await fs.writeFile(source.fullPath, source.parsedFile.toString(), 'utf8');\n }\n }\n\n return redundantItemsBySourcePath;\n}\n","/* eslint-disable @stylistic/quotes */\nimport path from 'node:path';\nimport fs from 'node:fs/promises';\nimport ansis from 'ansis';\nimport { isCancel, select } from '@clack/prompts';\nimport { define } from 'gunshi';\n\nimport _ from '@env-spec/utils/my-dash';\nimport { DotEnvFileDataSource } from '@env-spec/env-graph';\nimport { envSpecUpdater, parseEnvSpecDotEnvFile } from '@env-spec/parser';\nimport { checkIsFileGitIgnored } from '@env-spec/utils/git-utils';\nimport { pathExists } from '@env-spec/utils/fs-utils';\n\nimport { loadVarlockEnvGraph } from '../../lib/load-graph';\nimport prompts from '../helpers/prompts';\nimport { fmt, logLines } from '../helpers/pretty-format';\nimport { detectRedundantValues, ensureAllItemsExist, inferSchemaUpdates } from '../helpers/infer-schema';\nimport { detectJsPackageManager, installJsDependency } from '../helpers/js-package-manager-utils';\nimport { type TypedGunshiCommandFn } from '../helpers/gunshi-type-utils';\nimport { gracefulExit } from 'exit-hook';\n\nexport const commandSpec = define({\n name: 'init',\n description: 'Set up varlock in the current project',\n args: {},\n});\n\nexport const commandFn: TypedGunshiCommandFn<typeof commandSpec> = async (ctx) => {\n const jsPackageManager = detectJsPackageManager();\n\n console.log('🧙 Hello and welcome to Varlock 🔒🔥✨');\n\n let envGraph = await loadVarlockEnvGraph();\n const existingSchemaFile = envGraph.dataSources.find((dataSource) => {\n return dataSource.type === 'schema';\n });\n\n // * SET UP SCHEMA ---------------------------------------------\n if (existingSchemaFile) {\n // for now - we don't do anything if they already have a schema set up\n // in the future, we may want to add more tools for projects that are already set up\n logLines([\n `It looks like you already have a ${fmt.fileName('.env.schema')} file 🎉`,\n 'This init helper is meant to help you get a new project set up.',\n 'If you need to make changes to your schema or values, you can update your files directly.',\n 'See more docs at https://varlock.dev/guides/schema',\n ]);\n } else {\n // find/select example file to use for schema gereration\n let exampleFileToConvert: DotEnvFileDataSource | null = null;\n const allExampleFiles = envGraph.dataSources.filter((dataSource) => {\n return dataSource instanceof DotEnvFileDataSource && dataSource.type === 'example';\n }) as Array<DotEnvFileDataSource>;\n if (allExampleFiles.length === 1) {\n exampleFileToConvert = allExampleFiles[0];\n } else if (allExampleFiles.length > 1) {\n console.log('');\n // not sure what to do here... could have them select one?\n const selectedExample = await select({\n message: `We detected more than one example .env file. Which one should we use to create your new ${fmt.fileName('.env.schema')}?`,\n options: allExampleFiles.map((file) => ({\n label: file.fileName,\n value: file,\n })),\n });\n if (isCancel(selectedExample)) return gracefulExit(0);\n exampleFileToConvert = selectedExample;\n }\n\n // update the schema\n const parsedEnvFile = exampleFileToConvert?.parsedFile || parseEnvSpecDotEnvFile('');\n if (!parsedEnvFile) throw new Error('No parsed .env file found');\n envSpecUpdater.ensureHeader(parsedEnvFile, [\n 'This env file uses @env-spec - see https://varlock.dev/env-spec for more info',\n '',\n // TODO: add env spec version? real links?\n ].join('\\n'));\n envSpecUpdater.setRootDecorator(parsedEnvFile, 'defaultRequired', 'false', { explicitTrue: true });\n envSpecUpdater.setRootDecorator(parsedEnvFile, 'defaultSensitive', 'false', { explicitTrue: true });\n // TODO: detect js/ts project before adding this\n envSpecUpdater.setRootDecorator(parsedEnvFile, 'generateTypes', 'lang=ts, path=env.d.ts', { bareFnArgs: true });\n // envSpecUpdater.setRootDecorator(parsedEnvFile, 'envFlag', 'APP_ENV', { comment: 'controls automatic loading of env-specific files (e.g. .env.test, .env.prod, etc.)' });\n\n // add example item\n envSpecUpdater.injectFromStr(parsedEnvFile, [\n '',\n '# example env variable injected by `varlock init` ⚠️ DELETE THIS ITEM! ⚠️',\n '# @required @sensitive @example=\"example value\"',\n 'EXAMPLE_ITEM=\"delete me!\"',\n '',\n ].join('\\n'), { location: 'after_header' });\n // update some decorators based on some simple heuristics\n inferSchemaUpdates(parsedEnvFile);\n // add items we find in other env files, but are missing in the schema/example\n ensureAllItemsExist(envGraph, parsedEnvFile);\n\n // write new updated schema file\n const schemaFilePath = path.join(process.cwd(), '.env.schema');\n await fs.writeFile(schemaFilePath, parsedEnvFile.toString());\n\n // log new schema file path\n if (exampleFileToConvert) {\n logLines([\n '',\n `Your ${fmt.fileName(exampleFileToConvert.fileName)} has been used to generate your new ${fmt.fileName('.env.schema')}:`,\n fmt.filePath(schemaFilePath),\n ]);\n } else {\n logLines([\n '',\n `Your new ${fmt.fileName('.env.schema')} file has been created:`,\n fmt.filePath(schemaFilePath),\n ]);\n }\n\n // make sure .env.schema is not gitignored\n if (await checkIsFileGitIgnored(schemaFilePath)) {\n // maybe could do this silently? it's relatively harmless\n logLines([ansis.dim(`(and updated ${fmt.fileName('.gitignore')} to ensure it will be tracked by git)`)]);\n await fs.appendFile('.gitignore', '\\n!.env.schema');\n }\n\n // ask them to review and confirm\n logLines([\n '',\n ansis.bold(`🚧 Please review and update your new ${fmt.fileName('.env.schema')} file! 🚧`),\n `We've done our best to get you started, but you must review and make sure it is correct!`,\n '',\n `👉 Some helpful pointers to get you started:`,\n `- add a description to each item when the name is not self explanitory - it will come through in generated types`,\n `- use ${fmt.decorator('@required')} (or ${fmt.decorator('@optional')}) to tag items that should fail validation when empty`,\n `- use ${fmt.decorator('@sensitive')} to tag items that contain sensitive secrets, and must be handled accordingly`,\n `- use ${fmt.decorator('@type')} to set an item's data type (if not a basic string), which affects validation and coercion logic`,\n `- if an item value is a ${ansis.italic('useful example')} rather than a default, use ${fmt.decorator('@example')}`,\n `- if an item value is just a dummy placeholder, delete it`,\n ]);\n const confirmReviewed = await prompts.confirm({\n message: `Have you reviewed and updated your new ${fmt.fileName('.env.schema')} file?`,\n });\n if (isCancel(confirmReviewed)) return gracefulExit(0);\n\n // reload the graph\n envGraph = await loadVarlockEnvGraph();\n\n // check if they removed the EXAMPLE_ITEM and warn them\n if (envGraph.configSchema.EXAMPLE_ITEM) {\n logLines([\n '',\n ansis.bold(`🚨 Really? ${ansis.red(\"You didn't remove the EXAMPLE_ITEM!\")}`),\n `Please make sure your schema is all correct before using it...`,\n ]);\n }\n\n // delete the example file if they want us to\n if (exampleFileToConvert) {\n const confirmDeleteExample = await prompts.confirm({\n message: `Should we delete your ${fmt.fileName(exampleFileToConvert.fileName)} file? ${ansis.italic.gray('(you can always do this yourself later)')}`,\n });\n if (isCancel(confirmDeleteExample)) return gracefulExit(0);\n if (confirmDeleteExample) {\n await fs.unlink(exampleFileToConvert.fullPath);\n }\n }\n\n // recommendation to delete defaults file\n const defaultsFile = envGraph.dataSources.find((dataSource) => {\n return dataSource instanceof DotEnvFileDataSource && dataSource.type === 'defaults';\n }) as DotEnvFileDataSource;\n if (defaultsFile) {\n logLines([\n '',\n `🚧 We detected a ${fmt.fileName(defaultsFile.fileName)} file in your project`,\n `You should migrate these default values into ${fmt.fileName('.env.schema')} and delete ${fmt.fileName(defaultsFile.fileName)}`,\n ]);\n }\n\n // detect and remove redundant defaults that are now in the schema\n const redundantInfo = await detectRedundantValues(envGraph);\n if (Object.keys(redundantInfo).length > 0) {\n logLines([\n '',\n ansis.bold('‼️ Now that your schema contains defaults, some values in your other .env files are redundant:'),\n ]);\n for (const [sourcePath, itemKeys] of Object.entries(redundantInfo)) {\n console.log(fmt.filePath(sourcePath));\n console.log(' ', itemKeys.map((k) => ansis.italic(k)).join(', '));\n }\n\n const confirmDeleteRedundant = await prompts.confirm({\n message: 'Should we delete these redundant values from your other .env files?',\n });\n if (isCancel(confirmDeleteRedundant)) return gracefulExit(0);\n if (confirmDeleteRedundant) {\n await detectRedundantValues(envGraph, { delete: true });\n }\n }\n\n // final success!\n logLines([\n '',\n ansis.bold('🎉 Great!'),\n `You can run ${fmt.command('varlock load', { jsPackageManager })} to attempt loading your env vars validate against your new schema.`,\n '',\n 'Check out our docs for more info about integrating into your application.',\n '',\n '📖 https://varlock.dev 👈',\n '',\n ]);\n }\n\n // * MAKE SURE VARLOCK IS INSTALLED ------------------------------------------\n if (jsPackageManager && await pathExists(path.join(process.cwd(), 'package.json'))) {\n const installResult = installJsDependency({\n packageManager: jsPackageManager.name,\n packageName: 'varlock',\n });\n if (installResult) {\n logLines([\n '',\n `✅ Added ${fmt.packageName('varlock')} as a dependency in your package.json`,\n ]);\n }\n }\n};\n"]}
|