@ontrails/config 1.0.0-beta.14 → 1.0.0-beta.16

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 (163) hide show
  1. package/CHANGELOG.md +41 -0
  2. package/README.md +20 -28
  3. package/package.json +10 -2
  4. package/src/app-config.ts +23 -12
  5. package/src/compose.ts +16 -22
  6. package/src/{config-provision.ts → config-resource.ts} +5 -5
  7. package/src/define-config.ts +18 -18
  8. package/src/{generate → derive}/env.ts +3 -3
  9. package/src/{generate → derive}/example.ts +1 -1
  10. package/src/{generate → derive}/helpers.ts +1 -1
  11. package/src/derive/index.ts +3 -0
  12. package/src/{generate → derive}/json-schema.ts +1 -1
  13. package/src/{describe.ts → derive-fields.ts} +1 -1
  14. package/src/{explain.ts → derive-provenance.ts} +6 -6
  15. package/src/extensions.ts +1 -1
  16. package/src/index.ts +12 -19
  17. package/src/registry.ts +2 -2
  18. package/src/resolve.ts +17 -15
  19. package/src/trails/config-check.ts +3 -3
  20. package/src/trails/config-describe.ts +5 -5
  21. package/src/trails/config-explain.ts +13 -13
  22. package/src/trails/config-init.ts +10 -10
  23. package/.turbo/turbo-build.log +0 -1
  24. package/.turbo/turbo-lint.log +0 -3
  25. package/.turbo/turbo-typecheck.log +0 -1
  26. package/dist/app-config.d.ts +0 -65
  27. package/dist/app-config.d.ts.map +0 -1
  28. package/dist/app-config.js +0 -172
  29. package/dist/app-config.js.map +0 -1
  30. package/dist/collect.d.ts +0 -11
  31. package/dist/collect.d.ts.map +0 -1
  32. package/dist/collect.js +0 -81
  33. package/dist/collect.js.map +0 -1
  34. package/dist/compose.d.ts +0 -30
  35. package/dist/compose.d.ts.map +0 -1
  36. package/dist/compose.js +0 -21
  37. package/dist/compose.js.map +0 -1
  38. package/dist/config-gate.d.ts +0 -11
  39. package/dist/config-gate.d.ts.map +0 -1
  40. package/dist/config-gate.js +0 -6
  41. package/dist/config-gate.js.map +0 -1
  42. package/dist/config-layer.d.ts +0 -11
  43. package/dist/config-layer.d.ts.map +0 -1
  44. package/dist/config-layer.js +0 -6
  45. package/dist/config-layer.js.map +0 -1
  46. package/dist/config-provision.d.ts +0 -3
  47. package/dist/config-provision.d.ts.map +0 -1
  48. package/dist/config-provision.js +0 -26
  49. package/dist/config-provision.js.map +0 -1
  50. package/dist/config-service.d.ts +0 -3
  51. package/dist/config-service.d.ts.map +0 -1
  52. package/dist/config-service.js +0 -26
  53. package/dist/config-service.js.map +0 -1
  54. package/dist/define-config.d.ts +0 -61
  55. package/dist/define-config.d.ts.map +0 -1
  56. package/dist/define-config.js +0 -90
  57. package/dist/define-config.js.map +0 -1
  58. package/dist/describe.d.ts +0 -25
  59. package/dist/describe.d.ts.map +0 -1
  60. package/dist/describe.js +0 -147
  61. package/dist/describe.js.map +0 -1
  62. package/dist/doctor.d.ts +0 -27
  63. package/dist/doctor.d.ts.map +0 -1
  64. package/dist/doctor.js +0 -131
  65. package/dist/doctor.js.map +0 -1
  66. package/dist/explain.d.ts +0 -30
  67. package/dist/explain.d.ts.map +0 -1
  68. package/dist/explain.js +0 -101
  69. package/dist/explain.js.map +0 -1
  70. package/dist/extensions.d.ts +0 -38
  71. package/dist/extensions.d.ts.map +0 -1
  72. package/dist/extensions.js +0 -35
  73. package/dist/extensions.js.map +0 -1
  74. package/dist/generate/env.d.ts +0 -15
  75. package/dist/generate/env.d.ts.map +0 -1
  76. package/dist/generate/env.js +0 -65
  77. package/dist/generate/env.js.map +0 -1
  78. package/dist/generate/example.d.ts +0 -16
  79. package/dist/generate/example.d.ts.map +0 -1
  80. package/dist/generate/example.js +0 -138
  81. package/dist/generate/example.js.map +0 -1
  82. package/dist/generate/helpers.d.ts +0 -35
  83. package/dist/generate/helpers.d.ts.map +0 -1
  84. package/dist/generate/helpers.js +0 -116
  85. package/dist/generate/helpers.js.map +0 -1
  86. package/dist/generate/index.d.ts +0 -4
  87. package/dist/generate/index.d.ts.map +0 -1
  88. package/dist/generate/index.js +0 -4
  89. package/dist/generate/index.js.map +0 -1
  90. package/dist/generate/json-schema.d.ts +0 -18
  91. package/dist/generate/json-schema.d.ts.map +0 -1
  92. package/dist/generate/json-schema.js +0 -97
  93. package/dist/generate/json-schema.js.map +0 -1
  94. package/dist/index.d.ts +0 -21
  95. package/dist/index.d.ts.map +0 -1
  96. package/dist/index.js +0 -21
  97. package/dist/index.js.map +0 -1
  98. package/dist/merge.d.ts +0 -16
  99. package/dist/merge.d.ts.map +0 -1
  100. package/dist/merge.js +0 -34
  101. package/dist/merge.js.map +0 -1
  102. package/dist/ref.d.ts +0 -29
  103. package/dist/ref.d.ts.map +0 -1
  104. package/dist/ref.js +0 -30
  105. package/dist/ref.js.map +0 -1
  106. package/dist/registry.d.ts +0 -24
  107. package/dist/registry.d.ts.map +0 -1
  108. package/dist/registry.js +0 -12
  109. package/dist/registry.js.map +0 -1
  110. package/dist/resolve.d.ts +0 -21
  111. package/dist/resolve.d.ts.map +0 -1
  112. package/dist/resolve.js +0 -177
  113. package/dist/resolve.js.map +0 -1
  114. package/dist/secret-heuristics.d.ts +0 -10
  115. package/dist/secret-heuristics.d.ts.map +0 -1
  116. package/dist/secret-heuristics.js +0 -11
  117. package/dist/secret-heuristics.js.map +0 -1
  118. package/dist/trails/config-check.d.ts +0 -11
  119. package/dist/trails/config-check.d.ts.map +0 -1
  120. package/dist/trails/config-check.js +0 -53
  121. package/dist/trails/config-check.js.map +0 -1
  122. package/dist/trails/config-describe.d.ts +0 -12
  123. package/dist/trails/config-describe.d.ts.map +0 -1
  124. package/dist/trails/config-describe.js +0 -41
  125. package/dist/trails/config-describe.js.map +0 -1
  126. package/dist/trails/config-explain.d.ts +0 -8
  127. package/dist/trails/config-explain.d.ts.map +0 -1
  128. package/dist/trails/config-explain.js +0 -74
  129. package/dist/trails/config-explain.js.map +0 -1
  130. package/dist/trails/config-init.d.ts +0 -9
  131. package/dist/trails/config-init.d.ts.map +0 -1
  132. package/dist/trails/config-init.js +0 -78
  133. package/dist/trails/config-init.js.map +0 -1
  134. package/dist/workspace.d.ts +0 -9
  135. package/dist/workspace.d.ts.map +0 -1
  136. package/dist/workspace.js +0 -49
  137. package/dist/workspace.js.map +0 -1
  138. package/dist/zod-utils.d.ts +0 -14
  139. package/dist/zod-utils.d.ts.map +0 -1
  140. package/dist/zod-utils.js +0 -41
  141. package/dist/zod-utils.js.map +0 -1
  142. package/src/__tests__/app-config.test.ts +0 -329
  143. package/src/__tests__/compose.test.ts +0 -59
  144. package/src/__tests__/config-check.test.ts +0 -171
  145. package/src/__tests__/config-describe.test.ts +0 -154
  146. package/src/__tests__/config-explain.test.ts +0 -167
  147. package/src/__tests__/config-gate.test.ts +0 -53
  148. package/src/__tests__/config-init.test.ts +0 -210
  149. package/src/__tests__/config-provision.test.ts +0 -87
  150. package/src/__tests__/define-config.test.ts +0 -263
  151. package/src/__tests__/describe.test.ts +0 -158
  152. package/src/__tests__/doctor.test.ts +0 -172
  153. package/src/__tests__/explain.test.ts +0 -139
  154. package/src/__tests__/extensions.test.ts +0 -134
  155. package/src/__tests__/generate.test.ts +0 -269
  156. package/src/__tests__/ref.test.ts +0 -35
  157. package/src/__tests__/resolve.test.ts +0 -246
  158. package/src/__tests__/workspace.test.ts +0 -64
  159. package/src/config-gate.ts +0 -15
  160. package/src/generate/index.ts +0 -3
  161. package/src/workspace.ts +0 -56
  162. package/tsconfig.json +0 -9
  163. package/tsconfig.tsbuildinfo +0 -1
package/dist/doctor.js DELETED
@@ -1,131 +0,0 @@
1
- /**
2
- * Config doctor — structured diagnostics for a config object against a schema.
3
- *
4
- * Reports which fields are valid, missing, using defaults, deprecated, or invalid.
5
- */
6
- import { collectConfigMeta } from './collect.js';
7
- import { getAtPath, isZodObject, unwrapToBase, zodDef } from './zod-utils.js';
8
- // ---------------------------------------------------------------------------
9
- // Helpers (defined before consumers)
10
- // ---------------------------------------------------------------------------
11
- /** Check if a schema wraps a ZodDefault. */
12
- const isDefaultWrapper = (schema) => zodDef(schema)['type'] === 'default';
13
- /** Check if a schema wraps a ZodOptional. */
14
- const isOptionalWrapper = (schema) => zodDef(schema)['type'] === 'optional';
15
- /** Get the default value from a ZodDefault wrapper. */
16
- const getDefaultValue = (schema) => zodDef(schema)['defaultValue'];
17
- /** Set a value at a dot-separated path, creating intermediate objects. */
18
- const setAtPath = (obj, path, value) => {
19
- const parts = path.split('.');
20
- let current = obj;
21
- for (let i = 0; i < parts.length - 1; i += 1) {
22
- const part = parts[i];
23
- const next = current[part];
24
- const nested = typeof next === 'object' && next !== null
25
- ? next
26
- : {};
27
- current[part] = nested;
28
- current = nested;
29
- }
30
- const lastPart = parts.at(-1);
31
- current[lastPart] = value;
32
- };
33
- /** Build values object with env overrides applied. */
34
- const applyEnvToValues = (values, schema, envVars) => {
35
- const meta = collectConfigMeta(schema);
36
- const result = structuredClone(values);
37
- for (const [path, fieldMeta] of meta) {
38
- if (fieldMeta.env && envVars[fieldMeta.env] !== undefined) {
39
- setAtPath(result, path, envVars[fieldMeta.env]);
40
- }
41
- }
42
- return result;
43
- };
44
- /** Validate a single field value against its schema. */
45
- const validateFieldValue = (path, fieldSchema, value) => {
46
- const result = fieldSchema.safeParse(value);
47
- if (result.success) {
48
- return { message: 'OK', path, status: 'valid', value };
49
- }
50
- const issue = result.error?.issues?.[0];
51
- const msg = issue ? issue.message : 'Invalid value';
52
- return { message: msg, path, status: 'invalid', value };
53
- };
54
- /** Classify a single field and produce a diagnostic. */
55
- const classifyField = (path, fieldSchema, values, deprecatedMeta) => {
56
- const value = getAtPath(values, path);
57
- const deprecationMsg = deprecatedMeta.get(path);
58
- if (deprecationMsg && value !== undefined) {
59
- return { message: deprecationMsg, path, status: 'deprecated', value };
60
- }
61
- if (value === undefined && isDefaultWrapper(fieldSchema)) {
62
- return {
63
- message: 'Using default value',
64
- path,
65
- status: 'default',
66
- value: getDefaultValue(fieldSchema),
67
- };
68
- }
69
- if (value === undefined && !isOptionalWrapper(fieldSchema)) {
70
- return {
71
- message: `Required field "${path}" is missing`,
72
- path,
73
- status: 'missing',
74
- };
75
- }
76
- return validateFieldValue(path, fieldSchema, value);
77
- };
78
- /** Collect deprecated metadata paths from config meta. */
79
- const collectDeprecatedPaths = (schema) => {
80
- const meta = collectConfigMeta(schema);
81
- const result = new Map();
82
- for (const [path, fieldMeta] of meta) {
83
- if (fieldMeta.deprecated) {
84
- result.set(path, fieldMeta.deprecated);
85
- }
86
- }
87
- return result;
88
- };
89
- /** Walk an object shape and enqueue leaf fields or nested objects. */
90
- const walkShape = (schema, prefix, queue, leaves) => {
91
- const shape = zodDef(schema)['shape'];
92
- for (const [key, fieldSchema] of Object.entries(shape)) {
93
- const path = prefix ? `${prefix}.${key}` : key;
94
- if (isZodObject(fieldSchema)) {
95
- queue.push({ path, schema: unwrapToBase(fieldSchema) });
96
- }
97
- else {
98
- leaves.push({ path, schema: fieldSchema });
99
- }
100
- }
101
- };
102
- /** Collect all leaf fields from a schema, walking nested objects iteratively. */
103
- const collectLeaves = (schema) => {
104
- const queue = [];
105
- const leaves = [];
106
- walkShape(schema, '', queue, leaves);
107
- for (let entry = queue.pop(); entry; entry = queue.pop()) {
108
- walkShape(entry.schema, entry.path, queue, leaves);
109
- }
110
- return leaves;
111
- };
112
- // ---------------------------------------------------------------------------
113
- // Public API
114
- // ---------------------------------------------------------------------------
115
- /**
116
- * Check a config object against a schema and return structured diagnostics.
117
- *
118
- * Reports which fields are valid, missing, using defaults, deprecated, or invalid.
119
- */
120
- export const checkConfig = (schema, values, options) => {
121
- const objSchema = schema;
122
- const effectiveValues = options?.env
123
- ? applyEnvToValues(values, objSchema, options.env)
124
- : values;
125
- const deprecatedMeta = collectDeprecatedPaths(objSchema);
126
- const leaves = collectLeaves(objSchema);
127
- const diagnostics = leaves.map((leaf) => classifyField(leaf.path, leaf.schema, effectiveValues, deprecatedMeta));
128
- const valid = diagnostics.every((d) => d.status !== 'missing' && d.status !== 'invalid');
129
- return { diagnostics, valid };
130
- };
131
- //# sourceMappingURL=doctor.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"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"}
package/dist/explain.d.ts DELETED
@@ -1,30 +0,0 @@
1
- /**
2
- * Config provenance — show which source won for each config field.
3
- *
4
- * Used for debugging: answers "where did this value come from?"
5
- */
6
- import type { z } from 'zod';
7
- /** Provenance entry describing the source of a resolved config value. */
8
- export interface ProvenanceEntry {
9
- readonly path: string;
10
- readonly value: unknown;
11
- readonly source: 'default' | 'base' | 'loadout' | 'local' | 'env';
12
- readonly redacted: boolean;
13
- }
14
- /** Options for explaining config provenance. */
15
- export interface ExplainConfigOptions<T extends z.ZodType> {
16
- readonly schema: T;
17
- readonly base?: Record<string, unknown>;
18
- readonly loadout?: Record<string, unknown>;
19
- readonly local?: Record<string, unknown>;
20
- readonly env?: Record<string, string | undefined>;
21
- readonly resolved: Record<string, unknown>;
22
- }
23
- /**
24
- * Show which source won for each config field.
25
- *
26
- * Used for debugging — answers "where did this value come from?"
27
- *
28
- */
29
- export declare const explainConfig: <T extends z.ZodType>(options: ExplainConfigOptions<T>) => readonly ProvenanceEntry[];
30
- //# sourceMappingURL=explain.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"explain.d.ts","sourceRoot":"","sources":["../src/explain.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAU7B,yEAAyE;AACzE,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,KAAK,CAAC;IAClE,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;CAC5B;AAED,gDAAgD;AAChD,MAAM,WAAW,oBAAoB,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO;IACvD,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IACnB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3C,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACzC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IAClD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC5C;AAmGD;;;;;GAKG;AACH,eAAO,MAAM,aAAa,GAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAC/C,SAAS,oBAAoB,CAAC,CAAC,CAAC,KAC/B,SAAS,eAAe,EAoC1B,CAAC"}
package/dist/explain.js DELETED
@@ -1,101 +0,0 @@
1
- /**
2
- * Config provenance — show which source won for each config field.
3
- *
4
- * Used for debugging: answers "where did this value come from?"
5
- */
6
- import { collectConfigMeta } from './collect.js';
7
- import { isLikelySecret } from './secret-heuristics.js';
8
- import { getAtPath, isZodObject, unwrapToBase, zodDef } from './zod-utils.js';
9
- // ---------------------------------------------------------------------------
10
- // Helpers (defined before consumers)
11
- // ---------------------------------------------------------------------------
12
- /** Build a map of path → env var name from config metadata. */
13
- const buildEnvMap = (schema) => {
14
- const meta = collectConfigMeta(schema);
15
- const result = new Map();
16
- for (const [path, fieldMeta] of meta) {
17
- if (fieldMeta.env) {
18
- result.set(path, fieldMeta.env);
19
- }
20
- }
21
- return result;
22
- };
23
- /** Build a set of paths marked as secret from config metadata. */
24
- const buildSecretSet = (schema) => {
25
- const meta = collectConfigMeta(schema);
26
- const result = new Set();
27
- for (const [path, fieldMeta] of meta) {
28
- if (fieldMeta.secret) {
29
- result.add(path);
30
- }
31
- }
32
- return result;
33
- };
34
- /** Determine which source provided the winning value for a given path. */
35
- const determineSource = (path, resolved, sources, envMap, envVars) => {
36
- if (envVars && envMap.has(path)) {
37
- const envVar = envMap.get(path);
38
- if (envVar && envVars[envVar] !== undefined) {
39
- return 'env';
40
- }
41
- }
42
- const resolvedValue = getAtPath(resolved, path);
43
- for (const [name, values] of sources) {
44
- if (values && getAtPath(values, path) === resolvedValue) {
45
- return name;
46
- }
47
- }
48
- return 'default';
49
- };
50
- /** Collect all leaf field paths from an object schema. */
51
- const collectLeafPaths = (schema, prefix) => {
52
- const paths = [];
53
- const queue = [{ prefix, schema }];
54
- for (let entry = queue.pop(); entry; entry = queue.pop()) {
55
- const shape = zodDef(entry.schema)['shape'];
56
- for (const [key, fieldSchema] of Object.entries(shape)) {
57
- const path = entry.prefix ? `${entry.prefix}.${key}` : key;
58
- if (isZodObject(fieldSchema)) {
59
- queue.push({ prefix: path, schema: unwrapToBase(fieldSchema) });
60
- }
61
- else {
62
- paths.push(path);
63
- }
64
- }
65
- }
66
- return paths;
67
- };
68
- // ---------------------------------------------------------------------------
69
- // Public API
70
- // ---------------------------------------------------------------------------
71
- /**
72
- * Show which source won for each config field.
73
- *
74
- * Used for debugging — answers "where did this value come from?"
75
- *
76
- */
77
- export const explainConfig = (options) => {
78
- const objSchema = options.schema;
79
- const envMap = buildEnvMap(objSchema);
80
- const secretSet = buildSecretSet(objSchema);
81
- const sources = [
82
- ['local', options.local],
83
- ['loadout', options.loadout],
84
- ['base', options.base],
85
- ];
86
- const paths = collectLeafPaths(objSchema, '');
87
- return paths.map((path) => {
88
- const source = determineSource(path, options.resolved, sources, envMap, options.env);
89
- const envVarName = envMap.get(path);
90
- const isSecret = secretSet.has(path) ||
91
- (envVarName !== undefined && isLikelySecret(envVarName));
92
- const rawValue = getAtPath(options.resolved, path);
93
- return {
94
- path,
95
- redacted: isSecret,
96
- source,
97
- value: isSecret ? '[REDACTED]' : rawValue,
98
- };
99
- });
100
- };
101
- //# sourceMappingURL=explain.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"explain.js","sourceRoot":"","sources":["../src/explain.ts"],"names":[],"mappings":"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"}
@@ -1,38 +0,0 @@
1
- import type { z } from 'zod';
2
- /** Metadata shape stored on Zod schemas via `.meta()`. */
3
- export interface ConfigFieldMeta {
4
- readonly env?: string;
5
- readonly secret?: boolean;
6
- readonly deprecated?: string;
7
- }
8
- /**
9
- * Bind a schema field to an environment variable.
10
- *
11
- * Must be called BEFORE `.default()`, `.optional()`, or other transforms
12
- * so that the metadata lives on the inner type where `collectConfigMeta`
13
- * can find it by unwrapping wrappers.
14
- */
15
- export declare const env: <T extends z.ZodType>(schema: T, varName: string) => T;
16
- /**
17
- * Mark a schema field as sensitive. Redacted in survey, explain, and logs.
18
- *
19
- * Must be called BEFORE `.default()`, `.optional()`, or other transforms.
20
- */
21
- export declare const secret: <T extends z.ZodType>(schema: T) => T;
22
- /**
23
- * Mark a schema field as deprecated with migration guidance.
24
- *
25
- * Stores **two** meta keys: `deprecated: true` and `deprecationMessage: string`.
26
- * This indirection exists because Zod 4's `GlobalMeta` types `deprecated` as
27
- * `boolean | undefined` — there is no way to attach a migration message to the
28
- * standard key. We set `deprecated: true` so Zod-native tooling (schema
29
- * serializers, OpenAPI generators) recognises the field as deprecated, and store
30
- * the human-readable message under `deprecationMessage` for our own
31
- * `collectConfigMeta` / survey / explain trailheads.
32
- *
33
- * Must be called BEFORE `.default()`, `.optional()`, or other transforms
34
- * so that the metadata lives on the inner type where `collectConfigMeta`
35
- * can find it by unwrapping wrappers.
36
- */
37
- export declare const deprecated: <T extends z.ZodType>(schema: T, message: string) => T;
38
- //# sourceMappingURL=extensions.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"extensions.d.ts","sourceRoot":"","sources":["../src/extensions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAE7B,0DAA0D;AAC1D,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED;;;;;;GAMG;AACH,eAAO,MAAM,GAAG,GAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,SAAS,MAAM,KAAG,CAChB,CAAC;AAEvD;;;;GAIG;AACH,eAAO,MAAM,MAAM,GAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,KAAG,CACF,CAAC;AAEvD;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,UAAU,GAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAC5C,QAAQ,CAAC,EACT,SAAS,MAAM,KACd,CAKM,CAAC"}
@@ -1,35 +0,0 @@
1
- /**
2
- * Bind a schema field to an environment variable.
3
- *
4
- * Must be called BEFORE `.default()`, `.optional()`, or other transforms
5
- * so that the metadata lives on the inner type where `collectConfigMeta`
6
- * can find it by unwrapping wrappers.
7
- */
8
- export const env = (schema, varName) => schema.meta({ ...schema.meta(), env: varName });
9
- /**
10
- * Mark a schema field as sensitive. Redacted in survey, explain, and logs.
11
- *
12
- * Must be called BEFORE `.default()`, `.optional()`, or other transforms.
13
- */
14
- export const secret = (schema) => schema.meta({ ...schema.meta(), secret: true });
15
- /**
16
- * Mark a schema field as deprecated with migration guidance.
17
- *
18
- * Stores **two** meta keys: `deprecated: true` and `deprecationMessage: string`.
19
- * This indirection exists because Zod 4's `GlobalMeta` types `deprecated` as
20
- * `boolean | undefined` — there is no way to attach a migration message to the
21
- * standard key. We set `deprecated: true` so Zod-native tooling (schema
22
- * serializers, OpenAPI generators) recognises the field as deprecated, and store
23
- * the human-readable message under `deprecationMessage` for our own
24
- * `collectConfigMeta` / survey / explain trailheads.
25
- *
26
- * Must be called BEFORE `.default()`, `.optional()`, or other transforms
27
- * so that the metadata lives on the inner type where `collectConfigMeta`
28
- * can find it by unwrapping wrappers.
29
- */
30
- export const deprecated = (schema, message) => schema.meta({
31
- ...schema.meta(),
32
- deprecated: true,
33
- deprecationMessage: message,
34
- });
35
- //# sourceMappingURL=extensions.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"extensions.js","sourceRoot":"","sources":["../src/extensions.ts"],"names":[],"mappings":"AASA;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,GAAG,GAAG,CAAsB,MAAS,EAAE,OAAe,EAAK,EAAE,CACxE,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,MAAM,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,CAAM,CAAC;AAEvD;;;;GAIG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,CAAsB,MAAS,EAAK,EAAE,CAC1D,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,MAAM,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAM,CAAC;AAEvD;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,CACxB,MAAS,EACT,OAAe,EACZ,EAAE,CACL,MAAM,CAAC,IAAI,CAAC;IACV,GAAG,MAAM,CAAC,IAAI,EAAE;IAChB,UAAU,EAAE,IAAI;IAChB,kBAAkB,EAAE,OAAO;CAC5B,CAAM,CAAC"}
@@ -1,15 +0,0 @@
1
- /**
2
- * `.env.example` file generation from Zod schema `env()` bindings.
3
- *
4
- * Lists each env var with its type, default, and whether it is a secret.
5
- * Returns an empty string when no env bindings are present.
6
- */
7
- import type { z } from 'zod';
8
- /**
9
- * Generate a `.env.example` file from `env()` bindings in the schema.
10
- *
11
- * Lists each env var with its type, default, and whether it is a secret.
12
- * Returns an empty string when no env bindings are present.
13
- */
14
- export declare const generateEnvExample: (schema: z.ZodObject<Record<string, z.ZodType>>) => string;
15
- //# sourceMappingURL=env.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/generate/env.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAsF7B;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,GAC7B,QAAQ,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,KAC7C,MAGF,CAAC"}
@@ -1,65 +0,0 @@
1
- import { collectConfigMeta } from '../collect.js';
2
- import { isLikelySecret } from '../secret-heuristics.js';
3
- import { formatValue, getDefault, getDescription, resolveFieldByPath, unwrap, zodTypeName, zodTypeToJsonSchema, } from './helpers.js';
4
- // ---------------------------------------------------------------------------
5
- // Helpers
6
- // ---------------------------------------------------------------------------
7
- /** Map Zod type names to human-readable type labels. */
8
- const typeLabel = (schema) => {
9
- const typeName = zodTypeName(unwrap(schema));
10
- return zodTypeToJsonSchema[typeName] ?? typeName;
11
- };
12
- /** Build the type annotation comment for an env entry. */
13
- const envTypeAnnotation = (fieldSchema, meta) => {
14
- const parts = [`type: ${typeLabel(fieldSchema)}`];
15
- const info = getDefault(fieldSchema);
16
- if (info.has) {
17
- parts.push(`default: ${formatValue(info.value)}`);
18
- }
19
- if (meta.secret) {
20
- parts.push('secret');
21
- }
22
- return `# ${parts.join(', ')}`;
23
- };
24
- /** Format a single env var entry. */
25
- const envEntry = (envVar, fieldSchema, meta) => {
26
- const effectiveMeta = !meta.secret && isLikelySecret(envVar) ? { ...meta, secret: true } : meta;
27
- const lines = [];
28
- const desc = getDescription(fieldSchema);
29
- if (desc) {
30
- lines.push(`# ${desc}`);
31
- }
32
- lines.push(envTypeAnnotation(fieldSchema, effectiveMeta));
33
- lines.push(`${envVar}=`);
34
- return lines;
35
- };
36
- /** Collect env entries from config metadata. */
37
- const collectEnvEntries = (schema, meta) => {
38
- const entries = [];
39
- for (const [path, fieldMeta] of meta) {
40
- if (!fieldMeta.env) {
41
- continue;
42
- }
43
- const fieldSchema = resolveFieldByPath(schema, path);
44
- if (!fieldSchema) {
45
- continue;
46
- }
47
- entries.push(...envEntry(fieldMeta.env, fieldSchema, fieldMeta));
48
- entries.push('');
49
- }
50
- return entries;
51
- };
52
- // ---------------------------------------------------------------------------
53
- // Public API
54
- // ---------------------------------------------------------------------------
55
- /**
56
- * Generate a `.env.example` file from `env()` bindings in the schema.
57
- *
58
- * Lists each env var with its type, default, and whether it is a secret.
59
- * Returns an empty string when no env bindings are present.
60
- */
61
- export const generateEnvExample = (schema) => {
62
- const entries = collectEnvEntries(schema, collectConfigMeta(schema));
63
- return entries.length === 0 ? '' : entries.join('\n');
64
- };
65
- //# sourceMappingURL=env.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/generate/env.ts"],"names":[],"mappings":"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"}
@@ -1,16 +0,0 @@
1
- /**
2
- * Config example file generation in multiple formats.
3
- *
4
- * Produces TOML, JSON, JSONC, and YAML example files from a Zod schema,
5
- * with defaults shown and deprecated fields annotated.
6
- */
7
- import type { z } from 'zod';
8
- type ExampleFormat = 'json' | 'jsonc' | 'toml' | 'yaml';
9
- /**
10
- * Generate an example config file in the specified format.
11
- *
12
- * Includes descriptions as comments, defaults shown, deprecated fields annotated.
13
- */
14
- export declare const generateExample: (schema: z.ZodObject<Record<string, z.ZodType>>, format: ExampleFormat) => string;
15
- export {};
16
- //# sourceMappingURL=example.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"example.d.ts","sourceRoot":"","sources":["../../src/generate/example.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAmM7B,KAAK,aAAa,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;AAYxD;;;;GAIG;AACH,eAAO,MAAM,eAAe,GAC1B,QAAQ,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,EAC9C,QAAQ,aAAa,KACpB,MAAoC,CAAC"}
@@ -1,138 +0,0 @@
1
- import { fieldComments, fieldValue, formatValue, getObjectShape, isObjectType, pushComments, unwrap, } from './helpers.js';
2
- // ---------------------------------------------------------------------------
3
- // TOML generation
4
- // ---------------------------------------------------------------------------
5
- /** Render a flat set of fields as TOML key = value lines. */
6
- const renderTomlFields = (shape, lines) => {
7
- for (const [key, fieldSchema] of Object.entries(shape)) {
8
- if (isObjectType(fieldSchema)) {
9
- continue;
10
- }
11
- pushComments(lines, fieldComments(fieldSchema, '#'), '');
12
- lines.push(`${key} = ${formatValue(fieldValue(fieldSchema))}`);
13
- }
14
- };
15
- /** Render nested objects as TOML sections, recursing with dotted prefixes. */
16
- const renderTomlSections = (shape, lines, prefix = '') => {
17
- for (const [key, fieldSchema] of Object.entries(shape)) {
18
- const nested = isObjectType(fieldSchema)
19
- ? getObjectShape(fieldSchema)
20
- : undefined;
21
- if (!nested) {
22
- continue;
23
- }
24
- const sectionKey = prefix ? `${prefix}.${key}` : key;
25
- if (lines.length > 0) {
26
- lines.push('');
27
- }
28
- lines.push(`[${sectionKey}]`);
29
- renderTomlFields(nested, lines);
30
- // oxlint-disable-next-line max-statements -- recursive TOML section rendering
31
- renderTomlSections(nested, lines, sectionKey);
32
- }
33
- };
34
- const formatToml = (schema) => {
35
- const shape = schema.shape;
36
- const lines = [];
37
- renderTomlFields(shape, lines);
38
- renderTomlSections(shape, lines);
39
- return `${lines.join('\n')}\n`;
40
- };
41
- // ---------------------------------------------------------------------------
42
- // JSON / JSONC generation
43
- // ---------------------------------------------------------------------------
44
- /** Resolve a field to its nested object or its scalar value. */
45
- const resolveJsonField = (fieldSchema, recurse) => {
46
- if (!isObjectType(fieldSchema)) {
47
- return fieldValue(fieldSchema);
48
- }
49
- const nested = getObjectShape(fieldSchema);
50
- if (!nested) {
51
- return fieldValue(fieldSchema);
52
- }
53
- const inner = unwrap(fieldSchema);
54
- return recurse(inner);
55
- };
56
- /** Build a plain object with default/placeholder values for JSON output. */
57
- const buildJsonObject = (schema) => {
58
- const shape = schema.shape;
59
- const obj = {};
60
- for (const [key, fieldSchema] of Object.entries(shape)) {
61
- obj[key] = resolveJsonField(fieldSchema, buildJsonObject);
62
- }
63
- return obj;
64
- };
65
- const formatJson = (schema) => `${JSON.stringify(buildJsonObject(schema), null, 2)}\n`;
66
- /** Serialize a nested object field for JSONC output. */
67
- const serializeJsoncObject = (fieldSchema) => {
68
- const nested = getObjectShape(fieldSchema);
69
- if (!nested) {
70
- return undefined;
71
- }
72
- const inner = unwrap(fieldSchema);
73
- return JSON.stringify(buildJsonObject(inner), null, 2).replaceAll('\n', '\n ');
74
- };
75
- /** Render a single JSONC entry (comments + key: value). */
76
- const renderJsoncEntry = (key, fieldSchema, isLast, lines) => {
77
- pushComments(lines, fieldComments(fieldSchema, '//'), ' ');
78
- const comma = isLast ? '' : ',';
79
- const serialized = isObjectType(fieldSchema)
80
- ? serializeJsoncObject(fieldSchema)
81
- : undefined;
82
- const val = serialized ?? formatValue(fieldValue(fieldSchema));
83
- lines.push(` "${key}": ${val}${comma}`);
84
- };
85
- const formatJsonc = (schema) => {
86
- const keys = Object.keys(schema.shape);
87
- const shape = schema.shape;
88
- const lines = ['{'];
89
- for (let i = 0; i < keys.length; i += 1) {
90
- const key = keys[i];
91
- renderJsoncEntry(key, shape[key], i === keys.length - 1, lines);
92
- }
93
- lines.push('}');
94
- return `${lines.join('\n')}\n`;
95
- };
96
- // ---------------------------------------------------------------------------
97
- // YAML generation
98
- // ---------------------------------------------------------------------------
99
- /** Render a single YAML scalar field. */
100
- const renderYamlScalar = (key, fieldSchema, indent, lines) => {
101
- pushComments(lines, fieldComments(fieldSchema, '#'), indent);
102
- lines.push(`${indent}${key}: ${formatValue(fieldValue(fieldSchema))}`);
103
- };
104
- /** Render YAML fields at a given indent level. */
105
- const renderYamlFields = (shape, indent, lines) => {
106
- for (const [key, fieldSchema] of Object.entries(shape)) {
107
- if (isObjectType(fieldSchema)) {
108
- const nested = getObjectShape(fieldSchema);
109
- if (!nested) {
110
- continue;
111
- }
112
- lines.push(`${indent}${key}:`);
113
- renderYamlFields(nested, `${indent} `, lines);
114
- }
115
- else {
116
- renderYamlScalar(key, fieldSchema, indent, lines);
117
- }
118
- }
119
- };
120
- const formatYaml = (schema) => {
121
- const shape = schema.shape;
122
- const lines = [];
123
- renderYamlFields(shape, '', lines);
124
- return `${lines.join('\n')}\n`;
125
- };
126
- const formatters = {
127
- json: formatJson,
128
- jsonc: formatJsonc,
129
- toml: formatToml,
130
- yaml: formatYaml,
131
- };
132
- /**
133
- * Generate an example config file in the specified format.
134
- *
135
- * Includes descriptions as comments, defaults shown, deprecated fields annotated.
136
- */
137
- export const generateExample = (schema, format) => formatters[format](schema);
138
- //# sourceMappingURL=example.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"example.js","sourceRoot":"","sources":["../../src/generate/example.ts"],"names":[],"mappings":"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"}