varlock 0.2.2 → 0.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 (78) hide show
  1. package/dist/auto-load.js +1 -1
  2. package/dist/{chunk-HPUQ2CCN.js → chunk-26ICEAKS.js} +6 -5
  3. package/dist/chunk-26ICEAKS.js.map +1 -0
  4. package/dist/{chunk-BHHYQ7SH.js → chunk-2YPKUF3A.js} +3 -3
  5. package/dist/{chunk-BHHYQ7SH.js.map → chunk-2YPKUF3A.js.map} +1 -1
  6. package/dist/{chunk-UDXNNRWI.js → chunk-4A54P4EM.js} +10 -10
  7. package/dist/chunk-4A54P4EM.js.map +1 -0
  8. package/dist/chunk-GEJNYKR4.js +17 -0
  9. package/dist/chunk-GEJNYKR4.js.map +1 -0
  10. package/dist/{chunk-35SAMS66.js → chunk-GJ7PTJM4.js} +3 -3
  11. package/dist/{chunk-35SAMS66.js.map → chunk-GJ7PTJM4.js.map} +1 -1
  12. package/dist/{chunk-N2HZMIGS.js → chunk-IG5PPVD7.js} +430 -454
  13. package/dist/chunk-IG5PPVD7.js.map +1 -0
  14. package/dist/chunk-JDMZWNQA.js +68 -0
  15. package/dist/chunk-JDMZWNQA.js.map +1 -0
  16. package/dist/chunk-KKPD7AYU.js +34 -0
  17. package/dist/chunk-KKPD7AYU.js.map +1 -0
  18. package/dist/{chunk-3FLO3UFZ.js → chunk-LZ52O5WU.js} +13 -10
  19. package/dist/chunk-LZ52O5WU.js.map +1 -0
  20. package/dist/chunk-MHIFZAPA.js +405 -0
  21. package/dist/chunk-MHIFZAPA.js.map +1 -0
  22. package/dist/{chunk-4N3YR2QQ.js → chunk-MXZI2FC6.js} +19 -43
  23. package/dist/chunk-MXZI2FC6.js.map +1 -0
  24. package/dist/chunk-QZ6HBRJC.js +97 -0
  25. package/dist/chunk-QZ6HBRJC.js.map +1 -0
  26. package/dist/{chunk-ZUNB52KY.js → chunk-TLXFVH7P.js} +20 -17
  27. package/dist/chunk-TLXFVH7P.js.map +1 -0
  28. package/dist/chunk-VQ5I7WMP.js +331 -0
  29. package/dist/chunk-VQ5I7WMP.js.map +1 -0
  30. package/dist/chunk-WDC5CEKD.js +309 -0
  31. package/dist/chunk-WDC5CEKD.js.map +1 -0
  32. package/dist/chunk-WZW7QS6M.js +11371 -0
  33. package/dist/chunk-WZW7QS6M.js.map +1 -0
  34. package/dist/chunk-Y3ITSQA4.js +58 -0
  35. package/dist/chunk-Y3ITSQA4.js.map +1 -0
  36. package/dist/cli/cli-executable.js +56 -41
  37. package/dist/cli/cli-executable.js.map +1 -1
  38. package/dist/config-item-2AL7WF23.js +5 -0
  39. package/dist/config-item-2AL7WF23.js.map +1 -0
  40. package/dist/dotenv-compat.js +1 -1
  41. package/dist/{env-graph-BZwrHQbb.d.ts → env-graph-C8s2oqOJ.d.ts} +71 -4
  42. package/dist/help.command-7E52XAOO.js +5 -0
  43. package/dist/{help.command-MLH2WA5Y.js.map → help.command-7E52XAOO.js.map} +1 -1
  44. package/dist/index.d.ts +2 -3
  45. package/dist/index.js +5 -2
  46. package/dist/index.js.map +1 -1
  47. package/dist/init.command-J4HZL3PB.js +12 -0
  48. package/dist/{init.command-DLPZ3R4T.js.map → init.command-J4HZL3PB.js.map} +1 -1
  49. package/dist/load.command-6DAP7LEX.js +11 -0
  50. package/dist/{load.command-4G5POJYR.js.map → load.command-6DAP7LEX.js.map} +1 -1
  51. package/dist/plugin-lib.d.ts +2 -3
  52. package/dist/plugin-lib.js +2 -1
  53. package/dist/printenv.command-7B7SZ2EF.js +12 -0
  54. package/dist/printenv.command-7B7SZ2EF.js.map +1 -0
  55. package/dist/run.command-HVV6XXDR.js +12 -0
  56. package/dist/{run.command-L5LLHOW3.js.map → run.command-HVV6XXDR.js.map} +1 -1
  57. package/dist/runtime/env.d.ts +1 -2
  58. package/dist/scan.command-Q33VJOPD.js +13 -0
  59. package/dist/scan.command-Q33VJOPD.js.map +1 -0
  60. package/dist/telemetry.command-HOJDUCKG.js +11 -0
  61. package/dist/{telemetry.command-JF72FOYJ.js.map → telemetry.command-HOJDUCKG.js.map} +1 -1
  62. package/package.json +23 -28
  63. package/LICENSE +0 -21
  64. package/dist/chunk-3FLO3UFZ.js.map +0 -1
  65. package/dist/chunk-4N3YR2QQ.js.map +0 -1
  66. package/dist/chunk-FETFVFG5.js +0 -4146
  67. package/dist/chunk-FETFVFG5.js.map +0 -1
  68. package/dist/chunk-HPUQ2CCN.js.map +0 -1
  69. package/dist/chunk-N2HZMIGS.js.map +0 -1
  70. package/dist/chunk-N4REMPVX.js +0 -135
  71. package/dist/chunk-N4REMPVX.js.map +0 -1
  72. package/dist/chunk-UDXNNRWI.js.map +0 -1
  73. package/dist/chunk-ZUNB52KY.js.map +0 -1
  74. package/dist/help.command-MLH2WA5Y.js +0 -5
  75. package/dist/init.command-DLPZ3R4T.js +0 -8
  76. package/dist/load.command-4G5POJYR.js +0 -8
  77. package/dist/run.command-L5LLHOW3.js +0 -9
  78. package/dist/telemetry.command-JF72FOYJ.js +0 -8
@@ -0,0 +1,5 @@
1
+ export { ConfigItem } from './chunk-WZW7QS6M.js';
2
+ import './chunk-QZ6HBRJC.js';
3
+ import './chunk-6PEHRAEP.js';
4
+ //# sourceMappingURL=config-item-2AL7WF23.js.map
5
+ //# sourceMappingURL=config-item-2AL7WF23.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"config-item-2AL7WF23.js"}
@@ -1,4 +1,4 @@
1
- import './chunk-BHHYQ7SH.js';
1
+ import './chunk-2YPKUF3A.js';
2
2
  import './chunk-UIOEEWG5.js';
3
3
  import './chunk-ZXJ4CEDK.js';
4
4
  import './chunk-TVFOIGJP.js';
@@ -1,6 +1,5 @@
1
- import { ParsedEnvSpecDecorator, ParsedEnvSpecFile, ParsedEnvSpecStaticValue, ParsedEnvSpecFunctionCall } from '@env-spec/parser';
1
+ import { ParsedEnvSpecDecorator, ParsedEnvSpecStaticValue, ParsedEnvSpecFunctionCall, ParsedEnvSpecFunctionArgs, ParsedEnvSpecFile } from '@env-spec/parser';
2
2
  import { FallbackIfUnknown } from '@env-spec/utils/type-utils';
3
- import { Debugger } from 'debug';
4
3
 
5
4
  type VarlockErrorLocationDetails = {
6
5
  /** file path or url */
@@ -214,6 +213,8 @@ declare class Resolver {
214
213
  get isStatic(): boolean;
215
214
  get staticValue(): ResolvedValue;
216
215
  inferredType?: string;
216
+ /** reference to the parsed node that created this resolver, used for error location tracking */
217
+ _parsedNode?: ParsedEnvSpecStaticValue | ParsedEnvSpecFunctionCall | ParsedEnvSpecFunctionArgs;
217
218
  _schemaErrors: Array<SchemaError>;
218
219
  private _depsObj;
219
220
  get childResolvers(): Array<Resolver>;
@@ -381,14 +382,19 @@ type ConfigItemDef = {
381
382
  };
382
383
  type ConfigItemDefAndSource = {
383
384
  itemDef: ConfigItemDef;
384
- source: EnvGraphDataSource;
385
+ source?: EnvGraphDataSource;
385
386
  };
386
387
  declare class ConfigItem {
387
388
  readonly envGraph: EnvGraph;
388
389
  readonly key: string;
390
+ /** Whether this is a builtin VARLOCK_* variable */
391
+ isBuiltin?: boolean;
392
+ /** Programmatic definitions not tied to a data source (e.g. builtin vars) */
393
+ _internalDefs: Array<ConfigItemDefAndSource>;
389
394
  constructor(envGraph: EnvGraph, key: string);
390
395
  /**
391
396
  * fetch ordered list of definitions for this item, by following up sorted data sources list
397
+ * internal defs (builtins) are appended last (lowest priority)
392
398
  */
393
399
  get defs(): ConfigItemDefAndSource[];
394
400
  get description(): string | undefined;
@@ -447,6 +453,14 @@ declare class ConfigItem {
447
453
  type GraphNodeId = string;
448
454
  type GraphAdjacencyList = Record<GraphNodeId, Array<GraphNodeId>>;
449
455
 
456
+ /**
457
+ * Debug logger with colors, timing, and format string support
458
+ * Enable by setting DEBUG env var with namespaces (e.g., DEBUG=varlock:*)
459
+ */
460
+ type DebugFn = (...args: Array<any>) => void;
461
+ declare function createDebug(namespace: string): DebugFn;
462
+ type Debugger = ReturnType<typeof createDebug>;
463
+
450
464
  declare class VarlockPlugin {
451
465
  readonly ERRORS: {
452
466
  ValidationError: typeof ValidationError;
@@ -493,6 +507,39 @@ declare class VarlockPlugin {
493
507
  executePluginModule(): Promise<void>;
494
508
  }
495
509
 
510
+ /**
511
+ * Shared parsers for CI env values: ref → branch, repo string → { owner, name }, env value → deployment enum.
512
+ */
513
+ type DeploymentEnvironment = ('development' | 'preview' | 'staging' | 'production' | 'test');
514
+ interface RepoParts {
515
+ owner: string;
516
+ name: string;
517
+ }
518
+ interface CiEnvInfo {
519
+ isCI: boolean;
520
+ name?: string;
521
+ docsUrl?: string;
522
+ isPR?: boolean;
523
+ repo?: RepoParts;
524
+ fullRepoName?: string;
525
+ branch?: string;
526
+ prNumber?: number;
527
+ commitSha?: string;
528
+ commitShaShort?: string;
529
+ environment?: DeploymentEnvironment;
530
+ /** Unique run/build id (e.g. GITHUB_RUN_ID, BUILD_ID) */
531
+ runId?: string;
532
+ /** URL to the run or deploy in the CI/deploy UI */
533
+ buildUrl?: string;
534
+ /** Workflow or pipeline name */
535
+ workflowName?: string;
536
+ /** User or app that triggered the run (e.g. GITHUB_ACTOR) */
537
+ actor?: string;
538
+ /** Event type (e.g. push, pull_request, workflow_dispatch) */
539
+ eventName?: string;
540
+ raw?: Record<string, string>;
541
+ }
542
+
496
543
  type SerializedEnvGraph = {
497
544
  basePath?: string;
498
545
  sources: Array<{
@@ -534,10 +581,30 @@ declare class EnvGraph {
534
581
  rootDecoratorsRegistry: Record<string, RootDecoratorDef>;
535
582
  registerRootDecorator(decoratorDef: RootDecoratorDef): void;
536
583
  constructor();
584
+ /**
585
+ * Override for process.env used by builtin var detection.
586
+ * When set, builtin vars use this instead of the real process.env.
587
+ * Primarily useful for testing.
588
+ */
589
+ processEnvOverride?: Record<string, string | undefined>;
590
+ /** Cached CI env info, computed lazily from processEnvOverride or real process.env */
591
+ private _cachedCiEnv?;
592
+ get ciEnvInfo(): CiEnvInfo;
593
+ /** The process env record used for builtin var detection */
594
+ get processEnvForBuiltins(): Record<string, string | undefined>;
595
+ /**
596
+ * Register a builtin VARLOCK_* variable.
597
+ * Attaches an internal def with the builtin resolver so it flows through the normal pipeline.
598
+ * If the item already exists (user-defined), the internal def is added as a fallback.
599
+ */
600
+ registerBuiltinVar(key: string): void;
537
601
  setRootDataSource(source: EnvGraphDataSource): Promise<void>;
538
602
  finishLoad(): Promise<void>;
539
603
  get graphAdjacencyList(): GraphAdjacencyList;
540
604
  resolveEnvValues(keys?: Array<string>): Promise<void>;
605
+ resolveItemWithDeps(key: string): Promise<void>;
606
+ /** config keys with builtin vars first, then user-defined in schema order */
607
+ get sortedConfigKeys(): string[];
541
608
  getResolvedEnvObject(): Record<string, any>;
542
609
  getSerializedGraph(): SerializedEnvGraph;
543
610
  get isInvalid(): boolean;
@@ -548,4 +615,4 @@ declare class EnvGraph {
548
615
  plugins: Array<VarlockPlugin>;
549
616
  }
550
617
 
551
- export { ConfigLoadError as C, DotEnvFileDataSource as D, EnvGraph as E, Resolver as R, type SerializedEnvGraph as S, VarlockPlugin as V, SchemaError as a, ValidationError as b, CoercionError as c, ResolutionError as d };
618
+ export { ConfigLoadError as C, type Debugger as D, EnvGraph as E, Resolver as R, type SerializedEnvGraph as S, VarlockPlugin as V, DotEnvFileDataSource as a, SchemaError as b, createDebug as c, ValidationError as d, CoercionError as e, ResolutionError as f };
@@ -0,0 +1,5 @@
1
+ export { commandFn, commandSpec } from './chunk-GJ7PTJM4.js';
2
+ import './chunk-4A54P4EM.js';
3
+ import './chunk-6PEHRAEP.js';
4
+ //# sourceMappingURL=help.command-7E52XAOO.js.map
5
+ //# sourceMappingURL=help.command-7E52XAOO.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"help.command-MLH2WA5Y.js"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"help.command-7E52XAOO.js"}
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { E as EnvGraph, D as DotEnvFileDataSource, C as ConfigLoadError, a as SchemaError, b as ValidationError, c as CoercionError, d as ResolutionError } from './env-graph-BZwrHQbb.js';
2
- export { S as SerializedEnvGraph } from './env-graph-BZwrHQbb.js';
1
+ import { E as EnvGraph, a as DotEnvFileDataSource, C as ConfigLoadError, b as SchemaError, d as ValidationError, e as CoercionError, f as ResolutionError } from './env-graph-C8s2oqOJ.js';
2
+ export { D as Debugger, S as SerializedEnvGraph, c as createDebug } from './env-graph-C8s2oqOJ.js';
3
3
  import { initVarlockEnv } from './runtime/env.js';
4
4
  export { ENV } from './runtime/env.js';
5
5
  export { patchGlobalConsole } from './runtime/patch-console.js';
@@ -7,7 +7,6 @@ export { patchGlobalServerResponse } from './runtime/patch-server-response.js';
7
7
  export { patchGlobalResponse } from './runtime/patch-response.js';
8
8
  import '@env-spec/parser';
9
9
  import '@env-spec/utils/type-utils';
10
- import 'debug';
11
10
 
12
11
  declare function loadEnvGraph(opts?: {
13
12
  basePath?: string;
package/dist/index.js CHANGED
@@ -1,7 +1,10 @@
1
1
  export { patchGlobalResponse } from './chunk-UIOEEWG5.js';
2
2
  export { patchGlobalServerResponse } from './chunk-ZXJ4CEDK.js';
3
- import { loadVarlockEnvGraph, checkForConfigErrors } from './chunk-ZUNB52KY.js';
4
- import { ResolutionError, CoercionError, ValidationError, SchemaError, ConfigLoadError, loadEnvGraph, DotEnvFileDataSource, EnvGraph } from './chunk-FETFVFG5.js';
3
+ import { checkForConfigErrors } from './chunk-TLXFVH7P.js';
4
+ import { loadVarlockEnvGraph } from './chunk-GEJNYKR4.js';
5
+ import { loadEnvGraph } from './chunk-VQ5I7WMP.js';
6
+ import { ResolutionError, CoercionError, ValidationError, SchemaError, ConfigLoadError, DotEnvFileDataSource, EnvGraph } from './chunk-WZW7QS6M.js';
7
+ export { createDebug } from './chunk-QZ6HBRJC.js';
5
8
  export { patchGlobalConsole } from './chunk-TYIS6T2T.js';
6
9
  import { initVarlockEnv } from './chunk-WAMBVZL2.js';
7
10
  export { ENV } from './chunk-WAMBVZL2.js';
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;AAiBA,eAAsB,IAAA,GAAO;AAE3B,EAAA,MAAM,QAAA,GAAW,MAAM,mBAAA,EAAoB;AAC3C,EAAA,MAAM,SAAS,gBAAA,EAAiB;AAChC,EAAA,oBAAA,CAAqB,QAAQ,CAAA;AAG7B,EAAA,OAAA,CAAQ,IAAI,aAAA,GAAgB,IAAA,CAAK,SAAA,CAAU,QAAA,CAAS,oBAAoB,CAAA;AACxE,EAAA,cAAA,EAAe;AAEjB;AAVsB,MAAA,CAAA,IAAA,EAAA,MAAA,CAAA;AAaf,SAAS,yBAAyB,IAAA,EAGtC;AACD,EAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,CAAI,aAAA,SAAsB,EAAC;AACxC,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,IAAI,aAAa,CAAA;AACpD,EAAA,MAAM,eAAe,EAAC;AACtB,EAAA,KAAA,MAAW,GAAA,IAAO,QAAQ,MAAA,EAAQ;AAChC,IAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,MAAA,CAAO,GAAG,CAAA;AACnC,IAAA,MAAM,WAAA,GAAc,CAAC,QAAA,CAAS,WAAA,IAAe,IAAA,EAAM,gBAAA;AACnD,IAAA,IAAI,CAAC,WAAA,EAAa;AAClB,IAAA,YAAA,CAAa,CAAA,EAAG,IAAA,EAAM,SAAA,IAAa,KAAK,IAAI,GAAG,CAAA,CAAE,CAAA,GAAI,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,MAAA,CAAO,GAAG,EAAE,KAAK,CAAA;AAAA,EAC/F;AACA,EAAA,OAAO,YAAA;AACT;AAdgB,MAAA,CAAA,wBAAA,EAAA,0BAAA,CAAA;AAiBT,IAAM,QAAA,GAAW;AAAA;AAAA,EAEtB,QAAA;AAAA,EACA,oBAAA;AAAA;AAAA,EAGA,YAAA;AAAA;AAAA,EAGA,eAAA;AAAA,EACA,WAAA;AAAA,EACA,eAAA;AAAA,EACA,aAAA;AAAA,EACA,eAAA;AAAA;AAAA,EAGA,mBAAA;AAAA,EACA,oBAAA;AAAA,EACA;AACF","file":"index.js","sourcesContent":["import { checkForConfigErrors } from './cli/helpers/error-checks';\nimport { loadVarlockEnvGraph } from './lib/load-graph';\nimport { initVarlockEnv } from './runtime/env';\n\n// Import env-graph components for internal API\nimport {\n EnvGraph,\n loadEnvGraph,\n DotEnvFileDataSource,\n ConfigLoadError,\n SchemaError,\n ValidationError,\n CoercionError,\n ResolutionError,\n type SerializedEnvGraph,\n} from './env-graph';\n\nexport async function load() {\n // TODO: add some options\n const envGraph = await loadVarlockEnvGraph();\n await envGraph.resolveEnvValues();\n checkForConfigErrors(envGraph);\n\n // loadFromSerializedGraph(envGraph.getSerializedGraph());\n process.env.__VARLOCK_ENV = JSON.stringify(envGraph.getSerializedGraph());\n initVarlockEnv();\n // TODO: return resolved env and schema / meta info\n}\n\n\nexport function getBuildTimeReplacements(opts?: {\n objectKey?: string,\n includeSensitive?: boolean,\n}) {\n if (!process.env.__VARLOCK_ENV) return {};\n const envInfo = JSON.parse(process.env.__VARLOCK_ENV) as SerializedEnvGraph;\n const replacements = {} as Record<string, string>;\n for (const key in envInfo.config) {\n const itemInfo = envInfo.config[key];\n const replaceItem = !itemInfo.isSensitive || opts?.includeSensitive;\n if (!replaceItem) continue;\n replacements[`${opts?.objectKey || 'ENV'}.${key}`] = JSON.stringify(envInfo.config[key].value);\n }\n return replacements;\n}\n\n// Internal API for direct env graph manipulation\nexport const internal = {\n // Core classes\n EnvGraph,\n DotEnvFileDataSource,\n\n // Loader function\n loadEnvGraph,\n\n // Error classes\n ConfigLoadError,\n SchemaError,\n ValidationError,\n CoercionError,\n ResolutionError,\n\n // Varlock-specific utilities\n loadVarlockEnvGraph,\n checkForConfigErrors,\n initVarlockEnv,\n};\n\nexport { patchGlobalConsole } from './runtime/patch-console';\nexport { patchGlobalServerResponse } from './runtime/patch-server-response';\nexport { patchGlobalResponse } from './runtime/patch-response';\nexport { ENV } from './runtime/env';\nexport type { SerializedEnvGraph };\n"]}
1
+ {"version":3,"sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAiBA,eAAsB,IAAA,GAAO;AAE3B,EAAA,MAAM,QAAA,GAAW,MAAM,mBAAA,EAAoB;AAC3C,EAAA,MAAM,SAAS,gBAAA,EAAiB;AAChC,EAAA,oBAAA,CAAqB,QAAQ,CAAA;AAG7B,EAAA,OAAA,CAAQ,IAAI,aAAA,GAAgB,IAAA,CAAK,SAAA,CAAU,QAAA,CAAS,oBAAoB,CAAA;AACxE,EAAA,cAAA,EAAe;AAEjB;AAVsB,MAAA,CAAA,IAAA,EAAA,MAAA,CAAA;AAaf,SAAS,yBAAyB,IAAA,EAGtC;AACD,EAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,CAAI,aAAA,SAAsB,EAAC;AACxC,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,IAAI,aAAa,CAAA;AACpD,EAAA,MAAM,eAAe,EAAC;AACtB,EAAA,KAAA,MAAW,GAAA,IAAO,QAAQ,MAAA,EAAQ;AAChC,IAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,MAAA,CAAO,GAAG,CAAA;AACnC,IAAA,MAAM,WAAA,GAAc,CAAC,QAAA,CAAS,WAAA,IAAe,IAAA,EAAM,gBAAA;AACnD,IAAA,IAAI,CAAC,WAAA,EAAa;AAClB,IAAA,YAAA,CAAa,CAAA,EAAG,IAAA,EAAM,SAAA,IAAa,KAAK,IAAI,GAAG,CAAA,CAAE,CAAA,GAAI,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,MAAA,CAAO,GAAG,EAAE,KAAK,CAAA;AAAA,EAC/F;AACA,EAAA,OAAO,YAAA;AACT;AAdgB,MAAA,CAAA,wBAAA,EAAA,0BAAA,CAAA;AAiBT,IAAM,QAAA,GAAW;AAAA;AAAA,EAEtB,QAAA;AAAA,EACA,oBAAA;AAAA;AAAA,EAGA,YAAA;AAAA;AAAA,EAGA,eAAA;AAAA,EACA,WAAA;AAAA,EACA,eAAA;AAAA,EACA,aAAA;AAAA,EACA,eAAA;AAAA;AAAA,EAGA,mBAAA;AAAA,EACA,oBAAA;AAAA,EACA;AACF","file":"index.js","sourcesContent":["import { checkForConfigErrors } from './cli/helpers/error-checks';\nimport { loadVarlockEnvGraph } from './lib/load-graph';\nimport { initVarlockEnv } from './runtime/env';\n\n// Import env-graph components for internal API\nimport {\n EnvGraph,\n loadEnvGraph,\n DotEnvFileDataSource,\n ConfigLoadError,\n SchemaError,\n ValidationError,\n CoercionError,\n ResolutionError,\n type SerializedEnvGraph,\n} from './env-graph';\n\nexport async function load() {\n // TODO: add some options\n const envGraph = await loadVarlockEnvGraph();\n await envGraph.resolveEnvValues();\n checkForConfigErrors(envGraph);\n\n // loadFromSerializedGraph(envGraph.getSerializedGraph());\n process.env.__VARLOCK_ENV = JSON.stringify(envGraph.getSerializedGraph());\n initVarlockEnv();\n // TODO: return resolved env and schema / meta info\n}\n\n\nexport function getBuildTimeReplacements(opts?: {\n objectKey?: string,\n includeSensitive?: boolean,\n}) {\n if (!process.env.__VARLOCK_ENV) return {};\n const envInfo = JSON.parse(process.env.__VARLOCK_ENV) as SerializedEnvGraph;\n const replacements = {} as Record<string, string>;\n for (const key in envInfo.config) {\n const itemInfo = envInfo.config[key];\n const replaceItem = !itemInfo.isSensitive || opts?.includeSensitive;\n if (!replaceItem) continue;\n replacements[`${opts?.objectKey || 'ENV'}.${key}`] = JSON.stringify(envInfo.config[key].value);\n }\n return replacements;\n}\n\n// Internal API for direct env graph manipulation\nexport const internal = {\n // Core classes\n EnvGraph,\n DotEnvFileDataSource,\n\n // Loader function\n loadEnvGraph,\n\n // Error classes\n ConfigLoadError,\n SchemaError,\n ValidationError,\n CoercionError,\n ResolutionError,\n\n // Varlock-specific utilities\n loadVarlockEnvGraph,\n checkForConfigErrors,\n initVarlockEnv,\n};\n\nexport { patchGlobalConsole } from './runtime/patch-console';\nexport { patchGlobalServerResponse } from './runtime/patch-server-response';\nexport { patchGlobalResponse } from './runtime/patch-response';\nexport { ENV } from './runtime/env';\nexport { createDebug, type Debugger } from './lib/debug';\nexport type { SerializedEnvGraph };\n"]}
@@ -0,0 +1,12 @@
1
+ export { commandFn, commandSpec } from './chunk-IG5PPVD7.js';
2
+ import './chunk-Y3ITSQA4.js';
3
+ import './chunk-MXZI2FC6.js';
4
+ import './chunk-KKPD7AYU.js';
5
+ import './chunk-4A54P4EM.js';
6
+ import './chunk-VQ5I7WMP.js';
7
+ import './chunk-WZW7QS6M.js';
8
+ import './chunk-QZ6HBRJC.js';
9
+ import './chunk-MIBOBKI4.js';
10
+ import './chunk-6PEHRAEP.js';
11
+ //# sourceMappingURL=init.command-J4HZL3PB.js.map
12
+ //# sourceMappingURL=init.command-J4HZL3PB.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"init.command-DLPZ3R4T.js"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"init.command-J4HZL3PB.js"}
@@ -0,0 +1,11 @@
1
+ export { commandFn, commandSpec } from './chunk-LZ52O5WU.js';
2
+ import './chunk-4A54P4EM.js';
3
+ import './chunk-TLXFVH7P.js';
4
+ import './chunk-GEJNYKR4.js';
5
+ import './chunk-VQ5I7WMP.js';
6
+ import './chunk-WZW7QS6M.js';
7
+ import './chunk-QZ6HBRJC.js';
8
+ import './chunk-MIBOBKI4.js';
9
+ import './chunk-6PEHRAEP.js';
10
+ //# sourceMappingURL=load.command-6DAP7LEX.js.map
11
+ //# sourceMappingURL=load.command-6DAP7LEX.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"load.command-4G5POJYR.js"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"load.command-6DAP7LEX.js"}
@@ -1,8 +1,7 @@
1
- import { V as VarlockPlugin } from './env-graph-BZwrHQbb.js';
2
- export { R as Resolver } from './env-graph-BZwrHQbb.js';
1
+ import { V as VarlockPlugin } from './env-graph-C8s2oqOJ.js';
2
+ export { D as Debugger, R as Resolver, c as createDebug } from './env-graph-C8s2oqOJ.js';
3
3
  import '@env-spec/parser';
4
4
  import '@env-spec/utils/type-utils';
5
- import 'debug';
6
5
 
7
6
  declare global {
8
7
  const plugin: VarlockPlugin;
@@ -1,3 +1,4 @@
1
-
1
+ export { createDebug } from './chunk-QZ6HBRJC.js';
2
+ import './chunk-6PEHRAEP.js';
2
3
  //# sourceMappingURL=plugin-lib.js.map
3
4
  //# sourceMappingURL=plugin-lib.js.map
@@ -0,0 +1,12 @@
1
+ export { commandFn, commandSpec } from './chunk-JDMZWNQA.js';
2
+ import './chunk-KKPD7AYU.js';
3
+ import './chunk-4A54P4EM.js';
4
+ import './chunk-TLXFVH7P.js';
5
+ import './chunk-GEJNYKR4.js';
6
+ import './chunk-VQ5I7WMP.js';
7
+ import './chunk-WZW7QS6M.js';
8
+ import './chunk-QZ6HBRJC.js';
9
+ import './chunk-MIBOBKI4.js';
10
+ import './chunk-6PEHRAEP.js';
11
+ //# sourceMappingURL=printenv.command-7B7SZ2EF.js.map
12
+ //# sourceMappingURL=printenv.command-7B7SZ2EF.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"printenv.command-7B7SZ2EF.js"}
@@ -0,0 +1,12 @@
1
+ export { commandFn, commandSpec } from './chunk-WDC5CEKD.js';
2
+ import './chunk-4A54P4EM.js';
3
+ import './chunk-TLXFVH7P.js';
4
+ import './chunk-GEJNYKR4.js';
5
+ import './chunk-VQ5I7WMP.js';
6
+ import './chunk-WZW7QS6M.js';
7
+ import './chunk-QZ6HBRJC.js';
8
+ import './chunk-WAMBVZL2.js';
9
+ import './chunk-MIBOBKI4.js';
10
+ import './chunk-6PEHRAEP.js';
11
+ //# sourceMappingURL=run.command-HVV6XXDR.js.map
12
+ //# sourceMappingURL=run.command-HVV6XXDR.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"run.command-L5LLHOW3.js"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"run.command-HVV6XXDR.js"}
@@ -1,7 +1,6 @@
1
- import { S as SerializedEnvGraph } from '../env-graph-BZwrHQbb.js';
1
+ import { S as SerializedEnvGraph } from '../env-graph-C8s2oqOJ.js';
2
2
  import '@env-spec/parser';
3
3
  import '@env-spec/utils/type-utils';
4
- import 'debug';
5
4
 
6
5
  declare function resetRedactionMap(graph: SerializedEnvGraph): void;
7
6
  /**
@@ -0,0 +1,13 @@
1
+ export { commandFn, commandSpec, getGitFiles, scanFileForValues, walkDirectory } from './chunk-MHIFZAPA.js';
2
+ import './chunk-Y3ITSQA4.js';
3
+ import './chunk-MXZI2FC6.js';
4
+ import './chunk-KKPD7AYU.js';
5
+ import './chunk-4A54P4EM.js';
6
+ import './chunk-GEJNYKR4.js';
7
+ import './chunk-VQ5I7WMP.js';
8
+ import './chunk-WZW7QS6M.js';
9
+ import './chunk-QZ6HBRJC.js';
10
+ import './chunk-MIBOBKI4.js';
11
+ import './chunk-6PEHRAEP.js';
12
+ //# sourceMappingURL=scan.command-Q33VJOPD.js.map
13
+ //# sourceMappingURL=scan.command-Q33VJOPD.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"scan.command-Q33VJOPD.js"}
@@ -0,0 +1,11 @@
1
+ export { commandFn, commandSpec } from './chunk-26ICEAKS.js';
2
+ import './chunk-MXZI2FC6.js';
3
+ import './chunk-KKPD7AYU.js';
4
+ import './chunk-4A54P4EM.js';
5
+ import './chunk-VQ5I7WMP.js';
6
+ import './chunk-WZW7QS6M.js';
7
+ import './chunk-QZ6HBRJC.js';
8
+ import './chunk-MIBOBKI4.js';
9
+ import './chunk-6PEHRAEP.js';
10
+ //# sourceMappingURL=telemetry.command-HOJDUCKG.js.map
11
+ //# sourceMappingURL=telemetry.command-HOJDUCKG.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"telemetry.command-JF72FOYJ.js"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"telemetry.command-HOJDUCKG.js"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "varlock",
3
- "version": "0.2.2",
3
+ "version": "0.3.0",
4
4
  "description": "The unified env var toolkit - load, validate, and secure your environment variables",
5
5
  "main": "index.js",
6
6
  "type": "module",
@@ -13,6 +13,16 @@
13
13
  "url": "https://github.com/dmno-dev/varlock.git",
14
14
  "directory": "packages/varlock"
15
15
  },
16
+ "scripts": {
17
+ "build": "tsup",
18
+ "build:binary": "bun run scripts/build-binaries.ts --dev",
19
+ "build:binaries": "bun run scripts/build-binaries.ts",
20
+ "dev": "tsup",
21
+ "test": "vitest",
22
+ "test:ci": "vitest --run",
23
+ "lint": "eslint .",
24
+ "lint:fix": "bun run lint --fix"
25
+ },
16
26
  "keywords": [
17
27
  "varlock",
18
28
  "secrets",
@@ -41,6 +51,7 @@
41
51
  "engines": {
42
52
  "node": ">=22"
43
53
  },
54
+ "dependencies": {},
44
55
  "exports": {
45
56
  ".": {
46
57
  "ts-src": "./src/index.ts",
@@ -93,23 +104,16 @@
93
104
  "default": "./dist/plugin-lib.js"
94
105
  }
95
106
  },
96
- "dependencies": {
97
- "debug": "^4.4.3",
98
- "execa": "^9.6.1",
99
- "semver": "^7.7.4",
100
- "which": "^6.0.1",
101
- "@env-spec/parser": "^0.1.0"
102
- },
103
107
  "devDependencies": {
104
108
  "@clack/core": "^1.0.0",
105
109
  "@clack/prompts": "^1.0.0",
106
- "@sindresorhus/is": "^7.2.0",
107
- "@types/debug": "^4.1.12",
108
- "@types/node": "25.2.3",
110
+ "@env-spec/parser": "workspace:*",
111
+ "@env-spec/utils": "workspace:*",
112
+ "@sindresorhus/is": "catalog:",
113
+ "@types/node": "catalog:",
109
114
  "@types/semver": "^7.7.1",
110
- "@types/which": "^3.0.4",
111
- "@yao-pkg/pkg": "^6.13.1",
112
- "ansis": "^4.2.0",
115
+ "@varlock/ci-env-info": "workspace:^",
116
+ "ansis": "catalog:",
113
117
  "browser-or-node": "^3.0.0",
114
118
  "ci-info": "^4.3.1",
115
119
  "exit-hook": "^5.1.0",
@@ -117,18 +121,9 @@
117
121
  "is-docker": "^4.0.0",
118
122
  "is-unicode-supported": "^2.1.0",
119
123
  "is-wsl": "^3.1.0",
120
- "outdent": "^0.8.0",
121
- "tsup": "^8.5.1",
122
- "vitest": "^4.0.18",
123
- "@env-spec/utils": "0.0.0"
124
- },
125
- "scripts": {
126
- "build": "tsup",
127
- "build:sea": "tsup --config tsup-sea.config.ts",
128
- "dev": "tsup",
129
- "test": "vitest",
130
- "test:ci": "vitest --run",
131
- "lint": "eslint .",
132
- "lint:fix": "pnpm run lint --fix"
124
+ "outdent": "catalog:",
125
+ "semver": "^7.7.4",
126
+ "tsup": "catalog:",
127
+ "vitest": "catalog:"
133
128
  }
134
- }
129
+ }
package/LICENSE DELETED
@@ -1,21 +0,0 @@
1
- MIT License
2
-
3
- Copyright (c) 2026 DMNO Inc.
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/cli/commands/load.command.ts"],"names":[],"mappings":"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","file":"chunk-3FLO3UFZ.js","sourcesContent":["import { define } from 'gunshi';\nimport _ from '@env-spec/utils/my-dash';\n\nimport { loadVarlockEnvGraph } from '../../lib/load-graph';\nimport { getItemSummary } from '../../lib/formatting';\nimport { checkForConfigErrors, checkForSchemaErrors } from '../helpers/error-checks';\nimport { type TypedGunshiCommandFn } from '../helpers/gunshi-type-utils';\nimport path from 'node:path';\nimport { FileBasedDataSource } from '../../env-graph';\n\nexport const commandSpec = define({\n name: 'load',\n description: 'Load env according to schema and resolve values',\n args: {\n format: {\n type: 'enum',\n short: 'f',\n choices: ['pretty', 'json', 'env', 'json-full', 'json-full-compact'],\n description: 'Format of output',\n default: 'pretty',\n },\n compact: {\n type: 'boolean',\n description: 'Use compact format (for json-full: no indentation, for env: skip undefined values)',\n },\n 'show-all': {\n type: 'boolean',\n description: 'When load is failing, show all items rather than only failing items',\n },\n env: {\n type: 'string',\n description: 'Set the environment (e.g., production, development, etc) - will be overridden by @currentEnv in the schema if present',\n },\n path: {\n type: 'string',\n short: 'p',\n description: 'Path to a specific .env file or directory (with trailing slash) to use as the entry point',\n },\n },\n examples: `\nLoads and validates environment variables according to your .env files, and prints the results.\nUseful for debugging locally, and in CI to print out a summary of env vars.\n\nExamples:\n varlock load # Load and validate with pretty output\n varlock load --format json # Output in JSON format\n varlock load --show-all # Show all items when validation fails\n varlock load --path .env.prod # Load from a specific .env file\n varlock looad --compact # Use compact format - skips undefined values, no indentation for json-full\n varlock load --env production # Load for a specific environment (⚠️ ignored if using @currentEnv!)\n`.trim(),\n});\n\n\nexport const commandFn: TypedGunshiCommandFn<typeof commandSpec> = async (ctx) => {\n const { format, compact, 'show-all': showAll } = ctx.values;\n\n const envGraph = await loadVarlockEnvGraph({\n currentEnvFallback: ctx.values.env,\n entryFilePath: ctx.values.path,\n });\n checkForSchemaErrors(envGraph);\n\n if (!envGraph.rootDataSource) throw new Error('expected root data source to be set');\n\n await envGraph.resolveEnvValues();\n\n // ideally we could be smarter about generating types without needing to resolve values\n // but for now the decorators are all resolved as part of the general resolution process\n const generateTypesDecs = envGraph.getRootDecFns('generateTypes');\n for (const generateTypesDec of generateTypesDecs) {\n const typeGenSettings = await generateTypesDec.resolve();\n\n // we skip generating types if `@generateTypes` was not in the main file\n // unless the `executeWhenImported` flag is set\n if (generateTypesDec.dataSource.isImport && !typeGenSettings.obj.executeWhenImported) continue;\n\n if (!typeGenSettings.obj.lang) throw new Error('@generateTypes - must set `lang` arg');\n if (typeGenSettings.obj.lang !== 'ts') throw new Error(`@generateTypes - unsupported language: ${typeGenSettings.obj.lang}`);\n if (!typeGenSettings.obj.path) throw new Error('@generateTypes - must set `path` arg');\n if (!_.isString(typeGenSettings.obj.path)) throw new Error('@generateTypes - `path` arg must be a string');\n\n const outputPath = generateTypesDec.dataSource instanceof FileBasedDataSource\n ? path.resolve(generateTypesDec.dataSource.fullPath, '..', typeGenSettings.obj.path)\n : typeGenSettings.obj.path;\n\n await envGraph.generateTypes(typeGenSettings.obj.lang, outputPath);\n }\n\n checkForConfigErrors(envGraph, { showAll });\n\n if (format === 'pretty') {\n for (const itemKey in envGraph.configSchema) {\n const item = envGraph.configSchema[itemKey];\n console.log(getItemSummary(item));\n }\n } else if (format === 'json') {\n console.log(JSON.stringify(envGraph.getResolvedEnvObject(), null, 2));\n } else if (format === 'json-full' || format === 'json-full-compact') {\n const indent = format === 'json-full-compact' || compact ? 0 : 2;\n console.log(JSON.stringify(envGraph.getSerializedGraph(), null, indent));\n } else if (format === 'env') {\n const resolvedEnv = envGraph.getResolvedEnvObject();\n const skipUndefined = compact === true;\n\n for (const key in resolvedEnv) {\n const value = resolvedEnv[key];\n\n if (value === undefined && skipUndefined) {\n continue;\n }\n\n let strValue: string;\n if (value === undefined) {\n strValue = '';\n } else if (typeof value === 'string') {\n strValue = `\"${value.replaceAll('\"', '\\\\\"').replaceAll('\\n', '\\\\n')}\"`;\n } else {\n strValue = JSON.stringify(value);\n }\n console.log(`${key}=${strValue}`);\n }\n } else {\n throw new Error(`Unknown format: ${format}`);\n }\n\n // const resolvedEnv = envGraph.getResolvedEnvObject();\n // console.log(resolvedEnv);\n};\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/cli/helpers/exit-error.ts","../src/cli/helpers/js-package-manager-utils.ts","../src/cli/helpers/pretty-format.ts"],"names":[],"mappings":";;;;;;;;AAIO,IAAM,YAAA,GAAN,cAA2B,KAAA,CAAM;AAAA,EACtC,WAAA,CACE,SACQ,IAAA,EAMR;AACA,IAAA,KAAA,CAAM,OAAO,CAAA;AAPL,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAQV;AAAA,EAfF;AAIwC,IAAA,MAAA,CAAA,IAAA,EAAA,cAAA,CAAA;AAAA;AAAA,EAatC,IAAI,SAAA,GAAY;AAAE,IAAA,OAAO,CAAC,CAAC,IAAA,CAAK,IAAA,EAAM,SAAA;AAAA,EAAW;AAAA,EAEjD,kBAAA,GAAqB;AACnB,IAAA,IAAI,GAAA,GAAM;AAAA,UAAA,EAAQ,aAAA,CAAM,GAAA,CAAI,IAAA,CAAK,OAAO,CAAC,CAAA;AAAA,CAAA;AAEzC,IAAA,IAAI,IAAA,CAAK,MAAM,OAAA,EAAS;AACtB,MAAA,GAAA,IAAO,eAAe,eAAA,CAAE,SAAA,CAAU,KAAK,IAAA,EAAM,OAAO,GAAG,IAAI,CAAA;AAAA,IAC7D;AAEA,IAAA,IAAI,IAAA,CAAK,MAAM,UAAA,EAAY;AACzB,MAAA,GAAA,IAAO,eAAe,eAAA,CAAE,SAAA,CAAU,KAAK,IAAA,EAAM,UAAU,GAAG,IAAI,CAAA;AAAA,IAChE;AAEA,IAAA,GAAA,IAAO,IAAA;AACP,IAAA,OAAO,GAAA;AAAA,EACT;AACF;ACzBA,IAAM,KAAA,GAAQ,MAAM,kCAAkC,CAAA;AAY/C,IAAM,mBAAA,GAAsE,OAAO,MAAA,CAAO;AAAA,EAC/F,GAAA,EAAK;AAAA,IACH,IAAA,EAAM,KAAA;AAAA,IACN,QAAA,EAAU,mBAAA;AAAA,IACV,GAAA,EAAK,aAAA;AAAA;AAAA,IACL,IAAA,EAAM,aAAA;AAAA,IACN,GAAA,EAAK;AAAA,GACP;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,MAAA;AAAA,IACN,QAAA,EAAU,gBAAA;AAAA,IACV,GAAA,EAAK,UAAA;AAAA,IACL,IAAA,EAAM,WAAA;AAAA,IACN,GAAA,EAAK;AAAA,GACP;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,MAAA;AAAA,IACN,QAAA,EAAU,WAAA;AAAA,IACV,GAAA,EAAK,UAAA;AAAA,IACL,IAAA,EAAM,cAAA;AAAA,IACN,GAAA,EAAK;AAAA,GACP;AAAA,EACA,GAAA,EAAK;AAAA,IACH,IAAA,EAAM,KAAA;AAAA,IACN,QAAA,EAAU,WAAA;AAAA,IACV,GAAA,EAAK,SAAA;AAAA,IACL,IAAA,EAAM,SAAA;AAAA,IACN,GAAA,EAAK;AAAA,GACP;AAAA,EACA,IAAA,EAAM;AAAA;AAAA,IACJ,IAAA,EAAM,MAAA;AAAA,IACN,QAAA,EAAU,WAAA;AAAA,IACV,GAAA,EAAK,UAAA;AAAA;AAAA,IAEL,IAAA,EAAM,UAAA;AAAA,IACN,GAAA,EAAK;AAAA;AAET,CAAC,CAAA;AAQM,SAAS,uBAAuB,IAAA,EAIpC;AACD,EAAA,KAAA,CAAM,8BAA8B,CAAA;AACpC,EAAA,IAAI,GAAA,GAAM,IAAA,EAAM,GAAA,IAAO,OAAA,CAAQ,GAAA,EAAI;AACnC,EAAA,IAAI,yBAAA;AACJ,EAAA,GAAG;AACD,IAAA,KAAA,CAAM,CAAA,WAAA,EAAc,GAAG,CAAA,CAAE,CAAA;AACzB,IAAA,IAAI,EAAA;AACJ,IAAA,IAAI,UAAA;AACJ,IAAA,KAAK,MAAM,mBAAA,EAAqB;AAC9B,MAAA,MAAM,eAAe,IAAA,CAAK,IAAA;AAAA,QACxB,GAAA;AAAA,QACA,mBAAA,CAAoB,EAAE,CAAA,CAAE;AAAA,OAC1B;AAEA,MAAA,IAAI,cAAA,CAAe,YAAY,CAAA,EAAG;AAGhC,QAAA,IAAI,UAAA,EAAY;AACd,UAAA,KAAA,CAAM,CAAA,4BAAA,EAA+B,mBAAA,CAAoB,EAAE,CAAA,CAAE,QAAQ,QAAQ,mBAAA,CAAoB,UAAU,CAAA,CAAE,QAAQ,CAAA,CAAE,CAAA;AACvH,UAAA,yBAAA,GAA4B,CAAC,YAAY,EAAE,CAAA;AAC3C,UAAA;AAAA,QACF;AACA,QAAA,KAAA,CAAM,CAAA,QAAA,EAAW,mBAAA,CAAoB,EAAE,CAAA,CAAE,QAAQ,CAAA,CAAE,CAAA;AACnD,QAAA,UAAA,GAAa,EAAA;AAAA,MACf;AAAA,IACF;AACA,IAAA,IAAI,UAAA,IAAc,CAAC,yBAAA,EAA2B,OAAO,oBAAoB,UAAU,CAAA;AACnF,IAAA,IAAI,yBAAA,EAA2B;AAG/B,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA;AAClC,IAAA,IAAI,cAAc,GAAA,EAAK;AACvB,IAAA,GAAA,GAAM,SAAA;AAEN,IAAA,IAAI,MAAM,iBAAA,EAAmB;AAC3B,MAAA,IAAI,IAAA,CAAK,sBAAsB,GAAA,EAAK;AAClC,QAAA,KAAA,CAAM,wBAAwB,CAAA;AAC9B,QAAA;AAAA,MACF;AAAA,IACF,CAAA,MAAO;AAEL,MAAA,IAAI,eAAe,IAAA,CAAK,IAAA,CAAK,GAAA,EAAK,MAAM,CAAC,CAAA,EAAG;AAC1C,QAAA,KAAA,CAAM,kBAAkB,CAAA;AACxB,QAAA;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAA,QAAS,GAAA;AAGT,EAAA,IAAI,OAAA,CAAQ,IAAI,qBAAA,EAAuB;AACrC,IAAA,MAAM,cAAc,OAAA,CAAQ,GAAA,CAAI,sBAAsB,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA;AAClE,IAAA,IAAI,OAAO,IAAA,CAAK,mBAAmB,CAAA,CAAE,QAAA,CAAS,WAAW,CAAA,EAAG;AAC1D,MAAA,KAAA,CAAM,CAAA,QAAA,EAAW,WAAW,CAAA,4BAAA,CAA8B,CAAA;AAC1D,MAAA,OAAO,oBAAoB,WAA+B,CAAA;AAAA,IAC5D;AAAA,EACF;AAKA,EAAA,IAAI,yBAAA,EAA2B;AAC7B,IAAA,KAAA,CAAM,CAAA,QAAA,EAAW,yBAAA,CAA0B,CAAC,CAAC,CAAA,iCAAA,CAAmC,CAAA;AAChF,IAAA,OAAO,mBAAA,CAAoB,yBAAA,CAA0B,CAAC,CAAC,CAAA;AAAA,EACzD;AAEA,EAAA,IAAI,MAAM,cAAA,EAAgB;AAExB,IAAA,MAAM,IAAI,aAAa,wDAAA,EAA0D;AAAA,MAC/E,UAAA,EAAY,oHAAA;AAAA,MACZ,SAAA,EAAW;AAAA,KACZ,CAAA;AAAA,EACH;AACF;AA5EgB,MAAA,CAAA,sBAAA,EAAA,wBAAA,CAAA;AAiFT,SAAS,oBAAoB,IAAA,EAKjC;AACD,EAAA,MAAM,eAAA,GAAkB,KAAK,IAAA,CAAK,IAAA,CAAK,eAAe,OAAA,CAAQ,GAAA,IAAO,cAAc,CAAA;AAGnF,EAAA,IAAI,CAAC,UAAA,CAAW,eAAe,CAAA,EAAG,OAAO,KAAA;AAEzC,EAAA,MAAM,cAAc,IAAA,CAAK,KAAA,CAAM,GAAG,YAAA,CAAa,eAAA,EAAiB,MAAM,CAAC,CAAA;AAEvE,EAAA,IAAI,WAAA,CAAY,YAAA,EAAc,OAAA,EAAS,OAAO,KAAA;AAG9C,EAAA,QAAA,CAAS;AAAA;AAAA,IAEP,IAAA,CAAK,WAAA,IAAe,CAAA,GAAA,EAAM,IAAA,CAAK,WAAW,CAAA,GAAA,CAAA;AAAA;AAAA,IAE1C,CAAA,EAAG,IAAA,CAAK,cAAc,CAAA,KAAA,EAAQ,KAAK,WAAW,CAAA,CAAA;AAAA;AAAA;AAAA,IAG9C,IAAA,CAAK,cAAA,KAAmB,MAAA,KAAW,IAAA,CAAK,iBAAiB,IAAA,GAAO,+BAAA;AAAA,IAChE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAC,CAAA;AAE3B,EAAA,OAAO,IAAA;AACT;AA3BgB,MAAA,CAAA,mBAAA,EAAA,qBAAA,CAAA;;;AC9IT,IAAM,GAAA,GAAM;AAAA,EACjB,2BAAW,MAAA,CAAA,CAAC,CAAA,KAAc,aAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,EAA9B,WAAA,CAAA;AAAA,EACX,QAAA,0BAAW,CAAA,KAAc,CAAA,UAAA,EAAM,cAAM,IAAA,CAAK,MAAA,CAAO,CAAC,CAAC,CAAA,CAAA,EAAzC,UAAA,CAAA;AAAA,EACV,QAAA,0BAAW,CAAA,KAAc,CAAA,EAAG,cAAM,IAAA,CAAK,MAAA,CAAO,CAAC,CAAC,CAAA,CAAA,EAAtC,UAAA,CAAA;AAAA,EACV,OAAA,kBAAS,MAAA,CAAA,CAAC,CAAA,EAAW,IAAA,KAA8D;AACjF,IAAA,IAAI,gBAAA;AACJ,IAAA,IAAI,IAAA,EAAM,qBAAqB,IAAA,EAAM;AACnC,MAAA,gBAAA,GAAmB,sBAAA,EAAuB;AAAA,IAC5C,CAAA,MAAA,IAAW,MAAM,gBAAA,EAAkB;AACjC,MAAA,gBAAA,GAAmB,IAAA,CAAK,gBAAA;AAAA,IAC1B;AACA,IAAA,IAAI,gBAAA,EAAkB;AACpB,MAAA,CAAA,GAAI,CAAA,EAAG,gBAAA,CAAiB,IAAI,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA;AAAA,IACnC;AACA,IAAA,OAAO,aAAA,CAAM,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA;AAAA,EAC7B,CAAA,EAXS,SAAA,CAAA;AAAA,EAYT,6BAAa,MAAA,CAAA,CAAC,CAAA,KAAc,cAAM,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,EAAnC,aAAA;AACf;AAEO,IAAM,QAAA,2BAAY,KAAA,KAA6C;AACpE,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AAExB,IAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,KAAS,EAAA,EAAI;AAC1B,IAAA,OAAA,CAAQ,IAAI,IAAI,CAAA;AAAA,EAClB;AACF,CAAA,EANwB,UAAA","file":"chunk-4N3YR2QQ.js","sourcesContent":["import ansis from 'ansis';\nimport _ from '@env-spec/utils/my-dash';\nimport { joinAndCompact } from '../../lib/formatting';\n\nexport class CliExitError extends Error {\n constructor(\n message: string,\n private more?: {\n details?: string | Array<string>,\n suggestion?: string | Array<string>,\n /** always triggers a full exit, even in watch mode - useful if problem is irrecoverable */\n forceExit?: boolean,\n },\n ) {\n super(message);\n }\n\n get forceExit() { return !!this.more?.forceExit; }\n\n getFormattedOutput() {\n let msg = `\\n💥 ${ansis.red(this.message)} 💥\\n`;\n\n if (this.more?.details) {\n msg += joinAndCompact(_.castArray(this.more?.details), '\\n');\n }\n\n if (this.more?.suggestion) {\n msg += joinAndCompact(_.castArray(this.more?.suggestion), '\\n');\n }\n\n msg += '\\n';\n return msg;\n }\n}\n","import path from 'node:path';\nimport fs, { existsSync } from 'node:fs';\nimport { pathExistsSync } from '@env-spec/utils/fs-utils';\nimport Debug from 'debug';\n\nimport { CliExitError } from './exit-error';\nimport { execSync } from 'node:child_process';\n\nconst debug = Debug('varlock:js-package-manager-utils');\n\nexport type JsPackageManager = 'npm' | 'pnpm' | 'yarn' | 'bun' | 'deno';\n\nexport type JsPackageManagerMeta = {\n name: JsPackageManager;\n lockfile: string;\n add: string;\n exec: string;\n dlx: string;\n};\n\nexport const JS_PACKAGE_MANAGERS: Record<JsPackageManager, JsPackageManagerMeta> = Object.freeze({\n npm: {\n name: 'npm',\n lockfile: 'package-lock.json',\n add: 'npm install', // add also works\n exec: 'npm exec --',\n dlx: 'npx',\n },\n pnpm: {\n name: 'pnpm',\n lockfile: 'pnpm-lock.yaml',\n add: 'pnpm add',\n exec: 'pnpm exec',\n dlx: 'pnpm dlx',\n },\n yarn: {\n name: 'yarn',\n lockfile: 'yarn.lock',\n add: 'yarn add',\n exec: 'yarn exec --',\n dlx: 'yarn dlx',\n },\n bun: {\n name: 'bun',\n lockfile: 'bun.lockb',\n add: 'bun add',\n exec: 'bun run',\n dlx: 'bunx',\n },\n deno: { //! deno not fully supported yet\n name: 'deno',\n lockfile: 'deno.lock',\n add: 'deno add',\n // TODO: don't think these are quite right...\n exec: 'deno run',\n dlx: 'deno run',\n },\n});\n\n/**\n * detect js package manager\n *\n * currently go up the folder tree looking for lockfiles (ex: package-lock.json, pnpm-lock.yaml)\n * if nothing found, we'll look at process.env.npm_config_user_agent\n * */\nexport function detectJsPackageManager(opts?: {\n cwd?: string,\n workspaceRootPath?: string,\n exitIfNotFound?: boolean,\n}) {\n debug('Detecting js package manager');\n let cwd = opts?.cwd || process.cwd();\n let multipleLockfilesDetected: Array<JsPackageManager> | undefined;\n do {\n debug(`> scanning ${cwd}`);\n let pm: JsPackageManager;\n let detectedPm: JsPackageManager | undefined;\n for (pm in JS_PACKAGE_MANAGERS) {\n const lockFilePath = path.join(\n cwd,\n JS_PACKAGE_MANAGERS[pm].lockfile,\n );\n\n if (pathExistsSync(lockFilePath)) {\n // if we find 2 lockfiles at the same level, store them and continue\n // this can happen in monorepos or when switching package managers\n if (detectedPm) {\n debug(`> found multiple lockfiles: ${JS_PACKAGE_MANAGERS[pm].lockfile} and ${JS_PACKAGE_MANAGERS[detectedPm].lockfile}`);\n multipleLockfilesDetected = [detectedPm, pm];\n break;\n }\n debug(`> found ${JS_PACKAGE_MANAGERS[pm].lockfile}`);\n detectedPm = pm;\n }\n }\n if (detectedPm && !multipleLockfilesDetected) return JS_PACKAGE_MANAGERS[detectedPm];\n if (multipleLockfilesDetected) break;\n\n // will break when we reach the root\n const parentDir = path.dirname(cwd);\n if (parentDir === cwd) break;\n cwd = parentDir;\n\n if (opts?.workspaceRootPath) {\n if (opts.workspaceRootPath === cwd) {\n debug('> found workspace root');\n break;\n }\n } else {\n // if we don't have a workspace root path, we'll break if we hit the git repo root\n if (pathExistsSync(path.join(cwd, '.git'))) {\n debug('> found git root');\n break;\n }\n }\n } while (cwd);\n\n // if we did not find a lockfile, we'll look at env vars for other hints\n if (process.env.npm_config_user_agent) {\n const pmFromAgent = process.env.npm_config_user_agent.split('/')[0];\n if (Object.keys(JS_PACKAGE_MANAGERS).includes(pmFromAgent)) {\n debug(`> found ${pmFromAgent} using npm_config_user_agent`);\n return JS_PACKAGE_MANAGERS[pmFromAgent as JsPackageManager];\n }\n }\n\n // if we found multiple lockfiles and env var detection failed, return the first detected one\n // we choose the first one because the order is deterministic (based on the order in JS_PACKAGE_MANAGERS)\n // and this provides a reasonable fallback when we can't determine the active package manager\n if (multipleLockfilesDetected) {\n debug(`> using ${multipleLockfilesDetected[0]} from multiple detected lockfiles`);\n return JS_PACKAGE_MANAGERS[multipleLockfilesDetected[0]];\n }\n\n if (opts?.exitIfNotFound) {\n // show some hopefully useful error messaging if we hit the root folder without finding anything\n throw new CliExitError('Unable to find detect your JavaScript package manager!', {\n suggestion: 'We look for lock files (ex: package-lock.json) so you may just need to run a dependency install (ie `npm install`)',\n forceExit: true,\n });\n }\n}\n\n\n\n\nexport function installJsDependency(opts: {\n packageName: string,\n packageManager: JsPackageManager,\n packagePath?: string,\n isMonoRepoRoot?: boolean,\n}) {\n const packageJsonPath = path.join(opts.packagePath || process.cwd(), 'package.json');\n\n // for now, we'll just bail if we dont see a package.json\n if (!existsSync(packageJsonPath)) return false;\n\n const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));\n // bail if already installed\n if (packageJson.dependencies?.varlock) return false;\n\n // TODO: might want to check first if it's already installed?\n execSync([\n // move to the correct directory if needed\n opts.packagePath && `cd ${opts.packagePath} &&`,\n // `add` works in all of them\n `${opts.packageManager} add ${opts.packageName}`,\n // tells pnpm to either install in the workspace root explicitly\n // or to not check if we are the in the root\n opts.packageManager === 'pnpm' && (opts.isMonoRepoRoot ? '-w' : '--ignore-workspace-root-check'),\n ].filter(Boolean).join(' '));\n\n return true;\n}\n\n","import ansis from 'ansis';\nimport { detectJsPackageManager, JsPackageManagerMeta } from './js-package-manager-utils';\n\n\nexport const fmt = {\n decorator: (s: string) => ansis.magenta(s),\n filePath: (s: string) => `📂 ${ansis.cyan.italic(s)}`,\n fileName: (s: string) => `${ansis.cyan.italic(s)}`,\n command: (s: string, opts?: { jsPackageManager?: JsPackageManagerMeta | true }) => {\n let jsPackageManager: JsPackageManagerMeta | undefined;\n if (opts?.jsPackageManager === true) {\n jsPackageManager = detectJsPackageManager();\n } else if (opts?.jsPackageManager) {\n jsPackageManager = opts.jsPackageManager;\n }\n if (jsPackageManager) {\n s = `${jsPackageManager.exec} ${s}`;\n }\n return ansis.green.italic(s);\n },\n packageName: (s: string) => ansis.green.italic(s),\n};\n\nexport const logLines = (lines: Array<string | false | undefined>) => {\n for (const line of lines) {\n // skip false, null, undefined, but not empty strings\n if (!line && line !== '') continue;\n console.log(line);\n }\n};\n"]}