@achs/env 5.0.0-alpha.3 โ†’ 5.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/arguments.d.ts.map +1 -1
  2. package/arguments.js +13 -6
  3. package/arguments.js.map +1 -1
  4. package/commands/env.command.d.ts.map +1 -1
  5. package/commands/env.command.js +36 -26
  6. package/commands/env.command.js.map +1 -1
  7. package/commands/export.command.d.ts.map +1 -1
  8. package/commands/export.command.js +12 -11
  9. package/commands/export.command.js.map +1 -1
  10. package/commands/pull.command.js +8 -7
  11. package/commands/pull.command.js.map +1 -1
  12. package/commands/push.command.js +8 -7
  13. package/commands/push.command.js.map +1 -1
  14. package/commands/schema.command.d.ts.map +1 -1
  15. package/commands/schema.command.js +8 -7
  16. package/commands/schema.command.js.map +1 -1
  17. package/exec.d.ts.map +1 -1
  18. package/exec.js +46 -42
  19. package/exec.js.map +1 -1
  20. package/package.json +1 -1
  21. package/providers/azure-key-vault.provider.d.ts.map +1 -1
  22. package/providers/azure-key-vault.provider.js +48 -47
  23. package/providers/azure-key-vault.provider.js.map +1 -1
  24. package/utils/command.util.d.ts +1 -1
  25. package/utils/command.util.d.ts.map +1 -1
  26. package/utils/command.util.js +3 -3
  27. package/utils/command.util.js.map +1 -1
  28. package/utils/index.d.ts +1 -0
  29. package/utils/index.d.ts.map +1 -1
  30. package/utils/index.js +2 -1
  31. package/utils/json.util.d.ts.map +1 -1
  32. package/utils/json.util.js +7 -2
  33. package/utils/json.util.js.map +1 -1
  34. package/utils/schema.util.d.ts +6 -6
  35. package/utils/schema.util.d.ts.map +1 -1
  36. package/utils/schema.util.js +20 -19
  37. package/utils/schema.util.js.map +1 -1
  38. package/utils/ui.d.ts +14 -0
  39. package/utils/ui.d.ts.map +1 -0
  40. package/utils/ui.js +75 -0
  41. package/utils/ui.js.map +1 -0
@@ -7,11 +7,11 @@ import { Options } from 'to-json-schema';
7
7
  * @param {Record<string, unknown>} json json object
8
8
  * @param {Options} [options]
9
9
  *
10
- * @returns {*} {Record<string, unknown>}
10
+ * @returns {*} {Promise<Record<string, unknown>>}
11
11
  */
12
12
  export declare function schemaFrom(json: Record<string, unknown>, options?: Options & {
13
13
  nullable?: boolean;
14
- }): Record<string, unknown>;
14
+ }): Promise<Record<string, unknown>>;
15
15
  /**
16
16
  * Validates if a object is a JSON schema.
17
17
  *
@@ -52,9 +52,9 @@ export declare function flatSchema(schema: Record<string, unknown>, parentKey?:
52
52
  * @param {Record<string, object>} schema json schema by provider
53
53
  * @param {boolean} enableFormats whether formats are enabled
54
54
  *
55
- * @returns {ValidateFunction} validators
55
+ * @returns {Promise<ValidateFunction>} validators
56
56
  */
57
- export declare function createValidator(schema: Record<string, unknown>, enableFormats?: boolean): ValidateFunction;
57
+ export declare function createValidator(schema: Record<string, unknown>, enableFormats?: boolean): Promise<ValidateFunction>;
58
58
  /**
59
59
  * Creates a JSON schema validator lookup using AJV.
60
60
  *
@@ -64,7 +64,7 @@ export declare function createValidator(schema: Record<string, unknown>, enableF
64
64
  * @param {Record<string, object>} schemaLookup json schema by provider
65
65
  * @param {boolean} enableFormats whether formats are enabled
66
66
  *
67
- * @returns {Record<string, ValidateFunction>} validators lookup
67
+ * @returns {Promise<Record<string, ValidateFunction>>} validators lookup
68
68
  */
69
- export declare function createValidators(schemaLookup: Record<string, object>, enableFormats?: boolean): Record<string, ValidateFunction>;
69
+ export declare function createValidators(schemaLookup: Record<string, object>, enableFormats?: boolean): Promise<Record<string, ValidateFunction>>;
70
70
  //# sourceMappingURL=schema.util.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"schema.util.d.ts","sourceRoot":"","sources":["../../src/utils/schema.util.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAU,cAAc,EAAE,gBAAgB,EAAE,MAAM,KAAK,CAAC;AAGpE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AA4B9C;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CACzB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,OAAO,CAAC,EAAE,OAAO,GAAG;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,GACxC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAezB;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CACjC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,MAAM,IAAI,cAAc,CAAC,MAAM,CAAC,CAOlC;AAED;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAC3B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,SAAS,GAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAM,GACjC,OAAO,CAST;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,UAAU,CACzB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,SAAS,SAAK,EACd,gBAAgB,SAAO,EACvB,SAAS,GAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAM,GACjC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAmBzB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAC9B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,aAAa,UAAO,GAClB,gBAAgB,CAIlB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAC/B,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACpC,aAAa,UAAO,GAClB,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CASlC"}
1
+ {"version":3,"file":"schema.util.d.ts","sourceRoot":"","sources":["../../src/utils/schema.util.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAU,cAAc,EAAE,gBAAgB,EAAE,MAAM,KAAK,CAAC;AACpE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAiC9C;;;;;;;;GAQG;AACH,wBAAsB,UAAU,CAC/B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,OAAO,CAAC,EAAE,OAAO,GAAG;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,GACxC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAyBlC;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CACjC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,MAAM,IAAI,cAAc,CAAC,MAAM,CAAC,CAOlC;AAED;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAC3B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,SAAS,GAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAM,GACjC,OAAO,CAST;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,UAAU,CACzB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,SAAS,SAAK,EACd,gBAAgB,SAAO,EACvB,SAAS,GAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAM,GACjC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAmBzB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,eAAe,CACpC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,aAAa,UAAO,GAClB,OAAO,CAAC,gBAAgB,CAAC,CAI3B;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,gBAAgB,CACrC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACpC,aAAa,UAAO,GAClB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAS3C"}
@@ -1,8 +1,5 @@
1
- import { Ajv as e } from "ajv";
2
- import t from "ajv-formats";
3
- import n from "to-json-schema";
4
1
  //#region src/utils/schema.util.ts
5
- var r, i, a = {
2
+ var e, t, n, r, i, a = {
6
3
  "ip-address": /^(?:(?:25[0-5]|2[0-4]\d|[01]?\d{1,2})\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d{1,2})$/,
7
4
  color: /^(#?([\dA-Fa-f]{3}){1,2}\b|aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow|(rgb\(\s*\b(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\b\s*,\s*\b(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\b\s*,\s*\b(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\b\s*\))|(rgb\(\s*(\d?\d%|100%)+\s*,\s*(\d?\d%|100%)+\s*,\s*(\d?\d%|100%)+\s*\)))$/,
8
5
  hostname: /^(?=.{1,255}$)[\da-z](?:[\da-z-]{0,61}[\da-z])?(?:\.[\da-z](?:[\da-z-]{0,61}[\da-z])?)*\.?$/i,
@@ -12,8 +9,8 @@ var r, i, a = {
12
9
  style: /\s*(.+?):\s*([^;]+);?/g,
13
10
  phone: /^\+(?:\d ?){6,14}\d$/
14
11
  };
15
- function o(e, t) {
16
- return n(e, {
12
+ async function o(e, t) {
13
+ return i ||= (await import("to-json-schema")).default, i(e, {
17
14
  required: !1,
18
15
  ...t,
19
16
  postProcessFnc: (n, r, i, a) => (i !== e && (r.type = [n], r.nullable = t?.nullable ?? !1), i ?? (r.nullable = !0), a(n, r, i))
@@ -41,29 +38,33 @@ function l(e, t = "", n = "__", r = {}) {
41
38
  return r;
42
39
  } else return { [t]: e };
43
40
  }
44
- function u(e, t = !0) {
45
- return f(t).compile(e);
41
+ async function u(e, t = !0) {
42
+ return (await f(t)).compile(e);
46
43
  }
47
- function d(e, t = !0) {
48
- let n = f(t), r = {};
44
+ async function d(e, t = !0) {
45
+ let n = await f(t), r = {};
49
46
  for (let t in e) r[t] = n.compile(e[t]);
50
47
  return r;
51
48
  }
52
- function f(n) {
53
- if (n) {
54
- if (!i) {
55
- i = new e({
49
+ async function f(i) {
50
+ if (!n) {
51
+ let [e, t] = await Promise.all([import("ajv"), import("ajv-formats")]);
52
+ n = e.Ajv, r = t.default;
53
+ }
54
+ if (i) {
55
+ if (!t) {
56
+ t = new n({
56
57
  allErrors: !0,
57
58
  allowUnionTypes: !0
58
- }), t(i, { mode: "fast" });
59
- for (let e in a) i.addFormat(e, a[e]);
59
+ }), r(t, { mode: "fast" });
60
+ for (let e in a) t.addFormat(e, a[e]);
60
61
  }
61
- return i;
62
+ return t;
62
63
  }
63
- return r ||= new e({
64
+ return e ||= new n({
64
65
  allErrors: !0,
65
66
  allowUnionTypes: !0
66
- }), r;
67
+ }), e;
67
68
  }
68
69
  //#endregion
69
70
  export { u as createValidator, d as createValidators, l as flatSchema, s as isJsonSchemaObject, o as schemaFrom, c as schemaToJson };
@@ -1 +1 @@
1
- {"version":3,"file":"schema.util.js","names":[],"sources":["../../src/utils/schema.util.ts"],"sourcesContent":["import { Ajv } from 'ajv';\r\nimport type { Format, JSONSchemaType, ValidateFunction } from 'ajv';\r\nimport addFormats from 'ajv-formats';\r\nimport toJsonSchema from 'to-json-schema';\r\nimport type { Options } from 'to-json-schema';\r\n\r\n// cached AJV instances (with and without formats)\r\nlet _ajv: InstanceType<typeof Ajv> | undefined;\r\nlet _ajvWithFormats: InstanceType<typeof Ajv> | undefined;\r\n\r\n/* eslint-disable regexp/no-useless-assertions, regexp/no-super-linear-backtracking -- domain validation regexes from JSON Schema spec; modifying these patterns would change format validation behavior */\r\nconst FORMAT_REGEXPS: Record<string, Format> = {\r\n\t'ip-address':\r\n\t\t/^(?:(?:25[0-5]|2[0-4]\\d|[01]?\\d{1,2})\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d{1,2})$/,\r\n\r\n\tcolor: /^(#?([\\dA-Fa-f]{3}){1,2}\\b|aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow|(rgb\\(\\s*\\b(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\b\\s*,\\s*\\b(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\b\\s*,\\s*\\b(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\b\\s*\\))|(rgb\\(\\s*(\\d?\\d%|100%)+\\s*,\\s*(\\d?\\d%|100%)+\\s*,\\s*(\\d?\\d%|100%)+\\s*\\)))$/,\r\n\r\n\thostname:\r\n\t\t/^(?=.{1,255}$)[\\da-z](?:[\\da-z-]{0,61}[\\da-z])?(?:\\.[\\da-z](?:[\\da-z-]{0,61}[\\da-z])?)*\\.?$/i,\r\n\r\n\talphanumeric: /^[\\da-z]+$/i,\r\n\r\n\t'utc-millisec': (input: string) => !Number.isNaN(+input),\r\n\r\n\talpha: /^[a-z]+$/i,\r\n\r\n\tstyle: /\\s*(.+?):\\s*([^;]+);?/g,\r\n\r\n\tphone: /^\\+(?:\\d ?){6,14}\\d$/,\r\n};\r\n/* eslint-enable regexp/no-useless-assertions, regexp/no-super-linear-backtracking */\r\n\r\n/**\r\n * Generates JSON schema from JSON template/object.\r\n *\r\n * @export\r\n * @param {Record<string, unknown>} json json object\r\n * @param {Options} [options]\r\n *\r\n * @returns {*} {Record<string, unknown>}\r\n */\r\nexport function schemaFrom(\r\n\tjson: Record<string, unknown>,\r\n\toptions?: Options & { nullable?: boolean },\r\n): Record<string, unknown> {\r\n\treturn toJsonSchema(json, {\r\n\t\trequired: false,\r\n\t\t...options,\r\n\t\tpostProcessFnc: (type, schema, value, defaultFunc) => {\r\n\t\t\tif (value !== json) {\r\n\t\t\t\tschema.type = [type];\r\n\t\t\t\tschema.nullable = options?.nullable ?? false;\r\n\t\t\t}\r\n\r\n\t\t\tif (value === null || value === undefined) schema.nullable = true;\r\n\r\n\t\t\treturn defaultFunc(type, schema, value);\r\n\t\t},\r\n\t});\r\n}\r\n\r\n/**\r\n * Validates if a object is a JSON schema.\r\n *\r\n * @export\r\n * @param {Record<string, unknown>} schema\r\n *\r\n * @returns {boolean} if is a JSON schema\r\n */\r\nexport function isJsonSchemaObject(\r\n\tschema: Record<string, unknown>,\r\n): schema is JSONSchemaType<object> {\r\n\tif (schema.type === 'object') return true;\r\n\r\n\treturn (\r\n\t\tArray.isArray(schema.type) &&\r\n\t\t(schema.type as string[]).includes('object')\r\n\t);\r\n}\r\n\r\n/**\r\n * Converts a JSON schema to JSON template.\r\n *\r\n * @export\r\n * @param {Record<string, unknown>} schema JSON schema\r\n * @param {Record<string, any>} [container] template container\r\n *\r\n * @returns {unknown} object or default value\r\n */\r\nexport function schemaToJson(\r\n\tschema: Record<string, unknown>,\r\n\tcontainer: Record<string, any> = {},\r\n): unknown {\r\n\tif (isJsonSchemaObject(schema)) {\r\n\t\tfor (const key in schema.properties)\r\n\t\t\tcontainer[key] = schemaToJson(schema.properties[key]);\r\n\r\n\t\treturn container;\r\n\t} else {\r\n\t\treturn schema.default ?? (schema.nullable ? null : undefined);\r\n\t}\r\n}\r\n\r\n/**\r\n * Flatten a JSON schema.\r\n *\r\n * @export\r\n * @param {Record<string, unknown>} schema JSON schema\r\n * @param {string} [parentKey] previous level key\r\n * @param {string} [nestingDelimiter] char for delimit nesting levels\r\n * @param {Record<string, any>} [container] result container\r\n *\r\n * @returns {Record<string, unknown>} flattened schema\r\n */\r\nexport function flatSchema(\r\n\tschema: Record<string, unknown>,\r\n\tparentKey = '',\r\n\tnestingDelimiter = '__',\r\n\tcontainer: Record<string, any> = {},\r\n): Record<string, unknown> {\r\n\tif (isJsonSchemaObject(schema)) {\r\n\t\tfor (const key in schema.properties) {\r\n\t\t\tif (key[0] === '#') continue;\r\n\r\n\t\t\t// global property, but prefix removed for injection\r\n\t\t\tconst subKey =\r\n\t\t\t\tparentKey + (parentKey ? nestingDelimiter : '') + key;\r\n\r\n\t\t\tcontainer = {\r\n\t\t\t\t...container,\r\n\t\t\t\t...flatSchema(schema.properties[key], subKey, nestingDelimiter),\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\treturn container;\r\n\t} else {\r\n\t\treturn { [parentKey]: schema };\r\n\t}\r\n}\r\n\r\n/**\r\n * Creates a JSON schema validator using AJV.\r\n *\r\n * @see https://ajv.js.org/\r\n *\r\n * @export\r\n * @param {Record<string, object>} schema json schema by provider\r\n * @param {boolean} enableFormats whether formats are enabled\r\n *\r\n * @returns {ValidateFunction} validators\r\n */\r\nexport function createValidator(\r\n\tschema: Record<string, unknown>,\r\n\tenableFormats = true,\r\n): ValidateFunction {\r\n\tconst ajv = getAjv(enableFormats);\r\n\r\n\treturn ajv.compile(schema);\r\n}\r\n\r\n/**\r\n * Creates a JSON schema validator lookup using AJV.\r\n *\r\n * @see https://ajv.js.org/\r\n *\r\n * @export\r\n * @param {Record<string, object>} schemaLookup json schema by provider\r\n * @param {boolean} enableFormats whether formats are enabled\r\n *\r\n * @returns {Record<string, ValidateFunction>} validators lookup\r\n */\r\nexport function createValidators(\r\n\tschemaLookup: Record<string, object>,\r\n\tenableFormats = true,\r\n): Record<string, ValidateFunction> {\r\n\tconst ajv = getAjv(enableFormats);\r\n\r\n\tconst validators: Record<string, ValidateFunction> = {};\r\n\r\n\tfor (const key in schemaLookup)\r\n\t\tvalidators[key] = ajv.compile(schemaLookup[key]);\r\n\r\n\treturn validators;\r\n}\r\n\r\n/**\r\n * Returns a cached AJV instance.\r\n *\r\n * @param {boolean} withFormats whether to include format validators\r\n * @returns {InstanceType<typeof Ajv>} cached AJV instance\r\n */\r\nfunction getAjv(withFormats: boolean): InstanceType<typeof Ajv> {\r\n\tif (withFormats) {\r\n\t\tif (!_ajvWithFormats) {\r\n\t\t\t_ajvWithFormats = new Ajv({\r\n\t\t\t\tallErrors: true,\r\n\t\t\t\tallowUnionTypes: true,\r\n\t\t\t});\r\n\r\n\t\t\t(\r\n\t\t\t\taddFormats as unknown as (\r\n\t\t\t\t\tajv: InstanceType<typeof Ajv>,\r\n\t\t\t\t\toptions?: { mode?: string },\r\n\t\t\t\t) => void\r\n\t\t\t)(_ajvWithFormats, { mode: 'fast' });\r\n\r\n\t\t\tfor (const key in FORMAT_REGEXPS)\r\n\t\t\t\t_ajvWithFormats.addFormat(key, FORMAT_REGEXPS[key]);\r\n\t\t}\r\n\r\n\t\treturn _ajvWithFormats;\r\n\t}\r\n\r\n\tif (!_ajv) {\r\n\t\t_ajv = new Ajv({\r\n\t\t\tallErrors: true,\r\n\t\t\tallowUnionTypes: true,\r\n\t\t});\r\n\t}\r\n\r\n\treturn _ajv;\r\n}\r\n"],"mappings":";;;;AAOA,IAAI,GACA,GAGE,IAAyC;CAC9C,cACC;CAED,OAAO;CAEP,UACC;CAED,cAAc;CAEd,iBAAiB,MAAkB,CAAC,OAAO,MAAM,CAAC,CAAK;CAEvD,OAAO;CAEP,OAAO;CAEP,OAAO;AACR;AAYA,SAAgB,EACf,GACA,GAC0B;CAC1B,OAAO,EAAa,GAAM;EACzB,UAAU;EACV,GAAG;EACH,iBAAiB,GAAM,GAAQ,GAAO,OACjC,MAAU,MACb,EAAO,OAAO,CAAC,CAAI,GACnB,EAAO,WAAW,GAAS,YAAY,KAGpC,MAAuC,EAAO,WAAW,KAEtD,EAAY,GAAM,GAAQ,CAAK;CAExC,CAAC;AACF;AAUA,SAAgB,EACf,GACmC;CAGnC,OAFI,EAAO,SAAS,WAAiB,KAGpC,MAAM,QAAQ,EAAO,IAAI,KACxB,EAAO,KAAkB,SAAS,QAAQ;AAE7C;AAWA,SAAgB,EACf,GACA,IAAiC,CAAC,GACxB;CACV,IAAI,EAAmB,CAAM,GAAG;EAC/B,KAAK,IAAM,KAAO,EAAO,YACxB,EAAU,KAAO,EAAa,EAAO,WAAW,EAAI;EAErD,OAAO;CACR,OACC,OAAO,EAAO,YAAY,EAAO,WAAW,OAAO,KAAA;AAErD;AAaA,SAAgB,EACf,GACA,IAAY,IACZ,IAAmB,MACnB,IAAiC,CAAC,GACR;CAC1B,IAAI,EAAmB,CAAM,GAAG;EAC/B,KAAK,IAAM,KAAO,EAAO,YAAY;GACpC,IAAI,EAAI,OAAO,KAAK;GAGpB,IAAM,IACL,KAAa,IAAY,IAAmB,MAAM;GAEnD,IAAY;IACX,GAAG;IACH,GAAG,EAAW,EAAO,WAAW,IAAM,GAAQ,CAAgB;GAC/D;EACD;EAEA,OAAO;CACR,OACC,OAAO,GAAG,IAAY,EAAO;AAE/B;AAaA,SAAgB,EACf,GACA,IAAgB,IACG;CAGnB,OAFY,EAAO,CAEZ,EAAI,QAAQ,CAAM;AAC1B;AAaA,SAAgB,EACf,GACA,IAAgB,IACmB;CACnC,IAAM,IAAM,EAAO,CAAa,GAE1B,IAA+C,CAAC;CAEtD,KAAK,IAAM,KAAO,GACjB,EAAW,KAAO,EAAI,QAAQ,EAAa,EAAI;CAEhD,OAAO;AACR;AAQA,SAAS,EAAO,GAAgD;CAC/D,IAAI,GAAa;EAChB,IAAI,CAAC,GAAiB;GAMrB,AALA,IAAkB,IAAI,EAAI;IACzB,WAAW;IACX,iBAAiB;GAClB,CAAC,GAED,EAKE,GAAiB,EAAE,MAAM,OAAO,CAAC;GAEnC,KAAK,IAAM,KAAO,GACjB,EAAgB,UAAU,GAAK,EAAe,EAAI;EACpD;EAEA,OAAO;CACR;CASA,OAPA,AACC,MAAO,IAAI,EAAI;EACd,WAAW;EACX,iBAAiB;CAClB,CAAC,GAGK;AACR"}
1
+ {"version":3,"file":"schema.util.js","names":[],"sources":["../../src/utils/schema.util.ts"],"sourcesContent":["import type { Format, JSONSchemaType, ValidateFunction } from 'ajv';\r\nimport type { Options } from 'to-json-schema';\r\n\r\n// cached AJV instances (with and without formats)\r\nlet _ajv: any;\r\nlet _ajvWithFormats: any;\r\n\r\n// cached module references\r\nlet _AjvClass: any;\r\nlet _addFormats: any;\r\nlet _toJsonSchema: any;\r\n\r\n/* eslint-disable regexp/no-useless-assertions, regexp/no-super-linear-backtracking -- domain validation regexes from JSON Schema spec; modifying these patterns would change format validation behavior */\r\nconst FORMAT_REGEXPS: Record<string, Format> = {\r\n\t'ip-address':\r\n\t\t/^(?:(?:25[0-5]|2[0-4]\\d|[01]?\\d{1,2})\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d{1,2})$/,\r\n\r\n\tcolor: /^(#?([\\dA-Fa-f]{3}){1,2}\\b|aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow|(rgb\\(\\s*\\b(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\b\\s*,\\s*\\b(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\b\\s*,\\s*\\b(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\b\\s*\\))|(rgb\\(\\s*(\\d?\\d%|100%)+\\s*,\\s*(\\d?\\d%|100%)+\\s*,\\s*(\\d?\\d%|100%)+\\s*\\)))$/,\r\n\r\n\thostname:\r\n\t\t/^(?=.{1,255}$)[\\da-z](?:[\\da-z-]{0,61}[\\da-z])?(?:\\.[\\da-z](?:[\\da-z-]{0,61}[\\da-z])?)*\\.?$/i,\r\n\r\n\talphanumeric: /^[\\da-z]+$/i,\r\n\r\n\t'utc-millisec': (input: string) => !Number.isNaN(+input),\r\n\r\n\talpha: /^[a-z]+$/i,\r\n\r\n\tstyle: /\\s*(.+?):\\s*([^;]+);?/g,\r\n\r\n\tphone: /^\\+(?:\\d ?){6,14}\\d$/,\r\n};\r\n/* eslint-enable regexp/no-useless-assertions, regexp/no-super-linear-backtracking */\r\n\r\n/**\r\n * Generates JSON schema from JSON template/object.\r\n *\r\n * @export\r\n * @param {Record<string, unknown>} json json object\r\n * @param {Options} [options]\r\n *\r\n * @returns {*} {Promise<Record<string, unknown>>}\r\n */\r\nexport async function schemaFrom(\r\n\tjson: Record<string, unknown>,\r\n\toptions?: Options & { nullable?: boolean },\r\n): Promise<Record<string, unknown>> {\r\n\tif (!_toJsonSchema) {\r\n\t\tconst mod = await import('to-json-schema');\r\n\t\t_toJsonSchema = mod.default;\r\n\t}\r\n\r\n\treturn _toJsonSchema(json, {\r\n\t\trequired: false,\r\n\t\t...options,\r\n\t\tpostProcessFnc: (\r\n\t\t\ttype: string,\r\n\t\t\tschema: any,\r\n\t\t\tvalue: unknown,\r\n\t\t\tdefaultFunc: any,\r\n\t\t) => {\r\n\t\t\tif (value !== json) {\r\n\t\t\t\tschema.type = [type];\r\n\t\t\t\tschema.nullable = options?.nullable ?? false;\r\n\t\t\t}\r\n\r\n\t\t\tif (value === null || value === undefined) schema.nullable = true;\r\n\r\n\t\t\treturn defaultFunc(type, schema, value);\r\n\t\t},\r\n\t});\r\n}\r\n\r\n/**\r\n * Validates if a object is a JSON schema.\r\n *\r\n * @export\r\n * @param {Record<string, unknown>} schema\r\n *\r\n * @returns {boolean} if is a JSON schema\r\n */\r\nexport function isJsonSchemaObject(\r\n\tschema: Record<string, unknown>,\r\n): schema is JSONSchemaType<object> {\r\n\tif (schema.type === 'object') return true;\r\n\r\n\treturn (\r\n\t\tArray.isArray(schema.type) &&\r\n\t\t(schema.type as string[]).includes('object')\r\n\t);\r\n}\r\n\r\n/**\r\n * Converts a JSON schema to JSON template.\r\n *\r\n * @export\r\n * @param {Record<string, unknown>} schema JSON schema\r\n * @param {Record<string, any>} [container] template container\r\n *\r\n * @returns {unknown} object or default value\r\n */\r\nexport function schemaToJson(\r\n\tschema: Record<string, unknown>,\r\n\tcontainer: Record<string, any> = {},\r\n): unknown {\r\n\tif (isJsonSchemaObject(schema)) {\r\n\t\tfor (const key in schema.properties)\r\n\t\t\tcontainer[key] = schemaToJson(schema.properties[key]);\r\n\r\n\t\treturn container;\r\n\t} else {\r\n\t\treturn schema.default ?? (schema.nullable ? null : undefined);\r\n\t}\r\n}\r\n\r\n/**\r\n * Flatten a JSON schema.\r\n *\r\n * @export\r\n * @param {Record<string, unknown>} schema JSON schema\r\n * @param {string} [parentKey] previous level key\r\n * @param {string} [nestingDelimiter] char for delimit nesting levels\r\n * @param {Record<string, any>} [container] result container\r\n *\r\n * @returns {Record<string, unknown>} flattened schema\r\n */\r\nexport function flatSchema(\r\n\tschema: Record<string, unknown>,\r\n\tparentKey = '',\r\n\tnestingDelimiter = '__',\r\n\tcontainer: Record<string, any> = {},\r\n): Record<string, unknown> {\r\n\tif (isJsonSchemaObject(schema)) {\r\n\t\tfor (const key in schema.properties) {\r\n\t\t\tif (key[0] === '#') continue;\r\n\r\n\t\t\t// global property, but prefix removed for injection\r\n\t\t\tconst subKey =\r\n\t\t\t\tparentKey + (parentKey ? nestingDelimiter : '') + key;\r\n\r\n\t\t\tcontainer = {\r\n\t\t\t\t...container,\r\n\t\t\t\t...flatSchema(schema.properties[key], subKey, nestingDelimiter),\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\treturn container;\r\n\t} else {\r\n\t\treturn { [parentKey]: schema };\r\n\t}\r\n}\r\n\r\n/**\r\n * Creates a JSON schema validator using AJV.\r\n *\r\n * @see https://ajv.js.org/\r\n *\r\n * @export\r\n * @param {Record<string, object>} schema json schema by provider\r\n * @param {boolean} enableFormats whether formats are enabled\r\n *\r\n * @returns {Promise<ValidateFunction>} validators\r\n */\r\nexport async function createValidator(\r\n\tschema: Record<string, unknown>,\r\n\tenableFormats = true,\r\n): Promise<ValidateFunction> {\r\n\tconst ajv = await getAjv(enableFormats);\r\n\r\n\treturn ajv.compile(schema);\r\n}\r\n\r\n/**\r\n * Creates a JSON schema validator lookup using AJV.\r\n *\r\n * @see https://ajv.js.org/\r\n *\r\n * @export\r\n * @param {Record<string, object>} schemaLookup json schema by provider\r\n * @param {boolean} enableFormats whether formats are enabled\r\n *\r\n * @returns {Promise<Record<string, ValidateFunction>>} validators lookup\r\n */\r\nexport async function createValidators(\r\n\tschemaLookup: Record<string, object>,\r\n\tenableFormats = true,\r\n): Promise<Record<string, ValidateFunction>> {\r\n\tconst ajv = await getAjv(enableFormats);\r\n\r\n\tconst validators: Record<string, ValidateFunction> = {};\r\n\r\n\tfor (const key in schemaLookup)\r\n\t\tvalidators[key] = ajv.compile(schemaLookup[key]);\r\n\r\n\treturn validators;\r\n}\r\n\r\n/**\r\n * Returns a cached AJV instance (lazy-loads ajv and ajv-formats on first call).\r\n *\r\n * @param {boolean} withFormats whether to include format validators\r\n * @returns {Promise<any>} cached AJV instance\r\n */\r\nasync function getAjv(withFormats: boolean): Promise<any> {\r\n\tif (!_AjvClass) {\r\n\t\tconst [ajvMod, formatsMod] = await Promise.all([\r\n\t\t\timport('ajv'),\r\n\t\t\timport('ajv-formats'),\r\n\t\t]);\r\n\t\t_AjvClass = ajvMod.Ajv;\r\n\t\t_addFormats = formatsMod.default;\r\n\t}\r\n\r\n\tif (withFormats) {\r\n\t\tif (!_ajvWithFormats) {\r\n\t\t\t_ajvWithFormats = new _AjvClass({\r\n\t\t\t\tallErrors: true,\r\n\t\t\t\tallowUnionTypes: true,\r\n\t\t\t});\r\n\r\n\t\t\t(\r\n\t\t\t\t_addFormats as unknown as (\r\n\t\t\t\t\tajv: any,\r\n\t\t\t\t\toptions?: { mode?: string },\r\n\t\t\t\t) => void\r\n\t\t\t)(_ajvWithFormats, { mode: 'fast' });\r\n\r\n\t\t\tfor (const key in FORMAT_REGEXPS)\r\n\t\t\t\t_ajvWithFormats.addFormat(key, FORMAT_REGEXPS[key]);\r\n\t\t}\r\n\r\n\t\treturn _ajvWithFormats;\r\n\t}\r\n\r\n\tif (!_ajv) {\r\n\t\t_ajv = new _AjvClass({\r\n\t\t\tallErrors: true,\r\n\t\t\tallowUnionTypes: true,\r\n\t\t});\r\n\t}\r\n\r\n\treturn _ajv;\r\n}\r\n"],"mappings":";AAIA,IAAI,GACA,GAGA,GACA,GACA,GAGE,IAAyC;CAC9C,cACC;CAED,OAAO;CAEP,UACC;CAED,cAAc;CAEd,iBAAiB,MAAkB,CAAC,OAAO,MAAM,CAAC,CAAK;CAEvD,OAAO;CAEP,OAAO;CAEP,OAAO;AACR;AAYA,eAAsB,EACrB,GACA,GACmC;CAMnC,OALA,AAEC,OAAgB,MADE,OAAO,mBACL,SAGd,EAAc,GAAM;EAC1B,UAAU;EACV,GAAG;EACH,iBACC,GACA,GACA,GACA,OAEI,MAAU,MACb,EAAO,OAAO,CAAC,CAAI,GACnB,EAAO,WAAW,GAAS,YAAY,KAGpC,MAAuC,EAAO,WAAW,KAEtD,EAAY,GAAM,GAAQ,CAAK;CAExC,CAAC;AACF;AAUA,SAAgB,EACf,GACmC;CAGnC,OAFI,EAAO,SAAS,WAAiB,KAGpC,MAAM,QAAQ,EAAO,IAAI,KACxB,EAAO,KAAkB,SAAS,QAAQ;AAE7C;AAWA,SAAgB,EACf,GACA,IAAiC,CAAC,GACxB;CACV,IAAI,EAAmB,CAAM,GAAG;EAC/B,KAAK,IAAM,KAAO,EAAO,YACxB,EAAU,KAAO,EAAa,EAAO,WAAW,EAAI;EAErD,OAAO;CACR,OACC,OAAO,EAAO,YAAY,EAAO,WAAW,OAAO,KAAA;AAErD;AAaA,SAAgB,EACf,GACA,IAAY,IACZ,IAAmB,MACnB,IAAiC,CAAC,GACR;CAC1B,IAAI,EAAmB,CAAM,GAAG;EAC/B,KAAK,IAAM,KAAO,EAAO,YAAY;GACpC,IAAI,EAAI,OAAO,KAAK;GAGpB,IAAM,IACL,KAAa,IAAY,IAAmB,MAAM;GAEnD,IAAY;IACX,GAAG;IACH,GAAG,EAAW,EAAO,WAAW,IAAM,GAAQ,CAAgB;GAC/D;EACD;EAEA,OAAO;CACR,OACC,OAAO,GAAG,IAAY,EAAO;AAE/B;AAaA,eAAsB,EACrB,GACA,IAAgB,IACY;CAG5B,QAAO,MAFW,EAAO,CAAa,GAE3B,QAAQ,CAAM;AAC1B;AAaA,eAAsB,EACrB,GACA,IAAgB,IAC4B;CAC5C,IAAM,IAAM,MAAM,EAAO,CAAa,GAEhC,IAA+C,CAAC;CAEtD,KAAK,IAAM,KAAO,GACjB,EAAW,KAAO,EAAI,QAAQ,EAAa,EAAI;CAEhD,OAAO;AACR;AAQA,eAAe,EAAO,GAAoC;CACzD,IAAI,CAAC,GAAW;EACf,IAAM,CAAC,GAAQ,KAAc,MAAM,QAAQ,IAAI,CAC9C,OAAO,QACP,OAAO,cACR,CAAC;EAED,AADA,IAAY,EAAO,KACnB,IAAc,EAAW;CAC1B;CAEA,IAAI,GAAa;EAChB,IAAI,CAAC,GAAiB;GAMrB,AALA,IAAkB,IAAI,EAAU;IAC/B,WAAW;IACX,iBAAiB;GAClB,CAAC,GAED,EAKE,GAAiB,EAAE,MAAM,OAAO,CAAC;GAEnC,KAAK,IAAM,KAAO,GACjB,EAAgB,UAAU,GAAK,EAAe,EAAI;EACpD;EAEA,OAAO;CACR;CASA,OAPA,AACC,MAAO,IAAI,EAAU;EACpB,WAAW;EACX,iBAAiB;CAClB,CAAC,GAGK;AACR"}
package/utils/ui.d.ts ADDED
@@ -0,0 +1,14 @@
1
+ /** Formats a duration in ms as "142ms" or "1.4s". */
2
+ export declare function formatDuration(ms: number): string;
3
+ export declare const ui: {
4
+ header(version: string, env?: string, modes?: string[]): void;
5
+ provider(key: string, count: number): void;
6
+ /** Pretty, sorted, masked dump of the resolved environment (debug level). */
7
+ variables(env: Record<string, unknown>): void;
8
+ summary(total: number, ms: number): void;
9
+ running(command: string): void;
10
+ finished(ms: number): void;
11
+ failed(code: number): void;
12
+ action(emoji: string, message: string): void;
13
+ };
14
+ //# sourceMappingURL=ui.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../../src/utils/ui.ts"],"names":[],"mappings":"AAqDA,qDAAqD;AACrD,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED,eAAO,MAAM,EAAE;oBACE,MAAM,QAAQ,MAAM,UAAU,MAAM,EAAE,GAAG,IAAI;kBAY/C,MAAM,SAAS,MAAM,GAAG,IAAI;IAS1C,6EAA6E;mBAC9D,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;mBA2B9B,MAAM,MAAM,MAAM,GAAG,IAAI;qBAQvB,MAAM,GAAG,IAAI;iBAMjB,MAAM,GAAG,IAAI;iBAKb,MAAM,GAAG,IAAI;kBAKZ,MAAM,WAAW,MAAM,GAAG,IAAI;CAG5C,CAAC"}
package/utils/ui.js ADDED
@@ -0,0 +1,75 @@
1
+ import { LOG_LEVELS as e, logger as t } from "./logger.js";
2
+ import n from "picocolors";
3
+ //#region src/utils/ui.ts
4
+ var r = {
5
+ "app-settings": "๐Ÿ—‚๏ธ",
6
+ "azure-key-vault": "๐Ÿ”",
7
+ local: "๐Ÿ“‚",
8
+ "package-json": "๐Ÿ“ฆ"
9
+ };
10
+ function i(n) {
11
+ return (t.settings.minLevel ?? e.info) <= n;
12
+ }
13
+ function a(t = "", n = e.info) {
14
+ i(n) && process.stdout.write(`${t}\n`);
15
+ }
16
+ function o(e, n) {
17
+ let { maskPlaceholder: r = "***", maskValuesOfKeys: i = [], maskValuesRegEx: a = [] } = t.settings;
18
+ if (i.some((t) => t.toLowerCase() === e.toLowerCase())) return {
19
+ masked: !0,
20
+ value: r
21
+ };
22
+ let o = !1, s = n;
23
+ for (let e of a) {
24
+ let t = s.replaceAll(new RegExp(e.source, "g"), r);
25
+ t !== s && (o = !0), s = t;
26
+ }
27
+ return {
28
+ masked: o,
29
+ value: s
30
+ };
31
+ }
32
+ function s(e) {
33
+ return e < 1e3 ? `${Math.round(e)}ms` : `${(e / 1e3).toFixed(1)}s`;
34
+ }
35
+ var c = {
36
+ header(e, t, r) {
37
+ let i = [n.bold("โšก env") + n.dim(` v${e}`)];
38
+ t && i.push(`๐ŸŒŽ ${n.bold(n.green(t))}`), r && r.length > 0 && i.push(`๐Ÿงฉ ${n.magenta(r.join("+"))}`), a(), a(i.join(n.dim(" ยท "))), a();
39
+ },
40
+ provider(e, t) {
41
+ let i = r[e] ?? "๐Ÿงฉ", o = e === "azure-key-vault" ? "secrets" : "vars";
42
+ a(` ${i} ${n.cyan(e.padEnd(16))} ${n.bold(String(t))} ${n.dim(o)}`);
43
+ },
44
+ variables(t) {
45
+ if (!i(e.debug)) return;
46
+ let r = Object.entries(t).sort(([e], [t]) => e.localeCompare(t)), s = r.reduce((e, [t]) => Math.max(e, t.length), 0);
47
+ a(` ${n.dim(`environment (${r.length} variables)`)}`, e.debug);
48
+ for (let [t, i] of r) {
49
+ let { masked: r, value: c } = o(t, String(i)), l = r ? n.yellow(c) : n.green(c);
50
+ a(` ${n.cyan(t.padEnd(s))} ${n.dim("=")} ${l}`, e.debug);
51
+ }
52
+ a("", e.debug);
53
+ },
54
+ summary(e, t) {
55
+ let r = n.dim(`in ${s(t)}`);
56
+ a(), a(` ${n.green("โœ“")} ${n.bold(String(e))} variables loaded ${r}`);
57
+ },
58
+ running(e) {
59
+ a(), a(` ${n.yellow("โ–ถ")} ${n.bold(e)}`), a();
60
+ },
61
+ finished(e) {
62
+ let t = n.dim(`finished in ${s(e)}`);
63
+ a(` ${n.green("โœ“")} ${t}`);
64
+ },
65
+ failed(e) {
66
+ a(` ${n.red(`โœ— exited with code ${e}`)}`);
67
+ },
68
+ action(e, t) {
69
+ a(` ${e} ${t}`);
70
+ }
71
+ };
72
+ //#endregion
73
+ export { s as formatDuration, c as ui };
74
+
75
+ //# sourceMappingURL=ui.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui.js","names":[],"sources":["../../src/utils/ui.ts"],"sourcesContent":["import pc from 'picocolors';\nimport { LOG_LEVELS, logger } from './logger.js';\n\n// emoji per known integrated provider key\nconst PROVIDER_ICONS: Record<string, string> = {\n\t'app-settings': '๐Ÿ—‚๏ธ',\n\t'azure-key-vault': '๐Ÿ”',\n\tlocal: '๐Ÿ“‚',\n\t'package-json': '๐Ÿ“ฆ',\n};\n\n/** Whether output is visible at the given verbosity (lower = more verbose). */\nfunction visibleAt(level: number): boolean {\n\treturn (logger.settings.minLevel ?? LOG_LEVELS.info) <= level;\n}\n\nfunction line(text = '', level = LOG_LEVELS.info): void {\n\tif (visibleAt(level)) process.stdout.write(`${text}\\n`);\n}\n\n/**\n * Masks a value the same way the logger does, reusing its mask settings, so the\n * pretty variables view never leaks secrets.\n */\nfunction maskValue(\n\tkey: string,\n\tvalue: string,\n): { masked: boolean; value: string } {\n\tconst {\n\t\tmaskPlaceholder = '***',\n\t\tmaskValuesOfKeys = [],\n\t\tmaskValuesRegEx = [],\n\t} = logger.settings;\n\n\tif (maskValuesOfKeys.some((k) => k.toLowerCase() === key.toLowerCase()))\n\t\treturn { masked: true, value: maskPlaceholder };\n\n\tlet masked = false;\n\tlet out = value;\n\n\tfor (const regex of maskValuesRegEx) {\n\t\tconst next = out.replaceAll(\n\t\t\tnew RegExp(regex.source, 'g'),\n\t\t\tmaskPlaceholder,\n\t\t);\n\n\t\tif (next !== out) masked = true;\n\t\tout = next;\n\t}\n\n\treturn { masked, value: out };\n}\n\n/** Formats a duration in ms as \"142ms\" or \"1.4s\". */\nexport function formatDuration(ms: number): string {\n\treturn ms < 1000 ? `${Math.round(ms)}ms` : `${(ms / 1000).toFixed(1)}s`;\n}\n\nexport const ui = {\n\theader(version: string, env?: string, modes?: string[]): void {\n\t\tconst parts = [pc.bold('โšก env') + pc.dim(` v${version}`)];\n\n\t\tif (env) parts.push(`๐ŸŒŽ ${pc.bold(pc.green(env))}`);\n\t\tif (modes && modes.length > 0)\n\t\t\tparts.push(`๐Ÿงฉ ${pc.magenta(modes.join('+'))}`);\n\n\t\tline();\n\t\tline(parts.join(pc.dim(' ยท ')));\n\t\tline();\n\t},\n\n\tprovider(key: string, count: number): void {\n\t\tconst icon = PROVIDER_ICONS[key] ?? '๐Ÿงฉ';\n\t\tconst noun = key === 'azure-key-vault' ? 'secrets' : 'vars';\n\n\t\tline(\n\t\t\t` ${icon} ${pc.cyan(key.padEnd(16))} ${pc.bold(String(count))} ${pc.dim(noun)}`,\n\t\t);\n\t},\n\n\t/** Pretty, sorted, masked dump of the resolved environment (debug level). */\n\tvariables(env: Record<string, unknown>): void {\n\t\tif (!visibleAt(LOG_LEVELS.debug)) return;\n\n\t\tconst entries = Object.entries(env).sort(([a], [b]) =>\n\t\t\ta.localeCompare(b),\n\t\t);\n\t\tconst width = entries.reduce(\n\t\t\t(max, [key]) => Math.max(max, key.length),\n\t\t\t0,\n\t\t);\n\t\tconst heading = pc.dim(`environment (${entries.length} variables)`);\n\n\t\tline(` ${heading}`, LOG_LEVELS.debug);\n\n\t\tfor (const [key, value] of entries) {\n\t\t\tconst { masked, value: shown } = maskValue(key, String(value));\n\t\t\tconst colored = masked ? pc.yellow(shown) : pc.green(shown);\n\n\t\t\tline(\n\t\t\t\t` ${pc.cyan(key.padEnd(width))} ${pc.dim('=')} ${colored}`,\n\t\t\t\tLOG_LEVELS.debug,\n\t\t\t);\n\t\t}\n\n\t\tline('', LOG_LEVELS.debug);\n\t},\n\n\tsummary(total: number, ms: number): void {\n\t\tconst duration = pc.dim(`in ${formatDuration(ms)}`);\n\t\tline();\n\t\tline(\n\t\t\t` ${pc.green('โœ“')} ${pc.bold(String(total))} variables loaded ${duration}`,\n\t\t);\n\t},\n\n\trunning(command: string): void {\n\t\tline();\n\t\tline(` ${pc.yellow('โ–ถ')} ${pc.bold(command)}`);\n\t\tline();\n\t},\n\n\tfinished(ms: number): void {\n\t\tconst duration = pc.dim(`finished in ${formatDuration(ms)}`);\n\t\tline(` ${pc.green('โœ“')} ${duration}`);\n\t},\n\n\tfailed(code: number): void {\n\t\tconst msg = pc.red(`โœ— exited with code ${code}`);\n\t\tline(` ${msg}`);\n\t},\n\n\taction(emoji: string, message: string): void {\n\t\tline(` ${emoji} ${message}`);\n\t},\n};\n"],"mappings":"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"}