varlock 1.1.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 (137) hide show
  1. package/dist/audit.command-LLD5UIAW.js +16 -0
  2. package/dist/audit.command-LLD5UIAW.js.map +1 -0
  3. package/dist/auto-load.js +6 -6
  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-E3F6QKDZ.js → chunk-C5LW5EET.js} +6 -6
  7. package/dist/{chunk-E3F6QKDZ.js.map → chunk-C5LW5EET.js.map} +1 -1
  8. package/dist/chunk-CESFJIM4.js +198 -0
  9. package/dist/chunk-CESFJIM4.js.map +1 -0
  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-SDN53OAC.js → chunk-F6ZYIWAR.js} +160 -72
  13. package/dist/chunk-F6ZYIWAR.js.map +1 -0
  14. package/dist/{chunk-2PFIYNFA.js → chunk-FA5SNEKN.js} +30 -13
  15. package/dist/chunk-FA5SNEKN.js.map +1 -0
  16. package/dist/{chunk-XWYFSG46.js → chunk-GKN3UJNE.js} +651 -821
  17. package/dist/chunk-GKN3UJNE.js.map +1 -0
  18. package/dist/{chunk-TQXYC3G3.js → chunk-HH647LSU.js} +5 -5
  19. package/dist/{chunk-TQXYC3G3.js.map → chunk-HH647LSU.js.map} +1 -1
  20. package/dist/{chunk-6RF54KKR.js → chunk-HMWAOBZR.js} +78 -24
  21. package/dist/chunk-HMWAOBZR.js.map +1 -0
  22. package/dist/{chunk-H6NILU2I.js → chunk-INGOLNLE.js} +4 -4
  23. package/dist/{chunk-H6NILU2I.js.map → chunk-INGOLNLE.js.map} +1 -1
  24. package/dist/{chunk-JIUWL2NT.js → chunk-IO2OGZQU.js} +9 -9
  25. package/dist/chunk-IO2OGZQU.js.map +1 -0
  26. package/dist/chunk-IRXBCLL2.js +2045 -0
  27. package/dist/chunk-IRXBCLL2.js.map +1 -0
  28. package/dist/{chunk-QP7TS4SU.js → chunk-JOGGSYT2.js} +6 -6
  29. package/dist/chunk-JOGGSYT2.js.map +1 -0
  30. package/dist/{chunk-F6RTQ5QX.js → chunk-KFALDUEO.js} +3 -3
  31. package/dist/{chunk-F6RTQ5QX.js.map → chunk-KFALDUEO.js.map} +1 -1
  32. package/dist/{chunk-VN4LKYXR.js → chunk-KI5QLKPU.js} +6 -6
  33. package/dist/{chunk-VN4LKYXR.js.map → chunk-KI5QLKPU.js.map} +1 -1
  34. package/dist/{chunk-JUPAI2X4.js → chunk-M6QE3D2O.js} +7 -7
  35. package/dist/{chunk-JUPAI2X4.js.map → chunk-M6QE3D2O.js.map} +1 -1
  36. package/dist/{chunk-CDLU5P62.js → chunk-MPHVA4WC.js} +3 -3
  37. package/dist/{chunk-CDLU5P62.js.map → chunk-MPHVA4WC.js.map} +1 -1
  38. package/dist/{chunk-U2O3AUM2.js → chunk-NW4KR67N.js} +8 -8
  39. package/dist/{chunk-U2O3AUM2.js.map → chunk-NW4KR67N.js.map} +1 -1
  40. package/dist/{chunk-S5O4AAVX.js → chunk-OGGTDFVX.js} +8 -8
  41. package/dist/{chunk-S5O4AAVX.js.map → chunk-OGGTDFVX.js.map} +1 -1
  42. package/dist/chunk-P33JXOU6.js +523 -0
  43. package/dist/chunk-P33JXOU6.js.map +1 -0
  44. package/dist/{chunk-R73FENLU.js → chunk-QDEAHBCB.js} +3 -3
  45. package/dist/{chunk-R73FENLU.js.map → chunk-QDEAHBCB.js.map} +1 -1
  46. package/dist/{chunk-RBFS2QGC.js → chunk-RQZZDYWL.js} +8 -8
  47. package/dist/{chunk-RBFS2QGC.js.map → chunk-RQZZDYWL.js.map} +1 -1
  48. package/dist/{chunk-MGWUDHT5.js → chunk-UUJK65RS.js} +11 -3
  49. package/dist/chunk-UUJK65RS.js.map +1 -0
  50. package/dist/{chunk-A6THM3IR.js → chunk-WJLMLKSG.js} +5 -5
  51. package/dist/{chunk-A6THM3IR.js.map → chunk-WJLMLKSG.js.map} +1 -1
  52. package/dist/{chunk-YO6WHPM4.js → chunk-WTBUNHUJ.js} +5 -5
  53. package/dist/{chunk-YO6WHPM4.js.map → chunk-WTBUNHUJ.js.map} +1 -1
  54. package/dist/chunk-XUY3HAO2.js +171 -0
  55. package/dist/chunk-XUY3HAO2.js.map +1 -0
  56. package/dist/{chunk-ZJNDICC4.js → chunk-XXSPHSF7.js} +6 -6
  57. package/dist/{chunk-ZJNDICC4.js.map → chunk-XXSPHSF7.js.map} +1 -1
  58. package/dist/{chunk-GURKQO4J.js → chunk-YWTIKDGU.js} +7 -2
  59. package/dist/chunk-YWTIKDGU.js.map +1 -0
  60. package/dist/{chunk-F5H5MJ6U.js → chunk-ZTFQ7ZVH.js} +2 -5
  61. package/dist/chunk-ZTFQ7ZVH.js.map +1 -0
  62. package/dist/cli/cli-executable.js +54 -51
  63. package/dist/cli/cli-executable.js.map +1 -1
  64. package/dist/config-item-SQFJ2BJ2.js +7 -0
  65. package/dist/{config-item-6LTV4PNH.js.map → config-item-SQFJ2BJ2.js.map} +1 -1
  66. package/dist/dist-ZBZ52DPW.js +4 -0
  67. package/dist/{dist-WGIHRGBZ.js.map → dist-ZBZ52DPW.js.map} +1 -1
  68. package/dist/dotenv-compat.js +6 -6
  69. package/dist/encrypt.command-WISNYCTG.js +14 -0
  70. package/dist/{encrypt.command-F2OTB6HD.js.map → encrypt.command-WISNYCTG.js.map} +1 -1
  71. package/dist/{env-graph-iNQyTcya.d.ts → env-graph-DImkUkjl.d.ts} +30 -19
  72. package/dist/explain.command-THO6CRHD.js +15 -0
  73. package/dist/{explain.command-TEIPRC7Q.js.map → explain.command-THO6CRHD.js.map} +1 -1
  74. package/dist/index.d.ts +2 -2
  75. package/dist/index.js +14 -15
  76. package/dist/index.js.map +1 -1
  77. package/dist/init.command-3EDACW36.js +14 -0
  78. package/dist/{init.command-5LP3UFKD.js.map → init.command-3EDACW36.js.map} +1 -1
  79. package/dist/install-plugin.command-MXBZTBTE.js +13 -0
  80. package/dist/{install-plugin.command-X7RSLPUJ.js.map → install-plugin.command-MXBZTBTE.js.map} +1 -1
  81. package/dist/lib/exec-sync-varlock.js +1 -1
  82. package/dist/load.command-XRABTXAE.js +15 -0
  83. package/dist/{load.command-7SQRDQ3E.js.map → load.command-XRABTXAE.js.map} +1 -1
  84. package/dist/lock.command-O5MPBQ2I.js +7 -0
  85. package/dist/{lock.command-4LTGMJA3.js.map → lock.command-O5MPBQ2I.js.map} +1 -1
  86. package/dist/plugin-lib.d.ts +2 -2
  87. package/dist/plugin-lib.js +2 -2
  88. package/dist/printenv.command-DLCI4IPZ.js +15 -0
  89. package/dist/{printenv.command-ON7RMFEU.js.map → printenv.command-DLCI4IPZ.js.map} +1 -1
  90. package/dist/reveal.command-6BTK3FJZ.js +15 -0
  91. package/dist/{reveal.command-BW6XYVXH.js.map → reveal.command-6BTK3FJZ.js.map} +1 -1
  92. package/dist/run.command-5CIHZECD.js +16 -0
  93. package/dist/{run.command-5QADABYL.js.map → run.command-5CIHZECD.js.map} +1 -1
  94. package/dist/runtime/env.d.ts +1 -1
  95. package/dist/runtime/env.js +1 -1
  96. package/dist/runtime/init-edge.cjs +9 -1
  97. package/dist/runtime/init-server.cjs +9 -1
  98. package/dist/runtime/patch-console.js +2 -2
  99. package/dist/runtime/patch-response.js +2 -2
  100. package/dist/runtime/patch-server-response.js +2 -2
  101. package/dist/scan.command-PW3OOLQY.js +16 -0
  102. package/dist/{scan.command-ZVW3XAUG.js.map → scan.command-PW3OOLQY.js.map} +1 -1
  103. package/dist/telemetry.command-TZDNG2WR.js +13 -0
  104. package/dist/{telemetry.command-PY6E4QSH.js.map → telemetry.command-TZDNG2WR.js.map} +1 -1
  105. package/dist/typegen.command-QD26Q3MP.js +14 -0
  106. package/dist/{typegen.command-KZ4O5IKQ.js.map → typegen.command-QD26Q3MP.js.map} +1 -1
  107. package/native-bins/darwin/VarlockEnclave.app/Contents/CodeResources +0 -0
  108. package/native-bins/darwin/VarlockEnclave.app/Contents/MacOS/varlock-local-encrypt +0 -0
  109. package/native-bins/win32-x64/varlock-local-encrypt.exe +0 -0
  110. package/package.json +2 -2
  111. package/dist/chunk-2PFIYNFA.js.map +0 -1
  112. package/dist/chunk-6RF54KKR.js.map +0 -1
  113. package/dist/chunk-7GFD2ATN.js +0 -136
  114. package/dist/chunk-7GFD2ATN.js.map +0 -1
  115. package/dist/chunk-F5H5MJ6U.js.map +0 -1
  116. package/dist/chunk-GURKQO4J.js.map +0 -1
  117. package/dist/chunk-HDKXXS2X.js +0 -1959
  118. package/dist/chunk-HDKXXS2X.js.map +0 -1
  119. package/dist/chunk-JIUWL2NT.js.map +0 -1
  120. package/dist/chunk-MGWUDHT5.js.map +0 -1
  121. package/dist/chunk-QP7TS4SU.js.map +0 -1
  122. package/dist/chunk-SDN53OAC.js.map +0 -1
  123. package/dist/chunk-XWYFSG46.js.map +0 -1
  124. package/dist/config-item-6LTV4PNH.js +0 -7
  125. package/dist/dist-WGIHRGBZ.js +0 -4
  126. package/dist/encrypt.command-F2OTB6HD.js +0 -14
  127. package/dist/explain.command-TEIPRC7Q.js +0 -15
  128. package/dist/init.command-5LP3UFKD.js +0 -13
  129. package/dist/install-plugin.command-X7RSLPUJ.js +0 -13
  130. package/dist/load.command-7SQRDQ3E.js +0 -15
  131. package/dist/lock.command-4LTGMJA3.js +0 -7
  132. package/dist/printenv.command-ON7RMFEU.js +0 -15
  133. package/dist/reveal.command-BW6XYVXH.js +0 -15
  134. package/dist/run.command-5QADABYL.js +0 -16
  135. package/dist/scan.command-ZVW3XAUG.js +0 -16
  136. package/dist/telemetry.command-PY6E4QSH.js +0 -13
  137. package/dist/typegen.command-KZ4O5IKQ.js +0 -15
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli/commands/explain.command.ts"],"names":[],"mappings":"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","file":"chunk-S5O4AAVX.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":";;;;;;;;;;;AAeO,IAAM,cAAc,MAAA,CAAO;AAAA,EAChC,IAAA,EAAM,SAAA;AAAA,EACN,WAAA,EAAa,+DAAA;AAAA,EACb,IAAA,EAAM;AAAA,IACJ,GAAA,EAAK;AAAA,MACH,IAAA,EAAM,QAAA;AAAA,MACN,WAAA,EAAa;AAAA,KACf;AAAA,IACA,IAAA,EAAM;AAAA,MACJ,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,GAAA;AAAA,MACP,QAAA,EAAU,IAAA;AAAA,MACV,WAAA,EAAa;AAAA;AACf,GACF;AAAA,EACA,QAAA,EAAU;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA,CAAA,CAQV,IAAA;AACF,CAAC;AAED,SAAS,gBAAA,CAAiB,QAAA,EAAe,MAAA,GAAS,EAAA,EAAY;AAC5D,EAAA,IAAI,oBAAoB,mBAAA,EAAqB;AAC3C,IAAA,OAAO,GAAG,MAAM,CAAA,YAAA,CAAA;AAAA,EAClB;AACA,EAAA,MAAM,SAAS,QAAA,CAAS,MAAA;AACxB,EAAA,IAAI,MAAA,IAAU,CAAC,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA,EAAG;AACtC,IAAA,OAAO,CAAA,EAAG,MAAM,CAAA,EAAG,MAAM,CAAA,EAAA,CAAA;AAAA,EAC3B;AACA,EAAA,OAAO,GAAG,MAAM,CAAA,UAAA,CAAA;AAClB;AATS,MAAA,CAAA,gBAAA,EAAA,kBAAA,CAAA;AAWF,IAAM,SAAA,iCAA6D,GAAA,KAAQ;AAChF,EAAA,MAAM,WAAA,GAAA,CAAe,IAAI,WAAA,IAAe,IAAI,KAAA,CAAM,GAAA,CAAI,WAAA,EAAa,MAAA,IAAU,CAAC,CAAA;AAC9E,EAAA,IAAI,CAAC,YAAY,MAAA,EAAQ;AACvB,IAAA,MAAM,IAAI,aAAa,0CAAA,EAA4C;AAAA,MACjE,UAAA,EAAY;AAAA,KACb,CAAA;AAAA,EACH;AACA,EAAA,MAAM,OAAA,GAAU,YAAY,CAAC,CAAA;AAE7B,EAAA,MAAM,QAAA,GAAW,MAAM,mBAAA,CAAoB;AAAA,IACzC,kBAAA,EAAoB,IAAI,MAAA,CAAO,GAAA;AAAA,IAC/B,cAAA,EAAgB,IAAI,MAAA,CAAO;AAAA,GAC5B,CAAA;AAED,EAAA,oBAAA,CAAqB,QAAQ,CAAA;AAC7B,EAAA,kBAAA,CAAmB,QAAQ,CAAA;AAE3B,EAAA,IAAI,EAAE,OAAA,IAAW,QAAA,CAAS,YAAA,CAAA,EAAe;AACvC,IAAA,MAAM,IAAI,YAAA,CAAa,CAAA,UAAA,EAAa,OAAO,CAAA,qBAAA,CAAuB,CAAA;AAAA,EACpE;AAEA,EAAA,MAAM,SAAS,gBAAA,EAAiB;AAEhC,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,YAAA,CAAa,OAAO,CAAA;AAC1C,EAAA,MAAM,cAAc,IAAA,CAAK,WAAA;AAGzB,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,EAAA,OAAA,CAAQ,GAAA,CAAI,cAAM,IAAA,CAAK,IAAA,CAAK,KAAK,IAAA,CAAK,GAAG,EAAE,CAAC,CAAA;AAC5C,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAGd,EAAA,IAAI,KAAK,WAAA,EAAa;AACpB,IAAA,OAAA,CAAQ,GAAA,CAAI,KAAK,aAAA,CAAM,IAAA,CAAK,cAAc,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,WAAW,CAAA,CAAE,CAAA;AAAA,EACnE;AAGA,EAAA,IAAI,KAAK,QAAA,EAAU;AACjB,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAA,EAAK,aAAA,CAAM,IAAA,CAAK,OAAO,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA,CAAE,CAAA;AAAA,EAC9D;AAGA,EAAA,MAAM,QAAQ,EAAC;AACf,EAAA,IAAI,IAAA,CAAK,UAAA,EAAY,KAAA,CAAM,IAAA,CAAK,UAAU,CAAA;AAAA,OACrC,KAAA,CAAM,KAAK,UAAU,CAAA;AAC1B,EAAA,IAAI,WAAA,EAAa,KAAA,CAAM,IAAA,CAAK,WAAW,CAAA;AAAA,OAClC,KAAA,CAAM,KAAK,QAAQ,CAAA;AACxB,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAA,EAAK,aAAA,CAAM,IAAA,CAAK,aAAa,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAGhE,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,EAAA,OAAA,CAAQ,GAAA,CAAI,aAAA,CAAM,IAAA,CAAK,kBAAkB,CAAC,CAAA;AAC1C,EAAA,IAAI,IAAA,CAAK,oBAAoB,OAAA,EAAS;AACpC,IAAA,OAAA,CAAQ,IAAI,CAAA,EAAA,EAAK,aAAA,CAAM,GAAA,CAAI,uBAAuB,CAAC,CAAA,CAAE,CAAA;AACrD,IAAA,KAAA,MAAW,GAAA,IAAO,KAAK,MAAA,EAAQ;AAC7B,MAAA,OAAA,CAAQ,GAAA,CAAI,KAAK,aAAA,CAAM,GAAA,CAAI,OAAO,GAAA,CAAI,OAAO,CAAA,CAAE,CAAC,CAAA,CAAE,CAAA;AAAA,IACpD;AAAA,EACF,CAAA,MAAO;AACL,IAAA,IAAI,MAAA,GAAS,cAAA,CAAe,IAAA,CAAK,aAAA,EAAe,IAAI,CAAA;AACpD,IAAA,IAAI,eAAe,IAAA,CAAK,aAAA,IAAiB,gBAAE,QAAA,CAAS,IAAA,CAAK,aAAa,CAAA,EAAG;AACvE,MAAA,MAAA,GAAS,YAAA,CAAa,KAAK,aAAa,CAAA;AAAA,IAC1C;AACA,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,IAAA,EAAO,MAAM,CAAA,CAAE,CAAA;AAC3B,IAAA,IAAI,KAAK,SAAA,EAAW;AAClB,MAAA,IAAI,MAAA,GAAS,cAAA,CAAe,IAAA,CAAK,gBAAA,EAAkB,IAAI,CAAA;AACvD,MAAA,IAAI,eAAe,IAAA,CAAK,gBAAA,IAAoB,gBAAE,QAAA,CAAS,IAAA,CAAK,gBAAgB,CAAA,EAAG;AAC7E,QAAA,MAAA,GAAS,YAAA,CAAa,KAAK,gBAAgB,CAAA;AAAA,MAC7C;AACA,MAAA,OAAA,CAAQ,GAAA,CAAI,OAAO,aAAA,CAAM,IAAA,CAAK,OAAO,CAAA,aAAA,EAAgB,MAAM,CAAA,CAAE,CAAC,CAAA,CAAE,CAAA;AAAA,IAClE;AAAA,EACF;AAGA,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,EAAA,OAAA,CAAQ,GAAA,CAAI,aAAA,CAAM,IAAA,CAAK,gBAAgB,CAAC,CAAA;AAExC,EAAA,IAAI,KAAK,YAAA,EAAc;AACrB,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,IAAA,EAAO,aAAA,CAAM,MAAA,CAAO,6BAAwB,CAAC,CAAA,CAAA,EAAI,aAAA,CAAM,MAAA,CAAO,IAAA,CAAK,UAAU,CAAC,CAAA,CAAE,CAAA;AAC5F,IAAA,MAAM,iBAAiB,IAAA,CAAK,cAAA;AAC5B,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA,MAAM,WAAA,GAAc,cAAA,CAAe,MAAA,EAAQ,KAAA,IAAS,UAAA;AACpD,MAAA,MAAM,YAAA,GAAe,eAAe,OAAA,CAAQ,QAAA,GACxC,iBAAiB,cAAA,CAAe,OAAA,CAAQ,QAAQ,CAAA,GAChD,UAAA;AACJ,MAAA,OAAA,CAAQ,IAAI,CAAA,IAAA,EAAO,aAAA,CAAM,IAAA,CAAK,QAAG,CAAC,CAAA,CAAA,EAAI,aAAA,CAAM,IAAA,CAAK,MAAA,CAAO,aAAa,YAAY,CAAA,MAAA,EAAS,WAAW,CAAA,iBAAA,CAAmB,CAAC,CAAA,CAAE,CAAA;AAAA,IAC7H;AAAA,EACF,CAAA,MAAO;AACL,IAAA,MAAM,iBAAiB,IAAA,CAAK,cAAA;AAC5B,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA,MAAM,WAAA,GAAc,cAAA,CAAe,MAAA,EAAQ,KAAA,IAAS,UAAA;AACpD,MAAA,MAAM,YAAA,GAAe,eAAe,OAAA,CAAQ,QAAA,GACxC,iBAAiB,cAAA,CAAe,OAAA,CAAQ,QAAQ,CAAA,GAChD,UAAA;AACJ,MAAA,OAAA,CAAQ,GAAA,CAAI,OAAO,YAAY,CAAA,MAAA,EAAS,cAAM,IAAA,CAAK,WAAW,CAAC,CAAA,CAAE,CAAA;AAAA,IACnE,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,IAAI,CAAA,IAAA,EAAO,aAAA,CAAM,IAAA,CAAK,gBAAgB,CAAC,CAAA,CAAE,CAAA;AAAA,IACnD;AAAA,EACF;AAGA,EAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,EAAA,IAAI,KAAK,MAAA,EAAQ;AACf,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,IAAA,OAAA,CAAQ,IAAI,aAAA,CAAM,IAAA,CAAK,mBAAmB,CAAA,GAAI,cAAM,IAAA,CAAK,CAAA,EAAA,EAAK,IAAA,CAAK,MAAM,UAAU,IAAA,CAAK,MAAA,GAAS,IAAI,GAAA,GAAM,EAAE,2BAA2B,CAAC,CAAA;AAEzI,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,MAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAClB,MAAA,MAAM,WAAA,GAAc,GAAA,CAAI,MAAA,EAAQ,KAAA,IAAS,oBAAA;AACzC,MAAA,MAAM,UAAA,GAAa,GAAA,CAAI,MAAA,EAAQ,IAAA,IAAQ,SAAA;AAEvC,MAAA,MAAM,cAAA,GAAiB,CAAC,IAAA,CAAK,YAAA,IAAgB,QAAQ,IAAA,CAAK,cAAA;AAC1D,MAAA,MAAM,MAAA,GAAS,cAAA,GAAiB,aAAA,CAAM,KAAA,CAAM,gBAAW,CAAA,GAAI,EAAA;AAE3D,MAAA,OAAA,CAAQ,GAAA,CAAI,OAAO,aAAA,CAAM,IAAA,CAAK,GAAG,CAAA,GAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,EAAI,aAAA,CAAM,KAAK,WAAW,CAAC,CAAA,CAAA,EAAI,aAAA,CAAM,IAAA,CAAK,CAAA,CAAA,EAAI,UAAU,CAAA,CAAA,CAAG,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,CAAA;AAGjH,MAAA,IAAI,GAAA,CAAI,QAAQ,QAAA,EAAU;AACxB,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,OAAA,EAAU,aAAA,CAAM,IAAA,CAAK,QAAQ,CAAC,CAAA,CAAA,EAAI,gBAAA,CAAiB,GAAA,CAAI,OAAA,CAAQ,QAAQ,CAAC,CAAA,CAAE,CAAA;AAAA,MACxF,CAAA,MAAO;AACL,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,OAAA,EAAU,aAAA,CAAM,IAAA,CAAK,QAAQ,CAAC,CAAA,CAAA,EAAI,aAAA,CAAM,IAAA,CAAK,MAAA,CAAO,0BAA0B,CAAC,CAAA,CAAE,CAAA;AAAA,MAC/F;AAGA,MAAA,MAAM,QAAA,GAAW,GAAA,CAAI,OAAA,CAAQ,UAAA,EAAY,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAA,EAAI,CAAA,CAAE,IAAI,CAAA,CAAE,CAAA,CAAE,KAAK,IAAI,CAAA;AAC3E,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,OAAA,EAAU,aAAA,CAAM,IAAA,CAAK,aAAa,CAAC,CAAA,CAAA,EAAI,aAAA,CAAM,OAAA,CAAQ,QAAQ,CAAC,CAAA,CAAE,CAAA;AAAA,MAC9E;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,YAAY,IAAA,CAAK,SAAA;AACvB,EAAA,IAAI,UAAU,MAAA,EAAQ;AACpB,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,IAAA,OAAA,CAAQ,GAAA,CAAI,aAAA,CAAM,IAAA,CAAK,iBAAiB,CAAC,CAAA;AACzC,IAAA,KAAA,MAAW,QAAQ,SAAA,EAAW;AAC5B,MAAA,MAAM,QAAQ,IAAA,CAAK,WAAA,GAAc,CAAA,EAAG,IAAA,CAAK,WAAW,CAAA,EAAA,CAAA,GAAO,EAAA;AAC3D,MAAA,OAAA,CAAQ,GAAA,CAAI,OAAO,KAAK,CAAA,EAAG,cAAM,SAAA,CAAU,IAAA,CAAK,GAAG,CAAC,CAAA,CAAE,CAAA;AAAA,IACxD;AAAA,EACF;AAEA,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAEd,EAAA,IAAI,IAAA,CAAK,oBAAoB,OAAA,EAAS;AACpC,IAAA,YAAA,CAAa,CAAC,CAAA;AAAA,EAChB;AACF,CAAA,EAlJmE,WAAA","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"]}
@@ -0,0 +1,523 @@
1
+ import { __name } from './chunk-6PEHRAEP.js';
2
+ import fs from 'fs/promises';
3
+ import path from 'path';
4
+
5
+ var DEFAULT_IGNORED_DIRS = [
6
+ ".git",
7
+ "node_modules",
8
+ "dist",
9
+ "build",
10
+ ".next",
11
+ "vendor",
12
+ ".venv"
13
+ ];
14
+ var DEFAULT_MAX_FILE_SIZE_BYTES = 1024 * 1024;
15
+ var DEFAULT_CONCURRENCY = 50;
16
+ var ENV_KEY_IDENTIFIER_REGEX = /^[A-Za-z_][A-Za-z0-9_]*$/;
17
+ var LANGUAGE_BY_EXTENSION = {
18
+ ".js": "js-like",
19
+ ".mjs": "js-like",
20
+ ".cjs": "js-like",
21
+ ".jsx": "js-like",
22
+ ".ts": "js-like",
23
+ ".mts": "js-like",
24
+ ".cts": "js-like",
25
+ ".tsx": "js-like",
26
+ ".vue": "js-like",
27
+ ".svelte": "js-like",
28
+ ".astro": "js-like",
29
+ ".mdx": "js-like",
30
+ ".py": "python",
31
+ ".go": "go",
32
+ ".rb": "ruby",
33
+ ".php": "php",
34
+ ".rs": "rust",
35
+ ".java": "java",
36
+ ".cs": "csharp"
37
+ };
38
+ var PATTERNS_BY_LANGUAGE = {
39
+ "js-like": [
40
+ {
41
+ regex: /\bprocess\.env\.([A-Za-z_][A-Za-z0-9_]*)\b/g,
42
+ syntax: "process.env.member"
43
+ },
44
+ {
45
+ regex: /\bprocess\.env\[\s*['"`]([A-Za-z_][A-Za-z0-9_]*)['"`]\s*\]/g,
46
+ syntax: "process.env.bracket"
47
+ },
48
+ {
49
+ regex: /\bimport\.meta\.env\.([A-Za-z_][A-Za-z0-9_]*)\b/g,
50
+ syntax: "import.meta.env.member"
51
+ },
52
+ {
53
+ regex: /\bimport\.meta\.env\[\s*['"`]([A-Za-z_][A-Za-z0-9_]*)['"`]\s*\]/g,
54
+ syntax: "import.meta.env.bracket"
55
+ },
56
+ {
57
+ regex: /\bENV\.([A-Za-z_][A-Za-z0-9_]*)\b/g,
58
+ syntax: "ENV.member"
59
+ },
60
+ {
61
+ regex: /\bENV\[\s*['"`]([A-Za-z_][A-Za-z0-9_]*)['"`]\s*\]/g,
62
+ syntax: "ENV.bracket"
63
+ }
64
+ ],
65
+ python: [
66
+ {
67
+ regex: /\bos\.environ\[\s*['"]([A-Za-z_][A-Za-z0-9_]*)['"]\s*\]/g,
68
+ syntax: "python.environ"
69
+ },
70
+ {
71
+ regex: /\bos\.getenv\(\s*['"]([A-Za-z_][A-Za-z0-9_]*)['"]/g,
72
+ syntax: "python.getenv"
73
+ }
74
+ ],
75
+ go: [
76
+ {
77
+ regex: /\bos\.(?:Getenv|LookupEnv)\(\s*"([A-Za-z_][A-Za-z0-9_]*)"\s*\)/g,
78
+ syntax: "go.getenv"
79
+ }
80
+ ],
81
+ ruby: [
82
+ {
83
+ regex: /\bENV\[\s*['"]([A-Za-z_][A-Za-z0-9_]*)['"]\s*\]/g,
84
+ syntax: "ruby.env"
85
+ },
86
+ {
87
+ regex: /\bENV\.fetch\(\s*['"]([A-Za-z_][A-Za-z0-9_]*)['"]/g,
88
+ syntax: "ruby.fetch"
89
+ }
90
+ ],
91
+ php: [
92
+ {
93
+ regex: /\bgetenv\(\s*['"]([A-Za-z_][A-Za-z0-9_]*)['"]/g,
94
+ syntax: "php.getenv"
95
+ },
96
+ {
97
+ regex: /\$_ENV\[\s*['"]([A-Za-z_][A-Za-z0-9_]*)['"]\s*\]/g,
98
+ syntax: "php._env"
99
+ },
100
+ {
101
+ regex: /\$_SERVER\[\s*['"]([A-Za-z_][A-Za-z0-9_]*)['"]\s*\]/g,
102
+ syntax: "php._server"
103
+ }
104
+ ],
105
+ rust: [
106
+ {
107
+ regex: /\bstd::env::(?:var|var_os)\(\s*"([A-Za-z_][A-Za-z0-9_]*)"\s*\)/g,
108
+ syntax: "rust.getenv"
109
+ }
110
+ ],
111
+ java: [
112
+ {
113
+ regex: /\bSystem\.getenv\(\s*"([A-Za-z_][A-Za-z0-9_]*)"\s*\)/g,
114
+ syntax: "java.getenv"
115
+ }
116
+ ],
117
+ csharp: [
118
+ {
119
+ regex: /\bEnvironment\.GetEnvironmentVariable\(\s*"([A-Za-z_][A-Za-z0-9_]*)"\s*\)/g,
120
+ syntax: "csharp.getenv"
121
+ }
122
+ ]
123
+ };
124
+ var JS_DESTRUCTURE_PATTERNS = [
125
+ {
126
+ regex: /\{([^}]*)\}\s*=\s*process\.env\b/g,
127
+ syntax: "process.env.destructure"
128
+ },
129
+ {
130
+ regex: /\{([^}]*)\}\s*=\s*import\.meta\.env\b/g,
131
+ syntax: "import.meta.env.destructure"
132
+ },
133
+ {
134
+ regex: /\{([^}]*)\}\s*=\s*ENV\b/g,
135
+ syntax: "ENV.destructure"
136
+ }
137
+ ];
138
+ async function discoverSourceFiles(cwd, ignoredDirs) {
139
+ const filePaths = [];
140
+ const globExcludes = [...ignoredDirs].flatMap((dirName) => [`**/${dirName}`, `**/${dirName}/**`]);
141
+ for await (const relativePath of fs.glob("**/*", { cwd, exclude: globExcludes })) {
142
+ const normalizedRelativePath = String(relativePath).replaceAll("\\", "/");
143
+ const extension = path.extname(normalizedRelativePath).toLowerCase();
144
+ if (!(extension in LANGUAGE_BY_EXTENSION)) continue;
145
+ filePaths.push(path.resolve(cwd, normalizedRelativePath));
146
+ }
147
+ return filePaths;
148
+ }
149
+ __name(discoverSourceFiles, "discoverSourceFiles");
150
+ function extractDestructuredKeys(body) {
151
+ const found = [];
152
+ const propPattern = /(^|,)\s*([A-Za-z_][A-Za-z0-9_]*)\s*(?::\s*[A-Za-z_][A-Za-z0-9_]*)?\s*(?:=[^,]+)?\s*(?=,|$)/g;
153
+ for (const match of body.matchAll(propPattern)) {
154
+ const key = match[2];
155
+ if (!key) continue;
156
+ const wholeMatch = match[0] || "";
157
+ const keyIndexInWhole = wholeMatch.indexOf(key);
158
+ const relativeIndex = (match.index ?? 0) + (keyIndexInWhole >= 0 ? keyIndexInWhole : 0);
159
+ found.push({ key, relativeIndex });
160
+ }
161
+ return found;
162
+ }
163
+ __name(extractDestructuredKeys, "extractDestructuredKeys");
164
+ function getNewlineIndices(content) {
165
+ const indices = [];
166
+ for (let i = 0; i < content.length; i++) {
167
+ if (content.charCodeAt(i) === 10) indices.push(i);
168
+ }
169
+ return indices;
170
+ }
171
+ __name(getNewlineIndices, "getNewlineIndices");
172
+ function indexToLineAndColumn(content, newlineIndices, index) {
173
+ let lo = 0;
174
+ let hi = newlineIndices.length;
175
+ while (lo < hi) {
176
+ const mid = lo + Math.floor((hi - lo) / 2);
177
+ if (newlineIndices[mid] < index) lo = mid + 1;
178
+ else hi = mid;
179
+ }
180
+ const lineNumber = lo + 1;
181
+ const lineStartIndex = lo === 0 ? 0 : newlineIndices[lo - 1] + 1;
182
+ return {
183
+ lineNumber,
184
+ columnNumber: index - lineStartIndex + 1
185
+ };
186
+ }
187
+ __name(indexToLineAndColumn, "indexToLineAndColumn");
188
+ function buildReference(filePath, content, newlineIndices, index, key, syntax) {
189
+ const { lineNumber, columnNumber } = indexToLineAndColumn(content, newlineIndices, index);
190
+ return {
191
+ filePath,
192
+ key,
193
+ lineNumber,
194
+ columnNumber,
195
+ syntax
196
+ };
197
+ }
198
+ __name(buildReference, "buildReference");
199
+ function skipQuotedWithoutMask(chars, startIndex, quoteChar) {
200
+ let i = startIndex + 1;
201
+ while (i < chars.length) {
202
+ const ch = chars[i];
203
+ if (ch === "\\") {
204
+ i += 2;
205
+ continue;
206
+ }
207
+ if (ch === quoteChar) {
208
+ i++;
209
+ return i;
210
+ }
211
+ i++;
212
+ }
213
+ return i;
214
+ }
215
+ __name(skipQuotedWithoutMask, "skipQuotedWithoutMask");
216
+ function skipTemplateWithoutMask(chars, startIndex) {
217
+ let i = startIndex + 1;
218
+ while (i < chars.length) {
219
+ const ch = chars[i];
220
+ const next = chars[i + 1];
221
+ if (ch === "\\") {
222
+ i += 2;
223
+ continue;
224
+ }
225
+ if (ch === "`") {
226
+ i++;
227
+ return i;
228
+ }
229
+ if (ch === "$" && next === "{") {
230
+ i += 2;
231
+ let depth = 1;
232
+ while (i < chars.length && depth > 0) {
233
+ if (chars[i] === "\\") {
234
+ i += 2;
235
+ continue;
236
+ }
237
+ if (chars[i] === "{") depth++;
238
+ else if (chars[i] === "}") depth--;
239
+ i++;
240
+ }
241
+ continue;
242
+ }
243
+ i++;
244
+ }
245
+ return i;
246
+ }
247
+ __name(skipTemplateWithoutMask, "skipTemplateWithoutMask");
248
+ function skipAndMaskQuotedString(chars, startIndex, quoteChar) {
249
+ let i = startIndex + 1;
250
+ while (i < chars.length) {
251
+ const ch = chars[i];
252
+ if (ch === "\\") {
253
+ i += 2;
254
+ continue;
255
+ }
256
+ if (ch === quoteChar) {
257
+ i++;
258
+ break;
259
+ }
260
+ i++;
261
+ }
262
+ const endExclusive = i;
263
+ const inner = chars.slice(startIndex + 1, Math.max(startIndex + 1, endExclusive - 1)).join("");
264
+ const keepInner = ENV_KEY_IDENTIFIER_REGEX.test(inner);
265
+ if (!keepInner) {
266
+ for (let idx = startIndex + 1; idx < endExclusive - 1; idx++) {
267
+ if (chars[idx] !== "\n") chars[idx] = " ";
268
+ }
269
+ }
270
+ return endExclusive;
271
+ }
272
+ __name(skipAndMaskQuotedString, "skipAndMaskQuotedString");
273
+ function skipAndMaskTemplateLiteral(chars, startIndex) {
274
+ let i = startIndex + 1;
275
+ let segmentStart = i;
276
+ const literalSegments = [];
277
+ let hasInterpolation = false;
278
+ while (i < chars.length) {
279
+ const ch = chars[i];
280
+ const next = chars[i + 1];
281
+ if (ch === "\\") {
282
+ i += 2;
283
+ continue;
284
+ }
285
+ if (ch === "`") {
286
+ literalSegments.push({ start: segmentStart, endExclusive: i });
287
+ i++;
288
+ break;
289
+ }
290
+ if (ch === "$" && next === "{") {
291
+ hasInterpolation = true;
292
+ literalSegments.push({ start: segmentStart, endExclusive: i });
293
+ i += 2;
294
+ let depth = 1;
295
+ while (i < chars.length && depth > 0) {
296
+ const exprCh = chars[i];
297
+ const exprNext = chars[i + 1];
298
+ if (exprCh === "\\") {
299
+ i += 2;
300
+ continue;
301
+ }
302
+ if (exprCh === "'" || exprCh === '"') {
303
+ i = skipQuotedWithoutMask(chars, i, exprCh);
304
+ continue;
305
+ }
306
+ if (exprCh === "`") {
307
+ i = skipTemplateWithoutMask(chars, i);
308
+ continue;
309
+ }
310
+ if (exprCh === "{") depth++;
311
+ else if (exprCh === "}") depth--;
312
+ if (depth === 0) {
313
+ i++;
314
+ break;
315
+ }
316
+ if (exprCh === "/" && exprNext === "/") {
317
+ i += 2;
318
+ while (i < chars.length && chars[i] !== "\n") i++;
319
+ continue;
320
+ }
321
+ if (exprCh === "/" && exprNext === "*") {
322
+ i += 2;
323
+ while (i < chars.length) {
324
+ if (chars[i] === "*" && chars[i + 1] === "/") {
325
+ i += 2;
326
+ break;
327
+ }
328
+ i++;
329
+ }
330
+ continue;
331
+ }
332
+ i++;
333
+ }
334
+ segmentStart = i;
335
+ continue;
336
+ }
337
+ i++;
338
+ }
339
+ const endExclusive = i;
340
+ if (!hasInterpolation) {
341
+ const inner = chars.slice(startIndex + 1, Math.max(startIndex + 1, endExclusive - 1)).join("");
342
+ if (!ENV_KEY_IDENTIFIER_REGEX.test(inner)) {
343
+ for (let idx = startIndex + 1; idx < endExclusive - 1; idx++) {
344
+ if (chars[idx] !== "\n") chars[idx] = " ";
345
+ }
346
+ }
347
+ return endExclusive;
348
+ }
349
+ for (const segment of literalSegments) {
350
+ for (let idx = segment.start; idx < segment.endExclusive; idx++) {
351
+ if (chars[idx] !== "\n") chars[idx] = " ";
352
+ }
353
+ }
354
+ return endExclusive;
355
+ }
356
+ __name(skipAndMaskTemplateLiteral, "skipAndMaskTemplateLiteral");
357
+ function maskCommentsPreserveLayout(content, language) {
358
+ const chars = content.split("");
359
+ const supportsHashComments = language === "python" || language === "ruby" || language === "php";
360
+ const supportsSlashComments = language !== "python" && language !== "ruby";
361
+ let i = 0;
362
+ let inLineComment = false;
363
+ let inBlockComment = false;
364
+ while (i < chars.length) {
365
+ const ch = chars[i];
366
+ const next = chars[i + 1];
367
+ if (inLineComment) {
368
+ if (ch === "\n") {
369
+ inLineComment = false;
370
+ } else {
371
+ chars[i] = " ";
372
+ }
373
+ i++;
374
+ continue;
375
+ }
376
+ if (inBlockComment) {
377
+ if (ch === "*" && next === "/") {
378
+ chars[i] = " ";
379
+ chars[i + 1] = " ";
380
+ inBlockComment = false;
381
+ i += 2;
382
+ continue;
383
+ }
384
+ if (ch !== "\n") chars[i] = " ";
385
+ i++;
386
+ continue;
387
+ }
388
+ if (supportsSlashComments && ch === "/" && next === "/") {
389
+ chars[i] = " ";
390
+ chars[i + 1] = " ";
391
+ inLineComment = true;
392
+ i += 2;
393
+ continue;
394
+ }
395
+ if (supportsSlashComments && ch === "/" && next === "*") {
396
+ chars[i] = " ";
397
+ chars[i + 1] = " ";
398
+ inBlockComment = true;
399
+ i += 2;
400
+ continue;
401
+ }
402
+ if (supportsHashComments && ch === "#") {
403
+ chars[i] = " ";
404
+ inLineComment = true;
405
+ i++;
406
+ continue;
407
+ }
408
+ if (ch === "'") {
409
+ i = skipAndMaskQuotedString(chars, i, "'");
410
+ continue;
411
+ }
412
+ if (ch === '"') {
413
+ i = skipAndMaskQuotedString(chars, i, '"');
414
+ continue;
415
+ }
416
+ if (ch === "`" && (language === "js-like" || language === "go")) {
417
+ i = skipAndMaskTemplateLiteral(chars, i);
418
+ continue;
419
+ }
420
+ i++;
421
+ }
422
+ return chars.join("");
423
+ }
424
+ __name(maskCommentsPreserveLayout, "maskCommentsPreserveLayout");
425
+ async function scanFileForEnvVarReferences(filePath, maxFileSizeBytes) {
426
+ let fileStat;
427
+ try {
428
+ fileStat = await fs.stat(filePath);
429
+ } catch {
430
+ return [];
431
+ }
432
+ if (!fileStat.isFile() || fileStat.size > maxFileSizeBytes) return [];
433
+ let rawContent;
434
+ try {
435
+ rawContent = await fs.readFile(filePath, "utf-8");
436
+ } catch {
437
+ return [];
438
+ }
439
+ if (!rawContent || rawContent.includes("\0")) return [];
440
+ const extension = path.extname(filePath).toLowerCase();
441
+ const language = LANGUAGE_BY_EXTENSION[extension];
442
+ if (!language) return [];
443
+ const scanContent = maskCommentsPreserveLayout(rawContent, language);
444
+ const newlineIndices = getNewlineIndices(scanContent);
445
+ const references = [];
446
+ for (const pattern of PATTERNS_BY_LANGUAGE[language]) {
447
+ for (const match of scanContent.matchAll(pattern.regex)) {
448
+ const key = match[1];
449
+ if (!key) continue;
450
+ references.push(buildReference(filePath, scanContent, newlineIndices, match.index ?? 0, key, pattern.syntax));
451
+ }
452
+ }
453
+ if (language === "js-like") {
454
+ for (const pattern of JS_DESTRUCTURE_PATTERNS) {
455
+ for (const match of scanContent.matchAll(pattern.regex)) {
456
+ const body = match[1];
457
+ if (!body) continue;
458
+ const bodyOffset = (match.index ?? 0) + match[0].indexOf(body);
459
+ for (const destructured of extractDestructuredKeys(body)) {
460
+ references.push(
461
+ buildReference(
462
+ filePath,
463
+ scanContent,
464
+ newlineIndices,
465
+ bodyOffset + destructured.relativeIndex,
466
+ destructured.key,
467
+ pattern.syntax
468
+ )
469
+ );
470
+ }
471
+ }
472
+ }
473
+ }
474
+ return references;
475
+ }
476
+ __name(scanFileForEnvVarReferences, "scanFileForEnvVarReferences");
477
+ async function scanFilesWithLimit(items, concurrency, worker) {
478
+ if (items.length === 0) return [];
479
+ const results = new Array(items.length);
480
+ let nextIndex = 0;
481
+ async function runWorker() {
482
+ while (true) {
483
+ const currentIndex = nextIndex;
484
+ nextIndex++;
485
+ if (currentIndex >= items.length) return;
486
+ results[currentIndex] = await worker(items[currentIndex]);
487
+ }
488
+ }
489
+ __name(runWorker, "runWorker");
490
+ const workerCount = Math.max(1, Math.min(concurrency, items.length));
491
+ const workers = Array.from({ length: workerCount }, async () => {
492
+ await runWorker();
493
+ });
494
+ await Promise.all(workers);
495
+ return results;
496
+ }
497
+ __name(scanFilesWithLimit, "scanFilesWithLimit");
498
+ async function scanCodeForEnvVars(options = {}, additionalExcludeDirs = []) {
499
+ const cwd = options.cwd || process.cwd();
500
+ const concurrency = options.concurrency ?? DEFAULT_CONCURRENCY;
501
+ const maxFileSizeBytes = options.maxFileSizeBytes ?? DEFAULT_MAX_FILE_SIZE_BYTES;
502
+ const excludeDirs = /* @__PURE__ */ new Set([
503
+ ...DEFAULT_IGNORED_DIRS,
504
+ ...options.ignoredDirs ?? [],
505
+ ...additionalExcludeDirs
506
+ ]);
507
+ const filePaths = await discoverSourceFiles(cwd, excludeDirs);
508
+ const references = await scanFilesWithLimit(filePaths, concurrency, async (filePath) => {
509
+ return scanFileForEnvVarReferences(filePath, maxFileSizeBytes);
510
+ });
511
+ const flattenedReferences = references.flat();
512
+ const uniqueKeys = [...new Set(flattenedReferences.map((r) => r.key))].sort((a, b) => a.localeCompare(b));
513
+ return {
514
+ keys: uniqueKeys,
515
+ references: flattenedReferences,
516
+ scannedFilesCount: filePaths.length
517
+ };
518
+ }
519
+ __name(scanCodeForEnvVars, "scanCodeForEnvVars");
520
+
521
+ export { scanCodeForEnvVars };
522
+ //# sourceMappingURL=chunk-P33JXOU6.js.map
523
+ //# sourceMappingURL=chunk-P33JXOU6.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/helpers/env-var-scanner.ts"],"names":[],"mappings":"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","file":"chunk-P33JXOU6.js","sourcesContent":["import fs from 'node:fs/promises';\nimport path from 'node:path';\n\nexport const DEFAULT_IGNORED_DIRS = [\n '.git',\n 'node_modules',\n 'dist',\n 'build',\n '.next',\n 'vendor',\n '.venv',\n] as const;\n\nconst DEFAULT_MAX_FILE_SIZE_BYTES = 1024 * 1024;\nconst DEFAULT_CONCURRENCY = 50;\nconst ENV_KEY_IDENTIFIER_REGEX = /^[A-Za-z_][A-Za-z0-9_]*$/;\n\nconst LANGUAGE_BY_EXTENSION: Record<string, ScannerLanguage> = {\n '.js': 'js-like',\n '.mjs': 'js-like',\n '.cjs': 'js-like',\n '.jsx': 'js-like',\n '.ts': 'js-like',\n '.mts': 'js-like',\n '.cts': 'js-like',\n '.tsx': 'js-like',\n '.vue': 'js-like',\n '.svelte': 'js-like',\n '.astro': 'js-like',\n '.mdx': 'js-like',\n\n '.py': 'python',\n '.go': 'go',\n '.rb': 'ruby',\n '.php': 'php',\n '.rs': 'rust',\n '.java': 'java',\n '.cs': 'csharp',\n};\n\ntype ScannerLanguage = 'js-like' | 'python' | 'go' | 'ruby' | 'php' | 'rust' | 'java' | 'csharp';\n\nexport type EnvVarSyntax = 'process.env.member'\n | 'process.env.bracket'\n | 'process.env.destructure'\n | 'import.meta.env.member'\n | 'import.meta.env.bracket'\n | 'import.meta.env.destructure'\n | 'ENV.member'\n | 'ENV.bracket'\n | 'ENV.destructure'\n | 'python.environ'\n | 'python.getenv'\n | 'go.getenv'\n | 'ruby.env'\n | 'ruby.fetch'\n | 'php.getenv'\n | 'php._env'\n | 'php._server'\n | 'rust.getenv'\n | 'java.getenv'\n | 'csharp.getenv';\n\nexport interface EnvVarReference {\n key: string;\n filePath: string;\n lineNumber: number;\n columnNumber: number;\n syntax: EnvVarSyntax;\n}\n\nexport interface ScanCodeEnvVarsOptions {\n cwd?: string;\n concurrency?: number;\n maxFileSizeBytes?: number;\n // legacy option, treated as additional excludes\n ignoredDirs?: Array<string>;\n}\n\nexport interface ScanCodeEnvVarsResult {\n keys: Array<string>;\n references: Array<EnvVarReference>;\n scannedFilesCount: number;\n}\n\ninterface SimplePattern {\n regex: RegExp;\n syntax: EnvVarSyntax;\n}\n\nconst PATTERNS_BY_LANGUAGE: Record<ScannerLanguage, Array<SimplePattern>> = {\n 'js-like': [\n {\n regex: /\\bprocess\\.env\\.([A-Za-z_][A-Za-z0-9_]*)\\b/g,\n syntax: 'process.env.member',\n },\n {\n regex: /\\bprocess\\.env\\[\\s*['\"`]([A-Za-z_][A-Za-z0-9_]*)['\"`]\\s*\\]/g,\n syntax: 'process.env.bracket',\n },\n {\n regex: /\\bimport\\.meta\\.env\\.([A-Za-z_][A-Za-z0-9_]*)\\b/g,\n syntax: 'import.meta.env.member',\n },\n {\n regex: /\\bimport\\.meta\\.env\\[\\s*['\"`]([A-Za-z_][A-Za-z0-9_]*)['\"`]\\s*\\]/g,\n syntax: 'import.meta.env.bracket',\n },\n {\n regex: /\\bENV\\.([A-Za-z_][A-Za-z0-9_]*)\\b/g,\n syntax: 'ENV.member',\n },\n {\n regex: /\\bENV\\[\\s*['\"`]([A-Za-z_][A-Za-z0-9_]*)['\"`]\\s*\\]/g,\n syntax: 'ENV.bracket',\n },\n ],\n python: [\n {\n regex: /\\bos\\.environ\\[\\s*['\"]([A-Za-z_][A-Za-z0-9_]*)['\"]\\s*\\]/g,\n syntax: 'python.environ',\n },\n {\n regex: /\\bos\\.getenv\\(\\s*['\"]([A-Za-z_][A-Za-z0-9_]*)['\"]/g,\n syntax: 'python.getenv',\n },\n ],\n go: [\n {\n regex: /\\bos\\.(?:Getenv|LookupEnv)\\(\\s*\"([A-Za-z_][A-Za-z0-9_]*)\"\\s*\\)/g,\n syntax: 'go.getenv',\n },\n ],\n ruby: [\n {\n regex: /\\bENV\\[\\s*['\"]([A-Za-z_][A-Za-z0-9_]*)['\"]\\s*\\]/g,\n syntax: 'ruby.env',\n },\n {\n regex: /\\bENV\\.fetch\\(\\s*['\"]([A-Za-z_][A-Za-z0-9_]*)['\"]/g,\n syntax: 'ruby.fetch',\n },\n ],\n php: [\n {\n regex: /\\bgetenv\\(\\s*['\"]([A-Za-z_][A-Za-z0-9_]*)['\"]/g,\n syntax: 'php.getenv',\n },\n {\n regex: /\\$_ENV\\[\\s*['\"]([A-Za-z_][A-Za-z0-9_]*)['\"]\\s*\\]/g,\n syntax: 'php._env',\n },\n {\n regex: /\\$_SERVER\\[\\s*['\"]([A-Za-z_][A-Za-z0-9_]*)['\"]\\s*\\]/g,\n syntax: 'php._server',\n },\n ],\n rust: [\n {\n regex: /\\bstd::env::(?:var|var_os)\\(\\s*\"([A-Za-z_][A-Za-z0-9_]*)\"\\s*\\)/g,\n syntax: 'rust.getenv',\n },\n ],\n java: [\n {\n regex: /\\bSystem\\.getenv\\(\\s*\"([A-Za-z_][A-Za-z0-9_]*)\"\\s*\\)/g,\n syntax: 'java.getenv',\n },\n ],\n csharp: [\n {\n regex: /\\bEnvironment\\.GetEnvironmentVariable\\(\\s*\"([A-Za-z_][A-Za-z0-9_]*)\"\\s*\\)/g,\n syntax: 'csharp.getenv',\n },\n ],\n};\n\nconst JS_DESTRUCTURE_PATTERNS: Array<{ regex: RegExp, syntax: EnvVarSyntax }> = [\n {\n regex: /\\{([^}]*)\\}\\s*=\\s*process\\.env\\b/g,\n syntax: 'process.env.destructure',\n },\n {\n regex: /\\{([^}]*)\\}\\s*=\\s*import\\.meta\\.env\\b/g,\n syntax: 'import.meta.env.destructure',\n },\n {\n regex: /\\{([^}]*)\\}\\s*=\\s*ENV\\b/g,\n syntax: 'ENV.destructure',\n },\n];\n\nasync function discoverSourceFiles(cwd: string, ignoredDirs: Set<string>): Promise<Array<string>> {\n const filePaths: Array<string> = [];\n const globExcludes = [...ignoredDirs].flatMap((dirName) => [`**/${dirName}`, `**/${dirName}/**`]);\n\n for await (const relativePath of fs.glob('**/*', { cwd, exclude: globExcludes })) {\n const normalizedRelativePath = String(relativePath).replaceAll('\\\\', '/');\n\n const extension = path.extname(normalizedRelativePath).toLowerCase();\n if (!(extension in LANGUAGE_BY_EXTENSION)) continue;\n\n filePaths.push(path.resolve(cwd, normalizedRelativePath));\n }\n return filePaths;\n}\n\nfunction extractDestructuredKeys(body: string): Array<{ key: string, relativeIndex: number }> {\n const found: Array<{ key: string, relativeIndex: number }> = [];\n const propPattern = /(^|,)\\s*([A-Za-z_][A-Za-z0-9_]*)\\s*(?::\\s*[A-Za-z_][A-Za-z0-9_]*)?\\s*(?:=[^,]+)?\\s*(?=,|$)/g;\n for (const match of body.matchAll(propPattern)) {\n const key = match[2];\n if (!key) continue;\n const wholeMatch = match[0] || '';\n const keyIndexInWhole = wholeMatch.indexOf(key);\n const relativeIndex = (match.index ?? 0) + (keyIndexInWhole >= 0 ? keyIndexInWhole : 0);\n found.push({ key, relativeIndex });\n }\n return found;\n}\n\nfunction getNewlineIndices(content: string): Array<number> {\n const indices: Array<number> = [];\n for (let i = 0; i < content.length; i++) {\n if (content.charCodeAt(i) === 10) indices.push(i);\n }\n return indices;\n}\n\nfunction indexToLineAndColumn(\n content: string,\n newlineIndices: Array<number>,\n index: number,\n): { lineNumber: number, columnNumber: number } {\n let lo = 0;\n let hi = newlineIndices.length;\n\n while (lo < hi) {\n const mid = lo + Math.floor((hi - lo) / 2);\n if (newlineIndices[mid] < index) lo = mid + 1;\n else hi = mid;\n }\n\n const lineNumber = lo + 1;\n const lineStartIndex = lo === 0 ? 0 : newlineIndices[lo - 1] + 1;\n\n return {\n lineNumber,\n columnNumber: index - lineStartIndex + 1,\n };\n}\n\nfunction buildReference(\n filePath: string,\n content: string,\n newlineIndices: Array<number>,\n index: number,\n key: string,\n syntax: EnvVarSyntax,\n): EnvVarReference {\n const { lineNumber, columnNumber } = indexToLineAndColumn(content, newlineIndices, index);\n return {\n filePath,\n key,\n lineNumber,\n columnNumber,\n syntax,\n };\n}\n\nfunction skipQuotedWithoutMask(chars: Array<string>, startIndex: number, quoteChar: '\\'' | '\"'): number {\n let i = startIndex + 1;\n while (i < chars.length) {\n const ch = chars[i];\n if (ch === '\\\\') {\n i += 2;\n continue;\n }\n if (ch === quoteChar) {\n i++;\n return i;\n }\n i++;\n }\n return i;\n}\n\nfunction skipTemplateWithoutMask(chars: Array<string>, startIndex: number): number {\n let i = startIndex + 1;\n while (i < chars.length) {\n const ch = chars[i];\n const next = chars[i + 1];\n\n if (ch === '\\\\') {\n i += 2;\n continue;\n }\n if (ch === '`') {\n i++;\n return i;\n }\n if (ch === '$' && next === '{') {\n i += 2;\n let depth = 1;\n while (i < chars.length && depth > 0) {\n if (chars[i] === '\\\\') {\n i += 2;\n continue;\n }\n if (chars[i] === '{') depth++;\n else if (chars[i] === '}') depth--;\n i++;\n }\n continue;\n }\n i++;\n }\n return i;\n}\n\nfunction skipAndMaskQuotedString(chars: Array<string>, startIndex: number, quoteChar: '\\'' | '\"'): number {\n let i = startIndex + 1;\n while (i < chars.length) {\n const ch = chars[i];\n if (ch === '\\\\') {\n i += 2;\n continue;\n }\n if (ch === quoteChar) {\n i++;\n break;\n }\n i++;\n }\n\n const endExclusive = i;\n const inner = chars.slice(startIndex + 1, Math.max(startIndex + 1, endExclusive - 1)).join('');\n const keepInner = ENV_KEY_IDENTIFIER_REGEX.test(inner);\n if (!keepInner) {\n for (let idx = startIndex + 1; idx < endExclusive - 1; idx++) {\n if (chars[idx] !== '\\n') chars[idx] = ' ';\n }\n }\n return endExclusive;\n}\n\nfunction skipAndMaskTemplateLiteral(chars: Array<string>, startIndex: number): number {\n let i = startIndex + 1;\n let segmentStart = i;\n const literalSegments: Array<{ start: number, endExclusive: number }> = [];\n let hasInterpolation = false;\n\n while (i < chars.length) {\n const ch = chars[i];\n const next = chars[i + 1];\n\n if (ch === '\\\\') {\n i += 2;\n continue;\n }\n\n if (ch === '`') {\n literalSegments.push({ start: segmentStart, endExclusive: i });\n i++;\n break;\n }\n\n if (ch === '$' && next === '{') {\n hasInterpolation = true;\n literalSegments.push({ start: segmentStart, endExclusive: i });\n i += 2;\n let depth = 1;\n while (i < chars.length && depth > 0) {\n const exprCh = chars[i];\n const exprNext = chars[i + 1];\n\n if (exprCh === '\\\\') {\n i += 2;\n continue;\n }\n\n if (exprCh === '\\'' || exprCh === '\"') {\n i = skipQuotedWithoutMask(chars, i, exprCh);\n continue;\n }\n\n if (exprCh === '`') {\n i = skipTemplateWithoutMask(chars, i);\n continue;\n }\n\n if (exprCh === '{') depth++;\n else if (exprCh === '}') depth--;\n\n if (depth === 0) {\n i++;\n break;\n }\n\n if (exprCh === '/' && exprNext === '/') {\n i += 2;\n while (i < chars.length && chars[i] !== '\\n') i++;\n continue;\n }\n if (exprCh === '/' && exprNext === '*') {\n i += 2;\n while (i < chars.length) {\n if (chars[i] === '*' && chars[i + 1] === '/') {\n i += 2;\n break;\n }\n i++;\n }\n continue;\n }\n\n i++;\n }\n segmentStart = i;\n continue;\n }\n\n i++;\n }\n\n const endExclusive = i;\n if (!hasInterpolation) {\n const inner = chars.slice(startIndex + 1, Math.max(startIndex + 1, endExclusive - 1)).join('');\n if (!ENV_KEY_IDENTIFIER_REGEX.test(inner)) {\n for (let idx = startIndex + 1; idx < endExclusive - 1; idx++) {\n if (chars[idx] !== '\\n') chars[idx] = ' ';\n }\n }\n return endExclusive;\n }\n\n for (const segment of literalSegments) {\n for (let idx = segment.start; idx < segment.endExclusive; idx++) {\n if (chars[idx] !== '\\n') chars[idx] = ' ';\n }\n }\n\n return endExclusive;\n}\n\nfunction maskCommentsPreserveLayout(content: string, language: ScannerLanguage): string {\n const chars = content.split('');\n\n const supportsHashComments = language === 'python' || language === 'ruby' || language === 'php';\n const supportsSlashComments = language !== 'python' && language !== 'ruby';\n\n let i = 0;\n let inLineComment = false;\n let inBlockComment = false;\n\n while (i < chars.length) {\n const ch = chars[i];\n const next = chars[i + 1];\n\n if (inLineComment) {\n if (ch === '\\n') {\n inLineComment = false;\n } else {\n chars[i] = ' ';\n }\n i++;\n continue;\n }\n\n if (inBlockComment) {\n if (ch === '*' && next === '/') {\n chars[i] = ' ';\n chars[i + 1] = ' ';\n inBlockComment = false;\n i += 2;\n continue;\n }\n if (ch !== '\\n') chars[i] = ' ';\n i++;\n continue;\n }\n\n if (supportsSlashComments && ch === '/' && next === '/') {\n chars[i] = ' ';\n chars[i + 1] = ' ';\n inLineComment = true;\n i += 2;\n continue;\n }\n if (supportsSlashComments && ch === '/' && next === '*') {\n chars[i] = ' ';\n chars[i + 1] = ' ';\n inBlockComment = true;\n i += 2;\n continue;\n }\n if (supportsHashComments && ch === '#') {\n chars[i] = ' ';\n inLineComment = true;\n i++;\n continue;\n }\n\n if (ch === '\\'') {\n i = skipAndMaskQuotedString(chars, i, '\\'');\n continue;\n }\n if (ch === '\"') {\n i = skipAndMaskQuotedString(chars, i, '\"');\n continue;\n }\n if (ch === '`' && (language === 'js-like' || language === 'go')) {\n i = skipAndMaskTemplateLiteral(chars, i);\n continue;\n }\n\n i++;\n }\n\n return chars.join('');\n}\n\nasync function scanFileForEnvVarReferences(\n filePath: string,\n maxFileSizeBytes: number,\n): Promise<Array<EnvVarReference>> {\n let fileStat;\n try {\n fileStat = await fs.stat(filePath);\n } catch {\n return [];\n }\n\n if (!fileStat.isFile() || fileStat.size > maxFileSizeBytes) return [];\n\n let rawContent: string;\n try {\n rawContent = await fs.readFile(filePath, 'utf-8');\n } catch {\n return [];\n }\n if (!rawContent || rawContent.includes('\\0')) return [];\n\n const extension = path.extname(filePath).toLowerCase();\n const language = LANGUAGE_BY_EXTENSION[extension];\n if (!language) return [];\n\n const scanContent = maskCommentsPreserveLayout(rawContent, language);\n const newlineIndices = getNewlineIndices(scanContent);\n const references: Array<EnvVarReference> = [];\n\n for (const pattern of PATTERNS_BY_LANGUAGE[language]) {\n for (const match of scanContent.matchAll(pattern.regex)) {\n const key = match[1];\n if (!key) continue;\n references.push(buildReference(filePath, scanContent, newlineIndices, match.index ?? 0, key, pattern.syntax));\n }\n }\n\n if (language === 'js-like') {\n for (const pattern of JS_DESTRUCTURE_PATTERNS) {\n for (const match of scanContent.matchAll(pattern.regex)) {\n const body = match[1];\n if (!body) continue;\n\n const bodyOffset = (match.index ?? 0) + match[0].indexOf(body);\n for (const destructured of extractDestructuredKeys(body)) {\n references.push(\n buildReference(\n filePath,\n scanContent,\n newlineIndices,\n bodyOffset + destructured.relativeIndex,\n destructured.key,\n pattern.syntax,\n ),\n );\n }\n }\n }\n }\n\n return references;\n}\n\nasync function scanFilesWithLimit<T, R>(\n items: Array<T>,\n concurrency: number,\n worker: (item: T) => Promise<R>,\n): Promise<Array<R>> {\n if (items.length === 0) return [];\n const results: Array<R> = new Array(items.length);\n let nextIndex = 0;\n\n async function runWorker() {\n while (true) {\n const currentIndex = nextIndex;\n nextIndex++;\n if (currentIndex >= items.length) return;\n results[currentIndex] = await worker(items[currentIndex]);\n }\n }\n\n const workerCount = Math.max(1, Math.min(concurrency, items.length));\n const workers = Array.from({ length: workerCount }, async () => {\n await runWorker();\n });\n await Promise.all(workers);\n return results;\n}\n\nexport async function scanCodeForEnvVars(\n options: ScanCodeEnvVarsOptions = {},\n additionalExcludeDirs: Array<string> = [],\n): Promise<ScanCodeEnvVarsResult> {\n const cwd = options.cwd || process.cwd();\n const concurrency = options.concurrency ?? DEFAULT_CONCURRENCY;\n const maxFileSizeBytes = options.maxFileSizeBytes ?? DEFAULT_MAX_FILE_SIZE_BYTES;\n const excludeDirs = new Set([\n ...DEFAULT_IGNORED_DIRS,\n ...(options.ignoredDirs ?? []),\n ...additionalExcludeDirs,\n ]);\n\n const filePaths = await discoverSourceFiles(cwd, excludeDirs);\n const references = await scanFilesWithLimit(filePaths, concurrency, async (filePath) => {\n return scanFileForEnvVarReferences(filePath, maxFileSizeBytes);\n });\n\n const flattenedReferences = references.flat();\n const uniqueKeys = [...new Set(flattenedReferences.map((r) => r.key))].sort((a, b) => a.localeCompare(b));\n\n return {\n keys: uniqueKeys,\n references: flattenedReferences,\n scannedFilesCount: filePaths.length,\n };\n}\n"]}