varlock 0.0.3 → 0.0.5

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.
Files changed (102) hide show
  1. package/README.md +48 -25
  2. package/dist/auto-load.js +5 -6
  3. package/dist/{chunk-7UQXFWKN.js → chunk-365YVT72.js} +93 -3
  4. package/dist/chunk-365YVT72.js.map +1 -0
  5. package/dist/{chunk-CPA2D42B.js → chunk-7SCZ3YWG.js} +10 -9
  6. package/dist/chunk-7SCZ3YWG.js.map +1 -0
  7. package/dist/{chunk-RF3YMFUX.js → chunk-C2ZQAQUU.js} +3 -4
  8. package/dist/chunk-C2ZQAQUU.js.map +1 -0
  9. package/dist/chunk-EVHLEWHL.js +59 -0
  10. package/dist/chunk-EVHLEWHL.js.map +1 -0
  11. package/dist/{chunk-3KZR56NU.js → chunk-GAQWSZCY.js} +3 -4
  12. package/dist/chunk-GAQWSZCY.js.map +1 -0
  13. package/dist/{chunk-7QXRUUDC.js → chunk-GCUCCUG5.js} +29 -7
  14. package/dist/chunk-GCUCCUG5.js.map +1 -0
  15. package/dist/{chunk-2CM6PMED.js → chunk-GVAD672U.js} +15 -27
  16. package/dist/chunk-GVAD672U.js.map +1 -0
  17. package/dist/{chunk-RPLDMNWT.js → chunk-HMRN5QZL.js} +3 -3
  18. package/dist/{chunk-RPLDMNWT.js.map → chunk-HMRN5QZL.js.map} +1 -1
  19. package/dist/{chunk-TYL3Q4QG.js → chunk-K2N2TG4M.js} +1227 -1259
  20. package/dist/chunk-K2N2TG4M.js.map +1 -0
  21. package/dist/chunk-LHTLO65N.js +99 -0
  22. package/dist/chunk-LHTLO65N.js.map +1 -0
  23. package/dist/{chunk-OXV76U3Y.js → chunk-LU2R63B4.js} +3 -4
  24. package/dist/chunk-LU2R63B4.js.map +1 -0
  25. package/dist/{chunk-B4UBSMSZ.js → chunk-PUGFIZE3.js} +4 -3
  26. package/dist/chunk-PUGFIZE3.js.map +1 -0
  27. package/dist/chunk-PZE4KJJW.js +14 -0
  28. package/dist/{chunk-3EBGAOLH.js.map → chunk-PZE4KJJW.js.map} +1 -1
  29. package/dist/{chunk-RCHPHIHX.js → chunk-RZT65DRA.js} +2 -2
  30. package/dist/chunk-RZT65DRA.js.map +1 -0
  31. package/dist/chunk-UFAGBKYG.js +54 -0
  32. package/dist/chunk-UFAGBKYG.js.map +1 -0
  33. package/dist/{chunk-5HDQH7UC.js → chunk-VVJO4FC3.js} +28 -169
  34. package/dist/chunk-VVJO4FC3.js.map +1 -0
  35. package/dist/chunk-VVKXMIKQ.js +180 -0
  36. package/dist/chunk-VVKXMIKQ.js.map +1 -0
  37. package/dist/{chunk-OSSLRXKM.js → chunk-WFN3ZXGS.js} +6 -6
  38. package/dist/chunk-WFN3ZXGS.js.map +1 -0
  39. package/dist/chunk-Y7WD33L3.js +17 -0
  40. package/dist/chunk-Y7WD33L3.js.map +1 -0
  41. package/dist/{chunk-NAZPFZOO.js → chunk-Z5KNSSLC.js} +10 -8
  42. package/dist/chunk-Z5KNSSLC.js.map +1 -0
  43. package/dist/cli/cli-executable.js +702 -158
  44. package/dist/cli/cli-executable.js.map +1 -1
  45. package/dist/doctor.command-NUG3BYDQ.js +7 -0
  46. package/dist/{doctor.command-L3P5LBOW.js.map → doctor.command-NUG3BYDQ.js.map} +1 -1
  47. package/dist/dotenv-compat.js +5 -6
  48. package/dist/encrypt.command-AGHQ4KTI.js +7 -0
  49. package/dist/{encrypt.command-VGJABHNK.js.map → encrypt.command-AGHQ4KTI.js.map} +1 -1
  50. package/dist/env-B8lQt2sl.d.ts +42 -0
  51. package/dist/help.command-B7VWA53B.js +5 -0
  52. package/dist/{help.command-YZDL2VEQ.js.map → help.command-B7VWA53B.js.map} +1 -1
  53. package/dist/index.d.ts +1 -2
  54. package/dist/index.js +11 -10
  55. package/dist/index.js.map +1 -1
  56. package/dist/init.command-DHE2Q6FX.js +13 -0
  57. package/dist/{init.command-Q4YBHAEG.js.map → init.command-DHE2Q6FX.js.map} +1 -1
  58. package/dist/load.command-GGE4OANH.js +12 -0
  59. package/dist/{load.command-K22PEH3D.js.map → load.command-GGE4OANH.js.map} +1 -1
  60. package/dist/login.command-25PKQUGR.js +10 -0
  61. package/dist/{login.command-22RUZJLR.js.map → login.command-25PKQUGR.js.map} +1 -1
  62. package/dist/run.command-BLL6AL52.js +12 -0
  63. package/dist/{run.command-DUAYGL6F.js.map → run.command-BLL6AL52.js.map} +1 -1
  64. package/dist/runtime/env.d.ts +1 -27
  65. package/dist/runtime/env.js +1 -1
  66. package/dist/runtime/patch-console.js +2 -3
  67. package/dist/runtime/patch-response.js +2 -3
  68. package/dist/runtime/patch-server-response.js +2 -3
  69. package/dist/telemetry.command-MVL3E366.js +10 -0
  70. package/dist/telemetry.command-MVL3E366.js.map +1 -0
  71. package/package.json +6 -2
  72. package/dist/chunk-2CM6PMED.js.map +0 -1
  73. package/dist/chunk-3EBGAOLH.js +0 -14
  74. package/dist/chunk-3KZR56NU.js.map +0 -1
  75. package/dist/chunk-5HDQH7UC.js.map +0 -1
  76. package/dist/chunk-7QXRUUDC.js.map +0 -1
  77. package/dist/chunk-7UQXFWKN.js.map +0 -1
  78. package/dist/chunk-B4UBSMSZ.js.map +0 -1
  79. package/dist/chunk-CPA2D42B.js.map +0 -1
  80. package/dist/chunk-LQZ6ICSS.js +0 -21
  81. package/dist/chunk-LQZ6ICSS.js.map +0 -1
  82. package/dist/chunk-NAZPFZOO.js.map +0 -1
  83. package/dist/chunk-OSSLRXKM.js.map +0 -1
  84. package/dist/chunk-OXV76U3Y.js.map +0 -1
  85. package/dist/chunk-Q5P7F3WA.js +0 -107
  86. package/dist/chunk-Q5P7F3WA.js.map +0 -1
  87. package/dist/chunk-QCC3P7BT.js +0 -39
  88. package/dist/chunk-QCC3P7BT.js.map +0 -1
  89. package/dist/chunk-RCHPHIHX.js.map +0 -1
  90. package/dist/chunk-RF3YMFUX.js.map +0 -1
  91. package/dist/chunk-TYL3Q4QG.js.map +0 -1
  92. package/dist/chunk-XHOJF7U7.js +0 -12
  93. package/dist/chunk-XHOJF7U7.js.map +0 -1
  94. package/dist/doctor.command-L3P5LBOW.js +0 -6
  95. package/dist/encrypt.command-VGJABHNK.js +0 -6
  96. package/dist/help.command-YZDL2VEQ.js +0 -5
  97. package/dist/init.command-Q4YBHAEG.js +0 -11
  98. package/dist/load.command-K22PEH3D.js +0 -10
  99. package/dist/login.command-22RUZJLR.js +0 -7
  100. package/dist/opt-out.command-Y4KUQ6PQ.js +0 -5
  101. package/dist/opt-out.command-Y4KUQ6PQ.js.map +0 -1
  102. package/dist/run.command-DUAYGL6F.js +0 -10
@@ -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,4 @@
1
- import { debug } from './chunk-XHOJF7U7.js';
2
- import { varlockSettings, scanForLeaks } from './chunk-7QXRUUDC.js';
1
+ import { debug, varlockSettings, scanForLeaks } from './chunk-GCUCCUG5.js';
3
2
  import { __name } from './chunk-XN24GZXQ.js';
4
3
 
5
4
  // src/runtime/patch-response.ts
@@ -35,5 +34,5 @@ function patchGlobalResponse() {
35
34
  __name(patchGlobalResponse, "patchGlobalResponse");
36
35
 
37
36
  export { patchGlobalResponse };
38
- //# sourceMappingURL=chunk-OXV76U3Y.js.map
39
- //# sourceMappingURL=chunk-OXV76U3Y.js.map
37
+ //# sourceMappingURL=chunk-LU2R63B4.js.map
38
+ //# sourceMappingURL=chunk-LU2R63B4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/runtime/patch-response.ts"],"names":[],"mappings":";;;;AAGO,SAAS,mBAAsB,GAAA;AACpC,EAAA,KAAA,CAAM,uCAA6B,CAAA;AACnC,EAAI,IAAA,CAAE,UAAW,CAAA,QAAA,CAAiB,iBAAmB,EAAA;AACnD,IAAA,KAAA,CAAM,mBAAmB,CAAA;AACzB,IAAA;AAAA;AAEF,EAAI,IAAA,eAAA,CAAgB,iBAAiB,KAAO,EAAA;AAC1C,IAAA,KAAA,CAAM,wBAAwB,CAAA;AAC9B,IAAA;AAAA;AAGF,EAAA,MAAM,qBAAqB,UAAW,CAAA,QAAA;AACtC,EAAW,UAAA,CAAA,QAAA,GAAW,MAAM,sBAAA,SAA+B,kBAAmB,CAAA;AAAA,IAfhF;AAegF,MAAA,MAAA,CAAA,IAAA,EAAA,wBAAA,CAAA;AAAA;AAAA,IAC5E,OAAO,iBAAoB,GAAA,IAAA;AAAA,IAC3B,WAAA,CAAY,MAAW,IAAW,EAAA;AAChC,MAAA,KAAA,CAAM,2CAAiC,CAAA;AACvC,MAAA,KAAA,CAAM,aAAa,IAAM,EAAA,EAAE,QAAQ,8BAA+B,EAAC,GAAU,IAAI,CAAA;AAAA;AACnF,IACA,OAAO,IAAK,CAAA,IAAA,EAAW,IAAW,EAAA;AAChC,MAAA,KAAA,CAAM,oCAA0B,CAAA;AAChC,MAAA,YAAA,CAAa,KAAK,SAAU,CAAA,IAAI,GAAG,EAAE,MAAA,EAAQ,yBAAyB,CAAA;AACtE,MAAA,MAAM,CAAI,GAAA,kBAAA,CAAmB,IAAK,CAAA,IAAA,EAAM,IAAI,CAAA;AAC5C,MAAO,MAAA,CAAA,cAAA,CAAe,CAAG,EAAA,QAAA,CAAS,SAAS,CAAA;AAC3C,MAAO,OAAA,CAAA;AAAA;AACT,GACF;AACF;AA1BgB,MAAA,CAAA,mBAAA,EAAA,qBAAA,CAAA","file":"chunk-LU2R63B4.js","sourcesContent":["import { scanForLeaks, varlockSettings } from './env';\nimport { debug } from './lib/debug';\n\nexport function patchGlobalResponse() {\n debug('⚡️ PATCHING global Response');\n if (!(globalThis.Response as any)._patchedByVarlock) {\n debug('> already patched');\n return;\n }\n if (varlockSettings.preventLeaks === false) {\n debug('> disabled by settings');\n return;\n }\n\n const _UnpatchedResponse = globalThis.Response;\n globalThis.Response = class VarlockPatchedResponse extends _UnpatchedResponse {\n static _patchedByVarlock = true;\n constructor(body: any, init: any) {\n debug('⚡️ patched Response constructor');\n super(scanForLeaks(body, { method: 'patched Response constructor' }) as any, init);\n }\n static json(data: any, init: any) {\n debug('⚡️ patched Response.json');\n scanForLeaks(JSON.stringify(data), { method: 'patched Response.json' });\n const r = _UnpatchedResponse.json(data, init);\n Object.setPrototypeOf(r, Response.prototype);\n return r;\n }\n };\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)) process.exit(0);
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-B4UBSMSZ.js.map
142
- //# sourceMappingURL=chunk-B4UBSMSZ.js.map
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":";;;;;;;;;;AAMA,IAAM,KAAA,GAAQ,MAAM,2BAA2B,CAAA;AAKxC,IAAM,yBAAN,MAA6B;AAAA,EAXpC;AAWoC,IAAA,MAAA,CAAA,IAAA,EAAA,wBAAA,CAAA;AAAA;AAAA,EAC1B,MAAA;AAAA,EAEA,YAAA;AAAA,EAEA,aAAyB,GAAA,KAAA;AAAA,EACzB,WAAA;AAAA,EACA,UAAA;AAAA,EAER,YAAY,IAAgC,EAAA;AAC1C,IAAK,IAAA,CAAA,MAAA,GAAS,IAAI,GAAA,CAAI,MAAO,EAAA;AAC7B,IAAK,IAAA,CAAA,YAAA,uBAAmB,GAAI,EAAA;AAC5B,IAAA,IAAA,CAAK,WAAc,GAAA,KAAA;AACnB,IAAK,IAAA,CAAA,UAAA,GAAa,IAAM,EAAA,UAAA,IAAc,IAAK,CAAA,OAAA;AAAA,MACzC,GAAG,OAAQ,EAAA;AAAA,MACX;AAAA,KACF;AAAA;AACF,EAEQ,iBAA4B,GAAA;AAElC,IAAA,MAAM,SAAY,GAAA,IAAA,CAAK,GAAI,EAAA,CAAE,SAAS,EAAE,CAAA;AACxC,IAAA,MAAM,SAAS,MAAO,CAAA,WAAA,CAAY,CAAC,CAAA,CAAE,SAAS,KAAK,CAAA;AACnD,IAAO,OAAA,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA;AAAA;AAC/B,EAEA,gBAAmB,GAAA;AACjB,IAAA,IAAA,CAAK,aAAgB,GAAA,IAAA;AAErB,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,OAAY,KAAA;AACvC,MAAK,IAAA,CAAA,MAAA,CAAO,EAAG,CAAA,SAAA,EAAW,MAAM;AAC9B,QAAA,KAAA,CAAM,yBAAyB,CAAA;AAC/B,QAAA,IAAA,CAAK,WAAc,GAAA,IAAA;AACnB,QAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,OACb,CAAA;AAED,MAAA,IAAA,CAAK,MAAO,CAAA,EAAA,CAAG,MAAQ,EAAA,CAAC,IAAiB,KAAA;AACvC,QAAA,KAAA,CAAM,iBAAiB,CAAA;AACvB,QAAI,IAAA;AAEF,UAAM,MAAA,aAAA,GAAgB,IAAK,CAAA,YAAA,CAAa,CAAC,CAAA;AACzC,UAAA,MAAM,WAAc,GAAA,IAAA,CAAK,KAAM,CAAA,CAAA,EAAG,IAAI,aAAa,CAAA;AACnD,UAAA,MAAM,OAAU,GAAA,IAAA,CAAK,KAAM,CAAA,WAAA,CAAY,UAAU,CAAA;AAEjD,UAAA,KAAA,CAAM,aAAa,OAAO,CAAA;AAG1B,UAAI,IAAA,OAAA,CAAQ,SAAS,cAAgB,EAAA;AACnC,YAAA,IAAA,CAAK,OAAQ,EAAA;AACb,YAAA;AAAA;AAIF,UAAA,IAAI,QAAQ,EAAM,IAAA,IAAA,CAAK,aAAa,GAAI,CAAA,OAAA,CAAQ,EAAE,CAAG,EAAA;AACnD,YAAM,MAAA,EAAE,SAAS,QAAS,EAAA,GAAI,KAAK,YAAa,CAAA,GAAA,CAAI,QAAQ,EAAE,CAAA;AAC9D,YAAK,IAAA,CAAA,YAAA,CAAa,MAAO,CAAA,OAAA,CAAQ,EAAE,CAAA;AACnC,YAAA,QAAA,CAAS,QAAQ,MAAM,CAAA;AAAA,WAClB,MAAA;AACL,YAAQ,OAAA,CAAA,GAAA,CAAI,gCAAgC,OAAO,CAAA;AAAA;AACrD,iBACO,KAAO,EAAA;AACd,UAAQ,OAAA,CAAA,KAAA,CAAM,6BAA6B,KAAK,CAAA;AAAA;AAClD,OACD,CAAA;AAED,MAAA,IAAA,CAAK,MAAO,CAAA,EAAA,CAAG,OAAS,EAAA,CAAC,KAAU,KAAA;AACjC,QAAQ,OAAA,CAAA,KAAA,CAAM,iBAAiB,KAAK,CAAA;AAEpC,QAAA,IAAA,CAAK,OAAQ,EAAA;AAAA,OACd,CAAA;AAED,MAAK,IAAA,CAAA,MAAA,CAAO,EAAG,CAAA,OAAA,EAAS,MAAM;AAC5B,QAAA,KAAA,CAAM,eAAe,CAAA;AACrB,QAAA,IAAA,CAAK,WAAc,GAAA,KAAA;AACnB,QAAA,IAAA,CAAK,OAAQ,EAAA;AAAA,OACd,CAAA;AAED,MAAK,IAAA,CAAA,MAAA,CAAO,OAAQ,CAAA,IAAA,CAAK,UAAU,CAAA;AAAA,KACpC,CAAA;AAAA;AACH,EAEQ,YAAY,OAA4B,EAAA;AAC9C,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAW,KAAA;AACtC,MAAI,IAAA,CAAC,KAAK,WAAa,EAAA;AACrB,QAAO,MAAA,CAAA,IAAI,KAAM,CAAA,yBAAyB,CAAC,CAAA;AAC3C,QAAA;AAAA;AAGF,MAAM,MAAA,SAAA,GAAY,KAAK,iBAAkB,EAAA;AACzC,MAAA,MAAM,aAAgB,GAAA;AAAA,QACpB,GAAG,OAAA;AAAA,QACH,EAAI,EAAA;AAAA,OACN;AAEA,MAAM,MAAA,QAAA,GAAW,IAAK,CAAA,SAAA,CAAU,aAAa,CAAA;AAC7C,MAAA,MAAM,YAAe,GAAA,IAAI,WAAY,EAAA,CAAE,OAAO,QAAQ,CAAA;AAGtD,MAAM,MAAA,WAAA,GAAc,IAAI,UAAA,CAAW,CAAC,CAAA;AACpC,MAAA,MAAM,IAAO,GAAA,IAAI,QAAS,CAAA,WAAA,CAAY,MAAM,CAAA;AAC5C,MAAA,IAAA,CAAK,SAAU,CAAA,CAAA,EAAG,YAAa,CAAA,MAAA,EAAQ,IAAI,CAAA;AAG3C,MAAA,MAAM,aAAgB,GAAA,IAAI,UAAW,CAAA,CAAA,GAAI,aAAa,MAAM,CAAA;AAC5D,MAAA,aAAA,CAAc,IAAI,WAAW,CAAA;AAC7B,MAAc,aAAA,CAAA,GAAA,CAAI,cAAc,CAAC,CAAA;AAGjC,MAAA,IAAA,CAAK,aAAa,GAAI,CAAA,SAAA,EAAW,EAAE,OAAA,EAAS,QAAQ,CAAA;AAGpD,MAAK,IAAA,CAAA,MAAA,CAAO,MAAM,aAAa,CAAA;AAAA,KAChC,CAAA;AAAA;AACH,EAEA,MAAa,QAAQ,SAAiC,EAAA;AACpD,IAAA,IAAI,CAAC,IAAA,CAAK,aAAe,EAAA,MAAM,KAAK,gBAAiB,EAAA;AACrD,IAAA,OAAO,KAAK,WAAY,CAAA;AAAA,MACtB,MAAQ,EAAA,SAAA;AAAA,MACR,OAAA,EAAS,EAAE,SAAU;AAAA,KACtB,CAAA;AAAA;AACH,EAEA,MAAa,QAAQ,UAAkC,EAAA;AACrD,IAAA,IAAI,CAAC,IAAA,CAAK,aAAe,EAAA,MAAM,KAAK,gBAAiB,EAAA;AACrD,IAAA,OAAO,KAAK,WAAY,CAAA;AAAA,MACtB,MAAQ,EAAA,SAAA;AAAA,MACR,OAAA,EAAS,EAAE,UAAW;AAAA,KACvB,CAAA;AAAA;AACH,EAEO,OAAU,GAAA;AAEf,IAAA,KAAA,MAAW,EAAE,MAAO,EAAA,IAAK,IAAK,CAAA,YAAA,CAAa,QAAU,EAAA;AACnD,MAAO,MAAA,CAAA,IAAI,KAAM,CAAA,mBAAmB,CAAC,CAAA;AAAA;AAEvC,IAAA,IAAA,CAAK,aAAa,KAAM,EAAA;AACxB,IAAA,IAAA,CAAK,OAAO,GAAI,EAAA;AAAA;AAEpB,CAAA;;;AC9IO,IAAM,cAAc,MAAO,CAAA;AAAA,EAChC,IAAM,EAAA,SAAA;AAAA,EACN,WAAa,EAAA,iDAAA;AAAA,EACb,MAAM;AACR,CAAC;AAEY,IAAA,SAAA,iCAA6D,GAAQ,KAAA;AAChF,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,EAAA,OAAA,CAAQ,IAAI,sDAA0C,CAAA;AAGtD,EAAA,MAAM,WAAW,MAAM,EAAA,CAAS,EAAE,OAAA,EAAS,uCAAuC,CAAA;AAClF,EAAA,IAAI,EAAS,CAAA,QAAQ,CAAG,EAAA,OAAO,YAAa,EAAA;AAE5C,EAAM,MAAA,MAAA,GAAS,IAAI,sBAAuB,EAAA;AAC1C,EAAA,MAAM,OAAO,gBAAiB,EAAA;AAC9B,EAAA,MAAM,cAAiB,GAAA,MAAM,MAAO,CAAA,OAAA,CAAQ,QAAQ,CAAA;AAEpD,EAAA,OAAA,CAAQ,IAAI,yEAAyE,CAAA;AACrF,EAAQ,OAAA,CAAA,GAAA,CAAI,CAA+B,4BAAA,EAAA,cAAc,CAAI,EAAA,CAAA,CAAA;AA6F/D,CA1GmE,EAAA,WAAA","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"]}
@@ -0,0 +1,14 @@
1
+ import { patchGlobalConsole } from './chunk-GAQWSZCY.js';
2
+ import { patchGlobalResponse } from './chunk-LU2R63B4.js';
3
+ import { patchGlobalServerResponse } from './chunk-C2ZQAQUU.js';
4
+ import { initVarlockEnv } from './chunk-GCUCCUG5.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-PZE4KJJW.js.map
14
+ //# sourceMappingURL=chunk-PZE4KJJW.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/auto-load.ts"],"names":[],"mappings":";;;;;;AAWA,IAAM,UAAA,GAAa,SAAS,iCAAiC,CAAA;AAC7D,OAAQ,CAAA,GAAA,CAAI,aAAgB,GAAA,UAAA,CAAW,QAAS,EAAA;AAGhD,cAAe,EAAA;AAEf,kBAAmB,EAAA;AACnB,yBAA0B,EAAA;AAC1B,mBAAoB,EAAA","file":"chunk-3EBGAOLH.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"]}
1
+ {"version":3,"sources":["../src/auto-load.ts"],"names":[],"mappings":";;;;;;AAWA,IAAM,UAAA,GAAa,SAAS,iCAAiC,CAAA;AAC7D,OAAQ,CAAA,GAAA,CAAI,aAAgB,GAAA,UAAA,CAAW,QAAS,EAAA;AAGhD,cAAe,EAAA;AAEf,kBAAmB,EAAA;AACnB,yBAA0B,EAAA;AAC1B,mBAAoB,EAAA","file":"chunk-PZE4KJJW.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"]}
@@ -11,5 +11,5 @@ var commandFn = /* @__PURE__ */ __name(async (ctx) => {
11
11
  }, "commandFn");
12
12
 
13
13
  export { commandFn, commandSpec };
14
- //# sourceMappingURL=chunk-RCHPHIHX.js.map
15
- //# sourceMappingURL=chunk-RCHPHIHX.js.map
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,MAAO,CAAA;AAAA,EAChC,IAAM,EAAA,MAAA;AAAA,EACN,WAAa,EAAA,4BAAA;AAAA,EACb,MAAM;AACR,CAAC;AAEY,IAAA,SAAA,iCAA6D,GAAQ,KAAA;AAElF,CAFmE,EAAA,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-VVKXMIKQ.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-UFAGBKYG.js.map
54
+ //# sourceMappingURL=chunk-UFAGBKYG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/commands/telemetry.command.ts"],"names":[],"mappings":";;;;;;;;;AAWO,IAAM,cAAc,MAAO,CAAA;AAAA,EAChC,IAAM,EAAA,WAAA;AAAA,EACN,WAAa,EAAA,0CAAA;AAAA,EACb,IAAM,EAAA;AAAA,IACJ,IAAM,EAAA;AAAA,MACJ,IAAM,EAAA,YAAA;AAAA,MACN,WAAa,EAAA;AAAA;AACf;AAEJ,CAAC;AAEY,IAAA,SAAA,iCAA6D,GAAQ,KAAA;AAEhF,EAAI,IAAA,CAAC,CAAC,QAAU,EAAA,SAAS,EAAE,QAAS,CAAA,GAAA,CAAI,MAAO,CAAA,IAAI,CAAG,EAAA;AACpD,IAAM,MAAA,IAAI,aAAa,8CAAgD,EAAA;AAAA,MACrE,SAAW,EAAA;AAAA,KACZ,CAAA;AAAA;AAGH,EAAA,MAAM,SAAY,GAAA,IAAA,CAAK,OAAQ,EAAA,EAAG,UAAU,CAAA;AAC5C,EAAM,MAAA,UAAA,GAAa,IAAK,CAAA,SAAA,EAAW,aAAa,CAAA;AAEhD,EAAI,IAAA;AAEF,IAAI,IAAA,CAAC,UAAW,CAAA,SAAS,CAAG,EAAA;AAC1B,MAAA,MAAM,KAAM,CAAA,SAAA,EAAW,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA;AAI5C,IAAA,IAAI,SAA8B,EAAC;AACnC,IAAI,IAAA,UAAA,CAAW,UAAU,CAAG,EAAA;AAC1B,MAAA,MAAM,aAAgB,GAAA,MAAM,QAAS,CAAA,UAAA,EAAY,OAAO,CAAA;AACxD,MAAS,MAAA,GAAA,IAAA,CAAK,MAAM,aAAa,CAAA;AAAA;AAInC,IAAA,IAAI,GAAI,CAAA,MAAA,CAAO,IAAS,KAAA,SAAA,SAAkB,iBAAoB,GAAA,IAAA;AAAA,gBAClD,MAAO,CAAA,iBAAA;AACnB,IAAA,MAAM,UAAU,UAAY,EAAA,IAAA,CAAK,UAAU,MAAQ,EAAA,IAAA,EAAM,CAAC,CAAC,CAAA;AAE3D,IAAI,IAAA,GAAA,CAAI,OAAO,IAAM,EAAA;AACnB,MAAA,OAAA,CAAQ,IAAI,uDAAkD,CAAA;AAAA,KACzD,MAAA;AACL,MAAA,OAAA,CAAQ,IAAI,wDAAmD,CAAA;AAAA;AAEjE,IAAA,OAAA,CAAQ,GAAI,CAAA,aAAA,EAAe,GAAI,CAAA,QAAA,CAAS,UAAU,CAAC,CAAA;AAAA,WAC5C,KAAO,EAAA;AACd,IAAQ,OAAA,CAAA,KAAA,CAAM,mCAAmC,KAAK,CAAA;AACtD,IAAA,OAAO,aAAa,CAAC,CAAA;AAAA;AAEzB,CAvCmE,EAAA,WAAA","file":"chunk-UFAGBKYG.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"]}
@@ -1,36 +1,17 @@
1
- import { logLines, fmt } from './chunk-LQZ6ICSS.js';
1
+ import { detectJsPackageManager, logLines, fmt, pathExists, installJsDependency } from './chunk-VVKXMIKQ.js';
2
2
  import { ve, pD, dD, SD, LD } from './chunk-DAZNZPLN.js';
3
3
  import { define } from './chunk-33ROL4J5.js';
4
- import { joinAndCompact, loadVarlockEnvGraph } from './chunk-Q5P7F3WA.js';
5
- import { ansis_default } from './chunk-7UQXFWKN.js';
6
- import { my_dash_default, StaticValueResolver, DotEnvFileDataSource, checkIsFileGitIgnored } from './chunk-TYL3Q4QG.js';
4
+ import { loadVarlockEnvGraph } from './chunk-Y7WD33L3.js';
5
+ import { ansis_default } from './chunk-365YVT72.js';
6
+ import { gracefulExit } from './chunk-LHTLO65N.js';
7
+ import { StaticValueResolver, DotEnvFileDataSource, checkIsFileGitIgnored } from './chunk-K2N2TG4M.js';
7
8
  import { __name } from './chunk-XN24GZXQ.js';
8
9
  import path from 'node:path';
9
- import fs3, { access } from 'node:fs/promises';
10
+ import fs2 from 'node:fs/promises';
10
11
  import { envSpecUpdater, ParsedEnvSpecStaticValue, parseEnvSpecDotEnvFile } from '@env-spec/parser';
11
- import fs2, { accessSync, existsSync } from 'node:fs';
12
12
  import { WriteStream } from 'node:tty';
13
13
  import process2 from 'node:process';
14
- import { execSync } from 'node:child_process';
15
14
 
16
- async function pathExists(p) {
17
- try {
18
- await access(p);
19
- return true;
20
- } catch {
21
- return false;
22
- }
23
- }
24
- __name(pathExists, "pathExists");
25
- function pathExistsSync(p) {
26
- try {
27
- accessSync(p);
28
- return true;
29
- } catch {
30
- return false;
31
- }
32
- }
33
- __name(pathExistsSync, "pathExistsSync");
34
15
  function isUnicodeSupported() {
35
16
  const { env } = process2;
36
17
  const { TERM, TERM_PROGRAM } = env;
@@ -383,138 +364,13 @@ async function detectRedundantValues(envGraph, opts = {}) {
383
364
  }
384
365
  }
385
366
  if (opts.delete) {
386
- await fs3.writeFile(source.fullPath, source.parsedFile.toString(), "utf8");
367
+ await fs2.writeFile(source.fullPath, source.parsedFile.toString(), "utf8");
387
368
  }
388
369
  }
389
370
  return redundantItemsBySourcePath;
390
371
  }
391
372
  __name(detectRedundantValues, "detectRedundantValues");
392
373
 
393
- // src/cli/helpers/exit-error.ts
394
- var CliExitError = class extends Error {
395
- constructor(message, more) {
396
- super(message);
397
- this.more = more;
398
- }
399
- static {
400
- __name(this, "CliExitError");
401
- }
402
- get forceExit() {
403
- return !!this.more?.forceExit;
404
- }
405
- getFormattedOutput() {
406
- let msg = `
407
- \u{1F4A5} ${ansis_default.red(this.message)} \u{1F4A5}
408
- `;
409
- if (this.more?.details) {
410
- msg += joinAndCompact(my_dash_default.castArray(this.more?.details), "\n");
411
- }
412
- if (this.more?.suggestion) {
413
- msg += joinAndCompact(my_dash_default.castArray(this.more?.suggestion), "\n");
414
- }
415
- msg += "\n";
416
- return msg;
417
- }
418
- };
419
- var JS_PACKAGE_MANAGERS = Object.freeze({
420
- npm: {
421
- name: "npm",
422
- lockfile: "package-lock.json",
423
- add: "npm install",
424
- // add also works
425
- exec: "npm exec --",
426
- dlx: "npx"
427
- },
428
- pnpm: {
429
- name: "pnpm",
430
- lockfile: "pnpm-lock.yaml",
431
- add: "pnpm add",
432
- exec: "pnpm exec",
433
- dlx: "pnpm dlx"
434
- },
435
- yarn: {
436
- name: "yarn",
437
- lockfile: "yarn.lock",
438
- add: "yarn add",
439
- exec: "yarn exec --",
440
- dlx: "yarn dlx"
441
- },
442
- bun: {
443
- name: "bun",
444
- lockfile: "bun.lockb",
445
- add: "bun add",
446
- exec: "bun run",
447
- dlx: "bunx"
448
- },
449
- deno: {
450
- //! deno not fully supported yet
451
- name: "deno",
452
- lockfile: "deno.lock",
453
- add: "deno add",
454
- // TODO: don't think these are quite right...
455
- exec: "deno run",
456
- dlx: "deno run"
457
- }
458
- });
459
- function detectJsPackageManager(opts) {
460
- let cwd = opts?.cwd || process.cwd();
461
- const cwdParts = cwd.split(path.sep);
462
- do {
463
- let pm;
464
- let detectedPm;
465
- for (pm in JS_PACKAGE_MANAGERS) {
466
- const lockFilePath = path.join(
467
- cwd,
468
- JS_PACKAGE_MANAGERS[pm].lockfile
469
- );
470
- if (pathExistsSync(lockFilePath)) {
471
- if (detectedPm) {
472
- throw new CliExitError("Found multiple js package manager lockfiles", {
473
- details: `${JS_PACKAGE_MANAGERS[pm].lockfile} and ${JS_PACKAGE_MANAGERS[detectedPm].lockfile}`,
474
- forceExit: true
475
- });
476
- }
477
- detectedPm = pm;
478
- }
479
- }
480
- if (detectedPm) return JS_PACKAGE_MANAGERS[detectedPm];
481
- cwdParts.pop();
482
- cwd = path.join(...cwdParts);
483
- if (opts?.workspaceRootPath) {
484
- if (opts.workspaceRootPath === cwd) break;
485
- } else {
486
- if (pathExistsSync(path.join(cwd, ".git"))) break;
487
- }
488
- } while (cwd);
489
- if (process.env.npm_config_user_agent) {
490
- const pmFromAgent = process.env.npm_config_user_agent.split("/")[0];
491
- if (Object.keys(JS_PACKAGE_MANAGERS).includes(pmFromAgent)) {
492
- return JS_PACKAGE_MANAGERS[pmFromAgent];
493
- }
494
- }
495
- if (opts?.exitIfNotFound) {
496
- throw new CliExitError("Unable to find detect your JavaScript package manager!", {
497
- suggestion: "We look for lock files (ex: package-lock.json) so you may just need to run a dependency install (ie `npm install`)",
498
- forceExit: true
499
- });
500
- }
501
- }
502
- __name(detectJsPackageManager, "detectJsPackageManager");
503
- function installJsDependency(opts) {
504
- const packageJsonPath = path.join(opts.packagePath || process.cwd(), "package.json");
505
- if (!existsSync(packageJsonPath)) return false;
506
- const packageJson = JSON.parse(fs2.readFileSync(packageJsonPath, "utf8"));
507
- if (packageJson.dependencies?.varlock) return false;
508
- execSync([
509
- opts.packagePath ? `cd ${opts.packagePath} &&` : "",
510
- // `add` works in all of them
511
- `${opts.packageManager} add ${opts.packageName}`,
512
- opts.isMonoRepoRoot && opts.packageManager === "pnpm" ? "-w" : ""
513
- ].join(" "));
514
- return true;
515
- }
516
- __name(installJsDependency, "installJsDependency");
517
-
518
374
  // src/cli/commands/init.command.ts
519
375
  var commandSpec = define({
520
376
  name: "init",
@@ -522,9 +378,8 @@ var commandSpec = define({
522
378
  args: {}
523
379
  });
524
380
  var commandFn = /* @__PURE__ */ __name(async (ctx) => {
525
- {
526
- console.log("\u{1F9D9} Hello and welcome to Varlock \u{1F512}\u{1F525}\u2728");
527
- }
381
+ const jsPackageManager = detectJsPackageManager();
382
+ console.log("\u{1F9D9} Hello and welcome to Varlock \u{1F512}\u{1F525}\u2728");
528
383
  let envGraph = await loadVarlockEnvGraph();
529
384
  const existingSchemaFile = envGraph.dataSources.find((dataSource) => {
530
385
  return dataSource.type === "schema";
@@ -552,7 +407,7 @@ var commandFn = /* @__PURE__ */ __name(async (ctx) => {
552
407
  value: file
553
408
  }))
554
409
  });
555
- if (pD(selectedExample)) process.exit(0);
410
+ if (pD(selectedExample)) return gracefulExit(0);
556
411
  exampleFileToConvert = selectedExample;
557
412
  }
558
413
  const parsedEnvFile = exampleFileToConvert?.parsedFile || parseEnvSpecDotEnvFile("");
@@ -567,7 +422,7 @@ var commandFn = /* @__PURE__ */ __name(async (ctx) => {
567
422
  envSpecUpdater.setRootDecorator(parsedEnvFile, "generateTypes", "lang=ts, path=env.d.ts", { bareFnArgs: true });
568
423
  envSpecUpdater.injectFromStr(parsedEnvFile, [
569
424
  "",
570
- "# example env variable injected by `varlock init`",
425
+ "# example env variable injected by `varlock init` \u26A0\uFE0F DELETE THIS ITEM! \u26A0\uFE0F",
571
426
  '# @required @sensitive @example="example value"',
572
427
  'EXAMPLE_ITEM="delete me!"',
573
428
  ""
@@ -575,7 +430,7 @@ var commandFn = /* @__PURE__ */ __name(async (ctx) => {
575
430
  inferSchemaUpdates(parsedEnvFile);
576
431
  ensureAllItemsExist(envGraph, parsedEnvFile);
577
432
  const schemaFilePath = path.join(process.cwd(), ".env.schema");
578
- await fs3.writeFile(schemaFilePath, parsedEnvFile.toString());
433
+ await fs2.writeFile(schemaFilePath, parsedEnvFile.toString());
579
434
  if (exampleFileToConvert) {
580
435
  logLines([
581
436
  "",
@@ -591,7 +446,7 @@ var commandFn = /* @__PURE__ */ __name(async (ctx) => {
591
446
  }
592
447
  if (await checkIsFileGitIgnored(schemaFilePath)) {
593
448
  logLines([ansis_default.dim(`(and updated ${fmt.fileName(".gitignore")} to ensure it will be tracked by git)`)]);
594
- await fs3.appendFile(".gitignore", "\n!.env.schema");
449
+ await fs2.appendFile(".gitignore", "\n!.env.schema");
595
450
  }
596
451
  logLines([
597
452
  "",
@@ -599,16 +454,17 @@ var commandFn = /* @__PURE__ */ __name(async (ctx) => {
599
454
  `We've done our best to get you started, but you must review and make sure it is correct!`,
600
455
  "",
601
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`,
602
458
  `- use ${fmt.decorator("@required")} (or ${fmt.decorator("@optional")}) to tag items that should fail validation when empty`,
603
459
  `- use ${fmt.decorator("@sensitive")} to tag items that contain sensitive secrets, and must be handled accordingly`,
604
460
  `- use ${fmt.decorator("@type")} to set an item's data type (if not a basic string), which affects validation and coercion logic`,
605
- `- if an item value is purely an ${ansis_default.italic("example")} rather than a default, move it into an ${fmt.decorator("@example")} decorator, or delete it`,
461
+ `- if an item value is a ${ansis_default.italic("useful example")} rather than a default, use ${fmt.decorator("@example")}`,
606
462
  `- if an item value is just a dummy placeholder, delete it`
607
463
  ]);
608
464
  const confirmReviewed = await prompts_default.confirm({
609
465
  message: `Have you reviewed and updated your new ${fmt.fileName(".env.schema")} file?`
610
466
  });
611
- if (pD(confirmReviewed)) process.exit(0);
467
+ if (pD(confirmReviewed)) return gracefulExit(0);
612
468
  envGraph = await loadVarlockEnvGraph();
613
469
  if (envGraph.configSchema.EXAMPLE_ITEM) {
614
470
  logLines([
@@ -621,9 +477,9 @@ var commandFn = /* @__PURE__ */ __name(async (ctx) => {
621
477
  const confirmDeleteExample = await prompts_default.confirm({
622
478
  message: `Should we delete your ${fmt.fileName(exampleFileToConvert.fileName)} file? ${ansis_default.italic.gray("(you can always do this yourself later)")}`
623
479
  });
624
- if (pD(confirmDeleteExample)) process.exit(0);
480
+ if (pD(confirmDeleteExample)) return gracefulExit(0);
625
481
  if (confirmDeleteExample) {
626
- await fs3.unlink(exampleFileToConvert.fullPath);
482
+ await fs2.unlink(exampleFileToConvert.fullPath);
627
483
  }
628
484
  }
629
485
  const defaultsFile = envGraph.dataSources.find((dataSource) => {
@@ -649,7 +505,7 @@ var commandFn = /* @__PURE__ */ __name(async (ctx) => {
649
505
  const confirmDeleteRedundant = await prompts_default.confirm({
650
506
  message: "Should we delete these redundant values from your other .env files?"
651
507
  });
652
- if (pD(confirmDeleteRedundant)) process.exit(0);
508
+ if (pD(confirmDeleteRedundant)) return gracefulExit(0);
653
509
  if (confirmDeleteRedundant) {
654
510
  await detectRedundantValues(envGraph, { delete: true });
655
511
  }
@@ -657,11 +513,14 @@ var commandFn = /* @__PURE__ */ __name(async (ctx) => {
657
513
  logLines([
658
514
  "",
659
515
  ansis_default.bold("\u{1F389} Great!"),
660
- `You can run ${fmt.command("varlock load")} to attempt loading your env vars validate against your new schema.`,
661
- "Check out our integration guide for more info about integrating into your application."
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
+ ""
662
522
  ]);
663
523
  }
664
- const jsPackageManager = detectJsPackageManager();
665
524
  if (jsPackageManager && await pathExists(path.join(process.cwd(), "package.json"))) {
666
525
  const installResult = installJsDependency({
667
526
  packageManager: jsPackageManager.name,
@@ -676,6 +535,6 @@ var commandFn = /* @__PURE__ */ __name(async (ctx) => {
676
535
  }
677
536
  }, "commandFn");
678
537
 
679
- export { CliExitError, commandFn, commandSpec };
680
- //# sourceMappingURL=chunk-5HDQH7UC.js.map
681
- //# sourceMappingURL=chunk-5HDQH7UC.js.map
538
+ export { commandFn, commandSpec };
539
+ //# sourceMappingURL=chunk-VVJO4FC3.js.map
540
+ //# sourceMappingURL=chunk-VVJO4FC3.js.map
@@ -0,0 +1 @@
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-VVJO4FC3.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"]}