varlock 0.0.2 → 0.0.4

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 (80) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +48 -25
  3. package/dist/auto-load.js +7 -8
  4. package/dist/auto-load.js.map +1 -1
  5. package/dist/{chunk-O2QPQ5MG.js → chunk-A4AHZSZB.js} +7 -6
  6. package/dist/chunk-A4AHZSZB.js.map +1 -0
  7. package/dist/{chunk-4WO4BGKU.js → chunk-C273RDM5.js} +15 -8
  8. package/dist/chunk-C273RDM5.js.map +1 -0
  9. package/dist/chunk-CLVBJA4G.js +107 -0
  10. package/dist/chunk-CLVBJA4G.js.map +1 -0
  11. package/dist/chunk-DHFEY3C4.js +141 -0
  12. package/dist/chunk-DHFEY3C4.js.map +1 -0
  13. package/dist/{chunk-Z55UMN2B.js → chunk-DOIKZ3NG.js} +4 -4
  14. package/dist/{chunk-Z55UMN2B.js.map → chunk-DOIKZ3NG.js.map} +1 -1
  15. package/dist/{chunk-G4BD2BPH.js → chunk-DROJWTCD.js} +237 -76
  16. package/dist/chunk-DROJWTCD.js.map +1 -0
  17. package/dist/chunk-FGMXIEFA.js +20 -0
  18. package/dist/chunk-FGMXIEFA.js.map +1 -0
  19. package/dist/{chunk-LQZ6ICSS.js → chunk-GSRDZVQI.js} +8 -3
  20. package/dist/chunk-GSRDZVQI.js.map +1 -0
  21. package/dist/{chunk-RY3YIJFG.js → chunk-H2TT4DP5.js} +16 -13
  22. package/dist/chunk-H2TT4DP5.js.map +1 -0
  23. package/dist/{chunk-XCFZJA7V.js → chunk-NN3XFBPE.js} +3 -3
  24. package/dist/{chunk-XCFZJA7V.js.map → chunk-NN3XFBPE.js.map} +1 -1
  25. package/dist/chunk-RUB5A7IC.js +14 -0
  26. package/dist/chunk-RUB5A7IC.js.map +1 -0
  27. package/dist/chunk-SVDXBE6D.js +93 -0
  28. package/dist/chunk-SVDXBE6D.js.map +1 -0
  29. package/dist/chunk-VN64D2EQ.js +39 -0
  30. package/dist/chunk-VN64D2EQ.js.map +1 -0
  31. package/dist/chunk-XHOJF7U7.js +12 -0
  32. package/dist/chunk-XHOJF7U7.js.map +1 -0
  33. package/dist/chunk-XPHGSDAF.js +45 -0
  34. package/dist/chunk-XPHGSDAF.js.map +1 -0
  35. package/dist/{chunk-CPA2D42B.js → chunk-ZIN4KXR6.js} +3 -3
  36. package/dist/{chunk-CPA2D42B.js.map → chunk-ZIN4KXR6.js.map} +1 -1
  37. package/dist/cli/cli-executable.js +71 -25
  38. package/dist/cli/cli-executable.js.map +1 -1
  39. package/dist/doctor.command-7BQSOQWW.js +6 -0
  40. package/dist/{doctor.command-SHZI7SR3.js.map → doctor.command-7BQSOQWW.js.map} +1 -1
  41. package/dist/dotenv-compat.js +7 -8
  42. package/dist/dotenv-compat.js.map +1 -1
  43. package/dist/index.d.ts +10 -34
  44. package/dist/index.js +36 -5
  45. package/dist/index.js.map +1 -1
  46. package/dist/init.command-CY3ZOIGP.js +11 -0
  47. package/dist/{init.command-ERPGU436.js.map → init.command-CY3ZOIGP.js.map} +1 -1
  48. package/dist/load.command-ZFNTAAJE.js +10 -0
  49. package/dist/{load.command-LQDSWJSK.js.map → load.command-ZFNTAAJE.js.map} +1 -1
  50. package/dist/login.command-KYZ4FXS5.js +7 -0
  51. package/dist/{login.command-22RUZJLR.js.map → login.command-KYZ4FXS5.js.map} +1 -1
  52. package/dist/run.command-VRKI6ZVN.js +10 -0
  53. package/dist/{run.command-OF3UV7AD.js.map → run.command-VRKI6ZVN.js.map} +1 -1
  54. package/dist/runtime/env.d.ts +27 -0
  55. package/dist/runtime/env.js +5 -0
  56. package/dist/runtime/env.js.map +1 -0
  57. package/dist/runtime/patch-console.d.ts +14 -0
  58. package/dist/runtime/patch-console.js +7 -0
  59. package/dist/runtime/patch-console.js.map +1 -0
  60. package/dist/runtime/patch-response.d.ts +3 -0
  61. package/dist/runtime/patch-response.js +7 -0
  62. package/dist/runtime/patch-response.js.map +1 -0
  63. package/dist/runtime/patch-server-response.d.ts +6 -0
  64. package/dist/runtime/patch-server-response.js +7 -0
  65. package/dist/runtime/patch-server-response.js.map +1 -0
  66. package/package.json +53 -8
  67. package/dist/chunk-332HXE6L.js +0 -53
  68. package/dist/chunk-332HXE6L.js.map +0 -1
  69. package/dist/chunk-4WO4BGKU.js.map +0 -1
  70. package/dist/chunk-6YLXKXKR.js +0 -225
  71. package/dist/chunk-6YLXKXKR.js.map +0 -1
  72. package/dist/chunk-G4BD2BPH.js.map +0 -1
  73. package/dist/chunk-LQZ6ICSS.js.map +0 -1
  74. package/dist/chunk-O2QPQ5MG.js.map +0 -1
  75. package/dist/chunk-RY3YIJFG.js.map +0 -1
  76. package/dist/doctor.command-SHZI7SR3.js +0 -6
  77. package/dist/init.command-ERPGU436.js +0 -10
  78. package/dist/load.command-LQDSWJSK.js +0 -9
  79. package/dist/login.command-22RUZJLR.js +0 -7
  80. package/dist/run.command-OF3UV7AD.js +0 -9
package/package.json CHANGED
@@ -1,11 +1,16 @@
1
1
  {
2
2
  "name": "varlock",
3
- "version": "0.0.2",
3
+ "version": "0.0.4",
4
4
  "description": "",
5
5
  "main": "index.js",
6
6
  "type": "module",
7
7
  "author": "dmno-dev",
8
8
  "license": "MIT",
9
+ "repository": {
10
+ "type": "git",
11
+ "url": "https://github.com/dmno-dev/varlock.git",
12
+ "directory": "packages/varlock"
13
+ },
9
14
  "keywords": [],
10
15
  "files": [
11
16
  "/bin",
@@ -14,17 +19,56 @@
14
19
  "bin": {
15
20
  "varlock": "./bin/cli.js"
16
21
  },
22
+ "engines": {
23
+ "node": ">=22"
24
+ },
17
25
  "exports": {
18
- ".": "./dist/index.js",
19
- "./auto-load": "./dist/auto-load.js",
20
- "./config": "./dist/dotenv-compat.js",
21
- "./config.js": "./dist/dotenv-compat.js"
26
+ ".": {
27
+ "ts-src": "./src/index.ts",
28
+ "types": "./dist/index.d.ts",
29
+ "default": "./dist/index.js"
30
+ },
31
+ "./env": {
32
+ "ts-src": "./src/runtime/env.ts",
33
+ "types": "./dist/runtime/env.d.ts",
34
+ "default": "./dist/runtime/env.js"
35
+ },
36
+ "./auto-load": {
37
+ "ts-src": "./src/auto-load.ts",
38
+ "types": "./dist/auto-load.d.ts",
39
+ "default": "./dist/auto-load.js"
40
+ },
41
+ "./patch-console": {
42
+ "ts-src": "./src/runtime/patch-console.ts",
43
+ "types": "./dist/runtime/patch-console.d.ts",
44
+ "default": "./dist/runtime/patch-console.js"
45
+ },
46
+ "./patch-response": {
47
+ "ts-src": "./src/runtime/patch-response.ts",
48
+ "types": "./dist/runtime/patch-response.d.ts",
49
+ "default": "./dist/runtime/patch-response.js"
50
+ },
51
+ "./patch-server-response": {
52
+ "ts-src": "./src/runtime/patch-server-response.ts",
53
+ "types": "./dist/runtime/patch-server-response.d.ts",
54
+ "default": "./dist/runtime/patch-server-response.js"
55
+ },
56
+ "./config": {
57
+ "ts-src": "./src/config.ts",
58
+ "types": "./dist/dotenv-compat.d.ts",
59
+ "default": "./dist/dotenv-compat.js"
60
+ },
61
+ "./config.js": {
62
+ "ts-src": "./src/config.ts",
63
+ "types": "./dist/dotenv-compat.d.ts",
64
+ "default": "./dist/dotenv-compat.js"
65
+ }
22
66
  },
23
67
  "dependencies": {
24
68
  "debug": "^4.3.4",
25
- "execa": "^9.5.2",
69
+ "execa": "^9.6.0",
26
70
  "which": "^5.0.0",
27
- "@env-spec/parser": "0.0.1"
71
+ "@env-spec/parser": "^0.0.2"
28
72
  },
29
73
  "devDependencies": {
30
74
  "@clack/core": "^0.5.0",
@@ -33,8 +77,9 @@
33
77
  "@types/debug": "^4.1.12",
34
78
  "@types/node": "^22.15.32",
35
79
  "@types/which": "^3.0.4",
36
- "@yao-pkg/pkg": "^6.4.1",
80
+ "@yao-pkg/pkg": "^6.5.1",
37
81
  "ansis": "^4.1.0",
82
+ "browser-or-node": "^3.0.0",
38
83
  "gunshi": "^0.26.3",
39
84
  "is-unicode-supported": "^2.1.0",
40
85
  "outdent": "^0.8.0",
@@ -1,53 +0,0 @@
1
- import { checkForConfigErrors } from './chunk-Z55UMN2B.js';
2
- import { loadVarlockEnvGraph, resetRedactionMap } from './chunk-6YLXKXKR.js';
3
- import { __name } from './chunk-XN24GZXQ.js';
4
-
5
- // src/index.ts
6
- var envValues = {};
7
- var publicKeys = [];
8
- var EnvProxy = new Proxy({}, {
9
- get(target, prop) {
10
- if (typeof prop !== "string") throw new Error("prop keys cannot be symbols");
11
- if (!(prop in envValues)) throw new Error(`Env key \`${prop}\` does not exist`);
12
- return envValues[prop.toString()];
13
- }
14
- });
15
- var PublicEnvProxy = new Proxy({}, {
16
- get(target, prop) {
17
- if (typeof prop !== "string") throw new Error("prop keys cannot be symbols");
18
- if (!(prop in envValues)) throw new Error(`Env key \`${prop}\` does not exist`);
19
- if (!publicKeys.includes(prop.toString())) throw new Error(`${prop.toString()} is sensitive, use ENV instead of PUBLIC_ENV`);
20
- return envValues[prop.toString()];
21
- }
22
- });
23
- var ENV = EnvProxy;
24
- var PUBLIC_ENV = PublicEnvProxy;
25
- function loadSync() {
26
- throw new Error("Not yet supported");
27
- }
28
- __name(loadSync, "loadSync");
29
- async function load() {
30
- const envGraph = await loadVarlockEnvGraph();
31
- await envGraph.resolveEnvValues();
32
- checkForConfigErrors(envGraph);
33
- const resolvedEnv = envGraph.getResolvedEnvObject();
34
- resetRedactionMap(envGraph);
35
- envValues = {};
36
- publicKeys = [];
37
- for (const key in resolvedEnv) {
38
- if (!envGraph.configSchema[key].isSensitive) publicKeys.push(key);
39
- const resolvedValue = resolvedEnv[key];
40
- if (resolvedValue === void 0 || resolvedValue === null) {
41
- envValues[key] = void 0;
42
- process.env[key] = void 0;
43
- } else {
44
- envValues[key] = resolvedValue;
45
- process.env[key] = resolvedValue.toString();
46
- }
47
- }
48
- }
49
- __name(load, "load");
50
-
51
- export { ENV, PUBLIC_ENV, load, loadSync };
52
- //# sourceMappingURL=chunk-332HXE6L.js.map
53
- //# sourceMappingURL=chunk-332HXE6L.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/index.ts"],"names":[],"mappings":";;;;;AAKA,IAAI,YAAY,EAAC;AACjB,IAAI,aAAa,EAAC;AAMlB,IAAM,QAAW,GAAA,IAAI,KAAsB,CAAA,EAAI,EAAA;AAAA,EAC7C,GAAA,CAAI,QAAQ,IAAM,EAAA;AAChB,IAAA,IAAI,OAAO,IAAS,KAAA,QAAA,EAAgB,MAAA,IAAI,MAAM,6BAA6B,CAAA;AAC3E,IAAI,IAAA,EAAE,QAAQ,SAAY,CAAA,EAAA,MAAM,IAAI,KAAM,CAAA,CAAA,UAAA,EAAa,IAAI,CAAmB,iBAAA,CAAA,CAAA;AAC9E,IAAO,OAAA,SAAA,CAAU,IAAK,CAAA,QAAA,EAAU,CAAA;AAAA;AAEpC,CAAC,CAAA;AACD,IAAM,cAAiB,GAAA,IAAI,KAA4B,CAAA,EAAI,EAAA;AAAA,EACzD,GAAA,CAAI,QAAQ,IAAM,EAAA;AAChB,IAAA,IAAI,OAAO,IAAS,KAAA,QAAA,EAAgB,MAAA,IAAI,MAAM,6BAA6B,CAAA;AAC3E,IAAI,IAAA,EAAE,QAAQ,SAAY,CAAA,EAAA,MAAM,IAAI,KAAM,CAAA,CAAA,UAAA,EAAa,IAAI,CAAmB,iBAAA,CAAA,CAAA;AAC9E,IAAA,IAAI,CAAC,UAAA,CAAW,QAAS,CAAA,IAAA,CAAK,UAAU,CAAA,EAAS,MAAA,IAAI,KAAM,CAAA,CAAA,EAAG,IAAK,CAAA,QAAA,EAAU,CAA8C,4CAAA,CAAA,CAAA;AAC3H,IAAO,OAAA,SAAA,CAAU,IAAK,CAAA,QAAA,EAAU,CAAA;AAAA;AAEpC,CAAC,CAAA;AAEM,IAAM,GAAM,GAAA;AACZ,IAAM,UAAa,GAAA;AAEnB,SAAS,QAAW,GAAA;AACzB,EAAM,MAAA,IAAI,MAAM,mBAAmB,CAAA;AACrC;AAFgB,MAAA,CAAA,QAAA,EAAA,UAAA,CAAA;AAIhB,eAAsB,IAAO,GAAA;AAK3B,EAAM,MAAA,QAAA,GAAW,MAAM,mBAAoB,EAAA;AAC3C,EAAA,MAAM,SAAS,gBAAiB,EAAA;AAEhC,EAAA,oBAAA,CAAqB,QAAQ,CAAA;AAE7B,EAAM,MAAA,WAAA,GAAc,SAAS,oBAAqB,EAAA;AAElD,EAAA,iBAAA,CAAkB,QAAQ,CAAA;AAG1B,EAAA,SAAA,GAAY,EAAC;AACb,EAAA,UAAA,GAAa,EAAC;AAEd,EAAA,KAAA,MAAW,OAAO,WAAa,EAAA;AAC7B,IAAI,IAAA,CAAC,SAAS,YAAa,CAAA,GAAG,EAAE,WAAa,EAAA,UAAA,CAAW,KAAK,GAAG,CAAA;AAEhE,IAAM,MAAA,aAAA,GAAgB,YAAY,GAAG,CAAA;AACrC,IAAI,IAAA,aAAA,KAAkB,MAAa,IAAA,aAAA,KAAkB,IAAM,EAAA;AACzD,MAAA,SAAA,CAAU,GAAG,CAAI,GAAA,MAAA;AACjB,MAAQ,OAAA,CAAA,GAAA,CAAI,GAAG,CAAI,GAAA,MAAA;AAAA,KACd,MAAA;AACL,MAAA,SAAA,CAAU,GAAG,CAAI,GAAA,aAAA;AACjB,MAAA,OAAA,CAAQ,GAAI,CAAA,GAAG,CAAI,GAAA,aAAA,CAAc,QAAS,EAAA;AAAA;AAC5C;AAIJ;AAhCsB,MAAA,CAAA,IAAA,EAAA,MAAA,CAAA","file":"chunk-332HXE6L.js","sourcesContent":["import { checkForConfigErrors } from './cli/helpers/error-checks';\nimport { loadVarlockEnvGraph } from './lib/load-graph';\nimport { resetRedactionMap } from './lib/redaction-helpers';\n\n\nlet envValues = {} as Record<string, any>;\nlet publicKeys = [] as Array<string>;\n\n// these types will be overridden/augmented by the generated types\nexport interface TypedEnvSchema {}\nexport interface PublicTypedEnvSchema {}\n\nconst EnvProxy = new Proxy<TypedEnvSchema>({}, {\n get(target, prop) {\n if (typeof prop !== 'string') throw new Error('prop keys cannot be symbols');\n if (!(prop in envValues)) throw new Error(`Env key \\`${prop}\\` does not exist`);\n return envValues[prop.toString()];\n },\n});\nconst PublicEnvProxy = new Proxy<PublicTypedEnvSchema>({}, {\n get(target, prop) {\n if (typeof prop !== 'string') throw new Error('prop keys cannot be symbols');\n if (!(prop in envValues)) throw new Error(`Env key \\`${prop}\\` does not exist`);\n if (!publicKeys.includes(prop.toString())) throw new Error(`${prop.toString()} is sensitive, use ENV instead of PUBLIC_ENV`);\n return envValues[prop.toString()];\n },\n});\n\nexport const ENV = EnvProxy;\nexport const PUBLIC_ENV = PublicEnvProxy;\n\nexport function loadSync() {\n throw new Error('Not yet supported');\n}\n\nexport async function load() {\n // TODO: add some options\n // console.log('loading varlock (async)');\n\n\n const envGraph = await loadVarlockEnvGraph();\n await envGraph.resolveEnvValues();\n\n checkForConfigErrors(envGraph);\n\n const resolvedEnv = envGraph.getResolvedEnvObject();\n\n resetRedactionMap(envGraph);\n\n // reset env values\n envValues = {};\n publicKeys = [];\n\n for (const key in resolvedEnv) {\n if (!envGraph.configSchema[key].isSensitive) publicKeys.push(key);\n\n const resolvedValue = resolvedEnv[key];\n if (resolvedValue === undefined || resolvedValue === null) {\n envValues[key] = undefined;\n process.env[key] = undefined; // not sure what to do here\n } else {\n envValues[key] = resolvedValue;\n process.env[key] = resolvedValue.toString();\n }\n }\n\n // TODO: return resolved env and schema / meta info\n}\n\n// expose redaction utils\nexport { VarlockRedactor } from './lib/redaction-helpers';\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/cli/commands/load.command.ts"],"names":[],"mappings":"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","file":"chunk-4WO4BGKU.js","sourcesContent":["import { define } from 'gunshi';\nimport _ from '@env-spec/utils/my-dash';\n\nimport { loadVarlockEnvGraph } from '../../lib/load-graph';\nimport { getItemSummary } from '../../lib/formatting';\nimport { checkForConfigErrors, checkForSchemaErrors } from '../helpers/error-checks';\nimport { TypedGunshiCommandFn } from '../helpers/gunshi-type-utils';\n\nexport const commandSpec = define({\n name: 'load',\n description: 'Load env according to schema and resolve values',\n args: {\n format: {\n type: 'string',\n short: 'f',\n description: 'Format of output (if not pretty printed to console)',\n default: 'pretty',\n },\n 'show-all': {\n type: 'boolean',\n description: 'When load is fialing, show all items rather than only failing items',\n },\n },\n});\n\n\nexport const commandFn: TypedGunshiCommandFn<typeof commandSpec> = async (ctx) => {\n const { format, 'show-all': showAll } = ctx.values;\n\n const envGraph = await loadVarlockEnvGraph();\n checkForSchemaErrors(envGraph);\n\n // TODO: move into a more general post-load hook system\n if (envGraph.schemaDataSource?.decorators.generateTypes) {\n // TODO: much of this logic should move to the definition of the decorator itself\n const typeGenSettings = envGraph.schemaDataSource?.decorators.generateTypes.bareFnArgs?.simplifiedValues;\n if (!_.isPlainObject(typeGenSettings)) {\n throw new Error('@generateTypes - must be a fn call with key/value args');\n }\n if (!typeGenSettings.lang) throw new Error('@generateTypes - must set `lang` arg');\n if (typeGenSettings.lang !== 'ts') throw new Error(`@generateTypes - unsupported language: ${typeGenSettings.lang}`);\n if (!typeGenSettings.path) throw new Error('@generateTypes - must set `path` arg');\n if (!_.isString(typeGenSettings.path)) throw new Error('@generateTypes - `path` arg must be a string');\n await envGraph.generateTypes(typeGenSettings.lang, typeGenSettings.path);\n }\n\n await envGraph.resolveEnvValues();\n checkForConfigErrors(envGraph, { showAll });\n\n if (format === 'pretty') {\n for (const itemKey in envGraph.configSchema) {\n const item = envGraph.configSchema[itemKey];\n console.log(getItemSummary(item));\n }\n } else if (format === 'json') {\n const resolvedEnv = envGraph.getResolvedEnvObject();\n console.log(JSON.stringify(resolvedEnv, null, 2));\n } else if (format === 'env') {\n const resolvedEnv = envGraph.getResolvedEnvObject();\n for (const key in resolvedEnv) {\n const value = resolvedEnv[key];\n let strValue: string;\n if (value === undefined) {\n strValue = '';\n } else if (typeof value === 'string') {\n strValue = `\"${value.replaceAll('\"', '\\\\\"').replaceAll('\\n', '\\\\n')}\"`;\n } else {\n strValue = JSON.stringify(value);\n }\n console.log(`${key}=${strValue}`);\n }\n } else {\n throw new Error(`Unknown format: ${format}`);\n }\n\n // const resolvedEnv = envGraph.getResolvedEnvObject();\n // console.log(resolvedEnv);\n};\n"]}
@@ -1,225 +0,0 @@
1
- import { my_dash_default, loadEnvGraph } from './chunk-G4BD2BPH.js';
2
- import { ansis_default } from './chunk-7UQXFWKN.js';
3
- import { __name } from './chunk-XN24GZXQ.js';
4
-
5
- // src/lib/redaction-helpers.ts
6
- var UNMASK_STR = "\u{1F441}";
7
- function redactString(valStr, mode, hideLength = true) {
8
- if (!valStr) return valStr;
9
- const hiddenLength = hideLength ? 5 : valStr.length - 2;
10
- const hiddenStr = "\u2592".repeat(hiddenLength);
11
- if (mode === "show_last_2") {
12
- return `${hiddenStr}${valStr.substring(valStr.length - 2, valStr.length)}`;
13
- } else if (mode === "show_first_last") {
14
- return `${valStr.substring(0, 1)}${hiddenStr}${valStr.substring(valStr.length - 1, valStr.length)}`;
15
- } else {
16
- return `${valStr.substring(0, 2)}${hiddenStr}`;
17
- }
18
- }
19
- __name(redactString, "redactString");
20
- var sensitiveSecretsMap = {};
21
- var redactorFindReplace;
22
- function resetRedactionMap(graph) {
23
- sensitiveSecretsMap = {};
24
- for (const itemKey in graph.configSchema) {
25
- const item = graph.configSchema[itemKey];
26
- if (item.isSensitive && item.resolvedValue && my_dash_default.isString(item.resolvedValue)) {
27
- const redacted = redactString(item.resolvedValue);
28
- if (redacted) sensitiveSecretsMap[item.resolvedValue] = redacted;
29
- }
30
- }
31
- const findRegex = new RegExp(
32
- [
33
- `(${UNMASK_STR} )?`,
34
- "(",
35
- Object.keys(sensitiveSecretsMap).map((s) => s.replace(/[()[\]{}*+?^$|#.,/\\\s-]/g, "\\$&")).sort((a, b) => b.length - a.length).join("|"),
36
- ")",
37
- `( ${UNMASK_STR})?`
38
- ].join(""),
39
- "g"
40
- );
41
- const replaceFn = /* @__PURE__ */ __name((match, pre, val, post) => {
42
- if (pre && post) return match;
43
- return sensitiveSecretsMap[val];
44
- }, "replaceFn");
45
- redactorFindReplace = { find: findRegex, replace: replaceFn };
46
- }
47
- __name(resetRedactionMap, "resetRedactionMap");
48
- var CONSOLE_METHODS = ["trace", "debug", "info", "log", "info", "warn", "error"];
49
- var VarlockRedactor = {
50
- /**
51
- * Redacts senstive config values from any string/array/object/etc
52
- *
53
- * NOTE - must be used only after varlock has loaded config
54
- * */
55
- redactSensitiveConfig(o) {
56
- if (!redactorFindReplace) return o;
57
- if (!o) return o;
58
- if (Array.isArray(o)) {
59
- return o.map(VarlockRedactor.redactSensitiveConfig);
60
- }
61
- if (o && typeof o === "object" && Object.getPrototypeOf(o) === Object.prototype) {
62
- try {
63
- return JSON.parse(VarlockRedactor.redactSensitiveConfig(JSON.stringify(o)));
64
- } catch (err) {
65
- return o;
66
- }
67
- }
68
- const type = typeof o;
69
- if (type === "string" || type === "object" && Object.prototype.toString.call(o) === "[object String]") {
70
- return o.replaceAll(redactorFindReplace.find, redactorFindReplace.replace);
71
- }
72
- return o;
73
- },
74
- /**
75
- * utility to unmask a secret/sensitive value when logging to the console
76
- * currently this only works on a single secret, not objects or aggregated strings
77
- * */
78
- unredact(secretStr) {
79
- if (!globalThis._varlockOrigWriteToConsoleFn) return secretStr;
80
- return `${UNMASK_STR} ${secretStr} ${UNMASK_STR}`;
81
- },
82
- /**
83
- * patches global console methods to redact sensitive config
84
- *
85
- * NOTE - this may not be 100% foolproof depending on the platform
86
- * */
87
- patchConsole() {
88
- if (!redactorFindReplace) return;
89
- const kWriteToConsoleSymbol = Object.getOwnPropertySymbols(globalThis.console).find((s) => s.description === "kWriteToConsole");
90
- globalThis._varlockOrigWriteToConsoleFn ||= globalThis.console[kWriteToConsoleSymbol];
91
- globalThis.console[kWriteToConsoleSymbol] = function() {
92
- globalThis._varlockOrigWriteToConsoleFn.apply(this, [
93
- arguments[0],
94
- VarlockRedactor.redactSensitiveConfig(arguments[1]),
95
- arguments[2]
96
- ]);
97
- };
98
- if (
99
- // !console.log.toString().includes('[native code]') &&
100
- !console.log._varlockPatchedFn
101
- ) {
102
- for (const logMethodName of CONSOLE_METHODS) {
103
- const originalLogMethod = globalThis.console[logMethodName];
104
- const patchedFn = /* @__PURE__ */ __name(function() {
105
- originalLogMethod.apply(this, Array.from(arguments).map(VarlockRedactor.redactSensitiveConfig));
106
- }, "patchedFn");
107
- patchedFn._varlockPatchedFn = true;
108
- globalThis.console[logMethodName] = patchedFn;
109
- }
110
- }
111
- },
112
- /**
113
- * restore's original global console methods to stop redacting secrets
114
- *
115
- * (only needed during local development when switching settings on/off in a process that does not reload)
116
- * */
117
- unpatchConsole() {
118
- if (!globalThis._varlockOrigWriteToConsoleFn) return;
119
- const kWriteToConsoleSymbol = Object.getOwnPropertySymbols(globalThis.console).find((s) => s.description === "kWriteToConsole");
120
- globalThis.console[kWriteToConsoleSymbol] = globalThis._varlockOrigWriteToConsoleFn;
121
- delete globalThis._varlockOrigWriteToConsoleFn;
122
- }
123
- };
124
-
125
- // src/lib/formatting.ts
126
- function applyMods(str, mods) {
127
- if (!mods) return str;
128
- if (my_dash_default.isArray(mods)) {
129
- let modStr = str;
130
- mods.forEach((mod) => {
131
- modStr = ansis_default[mod](modStr);
132
- });
133
- return modStr;
134
- }
135
- return ansis_default[mods](str);
136
- }
137
- __name(applyMods, "applyMods");
138
- function formattedValue(val, showType = false) {
139
- let strVal = "";
140
- let strType = "";
141
- let mods;
142
- if (my_dash_default.isBoolean(val)) {
143
- strVal = val.toString();
144
- mods = ["yellow", "italic"];
145
- strType = "boolean";
146
- } else if (my_dash_default.isNumber(val)) {
147
- strVal = val.toString();
148
- mods = "yellow";
149
- strType = "number";
150
- } else if (my_dash_default.isString(val)) {
151
- strVal = `"${val}"`;
152
- strType = "string";
153
- } else if (my_dash_default.isPlainObject(val)) {
154
- strVal = JSON.stringify(val);
155
- strType = "object";
156
- } else if (val === null) {
157
- strVal = "null";
158
- mods = "gray";
159
- } else if (val === void 0) {
160
- strVal = "undefined";
161
- mods = "gray";
162
- }
163
- return [
164
- applyMods(strVal, mods),
165
- showType && strType ? ansis_default.gray(` (${strType})`) : ""
166
- ].join("");
167
- }
168
- __name(formattedValue, "formattedValue");
169
- function joinAndCompact(strings, joinChar = " ") {
170
- return strings.filter((s) => (
171
- // we'll not filter out empty strings - because it's useful to just add newlines
172
- s !== void 0 && s !== null && s !== false
173
- )).join(joinChar);
174
- }
175
- __name(joinAndCompact, "joinAndCompact");
176
- var VALIDATION_STATE_COLORS = {
177
- error: "red",
178
- warn: "yellow",
179
- valid: "cyan"
180
- };
181
- function getItemSummary(item) {
182
- const summary = [];
183
- const itemErrors = item.errors;
184
- const icon = itemErrors.length ? itemErrors[0].icon : "\u2705";
185
- const isSensitive = item.isSensitive;
186
- const isRequired = item.isRequired;
187
- summary.push(joinAndCompact([
188
- icon,
189
- ansis_default[VALIDATION_STATE_COLORS[item.validationState]](item.key) + (isRequired ? ansis_default.magenta("*") : ""),
190
- // ansis.gray(`[type = ${item.type.typeLabel}]`),
191
- isSensitive && ` \u{1F510}${ansis_default.gray.italic("sensitive")}`
192
- // item.useAt ? ansis.gray.italic(`(${item.useAt?.join(', ')})`) : undefined,
193
- ]));
194
- let valAsStr = formattedValue(item.resolvedValue, false);
195
- if (isSensitive && item.resolvedValue && my_dash_default.isString(item.resolvedValue)) {
196
- valAsStr = redactString(item.resolvedValue);
197
- }
198
- summary.push(joinAndCompact([
199
- ansis_default.gray(" \u2514"),
200
- valAsStr,
201
- item.isCoerced && ansis_default.gray.italic("< coerced from ") + (isSensitive ? formattedValue(item.resolvedRawValue) : formattedValue(item.resolvedRawValue, false))
202
- ]));
203
- itemErrors?.forEach((err) => {
204
- summary.push(ansis_default[err.isWarning ? "yellow" : "red"](` - ${err.isWarning ? "[WARNING] " : ""}${err.message}`));
205
- if (err.tip) {
206
- summary.push(...err.tip.split("\n").map((line) => ` ${line}`));
207
- }
208
- });
209
- return summary.join("\n");
210
- }
211
- __name(getItemSummary, "getItemSummary");
212
-
213
- // src/lib/load-graph.ts
214
- async function loadVarlockEnvGraph() {
215
- const envGraph = await loadEnvGraph({
216
- afterInit: /* @__PURE__ */ __name(async (g) => {
217
- }, "afterInit")
218
- });
219
- return envGraph;
220
- }
221
- __name(loadVarlockEnvGraph, "loadVarlockEnvGraph");
222
-
223
- export { VarlockRedactor, getItemSummary, joinAndCompact, loadVarlockEnvGraph, resetRedactionMap };
224
- //# sourceMappingURL=chunk-6YLXKXKR.js.map
225
- //# sourceMappingURL=chunk-6YLXKXKR.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/lib/redaction-helpers.ts","../src/lib/formatting.ts","../src/lib/load-graph.ts"],"names":[],"mappings":"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","file":"chunk-6YLXKXKR.js","sourcesContent":["import { EnvGraph } from '@env-spec/env-graph';\nimport _ from '@env-spec/utils/my-dash';\n\nconst UNMASK_STR = '👁';\n\nexport type RedactMode = 'show_first_2' | 'show_last_2' | 'show_first_last';\n\n/**\n * utility to mask/redact a string, for example transforming \"hello\" into \"he▒▒▒\"\n * this function just redacts _any_ string passed in\n *\n * To redact sensitive parts of a larger object/string, use redactSensitiveConfig\n * */\nexport function redactString(valStr: string | undefined, mode?: RedactMode, hideLength = true) {\n if (!valStr) return valStr;\n\n const hiddenLength = hideLength ? 5 : valStr.length - 2;\n const hiddenStr = '▒'.repeat(hiddenLength);\n\n if (mode === 'show_last_2') {\n return `${hiddenStr}${valStr.substring(valStr.length - 2, valStr.length)}`;\n } else if (mode === 'show_first_last') {\n return `${valStr.substring(0, 1)}${hiddenStr}${valStr.substring(valStr.length - 1, valStr.length)}`;\n } else { // 'show_first_2' - also default\n return `${valStr.substring(0, 2)}${hiddenStr}`;\n }\n}\n\n\n/** key value lookup of sensitive values to their redacted version */\nlet sensitiveSecretsMap: Record<string, string> = {};\n\ntype ReplaceFn = (match: string, pre: string, val: string, post: string) => string;\nlet redactorFindReplace: undefined | { find: RegExp, replace: ReplaceFn };\n\nexport function resetRedactionMap(graph: EnvGraph) {\n // reset map of { [sensitive] => redacted }\n sensitiveSecretsMap = {};\n for (const itemKey in graph.configSchema) {\n const item = graph.configSchema[itemKey];\n if (item.isSensitive && item.resolvedValue && _.isString(item.resolvedValue)) {\n // TODO: we want to respect masking settings from the schema (once added)\n const redacted = redactString(item.resolvedValue);\n if (redacted) sensitiveSecretsMap[item.resolvedValue] = redacted;\n }\n }\n\n // reset find/replace regex+fn used for redacting secrets in strings\n const findRegex = new RegExp(\n [\n `(${UNMASK_STR} )?`,\n '(',\n Object.keys(sensitiveSecretsMap)\n // Escape special characters\n .map((s) => s.replace(/[()[\\]{}*+?^$|#.,/\\\\\\s-]/g, '\\\\$&'))\n // Sort for maximal munch\n .sort((a, b) => b.length - a.length)\n .join('|'),\n ')',\n `( ${UNMASK_STR})?`,\n ].join(''),\n 'g',\n );\n\n const replaceFn: ReplaceFn = (match, pre, val, post) => {\n // the pre and post matches only will be populated if they were present\n // and they are used to unmask the secret - so we do not want to replace in this case\n if (pre && post) return match;\n return sensitiveSecretsMap[val];\n };\n redactorFindReplace = { find: findRegex, replace: replaceFn };\n}\n\n\nconst CONSOLE_METHODS = ['trace', 'debug', 'info', 'log', 'info', 'warn', 'error'];\n\n// While the module itself acts as a singleton to hold the current map of redacted values\n// we expose only the below const to end users\n\n/** singleton wrapper for varlock's redaction utilities */\nexport const VarlockRedactor = {\n /**\n * Redacts senstive config values from any string/array/object/etc\n *\n * NOTE - must be used only after varlock has loaded config\n * */\n redactSensitiveConfig(o: any): any {\n if (!redactorFindReplace) return o;\n if (!o) return o;\n\n // TODO: handle more cases?\n // we can probably redact safely from a few other datatypes - like set,map,etc?\n // objects are a bit tougher\n if (Array.isArray(o)) {\n return o.map(VarlockRedactor.redactSensitiveConfig);\n }\n // try to redact if it's a plain object - not necessarily great for perf...\n if (o && typeof (o) === 'object' && Object.getPrototypeOf(o) === Object.prototype) {\n try {\n return JSON.parse(VarlockRedactor.redactSensitiveConfig(JSON.stringify(o)));\n } catch (err) {\n return o;\n }\n }\n\n const type = typeof o;\n if (type === 'string' || (type === 'object' && Object.prototype.toString.call(o) === '[object String]')) {\n return (o as string).replaceAll(redactorFindReplace.find, redactorFindReplace.replace);\n }\n\n return o;\n },\n\n /**\n * utility to unmask a secret/sensitive value when logging to the console\n * currently this only works on a single secret, not objects or aggregated strings\n * */\n unredact(secretStr: string) {\n // if redaction not enabled, we just return the secret itself\n if (!(globalThis as any)._varlockOrigWriteToConsoleFn) return secretStr;\n // otherwise we add some wrapper characters which will be removed by the patched console behaviour\n return `${UNMASK_STR} ${secretStr} ${UNMASK_STR}`;\n },\n\n /**\n * patches global console methods to redact sensitive config\n *\n * NOTE - this may not be 100% foolproof depending on the platform\n * */\n patchConsole() {\n /* eslint-disable no-console, prefer-rest-params */\n if (!redactorFindReplace) return;\n\n // our method of patching involves replacing an internal node method which may not be called if console.log itself has also been patched\n // for example AWS lambdas patches this to write the logs to a file which then is pushed to the rest of their system\n\n // so first we'll just patch the internal method do deal with normal stdout/stderr logs -------------------------------------\n\n // we need the internal symbol name to access the internal method\n const kWriteToConsoleSymbol = Object.getOwnPropertySymbols(globalThis.console).find((s) => s.description === 'kWriteToConsole');\n\n // @ts-ignore\n (globalThis as any)._varlockOrigWriteToConsoleFn ||= globalThis.console[kWriteToConsoleSymbol];\n // @ts-ignore\n globalThis.console[kWriteToConsoleSymbol] = function () {\n (globalThis as any)._varlockOrigWriteToConsoleFn.apply(this, [\n arguments[0],\n VarlockRedactor.redactSensitiveConfig(arguments[1]),\n arguments[2],\n ]);\n };\n\n // and now we'll wrap console.log (and the other methods) if it looks like they have been patched already ------------------\n // NOTE - this will not fully redact from everything since we can't safely reach deep into objects\n // ideally we would only turn this when the above method does not work, but it's not trivial to detect when it that is the case\n // so we'll turn it on all the time for now...\n if (\n // !console.log.toString().includes('[native code]') &&\n !(console.log as any)._varlockPatchedFn\n ) {\n for (const logMethodName of CONSOLE_METHODS) {\n // @ts-ignore\n const originalLogMethod = globalThis.console[logMethodName];\n\n const patchedFn = function () {\n // @ts-ignore\n originalLogMethod.apply(this, Array.from(arguments).map(VarlockRedactor.redactSensitiveConfig));\n };\n patchedFn._varlockPatchedFn = true;\n\n // @ts-ignore\n globalThis.console[logMethodName] = patchedFn;\n }\n }\n },\n\n /**\n * restore's original global console methods to stop redacting secrets\n *\n * (only needed during local development when switching settings on/off in a process that does not reload)\n * */\n unpatchConsole() {\n // we'll only care about the normal case where console.log has NOT been patched by something else... (see above)\n if (!(globalThis as any)._varlockOrigWriteToConsoleFn) return;\n\n const kWriteToConsoleSymbol = Object.getOwnPropertySymbols(globalThis.console).find((s) => s.description === 'kWriteToConsole');\n // @ts-ignore\n globalThis.console[kWriteToConsoleSymbol] = (globalThis as any)._varlockOrigWriteToConsoleFn;\n delete (globalThis as any)._varlockOrigWriteToConsoleFn;\n },\n};\n","import ansis, { AnsiColors, AnsiStyles } from 'ansis';\nimport _ from '@env-spec/utils/my-dash';\n\nimport { ConfigItem } from '../../../env-graph/src/lib/config-item';\nimport { VarlockError } from '../../../env-graph/src/lib/errors';\nimport { redactString } from './redaction-helpers';\n\ntype ColorMod = AnsiStyles | AnsiColors;\ntype ColorMods = ColorMod | Array<ColorMod>;\n\nfunction applyMods(str: string, mods?: ColorMods) {\n if (!mods) return str;\n if (_.isArray(mods)) {\n let modStr = str;\n mods.forEach((mod) => {\n modStr = ansis[mod](modStr);\n });\n return modStr;\n }\n return ansis[mods](str);\n}\n\nexport function formattedValue(val: any, showType = false) {\n let strVal: string = '';\n let strType: string = '';\n let mods: ColorMods | undefined;\n if (_.isBoolean(val)) {\n strVal = val.toString();\n mods = ['yellow', 'italic'];\n strType = 'boolean';\n } else if (_.isNumber(val)) {\n strVal = val.toString();\n mods = 'yellow';\n strType = 'number';\n } else if (_.isString(val)) {\n strVal = `\"${val}\"`;\n strType = 'string';\n } else if (_.isPlainObject(val)) {\n // TODO: can definitely make this better...\n strVal = JSON.stringify(val);\n strType = 'object';\n } else if (val === null) {\n strVal = 'null';\n mods = 'gray';\n } else if (val === undefined) {\n strVal = 'undefined';\n mods = 'gray';\n }\n return [\n applyMods(strVal, mods),\n showType && strType ? ansis.gray(` (${strType})`) : '',\n ].join('');\n}\n\n\nexport function formatError(err: VarlockError) {\n let whenStr = '';\n if (err.type === 'SchemaError') {\n whenStr += 'during schema initialization';\n }\n if (err.type === 'ValidationError') {\n whenStr += 'during validation';\n }\n if (err.type === 'CoercionError') {\n whenStr += 'during coercion';\n }\n if (err.type === 'ResolutionError') {\n whenStr += 'during resolution';\n }\n\n let errStr = `${err.icon} ${err.message}`;\n if (err.isUnexpected) {\n errStr += ansis.gray.italic(`\\n (unexpected error${whenStr ? ` ${whenStr}` : ''})`);\n if ('stack' in err) errStr += err.stack;\n }\n return errStr;\n}\n\nexport function joinAndCompact(strings: Array<string | number | boolean | undefined | null | false>, joinChar = ' ') {\n return strings.filter((s) => (\n // we'll not filter out empty strings - because it's useful to just add newlines\n s !== undefined && s !== null && s !== false\n )).join(joinChar);\n}\n\nconst VALIDATION_STATE_COLORS = {\n error: 'red',\n warn: 'yellow',\n valid: 'cyan',\n} as const;\n\nexport function getItemSummary(item: ConfigItem) {\n const summary: Array<string> = [];\n const itemErrors = item.errors;\n const icon = itemErrors.length ? itemErrors[0].icon : '✅';\n const isSensitive = item.isSensitive;\n const isRequired = item.isRequired;\n summary.push(joinAndCompact([\n icon,\n ansis[VALIDATION_STATE_COLORS[item.validationState]](item.key) + (isRequired ? ansis.magenta('*') : ''),\n\n // ansis.gray(`[type = ${item.type.typeLabel}]`),\n isSensitive && ` 🔐${ansis.gray.italic('sensitive')}`,\n\n // item.useAt ? ansis.gray.italic(`(${item.useAt?.join(', ')})`) : undefined,\n ]));\n\n let valAsStr = formattedValue(item.resolvedValue, false);\n if (isSensitive && item.resolvedValue && _.isString(item.resolvedValue)) {\n valAsStr = redactString(item.resolvedValue)!;\n }\n\n summary.push(joinAndCompact([\n ansis.gray(' └'),\n valAsStr,\n item.isCoerced && (\n ansis.gray.italic('< coerced from ')\n + (isSensitive ? formattedValue(item.resolvedRawValue) : formattedValue(item.resolvedRawValue, false))\n ),\n ]));\n\n // if (item.overrides?.length) {\n // const activeOverride = item.overrides[0];\n // let overrideNote = ansis.gray.italic('value set via override: ');\n // overrideNote += ansis.gray(activeOverride.sourceType);\n // if (activeOverride.sourceLabel) overrideNote += ansis.gray(` - ${activeOverride.sourceLabel}`);\n // summary.push(` ${overrideNote}`);\n // }\n\n itemErrors?.forEach((err) => {\n summary.push(ansis[err.isWarning ? 'yellow' : 'red'](` - ${err.isWarning ? '[WARNING] ' : ''}${err.message}`));\n\n // TODO: standardize here how we show parse error locations and stack info?\n\n // summary.push(...err.cleanedStack || '');\n if (err.tip) {\n summary.push(...err.tip.split('\\n').map((line) => ` ${line}`));\n }\n });\n\n // NO OBJECT/CHILDREN FOR NOW\n // for (const childItem of _.values(item.children)) {\n // const childSummary = getItemSummary(childItem);\n // summary.push(childSummary.split('\\n').map((l) => ` ${l}`).join('\\n'));\n // }\n\n return summary.join('\\n');\n}\n","import { loadEnvGraph } from '@env-spec/env-graph';\n\nexport async function loadVarlockEnvGraph() {\n const envGraph = await loadEnvGraph({\n afterInit: async (g) => {\n // TODO: register varlock resolver\n },\n });\n\n return envGraph;\n}\n"]}