varlock 0.2.3 → 0.4.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 (74) hide show
  1. package/README.md +23 -10
  2. package/dist/chunk-36LTSUR6.js +48 -0
  3. package/dist/chunk-36LTSUR6.js.map +1 -0
  4. package/dist/{chunk-UDXNNRWI.js → chunk-4A54P4EM.js} +10 -10
  5. package/dist/chunk-4A54P4EM.js.map +1 -0
  6. package/dist/chunk-4DZ3IHF6.js +34 -0
  7. package/dist/chunk-4DZ3IHF6.js.map +1 -0
  8. package/dist/{chunk-Q3C4VKFT.js → chunk-5HF5TS2C.js} +17 -41
  9. package/dist/chunk-5HF5TS2C.js.map +1 -0
  10. package/dist/chunk-ALNELNTO.js +68 -0
  11. package/dist/chunk-ALNELNTO.js.map +1 -0
  12. package/dist/{chunk-YIXN7TC7.js → chunk-BS7P3FRR.js} +40 -64
  13. package/dist/chunk-BS7P3FRR.js.map +1 -0
  14. package/dist/{chunk-OY5U5WTF.js → chunk-CBP4M7BN.js} +2969 -2140
  15. package/dist/chunk-CBP4M7BN.js.map +1 -0
  16. package/dist/{chunk-HTF7NU5C.js → chunk-EDSWMPIV.js} +11 -19
  17. package/dist/chunk-EDSWMPIV.js.map +1 -0
  18. package/dist/{chunk-BXR2RIO6.js → chunk-F5WNDO7I.js} +6 -5
  19. package/dist/chunk-F5WNDO7I.js.map +1 -0
  20. package/dist/{chunk-35SAMS66.js → chunk-GJ7PTJM4.js} +3 -3
  21. package/dist/{chunk-35SAMS66.js.map → chunk-GJ7PTJM4.js.map} +1 -1
  22. package/dist/chunk-HRNVJUR5.js +17 -0
  23. package/dist/chunk-HRNVJUR5.js.map +1 -0
  24. package/dist/{chunk-PESTWPBG.js → chunk-QNKJGOQ6.js} +8 -6
  25. package/dist/chunk-QNKJGOQ6.js.map +1 -0
  26. package/dist/chunk-VKRGHRPK.js +331 -0
  27. package/dist/chunk-VKRGHRPK.js.map +1 -0
  28. package/dist/chunk-WIIXKZ3N.js +405 -0
  29. package/dist/chunk-WIIXKZ3N.js.map +1 -0
  30. package/dist/chunk-Y3ITSQA4.js +58 -0
  31. package/dist/chunk-Y3ITSQA4.js.map +1 -0
  32. package/dist/{chunk-ISSW6NKZ.js → chunk-YFP6VA2U.js} +20 -17
  33. package/dist/chunk-YFP6VA2U.js.map +1 -0
  34. package/dist/cli/cli-executable.js +56 -38
  35. package/dist/cli/cli-executable.js.map +1 -1
  36. package/dist/config-item-GN5AUR45.js +5 -0
  37. package/dist/config-item-GN5AUR45.js.map +1 -0
  38. package/dist/{env-graph-DIcuAiYh.d.ts → env-graph-COORmJlH.d.ts} +121 -2
  39. package/dist/help.command-7E52XAOO.js +5 -0
  40. package/dist/{help.command-MLH2WA5Y.js.map → help.command-7E52XAOO.js.map} +1 -1
  41. package/dist/index.d.ts +2 -2
  42. package/dist/index.js +4 -2
  43. package/dist/index.js.map +1 -1
  44. package/dist/init.command-FMHXUGDI.js +12 -0
  45. package/dist/{init.command-RAYBZ66R.js.map → init.command-FMHXUGDI.js.map} +1 -1
  46. package/dist/load.command-6I2D5BPL.js +11 -0
  47. package/dist/{load.command-KOSPGLV6.js.map → load.command-6I2D5BPL.js.map} +1 -1
  48. package/dist/plugin-lib.d.ts +2 -2
  49. package/dist/printenv.command-TROZTZ26.js +12 -0
  50. package/dist/printenv.command-TROZTZ26.js.map +1 -0
  51. package/dist/run.command-4OJ6MBP6.js +12 -0
  52. package/dist/{run.command-BOBQIELJ.js.map → run.command-4OJ6MBP6.js.map} +1 -1
  53. package/dist/runtime/env.d.ts +1 -1
  54. package/dist/scan.command-YRNAKUZT.js +13 -0
  55. package/dist/scan.command-YRNAKUZT.js.map +1 -0
  56. package/dist/telemetry.command-UZQSUYAY.js +11 -0
  57. package/dist/{telemetry.command-SFEMMU3U.js.map → telemetry.command-UZQSUYAY.js.map} +1 -1
  58. package/dist/typegen.command-V4MATON4.js +12 -0
  59. package/dist/typegen.command-V4MATON4.js.map +1 -0
  60. package/package.json +18 -17
  61. package/LICENSE +0 -21
  62. package/dist/chunk-BXR2RIO6.js.map +0 -1
  63. package/dist/chunk-HTF7NU5C.js.map +0 -1
  64. package/dist/chunk-ISSW6NKZ.js.map +0 -1
  65. package/dist/chunk-OY5U5WTF.js.map +0 -1
  66. package/dist/chunk-PESTWPBG.js.map +0 -1
  67. package/dist/chunk-Q3C4VKFT.js.map +0 -1
  68. package/dist/chunk-UDXNNRWI.js.map +0 -1
  69. package/dist/chunk-YIXN7TC7.js.map +0 -1
  70. package/dist/help.command-MLH2WA5Y.js +0 -5
  71. package/dist/init.command-RAYBZ66R.js +0 -9
  72. package/dist/load.command-KOSPGLV6.js +0 -9
  73. package/dist/run.command-BOBQIELJ.js +0 -10
  74. package/dist/telemetry.command-SFEMMU3U.js +0 -9
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../node_modules/.bun/ansis@4.2.0/node_modules/ansis/index.cjs","../../../node_modules/.bun/ansis@4.2.0/node_modules/ansis/index.mjs","../../../node_modules/.bun/exit-hook@5.1.0/node_modules/exit-hook/index.js","../src/env-graph/lib/loader.ts","../src/lib/formatting.ts"],"names":["exports","a","e","t","r","l","n","o","i","c","p","u","s","_","w","process"],"mappings":"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","file":"chunk-VKRGHRPK.js","sourcesContent":["let e,t,r,{defineProperty:l,setPrototypeOf:n,create:o,keys:s}=Object,i=\"\",{round:c,max:a}=Math,p=e=>{let t=/([a-f\\d]{3,6})/i.exec(e)?.[1],r=t?.length,l=parseInt(6^r?3^r?\"0\":t[0]+t[0]+t[1]+t[1]+t[2]+t[2]:t,16);return[l>>16&255,l>>8&255,255&l]},u=(e,t,r)=>e^t||t^r?16+36*c(e/51)+6*c(t/51)+c(r/51):8>e?16:e>248?231:c(24*(e-8)/247)+232,d=e=>{let t,r,l,n,o;return 8>e?30+e:16>e?e-8+90:(232>e?(o=(e-=16)%36,t=(e/36|0)/5,r=(o/6|0)/5,l=o%6/5):t=r=l=(10*(e-232)+8)/255,n=2*a(t,r,l),n?30+(c(l)<<2|c(r)<<1|c(t))+(2^n?0:60):30)},f=(()=>{let r=e=>o.some((t=>e.test(t))),l=globalThis,n=l.process??{},o=n.argv??[],i=n.env??{},c=-1;try{e=\",\"+s(i).join(\",\")}catch(e){i={},c=0}let a=\"FORCE_COLOR\",p={false:0,0:0,1:1,2:2,3:3}[i[a]]??-1,u=a in i&&p||r(/^--color=?(true|always)?$/);return u&&(c=p),~c||(c=((r,l,n)=>(t=r.TERM,{\"24bit\":3,truecolor:3,ansi256:2,ansi:1}[r.COLORTERM]||(r.CI?/,GITHUB/.test(e)?3:1:l&&\"dumb\"!==t?n?3:/-256/.test(t)?2:1:0)))(i,!!i.PM2_HOME||i.NEXT_RUNTIME?.includes(\"edge\")||!!n.stdout?.isTTY,\"win32\"===n.platform)),!p||i.NO_COLOR||r(/^--(no-color|color=(false|never))$/)?0:l.window?.chrome||u&&!c?3:c})(),g={open:i,close:i},h=39,b=49,O={},m=({p:e},{open:t,close:l})=>{let o=(e,...r)=>{if(!e){if(t&&t===l)return t;if((e??i)===i)return i}let n,s=e.raw?String.raw({raw:e},...r):i+e,c=o.p,a=c.o,p=c.c;if(s.includes(\"\u001b\"))for(;c;c=c.p){let{open:e,close:t}=c,r=t.length,l=i,o=0;if(r)for(;~(n=s.indexOf(t,o));o=n+r)l+=s.slice(o,n)+e;s=l+s.slice(o)}return a+(s.includes(\"\\n\")?s.replace(/(\\r?\\n)/g,p+\"$1\"+a):s)+p},s=t,c=l;return e&&(s=e.o+t,c=l+e.c),n(o,r),o.p={open:t,close:l,o:s,c,p:e},o.open=s,o.close=c,o};const w=new function e(t=f){let s={Ansis:e,level:t,isSupported:()=>a,strip:e=>e.replace(/[\u001b›][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g,i),extend(e){for(let t in e){let r=e[t],l=(typeof r)[0];\"s\"===l?(c(t,T(...p(r))),c(_(t),v(...p(r)))):c(t,r,\"f\"===l)}return r=o({},O),n(s,r),s}},c=(e,t,r)=>{O[e]={get(){let n=r?(...e)=>m(this,t(...e)):m(this,t);return l(this,e,{value:n}),n}}},a=t>0,w=(e,t)=>a?{open:`\u001b[${e}m`,close:`\u001b[${t}m`}:g,y=e=>t=>e(...p(t)),R=(e,t)=>(r,l,n)=>w(`${e}8;2;${r};${l};${n}`,t),$=(e,t)=>(r,l,n)=>w(((e,t,r)=>d(u(e,t,r)))(r,l,n)+e,t),x=e=>(t,r,l)=>e(u(t,r,l)),T=R(3,h),v=R(4,b),C=e=>w(\"38;5;\"+e,h),E=e=>w(\"48;5;\"+e,b);2===t?(T=x(C),v=x(E)):1===t&&(T=$(0,h),v=$(10,b),C=e=>w(d(e),h),E=e=>w(d(e)+10,b));let M,I={fg:C,bg:E,rgb:T,bgRgb:v,hex:y(T),bgHex:y(v),visible:g,reset:w(0,0),bold:w(1,22),dim:w(2,22),italic:w(3,23),underline:w(4,24),inverse:w(7,27),hidden:w(8,28),strikethrough:w(9,29)},_=e=>\"bg\"+e[0].toUpperCase()+e.slice(1),k=\"Bright\";return\"black,red,green,yellow,blue,magenta,cyan,white,gray\".split(\",\").map(((e,t)=>{M=_(e),8>t?(I[e+k]=w(90+t,h),I[M+k]=w(100+t,b)):t=60,I[e]=w(30+t,h),I[M]=w(40+t,b)})),s.extend(I)};module.exports=w,w.default=w;\n","import a from\"./index.cjs\";export default a;export const{Ansis,fg,bg,rgb,bgRgb,hex,bgHex,reset,inverse,hidden,visible,bold,dim,italic,underline,strikethrough,black,red,green,yellow,blue,magenta,cyan,white,gray,redBright,greenBright,yellowBright,blueBright,magentaBright,cyanBright,whiteBright,bgBlack,bgRed,bgGreen,bgYellow,bgBlue,bgMagenta,bgCyan,bgWhite,bgGray,bgRedBright,bgGreenBright,bgYellowBright,bgBlueBright,bgMagentaBright,bgCyanBright,bgWhiteBright}=a;","import process from 'node:process';\n\nconst asyncCallbacks = new Set();\nconst callbacks = new Set();\n\nlet isCalled = false;\nlet isRegistered = false;\n\nasync function flushStdio() {\n\tconst flush = stream => new Promise(resolve => {\n\t\tif (!stream || !stream.writable || stream.writableEnded || stream.destroyed) {\n\t\t\tresolve();\n\t\t\treturn;\n\t\t}\n\n\t\tconst onError = () => {\n\t\t\tstream.off('error', onError);\n\t\t\tresolve();\n\t\t};\n\n\t\tstream.once('error', onError);\n\n\t\ttry {\n\t\t\tstream.write('', () => {\n\t\t\t\tstream.off('error', onError);\n\t\t\t\tresolve();\n\t\t\t});\n\t\t} catch {\n\t\t\tstream.off('error', onError);\n\t\t\tresolve();\n\t\t}\n\t});\n\n\tconst timeout = new Promise(resolve => {\n\t\tsetTimeout(resolve, 1000);\n\t});\n\n\tawait Promise.race([\n\t\tPromise.all([flush(process.stdout), flush(process.stderr)]),\n\t\ttimeout,\n\t]);\n}\n\nasync function exit(shouldManuallyExit, isSynchronous, signal) {\n\tif (isCalled) {\n\t\treturn;\n\t}\n\n\tisCalled = true;\n\n\tif (asyncCallbacks.size > 0 && isSynchronous) {\n\t\tconsole.error([\n\t\t\t'SYNCHRONOUS TERMINATION NOTICE:',\n\t\t\t'When explicitly exiting the process via process.exit or via a parent process,',\n\t\t\t'asynchronous tasks in your exitHooks will not run. Either remove these tasks,',\n\t\t\t'use gracefulExit() instead of process.exit(), or ensure your parent process',\n\t\t\t'sends a SIGINT to the process running this code.',\n\t\t].join(' '));\n\t}\n\n\tlet exitCode = 0;\n\n\t// A non-graceful signal should be preserved over process.exitCode\n\tif (signal > 0) {\n\t\texitCode = 128 + signal;\n\t// Respect process.exitCode for graceful exits\n\t} else if (typeof process.exitCode === 'number' || typeof process.exitCode === 'string') {\n\t\texitCode = process.exitCode;\n\t}\n\n\tconst done = (force = false) => {\n\t\tif (force === true || shouldManuallyExit === true) {\n\t\t\tprocess.exit(exitCode); // eslint-disable-line unicorn/no-process-exit\n\t\t}\n\t};\n\n\tfor (const callback of callbacks) {\n\t\tcallback(exitCode);\n\t}\n\n\tif (isSynchronous) {\n\t\tdone();\n\t\treturn;\n\t}\n\n\tconst promises = [];\n\tlet forceAfter = 0;\n\tfor (const [callback, wait] of asyncCallbacks) {\n\t\tforceAfter = Math.max(forceAfter, wait);\n\t\tpromises.push(Promise.resolve(callback(exitCode)));\n\t}\n\n\t// Force exit if we exceeded our wait value\n\tconst asyncTimer = forceAfter > 0\n\t\t? setTimeout(() => {\n\t\t\tdone(true);\n\t\t}, forceAfter)\n\t\t: undefined;\n\n\tawait Promise.all(promises);\n\t// Let flushStdio handle its own timeout without the force-exit timer.\n\tclearTimeout(asyncTimer);\n\tawait flushStdio();\n\tdone();\n}\n\nfunction addHook(options) {\n\tconst {onExit, wait, isSynchronous} = options;\n\tconst asyncCallbackConfig = [onExit, wait];\n\n\tif (isSynchronous) {\n\t\tcallbacks.add(onExit);\n\t} else {\n\t\tasyncCallbacks.add(asyncCallbackConfig);\n\t}\n\n\tif (!isRegistered) {\n\t\tisRegistered = true;\n\n\t\t// Exit cases that support asynchronous handling\n\t\tprocess.once('beforeExit', exit.bind(undefined, true, false, -128));\n\t\tprocess.once('SIGINT', exit.bind(undefined, true, false, 2));\n\t\tprocess.once('SIGTERM', exit.bind(undefined, true, false, 15));\n\n\t\t// Explicit exit events. Calling will force an immediate exit and run all\n\t\t// synchronous hooks. Explicit exits must not extend the node process\n\t\t// artificially. Will log errors if asynchronous calls exist.\n\t\tprocess.once('exit', exit.bind(undefined, false, true, 0));\n\n\t\t// PM2 Cluster shutdown message. Caught to support async handlers with pm2,\n\t\t// needed because explicitly calling process.exit() doesn't trigger the\n\t\t// beforeExit event, and the exit event cannot support async handlers,\n\t\t// since the event loop is never called after it.\n\t\tprocess.on('message', message => {\n\t\t\tif (message === 'shutdown') {\n\t\t\t\texit(true, true, -128);\n\t\t\t}\n\t\t});\n\t}\n\n\treturn () => {\n\t\tif (isSynchronous) {\n\t\t\tcallbacks.delete(onExit);\n\t\t} else {\n\t\t\tasyncCallbacks.delete(asyncCallbackConfig);\n\t\t}\n\t};\n}\n\nexport default function exitHook(onExit) {\n\tif (typeof onExit !== 'function') {\n\t\tthrow new TypeError('onExit must be a function');\n\t}\n\n\treturn addHook({\n\t\tonExit,\n\t\tisSynchronous: true,\n\t});\n}\n\nexport function asyncExitHook(onExit, options = {}) {\n\tif (typeof onExit !== 'function') {\n\t\tthrow new TypeError('onExit must be a function');\n\t}\n\n\tif (!(typeof options.wait === 'number' && options.wait > 0)) {\n\t\tthrow new TypeError('wait must be set to a positive numeric value');\n\t}\n\n\treturn addHook({\n\t\tonExit,\n\t\twait: options.wait,\n\t\tisSynchronous: false,\n\t});\n}\n\nexport function gracefulExit(signal) {\n\tif (signal !== undefined) {\n\t\tprocess.exitCode = signal;\n\t}\n\n\texit(true, false, -128);\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport _ from '@env-spec/utils/my-dash';\nimport { EnvGraph } from './env-graph';\nimport { DirectoryDataSource, DotEnvFileDataSource } from './data-source';\n\nexport async function loadEnvGraph(opts?: {\n basePath?: string,\n entryFilePath?: string,\n relativePaths?: Array<string>,\n checkGitIgnored?: boolean,\n excludeDirs?: Array<string>,\n currentEnvFallback?: string,\n afterInit?: (graph: EnvGraph) => Promise<void>,\n}) {\n const graph = new EnvGraph();\n\n if (opts?.entryFilePath) {\n const resolvedPath = path.resolve(opts.entryFilePath);\n const isDirectory = opts.entryFilePath.endsWith('/') || opts.entryFilePath.endsWith(path.sep)\n || (fs.existsSync(resolvedPath) && fs.statSync(resolvedPath).isDirectory());\n if (isDirectory) {\n graph.basePath = resolvedPath;\n if (opts?.afterInit) await opts.afterInit(graph);\n if (opts?.currentEnvFallback) graph.envFlagFallback = opts.currentEnvFallback;\n await graph.setRootDataSource(new DirectoryDataSource(resolvedPath));\n } else {\n graph.basePath = path.dirname(resolvedPath);\n if (opts?.afterInit) await opts.afterInit(graph);\n if (opts?.currentEnvFallback) graph.envFlagFallback = opts.currentEnvFallback;\n await graph.setRootDataSource(new DotEnvFileDataSource(resolvedPath));\n }\n } else {\n graph.basePath = opts?.basePath ?? process.cwd();\n if (opts?.afterInit) await opts.afterInit(graph);\n if (opts?.currentEnvFallback) graph.envFlagFallback = opts.currentEnvFallback;\n await graph.setRootDataSource(new DirectoryDataSource(graph.basePath));\n }\n\n await graph.finishLoad();\n\n return graph;\n}\n\n","import ansis, { type AnsiColors, type AnsiStyles } from 'ansis';\nimport _ from '@env-spec/utils/my-dash';\n\nimport { ConfigItem, VarlockError } from '../env-graph';\nimport { redactString } from '../runtime/lib/redaction';\n\ntype ColorMod = AnsiStyles | AnsiColors;\ntype ColorMods = ColorMod | Array<ColorMod>;\n\nfunction applyMods(str: string, mods?: ColorMods) {\n if (!mods) return str;\n if (_.isArray(mods)) {\n let modStr = str;\n mods.forEach((mod) => {\n modStr = ansis[mod](modStr);\n });\n return modStr;\n }\n return ansis[mods](str);\n}\n\nexport function formattedValue(val: any, showType = false) {\n let strVal: string = '';\n let strType: string = '';\n let mods: ColorMods | undefined;\n if (_.isBoolean(val)) {\n strVal = val.toString();\n mods = ['yellow', 'italic'];\n strType = 'boolean';\n } else if (_.isNumber(val)) {\n strVal = val.toString();\n mods = 'yellow';\n strType = 'number';\n } else if (_.isString(val)) {\n strVal = `\"${val}\"`;\n strType = 'string';\n } else if (_.isPlainObject(val)) {\n // TODO: can definitely make this better...\n strVal = JSON.stringify(val);\n strType = 'object';\n } else if (val === null) {\n strVal = 'null';\n mods = 'gray';\n } else if (val === undefined) {\n strVal = 'undefined';\n mods = 'gray';\n }\n return [\n applyMods(strVal, mods),\n showType && strType ? ansis.gray(` (${strType})`) : '',\n ].join('');\n}\n\n\nexport function formatError(err: VarlockError) {\n let whenStr = '';\n if (err.type === 'SchemaError') {\n whenStr += 'during schema initialization';\n }\n if (err.type === 'ValidationError') {\n whenStr += 'during validation';\n }\n if (err.type === 'CoercionError') {\n whenStr += 'during coercion';\n }\n if (err.type === 'ResolutionError') {\n whenStr += 'during resolution';\n }\n\n let errStr = `${err.icon} ${err.message}`;\n if (err.isUnexpected) {\n errStr += ansis.gray.italic(`\\n (unexpected error${whenStr ? ` ${whenStr}` : ''})`);\n if ('stack' in err) errStr += err.stack;\n }\n return errStr;\n}\n\nexport function joinAndCompact(strings: Array<string | number | boolean | undefined | null | false>, joinChar = ' ') {\n return strings.filter((s) => (\n // we'll not filter out empty strings - because it's useful to just add newlines\n s !== undefined && s !== null && s !== false\n )).join(joinChar);\n}\n\nconst VALIDATION_STATE_COLORS = {\n error: 'red',\n warn: 'yellow',\n valid: 'cyan',\n} as const;\n\nexport function getItemSummary(item: ConfigItem) {\n const summary: Array<string> = [];\n const itemErrors = item.errors;\n const icon = itemErrors.length ? itemErrors[0].icon : '✅';\n const isSensitive = item.isSensitive;\n const isRequired = item.isRequired;\n summary.push(joinAndCompact([\n icon,\n ansis[VALIDATION_STATE_COLORS[item.validationState]](item.key) + (isRequired ? ansis.magenta('*') : ''),\n\n // ansis.gray(`[type = ${item.type.typeLabel}]`),\n isSensitive && ` 🔐${ansis.gray.italic('sensitive')}`,\n\n // item.useAt ? ansis.gray.italic(`(${item.useAt?.join(', ')})`) : undefined,\n ]));\n\n let valAsStr = formattedValue(item.resolvedValue, false);\n if (isSensitive && item.resolvedValue && _.isString(item.resolvedValue)) {\n valAsStr = redactString(item.resolvedValue)!;\n }\n\n summary.push(joinAndCompact([\n ansis.gray(' └'),\n valAsStr,\n item.isCoerced && (\n ansis.gray.italic('< coerced from ')\n + (isSensitive ? formattedValue(item.resolvedRawValue) : formattedValue(item.resolvedRawValue, false))\n ),\n ]));\n\n // if (item.overrides?.length) {\n // const activeOverride = item.overrides[0];\n // let overrideNote = ansis.gray.italic('value set via override: ');\n // overrideNote += ansis.gray(activeOverride.sourceType);\n // if (activeOverride.sourceLabel) overrideNote += ansis.gray(` - ${activeOverride.sourceLabel}`);\n // summary.push(` ${overrideNote}`);\n // }\n\n itemErrors?.forEach((err) => {\n summary.push(ansis[err.isWarning ? 'yellow' : 'red'](` - ${err.isWarning ? '[WARNING] ' : ''}${err.message}`));\n\n // TODO: standardize here how we show parse error locations and stack info?\n\n // summary.push(...err.cleanedStack || '');\n if (err.tip) {\n summary.push(...err.tip.split('\\n').map((line) => ` ${line}`));\n }\n });\n\n // NO OBJECT/CHILDREN FOR NOW\n // for (const childItem of _.values(item.children)) {\n // const childSummary = getItemSummary(childItem);\n // summary.push(childSummary.split('\\n').map((l) => ` ${l}`).join('\\n'));\n // }\n\n return summary.join('\\n');\n}\n"]}
@@ -0,0 +1,405 @@
1
+ import { spawnAsync } from './chunk-Y3ITSQA4.js';
2
+ import { detectJsPackageManager, logLines, fmt } from './chunk-5HF5TS2C.js';
3
+ import { CliExitError } from './chunk-4DZ3IHF6.js';
4
+ import { define } from './chunk-4A54P4EM.js';
5
+ import { loadVarlockEnvGraph } from './chunk-HRNVJUR5.js';
6
+ import { ansis_default, gracefulExit } from './chunk-VKRGHRPK.js';
7
+ import { pathExists, my_dash_default } from './chunk-CBP4M7BN.js';
8
+ import { redactString } from './chunk-MIBOBKI4.js';
9
+ import { __name } from './chunk-6PEHRAEP.js';
10
+ import path from 'path';
11
+ import fs from 'fs/promises';
12
+
13
+ // src/cli/helpers/install-detection.ts
14
+ function isBundledSEA() {
15
+ try {
16
+ return false;
17
+ } catch (e) {
18
+ return false;
19
+ }
20
+ }
21
+ __name(isBundledSEA, "isBundledSEA");
22
+
23
+ // src/cli/commands/scan.command.ts
24
+ var SKIP_DIRS = /* @__PURE__ */ new Set([
25
+ ".git",
26
+ "node_modules",
27
+ "dist",
28
+ "build",
29
+ ".next",
30
+ ".nuxt",
31
+ "vendor",
32
+ ".venv",
33
+ "venv",
34
+ "__pycache__",
35
+ ".turbo",
36
+ "coverage"
37
+ ]);
38
+ var BINARY_EXTENSIONS = /* @__PURE__ */ new Set([
39
+ ".png",
40
+ ".jpg",
41
+ ".jpeg",
42
+ ".gif",
43
+ ".bmp",
44
+ ".ico",
45
+ ".mp3",
46
+ ".mp4",
47
+ ".wav",
48
+ ".avi",
49
+ ".mov",
50
+ ".zip",
51
+ ".tar",
52
+ ".gz",
53
+ ".rar",
54
+ ".7z",
55
+ ".exe",
56
+ ".dll",
57
+ ".so",
58
+ ".dylib",
59
+ ".bin",
60
+ ".pdf",
61
+ ".doc",
62
+ ".docx",
63
+ ".xls",
64
+ ".xlsx",
65
+ ".woff",
66
+ ".woff2",
67
+ ".ttf",
68
+ ".eot",
69
+ ".pyc",
70
+ ".class",
71
+ ".o"
72
+ ]);
73
+ var commandSpec = define({
74
+ name: "scan",
75
+ description: "Scan files for sensitive config values that should not be in plaintext",
76
+ args: {
77
+ staged: {
78
+ type: "boolean",
79
+ description: "Only scan staged git files"
80
+ },
81
+ "include-ignored": {
82
+ type: "boolean",
83
+ description: "Include git-ignored files in the scan"
84
+ },
85
+ "install-hook": {
86
+ type: "boolean",
87
+ description: "Set up varlock scan as a git pre-commit hook"
88
+ },
89
+ path: {
90
+ type: "string",
91
+ short: "p",
92
+ description: 'Path to a specific .env file (e.g. .env.prod) or directory ending with "/" to use as the schema entry point (default: current directory)'
93
+ }
94
+ },
95
+ examples: `
96
+ Loads your varlock config, resolves all sensitive values, then scans files to
97
+ ensure none of those sensitive values appear in plaintext.
98
+
99
+ Examples:
100
+ varlock scan # Scan non-git-ignored files in current directory
101
+ varlock scan --staged # Only scan staged git files
102
+ varlock scan --include-ignored # Scan all files, including git-ignored ones
103
+ varlock scan --path .env.prod # Use a specific .env file as the schema entry point
104
+ varlock scan --install-hook # Set up as a git pre-commit hook
105
+ `.trim()
106
+ });
107
+ async function getGitFiles(cwd, onlyStaged) {
108
+ try {
109
+ let output;
110
+ if (onlyStaged) {
111
+ output = await spawnAsync(
112
+ "git",
113
+ ["diff", "--cached", "--name-only", "-z", "--diff-filter=ACMR"],
114
+ { cwd }
115
+ );
116
+ } else {
117
+ output = await spawnAsync(
118
+ "git",
119
+ ["ls-files", "--cached", "--others", "--exclude-standard", "-z"],
120
+ { cwd }
121
+ );
122
+ }
123
+ return output.split("\0").filter(Boolean).filter((f) => !BINARY_EXTENSIONS.has(path.extname(f).toLowerCase())).map((f) => path.resolve(cwd, f));
124
+ } catch {
125
+ return null;
126
+ }
127
+ }
128
+ __name(getGitFiles, "getGitFiles");
129
+ async function walkDirectory(dir) {
130
+ const files = [];
131
+ let entries;
132
+ try {
133
+ entries = await fs.readdir(dir, { withFileTypes: true });
134
+ } catch {
135
+ return files;
136
+ }
137
+ for (const entry of entries) {
138
+ const fullPath = path.join(dir, entry.name);
139
+ if (entry.isDirectory()) {
140
+ if (SKIP_DIRS.has(entry.name)) continue;
141
+ files.push(...await walkDirectory(fullPath));
142
+ } else if (entry.isFile()) {
143
+ const ext = path.extname(entry.name).toLowerCase();
144
+ if (BINARY_EXTENSIONS.has(ext)) continue;
145
+ files.push(fullPath);
146
+ }
147
+ }
148
+ return files;
149
+ }
150
+ __name(walkDirectory, "walkDirectory");
151
+ async function scanFileForValues(filePath, sensitiveValues) {
152
+ const findings = [];
153
+ let content;
154
+ try {
155
+ content = await fs.readFile(filePath, "utf-8");
156
+ } catch {
157
+ return findings;
158
+ }
159
+ if (content.includes("\0")) return findings;
160
+ let anyMatch = false;
161
+ for (const val of sensitiveValues.values()) {
162
+ if (content.includes(val)) {
163
+ anyMatch = true;
164
+ break;
165
+ }
166
+ }
167
+ if (!anyMatch) return findings;
168
+ const lines = content.split("\n");
169
+ for (let i = 0; i < lines.length; i++) {
170
+ const line = lines[i];
171
+ for (const [keyName, val] of sensitiveValues) {
172
+ const colIdx = line.indexOf(val);
173
+ if (colIdx !== -1) {
174
+ findings.push({
175
+ filePath,
176
+ lineNumber: i + 1,
177
+ columnNumber: colIdx + 1,
178
+ line: line.trim(),
179
+ sensitiveKeyName: keyName,
180
+ sensitiveValue: val
181
+ });
182
+ break;
183
+ }
184
+ }
185
+ }
186
+ return findings;
187
+ }
188
+ __name(scanFileForValues, "scanFileForValues");
189
+ var SCAN_COMMAND = "varlock scan";
190
+ function getHookCommand() {
191
+ if (isBundledSEA()) return SCAN_COMMAND;
192
+ const pm = detectJsPackageManager();
193
+ if (pm) return `${pm.exec} ${SCAN_COMMAND}`;
194
+ return SCAN_COMMAND;
195
+ }
196
+ __name(getHookCommand, "getHookCommand");
197
+ async function detectHookManager(cwd) {
198
+ if (await pathExists(path.join(cwd, ".husky"))) return "husky";
199
+ const lefthookFiles = ["lefthook.yml", "lefthook.yaml", ".lefthook.yml", ".lefthook.yaml"];
200
+ for (const file of lefthookFiles) {
201
+ if (await pathExists(path.join(cwd, file))) return "lefthook";
202
+ }
203
+ const pkgJsonPath = path.join(cwd, "package.json");
204
+ if (await pathExists(pkgJsonPath)) {
205
+ try {
206
+ const pkgJson = JSON.parse(await fs.readFile(pkgJsonPath, "utf-8"));
207
+ if (pkgJson["simple-git-hooks"]) return "simple-git-hooks";
208
+ } catch {
209
+ }
210
+ }
211
+ return null;
212
+ }
213
+ __name(detectHookManager, "detectHookManager");
214
+ async function findGitRoot(cwd) {
215
+ try {
216
+ const root = await spawnAsync("git", ["rev-parse", "--show-toplevel"], { cwd });
217
+ return root.trim();
218
+ } catch {
219
+ return null;
220
+ }
221
+ }
222
+ __name(findGitRoot, "findGitRoot");
223
+ async function installHook(cwd) {
224
+ const gitRoot = await findGitRoot(cwd);
225
+ if (!gitRoot) {
226
+ throw new CliExitError("Not inside a git repository", {
227
+ suggestion: "Run `git init` first, or make sure you are inside a git repository."
228
+ });
229
+ }
230
+ const hookCommand = getHookCommand();
231
+ const hookScript = `#!/bin/sh
232
+ ${hookCommand}
233
+ `;
234
+ const hookManager = await detectHookManager(gitRoot);
235
+ if (hookManager === "husky") {
236
+ logLines([
237
+ "",
238
+ `Detected ${ansis_default.bold("husky")} as your git hook manager.`,
239
+ "",
240
+ `Add ${ansis_default.bold(hookCommand)} to your pre-commit hook:`,
241
+ "",
242
+ ansis_default.dim(` echo "${hookCommand}" >> .husky/pre-commit`),
243
+ "",
244
+ "Or if creating a new hook:",
245
+ "",
246
+ ansis_default.dim(` echo "${hookCommand}" > .husky/pre-commit`),
247
+ ""
248
+ ]);
249
+ return;
250
+ }
251
+ if (hookManager === "lefthook") {
252
+ logLines([
253
+ "",
254
+ `Detected ${ansis_default.bold("lefthook")} as your git hook manager.`,
255
+ "",
256
+ "Add the following to your lefthook config:",
257
+ "",
258
+ ansis_default.dim(" pre-commit:"),
259
+ ansis_default.dim(" commands:"),
260
+ ansis_default.dim(" varlock-scan:"),
261
+ ansis_default.dim(` run: ${hookCommand}`),
262
+ ""
263
+ ]);
264
+ return;
265
+ }
266
+ if (hookManager === "simple-git-hooks") {
267
+ logLines([
268
+ "",
269
+ `Detected ${ansis_default.bold("simple-git-hooks")} in your package.json.`,
270
+ "",
271
+ "Add the following to your package.json:",
272
+ "",
273
+ ansis_default.dim(' "simple-git-hooks": {'),
274
+ ansis_default.dim(` "pre-commit": "${hookCommand}"`),
275
+ ansis_default.dim(" }"),
276
+ "",
277
+ `Then run ${ansis_default.dim("npx simple-git-hooks")} to update the hooks.`,
278
+ ""
279
+ ]);
280
+ return;
281
+ }
282
+ const hooksDir = path.join(gitRoot, ".git", "hooks");
283
+ const hookPath = path.join(hooksDir, "pre-commit");
284
+ await fs.mkdir(hooksDir, { recursive: true });
285
+ if (await pathExists(hookPath)) {
286
+ const existingContent = await fs.readFile(hookPath, "utf-8");
287
+ if (existingContent.includes(SCAN_COMMAND)) {
288
+ logLines([
289
+ "",
290
+ ansis_default.green(`The pre-commit hook already includes ${ansis_default.bold(SCAN_COMMAND)} - nothing to do!`),
291
+ ""
292
+ ]);
293
+ return;
294
+ }
295
+ const updatedContent = `${existingContent.trimEnd()}
296
+ ${hookCommand}
297
+ `;
298
+ await fs.writeFile(hookPath, updatedContent);
299
+ await fs.chmod(hookPath, 493);
300
+ logLines([
301
+ "",
302
+ ansis_default.green(`Added ${ansis_default.bold(hookCommand)} to existing pre-commit hook.`),
303
+ fmt.filePath(hookPath),
304
+ ""
305
+ ]);
306
+ return;
307
+ }
308
+ await fs.writeFile(hookPath, hookScript);
309
+ await fs.chmod(hookPath, 493);
310
+ logLines([
311
+ "",
312
+ ansis_default.green(`Created pre-commit hook at ${fmt.filePath(hookPath)}`),
313
+ ansis_default.dim("Your staged files will now be scanned for sensitive values before each commit."),
314
+ ""
315
+ ]);
316
+ }
317
+ __name(installHook, "installHook");
318
+ var commandFn = /* @__PURE__ */ __name(async (ctx) => {
319
+ if (ctx.values["install-hook"]) {
320
+ await installHook(process.cwd());
321
+ return;
322
+ }
323
+ const onlyStaged = ctx.values.staged ?? false;
324
+ const includeIgnored = ctx.values["include-ignored"] ?? false;
325
+ const envGraph = await loadVarlockEnvGraph({
326
+ entryFilePath: ctx.values.path
327
+ });
328
+ for (const source of envGraph.sortedDataSources) {
329
+ if (source.loadingError) {
330
+ throw new CliExitError(`Error loading config: ${source.loadingError.message}`, {
331
+ suggestion: "Make sure your .env.schema file is valid."
332
+ });
333
+ }
334
+ }
335
+ await envGraph.resolveEnvValues();
336
+ const sensitiveValues = /* @__PURE__ */ new Map();
337
+ for (const itemKey in envGraph.configSchema) {
338
+ const item = envGraph.configSchema[itemKey];
339
+ if (item.isSensitive && my_dash_default.isString(item.resolvedValue) && item.resolvedValue !== "") {
340
+ sensitiveValues.set(itemKey, item.resolvedValue);
341
+ }
342
+ }
343
+ if (sensitiveValues.size === 0) {
344
+ logLines([ansis_default.green("\u2705 No sensitive values found in config - nothing to scan for.")]);
345
+ return;
346
+ }
347
+ const cwd = process.cwd();
348
+ let files;
349
+ if (includeIgnored) {
350
+ files = await walkDirectory(cwd);
351
+ } else {
352
+ const gitFiles = await getGitFiles(cwd, onlyStaged);
353
+ if (gitFiles !== null) {
354
+ files = gitFiles;
355
+ } else {
356
+ if (onlyStaged) {
357
+ throw new CliExitError("Could not run git to find staged files", {
358
+ suggestion: "Make sure git is installed and you are inside a git repository."
359
+ });
360
+ }
361
+ files = await walkDirectory(cwd);
362
+ }
363
+ }
364
+ if (files.length === 0) {
365
+ if (onlyStaged) {
366
+ console.log("No staged files to scan.");
367
+ } else {
368
+ console.log(ansis_default.green("\u2705 No files found to scan."));
369
+ }
370
+ return;
371
+ }
372
+ const allFindings = [];
373
+ for (const filePath of files) {
374
+ const findings = await scanFileForValues(filePath, sensitiveValues);
375
+ allFindings.push(...findings);
376
+ }
377
+ if (allFindings.length === 0) {
378
+ logLines([ansis_default.green(`\u2705 No sensitive values found in plaintext. (scanned ${files.length} file${files.length === 1 ? "" : "s"})`)]);
379
+ return;
380
+ }
381
+ const findingsByFile = /* @__PURE__ */ new Map();
382
+ for (const finding of allFindings) {
383
+ const existing = findingsByFile.get(finding.filePath) ?? [];
384
+ existing.push(finding);
385
+ findingsByFile.set(finding.filePath, existing);
386
+ }
387
+ console.error(ansis_default.red(`
388
+ \u{1F6A8} Found ${allFindings.length} sensitive value(s) in plaintext across ${findingsByFile.size} file(s):
389
+ `));
390
+ for (const [filePath, findings] of findingsByFile) {
391
+ const relPath = path.relative(cwd, filePath);
392
+ for (const finding of findings) {
393
+ const redactedLine = finding.line.replaceAll(finding.sensitiveValue, redactString(finding.sensitiveValue));
394
+ const truncatedLine = redactedLine.length > 100 ? `${redactedLine.substring(0, 100)}\u2026` : redactedLine;
395
+ console.error(` ${fmt.fileName(`${relPath}:${finding.lineNumber}:${finding.columnNumber}`)} ${ansis_default.yellow(finding.sensitiveKeyName)}`);
396
+ console.error(` ${ansis_default.dim(truncatedLine)}`);
397
+ }
398
+ console.error("");
399
+ }
400
+ gracefulExit(1);
401
+ }, "commandFn");
402
+
403
+ export { commandFn, commandSpec, getGitFiles, scanFileForValues, walkDirectory };
404
+ //# sourceMappingURL=chunk-WIIXKZ3N.js.map
405
+ //# sourceMappingURL=chunk-WIIXKZ3N.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/helpers/install-detection.ts","../src/cli/commands/scan.command.ts"],"names":[],"mappings":"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","file":"chunk-WIIXKZ3N.js","sourcesContent":["\nexport function isBundledSEA() {\n try {\n return __VARLOCK_SEA_BUILD__;\n } catch (e) {\n return false;\n }\n}\n","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 description: 'Path to a specific .env file (e.g. .env.prod) or directory ending with \"/\" to use as the schema entry point (default: current directory)',\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 --install-hook # Set up as a git pre-commit hook\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 * 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 // Load the varlock env graph to get the actual sensitive values\n const envGraph = await loadVarlockEnvGraph({\n entryFilePath: 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 (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 (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"]}
@@ -0,0 +1,58 @@
1
+ import { __name } from './chunk-6PEHRAEP.js';
2
+ import { exec, spawn } from 'child_process';
3
+ import { promisify } from 'util';
4
+
5
+ var ExecError = class extends Error {
6
+ constructor(exitCode, signal, data = "command gave no output") {
7
+ super(data);
8
+ this.exitCode = exitCode;
9
+ this.signal = signal;
10
+ this.data = data;
11
+ }
12
+ static {
13
+ __name(this, "ExecError");
14
+ }
15
+ };
16
+ function spawnAsyncHelper(command, args, spawnOptions) {
17
+ const childProcess = spawn(command, args, spawnOptions || {});
18
+ const deferred = new Promise((resolve, reject) => {
19
+ let stdoutData = "";
20
+ let stderrData = "";
21
+ childProcess.stdout?.on("data", (data) => {
22
+ stdoutData += data.toString();
23
+ });
24
+ childProcess.stderr?.on("data", (data) => {
25
+ stderrData += data.toString();
26
+ });
27
+ childProcess.stdout?.on("error", (err) => {
28
+ reject(err);
29
+ });
30
+ childProcess.stderr?.on("error", (err) => {
31
+ reject(err);
32
+ });
33
+ childProcess.on("error", (err) => {
34
+ reject(err);
35
+ });
36
+ childProcess.on("exit", (exitCode, signal) => {
37
+ if (!exitCode) {
38
+ resolve(stdoutData);
39
+ } else {
40
+ reject(
41
+ new ExecError(exitCode, signal, stderrData)
42
+ );
43
+ }
44
+ });
45
+ });
46
+ return { childProcess, execResult: deferred };
47
+ }
48
+ __name(spawnAsyncHelper, "spawnAsyncHelper");
49
+ async function spawnAsync(command, args, opts) {
50
+ const { execResult } = spawnAsyncHelper(command, args, opts);
51
+ return execResult;
52
+ }
53
+ __name(spawnAsync, "spawnAsync");
54
+ promisify(exec);
55
+
56
+ export { spawnAsync };
57
+ //# sourceMappingURL=chunk-Y3ITSQA4.js.map
58
+ //# sourceMappingURL=chunk-Y3ITSQA4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../utils/src/exec-helpers.ts"],"names":[],"mappings":";;;;AAGO,IAAM,SAAA,GAAN,cAAwB,KAAA,CAAM;AAAA,EACnC,WAAA,CACW,QAAA,EACA,MAAA,EACA,IAAA,GAAe,wBAAA,EACxB;AACA,IAAA,KAAA,CAAM,IAAI,CAAA;AAJD,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAGX;AAAA,EAVF;AAGqC,IAAA,MAAA,CAAA,IAAA,EAAA,WAAA,CAAA;AAAA;AAQrC,CAAA;AAEO,SAAS,gBAAA,CACd,OAAA,EACA,IAAA,EACA,YAAA,EACA;AACA,EAAA,MAAM,eAAe,KAAA,CAAM,OAAA,EAAS,IAAA,EAAM,YAAA,IAAgB,EAAE,CAAA;AAE5D,EAAA,MAAM,QAAA,GAAW,IAAI,OAAA,CAAgB,CAAC,SAAS,MAAA,KAAW;AACxD,IAAA,IAAI,UAAA,GAAqB,EAAA;AACzB,IAAA,IAAI,UAAA,GAAqB,EAAA;AACzB,IAAA,YAAA,CAAa,MAAA,EAAQ,EAAA,CAAG,MAAA,EAAQ,CAAC,IAAA,KAAS;AACxC,MAAA,UAAA,IAAc,KAAK,QAAA,EAAS;AAAA,IAC9B,CAAC,CAAA;AACD,IAAA,YAAA,CAAa,MAAA,EAAQ,EAAA,CAAG,MAAA,EAAQ,CAAC,IAAA,KAAS;AACxC,MAAA,UAAA,IAAc,KAAK,QAAA,EAAS;AAAA,IAC9B,CAAC,CAAA;AACD,IAAA,YAAA,CAAa,MAAA,EAAQ,EAAA,CAAG,OAAA,EAAS,CAAC,GAAA,KAAQ;AACxC,MAAA,MAAA,CAAO,GAAG,CAAA;AAAA,IACZ,CAAC,CAAA;AACD,IAAA,YAAA,CAAa,MAAA,EAAQ,EAAA,CAAG,OAAA,EAAS,CAAC,GAAA,KAAQ;AACxC,MAAA,MAAA,CAAO,GAAG,CAAA;AAAA,IACZ,CAAC,CAAA;AACD,IAAA,YAAA,CAAa,EAAA,CAAG,OAAA,EAAS,CAAC,GAAA,KAAQ;AAChC,MAAA,MAAA,CAAO,GAAG,CAAA;AAAA,IACZ,CAAC,CAAA;AACD,IAAA,YAAA,CAAa,EAAA,CAAG,MAAA,EAAQ,CAAC,QAAA,EAAU,MAAA,KAAW;AAC5C,MAAA,IAAI,CAAC,QAAA,EAAU;AACb,QAAA,OAAA,CAAQ,UAAU,CAAA;AAAA,MACpB,CAAA,MAAO;AACL,QAAA,MAAA;AAAA,UACE,IAAI,SAAA,CAAU,QAAA,EAAU,MAAA,EAAQ,UAAU;AAAA,SAC5C;AAAA,MACF;AAAA,IACF,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AAED,EAAA,OAAO,EAAE,YAAA,EAAc,UAAA,EAAY,QAAA,EAAS;AAC9C;AArCgB,MAAA,CAAA,gBAAA,EAAA,kBAAA,CAAA;AAuChB,eAAsB,UAAA,CACpB,OAAA,EACA,IAAA,EACA,IAAA,EACA;AACA,EAAA,MAAM,EAAE,UAAA,EAAW,GAAI,gBAAA,CAAiB,OAAA,EAAS,MAAM,IAAI,CAAA;AAC3D,EAAA,OAAO,UAAA;AACT;AAPsB,MAAA,CAAA,UAAA,EAAA,YAAA,CAAA;AASG,UAAU,IAAI","file":"chunk-Y3ITSQA4.js","sourcesContent":["import { spawn, exec, type SpawnOptions } from 'node:child_process';\nimport { promisify } from 'node:util';\n\nexport class ExecError extends Error {\n constructor(\n readonly exitCode: number,\n readonly signal: NodeJS.Signals | null,\n readonly data: string = 'command gave no output',\n ) {\n super(data);\n }\n}\n\nexport function spawnAsyncHelper(\n command: string,\n args: Array<string>,\n spawnOptions?: SpawnOptions,\n) {\n const childProcess = spawn(command, args, spawnOptions || {});\n\n const deferred = new Promise<string>((resolve, reject) => {\n let stdoutData: string = '';\n let stderrData: string = '';\n childProcess.stdout?.on('data', (data) => {\n stdoutData += data.toString();\n });\n childProcess.stderr?.on('data', (data) => {\n stderrData += data.toString();\n });\n childProcess.stdout?.on('error', (err) => {\n reject(err);\n });\n childProcess.stderr?.on('error', (err) => {\n reject(err);\n });\n childProcess.on('error', (err) => {\n reject(err);\n });\n childProcess.on('exit', (exitCode, signal) => {\n if (!exitCode) {\n resolve(stdoutData);\n } else {\n reject(\n new ExecError(exitCode, signal, stderrData),\n );\n }\n });\n });\n\n return { childProcess, execResult: deferred };\n}\n\nexport async function spawnAsync(\n command: string,\n args: Array<string>,\n opts?: SpawnOptions,\n) {\n const { execResult } = spawnAsyncHelper(command, args, opts);\n return execResult;\n}\n\nexport const asyncExec = promisify(exec);\n"]}