@calvear/env 3.0.1 → 3.1.1

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.
package/arguments.js CHANGED
@@ -79,7 +79,7 @@ var n = {
79
79
  logMaskValuesOfKeys: {
80
80
  alias: "mvk",
81
81
  default: [],
82
- describe: "Mask the values of these keys in logs",
82
+ describe: "Mask a value when its key matches (exact or /regex/)",
83
83
  group: n.LOG_WORKSPACE,
84
84
  type: "array"
85
85
  },
package/arguments.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"arguments.js","names":[],"sources":["../src/arguments.ts"],"sourcesContent":["import type { JSONSchemaType } from 'ajv';\r\nimport ci from 'ci-info';\r\nimport type { Arguments, Options } from 'yargs';\r\nimport type { EnvProviderConfig } from './interfaces/index.js';\r\nimport { IntegratedProviderConfig } from './providers/index.js';\r\n\r\nconst GROUPS = {\r\n\tCORE: 'Core Options',\r\n\tGROUP_WORKSPACE: 'Workspace Options',\r\n\tJSON_SCHEMA_WORKSPACE: 'JSON Schema Options',\r\n\tLOG_WORKSPACE: 'Logger Options',\r\n};\r\n\r\nexport interface CommandArguments extends Arguments {\r\n\tarrayDescomposition: boolean;\r\n\tci: boolean;\r\n\tconfigFile: string;\r\n\tdetectFormat: boolean;\r\n\tenv: string;\r\n\texpand: boolean;\r\n\tnestingDelimiter: string;\r\n\tnullable: boolean;\r\n\tpackageJson: string;\r\n\tprojectInfo: Record<string, string>;\r\n\tproviders: EnvProviderConfig[];\r\n\tresolve: 'merge' | 'override';\r\n\troot: string;\r\n\tschemaFile: string;\r\n\texportIgnoreKeys?: string[];\r\n\tlogLevel?: 'debug' | 'error' | 'info' | 'silly' | 'trace' | 'warn';\r\n\tlogMaskAnyRegEx?: string[];\r\n\tlogMaskValuesOfKeys?: string[];\r\n\tmodes?: string[];\r\n\tschema?: Record<string, JSONSchemaType<object>>;\r\n}\r\n\r\n// common CLI arguments\r\nexport const args: Record<keyof CommandArguments, Options> = {\r\n\tarrayDescomposition: {\r\n\t\talias: 'arrDesc',\r\n\t\tdefault: false,\r\n\t\tdescribe: 'Whether serialize or break down arrays',\r\n\t\tgroup: GROUPS.CORE,\r\n\t\ttype: 'boolean',\r\n\t},\r\n\tci: {\r\n\t\tdefault: ci.isCI,\r\n\t\tgroup: GROUPS.CORE,\r\n\t\ttype: 'boolean',\r\n\t\tdescribe:\r\n\t\t\t'Run providers in continuous-integration mode (skips local files)',\r\n\t},\r\n\tconfigFile: {\r\n\t\talias: 'c',\r\n\t\tdefault: '[[root]]/settings/settings.json',\r\n\t\tdescribe: 'Config JSON file path',\r\n\t\tgroup: GROUPS.GROUP_WORKSPACE,\r\n\t\ttype: 'string',\r\n\t},\r\n\tdetectFormat: {\r\n\t\talias: 'df',\r\n\t\tdefault: false,\r\n\t\tdescribe: 'Whether format of strings variables are included in schema',\r\n\t\tgroup: GROUPS.JSON_SCHEMA_WORKSPACE,\r\n\t\ttype: 'boolean',\r\n\t},\r\n\tenv: {\r\n\t\talias: 'e',\r\n\t\tdescribe: 'Environment to load, i.e. dev, prod',\r\n\t\tgroup: GROUPS.CORE,\r\n\t\ttype: 'string',\r\n\t},\r\n\texpand: {\r\n\t\talias: 'x',\r\n\t\tdefault: false,\r\n\t\tdescribe: 'Interpolate environment variables using themselves',\r\n\t\tgroup: GROUPS.CORE,\r\n\t\ttype: 'boolean',\r\n\t},\r\n\texportIgnoreKeys: {\r\n\t\talias: 'iek',\r\n\t\tdefault: [],\r\n\t\tgroup: GROUPS.JSON_SCHEMA_WORKSPACE,\r\n\t\thidden: true,\r\n\t\ttype: 'array',\r\n\t},\r\n\tlogLevel: {\r\n\t\talias: 'log',\r\n\t\tchoices: ['silly', 'trace', 'debug', 'info', 'warn', 'error'],\r\n\t\tdefault: 'info',\r\n\t\tdescribe: 'Log verbosity level',\r\n\t\tgroup: GROUPS.LOG_WORKSPACE,\r\n\t\ttype: 'string',\r\n\t},\r\n\tlogMaskAnyRegEx: {\r\n\t\talias: 'mrx',\r\n\t\tdefault: [],\r\n\t\tdescribe: 'Mask log values matching these regular expressions',\r\n\t\tgroup: GROUPS.LOG_WORKSPACE,\r\n\t\ttype: 'array',\r\n\t},\r\n\tlogMaskValuesOfKeys: {\r\n\t\talias: 'mvk',\r\n\t\tdefault: [],\r\n\t\tdescribe: 'Mask the values of these keys in logs',\r\n\t\tgroup: GROUPS.LOG_WORKSPACE,\r\n\t\ttype: 'array',\r\n\t},\r\n\tmodes: {\r\n\t\talias: 'm',\r\n\t\tdescribe: 'Execution modes, i.e. debug, test',\r\n\t\tgroup: GROUPS.CORE,\r\n\t\ttype: 'array',\r\n\t},\r\n\tnestingDelimiter: {\r\n\t\talias: 'nd',\r\n\t\tdefault: '__',\r\n\t\tgroup: GROUPS.CORE,\r\n\t\ttype: 'string',\r\n\t\tdescribe:\r\n\t\t\t'Nesting level delimiter for flatten, i.e. { l1: { l2: \"value\" } } turns into { l1__l2: \"value\" }',\r\n\t},\r\n\tnullable: {\r\n\t\talias: 'null',\r\n\t\tdefault: true,\r\n\t\tdescribe: 'Whether variables are nullable',\r\n\t\tgroup: GROUPS.JSON_SCHEMA_WORKSPACE,\r\n\t\ttype: 'boolean',\r\n\t},\r\n\tpackageJson: {\r\n\t\talias: ['pkg'],\r\n\t\tdefault: '',\r\n\t\tdescribe: 'package.json path',\r\n\t\tgroup: GROUPS.GROUP_WORKSPACE,\r\n\t\ttype: 'string',\r\n\t},\r\n\tproviders: {\r\n\t\tdefault: IntegratedProviderConfig,\r\n\t\tdescribe: 'Providers handling variables loading',\r\n\t\thidden: true,\r\n\t\ttype: 'array',\r\n\t},\r\n\tresolve: {\r\n\t\talias: 'r',\r\n\t\tchoices: ['merge', 'override'],\r\n\t\tdefault: 'merge',\r\n\t\tdescribe: 'Whether merges new schema or override',\r\n\t\tgroup: GROUPS.JSON_SCHEMA_WORKSPACE,\r\n\t\ttype: 'string',\r\n\t},\r\n\troot: {\r\n\t\tdefault: 'env',\r\n\t\tdescribe: 'Default environment folder path',\r\n\t\tgroup: GROUPS.GROUP_WORKSPACE,\r\n\t\ttype: 'string',\r\n\t},\r\n\tschemaFile: {\r\n\t\talias: ['s', 'schema'],\r\n\t\tdefault: '[[root]]/settings/schema.json',\r\n\t\tdescribe: 'Environment Schema JSON file path',\r\n\t\tgroup: GROUPS.GROUP_WORKSPACE,\r\n\t\ttype: 'string',\r\n\t},\r\n};\r\n"],"mappings":";;;AAMA,IAAM,IAAS;CACd,MAAM;CACN,iBAAiB;CACjB,uBAAuB;CACvB,eAAe;AAChB,GA0Ba,IAAgD;CAC5D,qBAAqB;EACpB,OAAO;EACP,SAAS;EACT,UAAU;EACV,OAAO,EAAO;EACd,MAAM;CACP;CACA,IAAI;EACH,SAAS,EAAG;EACZ,OAAO,EAAO;EACd,MAAM;EACN,UACC;CACF;CACA,YAAY;EACX,OAAO;EACP,SAAS;EACT,UAAU;EACV,OAAO,EAAO;EACd,MAAM;CACP;CACA,cAAc;EACb,OAAO;EACP,SAAS;EACT,UAAU;EACV,OAAO,EAAO;EACd,MAAM;CACP;CACA,KAAK;EACJ,OAAO;EACP,UAAU;EACV,OAAO,EAAO;EACd,MAAM;CACP;CACA,QAAQ;EACP,OAAO;EACP,SAAS;EACT,UAAU;EACV,OAAO,EAAO;EACd,MAAM;CACP;CACA,kBAAkB;EACjB,OAAO;EACP,SAAS,CAAC;EACV,OAAO,EAAO;EACd,QAAQ;EACR,MAAM;CACP;CACA,UAAU;EACT,OAAO;EACP,SAAS;GAAC;GAAS;GAAS;GAAS;GAAQ;GAAQ;EAAO;EAC5D,SAAS;EACT,UAAU;EACV,OAAO,EAAO;EACd,MAAM;CACP;CACA,iBAAiB;EAChB,OAAO;EACP,SAAS,CAAC;EACV,UAAU;EACV,OAAO,EAAO;EACd,MAAM;CACP;CACA,qBAAqB;EACpB,OAAO;EACP,SAAS,CAAC;EACV,UAAU;EACV,OAAO,EAAO;EACd,MAAM;CACP;CACA,OAAO;EACN,OAAO;EACP,UAAU;EACV,OAAO,EAAO;EACd,MAAM;CACP;CACA,kBAAkB;EACjB,OAAO;EACP,SAAS;EACT,OAAO,EAAO;EACd,MAAM;EACN,UACC;CACF;CACA,UAAU;EACT,OAAO;EACP,SAAS;EACT,UAAU;EACV,OAAO,EAAO;EACd,MAAM;CACP;CACA,aAAa;EACZ,OAAO,CAAC,KAAK;EACb,SAAS;EACT,UAAU;EACV,OAAO,EAAO;EACd,MAAM;CACP;CACA,WAAW;EACV,SAAS;EACT,UAAU;EACV,QAAQ;EACR,MAAM;CACP;CACA,SAAS;EACR,OAAO;EACP,SAAS,CAAC,SAAS,UAAU;EAC7B,SAAS;EACT,UAAU;EACV,OAAO,EAAO;EACd,MAAM;CACP;CACA,MAAM;EACL,SAAS;EACT,UAAU;EACV,OAAO,EAAO;EACd,MAAM;CACP;CACA,YAAY;EACX,OAAO,CAAC,KAAK,QAAQ;EACrB,SAAS;EACT,UAAU;EACV,OAAO,EAAO;EACd,MAAM;CACP;AACD"}
1
+ {"version":3,"file":"arguments.js","names":[],"sources":["../src/arguments.ts"],"sourcesContent":["import type { JSONSchemaType } from 'ajv';\r\nimport ci from 'ci-info';\r\nimport type { Arguments, Options } from 'yargs';\r\nimport type { EnvProviderConfig } from './interfaces/index.js';\r\nimport { IntegratedProviderConfig } from './providers/index.js';\r\n\r\nconst GROUPS = {\r\n\tCORE: 'Core Options',\r\n\tGROUP_WORKSPACE: 'Workspace Options',\r\n\tJSON_SCHEMA_WORKSPACE: 'JSON Schema Options',\r\n\tLOG_WORKSPACE: 'Logger Options',\r\n};\r\n\r\nexport interface CommandArguments extends Arguments {\r\n\tarrayDescomposition: boolean;\r\n\tci: boolean;\r\n\tconfigFile: string;\r\n\tdetectFormat: boolean;\r\n\tenv: string;\r\n\texpand: boolean;\r\n\tnestingDelimiter: string;\r\n\tnullable: boolean;\r\n\tpackageJson: string;\r\n\tprojectInfo: Record<string, string>;\r\n\tproviders: EnvProviderConfig[];\r\n\tresolve: 'merge' | 'override';\r\n\troot: string;\r\n\tschemaFile: string;\r\n\texportIgnoreKeys?: string[];\r\n\tlogLevel?: 'debug' | 'error' | 'info' | 'silly' | 'trace' | 'warn';\r\n\tlogMaskAnyRegEx?: string[];\r\n\tlogMaskValuesOfKeys?: string[];\r\n\tmodes?: string[];\r\n\tschema?: Record<string, JSONSchemaType<object>>;\r\n}\r\n\r\n// common CLI arguments\r\nexport const args: Record<keyof CommandArguments, Options> = {\r\n\tarrayDescomposition: {\r\n\t\talias: 'arrDesc',\r\n\t\tdefault: false,\r\n\t\tdescribe: 'Whether serialize or break down arrays',\r\n\t\tgroup: GROUPS.CORE,\r\n\t\ttype: 'boolean',\r\n\t},\r\n\tci: {\r\n\t\tdefault: ci.isCI,\r\n\t\tgroup: GROUPS.CORE,\r\n\t\ttype: 'boolean',\r\n\t\tdescribe:\r\n\t\t\t'Run providers in continuous-integration mode (skips local files)',\r\n\t},\r\n\tconfigFile: {\r\n\t\talias: 'c',\r\n\t\tdefault: '[[root]]/settings/settings.json',\r\n\t\tdescribe: 'Config JSON file path',\r\n\t\tgroup: GROUPS.GROUP_WORKSPACE,\r\n\t\ttype: 'string',\r\n\t},\r\n\tdetectFormat: {\r\n\t\talias: 'df',\r\n\t\tdefault: false,\r\n\t\tdescribe: 'Whether format of strings variables are included in schema',\r\n\t\tgroup: GROUPS.JSON_SCHEMA_WORKSPACE,\r\n\t\ttype: 'boolean',\r\n\t},\r\n\tenv: {\r\n\t\talias: 'e',\r\n\t\tdescribe: 'Environment to load, i.e. dev, prod',\r\n\t\tgroup: GROUPS.CORE,\r\n\t\ttype: 'string',\r\n\t},\r\n\texpand: {\r\n\t\talias: 'x',\r\n\t\tdefault: false,\r\n\t\tdescribe: 'Interpolate environment variables using themselves',\r\n\t\tgroup: GROUPS.CORE,\r\n\t\ttype: 'boolean',\r\n\t},\r\n\texportIgnoreKeys: {\r\n\t\talias: 'iek',\r\n\t\tdefault: [],\r\n\t\tgroup: GROUPS.JSON_SCHEMA_WORKSPACE,\r\n\t\thidden: true,\r\n\t\ttype: 'array',\r\n\t},\r\n\tlogLevel: {\r\n\t\talias: 'log',\r\n\t\tchoices: ['silly', 'trace', 'debug', 'info', 'warn', 'error'],\r\n\t\tdefault: 'info',\r\n\t\tdescribe: 'Log verbosity level',\r\n\t\tgroup: GROUPS.LOG_WORKSPACE,\r\n\t\ttype: 'string',\r\n\t},\r\n\tlogMaskAnyRegEx: {\r\n\t\talias: 'mrx',\r\n\t\tdefault: [],\r\n\t\tdescribe: 'Mask log values matching these regular expressions',\r\n\t\tgroup: GROUPS.LOG_WORKSPACE,\r\n\t\ttype: 'array',\r\n\t},\r\n\tlogMaskValuesOfKeys: {\r\n\t\talias: 'mvk',\r\n\t\tdefault: [],\r\n\t\tdescribe: 'Mask a value when its key matches (exact or /regex/)',\r\n\t\tgroup: GROUPS.LOG_WORKSPACE,\r\n\t\ttype: 'array',\r\n\t},\r\n\tmodes: {\r\n\t\talias: 'm',\r\n\t\tdescribe: 'Execution modes, i.e. debug, test',\r\n\t\tgroup: GROUPS.CORE,\r\n\t\ttype: 'array',\r\n\t},\r\n\tnestingDelimiter: {\r\n\t\talias: 'nd',\r\n\t\tdefault: '__',\r\n\t\tgroup: GROUPS.CORE,\r\n\t\ttype: 'string',\r\n\t\tdescribe:\r\n\t\t\t'Nesting level delimiter for flatten, i.e. { l1: { l2: \"value\" } } turns into { l1__l2: \"value\" }',\r\n\t},\r\n\tnullable: {\r\n\t\talias: 'null',\r\n\t\tdefault: true,\r\n\t\tdescribe: 'Whether variables are nullable',\r\n\t\tgroup: GROUPS.JSON_SCHEMA_WORKSPACE,\r\n\t\ttype: 'boolean',\r\n\t},\r\n\tpackageJson: {\r\n\t\talias: ['pkg'],\r\n\t\tdefault: '',\r\n\t\tdescribe: 'package.json path',\r\n\t\tgroup: GROUPS.GROUP_WORKSPACE,\r\n\t\ttype: 'string',\r\n\t},\r\n\tproviders: {\r\n\t\tdefault: IntegratedProviderConfig,\r\n\t\tdescribe: 'Providers handling variables loading',\r\n\t\thidden: true,\r\n\t\ttype: 'array',\r\n\t},\r\n\tresolve: {\r\n\t\talias: 'r',\r\n\t\tchoices: ['merge', 'override'],\r\n\t\tdefault: 'merge',\r\n\t\tdescribe: 'Whether merges new schema or override',\r\n\t\tgroup: GROUPS.JSON_SCHEMA_WORKSPACE,\r\n\t\ttype: 'string',\r\n\t},\r\n\troot: {\r\n\t\tdefault: 'env',\r\n\t\tdescribe: 'Default environment folder path',\r\n\t\tgroup: GROUPS.GROUP_WORKSPACE,\r\n\t\ttype: 'string',\r\n\t},\r\n\tschemaFile: {\r\n\t\talias: ['s', 'schema'],\r\n\t\tdefault: '[[root]]/settings/schema.json',\r\n\t\tdescribe: 'Environment Schema JSON file path',\r\n\t\tgroup: GROUPS.GROUP_WORKSPACE,\r\n\t\ttype: 'string',\r\n\t},\r\n};\r\n"],"mappings":";;;AAMA,IAAM,IAAS;CACd,MAAM;CACN,iBAAiB;CACjB,uBAAuB;CACvB,eAAe;AAChB,GA0Ba,IAAgD;CAC5D,qBAAqB;EACpB,OAAO;EACP,SAAS;EACT,UAAU;EACV,OAAO,EAAO;EACd,MAAM;CACP;CACA,IAAI;EACH,SAAS,EAAG;EACZ,OAAO,EAAO;EACd,MAAM;EACN,UACC;CACF;CACA,YAAY;EACX,OAAO;EACP,SAAS;EACT,UAAU;EACV,OAAO,EAAO;EACd,MAAM;CACP;CACA,cAAc;EACb,OAAO;EACP,SAAS;EACT,UAAU;EACV,OAAO,EAAO;EACd,MAAM;CACP;CACA,KAAK;EACJ,OAAO;EACP,UAAU;EACV,OAAO,EAAO;EACd,MAAM;CACP;CACA,QAAQ;EACP,OAAO;EACP,SAAS;EACT,UAAU;EACV,OAAO,EAAO;EACd,MAAM;CACP;CACA,kBAAkB;EACjB,OAAO;EACP,SAAS,CAAC;EACV,OAAO,EAAO;EACd,QAAQ;EACR,MAAM;CACP;CACA,UAAU;EACT,OAAO;EACP,SAAS;GAAC;GAAS;GAAS;GAAS;GAAQ;GAAQ;EAAO;EAC5D,SAAS;EACT,UAAU;EACV,OAAO,EAAO;EACd,MAAM;CACP;CACA,iBAAiB;EAChB,OAAO;EACP,SAAS,CAAC;EACV,UAAU;EACV,OAAO,EAAO;EACd,MAAM;CACP;CACA,qBAAqB;EACpB,OAAO;EACP,SAAS,CAAC;EACV,UAAU;EACV,OAAO,EAAO;EACd,MAAM;CACP;CACA,OAAO;EACN,OAAO;EACP,UAAU;EACV,OAAO,EAAO;EACd,MAAM;CACP;CACA,kBAAkB;EACjB,OAAO;EACP,SAAS;EACT,OAAO,EAAO;EACd,MAAM;EACN,UACC;CACF;CACA,UAAU;EACT,OAAO;EACP,SAAS;EACT,UAAU;EACV,OAAO,EAAO;EACd,MAAM;CACP;CACA,aAAa;EACZ,OAAO,CAAC,KAAK;EACb,SAAS;EACT,UAAU;EACV,OAAO,EAAO;EACd,MAAM;CACP;CACA,WAAW;EACV,SAAS;EACT,UAAU;EACV,QAAQ;EACR,MAAM;CACP;CACA,SAAS;EACR,OAAO;EACP,SAAS,CAAC,SAAS,UAAU;EAC7B,SAAS;EACT,UAAU;EACV,OAAO,EAAO;EACd,MAAM;CACP;CACA,MAAM;EACL,SAAS;EACT,UAAU;EACV,OAAO,EAAO;EACd,MAAM;CACP;CACA,YAAY;EACX,OAAO,CAAC,KAAK,QAAQ;EACrB,SAAS;EACT,UAAU;EACV,OAAO,EAAO;EACd,MAAM;CACP;AACD"}
package/assets/logo.svg CHANGED
@@ -1,30 +1,30 @@
1
- <svg width="256" height="256" viewBox="0 0 256 256" fill="none" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="env">
2
- <defs>
3
- <linearGradient id="card" x1="32" y1="24" x2="224" y2="232" gradientUnits="userSpaceOnUse">
4
- <stop stop-color="#101A2E"/>
5
- <stop offset="1" stop-color="#0A1120"/>
6
- </linearGradient>
7
- <linearGradient id="accent" x1="72" y1="104" x2="184" y2="168" gradientUnits="userSpaceOnUse">
8
- <stop stop-color="#34D399"/>
9
- <stop offset="1" stop-color="#22D3EE"/>
10
- </linearGradient>
11
- </defs>
12
-
13
- <!-- terminal card -->
14
- <rect x="20" y="20" width="216" height="216" rx="46" fill="url(#card)"/>
15
- <rect x="21" y="21" width="214" height="214" rx="45" fill="none" stroke="#22D3EE" stroke-opacity="0.18" stroke-width="2"/>
16
-
17
- <!-- title bar dots -->
18
- <circle cx="58" cy="62" r="7" fill="#F87171"/>
19
- <circle cx="82" cy="62" r="7" fill="#FBBF24"/>
20
- <circle cx="106" cy="62" r="7" fill="#34D399"/>
21
-
22
- <!-- separator -->
23
- <line x1="40" y1="86" x2="216" y2="86" stroke="#22D3EE" stroke-opacity="0.12" stroke-width="2"/>
24
-
25
- <!-- [ > _ ] : env brackets + CLI prompt -->
26
- <path d="M104 108 H82 V184 H104" stroke="url(#accent)" stroke-width="14" stroke-linecap="round" stroke-linejoin="round" fill="none"/>
27
- <path d="M152 108 H174 V184 H152" stroke="url(#accent)" stroke-width="14" stroke-linecap="round" stroke-linejoin="round" fill="none"/>
28
- <path d="M110 128 L132 146 L110 164" stroke="#E2F7F2" stroke-width="13" stroke-linecap="round" stroke-linejoin="round" fill="none"/>
29
- <rect x="128" y="158" width="22" height="11" rx="3" fill="#34D399"/>
30
- </svg>
1
+ <svg width="256" height="256" viewBox="0 0 256 256" fill="none" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="env">
2
+ <defs>
3
+ <linearGradient id="card" x1="32" y1="24" x2="224" y2="232" gradientUnits="userSpaceOnUse">
4
+ <stop stop-color="#101A2E"/>
5
+ <stop offset="1" stop-color="#0A1120"/>
6
+ </linearGradient>
7
+ <linearGradient id="accent" x1="72" y1="104" x2="184" y2="168" gradientUnits="userSpaceOnUse">
8
+ <stop stop-color="#34D399"/>
9
+ <stop offset="1" stop-color="#22D3EE"/>
10
+ </linearGradient>
11
+ </defs>
12
+
13
+ <!-- terminal card -->
14
+ <rect x="20" y="20" width="216" height="216" rx="46" fill="url(#card)"/>
15
+ <rect x="21" y="21" width="214" height="214" rx="45" fill="none" stroke="#22D3EE" stroke-opacity="0.18" stroke-width="2"/>
16
+
17
+ <!-- title bar dots -->
18
+ <circle cx="58" cy="62" r="7" fill="#F87171"/>
19
+ <circle cx="82" cy="62" r="7" fill="#FBBF24"/>
20
+ <circle cx="106" cy="62" r="7" fill="#34D399"/>
21
+
22
+ <!-- separator -->
23
+ <line x1="40" y1="86" x2="216" y2="86" stroke="#22D3EE" stroke-opacity="0.12" stroke-width="2"/>
24
+
25
+ <!-- [ > _ ] : env brackets + CLI prompt -->
26
+ <path d="M104 108 H82 V184 H104" stroke="url(#accent)" stroke-width="14" stroke-linecap="round" stroke-linejoin="round" fill="none"/>
27
+ <path d="M152 108 H174 V184 H152" stroke="url(#accent)" stroke-width="14" stroke-linecap="round" stroke-linejoin="round" fill="none"/>
28
+ <path d="M110 128 L132 146 L110 164" stroke="#E2F7F2" stroke-width="13" stroke-linecap="round" stroke-linejoin="round" fill="none"/>
29
+ <rect x="128" y="158" width="22" height="11" rx="3" fill="#34D399"/>
30
+ </svg>
@@ -1 +1 @@
1
- {"version":3,"file":"env.command.js","names":[],"sources":["../../src/commands/env.command.ts"],"sourcesContent":["import merge from 'merge-deep';\r\nimport { spawn } from 'node:child_process';\r\nimport type { CommandModule } from 'yargs';\r\nimport type { CommandArguments } from '../arguments.js';\r\nimport {\r\n\tcreateValidator,\r\n\tflatResults,\r\n\tflatSchema,\r\n\tflatten,\r\n\tinterpolate,\r\n\tloadVariablesFromProviders,\r\n\tlogger,\r\n\tnormalize,\r\n\tui,\r\n} from '../utils/index.js';\r\n\r\nexport interface EnvCommandArguments extends CommandArguments {\r\n\t// whether validate schema before injecting variables\r\n\tschemaValidate: boolean;\r\n\t// command for execute after inject environment variables.\r\n\t// Should be prefixed or surrounded by ':' character.\r\n\tsubcmd: string[];\r\n}\r\n\r\n/**\r\n * Main command.\r\n * Injects environment variables into process.env.\r\n *\r\n * @example [>_]: env -e dev -m debug : npm start\r\n */\r\nexport const envCommand: CommandModule<any, EnvCommandArguments> = {\r\n\tcommand: '$0 [options..] [: <subcmd> :]',\r\n\tdescribe: 'Inject environment variables into a process and run a command',\r\n\tbuilder: (builder) => {\r\n\t\tbuilder\r\n\t\t\t.options({\r\n\t\t\t\tschemaValidate: {\r\n\t\t\t\t\talias: 'validate',\r\n\t\t\t\t\tdefault: true,\r\n\t\t\t\t\tdescribe: 'Whether validates variables using JSON schema',\r\n\t\t\t\t\ttype: 'boolean',\r\n\t\t\t\t},\r\n\t\t\t\tsubcmd: {\r\n\t\t\t\t\tdescribe: 'Command for inject environment variables',\r\n\t\t\t\t\ttype: 'array',\r\n\t\t\t\t},\r\n\t\t\t})\r\n\t\t\t.example(\r\n\t\t\t\t'env -e dev -m test unit : npm test',\r\n\t\t\t\t'Loads \"dev\" environment variables, in \"test\" and \"unit\" modes, for \"npm start\" command',\r\n\t\t\t)\r\n\t\t\t.example(\r\n\t\t\t\t'env -e dev -m debug : npm start : -c my-config.json',\r\n\t\t\t\t'Loads \"dev\" environment variables, in \"debug\" mode, for \"npm test\" command and custom config file',\r\n\t\t\t)\r\n\t\t\t.example(\r\n\t\t\t\t'env -e dev -m debug -c [[root]]/[[env]].env.json : npm start',\r\n\t\t\t\t'Loads custom config file placed in root folder and named same as the env',\r\n\t\t\t)\r\n\t\t\t.check((argv): boolean => {\r\n\t\t\t\t// special check for custom argument\r\n\t\t\t\tif (argv._.length === 0 && !argv.subcmd) {\r\n\t\t\t\t\tlogger.error(\r\n\t\t\t\t\t\t'No one subcommand provided for exec surrounded by :',\r\n\t\t\t\t\t);\r\n\r\n\t\t\t\t\tprocess.exit(1);\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn true;\r\n\t\t\t});\r\n\r\n\t\treturn builder;\r\n\t},\r\n\thandler: async ({ expand, providers, schemaValidate, ...argv }) => {\r\n\t\tconst started = performance.now();\r\n\r\n\t\t// kick off validator build (lazy-imports AJV) in parallel with provider I/O\r\n\t\tconst validatorPromise = schemaValidate\r\n\t\t\t? buildEnvValidator(providers, argv)\r\n\t\t\t: undefined;\r\n\r\n\t\tconst results = await loadVariablesFromProviders(providers, argv);\r\n\r\n\t\t// per-provider variable counts\r\n\t\tfor (const { key, value } of results) {\r\n\t\t\tconst flat = Array.isArray(value)\r\n\t\t\t\t? merge(\r\n\t\t\t\t\t\t{},\r\n\t\t\t\t\t\t...value.map((v: any) =>\r\n\t\t\t\t\t\t\tflatten(v, argv.nestingDelimiter),\r\n\t\t\t\t\t\t),\r\n\t\t\t\t\t)\r\n\t\t\t\t: flatten(value, argv.nestingDelimiter);\r\n\r\n\t\t\tui.provider(key, Object.keys(flat).length);\r\n\t\t}\r\n\r\n\t\tlet env = merge(\r\n\t\t\t{ NODE_ENV: 'development' },\r\n\t\t\t...flatResults(results, argv.nestingDelimiter),\r\n\t\t);\r\n\r\n\t\tif (validatorPromise) {\r\n\t\t\tconst validator = await validatorPromise;\r\n\r\n\t\t\tif (!validator(env)) {\r\n\t\t\t\tlogger.error('schema validation failed', validator.errors);\r\n\r\n\t\t\t\tprocess.exit(1);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tenv = normalize(env, argv.nestingDelimiter, argv.arrayDescomposition);\r\n\t\tif (expand) {\r\n\t\t\tenv = interpolate(env, env);\r\n\t\t\targv.subcmd = interpolate(argv.subcmd, env);\r\n\t\t}\r\n\r\n\t\tui.variables(env);\r\n\r\n\t\t// loads env vars to process.env\r\n\t\tfor (const varname in env) process.env[varname] = String(env[varname]);\r\n\r\n\t\tui.summary(Object.keys(env).length, performance.now() - started);\r\n\r\n\t\tconst cmdProcess = argv.subcmd.join(' ');\r\n\r\n\t\tui.running(cmdProcess);\r\n\r\n\t\tspawn(cmdProcess, {\r\n\t\t\tshell: true,\r\n\t\t\tstdio: 'inherit',\r\n\t\t}).on('exit', (code) => {\r\n\t\t\tif (code === 0 || code === null) {\r\n\t\t\t\tui.finished(performance.now() - started);\r\n\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tui.failed(code);\r\n\t\t\tlogger.error('process finished with error');\r\n\t\t\tprocess.exit(code);\r\n\t\t});\r\n\t},\r\n};\r\n\r\nfunction buildEnvValidator(\r\n\tproviders: EnvCommandArguments['providers'],\r\n\targv: Partial<EnvCommandArguments>,\r\n) {\r\n\tlet schema = {};\r\n\r\n\tfor (const {\r\n\t\thandler: { key },\r\n\t} of providers) {\r\n\t\tconst providerSchema = argv.schema?.[key];\r\n\r\n\t\tif (providerSchema)\r\n\t\t\tschema = Object.assign(\r\n\t\t\t\tschema,\r\n\t\t\t\tflatSchema(providerSchema, '', argv.nestingDelimiter),\r\n\t\t\t);\r\n\t}\r\n\r\n\treturn createValidator({ properties: schema, type: 'object' });\r\n}\r\n"],"mappings":";;;;;;;;;;AA8BA,IAAa,IAAsD;CAClE,SAAS;CACT,UAAU;CACV,UAAU,OACT,EACE,QAAQ;EACR,gBAAgB;GACf,OAAO;GACP,SAAS;GACT,UAAU;GACV,MAAM;EACP;EACA,QAAQ;GACP,UAAU;GACV,MAAM;EACP;CACD,CAAC,EACA,QACA,sCACA,gGACD,EACC,QACA,uDACA,yGACD,EACC,QACA,gEACA,0EACD,EACC,OAAO,OAEH,EAAK,EAAE,WAAW,KAAK,CAAC,EAAK,WAChC,EAAO,MACN,qDACD,GAEA,QAAQ,KAAK,CAAC,IAGR,GACP,GAEK;CAER,SAAS,OAAO,EAAE,WAAQ,cAAW,mBAAgB,GAAG,QAAW;EAClE,IAAM,IAAU,YAAY,IAAI,GAG1B,IAAmB,IACtB,EAAkB,GAAW,CAAI,IACjC,KAAA,GAEG,IAAU,MAAM,EAA2B,GAAW,CAAI;EAGhE,KAAK,IAAM,EAAE,QAAK,cAAW,GAAS;GACrC,IAAM,IAAO,MAAM,QAAQ,CAAK,IAC7B,EACA,CAAC,GACD,GAAG,EAAM,KAAK,MACb,EAAQ,GAAG,EAAK,gBAAgB,CACjC,CACD,IACC,EAAQ,GAAO,EAAK,gBAAgB;GAEvC,EAAG,SAAS,GAAK,OAAO,KAAK,CAAI,EAAE,MAAM;EAC1C;EAEA,IAAI,IAAM,EACT,EAAE,UAAU,cAAc,GAC1B,GAAG,EAAY,GAAS,EAAK,gBAAgB,CAC9C;EAEA,IAAI,GAAkB;GACrB,IAAM,IAAY,MAAM;GAExB,AAAK,EAAU,CAAG,MACjB,EAAO,MAAM,4BAA4B,EAAU,MAAM,GAEzD,QAAQ,KAAK,CAAC;EAEhB;EAQA,AANA,IAAM,EAAU,GAAK,EAAK,kBAAkB,EAAK,mBAAmB,GAChE,MACH,IAAM,EAAY,GAAK,CAAG,GAC1B,EAAK,SAAS,EAAY,EAAK,QAAQ,CAAG,IAG3C,EAAG,UAAU,CAAG;EAGhB,KAAK,IAAM,KAAW,GAAK,QAAQ,IAAI,KAAW,OAAO,EAAI,EAAQ;EAErE,EAAG,QAAQ,OAAO,KAAK,CAAG,EAAE,QAAQ,YAAY,IAAI,IAAI,CAAO;EAE/D,IAAM,IAAa,EAAK,OAAO,KAAK,GAAG;EAIvC,AAFA,EAAG,QAAQ,CAAU,GAErB,EAAM,GAAY;GACjB,OAAO;GACP,OAAO;EACR,CAAC,EAAE,GAAG,SAAS,MAAS;GACvB,IAAI,MAAS,KAAK,MAAS,MAAM;IAChC,EAAG,SAAS,YAAY,IAAI,IAAI,CAAO;IAEvC;GACD;GAIA,AAFA,EAAG,OAAO,CAAI,GACd,EAAO,MAAM,6BAA6B,GAC1C,QAAQ,KAAK,CAAI;EAClB,CAAC;CACF;AACD;AAEA,SAAS,EACR,GACA,GACC;CACD,IAAI,IAAS,CAAC;CAEd,KAAK,IAAM,EACV,SAAS,EAAE,cACP,GAAW;EACf,IAAM,IAAiB,EAAK,SAAS;EAErC,AAAI,MACH,IAAS,OAAO,OACf,GACA,EAAW,GAAgB,IAAI,EAAK,gBAAgB,CACrD;CACF;CAEA,OAAO,EAAgB;EAAE,YAAY;EAAQ,MAAM;CAAS,CAAC;AAC9D"}
1
+ {"version":3,"file":"env.command.js","names":[],"sources":["../../src/commands/env.command.ts"],"sourcesContent":["import merge from 'merge-deep';\r\nimport { spawn } from 'node:child_process';\r\nimport type { CommandModule } from 'yargs';\r\nimport type { CommandArguments } from '../arguments.js';\r\nimport {\r\n\tcreateValidator,\r\n\tflatResults,\r\n\tflatSchema,\r\n\tflatten,\r\n\tinterpolate,\r\n\tloadVariablesFromProviders,\r\n\tlogger,\r\n\tnormalize,\r\n\tui,\r\n} from '../utils/index.js';\r\n\r\nexport interface EnvCommandArguments extends CommandArguments {\r\n\t// whether validate schema before injecting variables\r\n\tschemaValidate: boolean;\r\n\t// command for execute after inject environment variables.\r\n\t// Should be prefixed or surrounded by ':' character.\r\n\tsubcmd: string[];\r\n}\r\n\r\n/**\r\n * Main command.\r\n * Injects environment variables into process.env.\r\n *\r\n * @example [>_]: env -e dev -m debug : npm start\r\n */\r\nexport const envCommand: CommandModule<any, EnvCommandArguments> = {\r\n\tcommand: '$0 [options..] [: <subcmd> :]',\r\n\tdescribe: 'Inject environment variables into a process and run a command',\r\n\tbuilder: (builder) => {\r\n\t\tbuilder\r\n\t\t\t.options({\r\n\t\t\t\tschemaValidate: {\r\n\t\t\t\t\talias: 'validate',\r\n\t\t\t\t\tdefault: true,\r\n\t\t\t\t\tdescribe: 'Whether validates variables using JSON schema',\r\n\t\t\t\t\ttype: 'boolean',\r\n\t\t\t\t},\r\n\t\t\t\tsubcmd: {\r\n\t\t\t\t\tdescribe: 'Command for inject environment variables',\r\n\t\t\t\t\ttype: 'array',\r\n\t\t\t\t},\r\n\t\t\t})\r\n\t\t\t.example(\r\n\t\t\t\t'env -e dev -m test unit : npm test',\r\n\t\t\t\t'Loads \"dev\" environment variables, in \"test\" and \"unit\" modes, for \"npm start\" command',\r\n\t\t\t)\r\n\t\t\t.example(\r\n\t\t\t\t'env -e dev -m debug : npm start : -c my-config.json',\r\n\t\t\t\t'Loads \"dev\" environment variables, in \"debug\" mode, for \"npm test\" command and custom config file',\r\n\t\t\t)\r\n\t\t\t.example(\r\n\t\t\t\t'env -e dev -m debug -c [[root]]/[[env]].env.json : npm start',\r\n\t\t\t\t'Loads custom config file placed in root folder and named same as the env',\r\n\t\t\t)\r\n\t\t\t.check((argv): boolean => {\r\n\t\t\t\t// special check for custom argument\r\n\t\t\t\tif (argv._.length === 0 && !argv.subcmd) {\r\n\t\t\t\t\tlogger.error(\r\n\t\t\t\t\t\t'No one subcommand provided for exec surrounded by :',\r\n\t\t\t\t\t);\r\n\r\n\t\t\t\t\tprocess.exit(1);\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn true;\r\n\t\t\t});\r\n\r\n\t\treturn builder;\r\n\t},\r\n\thandler: async ({ expand, providers, schemaValidate, ...argv }) => {\r\n\t\tconst started = performance.now();\r\n\r\n\t\t// kick off validator build (lazy-imports AJV) in parallel with provider I/O\r\n\t\tconst validatorPromise = schemaValidate\r\n\t\t\t? buildEnvValidator(providers, argv)\r\n\t\t\t: undefined;\r\n\r\n\t\tconst results = await loadVariablesFromProviders(providers, argv);\r\n\r\n\t\t// per-provider variable counts\r\n\t\tfor (const { key, value } of results) {\r\n\t\t\tconst flat = Array.isArray(value)\r\n\t\t\t\t? merge(\r\n\t\t\t\t\t\t{},\r\n\t\t\t\t\t\t...value.map((v: any) =>\r\n\t\t\t\t\t\t\tflatten(v, argv.nestingDelimiter),\r\n\t\t\t\t\t\t),\r\n\t\t\t\t\t)\r\n\t\t\t\t: flatten(value, argv.nestingDelimiter);\r\n\r\n\t\t\tui.provider(key, Object.keys(flat).length);\r\n\t\t}\r\n\r\n\t\tlet env = merge(\r\n\t\t\t{ NODE_ENV: 'development' },\r\n\t\t\t...flatResults(results, argv.nestingDelimiter),\r\n\t\t);\r\n\r\n\t\tif (validatorPromise) {\r\n\t\t\tconst validator = await validatorPromise;\r\n\r\n\t\t\tif (!validator(env)) {\r\n\t\t\t\tlogger.error('schema validation failed', validator.errors);\r\n\r\n\t\t\t\tprocess.exit(1);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tenv = normalize(env, argv.nestingDelimiter, argv.arrayDescomposition);\r\n\t\tif (expand) {\r\n\t\t\tenv = interpolate(env, env);\r\n\t\t\targv.subcmd = interpolate(argv.subcmd, env);\r\n\t\t}\r\n\r\n\t\tui.variables(env);\r\n\r\n\t\t// loads env vars to process.env\r\n\t\tfor (const varname in env) process.env[varname] = String(env[varname]);\r\n\r\n\t\tui.summary(Object.keys(env).length, performance.now() - started);\r\n\r\n\t\tconst cmdProcess = argv.subcmd.join(' ');\r\n\r\n\t\tui.running(cmdProcess);\r\n\r\n\t\tspawn(cmdProcess, {\r\n\t\t\tshell: true,\r\n\t\t\tstdio: 'inherit',\r\n\t\t}).on('exit', (code) => {\r\n\t\t\tif (code === 0 || code === null) {\r\n\t\t\t\tui.finished(performance.now() - started);\r\n\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tui.failed(code);\r\n\t\t\tlogger.error('process finished with error');\r\n\t\t\tprocess.exit(code);\r\n\t\t});\r\n\t},\r\n};\r\n\r\nfunction buildEnvValidator(\r\n\tproviders: EnvCommandArguments['providers'],\r\n\targv: Partial<EnvCommandArguments>,\r\n) {\r\n\tlet schema = {};\r\n\r\n\tfor (const {\r\n\t\thandler: { key },\r\n\t} of providers) {\r\n\t\tconst providerSchema = argv.schema?.[key];\r\n\r\n\t\tif (providerSchema)\r\n\t\t\tschema = Object.assign(\r\n\t\t\t\tschema,\r\n\t\t\t\tflatSchema(providerSchema, '', argv.nestingDelimiter),\r\n\t\t\t);\r\n\t}\r\n\r\n\treturn createValidator({ properties: schema, type: 'object' });\r\n}\r\n"],"mappings":";;;;;;;;;;AA8BA,IAAa,IAAsD;CAClE,SAAS;CACT,UAAU;CACV,UAAU,OACT,EACE,QAAQ;EACR,gBAAgB;GACf,OAAO;GACP,SAAS;GACT,UAAU;GACV,MAAM;EACP;EACA,QAAQ;GACP,UAAU;GACV,MAAM;EACP;CACD,CAAC,CAAC,CACD,QACA,sCACA,gGACD,CAAC,CACA,QACA,uDACA,yGACD,CAAC,CACA,QACA,gEACA,0EACD,CAAC,CACA,OAAO,OAEH,EAAK,EAAE,WAAW,KAAK,CAAC,EAAK,WAChC,EAAO,MACN,qDACD,GAEA,QAAQ,KAAK,CAAC,IAGR,GACP,GAEK;CAER,SAAS,OAAO,EAAE,WAAQ,cAAW,mBAAgB,GAAG,QAAW;EAClE,IAAM,IAAU,YAAY,IAAI,GAG1B,IAAmB,IACtB,EAAkB,GAAW,CAAI,IACjC,KAAA,GAEG,IAAU,MAAM,EAA2B,GAAW,CAAI;EAGhE,KAAK,IAAM,EAAE,QAAK,cAAW,GAAS;GACrC,IAAM,IAAO,MAAM,QAAQ,CAAK,IAC7B,EACA,CAAC,GACD,GAAG,EAAM,KAAK,MACb,EAAQ,GAAG,EAAK,gBAAgB,CACjC,CACD,IACC,EAAQ,GAAO,EAAK,gBAAgB;GAEvC,EAAG,SAAS,GAAK,OAAO,KAAK,CAAI,CAAC,CAAC,MAAM;EAC1C;EAEA,IAAI,IAAM,EACT,EAAE,UAAU,cAAc,GAC1B,GAAG,EAAY,GAAS,EAAK,gBAAgB,CAC9C;EAEA,IAAI,GAAkB;GACrB,IAAM,IAAY,MAAM;GAExB,AAAK,EAAU,CAAG,MACjB,EAAO,MAAM,4BAA4B,EAAU,MAAM,GAEzD,QAAQ,KAAK,CAAC;EAEhB;EAQA,AANA,IAAM,EAAU,GAAK,EAAK,kBAAkB,EAAK,mBAAmB,GAChE,MACH,IAAM,EAAY,GAAK,CAAG,GAC1B,EAAK,SAAS,EAAY,EAAK,QAAQ,CAAG,IAG3C,EAAG,UAAU,CAAG;EAGhB,KAAK,IAAM,KAAW,GAAK,QAAQ,IAAI,KAAW,OAAO,EAAI,EAAQ;EAErE,EAAG,QAAQ,OAAO,KAAK,CAAG,CAAC,CAAC,QAAQ,YAAY,IAAI,IAAI,CAAO;EAE/D,IAAM,IAAa,EAAK,OAAO,KAAK,GAAG;EAIvC,AAFA,EAAG,QAAQ,CAAU,GAErB,EAAM,GAAY;GACjB,OAAO;GACP,OAAO;EACR,CAAC,CAAC,CAAC,GAAG,SAAS,MAAS;GACvB,IAAI,MAAS,KAAK,MAAS,MAAM;IAChC,EAAG,SAAS,YAAY,IAAI,IAAI,CAAO;IAEvC;GACD;GAIA,AAFA,EAAG,OAAO,CAAI,GACd,EAAO,MAAM,6BAA6B,GAC1C,QAAQ,KAAK,CAAI;EAClB,CAAC;CACF;AACD;AAEA,SAAS,EACR,GACA,GACC;CACD,IAAI,IAAS,CAAC;CAEd,KAAK,IAAM,EACV,SAAS,EAAE,cACP,GAAW;EACf,IAAM,IAAiB,EAAK,SAAS;EAErC,AAAI,MACH,IAAS,OAAO,OACf,GACA,EAAW,GAAgB,IAAI,EAAK,gBAAgB,CACrD;CACF;CAEA,OAAO,EAAgB;EAAE,YAAY;EAAQ,MAAM;CAAS,CAAC;AAC9D"}
@@ -37,7 +37,7 @@ var l = {
37
37
  }).example("env export -e dev -m build", "Exports \"dev\" variables to a dotenv file at root as \".env\"").example("env export -e prod -m build -f json --uri [[env]].env.json", "Exports \"prod\" variables to a json file at root as \"prod.env.json\""), e),
38
38
  handler: async ({ expand: l, exportIgnoreKeys: u, exportQuotes: d, providers: f, ...p }) => {
39
39
  let m = c({ NODE_ENV: "development" }, ...await e(await t(f, p), p));
40
- m = o(m, p.nestingDelimiter, p.arrayDescomposition), l && (m = n(m, m)), u && (a.silly("ignoring:", u), m = Object.fromEntries(Object.entries(m).filter(([e]) => !u.includes(e)))), a.debug("environment loaded:", m);
40
+ m = o(m, p.nestingDelimiter, p.arrayDescomposition), l && (m = n(m, m)), u && (a.silly("ignoring:", u), m = Object.fromEntries(Object.entries(m).filter(([e]) => !u.includes(e)))), s.variables(m);
41
41
  let { format: h, uri: g } = p;
42
42
  switch (h) {
43
43
  case "dotenv":
@@ -1 +1 @@
1
- {"version":3,"file":"export.command.js","names":[],"sources":["../../src/commands/export.command.ts"],"sourcesContent":["import merge from 'merge-deep';\r\nimport type { CommandModule } from 'yargs';\r\nimport type { CommandArguments } from '../arguments.js';\r\nimport {\r\n\tflatAndValidateResults,\r\n\tinterpolate,\r\n\tloadVariablesFromProviders,\r\n\tlogger,\r\n\tnormalize,\r\n\tui,\r\n\twriteEnvFromJson,\r\n\twriteJson,\r\n} from '../utils/index.js';\r\n\r\nexport interface ExportCommandArguments extends CommandArguments {\r\n\tformat: 'dotenv' | 'json';\r\n\r\n\turi: string;\r\n\r\n\texportQuotes: boolean;\r\n}\r\n\r\n/**\r\n * Export command.\r\n * Export environment variables to a file.\r\n *\r\n * @example [>_]: env export -e dev -m build\r\n */\r\nexport const exportCommand: CommandModule<any, ExportCommandArguments> = {\r\n\tcommand: 'export [options..]',\r\n\tdescribe: 'Export unified environment variables to a file from providers',\r\n\tbuilder: (builder) => {\r\n\t\tbuilder\r\n\t\t\t.options({\r\n\t\t\t\texportQuotes: {\r\n\t\t\t\t\talias: ['quotes', 'q'],\r\n\t\t\t\t\tdefault: false,\r\n\t\t\t\t\tdescribe: 'Wraps values in quotes',\r\n\t\t\t\t\ttype: 'boolean',\r\n\t\t\t\t},\r\n\t\t\t\tformat: {\r\n\t\t\t\t\talias: 'f',\r\n\t\t\t\t\tchoices: ['json', 'dotenv'],\r\n\t\t\t\t\tdefault: 'dotenv',\r\n\t\t\t\t\tdescribe: 'Format for export variables',\r\n\t\t\t\t\ttype: 'string',\r\n\t\t\t\t},\r\n\t\t\t\turi: {\r\n\t\t\t\t\talias: ['u', 'p', 'path'],\r\n\t\t\t\t\tdefault: '.env',\r\n\t\t\t\t\tdescribe: 'Uri for export file with variables',\r\n\t\t\t\t\ttype: 'string',\r\n\t\t\t\t},\r\n\t\t\t})\r\n\t\t\t.example(\r\n\t\t\t\t'env export -e dev -m build',\r\n\t\t\t\t'Exports \"dev\" variables to a dotenv file at root as \".env\"',\r\n\t\t\t)\r\n\t\t\t.example(\r\n\t\t\t\t'env export -e prod -m build -f json --uri [[env]].env.json',\r\n\t\t\t\t'Exports \"prod\" variables to a json file at root as \"prod.env.json\"',\r\n\t\t\t);\r\n\r\n\t\treturn builder;\r\n\t},\r\n\thandler: async ({\r\n\t\texpand,\r\n\t\texportIgnoreKeys,\r\n\t\texportQuotes,\r\n\t\tproviders,\r\n\t\t...argv\r\n\t}) => {\r\n\t\tconst results = await loadVariablesFromProviders(providers, argv);\r\n\r\n\t\tlet env = merge(\r\n\t\t\t{ NODE_ENV: 'development' },\r\n\t\t\t...(await flatAndValidateResults(results, argv)),\r\n\t\t);\r\n\r\n\t\tenv = normalize(env, argv.nestingDelimiter, argv.arrayDescomposition);\r\n\t\tif (expand) env = interpolate(env, env);\r\n\t\tif (exportIgnoreKeys) {\r\n\t\t\tlogger.silly('ignoring:', exportIgnoreKeys);\r\n\t\t\tenv = Object.fromEntries(\r\n\t\t\t\tObject.entries(env).filter(\r\n\t\t\t\t\t([k]) => !exportIgnoreKeys.includes(k),\r\n\t\t\t\t),\r\n\t\t\t);\r\n\t\t}\r\n\r\n\t\tlogger.debug('environment loaded:', env);\r\n\r\n\t\tconst { format, uri } = argv;\r\n\r\n\t\tswitch (format) {\r\n\t\t\tcase 'dotenv': {\r\n\t\t\t\tawait writeEnvFromJson(uri, env, true, exportQuotes);\r\n\t\t\t\tui.action(\r\n\t\t\t\t\t'📤',\r\n\t\t\t\t\t`exported ${Object.keys(env).length} variables → ${uri} (${format})`,\r\n\t\t\t\t);\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\r\n\t\t\tcase 'json': {\r\n\t\t\t\tawait writeJson(uri, env, true);\r\n\t\t\t\tui.action(\r\n\t\t\t\t\t'📤',\r\n\t\t\t\t\t`exported ${Object.keys(env).length} variables → ${uri} (${format})`,\r\n\t\t\t\t);\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\r\n\t\t\tdefault: {\r\n\t\t\t\tlogger.error(`format ${format} not recognized`);\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n};\r\n"],"mappings":";;;;;;;;;AA4BA,IAAa,IAA4D;CACxE,SAAS;CACT,UAAU;CACV,UAAU,OACT,EACE,QAAQ;EACR,cAAc;GACb,OAAO,CAAC,UAAU,GAAG;GACrB,SAAS;GACT,UAAU;GACV,MAAM;EACP;EACA,QAAQ;GACP,OAAO;GACP,SAAS,CAAC,QAAQ,QAAQ;GAC1B,SAAS;GACT,UAAU;GACV,MAAM;EACP;EACA,KAAK;GACJ,OAAO;IAAC;IAAK;IAAK;GAAM;GACxB,SAAS;GACT,UAAU;GACV,MAAM;EACP;CACD,CAAC,EACA,QACA,8BACA,gEACD,EACC,QACA,8DACA,wEACD,GAEM;CAER,SAAS,OAAO,EACf,WACA,qBACA,iBACA,cACA,GAAG,QACE;EAGL,IAAI,IAAM,EACT,EAAE,UAAU,cAAc,GAC1B,GAAI,MAAM,EAAuB,MAJZ,EAA2B,GAAW,CAAI,GAIrB,CAAI,CAC/C;EAaA,AAXA,IAAM,EAAU,GAAK,EAAK,kBAAkB,EAAK,mBAAmB,GAChE,MAAQ,IAAM,EAAY,GAAK,CAAG,IAClC,MACH,EAAO,MAAM,aAAa,CAAgB,GAC1C,IAAM,OAAO,YACZ,OAAO,QAAQ,CAAG,EAAE,QAClB,CAAC,OAAO,CAAC,EAAiB,SAAS,CAAC,CACtC,CACD,IAGD,EAAO,MAAM,uBAAuB,CAAG;EAEvC,IAAM,EAAE,WAAQ,WAAQ;EAExB,QAAQ,GAAR;GACC,KAAK;IAEJ,AADA,MAAM,EAAiB,GAAK,GAAK,IAAM,CAAY,GACnD,EAAG,OACF,MACA,YAAY,OAAO,KAAK,CAAG,EAAE,OAAO,eAAe,EAAI,IAAI,EAAO,EACnE;IACA;GAGD,KAAK;IAEJ,AADA,MAAM,EAAU,GAAK,GAAK,EAAI,GAC9B,EAAG,OACF,MACA,YAAY,OAAO,KAAK,CAAG,EAAE,OAAO,eAAe,EAAI,IAAI,EAAO,EACnE;IACA;GAGD,SACC,EAAO,MAAM,UAAU,EAAO,gBAAgB;EAEhD;CACD;AACD"}
1
+ {"version":3,"file":"export.command.js","names":[],"sources":["../../src/commands/export.command.ts"],"sourcesContent":["import merge from 'merge-deep';\r\nimport type { CommandModule } from 'yargs';\r\nimport type { CommandArguments } from '../arguments.js';\r\nimport {\r\n\tflatAndValidateResults,\r\n\tinterpolate,\r\n\tloadVariablesFromProviders,\r\n\tlogger,\r\n\tnormalize,\r\n\tui,\r\n\twriteEnvFromJson,\r\n\twriteJson,\r\n} from '../utils/index.js';\r\n\r\nexport interface ExportCommandArguments extends CommandArguments {\r\n\tformat: 'dotenv' | 'json';\r\n\r\n\turi: string;\r\n\r\n\texportQuotes: boolean;\r\n}\r\n\r\n/**\r\n * Export command.\r\n * Export environment variables to a file.\r\n *\r\n * @example [>_]: env export -e dev -m build\r\n */\r\nexport const exportCommand: CommandModule<any, ExportCommandArguments> = {\r\n\tcommand: 'export [options..]',\r\n\tdescribe: 'Export unified environment variables to a file from providers',\r\n\tbuilder: (builder) => {\r\n\t\tbuilder\r\n\t\t\t.options({\r\n\t\t\t\texportQuotes: {\r\n\t\t\t\t\talias: ['quotes', 'q'],\r\n\t\t\t\t\tdefault: false,\r\n\t\t\t\t\tdescribe: 'Wraps values in quotes',\r\n\t\t\t\t\ttype: 'boolean',\r\n\t\t\t\t},\r\n\t\t\t\tformat: {\r\n\t\t\t\t\talias: 'f',\r\n\t\t\t\t\tchoices: ['json', 'dotenv'],\r\n\t\t\t\t\tdefault: 'dotenv',\r\n\t\t\t\t\tdescribe: 'Format for export variables',\r\n\t\t\t\t\ttype: 'string',\r\n\t\t\t\t},\r\n\t\t\t\turi: {\r\n\t\t\t\t\talias: ['u', 'p', 'path'],\r\n\t\t\t\t\tdefault: '.env',\r\n\t\t\t\t\tdescribe: 'Uri for export file with variables',\r\n\t\t\t\t\ttype: 'string',\r\n\t\t\t\t},\r\n\t\t\t})\r\n\t\t\t.example(\r\n\t\t\t\t'env export -e dev -m build',\r\n\t\t\t\t'Exports \"dev\" variables to a dotenv file at root as \".env\"',\r\n\t\t\t)\r\n\t\t\t.example(\r\n\t\t\t\t'env export -e prod -m build -f json --uri [[env]].env.json',\r\n\t\t\t\t'Exports \"prod\" variables to a json file at root as \"prod.env.json\"',\r\n\t\t\t);\r\n\r\n\t\treturn builder;\r\n\t},\r\n\thandler: async ({\r\n\t\texpand,\r\n\t\texportIgnoreKeys,\r\n\t\texportQuotes,\r\n\t\tproviders,\r\n\t\t...argv\r\n\t}) => {\r\n\t\tconst results = await loadVariablesFromProviders(providers, argv);\r\n\r\n\t\tlet env = merge(\r\n\t\t\t{ NODE_ENV: 'development' },\r\n\t\t\t...(await flatAndValidateResults(results, argv)),\r\n\t\t);\r\n\r\n\t\tenv = normalize(env, argv.nestingDelimiter, argv.arrayDescomposition);\r\n\t\tif (expand) env = interpolate(env, env);\r\n\t\tif (exportIgnoreKeys) {\r\n\t\t\tlogger.silly('ignoring:', exportIgnoreKeys);\r\n\t\t\tenv = Object.fromEntries(\r\n\t\t\t\tObject.entries(env).filter(\r\n\t\t\t\t\t([k]) => !exportIgnoreKeys.includes(k),\r\n\t\t\t\t),\r\n\t\t\t);\r\n\t\t}\r\n\r\n\t\tui.variables(env);\r\n\r\n\t\tconst { format, uri } = argv;\r\n\r\n\t\tswitch (format) {\r\n\t\t\tcase 'dotenv': {\r\n\t\t\t\tawait writeEnvFromJson(uri, env, true, exportQuotes);\r\n\t\t\t\tui.action(\r\n\t\t\t\t\t'📤',\r\n\t\t\t\t\t`exported ${Object.keys(env).length} variables → ${uri} (${format})`,\r\n\t\t\t\t);\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\r\n\t\t\tcase 'json': {\r\n\t\t\t\tawait writeJson(uri, env, true);\r\n\t\t\t\tui.action(\r\n\t\t\t\t\t'📤',\r\n\t\t\t\t\t`exported ${Object.keys(env).length} variables → ${uri} (${format})`,\r\n\t\t\t\t);\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\r\n\t\t\tdefault: {\r\n\t\t\t\tlogger.error(`format ${format} not recognized`);\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n};\r\n"],"mappings":";;;;;;;;;AA4BA,IAAa,IAA4D;CACxE,SAAS;CACT,UAAU;CACV,UAAU,OACT,EACE,QAAQ;EACR,cAAc;GACb,OAAO,CAAC,UAAU,GAAG;GACrB,SAAS;GACT,UAAU;GACV,MAAM;EACP;EACA,QAAQ;GACP,OAAO;GACP,SAAS,CAAC,QAAQ,QAAQ;GAC1B,SAAS;GACT,UAAU;GACV,MAAM;EACP;EACA,KAAK;GACJ,OAAO;IAAC;IAAK;IAAK;GAAM;GACxB,SAAS;GACT,UAAU;GACV,MAAM;EACP;CACD,CAAC,CAAC,CACD,QACA,8BACA,gEACD,CAAC,CACA,QACA,8DACA,wEACD,GAEM;CAER,SAAS,OAAO,EACf,WACA,qBACA,iBACA,cACA,GAAG,QACE;EAGL,IAAI,IAAM,EACT,EAAE,UAAU,cAAc,GAC1B,GAAI,MAAM,EAAuB,MAJZ,EAA2B,GAAW,CAAI,GAIrB,CAAI,CAC/C;EAaA,AAXA,IAAM,EAAU,GAAK,EAAK,kBAAkB,EAAK,mBAAmB,GAChE,MAAQ,IAAM,EAAY,GAAK,CAAG,IAClC,MACH,EAAO,MAAM,aAAa,CAAgB,GAC1C,IAAM,OAAO,YACZ,OAAO,QAAQ,CAAG,CAAC,CAAC,QAClB,CAAC,OAAO,CAAC,EAAiB,SAAS,CAAC,CACtC,CACD,IAGD,EAAG,UAAU,CAAG;EAEhB,IAAM,EAAE,WAAQ,WAAQ;EAExB,QAAQ,GAAR;GACC,KAAK;IAEJ,AADA,MAAM,EAAiB,GAAK,GAAK,IAAM,CAAY,GACnD,EAAG,OACF,MACA,YAAY,OAAO,KAAK,CAAG,CAAC,CAAC,OAAO,eAAe,EAAI,IAAI,EAAO,EACnE;IACA;GAGD,KAAK;IAEJ,AADA,MAAM,EAAU,GAAK,GAAK,EAAI,GAC9B,EAAG,OACF,MACA,YAAY,OAAO,KAAK,CAAG,CAAC,CAAC,OAAO,eAAe,EAAI,IAAI,EAAO,EACnE;IACA;GAGD,SACC,EAAO,MAAM,UAAU,EAAO,gBAAgB;EAEhD;CACD;AACD"}
@@ -1 +1 @@
1
- {"version":3,"file":"pull.command.js","names":[],"sources":["../../src/commands/pull.command.ts"],"sourcesContent":["import pc from 'picocolors';\nimport type { CommandModule } from 'yargs';\nimport type { CommandArguments } from '../arguments.js';\nimport { logger, ui } from '../utils/index.js';\n\nexport interface PullCommandArguments extends CommandArguments {\n\t// whether variables should be overwritten in already exists\n\toverwrite: boolean;\n}\n\n/**\n * Pulls environment variables from providers.\n *\n * @example [>_]: env pull -e dev\n */\nexport const pullCommand: CommandModule<any, PullCommandArguments> = {\n\tcommand: 'pull [options..]',\n\tdescribe: 'Pull environment variables from provider stores',\n\tbuilder: (builder) => {\n\t\tbuilder\n\t\t\t.options({\n\t\t\t\toverwrite: {\n\t\t\t\t\talias: 'o',\n\t\t\t\t\tdefault: false,\n\t\t\t\t\tdescribe: 'Overwrite local variables',\n\t\t\t\t\ttype: 'boolean',\n\t\t\t\t},\n\t\t\t})\n\t\t\t.example('env pull -e dev', 'Download \"dev\" environment secrets')\n\t\t\t.example(\n\t\t\t\t'env pull -e dev -o',\n\t\t\t\t'Download and overwrite (if any exists) \"dev\" environment secrets',\n\t\t\t);\n\n\t\treturn builder;\n\t},\n\thandler: async ({ providers, ...argv }) => {\n\t\tconst pullProviders = providers.filter(\n\t\t\t({ handler: { pull } }) => !!pull,\n\t\t);\n\t\tconst promises = await Promise.all(\n\t\t\tpullProviders.map(({ config, handler: { key, pull } }) => {\n\t\t\t\tlogger.silly(`pulling from ${pc.yellow(key)} provider`);\n\n\t\t\t\treturn pull!(argv, config);\n\t\t\t}),\n\t\t);\n\n\t\tif (promises.length > 0)\n\t\t\tui.action('⬇️', `pulled from ${promises.length} provider(s)`);\n\t\telse logger.warn('no providers for pull variables');\n\t},\n};\n"],"mappings":";;;;;AAeA,IAAa,IAAwD;CACpE,SAAS;CACT,UAAU;CACV,UAAU,OACT,EACE,QAAQ,EACR,WAAW;EACV,OAAO;EACP,SAAS;EACT,UAAU;EACV,MAAM;CACP,EACD,CAAC,EACA,QAAQ,mBAAmB,sCAAoC,EAC/D,QACA,sBACA,oEACD,GAEM;CAER,SAAS,OAAO,EAAE,cAAW,GAAG,QAAW;EAC1C,IAAM,IAAgB,EAAU,QAC9B,EAAE,SAAS,EAAE,gBAAa,CAAC,CAAC,CAC9B,GACM,IAAW,MAAM,QAAQ,IAC9B,EAAc,KAAK,EAAE,WAAQ,SAAS,EAAE,QAAK,iBAC5C,EAAO,MAAM,gBAAgB,EAAG,OAAO,CAAG,EAAE,UAAU,GAE/C,EAAM,GAAM,CAAM,EACzB,CACF;EAEA,AAAI,EAAS,SAAS,IACrB,EAAG,OAAO,MAAM,eAAe,EAAS,OAAO,aAAa,IACxD,EAAO,KAAK,iCAAiC;CACnD;AACD"}
1
+ {"version":3,"file":"pull.command.js","names":[],"sources":["../../src/commands/pull.command.ts"],"sourcesContent":["import pc from 'picocolors';\r\nimport type { CommandModule } from 'yargs';\r\nimport type { CommandArguments } from '../arguments.js';\r\nimport { logger, ui } from '../utils/index.js';\r\n\r\nexport interface PullCommandArguments extends CommandArguments {\r\n\t// whether variables should be overwritten in already exists\r\n\toverwrite: boolean;\r\n}\r\n\r\n/**\r\n * Pulls environment variables from providers.\r\n *\r\n * @example [>_]: env pull -e dev\r\n */\r\nexport const pullCommand: CommandModule<any, PullCommandArguments> = {\r\n\tcommand: 'pull [options..]',\r\n\tdescribe: 'Pull environment variables from provider stores',\r\n\tbuilder: (builder) => {\r\n\t\tbuilder\r\n\t\t\t.options({\r\n\t\t\t\toverwrite: {\r\n\t\t\t\t\talias: 'o',\r\n\t\t\t\t\tdefault: false,\r\n\t\t\t\t\tdescribe: 'Overwrite local variables',\r\n\t\t\t\t\ttype: 'boolean',\r\n\t\t\t\t},\r\n\t\t\t})\r\n\t\t\t.example('env pull -e dev', 'Download \"dev\" environment secrets')\r\n\t\t\t.example(\r\n\t\t\t\t'env pull -e dev -o',\r\n\t\t\t\t'Download and overwrite (if any exists) \"dev\" environment secrets',\r\n\t\t\t);\r\n\r\n\t\treturn builder;\r\n\t},\r\n\thandler: async ({ providers, ...argv }) => {\r\n\t\tconst pullProviders = providers.filter(\r\n\t\t\t({ handler: { pull } }) => !!pull,\r\n\t\t);\r\n\t\tconst promises = await Promise.all(\r\n\t\t\tpullProviders.map(({ config, handler: { key, pull } }) => {\r\n\t\t\t\tlogger.silly(`pulling from ${pc.yellow(key)} provider`);\r\n\r\n\t\t\t\treturn pull!(argv, config);\r\n\t\t\t}),\r\n\t\t);\r\n\r\n\t\tif (promises.length > 0)\r\n\t\t\tui.action('⬇️', `pulled from ${promises.length} provider(s)`);\r\n\t\telse logger.warn('no providers for pull variables');\r\n\t},\r\n};\r\n"],"mappings":";;;;;AAeA,IAAa,IAAwD;CACpE,SAAS;CACT,UAAU;CACV,UAAU,OACT,EACE,QAAQ,EACR,WAAW;EACV,OAAO;EACP,SAAS;EACT,UAAU;EACV,MAAM;CACP,EACD,CAAC,CAAC,CACD,QAAQ,mBAAmB,sCAAoC,CAAC,CAChE,QACA,sBACA,oEACD,GAEM;CAER,SAAS,OAAO,EAAE,cAAW,GAAG,QAAW;EAC1C,IAAM,IAAgB,EAAU,QAC9B,EAAE,SAAS,EAAE,gBAAa,CAAC,CAAC,CAC9B,GACM,IAAW,MAAM,QAAQ,IAC9B,EAAc,KAAK,EAAE,WAAQ,SAAS,EAAE,QAAK,iBAC5C,EAAO,MAAM,gBAAgB,EAAG,OAAO,CAAG,EAAE,UAAU,GAE/C,EAAM,GAAM,CAAM,EACzB,CACF;EAEA,AAAI,EAAS,SAAS,IACrB,EAAG,OAAO,MAAM,eAAe,EAAS,OAAO,aAAa,IACxD,EAAO,KAAK,iCAAiC;CACnD;AACD"}
@@ -1 +1 @@
1
- {"version":3,"file":"push.command.js","names":[],"sources":["../../src/commands/push.command.ts"],"sourcesContent":["import pc from 'picocolors';\nimport type { CommandModule } from 'yargs';\nimport type { CommandArguments } from '../arguments.js';\nimport { logger, ui } from '../utils/index.js';\n\nexport interface PushCommandArguments extends CommandArguments {\n\t// forces to push in case of conflict\n\tforce: boolean;\n}\n\n/**\n * Pushes environment variables to providers store.\n *\n * @example [>_]: env push -e dev\n */\nexport const pushCommand: CommandModule<any, PushCommandArguments> = {\n\tcommand: 'push [options..]',\n\tdescribe: 'Push environment variables to provider stores',\n\tbuilder: (builder) => {\n\t\tbuilder\n\t\t\t.options({\n\t\t\t\tforce: {\n\t\t\t\t\talias: 'f',\n\t\t\t\t\tdefault: false,\n\t\t\t\t\tdescribe: 'Force push for secrets',\n\t\t\t\t\ttype: 'boolean',\n\t\t\t\t},\n\t\t\t})\n\t\t\t.example('env push -e dev', 'Download \"dev\" environment secrets');\n\n\t\treturn builder;\n\t},\n\thandler: async ({ providers, ...argv }) => {\n\t\tconst pushProviders = providers.filter(\n\t\t\t({ handler: { push } }) => !!push,\n\t\t);\n\t\tconst promises = await Promise.all(\n\t\t\tpushProviders.map(({ config, handler: { key, push } }) => {\n\t\t\t\tlogger.debug(`pushing to ${pc.yellow(key)} provider`);\n\n\t\t\t\treturn push!(argv, config);\n\t\t\t}),\n\t\t);\n\n\t\tif (promises.length > 0)\n\t\t\tui.action('⬆️', `pushed to ${promises.length} provider(s)`);\n\t\telse logger.warn('no providers for push variables');\n\t},\n};\n"],"mappings":";;;;;AAeA,IAAa,IAAwD;CACpE,SAAS;CACT,UAAU;CACV,UAAU,OACT,EACE,QAAQ,EACR,OAAO;EACN,OAAO;EACP,SAAS;EACT,UAAU;EACV,MAAM;CACP,EACD,CAAC,EACA,QAAQ,mBAAmB,sCAAoC,GAE1D;CAER,SAAS,OAAO,EAAE,cAAW,GAAG,QAAW;EAC1C,IAAM,IAAgB,EAAU,QAC9B,EAAE,SAAS,EAAE,gBAAa,CAAC,CAAC,CAC9B,GACM,IAAW,MAAM,QAAQ,IAC9B,EAAc,KAAK,EAAE,WAAQ,SAAS,EAAE,QAAK,iBAC5C,EAAO,MAAM,cAAc,EAAG,OAAO,CAAG,EAAE,UAAU,GAE7C,EAAM,GAAM,CAAM,EACzB,CACF;EAEA,AAAI,EAAS,SAAS,IACrB,EAAG,OAAO,MAAM,aAAa,EAAS,OAAO,aAAa,IACtD,EAAO,KAAK,iCAAiC;CACnD;AACD"}
1
+ {"version":3,"file":"push.command.js","names":[],"sources":["../../src/commands/push.command.ts"],"sourcesContent":["import pc from 'picocolors';\r\nimport type { CommandModule } from 'yargs';\r\nimport type { CommandArguments } from '../arguments.js';\r\nimport { logger, ui } from '../utils/index.js';\r\n\r\nexport interface PushCommandArguments extends CommandArguments {\r\n\t// forces to push in case of conflict\r\n\tforce: boolean;\r\n}\r\n\r\n/**\r\n * Pushes environment variables to providers store.\r\n *\r\n * @example [>_]: env push -e dev\r\n */\r\nexport const pushCommand: CommandModule<any, PushCommandArguments> = {\r\n\tcommand: 'push [options..]',\r\n\tdescribe: 'Push environment variables to provider stores',\r\n\tbuilder: (builder) => {\r\n\t\tbuilder\r\n\t\t\t.options({\r\n\t\t\t\tforce: {\r\n\t\t\t\t\talias: 'f',\r\n\t\t\t\t\tdefault: false,\r\n\t\t\t\t\tdescribe: 'Force push for secrets',\r\n\t\t\t\t\ttype: 'boolean',\r\n\t\t\t\t},\r\n\t\t\t})\r\n\t\t\t.example('env push -e dev', 'Download \"dev\" environment secrets');\r\n\r\n\t\treturn builder;\r\n\t},\r\n\thandler: async ({ providers, ...argv }) => {\r\n\t\tconst pushProviders = providers.filter(\r\n\t\t\t({ handler: { push } }) => !!push,\r\n\t\t);\r\n\t\tconst promises = await Promise.all(\r\n\t\t\tpushProviders.map(({ config, handler: { key, push } }) => {\r\n\t\t\t\tlogger.debug(`pushing to ${pc.yellow(key)} provider`);\r\n\r\n\t\t\t\treturn push!(argv, config);\r\n\t\t\t}),\r\n\t\t);\r\n\r\n\t\tif (promises.length > 0)\r\n\t\t\tui.action('⬆️', `pushed to ${promises.length} provider(s)`);\r\n\t\telse logger.warn('no providers for push variables');\r\n\t},\r\n};\r\n"],"mappings":";;;;;AAeA,IAAa,IAAwD;CACpE,SAAS;CACT,UAAU;CACV,UAAU,OACT,EACE,QAAQ,EACR,OAAO;EACN,OAAO;EACP,SAAS;EACT,UAAU;EACV,MAAM;CACP,EACD,CAAC,CAAC,CACD,QAAQ,mBAAmB,sCAAoC,GAE1D;CAER,SAAS,OAAO,EAAE,cAAW,GAAG,QAAW;EAC1C,IAAM,IAAgB,EAAU,QAC9B,EAAE,SAAS,EAAE,gBAAa,CAAC,CAAC,CAC9B,GACM,IAAW,MAAM,QAAQ,IAC9B,EAAc,KAAK,EAAE,WAAQ,SAAS,EAAE,QAAK,iBAC5C,EAAO,MAAM,cAAc,EAAG,OAAO,CAAG,EAAE,UAAU,GAE7C,EAAM,GAAM,CAAM,EACzB,CACF;EAEA,AAAI,EAAS,SAAS,IACrB,EAAG,OAAO,MAAM,aAAa,EAAS,OAAO,aAAa,IACtD,EAAO,KAAK,iCAAiC;CACnD;AACD"}
@@ -1 +1 @@
1
- {"version":3,"file":"schema.command.js","names":[],"sources":["../../src/commands/schema.command.ts"],"sourcesContent":["import type { CommandModule } from 'yargs';\nimport type { CommandArguments } from '../arguments.js';\nimport {\n\tgenerateSchemaFrom,\n\tloadVariablesFromProviders,\n\tlogger,\n\tui,\n} from '../utils/index.js';\n\n/**\n * Generates validation schema from providers environment variables.\n *\n * @example [>_]: env schema -e dev -m build\n */\nexport const schemaCommand: CommandModule<any, CommandArguments> = {\n\tcommand: 'schema [options..]',\n\tdescribe: 'Generate the JSON validation schema from providers',\n\tbuilder: (builder) => {\n\t\treturn builder.example(\n\t\t\t'env schema --generate -e dev -m debug unit',\n\t\t\t'Updates JSON schema',\n\t\t);\n\t},\n\thandler: async (argv) => {\n\t\targv.ci = true;\n\n\t\tconst results = await loadVariablesFromProviders(argv.providers, argv);\n\n\t\tconst schema = await generateSchemaFrom(results, argv);\n\n\t\tlogger.silly('schema:', schema);\n\t\tui.action('📐', `schema updated → ${argv.schemaFile}`);\n\t},\n};\n"],"mappings":";;;;;AAcA,IAAa,IAAsD;CAClE,SAAS;CACT,UAAU;CACV,UAAU,MACF,EAAQ,QACd,8CACA,qBACD;CAED,SAAS,OAAO,MAAS;EACxB,EAAK,KAAK;EAIV,IAAM,IAAS,MAAM,EAAmB,MAFlB,EAA2B,EAAK,WAAW,CAAI,GAEpB,CAAI;EAGrD,AADA,EAAO,MAAM,WAAW,CAAM,GAC9B,EAAG,OAAO,MAAM,oBAAoB,EAAK,YAAY;CACtD;AACD"}
1
+ {"version":3,"file":"schema.command.js","names":[],"sources":["../../src/commands/schema.command.ts"],"sourcesContent":["import type { CommandModule } from 'yargs';\r\nimport type { CommandArguments } from '../arguments.js';\r\nimport {\r\n\tgenerateSchemaFrom,\r\n\tloadVariablesFromProviders,\r\n\tlogger,\r\n\tui,\r\n} from '../utils/index.js';\r\n\r\n/**\r\n * Generates validation schema from providers environment variables.\r\n *\r\n * @example [>_]: env schema -e dev -m build\r\n */\r\nexport const schemaCommand: CommandModule<any, CommandArguments> = {\r\n\tcommand: 'schema [options..]',\r\n\tdescribe: 'Generate the JSON validation schema from providers',\r\n\tbuilder: (builder) => {\r\n\t\treturn builder.example(\r\n\t\t\t'env schema --generate -e dev -m debug unit',\r\n\t\t\t'Updates JSON schema',\r\n\t\t);\r\n\t},\r\n\thandler: async (argv) => {\r\n\t\targv.ci = true;\r\n\r\n\t\tconst results = await loadVariablesFromProviders(argv.providers, argv);\r\n\r\n\t\tconst schema = await generateSchemaFrom(results, argv);\r\n\r\n\t\tlogger.silly('schema:', schema);\r\n\t\tui.action('📐', `schema updated → ${argv.schemaFile}`);\r\n\t},\r\n};\r\n"],"mappings":";;;;;AAcA,IAAa,IAAsD;CAClE,SAAS;CACT,UAAU;CACV,UAAU,MACF,EAAQ,QACd,8CACA,qBACD;CAED,SAAS,OAAO,MAAS;EACxB,EAAK,KAAK;EAIV,IAAM,IAAS,MAAM,EAAmB,MAFlB,EAA2B,EAAK,WAAW,CAAI,GAEpB,CAAI;EAGrD,AADA,EAAO,MAAM,WAAW,CAAM,GAC9B,EAAG,OAAO,MAAM,oBAAoB,EAAK,YAAY;CACtD;AACD"}
package/exec.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"exec.js","names":[],"sources":["../src/exec.ts"],"sourcesContent":["import { readFileSync } from 'node:fs';\r\nimport { fileURLToPath } from 'node:url';\r\nimport pc from 'picocolors';\r\nimport yargs from 'yargs';\r\nimport type { Arguments } from 'yargs';\r\nimport { Parser } from 'yargs/helpers';\r\nimport { args } from './arguments.js';\r\nimport type { CommandArguments } from './arguments.js';\r\nimport {\r\n\tenvCommand,\r\n\texportCommand,\r\n\tpullCommand,\r\n\tpushCommand,\r\n\tschemaCommand,\r\n} from './commands/index.js';\r\nimport { IntegratedProviders } from './providers/index.js';\r\nimport {\r\n\tconfigureLogger,\r\n\tgetSubcommand,\r\n\tinterpolateJson,\r\n\tloadConfigFile,\r\n\tloadProjectInfo,\r\n\tloadSchemaFile,\r\n\tlogger,\r\n\tresolvePath,\r\n\tui,\r\n} from './utils/index.js';\r\n\r\ntype Alias = string[] | string;\r\n\r\n/**\r\n * Preload basic config from command line and config file.\r\n *\r\n * @param {string[]} rawArgv process.argv\r\n * @param {Partial<yargsParser.Configuration>} parser yargs parser config\r\n * @param {[string, string]} delimiters\r\n *\r\n * @returns {Promise<Partial<CommandArguments>>} preloaded config\r\n */\r\nasync function preloadConfig(\r\n\trawArgv: string[],\r\n\tparser: Record<string, unknown>,\r\n\tdelimiters: [string, string],\r\n): Promise<Partial<CommandArguments>> {\r\n\t// preload base config\r\n\tconst preloadedArgv = Parser.detailed(rawArgv, {\r\n\t\tarray: ['modes', 'logMaskAnyRegEx', 'logMaskValuesOfKeys'],\r\n\t\tboolean: ['help'],\r\n\t\tconfiguration: parser as any,\r\n\t\tstring: ['root', 'env', 'configFile', 'schemaFile', 'logLevel'],\r\n\t\talias: {\r\n\t\t\tconfigFile: args.configFile.alias as Alias,\r\n\t\t\tenv: args.env.alias as Alias,\r\n\t\t\tlogLevel: args.logLevel.alias as Alias,\r\n\t\t\tlogMaskAnyRegEx: args.logMaskAnyRegEx.alias as Alias,\r\n\t\t\tlogMaskValuesOfKeys: args.logMaskValuesOfKeys.alias as Alias,\r\n\t\t\tmodes: args.modes.alias as Alias,\r\n\t\t},\r\n\t\tdefault: {\r\n\t\t\tconfigFile: args.configFile.default,\r\n\t\t\troot: args.root.default,\r\n\t\t},\r\n\t}).argv;\r\n\r\n\t// loads configuration file\r\n\tawait loadConfigFile(preloadedArgv, delimiters);\r\n\r\n\tpreloadedArgv.logLevel ??= args.logLevel.default;\r\n\tpreloadedArgv.logMaskAnyRegEx ??= args.logMaskAnyRegEx.default;\r\n\tpreloadedArgv.logMaskValuesOfKeys ??= args.logMaskValuesOfKeys.default;\r\n\tpreloadedArgv.providers ??= args.providers.default;\r\n\r\n\tconst { logLevel, logMaskAnyRegEx, logMaskValuesOfKeys } = preloadedArgv;\r\n\r\n\t// logging level\r\n\tconfigureLogger(logger, {\r\n\t\tmaskAnyRegEx: logMaskAnyRegEx,\r\n\t\tmaskValuesOfKeys: logMaskValuesOfKeys,\r\n\t\tminLevel: logLevel,\r\n\t});\r\n\r\n\treturn preloadedArgv;\r\n}\r\n\r\n/**\r\n * Command preprocessing and lib info\r\n * reading from package.json.\r\n * Preloads config file and setup basic config.\r\n *\r\n * @param {string[]} rawArgv process.argv\r\n */\r\nexport async function exec(rawArgv: string[]) {\r\n\t// reads some lib base config from package.json\r\n\tconst pkg = JSON.parse(\r\n\t\treadFileSync(\r\n\t\t\tfileURLToPath(new URL('package.json', import.meta.url)),\r\n\t\t\t'utf8',\r\n\t\t),\r\n\t) as { config: Record<string, any>; version: string };\r\n\tconst { config, version } = pkg;\r\n\r\n\t// execs yargs\r\n\tconst subcommand = getSubcommand(rawArgv, config.delimiters.subcommand);\r\n\r\n\tconst preloadedArgv = await preloadConfig(\r\n\t\trawArgv,\r\n\t\tconfig.parser,\r\n\t\tconfig.delimiters.template,\r\n\t);\r\n\r\n\tconst { env, help, modes, providers } = preloadedArgv;\r\n\r\n\tif (help) build(rawArgv, preloadedArgv, subcommand, config, version);\r\n\r\n\tif (!Array.isArray(providers) || providers.length === 0) {\r\n\t\tlogger.error('no providers found');\r\n\r\n\t\tprocess.exit(1);\r\n\t}\r\n\r\n\tui.header(version, env, modes);\r\n\r\n\t// read loaders from config\r\n\tfor (const provider of providers!) {\r\n\t\ttry {\r\n\t\t\tlogger.debug(`using ${pc.yellow(provider.path)} provider`);\r\n\r\n\t\t\tif (!provider.type || provider.type === 'integrated') {\r\n\t\t\t\tprovider.handler = IntegratedProviders[provider.path];\r\n\t\t\t} else {\r\n\t\t\t\tconst { default: module } = await import(\r\n\t\t\t\t\tprovider.type === 'module'\r\n\t\t\t\t\t\t? provider.path\r\n\t\t\t\t\t\t: resolvePath(provider.path)\r\n\t\t\t\t);\r\n\r\n\t\t\t\tprovider.handler = module;\r\n\t\t\t}\r\n\t\t} catch {\r\n\t\t\tlogger.error(\r\n\t\t\t\t`${pc.yellow(\r\n\t\t\t\t\tprovider.path,\r\n\t\t\t\t)} provider not found or not compatible`,\r\n\t\t\t);\r\n\r\n\t\t\tprocess.exit(1);\r\n\t\t}\r\n\t}\r\n\r\n\tbuild(rawArgv, preloadedArgv, subcommand, config, version);\r\n}\r\n\r\n/**\r\n * Builds commands and execs Yargs.\r\n *\r\n * @param {string[]} rawArgv process.argv.slice(2)\r\n * @param {Partial<Arguments<CommandArguments>>} preloadedArgv\r\n * @param {string[]} subcommand subcommand for wrap if exists\r\n * @param {Record<string, any>} config lib config from package.json\r\n * @param {string} version lib version from package.json\r\n */\r\nfunction build(\r\n\trawArgv: string[],\r\n\tpreloadedArgv: Partial<Arguments<CommandArguments>>,\r\n\tsubcommand: string[],\r\n\tconfig: Record<string, any>,\r\n\tversion = 'unknown',\r\n): void {\r\n\tconst versionTag = pc.dim(`v${version}`);\r\n\tconst banner = [\r\n\t\t'',\r\n\t\t`${pc.bold(pc.yellow('⚡ env'))} ${versionTag} ${pc.dim('· environment variables made easy')}`,\r\n\t\t'',\r\n\t\t`${pc.bold('Usage:')} $0 [command] [options..] ${pc.dim(': <subcmd> :')} [options..]`,\r\n\t].join('\\n');\r\n\tconst epilog = [\r\n\t\t`${pc.dim('Run')} ${pc.cyan('env <command> --help')} ${pc.dim('for command-specific options.')}`,\r\n\t\t`${pc.dim('Use')} ${pc.cyan('--log debug')} ${pc.dim('to inspect the resolved environment (secrets stay masked).')}`,\r\n\t].join('\\n');\r\n\r\n\tconst builder = yargs(rawArgv)\r\n\t\t.strict()\r\n\t\t.scriptName('env')\r\n\t\t.version(version)\r\n\t\t.detectLocale(false)\r\n\t\t.showHelpOnFail(false)\r\n\t\t.parserConfiguration(config.parser)\r\n\t\t.wrap(Math.min(110, process.stdout.columns ?? 110))\r\n\t\t.usage(banner)\r\n\t\t.epilog(epilog)\r\n\t\t.options(args)\r\n\t\t.middleware(async (argv): Promise<void> => {\r\n\t\t\t// in case of subcommand argument for main\r\n\t\t\tif (subcommand?.length > 0) argv.subcmd = subcommand;\r\n\r\n\t\t\t// merges preloaded args\r\n\t\t\tObject.assign(argv, preloadedArgv);\r\n\r\n\t\t\tlogger.silly(\r\n\t\t\t\t'interpolating arguments surrounded by',\r\n\t\t\t\tpc.bold(\r\n\t\t\t\t\tpc.yellow(\r\n\t\t\t\t\t\t`${config.delimiters.template[0]} ${config.delimiters.template[1]}`,\r\n\t\t\t\t\t),\r\n\t\t\t\t),\r\n\t\t\t);\r\n\r\n\t\t\tconst subcmdAux = argv.subcmd as string[];\r\n\t\t\t// applies string templating with current vars\r\n\t\t\tinterpolateJson(argv, argv, config.delimiters.template);\r\n\r\n\t\t\tif (Array.isArray(argv.subcmd)) {\r\n\t\t\t\t// fix for argv interpolation pre env interpolation for subcommand\r\n\t\t\t\tfor (const index in argv.subcmd) {\r\n\t\t\t\t\tif (argv.subcmd[index]?.includes('undefined'))\r\n\t\t\t\t\t\targv.subcmd[index] = subcmdAux[index];\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tlogger.silly('config loaded:', argv);\r\n\r\n\t\t\t// loads environment JSON schema if exists\r\n\t\t\t// and current project info from package.json\r\n\t\t\t[argv.projectInfo, argv.schema] = await Promise.all([\r\n\t\t\t\tloadProjectInfo((argv.packageJson ?? argv.pkg) as string),\r\n\t\t\t\tloadSchemaFile(argv, config.delimiters.template),\r\n\t\t\t]);\r\n\r\n\t\t\tif (argv.schemaValidate) {\r\n\t\t\t\targv.schemaValidate = !!argv.schema;\r\n\r\n\t\t\t\tif (argv.schemaValidate)\r\n\t\t\t\t\tlogger.silly('schema loaded:', argv.schema);\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t// integrated commands builder\r\n\tbuilder.command(envCommand);\r\n\tbuilder.command(exportCommand);\r\n\tbuilder.command(pullCommand);\r\n\tbuilder.command(pushCommand);\r\n\tbuilder.command(schemaCommand);\r\n\r\n\tconst { providers } = preloadedArgv;\r\n\r\n\t// extends command from plugins\r\n\tfor (const { handler } of providers!)\r\n\t\tif (handler?.builder) handler.builder(builder);\r\n\r\n\t// executes command processing\r\n\tvoid builder.parse();\r\n}\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAuCA,eAAe,EACd,GACA,GACA,GACqC;CAErC,IAAM,IAAgB,EAAO,SAAS,GAAS;EAC9C,OAAO;GAAC;GAAS;GAAmB;EAAqB;EACzD,SAAS,CAAC,MAAM;EAChB,eAAe;EACf,QAAQ;GAAC;GAAQ;GAAO;GAAc;GAAc;EAAU;EAC9D,OAAO;GACN,YAAY,EAAK,WAAW;GAC5B,KAAK,EAAK,IAAI;GACd,UAAU,EAAK,SAAS;GACxB,iBAAiB,EAAK,gBAAgB;GACtC,qBAAqB,EAAK,oBAAoB;GAC9C,OAAO,EAAK,MAAM;EACnB;EACA,SAAS;GACR,YAAY,EAAK,WAAW;GAC5B,MAAM,EAAK,KAAK;EACjB;CACD,CAAC,EAAE;CAQH,AALA,MAAM,EAAe,GAAe,CAAU,GAE9C,EAAc,aAAa,EAAK,SAAS,SACzC,EAAc,oBAAoB,EAAK,gBAAgB,SACvD,EAAc,wBAAwB,EAAK,oBAAoB,SAC/D,EAAc,cAAc,EAAK,UAAU;CAE3C,IAAM,EAAE,aAAU,oBAAiB,2BAAwB;CAS3D,OANA,EAAgB,GAAQ;EACvB,cAAc;EACd,kBAAkB;EAClB,UAAU;CACX,CAAC,GAEM;AACR;AASA,eAAsB,EAAK,GAAmB;CAQ7C,IAAM,EAAE,WAAQ,eANJ,KAAK,MAChB,EACC,EAAc,IAAA,IAAA,gBAAA,KAAA,OAAA,KAAA,GAAA,CAAwC,GACtD,MACD,CAE2B,GAGtB,IAAa,EAAc,GAAS,EAAO,WAAW,UAAU,GAEhE,IAAgB,MAAM,EAC3B,GACA,EAAO,QACP,EAAO,WAAW,QACnB,GAEM,EAAE,QAAK,SAAM,UAAO,iBAAc;CAUxC,AARI,KAAM,EAAM,GAAS,GAAe,GAAY,GAAQ,CAAO,IAE/D,CAAC,MAAM,QAAQ,CAAS,KAAK,EAAU,WAAW,OACrD,EAAO,MAAM,oBAAoB,GAEjC,QAAQ,KAAK,CAAC,IAGf,EAAG,OAAO,GAAS,GAAK,CAAK;CAG7B,KAAK,IAAM,KAAY,GACtB,IAAI;EAGH,IAFA,EAAO,MAAM,SAAS,EAAG,OAAO,EAAS,IAAI,EAAE,UAAU,GAErD,CAAC,EAAS,QAAQ,EAAS,SAAS,cACvC,EAAS,UAAU,EAAoB,EAAS;OAC1C;GACN,IAAM,EAAE,SAAS,MAAW,OAC3B,EAAS,SAAS,WAAA,OACf,EAAS,QAAA,OACT,EAAY,EAAS,IAAI;GAG7B,EAAS,UAAU;EACpB;CACD,QAAQ;EAOP,AANA,EAAO,MACN,GAAG,EAAG,OACL,EAAS,IACV,EAAE,sCACH,GAEA,QAAQ,KAAK,CAAC;CACf;CAGD,EAAM,GAAS,GAAe,GAAY,GAAQ,CAAO;AAC1D;AAWA,SAAS,EACR,GACA,GACA,GACA,GACA,IAAU,WACH;CACP,IAAM,IAAa,EAAG,IAAI,IAAI,GAAS,GACjC,IAAS;EACd;EACA,GAAG,EAAG,KAAK,EAAG,OAAO,OAAO,CAAC,EAAE,GAAG,EAAW,IAAI,EAAG,IAAI,mCAAmC;EAC3F;EACA,GAAG,EAAG,KAAK,QAAQ,EAAE,4BAA4B,EAAG,IAAI,cAAc,EAAE;CACzE,EAAE,KAAK,IAAI,GACL,IAAS,CACd,GAAG,EAAG,IAAI,KAAK,EAAE,GAAG,EAAG,KAAK,sBAAsB,EAAE,GAAG,EAAG,IAAI,+BAA+B,KAC7F,GAAG,EAAG,IAAI,KAAK,EAAE,GAAG,EAAG,KAAK,aAAa,EAAE,GAAG,EAAG,IAAI,4DAA4D,GAClH,EAAE,KAAK,IAAI,GAEL,IAAU,EAAM,CAAO,EAC3B,OAAO,EACP,WAAW,KAAK,EAChB,QAAQ,CAAO,EACf,aAAa,EAAK,EAClB,eAAe,EAAK,EACpB,oBAAoB,EAAO,MAAM,EACjC,KAAK,KAAK,IAAI,KAAK,QAAQ,OAAO,WAAW,GAAG,CAAC,EACjD,MAAM,CAAM,EACZ,OAAO,CAAM,EACb,QAAQ,CAAI,EACZ,WAAW,OAAO,MAAwB;EAO1C,AALI,GAAY,SAAS,MAAG,EAAK,SAAS,IAG1C,OAAO,OAAO,GAAM,CAAa,GAEjC,EAAO,MACN,yCACA,EAAG,KACF,EAAG,OACF,GAAG,EAAO,WAAW,SAAS,GAAG,GAAG,EAAO,WAAW,SAAS,IAChE,CACD,CACD;EAEA,IAAM,IAAY,EAAK;EAIvB,IAFA,EAAgB,GAAM,GAAM,EAAO,WAAW,QAAQ,GAElD,MAAM,QAAQ,EAAK,MAAM,QAEvB,IAAM,KAAS,EAAK,QACxB,AAAI,EAAK,OAAO,IAAQ,SAAS,WAAW,MAC3C,EAAK,OAAO,KAAS,EAAU;EAalC,AATA,EAAO,MAAM,kBAAkB,CAAI,GAInC,CAAC,EAAK,aAAa,EAAK,UAAU,MAAM,QAAQ,IAAI,CACnD,EAAiB,EAAK,eAAe,EAAK,GAAc,GACxD,EAAe,GAAM,EAAO,WAAW,QAAQ,CAChD,CAAC,GAEG,EAAK,mBACR,EAAK,iBAAiB,CAAC,CAAC,EAAK,QAEzB,EAAK,kBACR,EAAO,MAAM,kBAAkB,EAAK,MAAM;CAE7C,CAAC;CAOF,AAJA,EAAQ,QAAQ,CAAU,GAC1B,EAAQ,QAAQ,CAAa,GAC7B,EAAQ,QAAQ,CAAW,GAC3B,EAAQ,QAAQ,CAAW,GAC3B,EAAQ,QAAQ,CAAa;CAE7B,IAAM,EAAE,iBAAc;CAGtB,KAAK,IAAM,EAAE,gBAAa,GACzB,AAAI,GAAS,WAAS,EAAQ,QAAQ,CAAO;CAG9C,EAAa,MAAM;AACpB"}
1
+ {"version":3,"file":"exec.js","names":[],"sources":["../src/exec.ts"],"sourcesContent":["import { readFileSync } from 'node:fs';\r\nimport { fileURLToPath } from 'node:url';\r\nimport pc from 'picocolors';\r\nimport yargs from 'yargs';\r\nimport type { Arguments } from 'yargs';\r\nimport { Parser } from 'yargs/helpers';\r\nimport { args } from './arguments.js';\r\nimport type { CommandArguments } from './arguments.js';\r\nimport {\r\n\tenvCommand,\r\n\texportCommand,\r\n\tpullCommand,\r\n\tpushCommand,\r\n\tschemaCommand,\r\n} from './commands/index.js';\r\nimport { IntegratedProviders } from './providers/index.js';\r\nimport {\r\n\tconfigureLogger,\r\n\tgetSubcommand,\r\n\tinterpolateJson,\r\n\tloadConfigFile,\r\n\tloadProjectInfo,\r\n\tloadSchemaFile,\r\n\tlogger,\r\n\tresolvePath,\r\n\tui,\r\n} from './utils/index.js';\r\n\r\ntype Alias = string[] | string;\r\n\r\n/**\r\n * Preload basic config from command line and config file.\r\n *\r\n * @param {string[]} rawArgv process.argv\r\n * @param {Partial<yargsParser.Configuration>} parser yargs parser config\r\n * @param {[string, string]} delimiters\r\n *\r\n * @returns {Promise<Partial<CommandArguments>>} preloaded config\r\n */\r\nasync function preloadConfig(\r\n\trawArgv: string[],\r\n\tparser: Record<string, unknown>,\r\n\tdelimiters: [string, string],\r\n): Promise<Partial<CommandArguments>> {\r\n\t// preload base config\r\n\tconst preloadedArgv = Parser.detailed(rawArgv, {\r\n\t\tarray: ['modes', 'logMaskAnyRegEx', 'logMaskValuesOfKeys'],\r\n\t\tboolean: ['help'],\r\n\t\tconfiguration: parser as any,\r\n\t\tstring: ['root', 'env', 'configFile', 'schemaFile', 'logLevel'],\r\n\t\talias: {\r\n\t\t\tconfigFile: args.configFile.alias as Alias,\r\n\t\t\tenv: args.env.alias as Alias,\r\n\t\t\tlogLevel: args.logLevel.alias as Alias,\r\n\t\t\tlogMaskAnyRegEx: args.logMaskAnyRegEx.alias as Alias,\r\n\t\t\tlogMaskValuesOfKeys: args.logMaskValuesOfKeys.alias as Alias,\r\n\t\t\tmodes: args.modes.alias as Alias,\r\n\t\t},\r\n\t\tdefault: {\r\n\t\t\tconfigFile: args.configFile.default,\r\n\t\t\troot: args.root.default,\r\n\t\t},\r\n\t}).argv;\r\n\r\n\t// loads configuration file\r\n\tawait loadConfigFile(preloadedArgv, delimiters);\r\n\r\n\tpreloadedArgv.logLevel ??= args.logLevel.default;\r\n\tpreloadedArgv.logMaskAnyRegEx ??= args.logMaskAnyRegEx.default;\r\n\tpreloadedArgv.logMaskValuesOfKeys ??= args.logMaskValuesOfKeys.default;\r\n\tpreloadedArgv.providers ??= args.providers.default;\r\n\r\n\tconst { logLevel, logMaskAnyRegEx, logMaskValuesOfKeys } = preloadedArgv;\r\n\r\n\t// logging level\r\n\tconfigureLogger(logger, {\r\n\t\tmaskAnyRegEx: logMaskAnyRegEx,\r\n\t\tmaskValuesOfKeys: logMaskValuesOfKeys,\r\n\t\tminLevel: logLevel,\r\n\t});\r\n\r\n\treturn preloadedArgv;\r\n}\r\n\r\n/**\r\n * Command preprocessing and lib info\r\n * reading from package.json.\r\n * Preloads config file and setup basic config.\r\n *\r\n * @param {string[]} rawArgv process.argv\r\n */\r\nexport async function exec(rawArgv: string[]) {\r\n\t// reads some lib base config from package.json\r\n\tconst pkg = JSON.parse(\r\n\t\treadFileSync(\r\n\t\t\tfileURLToPath(new URL('package.json', import.meta.url)),\r\n\t\t\t'utf8',\r\n\t\t),\r\n\t) as { config: Record<string, any>; version: string };\r\n\tconst { config, version } = pkg;\r\n\r\n\t// execs yargs\r\n\tconst subcommand = getSubcommand(rawArgv, config.delimiters.subcommand);\r\n\r\n\tconst preloadedArgv = await preloadConfig(\r\n\t\trawArgv,\r\n\t\tconfig.parser,\r\n\t\tconfig.delimiters.template,\r\n\t);\r\n\r\n\tconst { env, help, modes, providers } = preloadedArgv;\r\n\r\n\tif (help) build(rawArgv, preloadedArgv, subcommand, config, version);\r\n\r\n\tif (!Array.isArray(providers) || providers.length === 0) {\r\n\t\tlogger.error('no providers found');\r\n\r\n\t\tprocess.exit(1);\r\n\t}\r\n\r\n\tui.header(version, env, modes);\r\n\r\n\t// read loaders from config\r\n\tfor (const provider of providers!) {\r\n\t\ttry {\r\n\t\t\tlogger.debug(`using ${pc.yellow(provider.path)} provider`);\r\n\r\n\t\t\tif (!provider.type || provider.type === 'integrated') {\r\n\t\t\t\tprovider.handler = IntegratedProviders[provider.path];\r\n\t\t\t} else {\r\n\t\t\t\tconst { default: module } = await import(\r\n\t\t\t\t\tprovider.type === 'module'\r\n\t\t\t\t\t\t? provider.path\r\n\t\t\t\t\t\t: resolvePath(provider.path)\r\n\t\t\t\t);\r\n\r\n\t\t\t\tprovider.handler = module;\r\n\t\t\t}\r\n\t\t} catch {\r\n\t\t\tlogger.error(\r\n\t\t\t\t`${pc.yellow(\r\n\t\t\t\t\tprovider.path,\r\n\t\t\t\t)} provider not found or not compatible`,\r\n\t\t\t);\r\n\r\n\t\t\tprocess.exit(1);\r\n\t\t}\r\n\t}\r\n\r\n\tbuild(rawArgv, preloadedArgv, subcommand, config, version);\r\n}\r\n\r\n/**\r\n * Builds commands and execs Yargs.\r\n *\r\n * @param {string[]} rawArgv process.argv.slice(2)\r\n * @param {Partial<Arguments<CommandArguments>>} preloadedArgv\r\n * @param {string[]} subcommand subcommand for wrap if exists\r\n * @param {Record<string, any>} config lib config from package.json\r\n * @param {string} version lib version from package.json\r\n */\r\nfunction build(\r\n\trawArgv: string[],\r\n\tpreloadedArgv: Partial<Arguments<CommandArguments>>,\r\n\tsubcommand: string[],\r\n\tconfig: Record<string, any>,\r\n\tversion = 'unknown',\r\n): void {\r\n\tconst versionTag = pc.dim(`v${version}`);\r\n\tconst banner = [\r\n\t\t'',\r\n\t\t`${pc.bold(pc.yellow('⚡ env'))} ${versionTag} ${pc.dim('· environment variables made easy')}`,\r\n\t\t'',\r\n\t\t`${pc.bold('Usage:')} $0 [command] [options..] ${pc.dim(': <subcmd> :')} [options..]`,\r\n\t].join('\\n');\r\n\tconst epilog = [\r\n\t\t`${pc.dim('Run')} ${pc.cyan('env <command> --help')} ${pc.dim('for command-specific options.')}`,\r\n\t\t`${pc.dim('Use')} ${pc.cyan('--log debug')} ${pc.dim('to inspect the resolved environment (secrets stay masked).')}`,\r\n\t].join('\\n');\r\n\r\n\tconst builder = yargs(rawArgv)\r\n\t\t.strict()\r\n\t\t.scriptName('env')\r\n\t\t.version(version)\r\n\t\t.detectLocale(false)\r\n\t\t.showHelpOnFail(false)\r\n\t\t.parserConfiguration(config.parser)\r\n\t\t.wrap(Math.min(110, process.stdout.columns ?? 110))\r\n\t\t.usage(banner)\r\n\t\t.epilog(epilog)\r\n\t\t.options(args)\r\n\t\t.middleware(async (argv): Promise<void> => {\r\n\t\t\t// in case of subcommand argument for main\r\n\t\t\tif (subcommand?.length > 0) argv.subcmd = subcommand;\r\n\r\n\t\t\t// merges preloaded args\r\n\t\t\tObject.assign(argv, preloadedArgv);\r\n\r\n\t\t\tlogger.silly(\r\n\t\t\t\t'interpolating arguments surrounded by',\r\n\t\t\t\tpc.bold(\r\n\t\t\t\t\tpc.yellow(\r\n\t\t\t\t\t\t`${config.delimiters.template[0]} ${config.delimiters.template[1]}`,\r\n\t\t\t\t\t),\r\n\t\t\t\t),\r\n\t\t\t);\r\n\r\n\t\t\tconst subcmdAux = argv.subcmd as string[];\r\n\t\t\t// applies string templating with current vars\r\n\t\t\tinterpolateJson(argv, argv, config.delimiters.template);\r\n\r\n\t\t\tif (Array.isArray(argv.subcmd)) {\r\n\t\t\t\t// fix for argv interpolation pre env interpolation for subcommand\r\n\t\t\t\tfor (const index in argv.subcmd) {\r\n\t\t\t\t\tif (argv.subcmd[index]?.includes('undefined'))\r\n\t\t\t\t\t\targv.subcmd[index] = subcmdAux[index];\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tlogger.silly('config loaded:', argv);\r\n\r\n\t\t\t// loads environment JSON schema if exists\r\n\t\t\t// and current project info from package.json\r\n\t\t\t[argv.projectInfo, argv.schema] = await Promise.all([\r\n\t\t\t\tloadProjectInfo((argv.packageJson ?? argv.pkg) as string),\r\n\t\t\t\tloadSchemaFile(argv, config.delimiters.template),\r\n\t\t\t]);\r\n\r\n\t\t\tif (argv.schemaValidate) {\r\n\t\t\t\targv.schemaValidate = !!argv.schema;\r\n\r\n\t\t\t\tif (argv.schemaValidate)\r\n\t\t\t\t\tlogger.silly('schema loaded:', argv.schema);\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t// integrated commands builder\r\n\tbuilder.command(envCommand);\r\n\tbuilder.command(exportCommand);\r\n\tbuilder.command(pullCommand);\r\n\tbuilder.command(pushCommand);\r\n\tbuilder.command(schemaCommand);\r\n\r\n\tconst { providers } = preloadedArgv;\r\n\r\n\t// extends command from plugins\r\n\tfor (const { handler } of providers!)\r\n\t\tif (handler?.builder) handler.builder(builder);\r\n\r\n\t// executes command processing\r\n\tvoid builder.parse();\r\n}\r\n"],"mappings":"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"}
package/main.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"main.js","names":[],"sources":["../src/main.ts"],"sourcesContent":["import { exec } from './exec.js';\nimport { normalizeRawArgv } from './utils/index.js';\n\nvoid exec(normalizeRawArgv(process.argv));\n"],"mappings":";;;;;AAGK,EAAK,EAAiB,QAAQ,IAAI,CAAC"}
1
+ {"version":3,"file":"main.js","names":[],"sources":["../src/main.ts"],"sourcesContent":["import { exec } from './exec.js';\r\nimport { normalizeRawArgv } from './utils/index.js';\r\n\r\nvoid exec(normalizeRawArgv(process.argv));\r\n"],"mappings":";;;;;AAGK,EAAK,EAAiB,QAAQ,IAAI,CAAC"}
package/package.json CHANGED
@@ -1,109 +1,110 @@
1
1
  {
2
- "version": "3.0.1",
3
- "project": "common",
4
- "name": "@calvear/env",
5
- "type": "module",
6
- "title": "Environment Variables CLI Tool",
7
- "description": "Extensible environment variables handler for NodeJS apps",
8
- "author": "Alvear Candia, Cristopher Alejandro <calvear93@gmail.com>",
9
- "repository": "https://github.com/calvear93/env",
10
- "license": "MIT",
11
- "private": false,
12
- "keywords": [
13
- "env",
14
- "node",
15
- "cli",
16
- "typescript"
17
- ],
18
- "dependencies": {
19
- "ajv": "^8.20.0",
20
- "ajv-formats": "^3.0.1",
21
- "ci-info": "^4.4.0",
22
- "merge-deep": "^3.0.3",
23
- "picocolors": "^1.1.1",
24
- "subslate": "^1.0.0",
25
- "to-json-schema": "^0.2.5",
26
- "tslog": "^4.10.2",
27
- "yargs": "^18.0.0"
28
- },
29
- "devDependencies": {
30
- "@types/merge-deep": "^3.0.3",
31
- "@types/node": "^25.9.1",
32
- "@types/to-json-schema": "^0.2.4",
33
- "@types/yargs": "^17.0.35",
34
- "@vitest/coverage-v8": "^4.1.7",
35
- "@vitest/eslint-plugin": "^1.6.18",
36
- "copyfiles": "^2.4.1",
37
- "del-cli": "^7.0.0",
38
- "eslint": "^10.4.1",
39
- "eslint-config-prettier": "^10.1.8",
40
- "eslint-plugin-perfectionist": "^5.9.0",
41
- "eslint-plugin-prettier": "^5.5.6",
42
- "eslint-plugin-promise": "^7.3.0",
43
- "eslint-plugin-regexp": "^3.1.0",
44
- "eslint-plugin-sonarjs": "^4.0.3",
45
- "eslint-plugin-unicorn": "^64.0.0",
46
- "globals": "^17.6.0",
47
- "prettier": "^3.8.3",
48
- "typescript": "^6.0.3",
49
- "typescript-eslint": "^8.60.0",
50
- "vite": "^8.0.14",
51
- "vite-plugin-dts": "^5.0.1",
52
- "vitest": "^4.1.7"
53
- },
54
- "exports": {
55
- ".": {
56
- "types": "./index.d.ts",
57
- "import": "./index.js"
58
- },
59
- "./utils": {
60
- "types": "./utils/index.d.ts",
61
- "import": "./utils/index.js"
62
- },
63
- "./package.json": "./package.json"
64
- },
65
- "main": "index.js",
66
- "types": "index.d.ts",
67
- "bin": {
68
- "env": "main.js"
69
- },
70
- "engines": {
71
- "node": ">=20",
72
- "pnpm": ">=9"
73
- },
74
- "config": {
75
- "delimiters": {
76
- "template": [
77
- "[[",
78
- "]]"
79
- ],
80
- "subcommand": [
81
- ":",
82
- ":"
83
- ]
84
- },
85
- "parser": {
86
- "short-option-groups": true,
87
- "camel-case-expansion": false,
88
- "dot-notation": true,
89
- "parse-numbers": true,
90
- "boolean-negation": false
91
- }
92
- },
93
- "scripts": {
94
- "build": "pnpm prebuild && vite build && pnpm postbuild",
95
- "test": "vitest run --project unit",
96
- "test:watch": "vitest --project unit",
97
- "test:cov": "vitest run --project unit --coverage",
98
- "test:int": "vitest run --project integration",
99
- "typecheck": "tsc --noEmit",
100
- "lint": "eslint --cache --cache-location node_modules/.cache/eslint/ .",
101
- "lint:fix": "eslint --fix --cache --cache-location node_modules/.cache/eslint/ .",
102
- "format": "prettier --cache --write \"**/*.{ts,cts,mts,js,cjs,mjs,json,md,yml,yaml}\"",
103
- "format:check": "prettier --cache --check \"**/*.{ts,cts,mts,js,cjs,mjs,json,md,yml,yaml}\"",
104
- "pub": "pnpm typecheck && pnpm lint && pnpm test:cov && pnpm build && pnpm publish dist --access public --no-git-checks",
105
- "pub:alpha": "pnpm typecheck && pnpm lint && pnpm test:cov && pnpm build && pnpm publish dist --tag alpha --access public --no-git-checks",
106
- "prebuild": "del-cli dist",
107
- "postbuild": "copyfiles package.json README.md LICENSE.md CHANGELOG.md schemas/env.schema.json schemas/settings.schema.json assets/* dist"
108
- }
109
- }
2
+ "version": "3.1.1",
3
+ "project": "common",
4
+ "name": "@calvear/env",
5
+ "type": "module",
6
+ "title": "Environment Variables CLI Tool",
7
+ "description": "Extensible environment variables handler for NodeJS apps",
8
+ "author": "Alvear Candia, Cristopher Alejandro <calvear93@gmail.com>",
9
+ "repository": "https://github.com/calvear93/env",
10
+ "license": "MIT",
11
+ "private": false,
12
+ "keywords": [
13
+ "env",
14
+ "node",
15
+ "cli",
16
+ "typescript"
17
+ ],
18
+ "scripts": {
19
+ "build": "pnpm prebuild && vite build && pnpm postbuild",
20
+ "test": "vitest run --project unit",
21
+ "test:watch": "vitest --project unit",
22
+ "test:cov": "vitest run --project unit --coverage",
23
+ "test:int": "vitest run --project integration",
24
+ "run:test": "node dist/main.js --root tests/env --log debug -e dev : node tests/run.js",
25
+ "typecheck": "tsc --noEmit",
26
+ "lint": "eslint --cache --cache-location node_modules/.cache/eslint/ .",
27
+ "lint:fix": "eslint --fix --cache --cache-location node_modules/.cache/eslint/ .",
28
+ "format": "prettier --cache --write \"**/*.{ts,cts,mts,js,cjs,mjs,json,md,yml,yaml}\"",
29
+ "format:check": "prettier --cache --check \"**/*.{ts,cts,mts,js,cjs,mjs,json,md,yml,yaml}\"",
30
+ "pub": "pnpm typecheck && pnpm lint && pnpm test:cov && pnpm build && npm publish ./dist --access public --no-git-checks",
31
+ "pub:alpha": "pnpm typecheck && pnpm lint && pnpm test:cov && pnpm build && pnpm publish ./dist --tag alpha --access public --no-git-checks",
32
+ "prebuild": "del-cli dist",
33
+ "postbuild": "copyfiles package.json README.md LICENSE.md CHANGELOG.md schemas/env.schema.json schemas/settings.schema.json assets/* dist"
34
+ },
35
+ "dependencies": {
36
+ "ajv": "^8.20.0",
37
+ "ajv-formats": "^3.0.1",
38
+ "ci-info": "^4.4.0",
39
+ "merge-deep": "^3.0.3",
40
+ "picocolors": "^1.1.1",
41
+ "subslate": "^1.0.0",
42
+ "to-json-schema": "^0.2.5",
43
+ "tslog": "^4.10.2",
44
+ "yargs": "^18.0.0"
45
+ },
46
+ "devDependencies": {
47
+ "@types/merge-deep": "^3.0.3",
48
+ "@types/node": "^26.0.0",
49
+ "@types/to-json-schema": "^0.2.4",
50
+ "@types/yargs": "^17.0.35",
51
+ "@vitest/coverage-v8": "^4.1.9",
52
+ "@vitest/eslint-plugin": "^1.6.20",
53
+ "copyfiles": "^2.4.1",
54
+ "del-cli": "^7.0.0",
55
+ "eslint": "^10.5.0",
56
+ "eslint-config-prettier": "^10.1.8",
57
+ "eslint-plugin-perfectionist": "^5.9.1",
58
+ "eslint-plugin-prettier": "^5.5.6",
59
+ "eslint-plugin-promise": "^7.3.0",
60
+ "eslint-plugin-regexp": "^3.1.0",
61
+ "eslint-plugin-sonarjs": "^4.1.0",
62
+ "eslint-plugin-unicorn": "^68.0.0",
63
+ "globals": "^17.7.0",
64
+ "prettier": "^3.8.4",
65
+ "typescript": "^6.0.3",
66
+ "typescript-eslint": "^8.62.0",
67
+ "vite": "^8.1.0",
68
+ "vite-plugin-dts": "^5.0.3",
69
+ "vitest": "^4.1.9"
70
+ },
71
+ "exports": {
72
+ ".": {
73
+ "types": "./index.d.ts",
74
+ "import": "./index.js"
75
+ },
76
+ "./utils": {
77
+ "types": "./utils/index.d.ts",
78
+ "import": "./utils/index.js"
79
+ },
80
+ "./package.json": "./package.json"
81
+ },
82
+ "main": "index.js",
83
+ "types": "index.d.ts",
84
+ "bin": {
85
+ "env": "main.js"
86
+ },
87
+ "engines": {
88
+ "node": ">=20",
89
+ "pnpm": ">=9"
90
+ },
91
+ "config": {
92
+ "delimiters": {
93
+ "template": [
94
+ "[[",
95
+ "]]"
96
+ ],
97
+ "subcommand": [
98
+ ":",
99
+ ":"
100
+ ]
101
+ },
102
+ "parser": {
103
+ "short-option-groups": true,
104
+ "camel-case-expansion": false,
105
+ "dot-notation": true,
106
+ "parse-numbers": true,
107
+ "boolean-negation": false
108
+ }
109
+ }
110
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"app-settings.provider.js","names":[],"sources":["../../src/providers/app-settings.provider.ts"],"sourcesContent":["import pc from 'picocolors';\r\nimport type { CommandArguments } from '../arguments.js';\r\nimport type { EnvProvider } from '../interfaces/index.js';\r\nimport { logger as globalLogger, readJson } from '../utils/index.js';\r\n\r\nconst KEY = 'app-settings';\r\n\r\nconst logger = globalLogger.getSubLogger({\r\n\tprefix: [pc.bold(pc.blue(`[${KEY}]`))],\r\n});\r\n\r\ninterface AppSettingsCommandArguments extends CommandArguments {\r\n\tenvFile: string;\r\n}\r\n\r\n/**\r\n * Loads config from appsettings.json.\r\n */\r\nexport const AppSettingsProvider: EnvProvider<AppSettingsCommandArguments> = {\r\n\tkey: KEY,\r\n\r\n\tbuilder: (builder) => {\r\n\t\tbuilder.options({\r\n\t\t\tenvFile: {\r\n\t\t\t\talias: 'ef',\r\n\t\t\t\tdefault: '[[root]]/appsettings.json',\r\n\t\t\t\tdescribe: 'Environment variables file path (non secrets)',\r\n\t\t\t\tgroup: KEY,\r\n\t\t\t\ttype: 'string',\r\n\t\t\t},\r\n\t\t});\r\n\t},\r\n\r\n\tload: async ({ ci, env, envFile, modes = [], root }) => {\r\n\t\tconst [appsettings = {}, wasFound] = await readJson(envFile);\r\n\r\n\t\tif (!wasFound) logger.warn(`${pc.blue(envFile)} not found`);\r\n\r\n\t\tconst composite =\r\n\t\t\tappsettings['|DEFAULT|'] ||\r\n\t\t\tappsettings['|ENV|'] ||\r\n\t\t\tappsettings['|MODE|'] ||\r\n\t\t\tappsettings['|LOCAL|'];\r\n\r\n\t\tconst unitary = await Promise.all([\r\n\t\t\treadJson(`${root}/appsettings.${env}.json`).then(\r\n\t\t\t\t([settings]) => settings,\r\n\t\t\t),\r\n\t\t\treadJson(`${root}/appsettings.${env}.local.json`).then(\r\n\t\t\t\t([settings]) => (ci ? {} : settings),\r\n\t\t\t),\r\n\t\t\t...modes.map((mode) =>\r\n\t\t\t\treadJson(`${root}/appsettings.${mode}.json`).then(\r\n\t\t\t\t\t([settings]) => settings,\r\n\t\t\t\t),\r\n\t\t\t),\r\n\t\t]);\r\n\r\n\t\t// only load local in env load cmd\r\n\t\tif (ci) appsettings['|LOCAL|'] = null;\r\n\r\n\t\treturn [\r\n\t\t\tcomposite ? {} : appsettings,\r\n\r\n\t\t\tappsettings['|DEFAULT|'],\r\n\r\n\t\t\tappsettings['|ENV|']?.[env],\r\n\r\n\t\t\t...modes.map((mode) => appsettings['|MODE|']?.[mode]),\r\n\r\n\t\t\tappsettings['|LOCAL|']?.[env],\r\n\r\n\t\t\t...unitary,\r\n\t\t];\r\n\t},\r\n};\r\n"],"mappings":";;;;;AAKA,IAAM,IAAM,gBAEN,IAAS,EAAa,aAAa,EACxC,QAAQ,CAAC,EAAG,KAAK,EAAG,KAAK,IAAI,EAAI,EAAE,CAAC,CAAC,EACtC,CAAC,GASY,IAAgE;CAC5E,KAAK;CAEL,UAAU,MAAY;EACrB,EAAQ,QAAQ,EACf,SAAS;GACR,OAAO;GACP,SAAS;GACT,UAAU;GACV,OAAO;GACP,MAAM;EACP,EACD,CAAC;CACF;CAEA,MAAM,OAAO,EAAE,OAAI,QAAK,YAAS,WAAQ,CAAC,GAAG,cAAW;EACvD,IAAM,CAAC,IAAc,CAAC,GAAG,KAAY,MAAM,EAAS,CAAO;EAE3D,AAAK,KAAU,EAAO,KAAK,GAAG,EAAG,KAAK,CAAO,EAAE,WAAW;EAE1D,IAAM,IACL,EAAY,gBACZ,EAAY,YACZ,EAAY,aACZ,EAAY,YAEP,IAAU,MAAM,QAAQ,IAAI;GACjC,EAAS,GAAG,EAAK,eAAe,EAAI,MAAM,EAAE,MAC1C,CAAC,OAAc,CACjB;GACA,EAAS,GAAG,EAAK,eAAe,EAAI,YAAY,EAAE,MAChD,CAAC,OAAe,IAAK,CAAC,IAAI,CAC5B;GACA,GAAG,EAAM,KAAK,MACb,EAAS,GAAG,EAAK,eAAe,EAAK,MAAM,EAAE,MAC3C,CAAC,OAAc,CACjB,CACD;EACD,CAAC;EAKD,OAFI,MAAI,EAAY,aAAa,OAE1B;GACN,IAAY,CAAC,IAAI;GAEjB,EAAY;GAEZ,EAAY,WAAW;GAEvB,GAAG,EAAM,KAAK,MAAS,EAAY,YAAY,EAAK;GAEpD,EAAY,aAAa;GAEzB,GAAG;EACJ;CACD;AACD"}
1
+ {"version":3,"file":"app-settings.provider.js","names":[],"sources":["../../src/providers/app-settings.provider.ts"],"sourcesContent":["import pc from 'picocolors';\r\nimport type { CommandArguments } from '../arguments.js';\r\nimport type { EnvProvider } from '../interfaces/index.js';\r\nimport { logger as globalLogger, readJson } from '../utils/index.js';\r\n\r\nconst KEY = 'app-settings';\r\n\r\nconst logger = globalLogger.getSubLogger({\r\n\tprefix: [pc.bold(pc.blue(`[${KEY}]`))],\r\n});\r\n\r\ninterface AppSettingsCommandArguments extends CommandArguments {\r\n\tenvFile: string;\r\n}\r\n\r\n/**\r\n * Loads config from appsettings.json.\r\n */\r\nexport const AppSettingsProvider: EnvProvider<AppSettingsCommandArguments> = {\r\n\tkey: KEY,\r\n\r\n\tbuilder: (builder) => {\r\n\t\tbuilder.options({\r\n\t\t\tenvFile: {\r\n\t\t\t\talias: 'ef',\r\n\t\t\t\tdefault: '[[root]]/appsettings.json',\r\n\t\t\t\tdescribe: 'Environment variables file path (non secrets)',\r\n\t\t\t\tgroup: KEY,\r\n\t\t\t\ttype: 'string',\r\n\t\t\t},\r\n\t\t});\r\n\t},\r\n\r\n\tload: async ({ ci, env, envFile, modes = [], root }) => {\r\n\t\tconst [appsettings = {}, wasFound] = await readJson(envFile);\r\n\r\n\t\tif (!wasFound) logger.warn(`${pc.blue(envFile)} not found`);\r\n\r\n\t\tconst composite =\r\n\t\t\tappsettings['|DEFAULT|'] ||\r\n\t\t\tappsettings['|ENV|'] ||\r\n\t\t\tappsettings['|MODE|'] ||\r\n\t\t\tappsettings['|LOCAL|'];\r\n\r\n\t\tconst unitary = await Promise.all([\r\n\t\t\treadJson(`${root}/appsettings.${env}.json`).then(\r\n\t\t\t\t([settings]) => settings,\r\n\t\t\t),\r\n\t\t\treadJson(`${root}/appsettings.${env}.local.json`).then(\r\n\t\t\t\t([settings]) => (ci ? {} : settings),\r\n\t\t\t),\r\n\t\t\t...modes.map((mode) =>\r\n\t\t\t\treadJson(`${root}/appsettings.${mode}.json`).then(\r\n\t\t\t\t\t([settings]) => settings,\r\n\t\t\t\t),\r\n\t\t\t),\r\n\t\t]);\r\n\r\n\t\t// only load local in env load cmd\r\n\t\tif (ci) appsettings['|LOCAL|'] = null;\r\n\r\n\t\treturn [\r\n\t\t\tcomposite ? {} : appsettings,\r\n\r\n\t\t\tappsettings['|DEFAULT|'],\r\n\r\n\t\t\tappsettings['|ENV|']?.[env],\r\n\r\n\t\t\t...modes.map((mode) => appsettings['|MODE|']?.[mode]),\r\n\r\n\t\t\tappsettings['|LOCAL|']?.[env],\r\n\r\n\t\t\t...unitary,\r\n\t\t];\r\n\t},\r\n};\r\n"],"mappings":";;;;;AAKA,IAAM,IAAM,gBAEN,IAAS,EAAa,aAAa,EACxC,QAAQ,CAAC,EAAG,KAAK,EAAG,KAAK,IAAI,EAAI,EAAE,CAAC,CAAC,EACtC,CAAC,GASY,IAAgE;CAC5E,KAAK;CAEL,UAAU,MAAY;EACrB,EAAQ,QAAQ,EACf,SAAS;GACR,OAAO;GACP,SAAS;GACT,UAAU;GACV,OAAO;GACP,MAAM;EACP,EACD,CAAC;CACF;CAEA,MAAM,OAAO,EAAE,OAAI,QAAK,YAAS,WAAQ,CAAC,GAAG,cAAW;EACvD,IAAM,CAAC,IAAc,CAAC,GAAG,KAAY,MAAM,EAAS,CAAO;EAE3D,AAAK,KAAU,EAAO,KAAK,GAAG,EAAG,KAAK,CAAO,EAAE,WAAW;EAE1D,IAAM,IACL,EAAY,gBACZ,EAAY,YACZ,EAAY,aACZ,EAAY,YAEP,IAAU,MAAM,QAAQ,IAAI;GACjC,EAAS,GAAG,EAAK,eAAe,EAAI,MAAM,CAAC,CAAC,MAC1C,CAAC,OAAc,CACjB;GACA,EAAS,GAAG,EAAK,eAAe,EAAI,YAAY,CAAC,CAAC,MAChD,CAAC,OAAe,IAAK,CAAC,IAAI,CAC5B;GACA,GAAG,EAAM,KAAK,MACb,EAAS,GAAG,EAAK,eAAe,EAAK,MAAM,CAAC,CAAC,MAC3C,CAAC,OAAc,CACjB,CACD;EACD,CAAC;EAKD,OAFI,MAAI,EAAY,aAAa,OAE1B;GACN,IAAY,CAAC,IAAI;GAEjB,EAAY;GAEZ,EAAY,QAAQ,GAAG;GAEvB,GAAG,EAAM,KAAK,MAAS,EAAY,SAAS,GAAG,EAAK;GAEpD,EAAY,UAAU,GAAG;GAEzB,GAAG;EACJ;CACD;AACD"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../src/providers/index.ts"],"sourcesContent":["import type { EnvProvider } from '../interfaces/index.js';\nimport { AppSettingsProvider } from './app-settings.provider.js';\nimport { LocalProvider } from './local.provider.js';\nimport { PackageJsonProvider } from './package-json.provider.js';\nimport { SecretsProvider } from './secrets.provider.js';\n\nconst IntegratedProviders: Record<string, EnvProvider<any, any>> = {\n\t[AppSettingsProvider.key]: AppSettingsProvider,\n\t[LocalProvider.key]: LocalProvider,\n\t[PackageJsonProvider.key]: PackageJsonProvider,\n\t[SecretsProvider.key]: SecretsProvider,\n};\n\n// order defines provider load + merge precedence (later entries win):\n// package-json (base info) < app-settings < secrets < local (highest).\n// Do NOT alphabetize this array — the sequence is semantic.\nconst IntegratedProviderConfig = [\n\t{\n\t\tpath: PackageJsonProvider.key,\n\t},\n\t{\n\t\tpath: AppSettingsProvider.key,\n\t},\n\t{\n\t\tpath: SecretsProvider.key,\n\t},\n\t{\n\t\tpath: LocalProvider.key,\n\t},\n];\n\nexport { IntegratedProviderConfig, IntegratedProviders };\n"],"mappings":";;;;;AAMA,IAAM,IAA6D;EACjE,EAAoB,MAAM;EAC1B,EAAc,MAAM;EACpB,EAAoB,MAAM;EAC1B,EAAgB,MAAM;AACxB,GAKM,IAA2B;CAChC,EACC,MAAM,EAAoB,IAC3B;CACA,EACC,MAAM,EAAoB,IAC3B;CACA,EACC,MAAM,EAAgB,IACvB;CACA,EACC,MAAM,EAAc,IACrB;AACD"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/providers/index.ts"],"sourcesContent":["import type { EnvProvider } from '../interfaces/index.js';\r\nimport { AppSettingsProvider } from './app-settings.provider.js';\r\nimport { LocalProvider } from './local.provider.js';\r\nimport { PackageJsonProvider } from './package-json.provider.js';\r\nimport { SecretsProvider } from './secrets.provider.js';\r\n\r\nconst IntegratedProviders: Record<string, EnvProvider<any, any>> = {\r\n\t[AppSettingsProvider.key]: AppSettingsProvider,\r\n\t[LocalProvider.key]: LocalProvider,\r\n\t[PackageJsonProvider.key]: PackageJsonProvider,\r\n\t[SecretsProvider.key]: SecretsProvider,\r\n};\r\n\r\n// order defines provider load + merge precedence (later entries win):\r\n// package-json (base info) < app-settings < secrets < local (highest).\r\n// Do NOT alphabetize this array — the sequence is semantic.\r\nconst IntegratedProviderConfig = [\r\n\t{\r\n\t\tpath: PackageJsonProvider.key,\r\n\t},\r\n\t{\r\n\t\tpath: AppSettingsProvider.key,\r\n\t},\r\n\t{\r\n\t\tpath: SecretsProvider.key,\r\n\t},\r\n\t{\r\n\t\tpath: LocalProvider.key,\r\n\t},\r\n];\r\n\r\nexport { IntegratedProviderConfig, IntegratedProviders };\r\n"],"mappings":";;;;;AAMA,IAAM,IAA6D;EACjE,EAAoB,MAAM;EAC1B,EAAc,MAAM;EACpB,EAAoB,MAAM;EAC1B,EAAgB,MAAM;AACxB,GAKM,IAA2B;CAChC,EACC,MAAM,EAAoB,IAC3B;CACA,EACC,MAAM,EAAoB,IAC3B;CACA,EACC,MAAM,EAAgB,IACvB;CACA,EACC,MAAM,EAAc,IACrB;AACD"}
@@ -1 +1 @@
1
- {"version":3,"file":"secrets.provider.js","names":[],"sources":["../../src/providers/secrets.provider.ts"],"sourcesContent":["import pc from 'picocolors';\nimport type { CommandArguments } from '../arguments.js';\nimport type { EnvProvider } from '../interfaces/index.js';\nimport { logger as globalLogger, readJson } from '../utils/index.js';\n\nconst KEY = 'secrets';\n\nconst logger = globalLogger.getSubLogger({\n\tprefix: [pc.bold(pc.blue(`[${KEY}]`))],\n});\n\ninterface SecretsCommandArguments extends CommandArguments {\n\tsecretsFile: string;\n}\n\n/**\n * Loads secrets from env files in env folder.\n */\nexport const SecretsProvider: EnvProvider<SecretsCommandArguments> = {\n\tkey: KEY,\n\n\tbuilder: (builder) => {\n\t\tbuilder.options({\n\t\t\tsecretsFile: {\n\t\t\t\talias: 'sf',\n\t\t\t\tdefault: '[[root]]/[[env]].env.json',\n\t\t\t\tdescribe: 'Secret variables file path',\n\t\t\t\tgroup: KEY,\n\t\t\t\ttype: 'string',\n\t\t\t},\n\t\t});\n\t},\n\n\tload: async ({ env, secretsFile }) => {\n\t\tif (!env) {\n\t\t\tlogger.silly('no env, provider skipped');\n\n\t\t\treturn [];\n\t\t}\n\n\t\tconst [secrets] = await readJson(secretsFile);\n\n\t\treturn [secrets];\n\t},\n};\n"],"mappings":";;;;;AAKA,IAAM,IAAM,WAEN,IAAS,EAAa,aAAa,EACxC,QAAQ,CAAC,EAAG,KAAK,EAAG,KAAK,IAAI,EAAI,EAAE,CAAC,CAAC,EACtC,CAAC,GASY,IAAwD;CACpE,KAAK;CAEL,UAAU,MAAY;EACrB,EAAQ,QAAQ,EACf,aAAa;GACZ,OAAO;GACP,SAAS;GACT,UAAU;GACV,OAAO;GACP,MAAM;EACP,EACD,CAAC;CACF;CAEA,MAAM,OAAO,EAAE,QAAK,qBAAkB;EACrC,IAAI,CAAC,GAGJ,OAFA,EAAO,MAAM,0BAA0B,GAEhC,CAAC;EAGT,IAAM,CAAC,KAAW,MAAM,EAAS,CAAW;EAE5C,OAAO,CAAC,CAAO;CAChB;AACD"}
1
+ {"version":3,"file":"secrets.provider.js","names":[],"sources":["../../src/providers/secrets.provider.ts"],"sourcesContent":["import pc from 'picocolors';\r\nimport type { CommandArguments } from '../arguments.js';\r\nimport type { EnvProvider } from '../interfaces/index.js';\r\nimport { logger as globalLogger, readJson } from '../utils/index.js';\r\n\r\nconst KEY = 'secrets';\r\n\r\nconst logger = globalLogger.getSubLogger({\r\n\tprefix: [pc.bold(pc.blue(`[${KEY}]`))],\r\n});\r\n\r\ninterface SecretsCommandArguments extends CommandArguments {\r\n\tsecretsFile: string;\r\n}\r\n\r\n/**\r\n * Loads secrets from env files in env folder.\r\n */\r\nexport const SecretsProvider: EnvProvider<SecretsCommandArguments> = {\r\n\tkey: KEY,\r\n\r\n\tbuilder: (builder) => {\r\n\t\tbuilder.options({\r\n\t\t\tsecretsFile: {\r\n\t\t\t\talias: 'sf',\r\n\t\t\t\tdefault: '[[root]]/[[env]].env.json',\r\n\t\t\t\tdescribe: 'Secret variables file path',\r\n\t\t\t\tgroup: KEY,\r\n\t\t\t\ttype: 'string',\r\n\t\t\t},\r\n\t\t});\r\n\t},\r\n\r\n\tload: async ({ env, secretsFile }) => {\r\n\t\tif (!env) {\r\n\t\t\tlogger.silly('no env, provider skipped');\r\n\r\n\t\t\treturn [];\r\n\t\t}\r\n\r\n\t\tconst [secrets] = await readJson(secretsFile);\r\n\r\n\t\treturn [secrets];\r\n\t},\r\n};\r\n"],"mappings":";;;;;AAKA,IAAM,IAAM,WAEN,IAAS,EAAa,aAAa,EACxC,QAAQ,CAAC,EAAG,KAAK,EAAG,KAAK,IAAI,EAAI,EAAE,CAAC,CAAC,EACtC,CAAC,GASY,IAAwD;CACpE,KAAK;CAEL,UAAU,MAAY;EACrB,EAAQ,QAAQ,EACf,aAAa;GACZ,OAAO;GACP,SAAS;GACT,UAAU;GACV,OAAO;GACP,MAAM;EACP,EACD,CAAC;CACF;CAEA,MAAM,OAAO,EAAE,QAAK,qBAAkB;EACrC,IAAI,CAAC,GAGJ,OAFA,EAAO,MAAM,0BAA0B,GAEhC,CAAC;EAGT,IAAM,CAAC,KAAW,MAAM,EAAS,CAAW;EAE5C,OAAO,CAAC,CAAO;CAChB;AACD"}