varlock 0.0.4 → 0.0.6
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 +5 -6
- package/dist/chunk-33ROL4J5.js.map +1 -1
- package/dist/chunk-3NTATUIY.js +17 -0
- package/dist/chunk-3NTATUIY.js.map +1 -0
- package/dist/{chunk-DHFEY3C4.js → chunk-46HUIBFX.js} +30 -7
- package/dist/chunk-46HUIBFX.js.map +1 -0
- package/dist/{chunk-7UQXFWKN.js → chunk-5URKU5HG.js} +93 -3
- package/dist/chunk-5URKU5HG.js.map +1 -0
- package/dist/{chunk-C273RDM5.js → chunk-656FP6YP.js} +10 -8
- package/dist/chunk-656FP6YP.js.map +1 -0
- package/dist/{chunk-XPHGSDAF.js → chunk-7TXRGZZC.js} +3 -4
- package/dist/chunk-7TXRGZZC.js.map +1 -0
- package/dist/chunk-ANHWU7RB.js +59 -0
- package/dist/chunk-ANHWU7RB.js.map +1 -0
- package/dist/{chunk-VN64D2EQ.js → chunk-ASGIMFTP.js} +3 -4
- package/dist/chunk-ASGIMFTP.js.map +1 -0
- package/dist/{chunk-ZIN4KXR6.js → chunk-BIYA4LBB.js} +10 -9
- package/dist/chunk-BIYA4LBB.js.map +1 -0
- package/dist/chunk-DAZNZPLN.js.map +1 -1
- package/dist/chunk-FGMXIEFA.js.map +1 -1
- package/dist/{chunk-DOIKZ3NG.js → chunk-HBCSJWPN.js} +6 -6
- package/dist/chunk-HBCSJWPN.js.map +1 -0
- package/dist/{chunk-H2TT4DP5.js → chunk-HH7DAS63.js} +17 -161
- package/dist/chunk-HH7DAS63.js.map +1 -0
- package/dist/{chunk-NN3XFBPE.js → chunk-I3J2UCH7.js} +3 -3
- package/dist/chunk-I3J2UCH7.js.map +1 -0
- package/dist/{chunk-DROJWTCD.js → chunk-INMYFAWB.js} +1401 -1434
- package/dist/chunk-INMYFAWB.js.map +1 -0
- package/dist/{chunk-A4AHZSZB.js → chunk-JX4PYL7V.js} +15 -27
- package/dist/chunk-JX4PYL7V.js.map +1 -0
- package/dist/chunk-LHTLO65N.js +99 -0
- package/dist/chunk-LHTLO65N.js.map +1 -0
- package/dist/{chunk-B4UBSMSZ.js → chunk-PUGFIZE3.js} +4 -3
- package/dist/chunk-PUGFIZE3.js.map +1 -0
- package/dist/{chunk-RCHPHIHX.js → chunk-RZT65DRA.js} +2 -2
- package/dist/chunk-RZT65DRA.js.map +1 -0
- package/dist/chunk-USSBWRQF.js +54 -0
- package/dist/chunk-USSBWRQF.js.map +1 -0
- package/dist/chunk-WGUFO7CT.js +193 -0
- package/dist/chunk-WGUFO7CT.js.map +1 -0
- package/dist/{chunk-SVDXBE6D.js → chunk-X3HJMANF.js} +3 -4
- package/dist/chunk-X3HJMANF.js.map +1 -0
- package/dist/chunk-YSPDPNBR.js +14 -0
- package/dist/{chunk-RUB5A7IC.js.map → chunk-YSPDPNBR.js.map} +1 -1
- package/dist/cli/cli-executable.js +702 -158
- package/dist/cli/cli-executable.js.map +1 -1
- package/dist/doctor.command-SBG4H7Z4.js +7 -0
- package/dist/{doctor.command-7BQSOQWW.js.map → doctor.command-SBG4H7Z4.js.map} +1 -1
- package/dist/dotenv-compat.js +5 -6
- package/dist/en-US-TSGNDI2P.js.map +1 -1
- package/dist/encrypt.command-AGHQ4KTI.js +7 -0
- package/dist/{encrypt.command-VGJABHNK.js.map → encrypt.command-AGHQ4KTI.js.map} +1 -1
- package/dist/env-B8lQt2sl.d.ts +42 -0
- package/dist/help.command-B7VWA53B.js +5 -0
- package/dist/{help.command-YZDL2VEQ.js.map → help.command-B7VWA53B.js.map} +1 -1
- package/dist/index.d.ts +1 -2
- package/dist/index.js +11 -10
- package/dist/index.js.map +1 -1
- package/dist/init.command-3DHC5DNC.js +13 -0
- package/dist/{init.command-CY3ZOIGP.js.map → init.command-3DHC5DNC.js.map} +1 -1
- package/dist/ja-JP-UBPCQAAD.js.map +1 -1
- package/dist/load.command-CTOV5PYR.js +12 -0
- package/dist/{load.command-ZFNTAAJE.js.map → load.command-CTOV5PYR.js.map} +1 -1
- package/dist/login.command-UZBZIPP3.js +10 -0
- package/dist/{login.command-KYZ4FXS5.js.map → login.command-UZBZIPP3.js.map} +1 -1
- package/dist/run.command-5276KIMX.js +12 -0
- package/dist/{run.command-VRKI6ZVN.js.map → run.command-5276KIMX.js.map} +1 -1
- package/dist/runtime/env.d.ts +1 -27
- package/dist/runtime/env.js +1 -1
- package/dist/runtime/patch-console.js +2 -3
- package/dist/runtime/patch-response.js +2 -3
- package/dist/runtime/patch-server-response.js +2 -3
- package/dist/telemetry.command-UHJTZULL.js +10 -0
- package/dist/telemetry.command-UHJTZULL.js.map +1 -0
- package/package.json +5 -1
- package/dist/chunk-7UQXFWKN.js.map +0 -1
- package/dist/chunk-A4AHZSZB.js.map +0 -1
- package/dist/chunk-B4UBSMSZ.js.map +0 -1
- package/dist/chunk-C273RDM5.js.map +0 -1
- package/dist/chunk-CLVBJA4G.js +0 -107
- package/dist/chunk-CLVBJA4G.js.map +0 -1
- package/dist/chunk-DHFEY3C4.js.map +0 -1
- package/dist/chunk-DOIKZ3NG.js.map +0 -1
- package/dist/chunk-DROJWTCD.js.map +0 -1
- package/dist/chunk-GSRDZVQI.js +0 -26
- package/dist/chunk-GSRDZVQI.js.map +0 -1
- package/dist/chunk-H2TT4DP5.js.map +0 -1
- package/dist/chunk-NN3XFBPE.js.map +0 -1
- package/dist/chunk-QCC3P7BT.js +0 -39
- package/dist/chunk-QCC3P7BT.js.map +0 -1
- package/dist/chunk-RCHPHIHX.js.map +0 -1
- package/dist/chunk-RUB5A7IC.js +0 -14
- package/dist/chunk-SVDXBE6D.js.map +0 -1
- package/dist/chunk-VN64D2EQ.js.map +0 -1
- package/dist/chunk-XHOJF7U7.js +0 -12
- package/dist/chunk-XHOJF7U7.js.map +0 -1
- package/dist/chunk-XPHGSDAF.js.map +0 -1
- package/dist/chunk-ZIN4KXR6.js.map +0 -1
- package/dist/doctor.command-7BQSOQWW.js +0 -6
- package/dist/encrypt.command-VGJABHNK.js +0 -6
- package/dist/help.command-YZDL2VEQ.js +0 -5
- package/dist/init.command-CY3ZOIGP.js +0 -11
- package/dist/load.command-ZFNTAAJE.js +0 -10
- package/dist/login.command-KYZ4FXS5.js +0 -7
- package/dist/opt-out.command-Y4KUQ6PQ.js +0 -5
- package/dist/opt-out.command-Y4KUQ6PQ.js.map +0 -1
- package/dist/run.command-VRKI6ZVN.js +0 -10
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/commands/run.command.ts"],"names":[],"mappings":"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","file":"chunk-JX4PYL7V.js","sourcesContent":["import { execa, type ResultPromise } from 'execa';\nimport which from 'which';\nimport { define } from 'gunshi';\n\nimport { loadVarlockEnvGraph } from '../../lib/load-graph';\nimport { checkForConfigErrors, checkForSchemaErrors } from '../helpers/error-checks';\nimport { type TypedGunshiCommandFn } from '../helpers/gunshi-type-utils';\nimport { gracefulExit } from 'exit-hook';\n\n\nexport const commandSpec = define({\n name: 'run',\n description: 'Run a command with your environment variables injected',\n args: {\n // watch: {\n // type: 'boolean',\n // short: 'w',\n // description: 'Watch mode',\n // },\n },\n});\n\nlet commandProcess: ResultPromise | undefined;\nlet childCommandKilledFromRestart = false;\nlet isWatchModeRestart = false;\n\nexport const commandFn: TypedGunshiCommandFn<typeof commandSpec> = async (ctx) => {\n // if \"--\" is present, split the args into our command and the rest, which will be another external command\n const argv = process.argv.slice(2);\n let commandArgs: Array<string> = [];\n let restCommandArgs: Array<string> = [];\n if (argv.includes('--')) {\n const doubleDashIndex = argv.indexOf('--');\n commandArgs = argv.slice(0, doubleDashIndex);\n restCommandArgs = argv.slice(doubleDashIndex + 1);\n } else {\n throw new Error('No command to run! Your command should look like `varlock run -- <your-command>`');\n }\n const commandToRunAsArgs = restCommandArgs;\n const commandToRunStr = restCommandArgs.join(' ');\n\n const rawCommand = commandToRunAsArgs[0];\n const commandArgsOnly = commandToRunAsArgs.slice(1);\n const pathAwareCommand = which.sync(rawCommand, { nothrow: true });\n\n // const isWatchEnabled = ctx.values.watch;\n const isWatchEnabled = false;\n\n // console.log('running command', pathAwareCommand || rawCommand, commandArgsOnly);\n\n\n const envGraph = await loadVarlockEnvGraph();\n checkForSchemaErrors(envGraph);\n await envGraph.resolveEnvValues();\n checkForConfigErrors(envGraph);\n\n // will fail above if there are any errors\n\n const resolvedEnv = envGraph.getResolvedEnvObject();\n // console.log(resolvedEnv);\n\n // needs more thought here\n const fullInjectedEnv = {\n ...process.env,\n ...resolvedEnv,\n __VARLOCK_RUN: '1', // flag for a child process to detect it is runnign via `varlock run`\n __VARLOCK_ENV: JSON.stringify(envGraph.getSerializedGraph()),\n };\n\n commandProcess = execa(pathAwareCommand || rawCommand, commandArgsOnly, {\n stdio: 'inherit',\n env: fullInjectedEnv,\n });\n // console.log('PARENT PID = ', process.pid);\n // console.log('CHILD PID = ', commandProcess.pid);\n\n // if first run, we need to attach some extra exit handling\n if (!isWatchModeRestart) {\n // try to make sure we shut down cleanly and kill the child process\n process.on('exit', (code: any, signal: any) => {\n // if (childCommandKilledFromRestart) {\n // childCommandKilledFromRestart = false;\n // return;\n // }\n // console.log('exit!', code, signal);\n commandProcess?.kill(9);\n });\n\n ['SIGTERM', 'SIGINT'].forEach((signal) => {\n process.on(signal, () => {\n // console.log('SIGNAL = ', signal);\n commandProcess?.kill(9);\n gracefulExit(1);\n });\n });\n // TODO: handle other signals?\n }\n\n\n let exitCode: any; // TODO: fix this any\n try {\n const commandResult = await commandProcess;\n exitCode = commandResult.exitCode;\n } catch (error) {\n // console.log('child command error!', error);\n if ((error as any).signal === 'SIGINT' && childCommandKilledFromRestart) {\n // console.log('child command failed due to being killed form restart');\n childCommandKilledFromRestart = false;\n return;\n }\n\n // console.log('child command result error', error);\n if ((error as any).signal === 'SIGINT' || (error as any).signal === 'SIGKILL') {\n gracefulExit(1);\n } else {\n console.log((error as Error).message);\n console.log(`command [${commandToRunStr}] failed`);\n console.log('try running the same command without dmno');\n console.log('if you get a different result, dmno may be the problem...');\n // console.log(`Please report issue here: <${REPORT_ISSUE_LINK}>`);\n }\n exitCode = (error as any).exitCode || 1;\n }\n\n if (isWatchEnabled) {\n if (!childCommandKilledFromRestart) {\n if (exitCode === 0) {\n console.log('\\n✅ command completed successfully');\n } else {\n console.log(`\\n💥 command failed - exit code = ${exitCode}`);\n }\n }\n }\n\n if (!isWatchEnabled) {\n return gracefulExit(exitCode);\n } else {\n console.log('... watching for changes ...');\n }\n};\n"]}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { __name } from './chunk-XN24GZXQ.js';
|
|
2
|
+
import process from 'node:process';
|
|
3
|
+
|
|
4
|
+
var asyncCallbacks = /* @__PURE__ */ new Set();
|
|
5
|
+
var callbacks = /* @__PURE__ */ new Set();
|
|
6
|
+
var isCalled = false;
|
|
7
|
+
var isRegistered = false;
|
|
8
|
+
async function exit(shouldManuallyExit, isSynchronous, signal) {
|
|
9
|
+
if (isCalled) {
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
isCalled = true;
|
|
13
|
+
if (asyncCallbacks.size > 0 && isSynchronous) {
|
|
14
|
+
console.error([
|
|
15
|
+
"SYNCHRONOUS TERMINATION NOTICE:",
|
|
16
|
+
"When explicitly exiting the process via process.exit or via a parent process,",
|
|
17
|
+
"asynchronous tasks in your exitHooks will not run. Either remove these tasks,",
|
|
18
|
+
"use gracefulExit() instead of process.exit(), or ensure your parent process",
|
|
19
|
+
"sends a SIGINT to the process running this code."
|
|
20
|
+
].join(" "));
|
|
21
|
+
}
|
|
22
|
+
const exitCode = 128 + signal;
|
|
23
|
+
const done = /* @__PURE__ */ __name((force = false) => {
|
|
24
|
+
if (force === true || shouldManuallyExit === true) {
|
|
25
|
+
process.exit(exitCode);
|
|
26
|
+
}
|
|
27
|
+
}, "done");
|
|
28
|
+
for (const callback of callbacks) {
|
|
29
|
+
callback(exitCode);
|
|
30
|
+
}
|
|
31
|
+
if (isSynchronous) {
|
|
32
|
+
done();
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
const promises = [];
|
|
36
|
+
let forceAfter = 0;
|
|
37
|
+
for (const [callback, wait] of asyncCallbacks) {
|
|
38
|
+
forceAfter = Math.max(forceAfter, wait);
|
|
39
|
+
promises.push(Promise.resolve(callback(exitCode)));
|
|
40
|
+
}
|
|
41
|
+
const asyncTimer = setTimeout(() => {
|
|
42
|
+
done(true);
|
|
43
|
+
}, forceAfter);
|
|
44
|
+
await Promise.all(promises);
|
|
45
|
+
clearTimeout(asyncTimer);
|
|
46
|
+
done();
|
|
47
|
+
}
|
|
48
|
+
__name(exit, "exit");
|
|
49
|
+
function addHook(options) {
|
|
50
|
+
const { onExit, wait, isSynchronous } = options;
|
|
51
|
+
const asyncCallbackConfig = [onExit, wait];
|
|
52
|
+
if (isSynchronous) {
|
|
53
|
+
callbacks.add(onExit);
|
|
54
|
+
} else {
|
|
55
|
+
asyncCallbacks.add(asyncCallbackConfig);
|
|
56
|
+
}
|
|
57
|
+
if (!isRegistered) {
|
|
58
|
+
isRegistered = true;
|
|
59
|
+
process.once("beforeExit", exit.bind(void 0, true, false, -128));
|
|
60
|
+
process.once("SIGINT", exit.bind(void 0, true, false, 2));
|
|
61
|
+
process.once("SIGTERM", exit.bind(void 0, true, false, 15));
|
|
62
|
+
process.once("exit", exit.bind(void 0, false, true, 0));
|
|
63
|
+
process.on("message", (message) => {
|
|
64
|
+
if (message === "shutdown") {
|
|
65
|
+
exit(true, true, -128);
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
return () => {
|
|
70
|
+
if (isSynchronous) {
|
|
71
|
+
callbacks.delete(onExit);
|
|
72
|
+
} else {
|
|
73
|
+
asyncCallbacks.delete(asyncCallbackConfig);
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
__name(addHook, "addHook");
|
|
78
|
+
function asyncExitHook(onExit, options = {}) {
|
|
79
|
+
if (typeof onExit !== "function") {
|
|
80
|
+
throw new TypeError("onExit must be a function");
|
|
81
|
+
}
|
|
82
|
+
if (!(typeof options.wait === "number" && options.wait > 0)) {
|
|
83
|
+
throw new TypeError("wait must be set to a positive numeric value");
|
|
84
|
+
}
|
|
85
|
+
return addHook({
|
|
86
|
+
onExit,
|
|
87
|
+
wait: options.wait,
|
|
88
|
+
isSynchronous: false
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
__name(asyncExitHook, "asyncExitHook");
|
|
92
|
+
function gracefulExit(signal = 0) {
|
|
93
|
+
exit(true, false, -128 + signal);
|
|
94
|
+
}
|
|
95
|
+
__name(gracefulExit, "gracefulExit");
|
|
96
|
+
|
|
97
|
+
export { asyncExitHook, gracefulExit };
|
|
98
|
+
//# sourceMappingURL=chunk-LHTLO65N.js.map
|
|
99
|
+
//# sourceMappingURL=chunk-LHTLO65N.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../node_modules/.pnpm/exit-hook@4.0.0/node_modules/exit-hook/index.js"],"names":[],"mappings":"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","file":"chunk-LHTLO65N.js","sourcesContent":["import process from 'node:process';\n\nconst asyncCallbacks = new Set();\nconst callbacks = new Set();\n\nlet isCalled = false;\nlet isRegistered = false;\n\nasync function exit(shouldManuallyExit, isSynchronous, signal) {\n\tif (isCalled) {\n\t\treturn;\n\t}\n\n\tisCalled = true;\n\n\tif (asyncCallbacks.size > 0 && isSynchronous) {\n\t\tconsole.error([\n\t\t\t'SYNCHRONOUS TERMINATION NOTICE:',\n\t\t\t'When explicitly exiting the process via process.exit or via a parent process,',\n\t\t\t'asynchronous tasks in your exitHooks will not run. Either remove these tasks,',\n\t\t\t'use gracefulExit() instead of process.exit(), or ensure your parent process',\n\t\t\t'sends a SIGINT to the process running this code.',\n\t\t].join(' '));\n\t}\n\n\tconst exitCode = 128 + signal;\n\n\tconst done = (force = false) => {\n\t\tif (force === true || shouldManuallyExit === true) {\n\t\t\tprocess.exit(exitCode); // eslint-disable-line unicorn/no-process-exit\n\t\t}\n\t};\n\n\tfor (const callback of callbacks) {\n\t\tcallback(exitCode);\n\t}\n\n\tif (isSynchronous) {\n\t\tdone();\n\t\treturn;\n\t}\n\n\tconst promises = [];\n\tlet forceAfter = 0;\n\tfor (const [callback, wait] of asyncCallbacks) {\n\t\tforceAfter = Math.max(forceAfter, wait);\n\t\tpromises.push(Promise.resolve(callback(exitCode)));\n\t}\n\n\t// Force exit if we exceeded our wait value\n\tconst asyncTimer = setTimeout(() => {\n\t\tdone(true);\n\t}, forceAfter);\n\n\tawait Promise.all(promises);\n\tclearTimeout(asyncTimer);\n\tdone();\n}\n\nfunction addHook(options) {\n\tconst {onExit, wait, isSynchronous} = options;\n\tconst asyncCallbackConfig = [onExit, wait];\n\n\tif (isSynchronous) {\n\t\tcallbacks.add(onExit);\n\t} else {\n\t\tasyncCallbacks.add(asyncCallbackConfig);\n\t}\n\n\tif (!isRegistered) {\n\t\tisRegistered = true;\n\n\t\t// Exit cases that support asynchronous handling\n\t\tprocess.once('beforeExit', exit.bind(undefined, true, false, -128));\n\t\tprocess.once('SIGINT', exit.bind(undefined, true, false, 2));\n\t\tprocess.once('SIGTERM', exit.bind(undefined, true, false, 15));\n\n\t\t// Explicit exit events. Calling will force an immediate exit and run all\n\t\t// synchronous hooks. Explicit exits must not extend the node process\n\t\t// artificially. Will log errors if asynchronous calls exist.\n\t\tprocess.once('exit', exit.bind(undefined, false, true, 0));\n\n\t\t// PM2 Cluster shutdown message. Caught to support async handlers with pm2,\n\t\t// needed because explicitly calling process.exit() doesn't trigger the\n\t\t// beforeExit event, and the exit event cannot support async handlers,\n\t\t// since the event loop is never called after it.\n\t\tprocess.on('message', message => {\n\t\t\tif (message === 'shutdown') {\n\t\t\t\texit(true, true, -128);\n\t\t\t}\n\t\t});\n\t}\n\n\treturn () => {\n\t\tif (isSynchronous) {\n\t\t\tcallbacks.delete(onExit);\n\t\t} else {\n\t\t\tasyncCallbacks.delete(asyncCallbackConfig);\n\t\t}\n\t};\n}\n\nexport default function exitHook(onExit) {\n\tif (typeof onExit !== 'function') {\n\t\tthrow new TypeError('onExit must be a function');\n\t}\n\n\treturn addHook({\n\t\tonExit,\n\t\tisSynchronous: true,\n\t});\n}\n\nexport function asyncExitHook(onExit, options = {}) {\n\tif (typeof onExit !== 'function') {\n\t\tthrow new TypeError('onExit must be a function');\n\t}\n\n\tif (!(typeof options.wait === 'number' && options.wait > 0)) {\n\t\tthrow new TypeError('wait must be set to a positive numeric value');\n\t}\n\n\treturn addHook({\n\t\tonExit,\n\t\twait: options.wait,\n\t\tisSynchronous: false,\n\t});\n}\n\nexport function gracefulExit(signal = 0) {\n\texit(true, false, -128 + signal);\n}\n"]}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { ge, pD } from './chunk-DAZNZPLN.js';
|
|
2
2
|
import { define } from './chunk-33ROL4J5.js';
|
|
3
|
+
import { gracefulExit } from './chunk-LHTLO65N.js';
|
|
3
4
|
import { __name } from './chunk-XN24GZXQ.js';
|
|
4
5
|
import path from 'node:path';
|
|
5
6
|
import os from 'node:os';
|
|
@@ -129,7 +130,7 @@ var commandFn = /* @__PURE__ */ __name(async (ctx) => {
|
|
|
129
130
|
console.log("");
|
|
130
131
|
console.log("\u{1F9D9} Encrypting environment variables... \u2728");
|
|
131
132
|
const rawValue = await ge({ message: "Enter the value you want to encrypt" });
|
|
132
|
-
if (pD(rawValue))
|
|
133
|
+
if (pD(rawValue)) return gracefulExit();
|
|
133
134
|
const client = new VarlockNativeAppClient();
|
|
134
135
|
await client.initializeSocket();
|
|
135
136
|
const encryptedValue = await client.encrypt(rawValue);
|
|
@@ -138,5 +139,5 @@ var commandFn = /* @__PURE__ */ __name(async (ctx) => {
|
|
|
138
139
|
}, "commandFn");
|
|
139
140
|
|
|
140
141
|
export { commandFn, commandSpec };
|
|
141
|
-
//# sourceMappingURL=chunk-
|
|
142
|
-
//# sourceMappingURL=chunk-
|
|
142
|
+
//# sourceMappingURL=chunk-PUGFIZE3.js.map
|
|
143
|
+
//# sourceMappingURL=chunk-PUGFIZE3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/native-app-client.ts","../src/cli/commands/encrypt.command.ts"],"names":[],"mappings":"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","file":"chunk-PUGFIZE3.js","sourcesContent":["import path from 'node:path';\nimport os from 'node:os';\nimport net from 'node:net';\nimport crypto from 'node:crypto';\nimport Debug from 'debug';\n\nconst debug = Debug('varlock:native-app-client');\n\nconst MAC_APP_PATH = 'Library/Containers/dev.dmno.macapp';\nconst IPC_SOCKET_FILE_PATH = 'Data/dmno-ipc';\n\nexport class VarlockNativeAppClient {\n private socket: net.Socket;\n\n private messageQueue: Map<string, { resolve: (value: any) => void; reject: (error: Error) => void }>;\n\n private isInitialized: boolean = false;\n private isConnected: boolean;\n private socketPath: string;\n\n constructor(opts?: { socketPath?: string }) {\n this.socket = new net.Socket();\n this.messageQueue = new Map();\n this.isConnected = false;\n this.socketPath = opts?.socketPath ?? path.resolve(\n os.homedir(),\n 'Library/Containers/dev.dmno.macapp/Data/dmno-ipc',\n );\n }\n\n private generateMessageId(): string {\n // Generate a unique ID using timestamp and random bytes\n const timestamp = Date.now().toString(36); // Base36 timestamp\n const random = crypto.randomBytes(4).toString('hex'); // 8 random hex chars\n return `${timestamp}-${random}`;\n }\n\n initializeSocket() {\n this.isInitialized = true;\n\n return new Promise((resolve, _reject) => {\n this.socket.on('connect', () => {\n debug('Connected to native app');\n this.isConnected = true;\n resolve(true);\n });\n\n this.socket.on('data', (data: Buffer) => {\n debug('> received data');\n try {\n // Read message length (4 bytes, little endian)\n const messageLength = data.readUInt32LE(0);\n const messageData = data.slice(4, 4 + messageLength);\n const message = JSON.parse(messageData.toString());\n\n debug('> message', message);\n\n // Handle special messages\n if (message.type === '__disconnect') {\n this.cleanup();\n return;\n }\n\n // Handle response messages\n if (message.id && this.messageQueue.has(message.id)) {\n const { resolve: qResolve } = this.messageQueue.get(message.id)!;\n this.messageQueue.delete(message.id);\n qResolve(message.result);\n } else {\n console.log('Received message without ID:', message);\n }\n } catch (error) {\n console.error('Error processing message:', error);\n }\n });\n\n this.socket.on('error', (error) => {\n console.error('Socket error:', error);\n // TODO: if error is related to initial connection, reject the promise\n this.cleanup();\n });\n\n this.socket.on('close', () => {\n debug('socket closed');\n this.isConnected = false;\n this.cleanup();\n });\n\n this.socket.connect(this.socketPath);\n });\n }\n\n private sendMessage(message: any): Promise<any> {\n return new Promise((resolve, reject) => {\n if (!this.isConnected) {\n reject(new Error('Socket is not connected'));\n return;\n }\n\n const messageId = this.generateMessageId();\n const messageWithId = {\n ...message,\n id: messageId,\n };\n\n const jsonData = JSON.stringify(messageWithId);\n const messageBytes = new TextEncoder().encode(jsonData);\n\n // Create length prefix (4 bytes, little endian)\n const lengthBytes = new Uint8Array(4);\n const view = new DataView(lengthBytes.buffer);\n view.setUint32(0, messageBytes.length, true);\n\n // Combine length and message\n const combinedBytes = new Uint8Array(4 + messageBytes.length);\n combinedBytes.set(lengthBytes);\n combinedBytes.set(messageBytes, 4);\n\n // Store promise handlers\n this.messageQueue.set(messageId, { resolve, reject });\n\n // Send message\n this.socket.write(combinedBytes);\n });\n }\n\n public async encrypt(plaintext: string): Promise<any> {\n if (!this.isInitialized) await this.initializeSocket();\n return this.sendMessage({\n action: 'encrypt',\n payload: { plaintext },\n });\n }\n\n public async decrypt(ciphertext: string): Promise<any> {\n if (!this.isInitialized) await this.initializeSocket();\n return this.sendMessage({\n action: 'decrypt',\n payload: { ciphertext },\n });\n }\n\n public cleanup() {\n // Reject all pending messages\n for (const { reject } of this.messageQueue.values()) {\n reject(new Error('Connection closed'));\n }\n this.messageQueue.clear();\n this.socket.end();\n }\n}\n\n// // Example usage:\n// async function main() {\n// const client = new VarlockNativeAppClient();\n\n// try {\n// await client.initializeSocket();\n\n// // Send multiple messages\n// const encryptedHello = await client.encrypt('hello world');\n// console.log('Encrypted data:', encryptedHello);\n\n// const decryptedHello = await client.decrypt(encryptedHello);\n// console.log('Decrypted data:', decryptedHello);\n\n// // Keep the process running\n// process.on('SIGINT', () => {\n// client.cleanup();\n// process.exit(0);\n// });\n// } catch (error) {\n// console.error('Error:', error);\n// process.exit(1);\n// }\n// }\n\n// main();\n","\nimport { define } from 'gunshi';\nimport { isCancel, password } from '@clack/prompts';\n\nimport { VarlockNativeAppClient } from '../../lib/native-app-client';\nimport { type TypedGunshiCommandFn } from '../helpers/gunshi-type-utils';\nimport { gracefulExit } from 'exit-hook';\n\nexport const commandSpec = define({\n name: 'encrypt',\n description: 'Encrypt environment variables in your .env file',\n args: {},\n});\n\nexport const commandFn: TypedGunshiCommandFn<typeof commandSpec> = async (ctx) => {\n console.log('');\n console.log('🧙 Encrypting environment variables... ✨');\n // intro('🧙 Encrypting environment variables... ✨');\n\n const rawValue = await password({ message: 'Enter the value you want to encrypt' });\n if (isCancel(rawValue)) return gracefulExit();\n\n const client = new VarlockNativeAppClient();\n await client.initializeSocket();\n const encryptedValue = await client.encrypt(rawValue);\n\n console.log('Copy this into your .env.local file and rename the key appropriately:\\n');\n console.log(`SOME_SENSITIVE_KEY=varlock(\"${encryptedValue}\")`);\n\n // const envGraph = await loadEnvGraph();\n // await envGraph.resolveEnvValues();\n // const resolvedEnv = envGraph.getResolvedEnvObject();\n\n // TODO: need to reimplement using the new parser\n\n // const client = new VarlockNativeAppClient();\n // await client.initializeSocket();\n\n // for (const envFile of loadedEnv.files) {\n // let changeCount = 0;\n // for (const itemKey in envFile.items) {\n // const item = envFile.items[itemKey];\n // if (item.decorators?.sensitive) {\n // if ('value' in item && item.value) {\n // console.log('Encrypting', itemKey, envFile.path);\n // const encryptedValue = await client.encrypt(item.value);\n // delete item.value;\n // (item as any).resolverName = 'varlock';\n // (item as any).resolverArgs = [encryptedValue];\n // changeCount++;\n // }\n // } else {\n // if ('resolverName' in item && item.resolverName === 'varlock') {\n // console.log('Decrypting', itemKey, envFile.path);\n // const encryptedValue = item.resolverArgs[0];\n // if (typeof encryptedValue !== 'string') {\n // throw new Error('Expected encrypted value to be a string');\n // }\n // const decryptedValue = await client.decrypt(encryptedValue);\n // (item as any).value = decryptedValue;\n // delete (item as any).resolverName;\n // delete (item as any).resolverArgs;\n // changeCount++;\n // }\n // }\n // }\n\n // const updatedEnvFileStr = dumpDotEnvContents(envFile.parsedContents);\n // await fs.writeFile(envFile.path, updatedEnvFileStr);\n\n // log.success(`Updated ${changeCount} items in ${envFile.path}`);\n // }\n\n // console.log(loadedEnv);\n\n // const unencryptedKeys: Array<string> = [];\n // parsedEnv.forEach((item) => {\n // if (item.type !== 'item') return;\n // if (item.key.startsWith('_VARLOCK_')) return;\n // if (!('value' in item) || !item.value) return;\n\n // unencryptedKeys.push(item.key);\n // });\n\n // if (unencryptedKeys.length === 0) {\n // console.log('No items to encrypt. Exiting...');\n // return;\n // }\n\n // const selectedKeys = await multiselect({\n // message: 'Select env item(s) to encrypt 🔏',\n // options: unencryptedKeys.map((key) => ({\n // value: key,\n // label: key,\n // })),\n // initialValues: unencryptedKeys,\n // required: false,\n // });\n\n // if (isCancel(selectedKeys) || !selectedKeys.length) {\n // console.log('No items selected. Exiting...');\n // return;\n // }\n\n // for (const item of parsedEnv) {\n // if (item.type === 'item' && selectedKeys.includes(item.key)) {\n // if (!('value' in item) || !item.value) throw new Error(`Item ${item.key} has no value`);\n // const encryptedValue = await client.encrypt(item.value);\n // delete item.value;\n // (item as any).resolverName = 'varlock';\n // (item as any).resolverArgs = [encryptedValue];\n // }\n // }\n\n // // write the updated env file\n\n // const updatedEnvFileStr = dumpDotEnvContents(parsedEnv);\n // await fs.writeFile(envFilePath, updatedEnvFileStr);\n\n // outro(`Encrypted ${selectedKeys.length} items!`);\n};\n\n"]}
|
|
@@ -11,5 +11,5 @@ var commandFn = /* @__PURE__ */ __name(async (ctx) => {
|
|
|
11
11
|
}, "commandFn");
|
|
12
12
|
|
|
13
13
|
export { commandFn, commandSpec };
|
|
14
|
-
//# sourceMappingURL=chunk-
|
|
15
|
-
//# sourceMappingURL=chunk-
|
|
14
|
+
//# sourceMappingURL=chunk-RZT65DRA.js.map
|
|
15
|
+
//# sourceMappingURL=chunk-RZT65DRA.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/commands/help.command.ts"],"names":[],"mappings":";;;;AAGO,IAAM,cAAc,MAAA,CAAO;AAAA,EAChC,IAAA,EAAM,MAAA;AAAA,EACN,WAAA,EAAa,4BAAA;AAAA,EACb,MAAM;AACR,CAAC;AAEM,IAAM,SAAA,iCAA6D,GAAA,KAAQ;AAElF,CAAA,EAFmE,WAAA","file":"chunk-RZT65DRA.js","sourcesContent":["import { define } from 'gunshi';\nimport { type TypedGunshiCommandFn } from '../helpers/gunshi-type-utils';\n\nexport const commandSpec = define({\n name: 'help',\n description: 'Show help info for varlock',\n args: {},\n});\n\nexport const commandFn: TypedGunshiCommandFn<typeof commandSpec> = async (ctx) => {\n // no-op - we'll trigger help from main entry point\n};\n"]}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { CliExitError, fmt } from './chunk-WGUFO7CT.js';
|
|
2
|
+
import { define } from './chunk-33ROL4J5.js';
|
|
3
|
+
import { gracefulExit } from './chunk-LHTLO65N.js';
|
|
4
|
+
import { __name } from './chunk-XN24GZXQ.js';
|
|
5
|
+
import { homedir } from 'node:os';
|
|
6
|
+
import { join } from 'node:path';
|
|
7
|
+
import { mkdir, readFile, writeFile } from 'node:fs/promises';
|
|
8
|
+
import { existsSync } from 'node:fs';
|
|
9
|
+
|
|
10
|
+
var commandSpec = define({
|
|
11
|
+
name: "telemetry",
|
|
12
|
+
description: "Enable/disable anonymous usage analytics",
|
|
13
|
+
args: {
|
|
14
|
+
mode: {
|
|
15
|
+
type: "positional",
|
|
16
|
+
description: '"enable" or "disable"'
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
var commandFn = /* @__PURE__ */ __name(async (ctx) => {
|
|
21
|
+
if (!["enable", "disable"].includes(ctx.values.mode)) {
|
|
22
|
+
throw new CliExitError('additional arg must be "enable" or "disable"', {
|
|
23
|
+
forceExit: true
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
const configDir = join(homedir(), ".varlock");
|
|
27
|
+
const configPath = join(configDir, "config.json");
|
|
28
|
+
try {
|
|
29
|
+
if (!existsSync(configDir)) {
|
|
30
|
+
await mkdir(configDir, { recursive: true });
|
|
31
|
+
}
|
|
32
|
+
let config = {};
|
|
33
|
+
if (existsSync(configPath)) {
|
|
34
|
+
const configContent = await readFile(configPath, "utf-8");
|
|
35
|
+
config = JSON.parse(configContent);
|
|
36
|
+
}
|
|
37
|
+
if (ctx.values.mode === "disable") config.telemetryDisabled = true;
|
|
38
|
+
else delete config.telemetryDisabled;
|
|
39
|
+
await writeFile(configPath, JSON.stringify(config, null, 2));
|
|
40
|
+
if (ctx.values.mode) {
|
|
41
|
+
console.log("\u2705 Successfully enabled anonymous usage analytics");
|
|
42
|
+
} else {
|
|
43
|
+
console.log("\u2705 Successfully disabled anonymous usage analytics");
|
|
44
|
+
}
|
|
45
|
+
console.log("> saved in:", fmt.filePath(configPath));
|
|
46
|
+
} catch (error) {
|
|
47
|
+
console.error("Failed to opt out of analytics:", error);
|
|
48
|
+
return gracefulExit(1);
|
|
49
|
+
}
|
|
50
|
+
}, "commandFn");
|
|
51
|
+
|
|
52
|
+
export { commandFn, commandSpec };
|
|
53
|
+
//# sourceMappingURL=chunk-USSBWRQF.js.map
|
|
54
|
+
//# sourceMappingURL=chunk-USSBWRQF.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/commands/telemetry.command.ts"],"names":[],"mappings":";;;;;;;;;AAWO,IAAM,cAAc,MAAA,CAAO;AAAA,EAChC,IAAA,EAAM,WAAA;AAAA,EACN,WAAA,EAAa,0CAAA;AAAA,EACb,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM;AAAA,MACJ,IAAA,EAAM,YAAA;AAAA,MACN,WAAA,EAAa;AAAA;AACf;AAEJ,CAAC;AAEM,IAAM,SAAA,iCAA6D,GAAA,KAAQ;AAEhF,EAAA,IAAI,CAAC,CAAC,QAAA,EAAU,SAAS,EAAE,QAAA,CAAS,GAAA,CAAI,MAAA,CAAO,IAAI,CAAA,EAAG;AACpD,IAAA,MAAM,IAAI,aAAa,8CAAA,EAAgD;AAAA,MACrE,SAAA,EAAW;AAAA,KACZ,CAAA;AAAA,EACH;AAEA,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,OAAA,EAAQ,EAAG,UAAU,CAAA;AAC5C,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,SAAA,EAAW,aAAa,CAAA;AAEhD,EAAA,IAAI;AAEF,IAAA,IAAI,CAAC,UAAA,CAAW,SAAS,CAAA,EAAG;AAC1B,MAAA,MAAM,KAAA,CAAM,SAAA,EAAW,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA,IAC5C;AAGA,IAAA,IAAI,SAA8B,EAAC;AACnC,IAAA,IAAI,UAAA,CAAW,UAAU,CAAA,EAAG;AAC1B,MAAA,MAAM,aAAA,GAAgB,MAAM,QAAA,CAAS,UAAA,EAAY,OAAO,CAAA;AACxD,MAAA,MAAA,GAAS,IAAA,CAAK,MAAM,aAAa,CAAA;AAAA,IACnC;AAGA,IAAA,IAAI,GAAA,CAAI,MAAA,CAAO,IAAA,KAAS,SAAA,SAAkB,iBAAA,GAAoB,IAAA;AAAA,gBAClD,MAAA,CAAO,iBAAA;AACnB,IAAA,MAAM,UAAU,UAAA,EAAY,IAAA,CAAK,UAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAC,CAAA;AAE3D,IAAA,IAAI,GAAA,CAAI,OAAO,IAAA,EAAM;AACnB,MAAA,OAAA,CAAQ,IAAI,uDAAkD,CAAA;AAAA,IAChE,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,IAAI,wDAAmD,CAAA;AAAA,IACjE;AACA,IAAA,OAAA,CAAQ,GAAA,CAAI,aAAA,EAAe,GAAA,CAAI,QAAA,CAAS,UAAU,CAAC,CAAA;AAAA,EACrD,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,mCAAmC,KAAK,CAAA;AACtD,IAAA,OAAO,aAAa,CAAC,CAAA;AAAA,EACvB;AACF,CAAA,EAvCmE,WAAA","file":"chunk-USSBWRQF.js","sourcesContent":["import { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport { mkdir, writeFile, readFile } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport { define } from 'gunshi';\nimport { type TypedGunshiCommandFn } from '../helpers/gunshi-type-utils';\nimport { gracefulExit } from 'exit-hook';\nimport { fmt } from '../helpers/pretty-format';\nimport { CliExitError } from '../helpers/exit-error';\n\n\nexport const commandSpec = define({\n name: 'telemetry',\n description: 'Enable/disable anonymous usage analytics',\n args: {\n mode: {\n type: 'positional',\n description: '\"enable\" or \"disable\"',\n },\n },\n});\n\nexport const commandFn: TypedGunshiCommandFn<typeof commandSpec> = async (ctx) => {\n // TODO: remove this when gunshi supports types/validation for positional args\n if (!['enable', 'disable'].includes(ctx.values.mode)) {\n throw new CliExitError('additional arg must be \"enable\" or \"disable\"', {\n forceExit: true,\n });\n }\n\n const configDir = join(homedir(), '.varlock');\n const configPath = join(configDir, 'config.json');\n\n try {\n // Create .varlock directory if it doesn't exist\n if (!existsSync(configDir)) {\n await mkdir(configDir, { recursive: true });\n }\n\n // Read existing config if it exists\n let config: Record<string, any> = {};\n if (existsSync(configPath)) {\n const configContent = await readFile(configPath, 'utf-8');\n config = JSON.parse(configContent);\n }\n\n // update config `telemetryDisabled` setting\n if (ctx.values.mode === 'disable') config.telemetryDisabled = true;\n else delete config.telemetryDisabled;\n await writeFile(configPath, JSON.stringify(config, null, 2));\n\n if (ctx.values.mode) {\n console.log('✅ Successfully enabled anonymous usage analytics');\n } else {\n console.log('✅ Successfully disabled anonymous usage analytics');\n }\n console.log('> saved in:', fmt.filePath(configPath));\n } catch (error) {\n console.error('Failed to opt out of analytics:', error);\n return gracefulExit(1);\n }\n};\n"]}
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
import { ansis_default, joinAndCompact } from './chunk-5URKU5HG.js';
|
|
2
|
+
import { my_dash_default } from './chunk-INMYFAWB.js';
|
|
3
|
+
import { __name } from './chunk-XN24GZXQ.js';
|
|
4
|
+
import fs, { accessSync, existsSync } from 'node:fs';
|
|
5
|
+
import { access } from 'node:fs/promises';
|
|
6
|
+
import path from 'node:path';
|
|
7
|
+
import Debug from 'debug';
|
|
8
|
+
import { execSync } from 'node:child_process';
|
|
9
|
+
|
|
10
|
+
// src/cli/helpers/exit-error.ts
|
|
11
|
+
var CliExitError = class extends Error {
|
|
12
|
+
constructor(message, more) {
|
|
13
|
+
super(message);
|
|
14
|
+
this.more = more;
|
|
15
|
+
}
|
|
16
|
+
static {
|
|
17
|
+
__name(this, "CliExitError");
|
|
18
|
+
}
|
|
19
|
+
get forceExit() {
|
|
20
|
+
return !!this.more?.forceExit;
|
|
21
|
+
}
|
|
22
|
+
getFormattedOutput() {
|
|
23
|
+
let msg = `
|
|
24
|
+
\u{1F4A5} ${ansis_default.red(this.message)} \u{1F4A5}
|
|
25
|
+
`;
|
|
26
|
+
if (this.more?.details) {
|
|
27
|
+
msg += joinAndCompact(my_dash_default.castArray(this.more?.details), "\n");
|
|
28
|
+
}
|
|
29
|
+
if (this.more?.suggestion) {
|
|
30
|
+
msg += joinAndCompact(my_dash_default.castArray(this.more?.suggestion), "\n");
|
|
31
|
+
}
|
|
32
|
+
msg += "\n";
|
|
33
|
+
return msg;
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
async function pathExists(p) {
|
|
37
|
+
try {
|
|
38
|
+
await access(p);
|
|
39
|
+
return true;
|
|
40
|
+
} catch {
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
__name(pathExists, "pathExists");
|
|
45
|
+
function pathExistsSync(p) {
|
|
46
|
+
try {
|
|
47
|
+
accessSync(p);
|
|
48
|
+
return true;
|
|
49
|
+
} catch {
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
__name(pathExistsSync, "pathExistsSync");
|
|
54
|
+
var debug = Debug("varlock:js-package-manager-utils");
|
|
55
|
+
var JS_PACKAGE_MANAGERS = Object.freeze({
|
|
56
|
+
npm: {
|
|
57
|
+
name: "npm",
|
|
58
|
+
lockfile: "package-lock.json",
|
|
59
|
+
add: "npm install",
|
|
60
|
+
// add also works
|
|
61
|
+
exec: "npm exec --",
|
|
62
|
+
dlx: "npx"
|
|
63
|
+
},
|
|
64
|
+
pnpm: {
|
|
65
|
+
name: "pnpm",
|
|
66
|
+
lockfile: "pnpm-lock.yaml",
|
|
67
|
+
add: "pnpm add",
|
|
68
|
+
exec: "pnpm exec",
|
|
69
|
+
dlx: "pnpm dlx"
|
|
70
|
+
},
|
|
71
|
+
yarn: {
|
|
72
|
+
name: "yarn",
|
|
73
|
+
lockfile: "yarn.lock",
|
|
74
|
+
add: "yarn add",
|
|
75
|
+
exec: "yarn exec --",
|
|
76
|
+
dlx: "yarn dlx"
|
|
77
|
+
},
|
|
78
|
+
bun: {
|
|
79
|
+
name: "bun",
|
|
80
|
+
lockfile: "bun.lockb",
|
|
81
|
+
add: "bun add",
|
|
82
|
+
exec: "bun run",
|
|
83
|
+
dlx: "bunx"
|
|
84
|
+
},
|
|
85
|
+
deno: {
|
|
86
|
+
//! deno not fully supported yet
|
|
87
|
+
name: "deno",
|
|
88
|
+
lockfile: "deno.lock",
|
|
89
|
+
add: "deno add",
|
|
90
|
+
// TODO: don't think these are quite right...
|
|
91
|
+
exec: "deno run",
|
|
92
|
+
dlx: "deno run"
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
function detectJsPackageManager(opts) {
|
|
96
|
+
debug("Detecting js package manager");
|
|
97
|
+
let cwd = opts?.cwd || process.cwd();
|
|
98
|
+
do {
|
|
99
|
+
debug(`> scanning ${cwd}`);
|
|
100
|
+
let pm;
|
|
101
|
+
let detectedPm;
|
|
102
|
+
for (pm in JS_PACKAGE_MANAGERS) {
|
|
103
|
+
const lockFilePath = path.join(
|
|
104
|
+
cwd,
|
|
105
|
+
JS_PACKAGE_MANAGERS[pm].lockfile
|
|
106
|
+
);
|
|
107
|
+
if (pathExistsSync(lockFilePath)) {
|
|
108
|
+
if (detectedPm) {
|
|
109
|
+
throw new CliExitError("Found multiple js package manager lockfiles", {
|
|
110
|
+
details: `${JS_PACKAGE_MANAGERS[pm].lockfile} and ${JS_PACKAGE_MANAGERS[detectedPm].lockfile}`,
|
|
111
|
+
forceExit: true
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
debug(`> found ${JS_PACKAGE_MANAGERS[pm].lockfile}`);
|
|
115
|
+
detectedPm = pm;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
if (detectedPm) return JS_PACKAGE_MANAGERS[detectedPm];
|
|
119
|
+
cwd = path.join(cwd, "..");
|
|
120
|
+
if (opts?.workspaceRootPath) {
|
|
121
|
+
if (opts.workspaceRootPath === cwd) {
|
|
122
|
+
debug("> found workspace root");
|
|
123
|
+
break;
|
|
124
|
+
}
|
|
125
|
+
} else {
|
|
126
|
+
if (pathExistsSync(path.join(cwd, ".git"))) {
|
|
127
|
+
debug("> found git root");
|
|
128
|
+
break;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
} while (cwd && cwd !== "." && cwd !== "/");
|
|
132
|
+
if (process.env.npm_config_user_agent) {
|
|
133
|
+
const pmFromAgent = process.env.npm_config_user_agent.split("/")[0];
|
|
134
|
+
if (Object.keys(JS_PACKAGE_MANAGERS).includes(pmFromAgent)) {
|
|
135
|
+
debug(`> found ${pmFromAgent} using npm_config_user_agent`);
|
|
136
|
+
return JS_PACKAGE_MANAGERS[pmFromAgent];
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
if (opts?.exitIfNotFound) {
|
|
140
|
+
throw new CliExitError("Unable to find detect your JavaScript package manager!", {
|
|
141
|
+
suggestion: "We look for lock files (ex: package-lock.json) so you may just need to run a dependency install (ie `npm install`)",
|
|
142
|
+
forceExit: true
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
__name(detectJsPackageManager, "detectJsPackageManager");
|
|
147
|
+
function installJsDependency(opts) {
|
|
148
|
+
const packageJsonPath = path.join(opts.packagePath || process.cwd(), "package.json");
|
|
149
|
+
if (!existsSync(packageJsonPath)) return false;
|
|
150
|
+
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, "utf8"));
|
|
151
|
+
if (packageJson.dependencies?.varlock) return false;
|
|
152
|
+
execSync([
|
|
153
|
+
// move to the correct directory if needed
|
|
154
|
+
opts.packagePath && `cd ${opts.packagePath} &&`,
|
|
155
|
+
// `add` works in all of them
|
|
156
|
+
`${opts.packageManager} add ${opts.packageName}`,
|
|
157
|
+
// tells pnpm to either install in the workspace root explicitly
|
|
158
|
+
// or to not check if we are the in the root
|
|
159
|
+
opts.packageManager === "pnpm" && (opts.isMonoRepoRoot ? "-w" : "--ignore-workspace-root-check")
|
|
160
|
+
].filter(Boolean).join(" "));
|
|
161
|
+
return true;
|
|
162
|
+
}
|
|
163
|
+
__name(installJsDependency, "installJsDependency");
|
|
164
|
+
|
|
165
|
+
// src/cli/helpers/pretty-format.ts
|
|
166
|
+
var fmt = {
|
|
167
|
+
decorator: /* @__PURE__ */ __name((s) => ansis_default.magenta(s), "decorator"),
|
|
168
|
+
filePath: /* @__PURE__ */ __name((s) => `\u{1F4C2} ${ansis_default.cyan.italic(s)}`, "filePath"),
|
|
169
|
+
fileName: /* @__PURE__ */ __name((s) => `${ansis_default.cyan.italic(s)}`, "fileName"),
|
|
170
|
+
command: /* @__PURE__ */ __name((s, opts) => {
|
|
171
|
+
let jsPackageManager;
|
|
172
|
+
if (opts?.jsPackageManager === true) {
|
|
173
|
+
jsPackageManager = detectJsPackageManager();
|
|
174
|
+
} else if (opts?.jsPackageManager) {
|
|
175
|
+
jsPackageManager = opts.jsPackageManager;
|
|
176
|
+
}
|
|
177
|
+
if (jsPackageManager) {
|
|
178
|
+
s = `${jsPackageManager.exec} ${s}`;
|
|
179
|
+
}
|
|
180
|
+
return ansis_default.green.italic(s);
|
|
181
|
+
}, "command"),
|
|
182
|
+
packageName: /* @__PURE__ */ __name((s) => ansis_default.green.italic(s), "packageName")
|
|
183
|
+
};
|
|
184
|
+
var logLines = /* @__PURE__ */ __name((lines) => {
|
|
185
|
+
for (const line of lines) {
|
|
186
|
+
if (!line && line !== "") continue;
|
|
187
|
+
console.log(line);
|
|
188
|
+
}
|
|
189
|
+
}, "logLines");
|
|
190
|
+
|
|
191
|
+
export { CliExitError, detectJsPackageManager, fmt, installJsDependency, logLines, pathExists };
|
|
192
|
+
//# sourceMappingURL=chunk-WGUFO7CT.js.map
|
|
193
|
+
//# sourceMappingURL=chunk-WGUFO7CT.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/helpers/exit-error.ts","../../utils/src/fs-utils.ts","../src/cli/helpers/js-package-manager-utils.ts","../src/cli/helpers/pretty-format.ts"],"names":[],"mappings":"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","file":"chunk-WGUFO7CT.js","sourcesContent":["import ansis from 'ansis';\nimport _ from '@env-spec/utils/my-dash';\nimport { joinAndCompact } from '../../lib/formatting';\n\nexport class CliExitError extends Error {\n constructor(\n message: string,\n private more?: {\n details?: string | Array<string>,\n suggestion?: string | Array<string>,\n /** always triggers a full exit, even in watch mode - useful if problem is irrecoverable */\n forceExit?: boolean,\n },\n ) {\n super(message);\n }\n\n get forceExit() { return !!this.more?.forceExit; }\n\n getFormattedOutput() {\n let msg = `\\n💥 ${ansis.red(this.message)} 💥\\n`;\n\n if (this.more?.details) {\n msg += joinAndCompact(_.castArray(this.more?.details), '\\n');\n }\n\n if (this.more?.suggestion) {\n msg += joinAndCompact(_.castArray(this.more?.suggestion), '\\n');\n }\n\n msg += '\\n';\n return msg;\n }\n}\n","import { accessSync } from 'node:fs';\nimport { access } from 'node:fs/promises';\n\nexport async function pathExists(p: string) {\n try {\n await access(p);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function pathExistsSync(p:string) {\n try {\n accessSync(p);\n return true;\n } catch {\n return false;\n }\n}\n","import path from 'node:path';\nimport fs, { existsSync } from 'node:fs';\nimport { pathExistsSync } from '@env-spec/utils/fs-utils';\nimport Debug from 'debug';\n\nimport { CliExitError } from './exit-error';\nimport { execSync } from 'node:child_process';\n\nconst debug = Debug('varlock:js-package-manager-utils');\n\nexport type JsPackageManager = 'npm' | 'pnpm' | 'yarn' | 'bun' | 'deno';\n\nexport type JsPackageManagerMeta = {\n name: JsPackageManager;\n lockfile: string;\n add: string;\n exec: string;\n dlx: string;\n};\n\nexport const JS_PACKAGE_MANAGERS: Record<JsPackageManager, JsPackageManagerMeta> = Object.freeze({\n npm: {\n name: 'npm',\n lockfile: 'package-lock.json',\n add: 'npm install', // add also works\n exec: 'npm exec --',\n dlx: 'npx',\n },\n pnpm: {\n name: 'pnpm',\n lockfile: 'pnpm-lock.yaml',\n add: 'pnpm add',\n exec: 'pnpm exec',\n dlx: 'pnpm dlx',\n },\n yarn: {\n name: 'yarn',\n lockfile: 'yarn.lock',\n add: 'yarn add',\n exec: 'yarn exec --',\n dlx: 'yarn dlx',\n },\n bun: {\n name: 'bun',\n lockfile: 'bun.lockb',\n add: 'bun add',\n exec: 'bun run',\n dlx: 'bunx',\n },\n deno: { //! deno not fully supported yet\n name: 'deno',\n lockfile: 'deno.lock',\n add: 'deno add',\n // TODO: don't think these are quite right...\n exec: 'deno run',\n dlx: 'deno run',\n },\n});\n\n/**\n * detect js package manager\n *\n * currently go up the folder tree looking for lockfiles (ex: package-lock.json, pnpm-lock.yaml)\n * if nothing found, we'll look at process.env.npm_config_user_agent\n * */\nexport function detectJsPackageManager(opts?: {\n cwd?: string,\n workspaceRootPath?: string,\n exitIfNotFound?: boolean,\n}) {\n debug('Detecting js package manager');\n let cwd = opts?.cwd || process.cwd();\n do {\n debug(`> scanning ${cwd}`);\n let pm: JsPackageManager;\n let detectedPm: JsPackageManager | undefined;\n for (pm in JS_PACKAGE_MANAGERS) {\n const lockFilePath = path.join(\n cwd,\n JS_PACKAGE_MANAGERS[pm].lockfile,\n );\n\n if (pathExistsSync(lockFilePath)) {\n // if we find 2 lockfiles at the same level, we throw an error\n if (detectedPm) {\n throw new CliExitError('Found multiple js package manager lockfiles', {\n details: `${JS_PACKAGE_MANAGERS[pm].lockfile} and ${JS_PACKAGE_MANAGERS[detectedPm].lockfile}`,\n forceExit: true,\n });\n }\n debug(`> found ${JS_PACKAGE_MANAGERS[pm].lockfile}`);\n detectedPm = pm;\n }\n }\n if (detectedPm) return JS_PACKAGE_MANAGERS[detectedPm];\n\n cwd = path.join(cwd, '..');\n if (opts?.workspaceRootPath) {\n if (opts.workspaceRootPath === cwd) {\n debug('> found workspace root');\n break;\n }\n } else {\n // if we don't have a workspace root path, we'll break if we hit the git repo root\n if (pathExistsSync(path.join(cwd, '.git'))) {\n debug('> found git root');\n break;\n }\n }\n } while (cwd && cwd !== '.' && cwd !== '/');\n\n // if we did not find a lockfile, we'll look at env vars for other hints\n if (process.env.npm_config_user_agent) {\n const pmFromAgent = process.env.npm_config_user_agent.split('/')[0];\n if (Object.keys(JS_PACKAGE_MANAGERS).includes(pmFromAgent)) {\n debug(`> found ${pmFromAgent} using npm_config_user_agent`);\n return JS_PACKAGE_MANAGERS[pmFromAgent as JsPackageManager];\n }\n }\n\n if (opts?.exitIfNotFound) {\n // show some hopefully useful error messaging if we hit the root folder without finding anything\n throw new CliExitError('Unable to find detect your JavaScript package manager!', {\n suggestion: 'We look for lock files (ex: package-lock.json) so you may just need to run a dependency install (ie `npm install`)',\n forceExit: true,\n });\n }\n}\n\n\n\n\nexport function installJsDependency(opts: {\n packageName: string,\n packageManager: JsPackageManager,\n packagePath?: string,\n isMonoRepoRoot?: boolean,\n}) {\n const packageJsonPath = path.join(opts.packagePath || process.cwd(), 'package.json');\n\n // for now, we'll just bail if we dont see a package.json\n if (!existsSync(packageJsonPath)) return false;\n\n const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));\n // bail if already installed\n if (packageJson.dependencies?.varlock) return false;\n\n // TODO: might want to check first if it's already installed?\n execSync([\n // move to the correct directory if needed\n opts.packagePath && `cd ${opts.packagePath} &&`,\n // `add` works in all of them\n `${opts.packageManager} add ${opts.packageName}`,\n // tells pnpm to either install in the workspace root explicitly\n // or to not check if we are the in the root\n opts.packageManager === 'pnpm' && (opts.isMonoRepoRoot ? '-w' : '--ignore-workspace-root-check'),\n ].filter(Boolean).join(' '));\n\n return true;\n}\n\n","import ansis from 'ansis';\nimport { detectJsPackageManager, JsPackageManagerMeta } from './js-package-manager-utils';\n\n\nexport const fmt = {\n decorator: (s: string) => ansis.magenta(s),\n filePath: (s: string) => `📂 ${ansis.cyan.italic(s)}`,\n fileName: (s: string) => `${ansis.cyan.italic(s)}`,\n command: (s: string, opts?: { jsPackageManager?: JsPackageManagerMeta | true }) => {\n let jsPackageManager: JsPackageManagerMeta | undefined;\n if (opts?.jsPackageManager === true) {\n jsPackageManager = detectJsPackageManager();\n } else if (opts?.jsPackageManager) {\n jsPackageManager = opts.jsPackageManager;\n }\n if (jsPackageManager) {\n s = `${jsPackageManager.exec} ${s}`;\n }\n return ansis.green.italic(s);\n },\n packageName: (s: string) => ansis.green.italic(s),\n};\n\nexport const logLines = (lines: Array<string | false | undefined>) => {\n for (const line of lines) {\n // skip false, null, undefined, but not empty strings\n if (!line && line !== '') continue;\n console.log(line);\n }\n};\n"]}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import { debug } from './chunk-
|
|
2
|
-
import { varlockSettings, scanForLeaks, redactSensitiveConfig } from './chunk-DHFEY3C4.js';
|
|
1
|
+
import { debug, varlockSettings, scanForLeaks, redactSensitiveConfig } from './chunk-46HUIBFX.js';
|
|
3
2
|
import { __name } from './chunk-XN24GZXQ.js';
|
|
4
3
|
import zlib from 'node:zlib';
|
|
5
4
|
import { ServerResponse } from 'node:http';
|
|
@@ -89,5 +88,5 @@ function patchGlobalServerResponse(opts) {
|
|
|
89
88
|
__name(patchGlobalServerResponse, "patchGlobalServerResponse");
|
|
90
89
|
|
|
91
90
|
export { patchGlobalServerResponse };
|
|
92
|
-
//# sourceMappingURL=chunk-
|
|
93
|
-
//# sourceMappingURL=chunk-
|
|
91
|
+
//# sourceMappingURL=chunk-X3HJMANF.js.map
|
|
92
|
+
//# sourceMappingURL=chunk-X3HJMANF.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/runtime/patch-server-response.ts"],"names":[],"mappings":"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","file":"chunk-X3HJMANF.js","sourcesContent":["/*\n This patches the global ServerResponse object to scan for secret leaks - currently used for next.js and remix\n*/\n\nimport zlib from 'node:zlib';\nimport { ServerResponse } from 'node:http';\nimport { redactSensitiveConfig, scanForLeaks, varlockSettings } from './env';\nimport { debug } from './lib/debug';\n\n// NOTE - previously was using a symbol but got weird because of multiple builds and contexts...\nconst patchedKey = '_patchedByVarlock';\nexport function patchGlobalServerResponse(opts?: {\n ignoreUrlPatterns?: Array<RegExp>,\n redactInsteadOfThrow?: boolean,\n}) {\n debug('⚡️ PATCHING global ServerResponse');\n if (Object.getOwnPropertyDescriptor(ServerResponse.prototype, patchedKey)) {\n debug('> already patched');\n return;\n }\n if (varlockSettings.preventLeaks === false) {\n debug('> disabled by settings');\n return;\n }\n\n Object.defineProperty(ServerResponse.prototype, patchedKey, { value: true });\n\n const serverResponseWrite = ServerResponse.prototype.write;\n\n // @ts-ignore\n ServerResponse.prototype.write = function varlockPatchedServerResponseWrite(...args) {\n // console.log('⚡️ patched ServerResponse.write');\n // TODO: do we want to filter out some requests here? maybe based on the file type?\n\n const rawChunk = args[0];\n\n // for now, we only scan rendered html... may need to change this though for server components?\n // so we bail if it looks like this response does not contain html\n const contentType = this.getHeader('content-type')?.toString() || '';\n // console.log('patched ServerResponse.write', contentType);\n let runScan = (\n contentType.startsWith('text/')\n || contentType.startsWith('application/json')\n // || contentType.startsWith('application/javascript')\n );\n\n const reqUrl = (this as any).req.url;\n // console.log('> scan ServerResponse.write', contentType, reqUrl);\n if (runScan && reqUrl && opts?.ignoreUrlPatterns?.some((pattern) => pattern.test(reqUrl))) {\n runScan = false;\n }\n\n // we want to run the scanner on text/html and text/x-component (server actions)\n // TODO: anything else?\n if (!runScan) {\n // @ts-ignore\n return serverResponseWrite.apply(this, args);\n }\n\n // have to deal with compressed data, which is awkward but possible\n const compressionType = this.getHeader('Content-Encoding');\n let chunkStr;\n let chunkType: 'string' | 'encoded' | 'gzip' | null = null;\n if (typeof rawChunk === 'string') {\n chunkType = 'string';\n chunkStr = rawChunk;\n } else if (!compressionType) {\n chunkType = 'encoded';\n const decoder = new TextDecoder();\n chunkStr = decoder.decode(rawChunk);\n } else if (compressionType === 'gzip') {\n chunkType = 'gzip';\n // first chunk of data contains only compression headers\n if (!(this as any)._zlibChunks) {\n // (this as any)._zlibHeadersChunk = rawChunk;\n (this as any)._zlibChunks = [rawChunk];\n } else {\n // TODO: figure out how we can unzip one chunk at a time instead of storing everything\n (this as any)._zlibChunks?.push(rawChunk);\n try {\n const unzippedChunk = zlib.unzipSync(Buffer.concat((this as any)._zlibChunks || []), {\n flush: zlib.constants.Z_SYNC_FLUSH,\n finishFlush: zlib.constants.Z_SYNC_FLUSH,\n });\n const fullUnzippedData = unzippedChunk.toString('utf-8');\n chunkStr = fullUnzippedData.substring((this as any)._lastChunkEndIndex || 0);\n (this as any)._lastChunkEndIndex = fullUnzippedData.length;\n } catch (err) {\n // console.log('error unzipping chunk', err);\n }\n }\n }\n // TODO: we may want to support other compression schemes? but currently only used in nextjs which is using gzip\n if (chunkStr) {\n // console.log('scanning!', chunkStr.substring(0, 1000));\n\n\n try {\n scanForLeaks(chunkStr, { method: 'patched ServerResponse.write', file: (this as any).req.url });\n } catch (err) {\n // console.log('found secret in chunk', chunkType, chunkStr);\n // console.log(this)\n if (opts?.redactInsteadOfThrow) {\n chunkStr = redactSensitiveConfig(chunkStr);\n if (chunkType === 'string') {\n args[0] = chunkStr;\n } else if (chunkType === 'encoded') {\n const encoder = new TextEncoder();\n args[0] = encoder.encode(chunkStr);\n } else if (chunkType === 'gzip') {\n // currently unable to scrub gzip chunks\n // this works sometimes, but othertimes causes decoding error\n // we'll need to pass through chunks from a new gzip stream, because we don't have access to the underlying one\n // args[0] = zlib.gzipSync(chunkStr, {\n // flush: zlib.constants.Z_SYNC_FLUSH,\n // finishFlush: zlib.constants.Z_SYNC_FLUSH,\n // });\n } else {\n throw new Error(`unable to scrub - unknown chunk type ${chunkType}`);\n }\n } else {\n throw err;\n }\n }\n }\n\n // @ts-ignore\n return serverResponseWrite.apply(this, args);\n };\n\n\n // calling `res.json()` in the api routes on pages router calls `res.end` without called `res.write`\n const serverResponseEnd = ServerResponse.prototype.end;\n // @ts-ignore\n ServerResponse.prototype.end = function patchedServerResponseEnd(...args) {\n // console.log('⚡️ patched ServerResponse.end');\n const endChunk = args[0];\n // console.log('patched ServerResponse.end', endChunk);\n // this just needs to work (so far) for nextjs sending json bodies, so does not need to handle all cases...\n if (endChunk && typeof endChunk === 'string') {\n // TODO: currently this throws the error and then things just hang... do we want to try to return an error type response instead?\n scanForLeaks(endChunk, { method: 'patched ServerResponse.end' });\n }\n // @ts-ignore\n return serverResponseEnd.apply(this, args);\n };\n}\n\n// ---\n// patchGlobalServerResponse();\n"]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { patchGlobalConsole } from './chunk-7TXRGZZC.js';
|
|
2
|
+
import { patchGlobalResponse } from './chunk-ASGIMFTP.js';
|
|
3
|
+
import { patchGlobalServerResponse } from './chunk-X3HJMANF.js';
|
|
4
|
+
import { initVarlockEnv } from './chunk-46HUIBFX.js';
|
|
5
|
+
import { execSync } from 'node:child_process';
|
|
6
|
+
|
|
7
|
+
var execResult = execSync("varlock load --format json-full");
|
|
8
|
+
process.env.__VARLOCK_ENV = execResult.toString();
|
|
9
|
+
initVarlockEnv();
|
|
10
|
+
patchGlobalConsole();
|
|
11
|
+
patchGlobalServerResponse();
|
|
12
|
+
patchGlobalResponse();
|
|
13
|
+
//# sourceMappingURL=chunk-YSPDPNBR.js.map
|
|
14
|
+
//# sourceMappingURL=chunk-YSPDPNBR.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/auto-load.ts"],"names":[],"mappings":";;;;;;AAWA,IAAM,UAAA,GAAa,SAAS,iCAAiC,CAAA;AAC7D,
|
|
1
|
+
{"version":3,"sources":["../src/auto-load.ts"],"names":[],"mappings":";;;;;;AAWA,IAAM,UAAA,GAAa,SAAS,iCAAiC,CAAA;AAC7D,OAAA,CAAQ,GAAA,CAAI,aAAA,GAAgB,UAAA,CAAW,QAAA,EAAS;AAGhD,cAAA,EAAe;AAEf,kBAAA,EAAmB;AACnB,yBAAA,EAA0B;AAC1B,mBAAA,EAAoB","file":"chunk-YSPDPNBR.js","sourcesContent":["import { execSync } from 'node:child_process';\n\nimport { initVarlockEnv } from './runtime/env';\nimport { patchGlobalConsole } from './runtime/patch-console';\nimport { patchGlobalServerResponse } from './runtime/patch-server-response';\nimport { patchGlobalResponse } from './runtime/patch-response';\n\n// The varlock loading process uses async calls, but we need this to run synchronously.\n// because even with top level await, we run into hoisting issues where things happen out of order\n// so we call out to the CLI using execSync\n// this also isolates the varlock loading process from the end user process\nconst execResult = execSync('varlock load --format json-full');\nprocess.env.__VARLOCK_ENV = execResult.toString();\n\n// initialize varlock and patch globals as necessary\ninitVarlockEnv();\n// these will be no-ops if these are disabled by settings\npatchGlobalConsole();\npatchGlobalServerResponse();\npatchGlobalResponse();\n\n"]}
|