varlock 1.2.0 → 1.3.0

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 (122) hide show
  1. package/dist/audit.command-LLD5UIAW.js +16 -0
  2. package/dist/{audit.command-6TUJY57M.js.map → audit.command-LLD5UIAW.js.map} +1 -1
  3. package/dist/auto-load.js +5 -5
  4. package/dist/{chunk-QSYH5IDD.js → chunk-5DRCCFKV.js} +3 -3
  5. package/dist/{chunk-QSYH5IDD.js.map → chunk-5DRCCFKV.js.map} +1 -1
  6. package/dist/{chunk-H2JVYUHZ.js → chunk-C5LW5EET.js} +6 -6
  7. package/dist/{chunk-H2JVYUHZ.js.map → chunk-C5LW5EET.js.map} +1 -1
  8. package/dist/{chunk-35LTPRXV.js → chunk-CESFJIM4.js} +6 -6
  9. package/dist/{chunk-35LTPRXV.js.map → chunk-CESFJIM4.js.map} +1 -1
  10. package/dist/{chunk-5DUWGI2N.js → chunk-DIPEXEIL.js} +3 -3
  11. package/dist/{chunk-5DUWGI2N.js.map → chunk-DIPEXEIL.js.map} +1 -1
  12. package/dist/{chunk-26E4E2MY.js → chunk-F6ZYIWAR.js} +5 -5
  13. package/dist/{chunk-26E4E2MY.js.map → chunk-F6ZYIWAR.js.map} +1 -1
  14. package/dist/{chunk-6CCHLM3U.js → chunk-FA5SNEKN.js} +30 -12
  15. package/dist/chunk-FA5SNEKN.js.map +1 -0
  16. package/dist/{chunk-6CRDPEUT.js → chunk-GKN3UJNE.js} +583 -729
  17. package/dist/chunk-GKN3UJNE.js.map +1 -0
  18. package/dist/{chunk-YHN6GZHR.js → chunk-HH647LSU.js} +5 -5
  19. package/dist/{chunk-YHN6GZHR.js.map → chunk-HH647LSU.js.map} +1 -1
  20. package/dist/{chunk-CWC3IAQM.js → chunk-HMWAOBZR.js} +29 -14
  21. package/dist/chunk-HMWAOBZR.js.map +1 -0
  22. package/dist/{chunk-6PZXN47A.js → chunk-INGOLNLE.js} +4 -4
  23. package/dist/{chunk-6PZXN47A.js.map → chunk-INGOLNLE.js.map} +1 -1
  24. package/dist/{chunk-2PBFWISH.js → chunk-IO2OGZQU.js} +8 -8
  25. package/dist/chunk-IO2OGZQU.js.map +1 -0
  26. package/dist/{chunk-LGEHJHB2.js → chunk-JOGGSYT2.js} +6 -5
  27. package/dist/{chunk-LGEHJHB2.js.map → chunk-JOGGSYT2.js.map} +1 -1
  28. package/dist/{chunk-F6RTQ5QX.js → chunk-KFALDUEO.js} +3 -3
  29. package/dist/{chunk-F6RTQ5QX.js.map → chunk-KFALDUEO.js.map} +1 -1
  30. package/dist/{chunk-A2JUQ2GK.js → chunk-KI5QLKPU.js} +6 -6
  31. package/dist/{chunk-A2JUQ2GK.js.map → chunk-KI5QLKPU.js.map} +1 -1
  32. package/dist/{chunk-OA6PRICO.js → chunk-M6QE3D2O.js} +6 -6
  33. package/dist/{chunk-OA6PRICO.js.map → chunk-M6QE3D2O.js.map} +1 -1
  34. package/dist/{chunk-BR3DT5Z5.js → chunk-MPHVA4WC.js} +3 -3
  35. package/dist/{chunk-BR3DT5Z5.js.map → chunk-MPHVA4WC.js.map} +1 -1
  36. package/dist/{chunk-VIUMRSUR.js → chunk-NW4KR67N.js} +8 -8
  37. package/dist/{chunk-VIUMRSUR.js.map → chunk-NW4KR67N.js.map} +1 -1
  38. package/dist/{chunk-EE4UNY25.js → chunk-OGGTDFVX.js} +8 -8
  39. package/dist/{chunk-EE4UNY25.js.map → chunk-OGGTDFVX.js.map} +1 -1
  40. package/dist/{chunk-R73FENLU.js → chunk-QDEAHBCB.js} +3 -3
  41. package/dist/{chunk-R73FENLU.js.map → chunk-QDEAHBCB.js.map} +1 -1
  42. package/dist/{chunk-KCUEK4TX.js → chunk-RQZZDYWL.js} +7 -7
  43. package/dist/{chunk-KCUEK4TX.js.map → chunk-RQZZDYWL.js.map} +1 -1
  44. package/dist/{chunk-MGWUDHT5.js → chunk-UUJK65RS.js} +11 -3
  45. package/dist/chunk-UUJK65RS.js.map +1 -0
  46. package/dist/{chunk-FCSQRLIC.js → chunk-WJLMLKSG.js} +5 -5
  47. package/dist/{chunk-FCSQRLIC.js.map → chunk-WJLMLKSG.js.map} +1 -1
  48. package/dist/{chunk-2NQLWXPX.js → chunk-WTBUNHUJ.js} +5 -5
  49. package/dist/{chunk-2NQLWXPX.js.map → chunk-WTBUNHUJ.js.map} +1 -1
  50. package/dist/chunk-XUY3HAO2.js +171 -0
  51. package/dist/chunk-XUY3HAO2.js.map +1 -0
  52. package/dist/{chunk-2OIOYMYO.js → chunk-XXSPHSF7.js} +6 -6
  53. package/dist/{chunk-2OIOYMYO.js.map → chunk-XXSPHSF7.js.map} +1 -1
  54. package/dist/{chunk-GURKQO4J.js → chunk-YWTIKDGU.js} +7 -2
  55. package/dist/chunk-YWTIKDGU.js.map +1 -0
  56. package/dist/cli/cli-executable.js +37 -37
  57. package/dist/cli/cli-executable.js.map +1 -1
  58. package/dist/config-item-SQFJ2BJ2.js +7 -0
  59. package/dist/{config-item-7X6PUXJF.js.map → config-item-SQFJ2BJ2.js.map} +1 -1
  60. package/dist/dotenv-compat.js +5 -5
  61. package/dist/encrypt.command-WISNYCTG.js +14 -0
  62. package/dist/{encrypt.command-4E5SM5M6.js.map → encrypt.command-WISNYCTG.js.map} +1 -1
  63. package/dist/{env-graph-iNQyTcya.d.ts → env-graph-DImkUkjl.d.ts} +30 -19
  64. package/dist/explain.command-THO6CRHD.js +15 -0
  65. package/dist/{explain.command-7FRFYSJJ.js.map → explain.command-THO6CRHD.js.map} +1 -1
  66. package/dist/index.d.ts +2 -2
  67. package/dist/index.js +13 -14
  68. package/dist/index.js.map +1 -1
  69. package/dist/init.command-3EDACW36.js +14 -0
  70. package/dist/{init.command-EMPZK5D3.js.map → init.command-3EDACW36.js.map} +1 -1
  71. package/dist/install-plugin.command-MXBZTBTE.js +13 -0
  72. package/dist/{install-plugin.command-SYQAPBII.js.map → install-plugin.command-MXBZTBTE.js.map} +1 -1
  73. package/dist/load.command-XRABTXAE.js +15 -0
  74. package/dist/{load.command-R7UTXX2X.js.map → load.command-XRABTXAE.js.map} +1 -1
  75. package/dist/lock.command-O5MPBQ2I.js +7 -0
  76. package/dist/{lock.command-4LTGMJA3.js.map → lock.command-O5MPBQ2I.js.map} +1 -1
  77. package/dist/plugin-lib.d.ts +2 -2
  78. package/dist/plugin-lib.js +2 -2
  79. package/dist/printenv.command-DLCI4IPZ.js +15 -0
  80. package/dist/{printenv.command-EVYMVYEZ.js.map → printenv.command-DLCI4IPZ.js.map} +1 -1
  81. package/dist/reveal.command-6BTK3FJZ.js +15 -0
  82. package/dist/{reveal.command-6IH7XDVT.js.map → reveal.command-6BTK3FJZ.js.map} +1 -1
  83. package/dist/run.command-5CIHZECD.js +16 -0
  84. package/dist/{run.command-WW2YKPUP.js.map → run.command-5CIHZECD.js.map} +1 -1
  85. package/dist/runtime/env.d.ts +1 -1
  86. package/dist/runtime/env.js +1 -1
  87. package/dist/runtime/init-edge.cjs +9 -1
  88. package/dist/runtime/init-server.cjs +9 -1
  89. package/dist/runtime/patch-console.js +2 -2
  90. package/dist/runtime/patch-response.js +2 -2
  91. package/dist/runtime/patch-server-response.js +2 -2
  92. package/dist/{scan.command-6PSWFMI5.js → scan.command-PW3OOLQY.js} +10 -10
  93. package/dist/{scan.command-6PSWFMI5.js.map → scan.command-PW3OOLQY.js.map} +1 -1
  94. package/dist/telemetry.command-TZDNG2WR.js +13 -0
  95. package/dist/{telemetry.command-ZD6XCRBZ.js.map → telemetry.command-TZDNG2WR.js.map} +1 -1
  96. package/dist/typegen.command-QD26Q3MP.js +14 -0
  97. package/dist/{typegen.command-IKXM7OSU.js.map → typegen.command-QD26Q3MP.js.map} +1 -1
  98. package/native-bins/darwin/VarlockEnclave.app/Contents/CodeResources +0 -0
  99. package/native-bins/darwin/VarlockEnclave.app/Contents/MacOS/varlock-local-encrypt +0 -0
  100. package/native-bins/win32-x64/varlock-local-encrypt.exe +0 -0
  101. package/package.json +2 -2
  102. package/dist/audit.command-6TUJY57M.js +0 -16
  103. package/dist/chunk-2PBFWISH.js.map +0 -1
  104. package/dist/chunk-45N5EFNL.js +0 -136
  105. package/dist/chunk-45N5EFNL.js.map +0 -1
  106. package/dist/chunk-6CCHLM3U.js.map +0 -1
  107. package/dist/chunk-6CRDPEUT.js.map +0 -1
  108. package/dist/chunk-CWC3IAQM.js.map +0 -1
  109. package/dist/chunk-GURKQO4J.js.map +0 -1
  110. package/dist/chunk-MGWUDHT5.js.map +0 -1
  111. package/dist/config-item-7X6PUXJF.js +0 -7
  112. package/dist/encrypt.command-4E5SM5M6.js +0 -14
  113. package/dist/explain.command-7FRFYSJJ.js +0 -15
  114. package/dist/init.command-EMPZK5D3.js +0 -14
  115. package/dist/install-plugin.command-SYQAPBII.js +0 -13
  116. package/dist/load.command-R7UTXX2X.js +0 -15
  117. package/dist/lock.command-4LTGMJA3.js +0 -7
  118. package/dist/printenv.command-EVYMVYEZ.js +0 -15
  119. package/dist/reveal.command-6IH7XDVT.js +0 -15
  120. package/dist/run.command-WW2YKPUP.js +0 -16
  121. package/dist/telemetry.command-ZD6XCRBZ.js +0 -13
  122. package/dist/typegen.command-IKXM7OSU.js +0 -15
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/auto-load.ts"],"names":[],"mappings":";;;;;;;AAYA,IAAI;AACF,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,eAAA,CAAgB,mCAAA,EAAqC;AAAA,IACtE,UAAA,EAAY,IAAA;AAAA;AAAA;AAAA;AAAA,IAIZ,SAAA,EAAW,YAAY,OAAA,IAAW,IAAI,IAAI,GAAA,EAAK,MAAA,CAAA,IAAA,CAAY,GAAG,CAAA,CAAE;AAAA,GACjE,CAAA;AACD,EAAA,OAAA,CAAQ,IAAI,aAAA,GAAgB,MAAA;AAC9B,CAAA,CAAA,OAAS,GAAA,EAAK;AACZ,EAAA,IAAI,GAAA,YAAe,gBAAA,IAAoB,GAAA,CAAI,MAAA,EAAQ;AACjD,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,GAAA,CAAI,MAAM,CAAA;AAAA,EACjC,CAAA,MAAO;AAEL,IAAA,OAAA,CAAQ,MAAM,GAAG,CAAA;AAAA,EACnB;AACA,EAAA,OAAA,CAAQ,IAAA,CAAM,GAAA,CAAY,QAAA,IAAY,CAAC,CAAA;AACzC;AAGA,cAAA,EAAe;AAEf,kBAAA,EAAmB;AACnB,yBAAA,EAA0B;AAC1B,mBAAA,EAAoB","file":"chunk-OA6PRICO.js","sourcesContent":["import { execSyncVarlock, VarlockExecError } from './lib/exec-sync-varlock';\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\n\ntry {\n const { stdout } = execSyncVarlock('load --format json-full --compact', {\n fullResult: true,\n // Pass the directory of this module so that in monorepos the binary search\n // starts from inside the varlock package (e.g. apps/web/node_modules/varlock)\n // rather than from process.cwd(), which may be an unrelated workspace root.\n callerDir: import.meta.dirname ?? new URL('.', import.meta.url).pathname,\n });\n process.env.__VARLOCK_ENV = stdout;\n} catch (err) {\n if (err instanceof VarlockExecError && err.stderr) {\n process.stderr.write(err.stderr);\n } else {\n // eslint-disable-next-line no-console\n console.error(err);\n }\n process.exit((err as any).exitCode ?? 1);\n}\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"]}
1
+ {"version":3,"sources":["../src/auto-load.ts"],"names":[],"mappings":";;;;;;;AAYA,IAAI;AACF,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,eAAA,CAAgB,mCAAA,EAAqC;AAAA,IACtE,UAAA,EAAY,IAAA;AAAA;AAAA;AAAA;AAAA,IAIZ,SAAA,EAAW,YAAY,OAAA,IAAW,IAAI,IAAI,GAAA,EAAK,MAAA,CAAA,IAAA,CAAY,GAAG,CAAA,CAAE;AAAA,GACjE,CAAA;AACD,EAAA,OAAA,CAAQ,IAAI,aAAA,GAAgB,MAAA;AAC9B,CAAA,CAAA,OAAS,GAAA,EAAK;AACZ,EAAA,IAAI,GAAA,YAAe,gBAAA,IAAoB,GAAA,CAAI,MAAA,EAAQ;AACjD,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,GAAA,CAAI,MAAM,CAAA;AAAA,EACjC,CAAA,MAAO;AAEL,IAAA,OAAA,CAAQ,MAAM,GAAG,CAAA;AAAA,EACnB;AACA,EAAA,OAAA,CAAQ,IAAA,CAAM,GAAA,CAAY,QAAA,IAAY,CAAC,CAAA;AACzC;AAGA,cAAA,EAAe;AAEf,kBAAA,EAAmB;AACnB,yBAAA,EAA0B;AAC1B,mBAAA,EAAoB","file":"chunk-M6QE3D2O.js","sourcesContent":["import { execSyncVarlock, VarlockExecError } from './lib/exec-sync-varlock';\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\n\ntry {\n const { stdout } = execSyncVarlock('load --format json-full --compact', {\n fullResult: true,\n // Pass the directory of this module so that in monorepos the binary search\n // starts from inside the varlock package (e.g. apps/web/node_modules/varlock)\n // rather than from process.cwd(), which may be an unrelated workspace root.\n callerDir: import.meta.dirname ?? new URL('.', import.meta.url).pathname,\n });\n process.env.__VARLOCK_ENV = stdout;\n} catch (err) {\n if (err instanceof VarlockExecError && err.stderr) {\n process.stderr.write(err.stderr);\n } else {\n // eslint-disable-next-line no-console\n console.error(err);\n }\n process.exit((err as any).exitCode ?? 1);\n}\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"]}
@@ -1,4 +1,4 @@
1
- import { require_semver } from './chunk-6CRDPEUT.js';
1
+ import { require_semver } from './chunk-GKN3UJNE.js';
2
2
  import { __toESM, __name } from './chunk-6PEHRAEP.js';
3
3
 
4
4
  // src/lib/check-bun-version.ts
@@ -18,5 +18,5 @@ Bun ${MIN_BUN_VERSION} introduced the \`--no-env-file\` flag which is required t
18
18
  __name(checkBunVersion, "checkBunVersion");
19
19
 
20
20
  export { checkBunVersion };
21
- //# sourceMappingURL=chunk-BR3DT5Z5.js.map
22
- //# sourceMappingURL=chunk-BR3DT5Z5.js.map
21
+ //# sourceMappingURL=chunk-MPHVA4WC.js.map
22
+ //# sourceMappingURL=chunk-MPHVA4WC.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/lib/check-bun-version.ts"],"names":["semver"],"mappings":";;;;AAAA,IAAA,aAAA,GAAmB,OAAA,CAAA,cAAA,EAAA,EAAA,CAAA,CAAA;AAQZ,IAAM,eAAA,GAAkB,OAAA;AAMxB,SAAS,eAAA,GAAkB;AAChC,EAAA,MAAM,UAAA,GAAa,QAAQ,QAAA,CAAS,GAAA;AACpC,EAAA,IAAI,CAAC,UAAA,EAAY;AAEjB,EAAA,IAAI,CAAC,aAAA,CAAAA,OAAAA,CAAO,GAAA,CAAI,UAAA,EAAY,eAAe,CAAA,EAAG;AAC5C,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,wBAAA,EAA2B,eAAe,CAAA,wBAAA,EAA2B,UAAU,CAAA;AAAA;AAAA,IAAA,EAEtE,eAAe,CAAA,8GAAA;AAAA,KAE1B;AAAA,EACF;AACF;AAZgB,MAAA,CAAA,eAAA,EAAA,iBAAA,CAAA","file":"chunk-BR3DT5Z5.js","sourcesContent":["import semver from 'semver';\n\n/**\n * Minimum Bun version required for varlock to work correctly.\n * Bun v1.3.3 introduced the ability to disable built-in .env file loading\n * via `--no-env-file` flag or `env = false` in bunfig.toml, which is necessary\n * to prevent conflicts with varlock's own .env loading.\n */\nexport const MIN_BUN_VERSION = '1.3.3';\n\n/**\n * Checks if the current Bun version meets the minimum requirement.\n * Throws an error if running on an unsupported Bun version.\n */\nexport function checkBunVersion() {\n const bunVersion = process.versions.bun;\n if (!bunVersion) return;\n\n if (!semver.gte(bunVersion, MIN_BUN_VERSION)) {\n throw new Error(\n `Varlock requires Bun >= ${MIN_BUN_VERSION}, but you are using Bun ${bunVersion}.\\n`\n + 'Please upgrade Bun by running: `bun upgrade`\\n'\n + `Bun ${MIN_BUN_VERSION} introduced the \\`--no-env-file\\` flag which is required to prevent `\n + 'conflicts with varlock\\'s own .env loading.',\n );\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/lib/check-bun-version.ts"],"names":["semver"],"mappings":";;;;AAAA,IAAA,aAAA,GAAmB,OAAA,CAAA,cAAA,EAAA,EAAA,CAAA,CAAA;AAQZ,IAAM,eAAA,GAAkB,OAAA;AAMxB,SAAS,eAAA,GAAkB;AAChC,EAAA,MAAM,UAAA,GAAa,QAAQ,QAAA,CAAS,GAAA;AACpC,EAAA,IAAI,CAAC,UAAA,EAAY;AAEjB,EAAA,IAAI,CAAC,aAAA,CAAAA,OAAAA,CAAO,GAAA,CAAI,UAAA,EAAY,eAAe,CAAA,EAAG;AAC5C,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,wBAAA,EAA2B,eAAe,CAAA,wBAAA,EAA2B,UAAU,CAAA;AAAA;AAAA,IAAA,EAEtE,eAAe,CAAA,8GAAA;AAAA,KAE1B;AAAA,EACF;AACF;AAZgB,MAAA,CAAA,eAAA,EAAA,iBAAA,CAAA","file":"chunk-MPHVA4WC.js","sourcesContent":["import semver from 'semver';\n\n/**\n * Minimum Bun version required for varlock to work correctly.\n * Bun v1.3.3 introduced the ability to disable built-in .env file loading\n * via `--no-env-file` flag or `env = false` in bunfig.toml, which is necessary\n * to prevent conflicts with varlock's own .env loading.\n */\nexport const MIN_BUN_VERSION = '1.3.3';\n\n/**\n * Checks if the current Bun version meets the minimum requirement.\n * Throws an error if running on an unsupported Bun version.\n */\nexport function checkBunVersion() {\n const bunVersion = process.versions.bun;\n if (!bunVersion) return;\n\n if (!semver.gte(bunVersion, MIN_BUN_VERSION)) {\n throw new Error(\n `Varlock requires Bun >= ${MIN_BUN_VERSION}, but you are using Bun ${bunVersion}.\\n`\n + 'Please upgrade Bun by running: `bun upgrade`\\n'\n + `Bun ${MIN_BUN_VERSION} introduced the \\`--no-env-file\\` flag which is required to prevent `\n + 'conflicts with varlock\\'s own .env loading.',\n );\n }\n}\n"]}
@@ -1,11 +1,11 @@
1
1
  import { isBundledSEA } from './chunk-GXNQVEXD.js';
2
- import { detectJsPackageManager, logLines, fmt } from './chunk-6PZXN47A.js';
3
- import { define } from './chunk-4A54P4EM.js';
4
- import { loadVarlockEnvGraph } from './chunk-H2JVYUHZ.js';
2
+ import { detectJsPackageManager, logLines, fmt } from './chunk-INGOLNLE.js';
5
3
  import { gracefulExit } from './chunk-CHQDS2PI.js';
6
- import { CliExitError } from './chunk-LGEHJHB2.js';
7
- import { spawnAsync, pathExists, ansis_default } from './chunk-6CRDPEUT.js';
8
- import { my_dash_default } from './chunk-6CCHLM3U.js';
4
+ import { define } from './chunk-4A54P4EM.js';
5
+ import { loadVarlockEnvGraph } from './chunk-C5LW5EET.js';
6
+ import { CliExitError } from './chunk-JOGGSYT2.js';
7
+ import { spawnAsync, pathExists, ansis_default } from './chunk-GKN3UJNE.js';
8
+ import { my_dash_default } from './chunk-FA5SNEKN.js';
9
9
  import { redactString } from './chunk-XLYSNOR3.js';
10
10
  import { __name } from './chunk-6PEHRAEP.js';
11
11
  import path from 'path';
@@ -463,5 +463,5 @@ var commandFn = /* @__PURE__ */ __name(async (ctx) => {
463
463
  }, "commandFn");
464
464
 
465
465
  export { commandFn, commandSpec, getGitFiles, resolveTargetPaths, scanFileForValues, walkDirectory, walkDirectoryAll };
466
- //# sourceMappingURL=chunk-VIUMRSUR.js.map
467
- //# sourceMappingURL=chunk-VIUMRSUR.js.map
466
+ //# sourceMappingURL=chunk-NW4KR67N.js.map
467
+ //# sourceMappingURL=chunk-NW4KR67N.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli/commands/scan.command.ts"],"names":[],"mappings":"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","file":"chunk-VIUMRSUR.js","sourcesContent":["import path from 'node:path';\nimport fs from 'node:fs/promises';\nimport { define } from 'gunshi';\nimport ansis from 'ansis';\nimport { gracefulExit } from 'exit-hook';\nimport _ from '@env-spec/utils/my-dash';\n\nimport { spawnAsync } from '@env-spec/utils/exec-helpers';\nimport { pathExists } from '@env-spec/utils/fs-utils';\nimport { redactString } from '../../runtime/lib/redaction';\nimport { type TypedGunshiCommandFn } from '../helpers/gunshi-type-utils';\nimport { CliExitError } from '../helpers/exit-error';\nimport { fmt, logLines } from '../helpers/pretty-format';\nimport { detectJsPackageManager } from '../helpers/js-package-manager-utils';\nimport { isBundledSEA } from '../helpers/install-detection';\nimport { loadVarlockEnvGraph } from '../../lib/load-graph';\n\n// Directories to always skip when walking the file tree\nconst SKIP_DIRS = new Set([\n '.git',\n 'node_modules',\n 'dist',\n 'build',\n '.next',\n '.nuxt',\n 'vendor',\n '.venv',\n 'venv',\n '__pycache__',\n '.turbo',\n 'coverage',\n]);\n\n// File extensions that are binary and should be skipped\nconst BINARY_EXTENSIONS = new Set([\n '.png',\n '.jpg',\n '.jpeg',\n '.gif',\n '.bmp',\n '.ico',\n '.mp3',\n '.mp4',\n '.wav',\n '.avi',\n '.mov',\n '.zip',\n '.tar',\n '.gz',\n '.rar',\n '.7z',\n '.exe',\n '.dll',\n '.so',\n '.dylib',\n '.bin',\n '.pdf',\n '.doc',\n '.docx',\n '.xls',\n '.xlsx',\n '.woff',\n '.woff2',\n '.ttf',\n '.eot',\n '.pyc',\n '.class',\n '.o',\n]);\n\nexport const commandSpec = define({\n name: 'scan',\n description: 'Scan files for sensitive config values that should not be in plaintext',\n args: {\n staged: {\n type: 'boolean',\n description: 'Only scan staged git files',\n },\n 'include-ignored': {\n type: 'boolean',\n description: 'Include git-ignored files in the scan',\n },\n 'install-hook': {\n type: 'boolean',\n description: 'Set up varlock scan as a git pre-commit hook',\n },\n path: {\n type: 'string',\n short: 'p',\n multiple: true,\n description: 'Path to a specific .env file (e.g. .env.prod) or directory ending with \"/\" to use as the schema entry point (can be specified multiple times)',\n },\n },\n examples: `\nLoads your varlock config, resolves all sensitive values, then scans files to\nensure none of those sensitive values appear in plaintext.\n\nExamples:\n varlock scan # Scan non-git-ignored files in current directory\n varlock scan --staged # Only scan staged git files\n varlock scan --include-ignored # Scan all files, including git-ignored ones\n varlock scan --path .env.prod # Use a specific .env file as the schema entry point\n varlock scan -p ./envs -p ./overrides # Use multiple schema entry points\n varlock scan --install-hook # Set up as a git pre-commit hook\n varlock scan ./dist # Scan a specific directory (e.g. a build output folder)\n varlock scan ./dist ./public # Scan multiple directories\n varlock scan './dist/**/*.js' # Scan files matching a glob pattern\n `.trim(),\n});\n\nexport interface ScanFinding {\n filePath: string;\n lineNumber: number;\n columnNumber: number;\n line: string;\n sensitiveKeyName: string;\n sensitiveValue: string;\n}\n\nexport async function getGitFiles(cwd: string, onlyStaged: boolean): Promise<Array<string> | null> {\n try {\n let output: string;\n if (onlyStaged) {\n output = await spawnAsync(\n 'git',\n ['diff', '--cached', '--name-only', '-z', '--diff-filter=ACMR'],\n { cwd },\n );\n } else {\n output = await spawnAsync(\n 'git',\n ['ls-files', '--cached', '--others', '--exclude-standard', '-z'],\n { cwd },\n );\n }\n return output.split('\\0').filter(Boolean)\n .filter((f) => !BINARY_EXTENSIONS.has(path.extname(f).toLowerCase()))\n .map((f) => path.resolve(cwd, f));\n } catch {\n return null;\n }\n}\n\nexport async function walkDirectory(dir: string): Promise<Array<string>> {\n const files: Array<string> = [];\n let entries;\n try {\n entries = await fs.readdir(dir, { withFileTypes: true });\n } catch {\n return files;\n }\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n if (SKIP_DIRS.has(entry.name)) continue;\n files.push(...await walkDirectory(fullPath));\n } else if (entry.isFile()) {\n const ext = path.extname(entry.name).toLowerCase();\n if (BINARY_EXTENSIONS.has(ext)) continue;\n files.push(fullPath);\n }\n }\n return files;\n}\n\n/**\n * Like walkDirectory but does NOT skip entries in SKIP_DIRS.\n * Used when users explicitly pass a target directory to scan\n * (e.g. a build output folder like `dist` or `.next`).\n */\nexport async function walkDirectoryAll(dir: string): Promise<Array<string>> {\n const files: Array<string> = [];\n let entries;\n try {\n entries = await fs.readdir(dir, { withFileTypes: true });\n } catch {\n return files;\n }\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n files.push(...await walkDirectoryAll(fullPath));\n } else if (entry.isFile()) {\n const ext = path.extname(entry.name).toLowerCase();\n if (BINARY_EXTENSIONS.has(ext)) continue;\n files.push(fullPath);\n }\n }\n return files;\n}\n\nconst GLOB_CHARS = /[*?{}[\\]]/;\n\n/**\n * Resolves an array of path/glob strings (as provided by the user on the CLI)\n * into a deduplicated list of absolute file paths to scan.\n *\n * - Glob patterns (containing `*`, `?`, `{`, `[`) are expanded with `fs.glob`.\n * - Explicit directories are walked (without skipping build-output dirs).\n * - Explicit files are included directly (if not a binary extension).\n */\nexport async function resolveTargetPaths(targets: Array<string>, cwd: string): Promise<Array<string>> {\n const seen = new Set<string>();\n const files: Array<string> = [];\n\n async function addFile(absPath: string) {\n if (seen.has(absPath)) return;\n seen.add(absPath);\n files.push(absPath);\n }\n\n async function addPath(absPath: string) {\n let stat;\n try {\n stat = await fs.stat(absPath);\n } catch {\n return; // path doesn't exist — silently skip\n }\n if (stat.isDirectory()) {\n for (const f of await walkDirectoryAll(absPath)) {\n await addFile(f);\n }\n } else if (stat.isFile()) {\n const ext = path.extname(absPath).toLowerCase();\n if (!BINARY_EXTENSIONS.has(ext)) {\n await addFile(absPath);\n }\n }\n }\n\n for (const target of targets) {\n if (GLOB_CHARS.test(target)) {\n // Expand glob pattern; paths returned by fsGlob are relative to cwd\n for await (const match of fs.glob(target, { cwd })) {\n await addPath(path.resolve(cwd, match));\n }\n } else {\n await addPath(path.resolve(cwd, target));\n }\n }\n\n return files;\n}\n\n/**\n * Scans a single file for occurrences of any of the provided sensitive values.\n * sensitiveValues is a map from env key name to its resolved string value.\n */\nexport async function scanFileForValues(\n filePath: string,\n sensitiveValues: Map<string, string>,\n): Promise<Array<ScanFinding>> {\n const findings: Array<ScanFinding> = [];\n let content: string;\n try {\n content = await fs.readFile(filePath, 'utf-8');\n } catch {\n return findings;\n }\n\n // Skip binary files (contain null bytes)\n if (content.includes('\\0')) return findings;\n\n // Quick pre-check: skip the file entirely if none of the values appear\n let anyMatch = false;\n for (const val of sensitiveValues.values()) {\n if (content.includes(val)) {\n anyMatch = true;\n break;\n }\n }\n if (!anyMatch) return findings;\n\n const lines = content.split('\\n');\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n for (const [keyName, val] of sensitiveValues) {\n const colIdx = line.indexOf(val);\n if (colIdx !== -1) {\n findings.push({\n filePath,\n lineNumber: i + 1,\n columnNumber: colIdx + 1,\n line: line.trim(),\n sensitiveKeyName: keyName,\n sensitiveValue: val,\n });\n break; // one finding per line is enough\n }\n }\n }\n return findings;\n}\n\nconst SCAN_COMMAND = 'varlock scan';\n\n/**\n * Determines the correct command to use in a git hook script.\n * If varlock is installed as a standalone binary, uses `varlock` directly.\n * Otherwise, prefixes with the detected JS package manager's exec command.\n */\nfunction getHookCommand(): string {\n if (isBundledSEA()) return SCAN_COMMAND;\n const pm = detectJsPackageManager();\n if (pm) return `${pm.exec} ${SCAN_COMMAND}`;\n // fallback - assume varlock is available on PATH\n return SCAN_COMMAND;\n}\n\ntype HookManagerKind = 'husky' | 'lefthook' | 'simple-git-hooks';\n\nasync function detectHookManager(cwd: string): Promise<HookManagerKind | null> {\n // Check for husky\n if (await pathExists(path.join(cwd, '.husky'))) return 'husky';\n\n // Check for lefthook config files\n const lefthookFiles = ['lefthook.yml', 'lefthook.yaml', '.lefthook.yml', '.lefthook.yaml'];\n for (const file of lefthookFiles) {\n if (await pathExists(path.join(cwd, file))) return 'lefthook';\n }\n\n // Check for simple-git-hooks in package.json\n const pkgJsonPath = path.join(cwd, 'package.json');\n if (await pathExists(pkgJsonPath)) {\n try {\n const pkgJson = JSON.parse(await fs.readFile(pkgJsonPath, 'utf-8'));\n if (pkgJson['simple-git-hooks']) return 'simple-git-hooks';\n } catch { /* ignore parse errors */ }\n }\n\n return null;\n}\n\nasync function findGitRoot(cwd: string): Promise<string | null> {\n try {\n const root = await spawnAsync('git', ['rev-parse', '--show-toplevel'], { cwd });\n return root.trim();\n } catch {\n return null;\n }\n}\n\nasync function installHook(cwd: string): Promise<void> {\n const gitRoot = await findGitRoot(cwd);\n if (!gitRoot) {\n throw new CliExitError('Not inside a git repository', {\n suggestion: 'Run `git init` first, or make sure you are inside a git repository.',\n });\n }\n\n const hookCommand = getHookCommand();\n const hookScript = `#!/bin/sh\\n${hookCommand}\\n`;\n const hookManager = await detectHookManager(gitRoot);\n\n if (hookManager === 'husky') {\n logLines([\n '',\n `Detected ${ansis.bold('husky')} as your git hook manager.`,\n '',\n `Add ${ansis.bold(hookCommand)} to your pre-commit hook:`,\n '',\n ansis.dim(` echo \"${hookCommand}\" >> .husky/pre-commit`),\n '',\n 'Or if creating a new hook:',\n '',\n ansis.dim(` echo \"${hookCommand}\" > .husky/pre-commit`),\n '',\n ]);\n return;\n }\n\n if (hookManager === 'lefthook') {\n logLines([\n '',\n `Detected ${ansis.bold('lefthook')} as your git hook manager.`,\n '',\n 'Add the following to your lefthook config:',\n '',\n ansis.dim(' pre-commit:'),\n ansis.dim(' commands:'),\n ansis.dim(' varlock-scan:'),\n ansis.dim(` run: ${hookCommand}`),\n '',\n ]);\n return;\n }\n\n if (hookManager === 'simple-git-hooks') {\n logLines([\n '',\n `Detected ${ansis.bold('simple-git-hooks')} in your package.json.`,\n '',\n 'Add the following to your package.json:',\n '',\n ansis.dim(' \"simple-git-hooks\": {'),\n ansis.dim(` \"pre-commit\": \"${hookCommand}\"`),\n ansis.dim(' }'),\n '',\n `Then run ${ansis.dim('npx simple-git-hooks')} to update the hooks.`,\n '',\n ]);\n return;\n }\n\n // No hook manager detected -- install directly to .git/hooks/pre-commit\n const hooksDir = path.join(gitRoot, '.git', 'hooks');\n const hookPath = path.join(hooksDir, 'pre-commit');\n\n // Ensure hooks directory exists\n await fs.mkdir(hooksDir, { recursive: true });\n\n // Check if a pre-commit hook already exists\n if (await pathExists(hookPath)) {\n const existingContent = await fs.readFile(hookPath, 'utf-8');\n if (existingContent.includes(SCAN_COMMAND)) {\n logLines([\n '',\n ansis.green(`The pre-commit hook already includes ${ansis.bold(SCAN_COMMAND)} - nothing to do!`),\n '',\n ]);\n return;\n }\n // Append to existing hook\n const updatedContent = `${existingContent.trimEnd()}\\n${hookCommand}\\n`;\n await fs.writeFile(hookPath, updatedContent);\n await fs.chmod(hookPath, 0o755);\n logLines([\n '',\n ansis.green(`Added ${ansis.bold(hookCommand)} to existing pre-commit hook.`),\n fmt.filePath(hookPath),\n '',\n ]);\n return;\n }\n\n // Create new hook\n await fs.writeFile(hookPath, hookScript);\n await fs.chmod(hookPath, 0o755);\n logLines([\n '',\n ansis.green(`Created pre-commit hook at ${fmt.filePath(hookPath)}`),\n ansis.dim('Your staged files will now be scanned for sensitive values before each commit.'),\n '',\n ]);\n}\n\nexport const commandFn: TypedGunshiCommandFn<typeof commandSpec> = async (ctx) => {\n // Handle --install-hook before doing any scanning\n if (ctx.values['install-hook']) {\n await installHook(process.cwd());\n return;\n }\n\n const onlyStaged = ctx.values.staged ?? false;\n const includeIgnored = ctx.values['include-ignored'] ?? false;\n\n // Positional arguments are treated as explicit paths/globs to scan\n const scanTargets = (ctx.positionals ?? []).slice(ctx.commandPath?.length ?? 0);\n\n // Load the varlock env graph to get the actual sensitive values\n const envGraph = await loadVarlockEnvGraph({\n entryFilePaths: ctx.values.path,\n });\n\n // Check for loading/schema errors\n for (const source of envGraph.sortedDataSources) {\n if (source.loadingError) {\n throw new CliExitError(`Error loading config: ${source.loadingError.message}`, {\n suggestion: 'Make sure your .env.schema file is valid.',\n });\n }\n }\n\n await envGraph.resolveEnvValues();\n\n // Collect all sensitive string values that are non-empty\n const sensitiveValues = new Map<string, string>();\n for (const itemKey in envGraph.configSchema) {\n const item = envGraph.configSchema[itemKey];\n if (item.isSensitive && _.isString(item.resolvedValue) && item.resolvedValue !== '') {\n sensitiveValues.set(itemKey, item.resolvedValue);\n }\n }\n\n if (sensitiveValues.size === 0) {\n logLines([ansis.green('✅ No sensitive values found in config - nothing to scan for.')]);\n return;\n }\n\n const cwd = process.cwd();\n let files: Array<string>;\n\n if (scanTargets.length > 0) {\n // Explicit paths/globs provided — scan only those targets.\n // We skip git-aware filtering so the user gets exactly what they asked for,\n // and we do NOT apply SKIP_DIRS (e.g. `dist`, `.next`) since the whole point\n // is often to scan a build output directory.\n files = await resolveTargetPaths(scanTargets, cwd);\n } else if (includeIgnored) {\n // Walk the full directory tree, no git filtering\n files = await walkDirectory(cwd);\n } else {\n // Try to use git to get non-ignored files\n const gitFiles = await getGitFiles(cwd, onlyStaged);\n if (gitFiles !== null) {\n files = gitFiles;\n } else {\n // Git not available - fall back to walking directory\n if (onlyStaged) {\n throw new CliExitError('Could not run git to find staged files', {\n suggestion: 'Make sure git is installed and you are inside a git repository.',\n });\n }\n files = await walkDirectory(cwd);\n }\n }\n\n if (files.length === 0) {\n if (scanTargets.length > 0) {\n console.log(ansis.green('✅ No files found at the specified path(s).'));\n } else if (onlyStaged) {\n console.log('No staged files to scan.');\n } else {\n console.log(ansis.green('✅ No files found to scan.'));\n }\n return;\n }\n\n const allFindings: Array<ScanFinding> = [];\n for (const filePath of files) {\n const findings = await scanFileForValues(filePath, sensitiveValues);\n allFindings.push(...findings);\n }\n\n if (allFindings.length === 0) {\n logLines([ansis.green(`✅ No sensitive values found in plaintext. (scanned ${files.length} file${files.length === 1 ? '' : 's'})`)]);\n return;\n }\n\n // Group findings by file for display\n const findingsByFile = new Map<string, Array<ScanFinding>>();\n for (const finding of allFindings) {\n const existing = findingsByFile.get(finding.filePath) ?? [];\n existing.push(finding);\n findingsByFile.set(finding.filePath, existing);\n }\n\n console.error(ansis.red(`\\n🚨 Found ${allFindings.length} sensitive value(s) in plaintext across ${findingsByFile.size} file(s):\\n`));\n for (const [filePath, findings] of findingsByFile) {\n const relPath = path.relative(cwd, filePath);\n for (const finding of findings) {\n // Redact the actual secret value in the displayed line\n const redactedLine = finding.line.replaceAll(finding.sensitiveValue, redactString(finding.sensitiveValue)!);\n const truncatedLine = redactedLine.length > 100\n ? `${redactedLine.substring(0, 100)}…`\n : redactedLine;\n console.error(` ${fmt.fileName(`${relPath}:${finding.lineNumber}:${finding.columnNumber}`)} ${ansis.yellow(finding.sensitiveKeyName)}`);\n console.error(` ${ansis.dim(truncatedLine)}`);\n }\n console.error('');\n }\n\n gracefulExit(1);\n};\n"]}
1
+ {"version":3,"sources":["../src/cli/commands/scan.command.ts"],"names":[],"mappings":"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","file":"chunk-NW4KR67N.js","sourcesContent":["import path from 'node:path';\nimport fs from 'node:fs/promises';\nimport { define } from 'gunshi';\nimport ansis from 'ansis';\nimport { gracefulExit } from 'exit-hook';\nimport _ from '@env-spec/utils/my-dash';\n\nimport { spawnAsync } from '@env-spec/utils/exec-helpers';\nimport { pathExists } from '@env-spec/utils/fs-utils';\nimport { redactString } from '../../runtime/lib/redaction';\nimport { type TypedGunshiCommandFn } from '../helpers/gunshi-type-utils';\nimport { CliExitError } from '../helpers/exit-error';\nimport { fmt, logLines } from '../helpers/pretty-format';\nimport { detectJsPackageManager } from '../helpers/js-package-manager-utils';\nimport { isBundledSEA } from '../helpers/install-detection';\nimport { loadVarlockEnvGraph } from '../../lib/load-graph';\n\n// Directories to always skip when walking the file tree\nconst SKIP_DIRS = new Set([\n '.git',\n 'node_modules',\n 'dist',\n 'build',\n '.next',\n '.nuxt',\n 'vendor',\n '.venv',\n 'venv',\n '__pycache__',\n '.turbo',\n 'coverage',\n]);\n\n// File extensions that are binary and should be skipped\nconst BINARY_EXTENSIONS = new Set([\n '.png',\n '.jpg',\n '.jpeg',\n '.gif',\n '.bmp',\n '.ico',\n '.mp3',\n '.mp4',\n '.wav',\n '.avi',\n '.mov',\n '.zip',\n '.tar',\n '.gz',\n '.rar',\n '.7z',\n '.exe',\n '.dll',\n '.so',\n '.dylib',\n '.bin',\n '.pdf',\n '.doc',\n '.docx',\n '.xls',\n '.xlsx',\n '.woff',\n '.woff2',\n '.ttf',\n '.eot',\n '.pyc',\n '.class',\n '.o',\n]);\n\nexport const commandSpec = define({\n name: 'scan',\n description: 'Scan files for sensitive config values that should not be in plaintext',\n args: {\n staged: {\n type: 'boolean',\n description: 'Only scan staged git files',\n },\n 'include-ignored': {\n type: 'boolean',\n description: 'Include git-ignored files in the scan',\n },\n 'install-hook': {\n type: 'boolean',\n description: 'Set up varlock scan as a git pre-commit hook',\n },\n path: {\n type: 'string',\n short: 'p',\n multiple: true,\n description: 'Path to a specific .env file (e.g. .env.prod) or directory ending with \"/\" to use as the schema entry point (can be specified multiple times)',\n },\n },\n examples: `\nLoads your varlock config, resolves all sensitive values, then scans files to\nensure none of those sensitive values appear in plaintext.\n\nExamples:\n varlock scan # Scan non-git-ignored files in current directory\n varlock scan --staged # Only scan staged git files\n varlock scan --include-ignored # Scan all files, including git-ignored ones\n varlock scan --path .env.prod # Use a specific .env file as the schema entry point\n varlock scan -p ./envs -p ./overrides # Use multiple schema entry points\n varlock scan --install-hook # Set up as a git pre-commit hook\n varlock scan ./dist # Scan a specific directory (e.g. a build output folder)\n varlock scan ./dist ./public # Scan multiple directories\n varlock scan './dist/**/*.js' # Scan files matching a glob pattern\n `.trim(),\n});\n\nexport interface ScanFinding {\n filePath: string;\n lineNumber: number;\n columnNumber: number;\n line: string;\n sensitiveKeyName: string;\n sensitiveValue: string;\n}\n\nexport async function getGitFiles(cwd: string, onlyStaged: boolean): Promise<Array<string> | null> {\n try {\n let output: string;\n if (onlyStaged) {\n output = await spawnAsync(\n 'git',\n ['diff', '--cached', '--name-only', '-z', '--diff-filter=ACMR'],\n { cwd },\n );\n } else {\n output = await spawnAsync(\n 'git',\n ['ls-files', '--cached', '--others', '--exclude-standard', '-z'],\n { cwd },\n );\n }\n return output.split('\\0').filter(Boolean)\n .filter((f) => !BINARY_EXTENSIONS.has(path.extname(f).toLowerCase()))\n .map((f) => path.resolve(cwd, f));\n } catch {\n return null;\n }\n}\n\nexport async function walkDirectory(dir: string): Promise<Array<string>> {\n const files: Array<string> = [];\n let entries;\n try {\n entries = await fs.readdir(dir, { withFileTypes: true });\n } catch {\n return files;\n }\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n if (SKIP_DIRS.has(entry.name)) continue;\n files.push(...await walkDirectory(fullPath));\n } else if (entry.isFile()) {\n const ext = path.extname(entry.name).toLowerCase();\n if (BINARY_EXTENSIONS.has(ext)) continue;\n files.push(fullPath);\n }\n }\n return files;\n}\n\n/**\n * Like walkDirectory but does NOT skip entries in SKIP_DIRS.\n * Used when users explicitly pass a target directory to scan\n * (e.g. a build output folder like `dist` or `.next`).\n */\nexport async function walkDirectoryAll(dir: string): Promise<Array<string>> {\n const files: Array<string> = [];\n let entries;\n try {\n entries = await fs.readdir(dir, { withFileTypes: true });\n } catch {\n return files;\n }\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n files.push(...await walkDirectoryAll(fullPath));\n } else if (entry.isFile()) {\n const ext = path.extname(entry.name).toLowerCase();\n if (BINARY_EXTENSIONS.has(ext)) continue;\n files.push(fullPath);\n }\n }\n return files;\n}\n\nconst GLOB_CHARS = /[*?{}[\\]]/;\n\n/**\n * Resolves an array of path/glob strings (as provided by the user on the CLI)\n * into a deduplicated list of absolute file paths to scan.\n *\n * - Glob patterns (containing `*`, `?`, `{`, `[`) are expanded with `fs.glob`.\n * - Explicit directories are walked (without skipping build-output dirs).\n * - Explicit files are included directly (if not a binary extension).\n */\nexport async function resolveTargetPaths(targets: Array<string>, cwd: string): Promise<Array<string>> {\n const seen = new Set<string>();\n const files: Array<string> = [];\n\n async function addFile(absPath: string) {\n if (seen.has(absPath)) return;\n seen.add(absPath);\n files.push(absPath);\n }\n\n async function addPath(absPath: string) {\n let stat;\n try {\n stat = await fs.stat(absPath);\n } catch {\n return; // path doesn't exist — silently skip\n }\n if (stat.isDirectory()) {\n for (const f of await walkDirectoryAll(absPath)) {\n await addFile(f);\n }\n } else if (stat.isFile()) {\n const ext = path.extname(absPath).toLowerCase();\n if (!BINARY_EXTENSIONS.has(ext)) {\n await addFile(absPath);\n }\n }\n }\n\n for (const target of targets) {\n if (GLOB_CHARS.test(target)) {\n // Expand glob pattern; paths returned by fsGlob are relative to cwd\n for await (const match of fs.glob(target, { cwd })) {\n await addPath(path.resolve(cwd, match));\n }\n } else {\n await addPath(path.resolve(cwd, target));\n }\n }\n\n return files;\n}\n\n/**\n * Scans a single file for occurrences of any of the provided sensitive values.\n * sensitiveValues is a map from env key name to its resolved string value.\n */\nexport async function scanFileForValues(\n filePath: string,\n sensitiveValues: Map<string, string>,\n): Promise<Array<ScanFinding>> {\n const findings: Array<ScanFinding> = [];\n let content: string;\n try {\n content = await fs.readFile(filePath, 'utf-8');\n } catch {\n return findings;\n }\n\n // Skip binary files (contain null bytes)\n if (content.includes('\\0')) return findings;\n\n // Quick pre-check: skip the file entirely if none of the values appear\n let anyMatch = false;\n for (const val of sensitiveValues.values()) {\n if (content.includes(val)) {\n anyMatch = true;\n break;\n }\n }\n if (!anyMatch) return findings;\n\n const lines = content.split('\\n');\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n for (const [keyName, val] of sensitiveValues) {\n const colIdx = line.indexOf(val);\n if (colIdx !== -1) {\n findings.push({\n filePath,\n lineNumber: i + 1,\n columnNumber: colIdx + 1,\n line: line.trim(),\n sensitiveKeyName: keyName,\n sensitiveValue: val,\n });\n break; // one finding per line is enough\n }\n }\n }\n return findings;\n}\n\nconst SCAN_COMMAND = 'varlock scan';\n\n/**\n * Determines the correct command to use in a git hook script.\n * If varlock is installed as a standalone binary, uses `varlock` directly.\n * Otherwise, prefixes with the detected JS package manager's exec command.\n */\nfunction getHookCommand(): string {\n if (isBundledSEA()) return SCAN_COMMAND;\n const pm = detectJsPackageManager();\n if (pm) return `${pm.exec} ${SCAN_COMMAND}`;\n // fallback - assume varlock is available on PATH\n return SCAN_COMMAND;\n}\n\ntype HookManagerKind = 'husky' | 'lefthook' | 'simple-git-hooks';\n\nasync function detectHookManager(cwd: string): Promise<HookManagerKind | null> {\n // Check for husky\n if (await pathExists(path.join(cwd, '.husky'))) return 'husky';\n\n // Check for lefthook config files\n const lefthookFiles = ['lefthook.yml', 'lefthook.yaml', '.lefthook.yml', '.lefthook.yaml'];\n for (const file of lefthookFiles) {\n if (await pathExists(path.join(cwd, file))) return 'lefthook';\n }\n\n // Check for simple-git-hooks in package.json\n const pkgJsonPath = path.join(cwd, 'package.json');\n if (await pathExists(pkgJsonPath)) {\n try {\n const pkgJson = JSON.parse(await fs.readFile(pkgJsonPath, 'utf-8'));\n if (pkgJson['simple-git-hooks']) return 'simple-git-hooks';\n } catch { /* ignore parse errors */ }\n }\n\n return null;\n}\n\nasync function findGitRoot(cwd: string): Promise<string | null> {\n try {\n const root = await spawnAsync('git', ['rev-parse', '--show-toplevel'], { cwd });\n return root.trim();\n } catch {\n return null;\n }\n}\n\nasync function installHook(cwd: string): Promise<void> {\n const gitRoot = await findGitRoot(cwd);\n if (!gitRoot) {\n throw new CliExitError('Not inside a git repository', {\n suggestion: 'Run `git init` first, or make sure you are inside a git repository.',\n });\n }\n\n const hookCommand = getHookCommand();\n const hookScript = `#!/bin/sh\\n${hookCommand}\\n`;\n const hookManager = await detectHookManager(gitRoot);\n\n if (hookManager === 'husky') {\n logLines([\n '',\n `Detected ${ansis.bold('husky')} as your git hook manager.`,\n '',\n `Add ${ansis.bold(hookCommand)} to your pre-commit hook:`,\n '',\n ansis.dim(` echo \"${hookCommand}\" >> .husky/pre-commit`),\n '',\n 'Or if creating a new hook:',\n '',\n ansis.dim(` echo \"${hookCommand}\" > .husky/pre-commit`),\n '',\n ]);\n return;\n }\n\n if (hookManager === 'lefthook') {\n logLines([\n '',\n `Detected ${ansis.bold('lefthook')} as your git hook manager.`,\n '',\n 'Add the following to your lefthook config:',\n '',\n ansis.dim(' pre-commit:'),\n ansis.dim(' commands:'),\n ansis.dim(' varlock-scan:'),\n ansis.dim(` run: ${hookCommand}`),\n '',\n ]);\n return;\n }\n\n if (hookManager === 'simple-git-hooks') {\n logLines([\n '',\n `Detected ${ansis.bold('simple-git-hooks')} in your package.json.`,\n '',\n 'Add the following to your package.json:',\n '',\n ansis.dim(' \"simple-git-hooks\": {'),\n ansis.dim(` \"pre-commit\": \"${hookCommand}\"`),\n ansis.dim(' }'),\n '',\n `Then run ${ansis.dim('npx simple-git-hooks')} to update the hooks.`,\n '',\n ]);\n return;\n }\n\n // No hook manager detected -- install directly to .git/hooks/pre-commit\n const hooksDir = path.join(gitRoot, '.git', 'hooks');\n const hookPath = path.join(hooksDir, 'pre-commit');\n\n // Ensure hooks directory exists\n await fs.mkdir(hooksDir, { recursive: true });\n\n // Check if a pre-commit hook already exists\n if (await pathExists(hookPath)) {\n const existingContent = await fs.readFile(hookPath, 'utf-8');\n if (existingContent.includes(SCAN_COMMAND)) {\n logLines([\n '',\n ansis.green(`The pre-commit hook already includes ${ansis.bold(SCAN_COMMAND)} - nothing to do!`),\n '',\n ]);\n return;\n }\n // Append to existing hook\n const updatedContent = `${existingContent.trimEnd()}\\n${hookCommand}\\n`;\n await fs.writeFile(hookPath, updatedContent);\n await fs.chmod(hookPath, 0o755);\n logLines([\n '',\n ansis.green(`Added ${ansis.bold(hookCommand)} to existing pre-commit hook.`),\n fmt.filePath(hookPath),\n '',\n ]);\n return;\n }\n\n // Create new hook\n await fs.writeFile(hookPath, hookScript);\n await fs.chmod(hookPath, 0o755);\n logLines([\n '',\n ansis.green(`Created pre-commit hook at ${fmt.filePath(hookPath)}`),\n ansis.dim('Your staged files will now be scanned for sensitive values before each commit.'),\n '',\n ]);\n}\n\nexport const commandFn: TypedGunshiCommandFn<typeof commandSpec> = async (ctx) => {\n // Handle --install-hook before doing any scanning\n if (ctx.values['install-hook']) {\n await installHook(process.cwd());\n return;\n }\n\n const onlyStaged = ctx.values.staged ?? false;\n const includeIgnored = ctx.values['include-ignored'] ?? false;\n\n // Positional arguments are treated as explicit paths/globs to scan\n const scanTargets = (ctx.positionals ?? []).slice(ctx.commandPath?.length ?? 0);\n\n // Load the varlock env graph to get the actual sensitive values\n const envGraph = await loadVarlockEnvGraph({\n entryFilePaths: ctx.values.path,\n });\n\n // Check for loading/schema errors\n for (const source of envGraph.sortedDataSources) {\n if (source.loadingError) {\n throw new CliExitError(`Error loading config: ${source.loadingError.message}`, {\n suggestion: 'Make sure your .env.schema file is valid.',\n });\n }\n }\n\n await envGraph.resolveEnvValues();\n\n // Collect all sensitive string values that are non-empty\n const sensitiveValues = new Map<string, string>();\n for (const itemKey in envGraph.configSchema) {\n const item = envGraph.configSchema[itemKey];\n if (item.isSensitive && _.isString(item.resolvedValue) && item.resolvedValue !== '') {\n sensitiveValues.set(itemKey, item.resolvedValue);\n }\n }\n\n if (sensitiveValues.size === 0) {\n logLines([ansis.green('✅ No sensitive values found in config - nothing to scan for.')]);\n return;\n }\n\n const cwd = process.cwd();\n let files: Array<string>;\n\n if (scanTargets.length > 0) {\n // Explicit paths/globs provided — scan only those targets.\n // We skip git-aware filtering so the user gets exactly what they asked for,\n // and we do NOT apply SKIP_DIRS (e.g. `dist`, `.next`) since the whole point\n // is often to scan a build output directory.\n files = await resolveTargetPaths(scanTargets, cwd);\n } else if (includeIgnored) {\n // Walk the full directory tree, no git filtering\n files = await walkDirectory(cwd);\n } else {\n // Try to use git to get non-ignored files\n const gitFiles = await getGitFiles(cwd, onlyStaged);\n if (gitFiles !== null) {\n files = gitFiles;\n } else {\n // Git not available - fall back to walking directory\n if (onlyStaged) {\n throw new CliExitError('Could not run git to find staged files', {\n suggestion: 'Make sure git is installed and you are inside a git repository.',\n });\n }\n files = await walkDirectory(cwd);\n }\n }\n\n if (files.length === 0) {\n if (scanTargets.length > 0) {\n console.log(ansis.green('✅ No files found at the specified path(s).'));\n } else if (onlyStaged) {\n console.log('No staged files to scan.');\n } else {\n console.log(ansis.green('✅ No files found to scan.'));\n }\n return;\n }\n\n const allFindings: Array<ScanFinding> = [];\n for (const filePath of files) {\n const findings = await scanFileForValues(filePath, sensitiveValues);\n allFindings.push(...findings);\n }\n\n if (allFindings.length === 0) {\n logLines([ansis.green(`✅ No sensitive values found in plaintext. (scanned ${files.length} file${files.length === 1 ? '' : 's'})`)]);\n return;\n }\n\n // Group findings by file for display\n const findingsByFile = new Map<string, Array<ScanFinding>>();\n for (const finding of allFindings) {\n const existing = findingsByFile.get(finding.filePath) ?? [];\n existing.push(finding);\n findingsByFile.set(finding.filePath, existing);\n }\n\n console.error(ansis.red(`\\n🚨 Found ${allFindings.length} sensitive value(s) in plaintext across ${findingsByFile.size} file(s):\\n`));\n for (const [filePath, findings] of findingsByFile) {\n const relPath = path.relative(cwd, filePath);\n for (const finding of findings) {\n // Redact the actual secret value in the displayed line\n const redactedLine = finding.line.replaceAll(finding.sensitiveValue, redactString(finding.sensitiveValue)!);\n const truncatedLine = redactedLine.length > 100\n ? `${redactedLine.substring(0, 100)}…`\n : redactedLine;\n console.error(` ${fmt.fileName(`${relPath}:${finding.lineNumber}:${finding.columnNumber}`)} ${ansis.yellow(finding.sensitiveKeyName)}`);\n console.error(` ${ansis.dim(truncatedLine)}`);\n }\n console.error('');\n }\n\n gracefulExit(1);\n};\n"]}
@@ -1,10 +1,10 @@
1
- import { define } from './chunk-4A54P4EM.js';
2
- import { checkForSchemaErrors, checkForNoEnvFiles } from './chunk-45N5EFNL.js';
3
- import { loadVarlockEnvGraph } from './chunk-H2JVYUHZ.js';
4
1
  import { gracefulExit } from './chunk-CHQDS2PI.js';
5
- import { CliExitError, formattedValue } from './chunk-LGEHJHB2.js';
6
- import { StaticValueResolver, ansis_default } from './chunk-6CRDPEUT.js';
7
- import { my_dash_default } from './chunk-6CCHLM3U.js';
2
+ import { define } from './chunk-4A54P4EM.js';
3
+ import { checkForSchemaErrors, checkForNoEnvFiles } from './chunk-XUY3HAO2.js';
4
+ import { loadVarlockEnvGraph } from './chunk-C5LW5EET.js';
5
+ import { CliExitError, formattedValue } from './chunk-JOGGSYT2.js';
6
+ import { StaticValueResolver, ansis_default } from './chunk-GKN3UJNE.js';
7
+ import { my_dash_default } from './chunk-FA5SNEKN.js';
8
8
  import { redactString } from './chunk-XLYSNOR3.js';
9
9
  import { __name } from './chunk-6PEHRAEP.js';
10
10
 
@@ -159,5 +159,5 @@ var commandFn = /* @__PURE__ */ __name(async (ctx) => {
159
159
  }, "commandFn");
160
160
 
161
161
  export { commandFn, commandSpec };
162
- //# sourceMappingURL=chunk-EE4UNY25.js.map
163
- //# sourceMappingURL=chunk-EE4UNY25.js.map
162
+ //# sourceMappingURL=chunk-OGGTDFVX.js.map
163
+ //# sourceMappingURL=chunk-OGGTDFVX.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli/commands/explain.command.ts"],"names":[],"mappings":"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","file":"chunk-EE4UNY25.js","sourcesContent":["import ansis from 'ansis';\nimport { define } from 'gunshi';\nimport { gracefulExit } from 'exit-hook';\n\nimport { loadVarlockEnvGraph } from '../../lib/load-graph';\nimport { formattedValue } from '../../lib/formatting';\nimport { redactString } from '../../runtime/lib/redaction';\nimport {\n checkForSchemaErrors, checkForNoEnvFiles,\n} from '../helpers/error-checks';\nimport { type TypedGunshiCommandFn } from '../helpers/gunshi-type-utils';\nimport { CliExitError } from '../helpers/exit-error';\nimport { StaticValueResolver } from '../../env-graph/lib/resolver';\nimport _ from '@env-spec/utils/my-dash';\n\nexport const commandSpec = define({\n name: 'explain',\n description: 'Show detailed information about how a config item is resolved',\n args: {\n env: {\n type: 'string',\n description: 'Set the environment (e.g., production, development, etc)',\n },\n path: {\n type: 'string',\n short: 'p',\n multiple: true,\n description: 'Path to a specific .env file or directory to use as the entry point (can be specified multiple times)',\n },\n },\n examples: `\nShows detailed information about all definitions, sources, and overrides\nthat feed into a single config item. Useful for debugging why a value\nis not what you expect.\n\nExamples:\n varlock explain DATABASE_URL # Explain how DATABASE_URL is resolved\n varlock explain --env production API_KEY # Explain in production context\n`.trim(),\n});\n\nfunction describeResolver(resolver: any, indent = ''): string {\n if (resolver instanceof StaticValueResolver) {\n return `${indent}static value`;\n }\n const fnName = resolver.fnName;\n if (fnName && !fnName.startsWith('\\0')) {\n return `${indent}${fnName}()`;\n }\n return `${indent}(resolver)`;\n}\n\nexport const commandFn: TypedGunshiCommandFn<typeof commandSpec> = async (ctx) => {\n const positionals = (ctx.positionals ?? []).slice(ctx.commandPath?.length ?? 0);\n if (!positionals.length) {\n throw new CliExitError('Missing required argument: variable name', {\n suggestion: 'Run `varlock explain MY_VAR` to explain a config item',\n });\n }\n const varName = positionals[0];\n\n const envGraph = await loadVarlockEnvGraph({\n currentEnvFallback: ctx.values.env,\n entryFilePaths: ctx.values.path,\n });\n\n checkForSchemaErrors(envGraph);\n checkForNoEnvFiles(envGraph);\n\n if (!(varName in envGraph.configSchema)) {\n throw new CliExitError(`Variable \"${varName}\" not found in schema`);\n }\n\n await envGraph.resolveEnvValues();\n\n const item = envGraph.configSchema[varName];\n const isSensitive = item.isSensitive;\n\n // Header\n console.log('');\n console.log(ansis.bold.cyan(` ${item.key}`));\n console.log('');\n\n // Description\n if (item.description) {\n console.log(` ${ansis.gray('Description:')} ${item.description}`);\n }\n\n // Type info\n if (item.dataType) {\n console.log(` ${ansis.gray('Type:')} ${item.dataType.name}`);\n }\n\n // Properties\n const props = [];\n if (item.isRequired) props.push('required');\n else props.push('optional');\n if (isSensitive) props.push('sensitive');\n else props.push('public');\n console.log(` ${ansis.gray('Properties:')} ${props.join(', ')}`);\n\n // Resolved value\n console.log('');\n console.log(ansis.bold(' Resolved value'));\n if (item.validationState === 'error') {\n console.log(` ${ansis.red(' (resolution failed)')}`);\n for (const err of item.errors) {\n console.log(` ${ansis.red(` - ${err.message}`)}`);\n }\n } else {\n let valStr = formattedValue(item.resolvedValue, true);\n if (isSensitive && item.resolvedValue && _.isString(item.resolvedValue)) {\n valStr = redactString(item.resolvedValue)!;\n }\n console.log(` ${valStr}`);\n if (item.isCoerced) {\n let rawStr = formattedValue(item.resolvedRawValue, true);\n if (isSensitive && item.resolvedRawValue && _.isString(item.resolvedRawValue)) {\n rawStr = redactString(item.resolvedRawValue)!;\n }\n console.log(` ${ansis.gray.italic(`coerced from ${rawStr}`)}`);\n }\n }\n\n // Value source\n console.log('');\n console.log(ansis.bold(' Value source'));\n\n if (item.isOverridden) {\n console.log(` ${ansis.yellow('⚡ process.env override')} ${ansis.yellow.bold('(active)')}`);\n const activeValueDef = item.activeValueDef;\n if (activeValueDef) {\n const sourceLabel = activeValueDef.source?.label || 'internal';\n const resolverDesc = activeValueDef.itemDef.resolver\n ? describeResolver(activeValueDef.itemDef.resolver)\n : 'no value';\n console.log(` ${ansis.gray('└')} ${ansis.gray.italic(`would use ${resolverDesc} from ${sourceLabel} without override`)}`);\n }\n } else {\n const activeValueDef = item.activeValueDef;\n if (activeValueDef) {\n const sourceLabel = activeValueDef.source?.label || 'internal';\n const resolverDesc = activeValueDef.itemDef.resolver\n ? describeResolver(activeValueDef.itemDef.resolver)\n : 'no value';\n console.log(` ${resolverDesc} from ${ansis.cyan(sourceLabel)}`);\n } else {\n console.log(` ${ansis.gray('(no value set)')}`);\n }\n }\n\n // All definitions\n const defs = item.defs;\n if (defs.length) {\n console.log('');\n console.log(ansis.bold(' All definitions') + ansis.gray(` (${defs.length} source${defs.length > 1 ? 's' : ''}, highest priority first)`));\n\n for (let i = 0; i < defs.length; i++) {\n const def = defs[i];\n const sourceLabel = def.source?.label || 'internal (builtin)';\n const sourceType = def.source?.type || 'builtin';\n\n const isActiveSource = !item.isOverridden && def === item.activeValueDef;\n const marker = isActiveSource ? ansis.green(' ← active') : '';\n\n console.log(` ${ansis.gray(`${i + 1}.`)} ${ansis.cyan(sourceLabel)} ${ansis.gray(`(${sourceType})`)}${marker}`);\n\n // Show resolver info\n if (def.itemDef.resolver) {\n console.log(` ${ansis.gray('value:')} ${describeResolver(def.itemDef.resolver)}`);\n } else {\n console.log(` ${ansis.gray('value:')} ${ansis.gray.italic('(none - decorators only)')}`);\n }\n\n // Show decorators from this definition\n const decNames = def.itemDef.decorators?.map((d) => `@${d.name}`).join(', ');\n if (decNames) {\n console.log(` ${ansis.gray('decorators:')} ${ansis.magenta(decNames)}`);\n }\n }\n }\n\n // Docs links\n const docsLinks = item.docsLinks;\n if (docsLinks.length) {\n console.log('');\n console.log(ansis.bold(' Documentation'));\n for (const link of docsLinks) {\n const label = link.description ? `${link.description}: ` : '';\n console.log(` ${label}${ansis.underline(link.url)}`);\n }\n }\n\n console.log('');\n\n if (item.validationState === 'error') {\n gracefulExit(1);\n }\n};\n"]}
1
+ {"version":3,"sources":["../src/cli/commands/explain.command.ts"],"names":[],"mappings":"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","file":"chunk-OGGTDFVX.js","sourcesContent":["import ansis from 'ansis';\nimport { define } from 'gunshi';\nimport { gracefulExit } from 'exit-hook';\n\nimport { loadVarlockEnvGraph } from '../../lib/load-graph';\nimport { formattedValue } from '../../lib/formatting';\nimport { redactString } from '../../runtime/lib/redaction';\nimport {\n checkForSchemaErrors, checkForNoEnvFiles,\n} from '../helpers/error-checks';\nimport { type TypedGunshiCommandFn } from '../helpers/gunshi-type-utils';\nimport { CliExitError } from '../helpers/exit-error';\nimport { StaticValueResolver } from '../../env-graph/lib/resolver';\nimport _ from '@env-spec/utils/my-dash';\n\nexport const commandSpec = define({\n name: 'explain',\n description: 'Show detailed information about how a config item is resolved',\n args: {\n env: {\n type: 'string',\n description: 'Set the environment (e.g., production, development, etc)',\n },\n path: {\n type: 'string',\n short: 'p',\n multiple: true,\n description: 'Path to a specific .env file or directory to use as the entry point (can be specified multiple times)',\n },\n },\n examples: `\nShows detailed information about all definitions, sources, and overrides\nthat feed into a single config item. Useful for debugging why a value\nis not what you expect.\n\nExamples:\n varlock explain DATABASE_URL # Explain how DATABASE_URL is resolved\n varlock explain --env production API_KEY # Explain in production context\n`.trim(),\n});\n\nfunction describeResolver(resolver: any, indent = ''): string {\n if (resolver instanceof StaticValueResolver) {\n return `${indent}static value`;\n }\n const fnName = resolver.fnName;\n if (fnName && !fnName.startsWith('\\0')) {\n return `${indent}${fnName}()`;\n }\n return `${indent}(resolver)`;\n}\n\nexport const commandFn: TypedGunshiCommandFn<typeof commandSpec> = async (ctx) => {\n const positionals = (ctx.positionals ?? []).slice(ctx.commandPath?.length ?? 0);\n if (!positionals.length) {\n throw new CliExitError('Missing required argument: variable name', {\n suggestion: 'Run `varlock explain MY_VAR` to explain a config item',\n });\n }\n const varName = positionals[0];\n\n const envGraph = await loadVarlockEnvGraph({\n currentEnvFallback: ctx.values.env,\n entryFilePaths: ctx.values.path,\n });\n\n checkForSchemaErrors(envGraph);\n checkForNoEnvFiles(envGraph);\n\n if (!(varName in envGraph.configSchema)) {\n throw new CliExitError(`Variable \"${varName}\" not found in schema`);\n }\n\n await envGraph.resolveEnvValues();\n\n const item = envGraph.configSchema[varName];\n const isSensitive = item.isSensitive;\n\n // Header\n console.log('');\n console.log(ansis.bold.cyan(` ${item.key}`));\n console.log('');\n\n // Description\n if (item.description) {\n console.log(` ${ansis.gray('Description:')} ${item.description}`);\n }\n\n // Type info\n if (item.dataType) {\n console.log(` ${ansis.gray('Type:')} ${item.dataType.name}`);\n }\n\n // Properties\n const props = [];\n if (item.isRequired) props.push('required');\n else props.push('optional');\n if (isSensitive) props.push('sensitive');\n else props.push('public');\n console.log(` ${ansis.gray('Properties:')} ${props.join(', ')}`);\n\n // Resolved value\n console.log('');\n console.log(ansis.bold(' Resolved value'));\n if (item.validationState === 'error') {\n console.log(` ${ansis.red(' (resolution failed)')}`);\n for (const err of item.errors) {\n console.log(` ${ansis.red(` - ${err.message}`)}`);\n }\n } else {\n let valStr = formattedValue(item.resolvedValue, true);\n if (isSensitive && item.resolvedValue && _.isString(item.resolvedValue)) {\n valStr = redactString(item.resolvedValue)!;\n }\n console.log(` ${valStr}`);\n if (item.isCoerced) {\n let rawStr = formattedValue(item.resolvedRawValue, true);\n if (isSensitive && item.resolvedRawValue && _.isString(item.resolvedRawValue)) {\n rawStr = redactString(item.resolvedRawValue)!;\n }\n console.log(` ${ansis.gray.italic(`coerced from ${rawStr}`)}`);\n }\n }\n\n // Value source\n console.log('');\n console.log(ansis.bold(' Value source'));\n\n if (item.isOverridden) {\n console.log(` ${ansis.yellow('⚡ process.env override')} ${ansis.yellow.bold('(active)')}`);\n const activeValueDef = item.activeValueDef;\n if (activeValueDef) {\n const sourceLabel = activeValueDef.source?.label || 'internal';\n const resolverDesc = activeValueDef.itemDef.resolver\n ? describeResolver(activeValueDef.itemDef.resolver)\n : 'no value';\n console.log(` ${ansis.gray('└')} ${ansis.gray.italic(`would use ${resolverDesc} from ${sourceLabel} without override`)}`);\n }\n } else {\n const activeValueDef = item.activeValueDef;\n if (activeValueDef) {\n const sourceLabel = activeValueDef.source?.label || 'internal';\n const resolverDesc = activeValueDef.itemDef.resolver\n ? describeResolver(activeValueDef.itemDef.resolver)\n : 'no value';\n console.log(` ${resolverDesc} from ${ansis.cyan(sourceLabel)}`);\n } else {\n console.log(` ${ansis.gray('(no value set)')}`);\n }\n }\n\n // All definitions\n const defs = item.defs;\n if (defs.length) {\n console.log('');\n console.log(ansis.bold(' All definitions') + ansis.gray(` (${defs.length} source${defs.length > 1 ? 's' : ''}, highest priority first)`));\n\n for (let i = 0; i < defs.length; i++) {\n const def = defs[i];\n const sourceLabel = def.source?.label || 'internal (builtin)';\n const sourceType = def.source?.type || 'builtin';\n\n const isActiveSource = !item.isOverridden && def === item.activeValueDef;\n const marker = isActiveSource ? ansis.green(' ← active') : '';\n\n console.log(` ${ansis.gray(`${i + 1}.`)} ${ansis.cyan(sourceLabel)} ${ansis.gray(`(${sourceType})`)}${marker}`);\n\n // Show resolver info\n if (def.itemDef.resolver) {\n console.log(` ${ansis.gray('value:')} ${describeResolver(def.itemDef.resolver)}`);\n } else {\n console.log(` ${ansis.gray('value:')} ${ansis.gray.italic('(none - decorators only)')}`);\n }\n\n // Show decorators from this definition\n const decNames = def.itemDef.decorators?.map((d) => `@${d.name}`).join(', ');\n if (decNames) {\n console.log(` ${ansis.gray('decorators:')} ${ansis.magenta(decNames)}`);\n }\n }\n }\n\n // Docs links\n const docsLinks = item.docsLinks;\n if (docsLinks.length) {\n console.log('');\n console.log(ansis.bold(' Documentation'));\n for (const link of docsLinks) {\n const label = link.description ? `${link.description}: ` : '';\n console.log(` ${label}${ansis.underline(link.url)}`);\n }\n }\n\n console.log('');\n\n if (item.validationState === 'error') {\n gracefulExit(1);\n }\n};\n"]}
@@ -1,4 +1,4 @@
1
- import { debug, varlockSettings, redactSensitiveConfig } from './chunk-MGWUDHT5.js';
1
+ import { debug, varlockSettings, redactSensitiveConfig } from './chunk-UUJK65RS.js';
2
2
  import { __name } from './chunk-6PEHRAEP.js';
3
3
 
4
4
  // src/runtime/patch-console.ts
@@ -40,5 +40,5 @@ function unpatchGlobalConsole() {
40
40
  __name(unpatchGlobalConsole, "unpatchGlobalConsole");
41
41
 
42
42
  export { patchGlobalConsole, unpatchGlobalConsole };
43
- //# sourceMappingURL=chunk-R73FENLU.js.map
44
- //# sourceMappingURL=chunk-R73FENLU.js.map
43
+ //# sourceMappingURL=chunk-QDEAHBCB.js.map
44
+ //# sourceMappingURL=chunk-QDEAHBCB.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/runtime/patch-console.ts"],"names":[],"mappings":";;;;AAWO,SAAS,kBAAA,GAAqB;AACnC,EAAA,KAAA,CAAM,8CAAoC,CAAA;AAC1C,EAAA,IAAK,OAAA,CAAQ,IAAY,iBAAA,EAAmB;AAC1C,IAAA,KAAA,CAAM,mBAAmB,CAAA;AACzB,IAAA;AAAA,EACF;AACA,EAAA,IAAI,eAAA,CAAgB,eAAe,KAAA,EAAO;AACxC,IAAA,KAAA,CAAM,wBAAwB,CAAA;AAC9B,IAAA;AAAA,EACF;AAQA,EAAA,MAAM,qBAAA,GAAwB,MAAA,CAAO,qBAAA,CAAsB,UAAA,CAAW,OAAO,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,WAAA,KAAgB,iBAAiB,CAAA;AAG9H,EAAC,UAAA,CAAmB,4BAAA,KAAiC,UAAA,CAAW,OAAA,CAAQ,qBAAqB,CAAA;AAE7F,EAAA,UAAA,CAAW,OAAA,CAAQ,qBAAqB,CAAA,GAAI,WAAY;AACtD,IAAC,UAAA,CAAmB,4BAAA,CAA6B,KAAA,CAAM,IAAA,EAAM;AAAA,MAC3D,UAAU,CAAC,CAAA;AAAA,MACX,qBAAA,CAAsB,SAAA,CAAU,CAAC,CAAC,CAAA;AAAA,MAClC,UAAU,CAAC;AAAA,KACZ,CAAA;AAAA,EACH,CAAA;AAOA,EAAA,KAAA,MAAW,aAAA,IAAiB,CAAC,OAAA,EAAS,OAAA,EAAS,QAAQ,KAAA,EAAO,MAAA,EAAQ,MAAA,EAAQ,OAAO,CAAA,EAAG;AAEtF,IAAA,MAAM,iBAAA,GAAoB,UAAA,CAAW,OAAA,CAAQ,aAAa,CAAA;AAE1D,IAAA,MAAM,4BAAY,MAAA,CAAA,WAAY;AAE5B,MAAA,iBAAA,CAAkB,KAAA,CAAM,MAAM,KAAA,CAAM,IAAA,CAAK,SAAS,CAAA,CAAE,GAAA,CAAI,qBAAqB,CAAC,CAAA;AAAA,IAChF,CAAA,EAHkB,WAAA,CAAA;AAIlB,IAAA,SAAA,CAAU,iBAAA,GAAoB,IAAA;AAG9B,IAAA,UAAA,CAAW,OAAA,CAAQ,aAAa,CAAA,GAAI,SAAA;AAAA,EACtC;AACF;AAhDgB,MAAA,CAAA,kBAAA,EAAA,oBAAA,CAAA;AAuDT,SAAS,oBAAA,GAAuB;AAErC,EAAA,IAAI,CAAE,WAAmB,4BAAA,EAA8B;AAEvD,EAAA,MAAM,qBAAA,GAAwB,MAAA,CAAO,qBAAA,CAAsB,UAAA,CAAW,OAAO,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,WAAA,KAAgB,iBAAiB,CAAA;AAE9H,EAAA,UAAA,CAAW,OAAA,CAAQ,qBAAqB,CAAA,GAAK,UAAA,CAAmB,4BAAA;AAChE,EAAA,OAAQ,UAAA,CAAmB,4BAAA;AAC7B;AARgB,MAAA,CAAA,oBAAA,EAAA,sBAAA,CAAA","file":"chunk-R73FENLU.js","sourcesContent":["/* eslint-disable func-names, no-console, prefer-rest-params */\n\nimport { redactSensitiveConfig, varlockSettings } from './env';\nimport { debug } from './lib/debug';\n\n\n/**\n * patches global console methods to redact sensitive config\n *\n * NOTE - this may not be 100% foolproof depending on the platform\n * */\nexport function patchGlobalConsole() {\n debug('⚡️ PATCHING global console methods');\n if ((console.log as any)._varlockPatchedFn) {\n debug('> already patched');\n return;\n }\n if (varlockSettings.redactLogs === false) {\n debug('> disabled by settings');\n return;\n }\n\n // our method of patching involves replacing an internal node method which may not be called if console.log itself has also been patched\n // for example AWS lambdas patches this to write the logs to a file which then is pushed to the rest of their system\n\n // so first we'll just patch the internal method do deal with normal stdout/stderr logs -------------------------------------\n\n // we need the internal symbol name to access the internal method\n const kWriteToConsoleSymbol = Object.getOwnPropertySymbols(globalThis.console).find((s) => s.description === 'kWriteToConsole');\n\n // @ts-ignore\n (globalThis as any)._varlockOrigWriteToConsoleFn ||= globalThis.console[kWriteToConsoleSymbol];\n // @ts-ignore\n globalThis.console[kWriteToConsoleSymbol] = function () {\n (globalThis as any)._varlockOrigWriteToConsoleFn.apply(this, [\n arguments[0],\n redactSensitiveConfig(arguments[1]),\n arguments[2],\n ]);\n };\n\n // and now we'll wrap console.log (and the other methods) if it looks like they have been patched already ------------------\n // NOTE - this will not fully redact from everything since we can't safely reach deep into objects\n // ideally we would only turn this when the above method does not work, but it's not trivial to detect when it that is the case\n // so we'll turn it on all the time for now...\n\n for (const logMethodName of ['trace', 'debug', 'info', 'log', 'info', 'warn', 'error']) {\n // @ts-ignore\n const originalLogMethod = globalThis.console[logMethodName];\n\n const patchedFn = function () {\n // @ts-ignore\n originalLogMethod.apply(this, Array.from(arguments).map(redactSensitiveConfig));\n };\n patchedFn._varlockPatchedFn = true;\n\n // @ts-ignore\n globalThis.console[logMethodName] = patchedFn;\n }\n}\n\n/**\n * restore's original global console methods to stop redacting secrets\n *\n * (only needed during local development when switching settings on/off in a process that does not reload)\n * */\nexport function unpatchGlobalConsole() {\n // we'll only care about the normal case where console.log has NOT been patched by something else... (see above)\n if (!(globalThis as any)._varlockOrigWriteToConsoleFn) return;\n\n const kWriteToConsoleSymbol = Object.getOwnPropertySymbols(globalThis.console).find((s) => s.description === 'kWriteToConsole');\n // @ts-ignore\n globalThis.console[kWriteToConsoleSymbol] = (globalThis as any)._varlockOrigWriteToConsoleFn;\n delete (globalThis as any)._varlockOrigWriteToConsoleFn;\n}\n"]}
1
+ {"version":3,"sources":["../src/runtime/patch-console.ts"],"names":[],"mappings":";;;;AAWO,SAAS,kBAAA,GAAqB;AACnC,EAAA,KAAA,CAAM,8CAAoC,CAAA;AAC1C,EAAA,IAAK,OAAA,CAAQ,IAAY,iBAAA,EAAmB;AAC1C,IAAA,KAAA,CAAM,mBAAmB,CAAA;AACzB,IAAA;AAAA,EACF;AACA,EAAA,IAAI,eAAA,CAAgB,eAAe,KAAA,EAAO;AACxC,IAAA,KAAA,CAAM,wBAAwB,CAAA;AAC9B,IAAA;AAAA,EACF;AAQA,EAAA,MAAM,qBAAA,GAAwB,MAAA,CAAO,qBAAA,CAAsB,UAAA,CAAW,OAAO,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,WAAA,KAAgB,iBAAiB,CAAA;AAG9H,EAAC,UAAA,CAAmB,4BAAA,KAAiC,UAAA,CAAW,OAAA,CAAQ,qBAAqB,CAAA;AAE7F,EAAA,UAAA,CAAW,OAAA,CAAQ,qBAAqB,CAAA,GAAI,WAAY;AACtD,IAAC,UAAA,CAAmB,4BAAA,CAA6B,KAAA,CAAM,IAAA,EAAM;AAAA,MAC3D,UAAU,CAAC,CAAA;AAAA,MACX,qBAAA,CAAsB,SAAA,CAAU,CAAC,CAAC,CAAA;AAAA,MAClC,UAAU,CAAC;AAAA,KACZ,CAAA;AAAA,EACH,CAAA;AAOA,EAAA,KAAA,MAAW,aAAA,IAAiB,CAAC,OAAA,EAAS,OAAA,EAAS,QAAQ,KAAA,EAAO,MAAA,EAAQ,MAAA,EAAQ,OAAO,CAAA,EAAG;AAEtF,IAAA,MAAM,iBAAA,GAAoB,UAAA,CAAW,OAAA,CAAQ,aAAa,CAAA;AAE1D,IAAA,MAAM,4BAAY,MAAA,CAAA,WAAY;AAE5B,MAAA,iBAAA,CAAkB,KAAA,CAAM,MAAM,KAAA,CAAM,IAAA,CAAK,SAAS,CAAA,CAAE,GAAA,CAAI,qBAAqB,CAAC,CAAA;AAAA,IAChF,CAAA,EAHkB,WAAA,CAAA;AAIlB,IAAA,SAAA,CAAU,iBAAA,GAAoB,IAAA;AAG9B,IAAA,UAAA,CAAW,OAAA,CAAQ,aAAa,CAAA,GAAI,SAAA;AAAA,EACtC;AACF;AAhDgB,MAAA,CAAA,kBAAA,EAAA,oBAAA,CAAA;AAuDT,SAAS,oBAAA,GAAuB;AAErC,EAAA,IAAI,CAAE,WAAmB,4BAAA,EAA8B;AAEvD,EAAA,MAAM,qBAAA,GAAwB,MAAA,CAAO,qBAAA,CAAsB,UAAA,CAAW,OAAO,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,WAAA,KAAgB,iBAAiB,CAAA;AAE9H,EAAA,UAAA,CAAW,OAAA,CAAQ,qBAAqB,CAAA,GAAK,UAAA,CAAmB,4BAAA;AAChE,EAAA,OAAQ,UAAA,CAAmB,4BAAA;AAC7B;AARgB,MAAA,CAAA,oBAAA,EAAA,sBAAA,CAAA","file":"chunk-QDEAHBCB.js","sourcesContent":["/* eslint-disable func-names, no-console, prefer-rest-params */\n\nimport { redactSensitiveConfig, varlockSettings } from './env';\nimport { debug } from './lib/debug';\n\n\n/**\n * patches global console methods to redact sensitive config\n *\n * NOTE - this may not be 100% foolproof depending on the platform\n * */\nexport function patchGlobalConsole() {\n debug('⚡️ PATCHING global console methods');\n if ((console.log as any)._varlockPatchedFn) {\n debug('> already patched');\n return;\n }\n if (varlockSettings.redactLogs === false) {\n debug('> disabled by settings');\n return;\n }\n\n // our method of patching involves replacing an internal node method which may not be called if console.log itself has also been patched\n // for example AWS lambdas patches this to write the logs to a file which then is pushed to the rest of their system\n\n // so first we'll just patch the internal method do deal with normal stdout/stderr logs -------------------------------------\n\n // we need the internal symbol name to access the internal method\n const kWriteToConsoleSymbol = Object.getOwnPropertySymbols(globalThis.console).find((s) => s.description === 'kWriteToConsole');\n\n // @ts-ignore\n (globalThis as any)._varlockOrigWriteToConsoleFn ||= globalThis.console[kWriteToConsoleSymbol];\n // @ts-ignore\n globalThis.console[kWriteToConsoleSymbol] = function () {\n (globalThis as any)._varlockOrigWriteToConsoleFn.apply(this, [\n arguments[0],\n redactSensitiveConfig(arguments[1]),\n arguments[2],\n ]);\n };\n\n // and now we'll wrap console.log (and the other methods) if it looks like they have been patched already ------------------\n // NOTE - this will not fully redact from everything since we can't safely reach deep into objects\n // ideally we would only turn this when the above method does not work, but it's not trivial to detect when it that is the case\n // so we'll turn it on all the time for now...\n\n for (const logMethodName of ['trace', 'debug', 'info', 'log', 'info', 'warn', 'error']) {\n // @ts-ignore\n const originalLogMethod = globalThis.console[logMethodName];\n\n const patchedFn = function () {\n // @ts-ignore\n originalLogMethod.apply(this, Array.from(arguments).map(redactSensitiveConfig));\n };\n patchedFn._varlockPatchedFn = true;\n\n // @ts-ignore\n globalThis.console[logMethodName] = patchedFn;\n }\n}\n\n/**\n * restore's original global console methods to stop redacting secrets\n *\n * (only needed during local development when switching settings on/off in a process that does not reload)\n * */\nexport function unpatchGlobalConsole() {\n // we'll only care about the normal case where console.log has NOT been patched by something else... (see above)\n if (!(globalThis as any)._varlockOrigWriteToConsoleFn) return;\n\n const kWriteToConsoleSymbol = Object.getOwnPropertySymbols(globalThis.console).find((s) => s.description === 'kWriteToConsole');\n // @ts-ignore\n globalThis.console[kWriteToConsoleSymbol] = (globalThis as any)._varlockOrigWriteToConsoleFn;\n delete (globalThis as any)._varlockOrigWriteToConsoleFn;\n}\n"]}
@@ -1,9 +1,9 @@
1
- import { define } from './chunk-4A54P4EM.js';
2
- import { checkForSchemaErrors, checkForNoEnvFiles } from './chunk-45N5EFNL.js';
3
- import { loadVarlockEnvGraph } from './chunk-H2JVYUHZ.js';
4
1
  import { gracefulExit } from './chunk-CHQDS2PI.js';
5
- import { CliExitError } from './chunk-LGEHJHB2.js';
6
- import { ansis_default, select } from './chunk-6CRDPEUT.js';
2
+ import { define } from './chunk-4A54P4EM.js';
3
+ import { checkForSchemaErrors, checkForNoEnvFiles } from './chunk-XUY3HAO2.js';
4
+ import { loadVarlockEnvGraph } from './chunk-C5LW5EET.js';
5
+ import { CliExitError } from './chunk-JOGGSYT2.js';
6
+ import { ansis_default, select } from './chunk-GKN3UJNE.js';
7
7
  import { q } from './chunk-IRXBCLL2.js';
8
8
  import { redactString } from './chunk-XLYSNOR3.js';
9
9
  import { __name } from './chunk-6PEHRAEP.js';
@@ -195,5 +195,5 @@ var commandFn = /* @__PURE__ */ __name(async (ctx) => {
195
195
  }, "commandFn");
196
196
 
197
197
  export { commandFn, commandSpec };
198
- //# sourceMappingURL=chunk-KCUEK4TX.js.map
199
- //# sourceMappingURL=chunk-KCUEK4TX.js.map
198
+ //# sourceMappingURL=chunk-RQZZDYWL.js.map
199
+ //# sourceMappingURL=chunk-RQZZDYWL.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli/commands/reveal.command.ts"],"names":["item"],"mappings":"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","file":"chunk-KCUEK4TX.js","sourcesContent":["import ansis from 'ansis';\nimport { define } from 'gunshi';\nimport { isCancel } from '@clack/prompts';\nimport { gracefulExit } from 'exit-hook';\n\nimport { loadVarlockEnvGraph } from '../../lib/load-graph';\nimport { checkForSchemaErrors, checkForNoEnvFiles } from '../helpers/error-checks';\nimport { type TypedGunshiCommandFn } from '../helpers/gunshi-type-utils';\nimport { CliExitError } from '../helpers/exit-error';\nimport { select } from '../helpers/prompts';\nimport { ConfigItem } from '../../env-graph';\nimport { redactString } from '../../runtime/lib/redaction';\n\nexport const commandSpec = define({\n name: 'reveal',\n description: 'Securely view decrypted values of sensitive environment variables',\n args: {\n copy: {\n type: 'boolean',\n description: 'Copy the value to clipboard instead of displaying (auto-clears after 10s)',\n },\n path: {\n type: 'string',\n short: 'p',\n multiple: true,\n description: 'Path to a specific .env file or directory to use as the entry point (can be specified multiple times)',\n },\n env: {\n type: 'string',\n description: 'Set the environment (e.g., production, development, etc)',\n },\n },\n examples: `\nSecurely view the plaintext value of sensitive environment variables.\nValues are shown in an alternate screen buffer so they don't persist in\nterminal scrollback history.\n\nExamples:\n varlock reveal # Interactive picker to select and reveal values\n varlock reveal MY_SECRET # Reveal a specific variable\n varlock reveal MY_SECRET --copy # Copy value to clipboard (auto-clears after 10s)\n`.trim(),\n});\n\nconst CLIPBOARD_CLEAR_DELAY_MS = 10_000;\n\nasync function copyToClipboard(text: string): Promise<void> {\n const { execSync } = await import('node:child_process');\n const platform = process.platform;\n\n if (platform === 'darwin') {\n execSync('pbcopy', { input: text });\n } else if (platform === 'linux') {\n // try xclip first, then xsel\n try {\n execSync('xclip -selection clipboard', { input: text });\n } catch {\n execSync('xsel --clipboard --input', { input: text });\n }\n } else if (platform === 'win32') {\n execSync('clip', { input: text });\n } else {\n throw new CliExitError('Clipboard not supported on this platform');\n }\n}\n\nasync function clearClipboard(): Promise<void> {\n const { execSync } = await import('node:child_process');\n const platform = process.platform;\n\n try {\n if (platform === 'darwin') {\n execSync('pbcopy', { input: '' });\n } else if (platform === 'linux') {\n try {\n execSync('xclip -selection clipboard', { input: '' });\n } catch {\n execSync('xsel --clipboard --input', { input: '' });\n }\n } else if (platform === 'win32') {\n execSync('echo. | clip', { shell: 'cmd.exe' });\n }\n } catch {\n // best effort\n }\n}\n\nfunction enterAltScreen() {\n process.stdout.write('\\x1b[?1049h'); // switch to alternate screen buffer\n process.stdout.write('\\x1b[H'); // move cursor to top-left\n}\n\nfunction exitAltScreen() {\n process.stdout.write('\\x1b[?1049l'); // switch back to main screen buffer\n}\n\n/** Wait for a single keypress, returns the key */\nasync function waitForKeypress(): Promise<string> {\n return new Promise((resolve) => {\n const wasRaw = process.stdin.isRaw;\n if (process.stdin.isTTY) process.stdin.setRawMode(true);\n process.stdin.resume();\n process.stdin.once('data', (data) => {\n if (process.stdin.isTTY) process.stdin.setRawMode(wasRaw);\n process.stdin.pause();\n resolve(data.toString());\n });\n });\n}\n\nfunction displayRevealedValue(item: ConfigItem) {\n enterAltScreen();\n\n const value = item.resolvedValue;\n const valStr = value === undefined || value === null ? ansis.gray('(empty)') : String(value);\n\n console.log('');\n console.log(ansis.bold.cyan(` ${item.key}`));\n if (item.description) {\n console.log(ansis.gray(` ${item.description}`));\n }\n console.log('');\n console.log(` ${valStr}`);\n console.log('');\n console.log(ansis.gray(' Press any key to hide...'));\n}\n\nexport const commandFn: TypedGunshiCommandFn<typeof commandSpec> = async (ctx) => {\n const { copy: copyMode } = ctx.values;\n\n const envGraph = await loadVarlockEnvGraph({\n currentEnvFallback: ctx.values.env,\n entryFilePaths: ctx.values.path,\n });\n\n checkForSchemaErrors(envGraph);\n checkForNoEnvFiles(envGraph);\n\n await envGraph.resolveEnvValues();\n\n // Collect sensitive items\n const sensitiveItems: Array<ConfigItem> = [];\n for (const itemKey of envGraph.sortedConfigKeys) {\n const item = envGraph.configSchema[itemKey];\n if (item.isSensitive && item.resolvedValue !== undefined) {\n sensitiveItems.push(item);\n }\n }\n\n if (sensitiveItems.length === 0) {\n console.log('No sensitive values found to reveal.');\n return;\n }\n\n // Check if a specific variable was requested via positional arg\n const positionals = (ctx.positionals ?? []).slice(ctx.commandPath?.length ?? 0);\n const requestedVar = positionals[0];\n\n if (requestedVar) {\n // Direct reveal of a specific variable\n const item = sensitiveItems.find((i) => i.key === requestedVar);\n if (!item) {\n // Check if it exists but isn't sensitive\n if (requestedVar in envGraph.configSchema) {\n throw new CliExitError(`\"${requestedVar}\" is not marked as sensitive`, {\n suggestion: 'Use `varlock printenv` for non-sensitive values.',\n });\n }\n throw new CliExitError(`Variable \"${requestedVar}\" not found in schema`);\n }\n\n if (copyMode) {\n await copyToClipboard(String(item.resolvedValue ?? ''));\n console.log(`\\n Copied ${ansis.cyan(item.key)} to clipboard.`);\n console.log(ansis.gray(` Clipboard will be cleared in ${CLIPBOARD_CLEAR_DELAY_MS / 1000}s.\\n`));\n setTimeout(async () => {\n await clearClipboard();\n console.log(ansis.gray(' Clipboard cleared.'));\n gracefulExit();\n }, CLIPBOARD_CLEAR_DELAY_MS);\n return;\n }\n\n displayRevealedValue(item);\n await waitForKeypress();\n exitAltScreen();\n return;\n }\n\n // Interactive picker loop\n while (true) {\n const selected = await select<string>({\n message: `Select a variable to reveal ${ansis.gray('(use arrows, enter to select)')}`,\n options: sensitiveItems.map((item) => ({\n value: item.key,\n label: item.key,\n hint: redactString(String(item.resolvedValue ?? '')) ?? undefined,\n })),\n });\n\n if (isCancel(selected)) return gracefulExit();\n\n const item = sensitiveItems.find((i) => i.key === selected)!;\n\n if (copyMode) {\n await copyToClipboard(String(item.resolvedValue ?? ''));\n console.log(`\\n Copied ${ansis.cyan(item.key)} to clipboard.`);\n console.log(ansis.gray(` Clipboard will be cleared in ${CLIPBOARD_CLEAR_DELAY_MS / 1000}s.\\n`));\n setTimeout(async () => {\n await clearClipboard();\n console.log(ansis.gray(' Clipboard cleared.'));\n gracefulExit();\n }, CLIPBOARD_CLEAR_DELAY_MS);\n return;\n }\n\n displayRevealedValue(item);\n await waitForKeypress();\n exitAltScreen();\n\n // Loop back to the picker to reveal another value\n }\n};\n"]}
1
+ {"version":3,"sources":["../src/cli/commands/reveal.command.ts"],"names":["item"],"mappings":"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","file":"chunk-RQZZDYWL.js","sourcesContent":["import ansis from 'ansis';\nimport { define } from 'gunshi';\nimport { isCancel } from '@clack/prompts';\nimport { gracefulExit } from 'exit-hook';\n\nimport { loadVarlockEnvGraph } from '../../lib/load-graph';\nimport { checkForSchemaErrors, checkForNoEnvFiles } from '../helpers/error-checks';\nimport { type TypedGunshiCommandFn } from '../helpers/gunshi-type-utils';\nimport { CliExitError } from '../helpers/exit-error';\nimport { select } from '../helpers/prompts';\nimport { ConfigItem } from '../../env-graph';\nimport { redactString } from '../../runtime/lib/redaction';\n\nexport const commandSpec = define({\n name: 'reveal',\n description: 'Securely view decrypted values of sensitive environment variables',\n args: {\n copy: {\n type: 'boolean',\n description: 'Copy the value to clipboard instead of displaying (auto-clears after 10s)',\n },\n path: {\n type: 'string',\n short: 'p',\n multiple: true,\n description: 'Path to a specific .env file or directory to use as the entry point (can be specified multiple times)',\n },\n env: {\n type: 'string',\n description: 'Set the environment (e.g., production, development, etc)',\n },\n },\n examples: `\nSecurely view the plaintext value of sensitive environment variables.\nValues are shown in an alternate screen buffer so they don't persist in\nterminal scrollback history.\n\nExamples:\n varlock reveal # Interactive picker to select and reveal values\n varlock reveal MY_SECRET # Reveal a specific variable\n varlock reveal MY_SECRET --copy # Copy value to clipboard (auto-clears after 10s)\n`.trim(),\n});\n\nconst CLIPBOARD_CLEAR_DELAY_MS = 10_000;\n\nasync function copyToClipboard(text: string): Promise<void> {\n const { execSync } = await import('node:child_process');\n const platform = process.platform;\n\n if (platform === 'darwin') {\n execSync('pbcopy', { input: text });\n } else if (platform === 'linux') {\n // try xclip first, then xsel\n try {\n execSync('xclip -selection clipboard', { input: text });\n } catch {\n execSync('xsel --clipboard --input', { input: text });\n }\n } else if (platform === 'win32') {\n execSync('clip', { input: text });\n } else {\n throw new CliExitError('Clipboard not supported on this platform');\n }\n}\n\nasync function clearClipboard(): Promise<void> {\n const { execSync } = await import('node:child_process');\n const platform = process.platform;\n\n try {\n if (platform === 'darwin') {\n execSync('pbcopy', { input: '' });\n } else if (platform === 'linux') {\n try {\n execSync('xclip -selection clipboard', { input: '' });\n } catch {\n execSync('xsel --clipboard --input', { input: '' });\n }\n } else if (platform === 'win32') {\n execSync('echo. | clip', { shell: 'cmd.exe' });\n }\n } catch {\n // best effort\n }\n}\n\nfunction enterAltScreen() {\n process.stdout.write('\\x1b[?1049h'); // switch to alternate screen buffer\n process.stdout.write('\\x1b[H'); // move cursor to top-left\n}\n\nfunction exitAltScreen() {\n process.stdout.write('\\x1b[?1049l'); // switch back to main screen buffer\n}\n\n/** Wait for a single keypress, returns the key */\nasync function waitForKeypress(): Promise<string> {\n return new Promise((resolve) => {\n const wasRaw = process.stdin.isRaw;\n if (process.stdin.isTTY) process.stdin.setRawMode(true);\n process.stdin.resume();\n process.stdin.once('data', (data) => {\n if (process.stdin.isTTY) process.stdin.setRawMode(wasRaw);\n process.stdin.pause();\n resolve(data.toString());\n });\n });\n}\n\nfunction displayRevealedValue(item: ConfigItem) {\n enterAltScreen();\n\n const value = item.resolvedValue;\n const valStr = value === undefined || value === null ? ansis.gray('(empty)') : String(value);\n\n console.log('');\n console.log(ansis.bold.cyan(` ${item.key}`));\n if (item.description) {\n console.log(ansis.gray(` ${item.description}`));\n }\n console.log('');\n console.log(` ${valStr}`);\n console.log('');\n console.log(ansis.gray(' Press any key to hide...'));\n}\n\nexport const commandFn: TypedGunshiCommandFn<typeof commandSpec> = async (ctx) => {\n const { copy: copyMode } = ctx.values;\n\n const envGraph = await loadVarlockEnvGraph({\n currentEnvFallback: ctx.values.env,\n entryFilePaths: ctx.values.path,\n });\n\n checkForSchemaErrors(envGraph);\n checkForNoEnvFiles(envGraph);\n\n await envGraph.resolveEnvValues();\n\n // Collect sensitive items\n const sensitiveItems: Array<ConfigItem> = [];\n for (const itemKey of envGraph.sortedConfigKeys) {\n const item = envGraph.configSchema[itemKey];\n if (item.isSensitive && item.resolvedValue !== undefined) {\n sensitiveItems.push(item);\n }\n }\n\n if (sensitiveItems.length === 0) {\n console.log('No sensitive values found to reveal.');\n return;\n }\n\n // Check if a specific variable was requested via positional arg\n const positionals = (ctx.positionals ?? []).slice(ctx.commandPath?.length ?? 0);\n const requestedVar = positionals[0];\n\n if (requestedVar) {\n // Direct reveal of a specific variable\n const item = sensitiveItems.find((i) => i.key === requestedVar);\n if (!item) {\n // Check if it exists but isn't sensitive\n if (requestedVar in envGraph.configSchema) {\n throw new CliExitError(`\"${requestedVar}\" is not marked as sensitive`, {\n suggestion: 'Use `varlock printenv` for non-sensitive values.',\n });\n }\n throw new CliExitError(`Variable \"${requestedVar}\" not found in schema`);\n }\n\n if (copyMode) {\n await copyToClipboard(String(item.resolvedValue ?? ''));\n console.log(`\\n Copied ${ansis.cyan(item.key)} to clipboard.`);\n console.log(ansis.gray(` Clipboard will be cleared in ${CLIPBOARD_CLEAR_DELAY_MS / 1000}s.\\n`));\n setTimeout(async () => {\n await clearClipboard();\n console.log(ansis.gray(' Clipboard cleared.'));\n gracefulExit();\n }, CLIPBOARD_CLEAR_DELAY_MS);\n return;\n }\n\n displayRevealedValue(item);\n await waitForKeypress();\n exitAltScreen();\n return;\n }\n\n // Interactive picker loop\n while (true) {\n const selected = await select<string>({\n message: `Select a variable to reveal ${ansis.gray('(use arrows, enter to select)')}`,\n options: sensitiveItems.map((item) => ({\n value: item.key,\n label: item.key,\n hint: redactString(String(item.resolvedValue ?? '')) ?? undefined,\n })),\n });\n\n if (isCancel(selected)) return gracefulExit();\n\n const item = sensitiveItems.find((i) => i.key === selected)!;\n\n if (copyMode) {\n await copyToClipboard(String(item.resolvedValue ?? ''));\n console.log(`\\n Copied ${ansis.cyan(item.key)} to clipboard.`);\n console.log(ansis.gray(` Clipboard will be cleared in ${CLIPBOARD_CLEAR_DELAY_MS / 1000}s.\\n`));\n setTimeout(async () => {\n await clearClipboard();\n console.log(ansis.gray(' Clipboard cleared.'));\n gracefulExit();\n }, CLIPBOARD_CLEAR_DELAY_MS);\n return;\n }\n\n displayRevealedValue(item);\n await waitForKeypress();\n exitAltScreen();\n\n // Loop back to the picker to reveal another value\n }\n};\n"]}
@@ -149,6 +149,7 @@ function scanForLeaks(toScan, meta) {
149
149
  }
150
150
  __name(scanForLeaks, "scanForLeaks");
151
151
  var initializedEnv = false;
152
+ var configHasErrors = false;
152
153
  var envValues = {};
153
154
  var varlockSettings = {};
154
155
  var processExists = !!globalThis.process;
@@ -176,6 +177,7 @@ function initVarlockEnv(opts) {
176
177
  throw new Error("initVarlockEnv failed");
177
178
  }
178
179
  Object.assign(varlockSettings, serializedEnvData.settings);
180
+ configHasErrors = !!serializedEnvData.errors;
179
181
  resetRedactionMap(serializedEnvData);
180
182
  const setProcessEnv = processExists;
181
183
  if (setProcessEnv) {
@@ -211,7 +213,13 @@ var EnvProxy = new Proxy({}, {
211
213
  if (typeof prop === "symbol") return;
212
214
  if (IGNORED_PROXY_KEYS.includes(prop)) return;
213
215
  if (!initializedEnv) {
214
- throw new Error("varlock ENV not initialized");
216
+ throw new Error(
217
+ "varlock ENV not initialized \u2014 make sure varlock is set up correctly.\nSee https://varlock.dev/docs/get-started for setup instructions."
218
+ );
219
+ }
220
+ if (configHasErrors) {
221
+ console.error(`[varlock] \u26A0\uFE0F ENV.${prop} accessed but config has errors \u2014 values may be missing or incorrect`);
222
+ return void 0;
215
223
  }
216
224
  if (prop in envValues) return envValues[prop];
217
225
  if (globalThis.__varlockThrowOnMissingKeys) {
@@ -227,5 +235,5 @@ var EnvProxy = new Proxy({}, {
227
235
  var ENV = EnvProxy;
228
236
 
229
237
  export { ENV, debug, getRedactionMapInfo, initVarlockEnv, redactSensitiveConfig, resetRedactionMap, revealSensitiveConfig, scanForLeaks, varlockSettings };
230
- //# sourceMappingURL=chunk-MGWUDHT5.js.map
231
- //# sourceMappingURL=chunk-MGWUDHT5.js.map
238
+ //# sourceMappingURL=chunk-UUJK65RS.js.map
239
+ //# sourceMappingURL=chunk-UUJK65RS.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/detect-runtime.ts","../src/runtime/lib/debug.ts","../src/runtime/env.ts"],"names":[],"mappings":"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","file":"chunk-UUJK65RS.js","sourcesContent":["declare const Deno: any;\ndeclare const navigator: any;\ndeclare const window: any;\ndeclare const self: any;\n// declare const process: any;\n\n\nlet versionsStr = 'versions'; // eslint-disable-line\n// we use a string here so nextjs static analysis doesnt get angry\nconst processVersions = typeof process !== 'undefined' && (process as any)[versionsStr as any]; // @ts-ignore\n\nexport const isNode: boolean = processVersions && processVersions.node != null;\n\nexport const isWebWorker: boolean = typeof self === 'object'\n && self.constructor\n && self.constructor.name === 'DedicatedWorkerGlobalScope';\n\n// https://github.com/jsdom/jsdom/issues/1537#issuecomment-229405327\nexport const isJsDom: boolean = (typeof window !== 'undefined' && window.name === 'nodejs')\n || (typeof navigator !== 'undefined'\n && 'userAgent' in navigator\n && typeof navigator.userAgent === 'string'\n && (navigator.userAgent.includes('Node.js')\n || navigator.userAgent.includes('jsdom')));\n\nexport const isDeno: boolean = typeof Deno !== 'undefined'\n && typeof Deno.version !== 'undefined'\n && typeof Deno.version.deno !== 'undefined';\n\n/** @see {@link https://bun.sh/guides/util/detect-bun} */\nexport const isBun = processVersions && processVersions.bun != null;\n\n\n\nexport const isBrowser = typeof window !== 'undefined'\n && typeof window.document !== 'undefined'\n && typeof window.document.createElement === 'function'\n && typeof navigator !== 'undefined'\n && typeof navigator.userAgent === 'string';\n","/* eslint-disable no-console */\nexport function debug(...args: Array<any>) {\n if (!globalThis.process?.env.DEBUG_VARLOCK) return;\n console.log(...args);\n}\n","import { redactString } from './lib/redaction';\n\nimport type { SerializedEnvGraph } from '../env-graph';\nimport { isBrowser } from '../lib/detect-runtime';\nimport { debug } from './lib/debug';\n\n// TODO: would like to move all of the redaction utils out of this file\n// but its complicated since it is imported by code that may be run in the backend and frontend\n// but the patching code (which only runs in the backend) use these helper functions\n\n// this does not cover all cases, but serves our needs so far for Next.js\nfunction isString(s: any) {\n return Object.prototype.toString.call(s) === '[object String]';\n}\n\nconst UNMASK_STR = '👁';\n\n\n// Store redaction state on globalThis so all module instances (e.g., multiple CJS bundles\n// in Turbopack's middleware context) share the same redaction map.\n// Without this, the module instance that patches console.log may have an empty map\n// while a different instance has the populated one.\ntype RedactionState = {\n sensitiveSecretsMap: Record<string, { key: string, redacted: string }>,\n redactorFindReplace: undefined | { find: RegExp, replace: ReplaceFn },\n};\ntype ReplaceFn = (match: string, pre: string, val: string, post: string) => string;\n\nconst REDACTION_STATE_KEY = '__varlockRedactionState';\nfunction getRedactionState(): RedactionState {\n if (!(globalThis as any)[REDACTION_STATE_KEY]) {\n (globalThis as any)[REDACTION_STATE_KEY] = {\n sensitiveSecretsMap: {},\n redactorFindReplace: undefined,\n };\n }\n return (globalThis as any)[REDACTION_STATE_KEY];\n}\n\nexport function resetRedactionMap(graph: SerializedEnvGraph) {\n const state = getRedactionState();\n // reset map of { [sensitive] => redacted }\n state.sensitiveSecretsMap = {};\n for (const itemKey in graph.config) {\n const item = graph.config[itemKey];\n if (item.isSensitive && item.value && isString(item.value)) {\n // TODO: we want to respect masking settings from the schema (once added)\n const redacted = redactString(item.value);\n if (redacted) state.sensitiveSecretsMap[item.value] = { key: itemKey, redacted };\n }\n }\n // if no sensitive items exist, we dont need to do any redaction, but the redact fn is checking for undefined\n if (!Object.keys(state.sensitiveSecretsMap).length) {\n state.redactorFindReplace = undefined;\n return;\n }\n\n // reset find/replace regex+fn used for redacting secrets in strings\n const findRegex = new RegExp(\n [\n `(${UNMASK_STR} )?`,\n '(',\n Object.keys(state.sensitiveSecretsMap)\n // Escape special characters\n .map((s) => s.replace(/[()[\\]{}*+?^$|#.,/\\\\\\s-]/g, '\\\\$&'))\n // Sort for maximal munch\n .sort((a, b) => b.length - a.length)\n .join('|'),\n ')',\n `( ${UNMASK_STR})?`,\n ].join(''),\n 'g',\n );\n\n const replaceFn: ReplaceFn = (match, pre, val, post) => {\n // the pre and post matches only will be populated if they were present\n // and they are used to unmask the secret - so we do not want to replace in this case\n if (pre && post) return match;\n return state.sensitiveSecretsMap[val].redacted;\n };\n state.redactorFindReplace = { find: findRegex, replace: replaceFn };\n}\n\n/** Returns diagnostic info about the current redaction state (safe to expose — no secrets) */\nexport function getRedactionMapInfo() {\n const state = getRedactionState();\n return {\n sensitiveItemCount: Object.keys(state.sensitiveSecretsMap).length,\n hasRedactorRegex: !!state.redactorFindReplace,\n };\n}\n\n\n// While the module itself acts as a singleton to hold the current map of redacted values\n// we expose only the below const to end users\n\n\n/**\n * Redacts senstive config values from any string/array/object/etc\n *\n * NOTE - must be used only after varlock has loaded config\n * */\nexport function redactSensitiveConfig(o: any): any {\n const { redactorFindReplace } = getRedactionState();\n if (!redactorFindReplace) return o;\n if (!o) return o;\n\n // TODO: handle more cases?\n // we can probably redact safely from a few other datatypes - like set,map,etc?\n // objects are a bit tougher\n if (Array.isArray(o)) {\n return o.map(redactSensitiveConfig);\n }\n // try to redact if it's a plain object - not necessarily great for perf...\n if (o && typeof (o) === 'object' && Object.getPrototypeOf(o) === Object.prototype) {\n try {\n return JSON.parse(redactSensitiveConfig(JSON.stringify(o)));\n } catch (err) {\n return o;\n }\n }\n\n const type = typeof o;\n if (type === 'string' || (type === 'object' && Object.prototype.toString.call(o) === '[object String]')) {\n return (o as string).replaceAll(redactorFindReplace.find, redactorFindReplace.replace);\n }\n\n return o;\n}\n\n/**\n * utility to unmask a secret/sensitive value when logging to the console\n * currently this only works on a single secret, not objects or aggregated strings\n * */\nexport function revealSensitiveConfig(secretStr: string) {\n // if redaction not enabled, we just return the secret itself\n if (!(globalThis as any)._varlockOrigWriteToConsoleFn) return secretStr;\n // otherwise we add some wrapper characters which will be removed by the patched console behaviour\n return `${UNMASK_STR} ${secretStr} ${UNMASK_STR}`;\n}\n\n\n\n\n\n// reusable leak scanning helper function, used by various integrations\nexport function scanForLeaks(\n toScan: string | ReadableStream | null,\n // optional additional information about what is being scanned to be used in error messages\n meta?: {\n method?: string,\n file?: string,\n },\n) {\n debug('⚡️ varlock scanning for leaks');\n if (!toScan) return toScan;\n\n function scanStrForLeaks(strToScan: string) {\n const { sensitiveSecretsMap } = getRedactionState();\n\n // TODO: probably should use a single regex\n for (const sensitiveValue in sensitiveSecretsMap) {\n if (strToScan.includes(sensitiveValue)) {\n const itemKey = sensitiveSecretsMap[sensitiveValue].key;\n\n // error stack can gets awkwardly buried since we're so deep in the internals\n // so we'll write a nicer error message to help the user debug\n // eslint-disable-next-line no-console\n console.error([\n '',\n `🚨 ${'DETECTED LEAKED SENSITIVE CONFIG'} 🚨`,\n `> Config item key: ${itemKey}`,\n ...meta?.method ? [`> Scan method: ${meta.method}`] : [],\n ...meta?.file ? [`> File: ${meta.file}`] : [],\n '',\n ].join('\\n'));\n\n throw new Error(`🚨 DETECTED LEAKED SENSITIVE CONFIG - ${itemKey}`);\n }\n }\n }\n\n // scan a string\n if (isString(toScan)) {\n scanStrForLeaks(toScan as string);\n return toScan;\n // typeof guard needed: in edge runtime, this code runs as raw injected JS outside webpack's\n // module resolution, so bare `Buffer` is a ReferenceError even though edge supports it via\n // the sandbox's node:buffer module. This branch is unreachable in edge anyway (only strings/streams).\n } else if (typeof Buffer !== 'undefined' && toScan instanceof Buffer) {\n scanStrForLeaks(toScan.toString());\n return toScan;\n // scan a Uint8Array / ArrayBufferView / ArrayBuffer (common in Cloudflare Workers)\n } else if (ArrayBuffer.isView(toScan) || toScan instanceof ArrayBuffer) {\n const decoder = new TextDecoder();\n scanStrForLeaks(decoder.decode(toScan as any));\n return toScan;\n // scan a ReadableStream by piping it through a scanner\n } else if (toScan instanceof ReadableStream) {\n if (toScan.locked) {\n return toScan;\n }\n const chunkDecoder = new TextDecoder();\n return toScan.pipeThrough(\n new TransformStream({\n transform(chunk, controller) {\n const chunkStr = chunkDecoder.decode(chunk);\n scanStrForLeaks(chunkStr);\n controller.enqueue(chunk);\n },\n }),\n );\n }\n // other things may be passed in like Buffer... but we'll ignore for now\n return toScan;\n}\n\n// -----------\n\n\n\n\n// --------------\n\nlet initializedEnv = false;\nlet configHasErrors = false;\nconst envValues = {} as Record<string, any>;\nexport const varlockSettings = {} as Record<string, any>;\n\nconst processExists = !!globalThis.process;\nconst originalProcessEnv = { ...processExists && process.env };\nlet varlockInjectedProcessEnvKeys: Array<string> | undefined;\n\nexport function initVarlockEnv(opts?: {\n allowFail?: boolean,\n}) {\n debug('⚡️ INIT VARLOCK ENV!', initializedEnv, !!(globalThis as any).__varlockLoadedEnv, !!globalThis.process?.env.__VARLOCK_ENV);\n\n // normally we can just bail if we detect we are in the browser\n // however when front-end related tests, it may appear that we are in the browser but it is not\n // also some frameworks inject a process polyfill, others do not\n if (isBrowser && !globalThis.process?.env.__VARLOCK_ENV) {\n initializedEnv = true;\n return;\n }\n\n\n let serializedEnvData: SerializedEnvGraph;\n // when we inject resolved config at build time, we store it here\n if ((globalThis as any).__varlockLoadedEnv) {\n serializedEnvData = (globalThis as any).__varlockLoadedEnv;\n\n // otherwise if we inject via `varlock run` or have already loaded, it will be in process.env\n } else if (processExists && process.env.__VARLOCK_ENV) {\n serializedEnvData = JSON.parse(process.env.__VARLOCK_ENV);\n } else {\n if (opts?.allowFail) return;\n // eslint-disable-next-line no-console\n console.error([\n '',\n '🚨 initVarlockEnv failed 🚨',\n 'try rerunning your command via `varlock run`',\n '',\n ].join('\\n'));\n throw new Error('initVarlockEnv failed');\n }\n Object.assign(varlockSettings, serializedEnvData.settings);\n configHasErrors = !!(serializedEnvData as any).errors;\n resetRedactionMap(serializedEnvData);\n\n const setProcessEnv = processExists;\n\n // if we've already injected process.env vars in the past, we'll reset those now\n if (setProcessEnv) {\n if (varlockInjectedProcessEnvKeys) {\n for (const key of varlockInjectedProcessEnvKeys) delete process.env[key];\n for (const key of Object.keys(originalProcessEnv)) process.env[key] = originalProcessEnv[key];\n }\n varlockInjectedProcessEnvKeys = [];\n }\n\n for (const itemKey in serializedEnvData.config) {\n const itemValue = serializedEnvData.config[itemKey].value;\n envValues[itemKey] = itemValue;\n if (setProcessEnv) {\n varlockInjectedProcessEnvKeys?.push(itemKey);\n // when re-injecting into process.env, we treat undefined as empty string\n // this more closely matches expected behaviour from other .env loaders\n process.env[itemKey] = itemValue === undefined ? '' : String(itemValue);\n }\n }\n initializedEnv = true;\n}\n\n// we will attempt to call initVarlockEnv automatically, but in most cases it should be called explicitly\n// note that if this is being imported in the browser, process.env may not exist, so we do this in a try/catch\ntry {\n if (!initializedEnv) {\n // if we are automatically loading because __VARLOCK_ENV is already set\n // then we assume process.env vars have also already been set (although might not harm anything?)\n initVarlockEnv({ allowFail: true });\n }\n} catch (err) {\n // expected that this will fail when process.env does not exist\n // but we may want to look for specific errors\n}\n\n\n\n// some object keys are checked by various tools when handling arbitrary data, especially in templates\n// because our proxy objects throw errors when unknown keys are accessed, this causes problems\n// for now we can just filter out a these keys and it should be fairly harmless\n// TODO: ideally this could be customized by the user, and not specific to vue\nconst IGNORED_PROXY_KEYS = [\n // vue - see https://github.com/vuejs/core/blob/70773d00985135a50556c61fb9855ed6b930cb82/packages/reactivity/src/ref.ts#L101\n '__v_isRef',\n];\n\n\n// this gets exported and then augmented by our type generation\n// ideally we'd start with a loose type `Record<string,any>` and then override it with the actual schema\n// so that if type generation was disabled, a user could still use `ENV`\n// but TS wont let us, so instead we start with it being empty, which will cause type errors\n// unless type generation is enabled\nexport interface TypedEnvSchema {}\n\nconst EnvProxy = new Proxy<TypedEnvSchema>({}, {\n get(target, prop) {\n // ignore symbols, as it likely an external tool checking something\n if (typeof prop === 'symbol') return;\n // special cases to avoid throwing on invalid keys\n if (IGNORED_PROXY_KEYS.includes(prop)) return;\n\n if (!initializedEnv) {\n throw new Error(\n 'varlock ENV not initialized — make sure varlock is set up correctly.\\n'\n + 'See https://varlock.dev/docs/get-started for setup instructions.',\n );\n }\n\n if (configHasErrors) {\n // eslint-disable-next-line no-console\n console.error(`[varlock] ⚠️ ENV.${prop} accessed but config has errors — values may be missing or incorrect`);\n return undefined;\n }\n\n if (prop in envValues) return envValues[prop];\n if ((globalThis as any).__varlockThrowOnMissingKeys) {\n // during development, we can feed in extra metadata and show more helpful errors\n if ((globalThis as any).__varlockValidKeys && (globalThis as any).__varlockValidKeys.includes(prop)) {\n throw new Error(`\\`ENV.${prop}\\` exists, but is not available in this environment`);\n } else {\n throw new Error(`\\`ENV.${prop}\\` does not exist`);\n }\n }\n return undefined;\n },\n});\n\nexport const ENV = EnvProxy;\n"]}
@@ -1,8 +1,8 @@
1
1
  import { isBundledSEA } from './chunk-GXNQVEXD.js';
2
- import { fmt } from './chunk-6PZXN47A.js';
2
+ import { fmt } from './chunk-INGOLNLE.js';
3
3
  import { define } from './chunk-4A54P4EM.js';
4
- import { CliExitError } from './chunk-LGEHJHB2.js';
5
- import { require_semver, ansis_default, downloadPluginToCache } from './chunk-6CRDPEUT.js';
4
+ import { CliExitError } from './chunk-JOGGSYT2.js';
5
+ import { require_semver, ansis_default, downloadPluginToCache } from './chunk-GKN3UJNE.js';
6
6
  import { __toESM, __name } from './chunk-6PEHRAEP.js';
7
7
 
8
8
  // src/cli/commands/install-plugin.command.ts
@@ -75,5 +75,5 @@ For example: ${fmt.command("add my-plugin", { jsPackageManager: true })}`
75
75
  }, "commandFn");
76
76
 
77
77
  export { commandFn, commandSpec };
78
- //# sourceMappingURL=chunk-FCSQRLIC.js.map
79
- //# sourceMappingURL=chunk-FCSQRLIC.js.map
78
+ //# sourceMappingURL=chunk-WJLMLKSG.js.map
79
+ //# sourceMappingURL=chunk-WJLMLKSG.js.map