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

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 (54) hide show
  1. package/.turbo/turbo-lint.log +1 -1
  2. package/CHANGELOG.md +11 -0
  3. package/README.md +212 -0
  4. package/dist/compose.d.ts +15 -11
  5. package/dist/compose.d.ts.map +1 -1
  6. package/dist/compose.js +9 -7
  7. package/dist/compose.js.map +1 -1
  8. package/dist/config-gate.d.ts +11 -0
  9. package/dist/config-gate.d.ts.map +1 -0
  10. package/dist/config-gate.js +6 -0
  11. package/dist/config-gate.js.map +1 -0
  12. package/dist/config-provision.d.ts +3 -0
  13. package/dist/config-provision.d.ts.map +1 -0
  14. package/dist/config-provision.js +26 -0
  15. package/dist/config-provision.js.map +1 -0
  16. package/dist/doctor.d.ts.map +1 -1
  17. package/dist/doctor.js +1 -37
  18. package/dist/doctor.js.map +1 -1
  19. package/dist/explain.d.ts.map +1 -1
  20. package/dist/explain.js +5 -18
  21. package/dist/explain.js.map +1 -1
  22. package/dist/extensions.d.ts +1 -1
  23. package/dist/extensions.js +1 -1
  24. package/dist/generate/example.d.ts.map +1 -1
  25. package/dist/generate/example.js +20 -18
  26. package/dist/generate/example.js.map +1 -1
  27. package/dist/generate/helpers.js +1 -1
  28. package/dist/generate/helpers.js.map +1 -1
  29. package/dist/index.d.ts +3 -3
  30. package/dist/index.d.ts.map +1 -1
  31. package/dist/index.js +3 -3
  32. package/dist/index.js.map +1 -1
  33. package/dist/ref.d.ts +8 -3
  34. package/dist/ref.d.ts.map +1 -1
  35. package/dist/ref.js +8 -3
  36. package/dist/ref.js.map +1 -1
  37. package/dist/registry.d.ts +1 -1
  38. package/dist/resolve.d.ts.map +1 -1
  39. package/dist/resolve.js +4 -1
  40. package/dist/resolve.js.map +1 -1
  41. package/dist/trails/config-check.js +12 -12
  42. package/dist/trails/config-check.js.map +1 -1
  43. package/dist/trails/config-describe.js +8 -8
  44. package/dist/trails/config-describe.js.map +1 -1
  45. package/dist/trails/config-explain.js +12 -12
  46. package/dist/trails/config-explain.js.map +1 -1
  47. package/dist/trails/config-init.js +13 -13
  48. package/dist/trails/config-init.js.map +1 -1
  49. package/dist/workspace.d.ts.map +1 -1
  50. package/dist/workspace.js +5 -0
  51. package/dist/workspace.js.map +1 -1
  52. package/package.json +2 -2
  53. package/src/workspace.ts +5 -0
  54. package/tsconfig.tsbuildinfo +1 -1
@@ -1,3 +1,3 @@
1
1
  $ oxlint ./src
2
2
  Found 0 warnings and 0 errors.
3
- Finished in 14ms on 44 files with 93 rules using 24 threads.
3
+ Finished in 51ms on 44 files with 93 rules using 24 threads.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,16 @@
1
1
  # @ontrails/config
2
2
 
3
+ ## 1.0.0-beta.14
4
+
5
+ ### Minor Changes
6
+
7
+ - 69057e9: Add hierarchical CLI command trees and structured input, enforce established-only topo exports across trailheads, move developer topo and tracker state onto shared `trails.db` with pins and maintenance flows, and ship schema-derived stores through `@ontrails/store` and its Drizzle runtime.
8
+
9
+ ### Patch Changes
10
+
11
+ - Updated dependencies [69057e9]
12
+ - @ontrails/core@1.0.0-beta.14
13
+
3
14
  ## 1.0.0-beta.13
4
15
 
5
16
  ### Minor Changes
package/README.md ADDED
@@ -0,0 +1,212 @@
1
+ # @ontrails/config
2
+
3
+ Schema-derived configuration for Trails.
4
+
5
+ The root package owns the connector-agnostic config declaration and resolution engine. Schemas define the contract; the provision and gate bind resolved values to the execution context.
6
+
7
+ ## The core pattern
8
+
9
+ ### 1. Define the config schema
10
+
11
+ ```typescript
12
+ import { defineConfig, env, secret } from '@ontrails/config';
13
+ import { z } from 'zod';
14
+
15
+ export const config = defineConfig({
16
+ schema: z.object({
17
+ port: z.number().default(3000),
18
+ host: z.string().default('localhost'),
19
+ database: z.object({
20
+ url: env(secret(z.string()), 'DATABASE_URL'),
21
+ }),
22
+ debug: z.boolean().default(false),
23
+ }),
24
+ base: {
25
+ host: 'example.com',
26
+ },
27
+ loadouts: {
28
+ production: {
29
+ debug: false,
30
+ host: 'prod.example.com',
31
+ port: 443,
32
+ },
33
+ test: {
34
+ debug: true,
35
+ port: 0,
36
+ },
37
+ },
38
+ });
39
+ ```
40
+
41
+ ### 2. Resolve the config at bootstrap
42
+
43
+ ```typescript
44
+ import { registerConfigState } from '@ontrails/config';
45
+
46
+ const result = await config.resolve({
47
+ cwd: process.cwd(),
48
+ loadout: process.env.TRAILS_ENV,
49
+ });
50
+
51
+ if (!result.isOk()) {
52
+ throw result.error;
53
+ }
54
+
55
+ registerConfigState({
56
+ resolved: result.unwrap(),
57
+ schema: config.schema,
58
+ base: config.base,
59
+ loadout: process.env.TRAILS_ENV,
60
+ env: process.env,
61
+ });
62
+ ```
63
+
64
+ ### 3. Access resolved config in trails
65
+
66
+ ```typescript
67
+ import { configProvision } from '@ontrails/config';
68
+
69
+ export const getStatus = trail('status.get', {
70
+ provisions: [configProvision],
71
+ blaze: (_input, ctx) => {
72
+ const state = configProvision.from(ctx);
73
+ return Result.ok({
74
+ port: state.resolved.port,
75
+ debug: state.resolved.debug,
76
+ });
77
+ },
78
+ });
79
+ ```
80
+
81
+ ## Resolution stack
82
+
83
+ Config resolves through a deterministic priority order:
84
+
85
+ ```text
86
+ defaults (schema) → base → loadout → local → env
87
+ ```
88
+
89
+ Each layer overrides the previous. Environment variables always win.
90
+
91
+ ## Extensions
92
+
93
+ ### `env()`
94
+
95
+ Bind a schema field to an environment variable:
96
+
97
+ ```typescript
98
+ import { env } from '@ontrails/config';
99
+
100
+ const schema = z.object({
101
+ database: env(z.string(), 'DATABASE_URL'),
102
+ port: env(z.number(), 'PORT').default(3000),
103
+ });
104
+ ```
105
+
106
+ Environment variables are coerced to the schema type. Apply `env()` before `.default()` so metadata lives on the inner type.
107
+
108
+ ### `secret()`
109
+
110
+ Mark a schema field as sensitive:
111
+
112
+ ```typescript
113
+ import { secret } from '@ontrails/config';
114
+
115
+ const schema = z.object({
116
+ apiKey: secret(z.string()),
117
+ password: secret(env(z.string(), 'DB_PASSWORD')),
118
+ });
119
+ ```
120
+
121
+ Secret fields are redacted in explain output, diagnostics, and logs.
122
+
123
+ ### `deprecated()`
124
+
125
+ Mark a field as deprecated with migration guidance:
126
+
127
+ ```typescript
128
+ import { deprecated } from '@ontrails/config';
129
+
130
+ const schema = z.object({
131
+ oldField: deprecated(z.string(), 'Use newField instead'),
132
+ newField: z.string(),
133
+ });
134
+ ```
135
+
136
+ ## The provision
137
+
138
+ The config provision manages resolved config lifecycle:
139
+
140
+ ```typescript
141
+ import { configProvision } from '@ontrails/config';
142
+
143
+ export const myTrail = trail('my.trail', {
144
+ provisions: [configProvision],
145
+ blaze: (_input, ctx) => {
146
+ const state = configProvision.from(ctx);
147
+ return Result.ok(state.resolved);
148
+ },
149
+ });
150
+ ```
151
+
152
+ ## The gate
153
+
154
+ The config gate reserves a slot in the execution context for per-trail config validation:
155
+
156
+ ```typescript
157
+ import { configGate } from '@ontrails/config';
158
+
159
+ export const app = topo('my-app', configModule);
160
+ // Register configGate with your trailhead
161
+ ```
162
+
163
+ ## Trail definitions
164
+
165
+ ### `config.check`
166
+
167
+ Validate config values against the schema. Returns diagnostics with field-level status (valid, missing, invalid, deprecated, default).
168
+
169
+ ### `config.describe`
170
+
171
+ Describe all fields in the schema — paths, types, defaults, env bindings, secret markers, deprecation messages.
172
+
173
+ ### `config.explain`
174
+
175
+ Show which source won for each config field — defaults, base, loadout, local, or env.
176
+
177
+ ### `config.init`
178
+
179
+ Generate example config files in TOML, JSON, JSONC, or YAML. Optionally writes `.env.example` and `.schema.json`.
180
+
181
+ ## Testing
182
+
183
+ Trails that depend on `configProvision` auto-resolve with a mock when registered in the topo:
184
+
185
+ ```typescript
186
+ import { testAll } from '@ontrails/testing';
187
+
188
+ const results = testAll(app);
189
+ // configProvision.mock() is called automatically
190
+ ```
191
+
192
+ For explicit test setup:
193
+
194
+ ```typescript
195
+ import { registerConfigState, clearConfigState } from '@ontrails/config';
196
+
197
+ afterEach(() => clearConfigState());
198
+
199
+ test('config trail', async () => {
200
+ registerConfigState({
201
+ resolved: { port: 3000 },
202
+ schema: z.object({ port: z.number() }),
203
+ });
204
+ // ...
205
+ });
206
+ ```
207
+
208
+ ## Installation
209
+
210
+ ```bash
211
+ bun add @ontrails/config @ontrails/core zod
212
+ ```
package/dist/compose.d.ts CHANGED
@@ -1,26 +1,30 @@
1
1
  /**
2
- * Config composition utilities for services.
2
+ * Config composition utilities for provisions.
3
3
  *
4
- * Collects config schemas from service declarations so they can be
4
+ * Collects config schemas from provision declarations so they can be
5
5
  * composed into a unified config structure via `defineConfig`.
6
6
  */
7
7
  import type { z } from 'zod';
8
- /** A service config schema entry extracted from a service declaration. */
9
- export interface ServiceConfigEntry {
10
- readonly serviceId: string;
8
+ /** A provision config schema entry extracted from a provision declaration. */
9
+ export interface ProvisionConfigEntry {
10
+ readonly provisionId: string;
11
11
  readonly schema: z.ZodType;
12
12
  }
13
- /** Minimal shape needed to extract config from a service-like object. */
14
- interface ServiceWithOptionalConfig {
13
+ /** Backward-compatible alias while the migration is in flight. */
14
+ export type ServiceConfigEntry = ProvisionConfigEntry;
15
+ /** Minimal shape needed to extract config from a provision-like object. */
16
+ interface ProvisionWithOptionalConfig {
15
17
  readonly id: string;
16
18
  readonly config?: z.ZodType | undefined;
17
19
  }
18
20
  /**
19
- * Collect config schemas from services that declare them.
21
+ * Collect config schemas from provisions that declare them.
20
22
  *
21
- * Returns entries keyed by service ID for composition into `defineConfig`.
22
- * Services without a `config` schema are excluded.
23
+ * Returns entries keyed by provision ID for composition into `defineConfig`.
24
+ * Provisions without a `config` schema are excluded.
23
25
  */
24
- export declare const collectServiceConfigs: (services: readonly ServiceWithOptionalConfig[]) => ServiceConfigEntry[];
26
+ export declare const collectProvisionConfigs: (provisions: readonly ProvisionWithOptionalConfig[]) => ProvisionConfigEntry[];
27
+ /** Backward-compatible alias while the migration is in flight. */
28
+ export declare const collectServiceConfigs: (provisions: readonly ProvisionWithOptionalConfig[]) => ProvisionConfigEntry[];
25
29
  export {};
26
30
  //# sourceMappingURL=compose.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"compose.d.ts","sourceRoot":"","sources":["../src/compose.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAM7B,0EAA0E;AAC1E,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC;CAC5B;AAED,yEAAyE;AACzE,UAAU,yBAAyB;IACjC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,OAAO,GAAG,SAAS,CAAC;CACzC;AAMD;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,GAChC,UAAU,SAAS,yBAAyB,EAAE,KAC7C,kBAAkB,EAQyC,CAAC"}
1
+ {"version":3,"file":"compose.d.ts","sourceRoot":"","sources":["../src/compose.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAM7B,8EAA8E;AAC9E,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC;CAC5B;AAED,kEAAkE;AAClE,MAAM,MAAM,kBAAkB,GAAG,oBAAoB,CAAC;AAEtD,2EAA2E;AAC3E,UAAU,2BAA2B;IACnC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,OAAO,GAAG,SAAS,CAAC;CACzC;AAMD;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB,GAClC,YAAY,SAAS,2BAA2B,EAAE,KACjD,oBAAoB,EAQyC,CAAC;AAEjE,kEAAkE;AAClE,eAAO,MAAM,qBAAqB,eAZpB,SAAS,2BAA2B,EAAE,KACjD,oBAAoB,EAWqC,CAAC"}
package/dist/compose.js CHANGED
@@ -1,19 +1,21 @@
1
1
  /**
2
- * Config composition utilities for services.
2
+ * Config composition utilities for provisions.
3
3
  *
4
- * Collects config schemas from service declarations so they can be
4
+ * Collects config schemas from provision declarations so they can be
5
5
  * composed into a unified config structure via `defineConfig`.
6
6
  */
7
7
  // ---------------------------------------------------------------------------
8
8
  // Public API
9
9
  // ---------------------------------------------------------------------------
10
10
  /**
11
- * Collect config schemas from services that declare them.
11
+ * Collect config schemas from provisions that declare them.
12
12
  *
13
- * Returns entries keyed by service ID for composition into `defineConfig`.
14
- * Services without a `config` schema are excluded.
13
+ * Returns entries keyed by provision ID for composition into `defineConfig`.
14
+ * Provisions without a `config` schema are excluded.
15
15
  */
16
- export const collectServiceConfigs = (services) => services
16
+ export const collectProvisionConfigs = (provisions) => provisions
17
17
  .filter((svc) => svc.config !== undefined)
18
- .map((svc) => ({ schema: svc.config, serviceId: svc.id }));
18
+ .map((svc) => ({ provisionId: svc.id, schema: svc.config }));
19
+ /** Backward-compatible alias while the migration is in flight. */
20
+ export const collectServiceConfigs = collectProvisionConfigs;
19
21
  //# sourceMappingURL=compose.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"compose.js","sourceRoot":"","sources":["../src/compose.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAoBH,8EAA8E;AAC9E,aAAa;AACb,8EAA8E;AAE9E;;;;;GAKG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CACnC,QAA8C,EACxB,EAAE,CACxB,QAAQ;KACL,MAAM,CACL,CACE,GAAG,EACgE,EAAE,CACrE,GAAG,CAAC,MAAM,KAAK,SAAS,CAC3B;KACA,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"compose.js","sourceRoot":"","sources":["../src/compose.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAuBH,8EAA8E;AAC9E,aAAa;AACb,8EAA8E;AAE9E;;;;;GAKG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CACrC,UAAkD,EAC1B,EAAE,CAC1B,UAAU;KACP,MAAM,CACL,CACE,GAAG,EACkE,EAAE,CACvE,GAAG,CAAC,MAAM,KAAK,SAAS,CAC3B;KACA,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;AAEjE,kEAAkE;AAClE,MAAM,CAAC,MAAM,qBAAqB,GAAG,uBAAuB,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Config gate — attaches resolved config to the execution context.
3
+ *
4
+ * For v1, the gate is a pass-through: config resolution happens at
5
+ * bootstrap time and the provision pipeline (TRL-91) injects the resolved
6
+ * config before any trail runs. The gate reserves a named slot so future
7
+ * versions can add per-trail config overrides or validation.
8
+ */
9
+ import type { Gate } from '@ontrails/core';
10
+ export declare const configGate: Gate;
11
+ //# sourceMappingURL=config-gate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-gate.d.ts","sourceRoot":"","sources":["../src/config-gate.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAE3C,eAAO,MAAM,UAAU,EAAE,IAIxB,CAAC"}
@@ -0,0 +1,6 @@
1
+ export const configGate = {
2
+ description: 'Ensures resolved config is available in the execution context',
3
+ name: 'config',
4
+ wrap: (_trail, impl) => (input, ctx) => impl(input, ctx),
5
+ };
6
+ //# sourceMappingURL=config-gate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-gate.js","sourceRoot":"","sources":["../src/config-gate.ts"],"names":[],"mappings":"AAUA,MAAM,CAAC,MAAM,UAAU,GAAS;IAC9B,WAAW,EAAE,+DAA+D;IAC5E,IAAI,EAAE,QAAQ;IACd,IAAI,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC;CACzD,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { ConfigState } from './registry.js';
2
+ export declare const configProvision: import("@ontrails/core").Provision<ConfigState>;
3
+ //# sourceMappingURL=config-provision.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-provision.d.ts","sourceRoot":"","sources":["../src/config-provision.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAGjD,eAAO,MAAM,eAAe,iDAkB1B,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Config provision — manages resolved config lifecycle.
3
+ *
4
+ * The config is resolved during bootstrap (two-phase init per ADR-010)
5
+ * and registered via `registerConfigState`. This provision reads from the
6
+ * global registry so trails can access it through `configProvision.from(ctx)`.
7
+ */
8
+ import { InternalError, Result, provision } from '@ontrails/core';
9
+ import { z } from 'zod';
10
+ import { getConfigState } from './registry.js';
11
+ export const configProvision = provision('config', {
12
+ create: () => {
13
+ const state = getConfigState();
14
+ if (state === undefined) {
15
+ return Result.err(new InternalError('Config state not registered — call registerConfigState at bootstrap'));
16
+ }
17
+ return Result.ok(state);
18
+ },
19
+ description: 'Resolved application configuration',
20
+ meta: { category: 'infrastructure' },
21
+ mock: () => ({
22
+ resolved: {},
23
+ schema: z.object({}),
24
+ }),
25
+ });
26
+ //# sourceMappingURL=config-provision.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-provision.js","sourceRoot":"","sources":["../src/config-provision.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE/C,MAAM,CAAC,MAAM,eAAe,GAAG,SAAS,CAAc,QAAQ,EAAE;IAC9D,MAAM,EAAE,GAAG,EAAE;QACX,MAAM,KAAK,GAAG,cAAc,EAAE,CAAC;QAC/B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,OAAO,MAAM,CAAC,GAAG,CACf,IAAI,aAAa,CACf,qEAAqE,CACtE,CACF,CAAC;QACJ,CAAC;QACD,OAAO,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC;IACD,WAAW,EAAE,oCAAoC;IACjD,IAAI,EAAE,EAAE,QAAQ,EAAE,gBAAgB,EAAE;IACpC,IAAI,EAAE,GAAgB,EAAE,CAAC,CAAC;QACxB,QAAQ,EAAE,EAAE;QACZ,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;KACrB,CAAC;CACH,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAS7B,mDAAmD;AACnD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,OAAO,GAAG,SAAS,GAAG,SAAS,GAAG,YAAY,GAAG,SAAS,CAAC;IAC5E,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,+DAA+D;AAC/D,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,WAAW,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAClD,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;CACzB;AAsND;;;;GAIG;AACH,eAAO,MAAM,WAAW,GAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAC7C,QAAQ,CAAC,EACT,QAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,UAAU;IAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAA;CAAE,KAC9D,WAkBF,CAAC"}
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAS7B,mDAAmD;AACnD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,OAAO,GAAG,SAAS,GAAG,SAAS,GAAG,YAAY,GAAG,SAAS,CAAC;IAC5E,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,+DAA+D;AAC/D,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,WAAW,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAClD,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;CACzB;AAoKD;;;;GAIG;AACH,eAAO,MAAM,WAAW,GAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAC7C,QAAQ,CAAC,EACT,QAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,UAAU;IAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAA;CAAE,KAC9D,WAkBF,CAAC"}
package/dist/doctor.js CHANGED
@@ -14,8 +14,6 @@ const isDefaultWrapper = (schema) => zodDef(schema)['type'] === 'default';
14
14
  const isOptionalWrapper = (schema) => zodDef(schema)['type'] === 'optional';
15
15
  /** Get the default value from a ZodDefault wrapper. */
16
16
  const getDefaultValue = (schema) => zodDef(schema)['defaultValue'];
17
- const BOOL_TRUE = new Set(['true', '1']);
18
- const BOOL_FALSE = new Set(['false', '0']);
19
17
  /** Set a value at a dot-separated path, creating intermediate objects. */
20
18
  const setAtPath = (obj, path, value) => {
21
19
  const parts = path.split('.');
@@ -32,47 +30,13 @@ const setAtPath = (obj, path, value) => {
32
30
  const lastPart = parts.at(-1);
33
31
  current[lastPart] = value;
34
32
  };
35
- const resolveBaseTypeName = (schema) => zodDef(unwrapToBase(schema))['type'];
36
- const coerceEnvValue = (raw, schema) => {
37
- switch (resolveBaseTypeName(schema)) {
38
- case 'number':
39
- return Number(raw);
40
- case 'boolean':
41
- if (BOOL_TRUE.has(raw)) {
42
- return true;
43
- }
44
- if (BOOL_FALSE.has(raw)) {
45
- return false;
46
- }
47
- return raw;
48
- default:
49
- return raw;
50
- }
51
- };
52
- const getFieldSchema = (schema, path) => {
53
- let current = schema;
54
- for (const part of path.split('.')) {
55
- if (!isZodObject(current)) {
56
- return undefined;
57
- }
58
- const shape = zodDef(unwrapToBase(current))['shape'];
59
- const next = shape?.[part];
60
- if (!next) {
61
- return undefined;
62
- }
63
- current = next;
64
- }
65
- return current;
66
- };
67
33
  /** Build values object with env overrides applied. */
68
34
  const applyEnvToValues = (values, schema, envVars) => {
69
35
  const meta = collectConfigMeta(schema);
70
36
  const result = structuredClone(values);
71
37
  for (const [path, fieldMeta] of meta) {
72
38
  if (fieldMeta.env && envVars[fieldMeta.env] !== undefined) {
73
- const envValue = envVars[fieldMeta.env];
74
- const fieldSchema = getFieldSchema(schema, path);
75
- setAtPath(result, path, fieldSchema ? coerceEnvValue(envValue, fieldSchema) : envValue);
39
+ setAtPath(result, path, envVars[fieldMeta.env]);
76
40
  }
77
41
  }
78
42
  return result;
@@ -1 +1 @@
1
- {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
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;AAiHD;;;;;GAKG;AACH,eAAO,MAAM,aAAa,GAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAC/C,SAAS,oBAAoB,CAAC,CAAC,CAAC,KAC/B,SAAS,eAAe,EAoC1B,CAAC"}
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 CHANGED
@@ -31,21 +31,8 @@ const buildSecretSet = (schema) => {
31
31
  }
32
32
  return result;
33
33
  };
34
- const hasPath = (obj, path) => {
35
- let current = obj;
36
- for (const part of path.split('.')) {
37
- if (typeof current !== 'object' || current === null) {
38
- return false;
39
- }
40
- if (!Object.hasOwn(current, part)) {
41
- return false;
42
- }
43
- current = current[part];
44
- }
45
- return true;
46
- };
47
34
  /** Determine which source provided the winning value for a given path. */
48
- const determineSource = (path, resolved, layers, envMap, envVars) => {
35
+ const determineSource = (path, resolved, sources, envMap, envVars) => {
49
36
  if (envVars && envMap.has(path)) {
50
37
  const envVar = envMap.get(path);
51
38
  if (envVar && envVars[envVar] !== undefined) {
@@ -53,8 +40,8 @@ const determineSource = (path, resolved, layers, envMap, envVars) => {
53
40
  }
54
41
  }
55
42
  const resolvedValue = getAtPath(resolved, path);
56
- for (const [name, values] of layers) {
57
- if (values && hasPath(values, path) && getAtPath(values, path) === resolvedValue) {
43
+ for (const [name, values] of sources) {
44
+ if (values && getAtPath(values, path) === resolvedValue) {
58
45
  return name;
59
46
  }
60
47
  }
@@ -91,14 +78,14 @@ export const explainConfig = (options) => {
91
78
  const objSchema = options.schema;
92
79
  const envMap = buildEnvMap(objSchema);
93
80
  const secretSet = buildSecretSet(objSchema);
94
- const layers = [
81
+ const sources = [
95
82
  ['local', options.local],
96
83
  ['loadout', options.loadout],
97
84
  ['base', options.base],
98
85
  ];
99
86
  const paths = collectLeafPaths(objSchema, '');
100
87
  return paths.map((path) => {
101
- const source = determineSource(path, options.resolved, layers, envMap, options.env);
88
+ const source = determineSource(path, options.resolved, sources, envMap, options.env);
102
89
  const envVarName = envMap.get(path);
103
90
  const isSecret = secretSet.has(path) ||
104
91
  (envVarName !== undefined && isLikelySecret(envVarName));
@@ -1 +1 @@
1
- {"version":3,"file":"explain.js","sourceRoot":"","sources":["../src/explain.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"explain.js","sourceRoot":"","sources":["../src/explain.ts"],"names":[],"mappings":"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"}
@@ -28,7 +28,7 @@ export declare const secret: <T extends z.ZodType>(schema: T) => T;
28
28
  * standard key. We set `deprecated: true` so Zod-native tooling (schema
29
29
  * serializers, OpenAPI generators) recognises the field as deprecated, and store
30
30
  * the human-readable message under `deprecationMessage` for our own
31
- * `collectConfigMeta` / survey / explain surfaces.
31
+ * `collectConfigMeta` / survey / explain trailheads.
32
32
  *
33
33
  * Must be called BEFORE `.default()`, `.optional()`, or other transforms
34
34
  * so that the metadata lives on the inner type where `collectConfigMeta`
@@ -21,7 +21,7 @@ export const secret = (schema) => schema.meta({ ...schema.meta(), secret: true }
21
21
  * standard key. We set `deprecated: true` so Zod-native tooling (schema
22
22
  * serializers, OpenAPI generators) recognises the field as deprecated, and store
23
23
  * the human-readable message under `deprecationMessage` for our own
24
- * `collectConfigMeta` / survey / explain surfaces.
24
+ * `collectConfigMeta` / survey / explain trailheads.
25
25
  *
26
26
  * Must be called BEFORE `.default()`, `.optional()`, or other transforms
27
27
  * so that the metadata lives on the inner type where `collectConfigMeta`
@@ -1 +1 @@
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;AAoM7B,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
+ {"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"}
@@ -63,31 +63,33 @@ const buildJsonObject = (schema) => {
63
63
  return obj;
64
64
  };
65
65
  const formatJson = (schema) => `${JSON.stringify(buildJsonObject(schema), null, 2)}\n`;
66
- /** Render a single JSONC entry (comments + key: value). */
67
- const renderJsoncEntry = (key, fieldSchema, isLast, lines, indent) => {
68
- pushComments(lines, fieldComments(fieldSchema, '//'), indent);
69
- const comma = isLast ? '' : ',';
66
+ /** Serialize a nested object field for JSONC output. */
67
+ const serializeJsoncObject = (fieldSchema) => {
70
68
  const nested = getObjectShape(fieldSchema);
71
- if (nested) {
72
- lines.push(`${indent}"${key}": {`);
73
- renderJsoncFields(nested, lines, `${indent} `);
74
- lines.push(`${indent}}${comma}`);
75
- return;
69
+ if (!nested) {
70
+ return undefined;
76
71
  }
77
- const val = formatValue(fieldValue(fieldSchema));
78
- lines.push(`${indent}"${key}": ${val}${comma}`);
72
+ const inner = unwrap(fieldSchema);
73
+ return JSON.stringify(buildJsonObject(inner), null, 2).replaceAll('\n', '\n ');
79
74
  };
80
- const renderJsoncFields = (shape, lines, indent) => {
81
- const keys = Object.keys(shape);
82
- for (let i = 0; i < keys.length; i += 1) {
83
- const key = keys[i];
84
- renderJsoncEntry(key, shape[key], i === keys.length - 1, lines, indent);
85
- }
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}`);
86
84
  };
87
85
  const formatJsonc = (schema) => {
86
+ const keys = Object.keys(schema.shape);
88
87
  const shape = schema.shape;
89
88
  const lines = ['{'];
90
- renderJsoncFields(shape, 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
+ }
91
93
  lines.push('}');
92
94
  return `${lines.join('\n')}\n`;
93
95
  };