@env-spec/parser 0.0.0 → 0.0.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.
@@ -0,0 +1,77 @@
1
+ import { __name, ParsedEnvSpecStaticValue, ParsedEnvSpecFunctionCall, ParsedEnvSpecKeyValuePair } from './chunk-FWOHTEQS.mjs';
2
+ import { execSync } from 'node:child_process';
3
+
4
+ function simpleResolver(parsedEnvFile, opts) {
5
+ const resolved = {};
6
+ function valueResolver(valOrFn) {
7
+ if (valOrFn instanceof ParsedEnvSpecStaticValue) return valOrFn.unescapedValue;
8
+ if (valOrFn instanceof ParsedEnvSpecFunctionCall) {
9
+ if (valOrFn.name === "ref") {
10
+ const args = valOrFn.simplifiedArgs;
11
+ if (Array.isArray(args)) {
12
+ const refKeyName = args[0];
13
+ return opts?.env?.[refKeyName] ?? resolved[refKeyName] ?? "";
14
+ } else {
15
+ throw new Error("Invalid `ref` args");
16
+ }
17
+ } else if (valOrFn.name === "concat") {
18
+ const args = valOrFn.data.args.values;
19
+ const resolvedArgs = args.map((i) => {
20
+ if (i instanceof ParsedEnvSpecStaticValue) {
21
+ return valueResolver(i);
22
+ } else if (i instanceof ParsedEnvSpecFunctionCall) {
23
+ return valueResolver(i);
24
+ } else {
25
+ throw new Error("Invalid concat args");
26
+ }
27
+ });
28
+ return resolvedArgs.join("");
29
+ } else if (valOrFn.name === "exec") {
30
+ const args = valOrFn.simplifiedArgs;
31
+ if (Array.isArray(args)) {
32
+ const cmdStr = args[0];
33
+ return execSync(
34
+ cmdStr,
35
+ {
36
+ env: { ...resolved, ...opts?.env }
37
+ }
38
+ ).toString().trim();
39
+ } else {
40
+ throw new Error("Invalid `exec` args");
41
+ }
42
+ } else if (valOrFn.name === "fallback") {
43
+ const args = valOrFn.data.args.values;
44
+ for (const arg of args) {
45
+ if (arg instanceof ParsedEnvSpecKeyValuePair) {
46
+ throw new Error("Invalid `fallback` arg - should not be key-value pair");
47
+ }
48
+ const resolvedArg = valueResolver(arg);
49
+ if (resolvedArg !== void 0 && resolvedArg !== "") return resolvedArg;
50
+ }
51
+ return void 0;
52
+ } else {
53
+ throw new Error(`Unknown function: ${valOrFn.name}`);
54
+ }
55
+ }
56
+ }
57
+ __name(valueResolver, "valueResolver");
58
+ for (const item of parsedEnvFile.configItems) {
59
+ if (opts?.env[item.key]) {
60
+ resolved[item.key] = opts.env[item.key];
61
+ } else {
62
+ item.processExpansion();
63
+ const resolvedValue = valueResolver(item.expandedValue);
64
+ if (opts?.stringify) {
65
+ resolved[item.key] = resolvedValue === void 0 ? "" : String(resolvedValue);
66
+ } else {
67
+ resolved[item.key] = resolvedValue;
68
+ }
69
+ }
70
+ }
71
+ return resolved;
72
+ }
73
+ __name(simpleResolver, "simpleResolver");
74
+
75
+ export { simpleResolver };
76
+ //# sourceMappingURL=simple-resolver.mjs.map
77
+ //# sourceMappingURL=simple-resolver.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/simple-resolver.ts"],"names":[],"mappings":"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","file":"simple-resolver.mjs","sourcesContent":["import { execSync } from 'node:child_process';\nimport {\n ParsedEnvSpecFile, ParsedEnvSpecFunctionCall, ParsedEnvSpecKeyValuePair, ParsedEnvSpecStaticValue,\n} from './classes.js';\n\n/**\n * very simple resolver meant to be used for testing\n * not currently exposed as part of public API\n * */\nexport function simpleResolver(\n parsedEnvFile: ParsedEnvSpecFile,\n opts?: {\n env: Record<string, string>;\n stringify?: boolean;\n },\n) {\n const resolved = {} as Record<string, any>;\n\n function valueResolver(valOrFn: ParsedEnvSpecStaticValue | ParsedEnvSpecFunctionCall): string | undefined {\n if (valOrFn instanceof ParsedEnvSpecStaticValue) return valOrFn.unescapedValue;\n if (valOrFn instanceof ParsedEnvSpecFunctionCall) {\n if (valOrFn.name === 'ref') {\n const args = valOrFn.simplifiedArgs;\n if (Array.isArray(args)) {\n const refKeyName = args[0];\n // passed in env takes precedence over resolved env\n return opts?.env?.[refKeyName] ?? resolved[refKeyName] ?? '';\n } else {\n throw new Error('Invalid `ref` args');\n }\n } else if (valOrFn.name === 'concat') {\n const args = valOrFn.data.args.values;\n const resolvedArgs = args.map((i) => {\n if (i instanceof ParsedEnvSpecStaticValue) {\n return valueResolver(i);\n } else if (i instanceof ParsedEnvSpecFunctionCall) {\n return valueResolver(i);\n } else {\n throw new Error('Invalid concat args');\n }\n });\n return resolvedArgs.join('');\n } else if (valOrFn.name === 'exec') {\n const args = valOrFn.simplifiedArgs;\n if (Array.isArray(args)) {\n const cmdStr = args[0];\n return execSync(\n cmdStr,\n {\n env: { ...resolved, ...opts?.env },\n },\n ).toString().trim();\n } else {\n throw new Error('Invalid `exec` args');\n }\n } else if (valOrFn.name === 'fallback') {\n const args = valOrFn.data.args.values;\n for (const arg of args) {\n if (arg instanceof ParsedEnvSpecKeyValuePair) {\n throw new Error('Invalid `fallback` arg - should not be key-value pair');\n }\n const resolvedArg = valueResolver(arg);\n if (resolvedArg !== undefined && resolvedArg !== '') return resolvedArg;\n }\n return undefined;\n } else {\n throw new Error(`Unknown function: ${valOrFn.name}`);\n }\n }\n }\n\n for (const item of parsedEnvFile.configItems) {\n // passed in env takes precedence, but is only set if the the key is present\n if (opts?.env[item.key]) {\n resolved[item.key] = opts.env[item.key];\n } else {\n item.processExpansion();\n const resolvedValue = valueResolver(item.expandedValue!);\n if (opts?.stringify) {\n resolved[item.key] = resolvedValue === undefined ? '' : String(resolvedValue);\n } else {\n resolved[item.key] = resolvedValue;\n }\n }\n }\n return resolved;\n}\n"]}
package/package.json CHANGED
@@ -1,13 +1,46 @@
1
1
  {
2
2
  "name": "@env-spec/parser",
3
- "version": "0.0.0",
4
- "repository": {
5
- "type": "git",
6
- "url": "git+https://github.com/dmno-dev/varlock.git",
7
- "directory": "packages/env-spec-parser"
3
+ "version": "0.0.1",
4
+ "description": "Parser for @env-spec enabled dotenv files",
5
+ "files": [
6
+ "dist"
7
+ ],
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.mjs",
12
+ "require": "./dist/index.js"
13
+ }
8
14
  },
9
- "description": "parser for @env-spec enabled .env files",
15
+ "keywords": [
16
+ "env-spec",
17
+ "dotenv",
18
+ "env",
19
+ "env vars",
20
+ "environment variables",
21
+ "validation",
22
+ "schema",
23
+ "config"
24
+ ],
10
25
  "author": "dmno-dev",
11
26
  "license": "MIT",
12
- "files": []
27
+ "devDependencies": {
28
+ "@types/node": "^22.15.32",
29
+ "ansis": "^4.1.0",
30
+ "npm-run-all": "^4.1.5",
31
+ "peggy": "^4.2.0",
32
+ "tsup": "^8.2.4",
33
+ "vitest": "^3.2.4"
34
+ },
35
+ "scripts": {
36
+ "dev": "run-p dev:grammar dev:ts",
37
+ "dev:grammar": "pnpm run build:grammar -w",
38
+ "dev:ts": "tsup --watch",
39
+ "build:grammar": "peggy -c peggy.config.cjs",
40
+ "build:lib": "tsup",
41
+ "build": "pnpm run build:grammar && pnpm run build:lib",
42
+ "test": "run-p \"build:grammar -w\" _test:watch",
43
+ "_test:watch": "vitest",
44
+ "test:ci": "pnpm build:grammar && vitest --run"
45
+ }
13
46
  }