@achs/env 4.12.3 → 5.0.0-alpha.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.
Files changed (105) hide show
  1. package/CHANGELOG.md +31 -0
  2. package/README.md +580 -830
  3. package/arguments.d.ts +14 -14
  4. package/arguments.d.ts.map +1 -1
  5. package/arguments.js +135 -131
  6. package/arguments.js.map +1 -1
  7. package/assets/logo-achs.svg +16 -0
  8. package/assets/logo.svg +46 -0
  9. package/commands/env.command.d.ts +8 -2
  10. package/commands/env.command.d.ts.map +1 -1
  11. package/commands/env.command.js +55 -82
  12. package/commands/env.command.js.map +1 -1
  13. package/commands/export.command.d.ts +8 -2
  14. package/commands/export.command.d.ts.map +1 -1
  15. package/commands/export.command.js +53 -62
  16. package/commands/export.command.js.map +1 -1
  17. package/commands/index.d.ts +5 -5
  18. package/commands/index.d.ts.map +1 -1
  19. package/commands/index.js +5 -14
  20. package/commands/pull.command.d.ts +6 -1
  21. package/commands/pull.command.d.ts.map +1 -1
  22. package/commands/pull.command.js +20 -37
  23. package/commands/pull.command.js.map +1 -1
  24. package/commands/push.command.d.ts +6 -1
  25. package/commands/push.command.d.ts.map +1 -1
  26. package/commands/push.command.js +20 -36
  27. package/commands/push.command.js.map +1 -1
  28. package/commands/schema.command.d.ts +6 -1
  29. package/commands/schema.command.d.ts.map +1 -1
  30. package/commands/schema.command.js +16 -17
  31. package/commands/schema.command.js.map +1 -1
  32. package/exec.d.ts +7 -1
  33. package/exec.d.ts.map +1 -1
  34. package/exec.js +84 -160
  35. package/exec.js.map +1 -1
  36. package/index.d.ts +3 -3
  37. package/index.d.ts.map +1 -1
  38. package/index.js +3 -20
  39. package/interfaces/index.d.ts +1 -1
  40. package/interfaces/index.d.ts.map +1 -1
  41. package/interfaces/loader.interface.d.ts +29 -3
  42. package/interfaces/loader.interface.d.ts.map +1 -1
  43. package/main.d.ts +0 -1
  44. package/main.js +7 -26
  45. package/main.js.map +1 -1
  46. package/package.json +55 -34
  47. package/providers/app-settings.provider.d.ts +5 -2
  48. package/providers/app-settings.provider.d.ts.map +1 -1
  49. package/providers/app-settings.provider.js +36 -49
  50. package/providers/app-settings.provider.js.map +1 -1
  51. package/providers/azure-key-vault.provider.d.ts +12 -8
  52. package/providers/azure-key-vault.provider.d.ts.map +1 -1
  53. package/providers/azure-key-vault.provider.js +138 -169
  54. package/providers/azure-key-vault.provider.js.map +1 -1
  55. package/providers/index.d.ts +2 -2
  56. package/providers/index.d.ts.map +1 -1
  57. package/providers/index.js +18 -28
  58. package/providers/index.js.map +1 -1
  59. package/providers/local.provider.d.ts +5 -2
  60. package/providers/local.provider.d.ts.map +1 -1
  61. package/providers/local.provider.js +27 -40
  62. package/providers/local.provider.js.map +1 -1
  63. package/providers/package-json.provider.d.ts +5 -2
  64. package/providers/package-json.provider.d.ts.map +1 -1
  65. package/providers/package-json.provider.js +26 -28
  66. package/providers/package-json.provider.js.map +1 -1
  67. package/utils/argv.util.d.ts +10 -0
  68. package/utils/argv.util.d.ts.map +1 -0
  69. package/utils/argv.util.js +24 -0
  70. package/utils/argv.util.js.map +1 -0
  71. package/utils/command.util.d.ts +70 -3
  72. package/utils/command.util.d.ts.map +1 -1
  73. package/utils/command.util.js +60 -140
  74. package/utils/command.util.js.map +1 -1
  75. package/utils/index.d.ts +7 -6
  76. package/utils/index.d.ts.map +1 -1
  77. package/utils/index.js +8 -23
  78. package/utils/interpolate.util.d.ts +29 -1
  79. package/utils/interpolate.util.d.ts.map +1 -1
  80. package/utils/interpolate.util.js +12 -30
  81. package/utils/interpolate.util.js.map +1 -1
  82. package/utils/json.util.d.ts +41 -3
  83. package/utils/json.util.d.ts.map +1 -1
  84. package/utils/json.util.js +24 -42
  85. package/utils/json.util.js.map +1 -1
  86. package/utils/logger.d.ts +21 -2
  87. package/utils/logger.d.ts.map +1 -1
  88. package/utils/logger.js +31 -17
  89. package/utils/logger.js.map +1 -1
  90. package/utils/normalize.util.d.ts +24 -2
  91. package/utils/normalize.util.d.ts.map +1 -1
  92. package/utils/normalize.util.js +35 -56
  93. package/utils/normalize.util.js.map +1 -1
  94. package/utils/schema.util.d.ts +59 -0
  95. package/utils/schema.util.d.ts.map +1 -1
  96. package/utils/schema.util.js +62 -97
  97. package/utils/schema.util.js.map +1 -1
  98. package/commands/index.js.map +0 -1
  99. package/index.js.map +0 -1
  100. package/interfaces/index.js +0 -18
  101. package/interfaces/index.js.map +0 -1
  102. package/interfaces/loader.interface.js +0 -3
  103. package/interfaces/loader.interface.js.map +0 -1
  104. package/tsconfig.build.tsbuildinfo +0 -1
  105. package/utils/index.js.map +0 -1
@@ -1,42 +1,29 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.LocalProvider = void 0;
7
- const picocolors_1 = __importDefault(require("picocolors"));
8
- const fs_1 = require("fs");
9
- const utils_1 = require("../utils");
10
- const KEY = 'local';
11
- const logger = utils_1.logger.getChildLogger({
12
- prefix: [picocolors_1.default.bold(picocolors_1.default.blue(`[${KEY}]`))]
13
- });
14
- exports.LocalProvider = {
15
- key: KEY,
16
- builder: (builder) => {
17
- builder.options({
18
- localFile: {
19
- group: KEY,
20
- alias: 'lf',
21
- type: 'string',
22
- default: '[[root]]/[[env]].local.env.json',
23
- describe: 'Local secret variables file path'
24
- }
25
- });
26
- },
27
- load: async ({ localFile, ci, env }) => {
28
- if (ci)
29
- return [];
30
- if (!env) {
31
- logger.silly('no env, so skipping provider');
32
- return [];
33
- }
34
- if (!(0, fs_1.existsSync)(localFile)) {
35
- await (0, utils_1.writeJson)(localFile, {});
36
- return [];
37
- }
38
- const [vars] = await (0, utils_1.readJson)(localFile);
39
- return [vars];
40
- }
1
+ import { readJson as e, writeJson as t } from "../utils/json.util.js";
2
+ import { logger as n } from "../utils/logger.js";
3
+ import "../utils/index.js";
4
+ import r from "picocolors";
5
+ import { existsSync as i } from "node:fs";
6
+ //#region src/providers/local.provider.ts
7
+ var a = "local", o = n.getSubLogger({ prefix: [r.bold(r.blue(`[${a}]`))] }), s = {
8
+ key: a,
9
+ builder: (e) => {
10
+ e.options({ localFile: {
11
+ alias: "lf",
12
+ default: "[[root]]/[[env]].local.env.json",
13
+ describe: "Local secret variables file path",
14
+ group: a,
15
+ type: "string"
16
+ } });
17
+ },
18
+ load: async ({ ci: n, env: r, localFile: a }) => {
19
+ if (n) return [];
20
+ if (!r) return o.silly("no env, so skipping provider"), [];
21
+ if (!i(a)) return await t(a, {}), [];
22
+ let [s] = await e(a);
23
+ return [s];
24
+ }
41
25
  };
26
+ //#endregion
27
+ export { s as LocalProvider };
28
+
42
29
  //# sourceMappingURL=local.provider.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"local.provider.js","sourceRoot":"","sources":["../../src/providers/local.provider.ts"],"names":[],"mappings":";;;;;;AAAA,4DAA4B;AAC5B,2BAAgC;AAGhC,oCAAuE;AAEvE,MAAM,GAAG,GAAG,OAAO,CAAC;AAEpB,MAAM,MAAM,GAAG,cAAY,CAAC,cAAc,CAAC;IAC1C,MAAM,EAAE,CAAC,oBAAE,CAAC,IAAI,CAAC,oBAAE,CAAC,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC;CACtC,CAAC,CAAC;AASU,QAAA,aAAa,GAAuC;IAChE,GAAG,EAAE,GAAG;IAER,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE;QACpB,OAAO,CAAC,OAAO,CAAC;YACf,SAAS,EAAE;gBACV,KAAK,EAAE,GAAG;gBACV,KAAK,EAAE,IAAI;gBACX,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,iCAAiC;gBAC1C,QAAQ,EAAE,kCAAkC;aAC5C;SACD,CAAC,CAAC;IACJ,CAAC;IAED,IAAI,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE;QAEtC,IAAI,EAAE;YAAE,OAAO,EAAE,CAAC;QAElB,IAAI,CAAC,GAAG,EAAE,CAAC;YACV,MAAM,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;YAE7C,OAAO,EAAE,CAAC;QACX,CAAC;QAED,IAAI,CAAC,IAAA,eAAU,EAAC,SAAS,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAA,iBAAS,EAAC,SAAS,EAAE,EAAE,CAAC,CAAC;YAE/B,OAAO,EAAE,CAAC;QACX,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,IAAA,gBAAQ,EAAC,SAAS,CAAC,CAAC;QAEzC,OAAO,CAAC,IAAI,CAAC,CAAC;IACf,CAAC;CACD,CAAC"}
1
+ {"version":3,"file":"local.provider.js","names":[],"sources":["../../src/providers/local.provider.ts"],"sourcesContent":["import { existsSync } from 'node:fs';\r\nimport pc from 'picocolors';\r\nimport type { CommandArguments } from '../arguments.js';\r\nimport type { EnvProvider } from '../interfaces/index.js';\r\nimport { logger as globalLogger, readJson, writeJson } from '../utils/index.js';\r\n\r\nconst KEY = 'local';\r\n\r\nconst logger = globalLogger.getSubLogger({\r\n\tprefix: [pc.bold(pc.blue(`[${KEY}]`))],\r\n});\r\n\r\ninterface LocalCommandArguments extends CommandArguments {\r\n\tlocalFile: string;\r\n}\r\n\r\n/**\r\n * Loads local variables from env files in env folder.\r\n */\r\nexport const LocalProvider: EnvProvider<LocalCommandArguments> = {\r\n\tkey: KEY,\r\n\r\n\tbuilder: (builder) => {\r\n\t\tbuilder.options({\r\n\t\t\tlocalFile: {\r\n\t\t\t\talias: 'lf',\r\n\t\t\t\tdefault: '[[root]]/[[env]].local.env.json',\r\n\t\t\t\tdescribe: 'Local 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 ({ ci, env, localFile }) => {\r\n\t\t// ci mode doesn't load local vars\r\n\t\tif (ci) return [];\r\n\r\n\t\tif (!env) {\r\n\t\t\tlogger.silly('no env, so skipping provider');\r\n\r\n\t\t\treturn [];\r\n\t\t}\r\n\r\n\t\tif (!existsSync(localFile)) {\r\n\t\t\tawait writeJson(localFile, {});\r\n\r\n\t\t\treturn [];\r\n\t\t}\r\n\r\n\t\tconst [vars] = await readJson(localFile);\r\n\r\n\t\treturn [vars];\r\n\t},\r\n};\r\n"],"mappings":";;;;;;AAMA,IAAM,IAAM,SAEN,IAAS,EAAa,aAAa,EACxC,QAAQ,CAAC,EAAG,KAAK,EAAG,KAAK,IAAI,EAAI,EAAE,CAAC,CAAC,EACtC,CAAC,GASY,IAAoD;CAChE,KAAK;CAEL,UAAU,MAAY;EACrB,EAAQ,QAAQ,EACf,WAAW;GACV,OAAO;GACP,SAAS;GACT,UAAU;GACV,OAAO;GACP,MAAM;EACP,EACD,CAAC;CACF;CAEA,MAAM,OAAO,EAAE,OAAI,QAAK,mBAAgB;EAEvC,IAAI,GAAI,OAAO,CAAC;EAEhB,IAAI,CAAC,GAGJ,OAFA,EAAO,MAAM,8BAA8B,GAEpC,CAAC;EAGT,IAAI,CAAC,EAAW,CAAS,GAGxB,OAFA,MAAM,EAAU,GAAW,CAAC,CAAC,GAEtB,CAAC;EAGT,IAAM,CAAC,KAAQ,MAAM,EAAS,CAAS;EAEvC,OAAO,CAAC,CAAI;CACb;AACD"}
@@ -1,8 +1,11 @@
1
- import { CommandArguments } from '../arguments';
2
- import { EnvProvider } from '../interfaces';
1
+ import { CommandArguments } from '../arguments.js';
2
+ import { EnvProvider } from '../interfaces/index.js';
3
3
  interface PackageJsonCommandArguments extends CommandArguments {
4
4
  packageInfoPrefix: string;
5
5
  }
6
+ /**
7
+ * Loads project info from package.json.
8
+ */
6
9
  export declare const PackageJsonProvider: EnvProvider<PackageJsonCommandArguments>;
7
10
  export {};
8
11
  //# sourceMappingURL=package-json.provider.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"package-json.provider.d.ts","sourceRoot":"","sources":["../../src/providers/package-json.provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAI5C,UAAU,2BAA4B,SAAQ,gBAAgB;IAC7D,iBAAiB,EAAE,MAAM,CAAC;CAC1B;AAKD,eAAO,MAAM,mBAAmB,EAAE,WAAW,CAAC,2BAA2B,CA6BxE,CAAC"}
1
+ {"version":3,"file":"package-json.provider.d.ts","sourceRoot":"","sources":["../../src/providers/package-json.provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAI1D,UAAU,2BAA4B,SAAQ,gBAAgB;IAC7D,iBAAiB,EAAE,MAAM,CAAC;CAC1B;AAED;;GAEG;AACH,eAAO,MAAM,mBAAmB,EAAE,WAAW,CAAC,2BAA2B,CA6BxE,CAAC"}
@@ -1,30 +1,28 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.PackageJsonProvider = void 0;
4
- const KEY = 'package-json';
5
- exports.PackageJsonProvider = {
6
- key: KEY,
7
- builder: (builder) => {
8
- builder.options({
9
- packageInfoPrefix: {
10
- group: KEY,
11
- alias: 'vp',
12
- type: 'string',
13
- default: '',
14
- describe: 'Prefix for loaded variables using package-json provider'
15
- }
16
- });
17
- },
18
- load: ({ env = 'development', projectInfo, packageInfoPrefix }) => {
19
- const { version, project, name, title, description } = projectInfo;
20
- return {
21
- [`${packageInfoPrefix}ENV`]: env ?? null,
22
- [`${packageInfoPrefix}VERSION`]: version ?? null,
23
- [`${packageInfoPrefix}PROJECT`]: project ?? null,
24
- [`${packageInfoPrefix}NAME`]: name ?? null,
25
- [`${packageInfoPrefix}TITLE`]: title ?? null,
26
- [`${packageInfoPrefix}DESCRIPTION`]: description ?? null
27
- };
28
- }
1
+ //#region src/providers/package-json.provider.ts
2
+ var e = "package-json", t = {
3
+ key: e,
4
+ builder: (t) => {
5
+ t.options({ packageInfoPrefix: {
6
+ alias: "vp",
7
+ default: "",
8
+ group: e,
9
+ type: "string",
10
+ describe: "Prefix for loaded variables using package-json provider"
11
+ } });
12
+ },
13
+ load: ({ env: e = "development", packageInfoPrefix: t, projectInfo: n }) => {
14
+ let { description: r, name: i, project: a, title: o, version: s } = n;
15
+ return {
16
+ [`${t}ENV`]: e ?? null,
17
+ [`${t}DESCRIPTION`]: r ?? null,
18
+ [`${t}NAME`]: i ?? null,
19
+ [`${t}PROJECT`]: a ?? null,
20
+ [`${t}TITLE`]: o ?? null,
21
+ [`${t}VERSION`]: s ?? null
22
+ };
23
+ }
29
24
  };
25
+ //#endregion
26
+ export { t as PackageJsonProvider };
27
+
30
28
  //# sourceMappingURL=package-json.provider.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"package-json.provider.js","sourceRoot":"","sources":["../../src/providers/package-json.provider.ts"],"names":[],"mappings":";;;AAGA,MAAM,GAAG,GAAG,cAAc,CAAC;AASd,QAAA,mBAAmB,GAA6C;IAC5E,GAAG,EAAE,GAAG;IAER,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE;QACpB,OAAO,CAAC,OAAO,CAAC;YACf,iBAAiB,EAAE;gBAClB,KAAK,EAAE,GAAG;gBACV,KAAK,EAAE,IAAI;gBACX,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,EAAE;gBACX,QAAQ,EACP,yDAAyD;aAC1D;SACD,CAAC,CAAC;IACJ,CAAC;IAED,IAAI,EAAE,CAAC,EAAE,GAAG,GAAG,aAAa,EAAE,WAAW,EAAE,iBAAiB,EAAE,EAAE,EAAE;QACjE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,WAAW,CAAC;QAEnE,OAAO;YACN,CAAC,GAAG,iBAAiB,KAAK,CAAC,EAAE,GAAG,IAAI,IAAI;YAExC,CAAC,GAAG,iBAAiB,SAAS,CAAC,EAAE,OAAO,IAAI,IAAI;YAChD,CAAC,GAAG,iBAAiB,SAAS,CAAC,EAAE,OAAO,IAAI,IAAI;YAChD,CAAC,GAAG,iBAAiB,MAAM,CAAC,EAAE,IAAI,IAAI,IAAI;YAC1C,CAAC,GAAG,iBAAiB,OAAO,CAAC,EAAE,KAAK,IAAI,IAAI;YAC5C,CAAC,GAAG,iBAAiB,aAAa,CAAC,EAAE,WAAW,IAAI,IAAI;SACxD,CAAC;IACH,CAAC;CACD,CAAC"}
1
+ {"version":3,"file":"package-json.provider.js","names":[],"sources":["../../src/providers/package-json.provider.ts"],"sourcesContent":["import type { CommandArguments } from '../arguments.js';\r\nimport type { EnvProvider } from '../interfaces/index.js';\r\n\r\nconst KEY = 'package-json';\r\n\r\ninterface PackageJsonCommandArguments extends CommandArguments {\r\n\tpackageInfoPrefix: string;\r\n}\r\n\r\n/**\r\n * Loads project info from package.json.\r\n */\r\nexport const PackageJsonProvider: EnvProvider<PackageJsonCommandArguments> = {\r\n\tkey: KEY,\r\n\r\n\tbuilder: (builder) => {\r\n\t\tbuilder.options({\r\n\t\t\tpackageInfoPrefix: {\r\n\t\t\t\talias: 'vp',\r\n\t\t\t\tdefault: '',\r\n\t\t\t\tgroup: KEY,\r\n\t\t\t\ttype: 'string',\r\n\t\t\t\tdescribe:\r\n\t\t\t\t\t'Prefix for loaded variables using package-json provider',\r\n\t\t\t},\r\n\t\t});\r\n\t},\r\n\r\n\tload: ({ env = 'development', packageInfoPrefix, projectInfo }) => {\r\n\t\tconst { description, name, project, title, version } = projectInfo;\r\n\r\n\t\treturn {\r\n\t\t\t[`${packageInfoPrefix}ENV`]: env ?? null,\r\n\r\n\t\t\t[`${packageInfoPrefix}DESCRIPTION`]: description ?? null,\r\n\t\t\t[`${packageInfoPrefix}NAME`]: name ?? null,\r\n\t\t\t[`${packageInfoPrefix}PROJECT`]: project ?? null,\r\n\t\t\t[`${packageInfoPrefix}TITLE`]: title ?? null,\r\n\t\t\t[`${packageInfoPrefix}VERSION`]: version ?? null,\r\n\t\t};\r\n\t},\r\n};\r\n"],"mappings":";AAGA,IAAM,IAAM,gBASC,IAAgE;CAC5E,KAAK;CAEL,UAAU,MAAY;EACrB,EAAQ,QAAQ,EACf,mBAAmB;GAClB,OAAO;GACP,SAAS;GACT,OAAO;GACP,MAAM;GACN,UACC;EACF,EACD,CAAC;CACF;CAEA,OAAO,EAAE,SAAM,eAAe,sBAAmB,qBAAkB;EAClE,IAAM,EAAE,gBAAa,SAAM,YAAS,UAAO,eAAY;EAEvD,OAAO;IACL,GAAG,EAAkB,OAAO,KAAO;IAEnC,GAAG,EAAkB,eAAe,KAAe;IACnD,GAAG,EAAkB,QAAQ,KAAQ;IACrC,GAAG,EAAkB,WAAW,KAAW;IAC3C,GAAG,EAAkB,SAAS,KAAS;IACvC,GAAG,EAAkB,WAAW,KAAW;EAC7C;CACD;AACD"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Recombines argv tokens so single-quoted, space-containing argument values
3
+ * survive shell splitting. Mirrors the original main.ts pre-processing as a
4
+ * pure, testable function.
5
+ *
6
+ * @param argv raw process.argv
7
+ * @returns normalized argv (already sliced past node + script path)
8
+ */
9
+ export declare function normalizeRawArgv(argv: string[]): string[];
10
+ //# sourceMappingURL=argv.util.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"argv.util.d.ts","sourceRoot":"","sources":["../../src/utils/argv.util.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CA2BzD"}
@@ -0,0 +1,24 @@
1
+ //#region src/utils/argv.util.ts
2
+ function e(e) {
3
+ let t = [], n = "";
4
+ for (let r of e) {
5
+ if (r.includes(" ") && (r = `"${r}"`), r.at(-1) === "'") {
6
+ t.push(`${n} ${r}`.replaceAll("'", "\"")), n = "";
7
+ continue;
8
+ }
9
+ if (r[0] === "'") {
10
+ n += r;
11
+ continue;
12
+ }
13
+ if (n) {
14
+ n += ` ${r}`;
15
+ continue;
16
+ }
17
+ t.push(r);
18
+ }
19
+ return t.slice(2);
20
+ }
21
+ //#endregion
22
+ export { e as normalizeRawArgv };
23
+
24
+ //# sourceMappingURL=argv.util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"argv.util.js","names":[],"sources":["../../src/utils/argv.util.ts"],"sourcesContent":["/**\n * Recombines argv tokens so single-quoted, space-containing argument values\n * survive shell splitting. Mirrors the original main.ts pre-processing as a\n * pure, testable function.\n *\n * @param argv raw process.argv\n * @returns normalized argv (already sliced past node + script path)\n */\nexport function normalizeRawArgv(argv: string[]): string[] {\n\tconst cmdArgs: string[] = [];\n\tlet composite = '';\n\n\tfor (let arg of argv) {\n\t\tif (arg.includes(' ')) arg = `\"${arg}\"`;\n\n\t\tif (arg.at(-1) === \"'\") {\n\t\t\tcmdArgs.push(`${composite} ${arg}`.replaceAll(\"'\", '\"'));\n\t\t\tcomposite = '';\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (arg[0] === \"'\") {\n\t\t\tcomposite += arg;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (composite) {\n\t\t\tcomposite += ` ${arg}`;\n\t\t\tcontinue;\n\t\t}\n\n\t\tcmdArgs.push(arg);\n\t}\n\n\treturn cmdArgs.slice(2);\n}\n"],"mappings":";AAQA,SAAgB,EAAiB,GAA0B;CAC1D,IAAM,IAAoB,CAAC,GACvB,IAAY;CAEhB,KAAK,IAAI,KAAO,GAAM;EAGrB,IAFI,EAAI,SAAS,GAAG,MAAG,IAAM,IAAI,EAAI,KAEjC,EAAI,GAAG,EAAE,MAAM,KAAK;GAEvB,AADA,EAAQ,KAAK,GAAG,EAAU,GAAG,IAAM,WAAW,KAAK,IAAG,CAAC,GACvD,IAAY;GACZ;EACD;EAEA,IAAI,EAAI,OAAO,KAAK;GACnB,KAAa;GACb;EACD;EAEA,IAAI,GAAW;GACd,KAAa,IAAI;GACjB;EACD;EAEA,EAAQ,KAAK,CAAG;CACjB;CAEA,OAAO,EAAQ,MAAM,CAAC;AACvB"}
@@ -1,13 +1,80 @@
1
1
  import { Arguments } from 'yargs';
2
- import { CommandArguments } from 'arguments';
3
- import { EnvCommandArguments } from 'commands/env.command';
4
- import { EnvProviderConfig, EnvProviderResult } from '../interfaces';
2
+ import { CommandArguments } from '../arguments.js';
3
+ import { EnvCommandArguments } from '../commands/env.command.js';
4
+ import { EnvProviderConfig, EnvProviderResult } from '../interfaces/index.js';
5
+ /**
6
+ * Injects config to command arguments from file.
7
+ *
8
+ * @param {Record<string, unknown>} argv
9
+ * @param {[string, string]} delimiters
10
+ */
5
11
  export declare function loadConfigFile(argv: Record<string, unknown>, delimiters: [string, string]): Promise<void>;
12
+ /**
13
+ * Extracts subcommand from command line parameters.
14
+ *
15
+ * @export
16
+ * @param {string[]} rawArgv process.argv.slice(2)
17
+ * @param {[string, string]} delimiters
18
+ *
19
+ * @returns {string[]} subcommand for wrap if exists
20
+ */
6
21
  export declare function getSubcommand(rawArgv: string[], delimiters: [string, string]): string[];
22
+ /**
23
+ * Loads providers JSON schema from file.
24
+ *
25
+ * @param {Record<string, unknown>} argv
26
+ * @param {[string, string]} delimiters
27
+ *
28
+ * @returns {Promise<Record<string, unknown>>}
29
+ */
7
30
  export declare function loadSchemaFile(argv: Record<string, unknown>, delimiters: [string, string]): Promise<Record<string, unknown> | undefined>;
31
+ /**
32
+ * Reads project package.json.
33
+ *
34
+ * @export
35
+ * @returns {Promise<Record<string, unknown>> | never}
36
+ */
8
37
  export declare function loadProjectInfo(relativePath?: string): Promise<Record<string, unknown>>;
38
+ /**
39
+ * Executes load functions from provider handlers.
40
+ *
41
+ * @param {EnvProviderConfig[]} providers
42
+ * @param {Partial<Arguments<EnvCommandArguments>>} argv
43
+ *
44
+ * @returns {EnvProviderResult[]}
45
+ */
9
46
  export declare function loadVariablesFromProviders(providers: EnvProviderConfig[], argv: Partial<Arguments<EnvCommandArguments>>): Promise<EnvProviderResult[]>;
47
+ /**
48
+ * Flattern environment provider results.
49
+ *
50
+ * @param {EnvProviderResult[]} results
51
+ * @param {Partial<Arguments<EnvCommandArguments>>} argv
52
+ *
53
+ * @throws {Error} on schema validation failed
54
+ *
55
+ * @returns {EnvProviderResult[]} flatten results
56
+ */
10
57
  export declare function flatResults(results: EnvProviderResult[], nestingDelimiter?: string): EnvProviderResult[] | never;
58
+ /**
59
+ * Flattern and validates environment provider results.
60
+ *
61
+ * @param {EnvProviderResult[]} results
62
+ * @param {Partial<Arguments<EnvCommandArguments>>} argv
63
+ *
64
+ * @throws {Error} on schema validation failed
65
+ *
66
+ * @returns {EnvProviderResult[]}
67
+ */
11
68
  export declare function flatAndValidateResults(results: EnvProviderResult[], argv: Partial<Arguments<EnvCommandArguments>>): EnvProviderResult[] | never;
69
+ /**
70
+ * Creates or updates JSON schema from
71
+ * environment variables grouped by provider key.
72
+ *
73
+ * @export
74
+ * @param {EnvProviderResult[]} env
75
+ * @param {Arguments<EnvCommandArguments>} argv
76
+ *
77
+ * @returns {Promise<object>} JSON schema grouped by provider key.
78
+ */
12
79
  export declare function generateSchemaFrom(env: EnvProviderResult[], argv: Arguments<CommandArguments>): Promise<object>;
13
80
  //# sourceMappingURL=command.util.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"command.util.d.ts","sourceRoot":"","sources":["../../src/utils/command.util.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAClC,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAkBrE,wBAAsB,cAAc,CACnC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,GAC1B,OAAO,CAAC,IAAI,CAAC,CAOf;AAWD,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,YAgB5E;AAUD,wBAAsB,cAAc,CACnC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,GAC1B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC,CAS9C;AAQD,wBAAsB,eAAe,CACpC,YAAY,SAAK,GACf,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAYlC;AAUD,wBAAgB,0BAA0B,CACzC,SAAS,EAAE,iBAAiB,EAAE,EAC9B,IAAI,EAAE,OAAO,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC,GAC3C,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAoB9B;AAYD,wBAAgB,WAAW,CAC1B,OAAO,EAAE,iBAAiB,EAAE,EAC5B,gBAAgB,SAAO,GACrB,iBAAiB,EAAE,GAAG,KAAK,CAO7B;AAYD,wBAAgB,sBAAsB,CACrC,OAAO,EAAE,iBAAiB,EAAE,EAC5B,IAAI,EAAE,OAAO,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC,GAC3C,iBAAiB,EAAE,GAAG,KAAK,CA6B7B;AAYD,wBAAsB,kBAAkB,CACvC,GAAG,EAAE,iBAAiB,EAAE,EACxB,IAAI,EAAE,SAAS,CAAC,gBAAgB,CAAC,GAC/B,OAAO,CAAC,MAAM,CAAC,CAuBjB"}
1
+ {"version":3,"file":"command.util.d.ts","sourceRoot":"","sources":["../../src/utils/command.util.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,KAAK,EACX,iBAAiB,EACjB,iBAAiB,EACjB,MAAM,wBAAwB,CAAC;AAWhC;;;;;GAKG;AACH,wBAAsB,cAAc,CACnC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,GAC1B,OAAO,CAAC,IAAI,CAAC,CAOf;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,YAkB5E;AAED;;;;;;;GAOG;AACH,wBAAsB,cAAc,CACnC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,GAC1B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC,CAS9C;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAC9B,YAAY,SAAK,GACf,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAiBlC;AAED;;;;;;;GAOG;AACH,wBAAgB,0BAA0B,CACzC,SAAS,EAAE,iBAAiB,EAAE,EAC9B,IAAI,EAAE,OAAO,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC,GAC3C,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAY9B;AAED;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CAC1B,OAAO,EAAE,iBAAiB,EAAE,EAC5B,gBAAgB,SAAO,GACrB,iBAAiB,EAAE,GAAG,KAAK,CAO7B;AAED;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CACrC,OAAO,EAAE,iBAAiB,EAAE,EAC5B,IAAI,EAAE,OAAO,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC,GAC3C,iBAAiB,EAAE,GAAG,KAAK,CA6B7B;AAED;;;;;;;;;GASG;AACH,wBAAsB,kBAAkB,CACvC,GAAG,EAAE,iBAAiB,EAAE,EACxB,IAAI,EAAE,SAAS,CAAC,gBAAgB,CAAC,GAC/B,OAAO,CAAC,MAAM,CAAC,CAqBjB"}
@@ -1,149 +1,69 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
- var __importDefault = (this && this.__importDefault) || function (mod) {
36
- return (mod && mod.__esModule) ? mod : { "default": mod };
37
- };
38
- Object.defineProperty(exports, "__esModule", { value: true });
39
- exports.loadConfigFile = loadConfigFile;
40
- exports.getSubcommand = getSubcommand;
41
- exports.loadSchemaFile = loadSchemaFile;
42
- exports.loadProjectInfo = loadProjectInfo;
43
- exports.loadVariablesFromProviders = loadVariablesFromProviders;
44
- exports.flatResults = flatResults;
45
- exports.flatAndValidateResults = flatAndValidateResults;
46
- exports.generateSchemaFrom = generateSchemaFrom;
47
- const picocolors_1 = __importDefault(require("picocolors"));
48
- const merge_deep_1 = __importDefault(require("merge-deep"));
49
- const utils_1 = require("../utils");
50
- const path_1 = __importDefault(require("path"));
51
- async function loadConfigFile(argv, delimiters) {
52
- if (typeof argv.configFile === 'string') {
53
- const path = (0, utils_1.interpolate)(argv.configFile, argv, delimiters);
54
- const [config, success] = await (0, utils_1.readJson)(path);
55
- if (success)
56
- for (const key in config)
57
- argv[key] ??= config[key];
58
- }
1
+ import { interpolate as e } from "./interpolate.util.js";
2
+ import { readJson as t, writeJson as n } from "./json.util.js";
3
+ import { logger as r } from "./logger.js";
4
+ import { flatten as i } from "./normalize.util.js";
5
+ import { createValidators as a, schemaFrom as o } from "./schema.util.js";
6
+ import "./index.js";
7
+ import s from "picocolors";
8
+ import c from "merge-deep";
9
+ import { readFileSync as l } from "node:fs";
10
+ import u from "node:path";
11
+ //#region src/utils/command.util.ts
12
+ async function d(n, r) {
13
+ if (typeof n.configFile == "string") {
14
+ let [i, a] = await t(e(n.configFile, n, r));
15
+ if (a) for (let e in i) n[e] ??= i[e];
16
+ }
59
17
  }
60
- function getSubcommand(rawArgv, delimiters) {
61
- let subcommand = [];
62
- const begin = rawArgv.indexOf(delimiters[0]);
63
- const count = rawArgv.lastIndexOf(delimiters[1]) - begin;
64
- if (begin > 0) {
65
- subcommand =
66
- count > 0
67
- ? rawArgv.splice(begin, count + 1).slice(1, -1)
68
- : rawArgv.splice(begin).slice(1);
69
- }
70
- return subcommand;
18
+ function f(e, t) {
19
+ let n = [], r = e.indexOf(t[0]), i = e.lastIndexOf(t[1]) - r;
20
+ return r > 0 && (n = i > 0 ? e.splice(r, i + 1).slice(1, -1) : e.splice(r).slice(1)), n;
71
21
  }
72
- async function loadSchemaFile(argv, delimiters) {
73
- if (typeof argv.schemaFile === 'string') {
74
- const path = (0, utils_1.interpolate)(argv.schemaFile, argv, delimiters);
75
- const [schema, success] = await (0, utils_1.readJson)(path);
76
- return success ? schema : undefined;
77
- }
78
- return undefined;
22
+ async function p(n, r) {
23
+ if (typeof n.schemaFile == "string") {
24
+ let [i, a] = await t(e(n.schemaFile, n, r));
25
+ return a ? i : void 0;
26
+ }
79
27
  }
80
- async function loadProjectInfo(relativePath = '') {
81
- try {
82
- return await Promise.resolve(`${path_1.default.join(process.cwd(), relativePath, 'package.json')}`).then(s => __importStar(require(s)));
83
- }
84
- catch {
85
- utils_1.logger.warn(`project file ${picocolors_1.default.underline(picocolors_1.default.yellow('package.json'))} not found`);
86
- return {};
87
- }
28
+ function m(e = "") {
29
+ try {
30
+ let t = u.join(process.cwd(), e, "package.json");
31
+ return Promise.resolve(JSON.parse(l(t, "utf8")));
32
+ } catch {
33
+ return r.warn(`project file ${s.underline(s.yellow("package.json"))} not found`), Promise.resolve({});
34
+ }
88
35
  }
89
- function loadVariablesFromProviders(providers, argv) {
90
- if (!providers)
91
- return Promise.resolve([]);
92
- return Promise.all(providers.map(({ handler: { key, load }, config }) => {
93
- utils_1.logger.silly(`executing ${picocolors_1.default.yellow(key)} provider`);
94
- const value = load(argv, config);
95
- if (value instanceof Promise) {
96
- return value.then((value) => ({
97
- key,
98
- config,
99
- value
100
- }));
101
- }
102
- else {
103
- return { key, config, value };
104
- }
105
- }));
36
+ function h(e, t) {
37
+ return e ? Promise.all(e.map(async ({ config: e, handler: { key: n, load: i } }) => (r.silly(`executing ${s.yellow(n)} provider`), {
38
+ config: e,
39
+ key: n,
40
+ value: await i(t, e)
41
+ }))) : Promise.resolve([]);
106
42
  }
107
- function flatResults(results, nestingDelimiter = '__') {
108
- return results.flatMap(({ value }) => {
109
- if (Array.isArray(value))
110
- return (0, merge_deep_1.default)({}, ...value.map((v) => (0, utils_1.flatten)(v, nestingDelimiter)));
111
- return (0, utils_1.flatten)(value, nestingDelimiter);
112
- });
43
+ function g(e, t = "__") {
44
+ return e.flatMap(({ value: e }) => Array.isArray(e) ? c({}, ...e.map((e) => i(e, t))) : i(e, t));
113
45
  }
114
- function flatAndValidateResults(results, argv) {
115
- if (!argv.schemaValidate)
116
- return flatResults(results, argv.nestingDelimiter);
117
- const validators = (0, utils_1.createValidators)(argv.schema, argv.detectFormat);
118
- return results.flatMap(({ key, value }) => {
119
- let baseValue = value;
120
- if (Array.isArray(value)) {
121
- value = (0, merge_deep_1.default)({}, ...value);
122
- baseValue = (0, merge_deep_1.default)({}, ...baseValue.map((v) => (0, utils_1.flatten)(v, argv.nestingDelimiter)));
123
- }
124
- else {
125
- baseValue = (0, utils_1.flatten)(value, argv.nestingDelimiter);
126
- }
127
- const validator = validators[key];
128
- if (!validator || validator?.(value))
129
- return baseValue;
130
- utils_1.logger.error(`schema validation failed for ${picocolors_1.default.yellow(key)}`, validator?.errors);
131
- throw new Error(`schema validation failed for ${key}`);
132
- });
46
+ function _(e, t) {
47
+ if (!t.schemaValidate) return g(e, t.nestingDelimiter);
48
+ let n = a(t.schema, t.detectFormat);
49
+ return e.flatMap(({ key: e, value: a }) => {
50
+ let o = a;
51
+ Array.isArray(a) ? (a = c({}, ...a), o = c({}, ...o.map((e) => i(e, t.nestingDelimiter)))) : o = i(a, t.nestingDelimiter);
52
+ let l = n[e];
53
+ if (!l || l?.(a)) return o;
54
+ throw r.error(`schema validation failed for ${s.yellow(e)}`, l?.errors), Error(`schema validation failed for ${e}`);
55
+ });
133
56
  }
134
- async function generateSchemaFrom(env, argv) {
135
- const { resolve, nullable, detectFormat, schemaFile } = argv;
136
- let schema = env.reduce((schema, { key, value }) => {
137
- const env = Array.isArray(value) ? (0, merge_deep_1.default)({}, ...value) : value;
138
- schema[key] = (0, utils_1.schemaFrom)(env, {
139
- nullable,
140
- strings: { detectFormat }
141
- });
142
- return schema;
143
- }, {});
144
- if (resolve === 'merge')
145
- schema = (0, merge_deep_1.default)(argv.schema, schema);
146
- await (0, utils_1.writeJson)(schemaFile, schema, true);
147
- return schema;
57
+ async function v(e, t) {
58
+ let { detectFormat: r, nullable: i, resolve: a, schemaFile: s } = t, l = {};
59
+ for (let { key: t, value: n } of e) l[t] = o(Array.isArray(n) ? c({}, ...n) : n, {
60
+ nullable: i,
61
+ strings: { detectFormat: r }
62
+ });
63
+ let u = l;
64
+ return a === "merge" && (u = c(t.schema, u)), await n(s, u, !0), u;
148
65
  }
66
+ //#endregion
67
+ export { _ as flatAndValidateResults, g as flatResults, v as generateSchemaFrom, f as getSubcommand, d as loadConfigFile, m as loadProjectInfo, p as loadSchemaFile, h as loadVariablesFromProviders };
68
+
149
69
  //# sourceMappingURL=command.util.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"command.util.js","sourceRoot":"","sources":["../../src/utils/command.util.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"command.util.js","names":[],"sources":["../../src/utils/command.util.ts"],"sourcesContent":["import merge from 'merge-deep';\r\nimport { readFileSync } from 'node:fs';\r\nimport Path from 'node:path';\r\nimport pc from 'picocolors';\r\nimport type { Arguments } from 'yargs';\r\nimport type { CommandArguments } from '../arguments.js';\r\nimport type { EnvCommandArguments } from '../commands/env.command.js';\r\nimport type {\r\n\tEnvProviderConfig,\r\n\tEnvProviderResult,\r\n} from '../interfaces/index.js';\r\nimport {\r\n\tcreateValidators,\r\n\tflatten,\r\n\tinterpolate,\r\n\tlogger,\r\n\treadJson,\r\n\tschemaFrom,\r\n\twriteJson,\r\n} from './index.js';\r\n\r\n/**\r\n * Injects config to command arguments from file.\r\n *\r\n * @param {Record<string, unknown>} argv\r\n * @param {[string, string]} delimiters\r\n */\r\nexport async function loadConfigFile(\r\n\targv: Record<string, unknown>,\r\n\tdelimiters: [string, string],\r\n): Promise<void> {\r\n\tif (typeof argv.configFile === 'string') {\r\n\t\tconst path = interpolate(argv.configFile, argv, delimiters);\r\n\t\tconst [config, success] = await readJson(path);\r\n\r\n\t\tif (success) for (const key in config) argv[key] ??= config[key];\r\n\t}\r\n}\r\n\r\n/**\r\n * Extracts subcommand from command line parameters.\r\n *\r\n * @export\r\n * @param {string[]} rawArgv process.argv.slice(2)\r\n * @param {[string, string]} delimiters\r\n *\r\n * @returns {string[]} subcommand for wrap if exists\r\n */\r\nexport function getSubcommand(rawArgv: string[], delimiters: [string, string]) {\r\n\tlet subcommand: string[] = [];\r\n\r\n\t// subcommand delimiter indexes\r\n\r\n\tconst begin = rawArgv.indexOf(delimiters[0]);\r\n\r\n\tconst count = rawArgv.lastIndexOf(delimiters[1]) - begin;\r\n\r\n\t// calculates subcommand surrounded by delimiters\r\n\tif (begin > 0) {\r\n\t\tsubcommand =\r\n\t\t\tcount > 0\r\n\t\t\t\t? rawArgv.splice(begin, count + 1).slice(1, -1)\r\n\t\t\t\t: rawArgv.splice(begin).slice(1);\r\n\t}\r\n\r\n\treturn subcommand;\r\n}\r\n\r\n/**\r\n * Loads providers JSON schema from file.\r\n *\r\n * @param {Record<string, unknown>} argv\r\n * @param {[string, string]} delimiters\r\n *\r\n * @returns {Promise<Record<string, unknown>>}\r\n */\r\nexport async function loadSchemaFile(\r\n\targv: Record<string, unknown>,\r\n\tdelimiters: [string, string],\r\n): Promise<Record<string, unknown> | undefined> {\r\n\tif (typeof argv.schemaFile === 'string') {\r\n\t\tconst path = interpolate(argv.schemaFile, argv, delimiters);\r\n\t\tconst [schema, success] = await readJson(path);\r\n\r\n\t\treturn success ? schema : undefined;\r\n\t}\r\n\r\n\treturn undefined;\r\n}\r\n\r\n/**\r\n * Reads project package.json.\r\n *\r\n * @export\r\n * @returns {Promise<Record<string, unknown>> | never}\r\n */\r\nexport function loadProjectInfo(\r\n\trelativePath = '',\r\n): Promise<Record<string, unknown>> {\r\n\ttry {\r\n\t\tconst filePath = Path.join(process.cwd(), relativePath, 'package.json');\r\n\r\n\t\treturn Promise.resolve(\r\n\t\t\tJSON.parse(readFileSync(filePath, 'utf8')) as Record<\r\n\t\t\t\tstring,\r\n\t\t\t\tunknown\r\n\t\t\t>,\r\n\t\t);\r\n\t} catch {\r\n\t\tlogger.warn(\r\n\t\t\t`project file ${pc.underline(pc.yellow('package.json'))} not found`,\r\n\t\t);\r\n\r\n\t\treturn Promise.resolve({});\r\n\t}\r\n}\r\n\r\n/**\r\n * Executes load functions from provider handlers.\r\n *\r\n * @param {EnvProviderConfig[]} providers\r\n * @param {Partial<Arguments<EnvCommandArguments>>} argv\r\n *\r\n * @returns {EnvProviderResult[]}\r\n */\r\nexport function loadVariablesFromProviders(\r\n\tproviders: EnvProviderConfig[],\r\n\targv: Partial<Arguments<EnvCommandArguments>>,\r\n): Promise<EnvProviderResult[]> {\r\n\tif (!providers) return Promise.resolve([]) as Promise<EnvProviderResult[]>;\r\n\r\n\treturn Promise.all(\r\n\t\tproviders.map(async ({ config, handler: { key, load } }) => {\r\n\t\t\tlogger.silly(`executing ${pc.yellow(key)} provider`);\r\n\r\n\t\t\tconst value = await load(argv, config);\r\n\r\n\t\t\treturn { config, key, value };\r\n\t\t}),\r\n\t);\r\n}\r\n\r\n/**\r\n * Flattern environment provider results.\r\n *\r\n * @param {EnvProviderResult[]} results\r\n * @param {Partial<Arguments<EnvCommandArguments>>} argv\r\n *\r\n * @throws {Error} on schema validation failed\r\n *\r\n * @returns {EnvProviderResult[]} flatten results\r\n */\r\nexport function flatResults(\r\n\tresults: EnvProviderResult[],\r\n\tnestingDelimiter = '__',\r\n): EnvProviderResult[] | never {\r\n\treturn results.flatMap(({ value }) => {\r\n\t\tif (Array.isArray(value))\r\n\t\t\treturn merge({}, ...value.map((v) => flatten(v, nestingDelimiter)));\r\n\r\n\t\treturn flatten(value, nestingDelimiter);\r\n\t});\r\n}\r\n\r\n/**\r\n * Flattern and validates environment provider results.\r\n *\r\n * @param {EnvProviderResult[]} results\r\n * @param {Partial<Arguments<EnvCommandArguments>>} argv\r\n *\r\n * @throws {Error} on schema validation failed\r\n *\r\n * @returns {EnvProviderResult[]}\r\n */\r\nexport function flatAndValidateResults(\r\n\tresults: EnvProviderResult[],\r\n\targv: Partial<Arguments<EnvCommandArguments>>,\r\n): EnvProviderResult[] | never {\r\n\tif (!argv.schemaValidate)\r\n\t\treturn flatResults(results, argv.nestingDelimiter);\r\n\r\n\tconst validators = createValidators(argv.schema!, argv.detectFormat);\r\n\r\n\treturn results.flatMap(({ key, value }) => {\r\n\t\tlet baseValue = value;\r\n\t\tif (Array.isArray(value)) {\r\n\t\t\tvalue = merge({}, ...value);\r\n\t\t\tbaseValue = merge(\r\n\t\t\t\t{},\r\n\t\t\t\t...baseValue.map((v: any) => flatten(v, argv.nestingDelimiter)),\r\n\t\t\t);\r\n\t\t} else {\r\n\t\t\tbaseValue = flatten(value, argv.nestingDelimiter);\r\n\t\t}\r\n\r\n\t\tconst validator = validators![key];\r\n\r\n\t\tif (!validator || validator?.(value)) return baseValue;\r\n\r\n\t\tlogger.error(\r\n\t\t\t`schema validation failed for ${pc.yellow(key)}`,\r\n\t\t\tvalidator?.errors,\r\n\t\t);\r\n\r\n\t\tthrow new Error(`schema validation failed for ${key}`);\r\n\t});\r\n}\r\n\r\n/**\r\n * Creates or updates JSON schema from\r\n * environment variables grouped by provider key.\r\n *\r\n * @export\r\n * @param {EnvProviderResult[]} env\r\n * @param {Arguments<EnvCommandArguments>} argv\r\n *\r\n * @returns {Promise<object>} JSON schema grouped by provider key.\r\n */\r\nexport async function generateSchemaFrom(\r\n\tenv: EnvProviderResult[],\r\n\targv: Arguments<CommandArguments>,\r\n): Promise<object> {\r\n\tconst { detectFormat, nullable, resolve, schemaFile } = argv;\r\n\r\n\t// generates schemas from providers results\r\n\tconst schemaEntries: Record<string, unknown> = {};\r\n\tfor (const { key, value } of env) {\r\n\t\tconst merged = Array.isArray(value) ? merge({}, ...value) : value;\r\n\r\n\t\tschemaEntries[key] = schemaFrom(merged, {\r\n\t\t\tnullable,\r\n\t\t\tstrings: { detectFormat },\r\n\t\t});\r\n\t}\r\n\r\n\tlet schema: Record<string, unknown> = schemaEntries;\r\n\r\n\tif (resolve === 'merge') schema = merge(argv.schema, schema);\r\n\r\n\tawait writeJson(schemaFile, schema, true);\r\n\r\n\treturn schema;\r\n}\r\n"],"mappings":"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"}
package/utils/index.d.ts CHANGED
@@ -1,7 +1,8 @@
1
- export * from './command.util';
2
- export * from './interpolate.util';
3
- export * from './json.util';
4
- export * from './logger';
5
- export * from './normalize.util';
6
- export * from './schema.util';
1
+ export * from './argv.util.js';
2
+ export * from './command.util.js';
3
+ export * from './interpolate.util.js';
4
+ export * from './json.util.js';
5
+ export * from './logger.js';
6
+ export * from './normalize.util.js';
7
+ export * from './schema.util.js';
7
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC"}