@ontrails/config 1.0.0-beta.13 → 1.0.0-beta.15
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.
- package/.turbo/turbo-lint.log +1 -1
- package/CHANGELOG.md +18 -0
- package/README.md +204 -0
- package/dist/app-config.d.ts +4 -4
- package/dist/app-config.d.ts.map +1 -1
- package/dist/app-config.js +12 -7
- package/dist/app-config.js.map +1 -1
- package/dist/compose.d.ts +11 -11
- package/dist/compose.d.ts.map +1 -1
- package/dist/compose.js +7 -7
- package/dist/compose.js.map +1 -1
- package/dist/config-layer.d.ts +3 -3
- package/dist/config-resource.d.ts +3 -0
- package/dist/config-resource.d.ts.map +1 -0
- package/dist/{config-service.js → config-resource.js} +7 -7
- package/dist/config-resource.js.map +1 -0
- package/dist/define-config.d.ts +9 -9
- package/dist/define-config.d.ts.map +1 -1
- package/dist/define-config.js +9 -12
- package/dist/define-config.js.map +1 -1
- package/dist/{generate → derive}/env.d.ts +1 -1
- package/dist/derive/env.d.ts.map +1 -0
- package/dist/{generate → derive}/env.js +3 -3
- package/dist/derive/env.js.map +1 -0
- package/dist/{generate → derive}/example.d.ts +1 -1
- package/dist/derive/example.d.ts.map +1 -0
- package/dist/{generate → derive}/example.js +21 -19
- package/dist/derive/example.js.map +1 -0
- package/dist/{generate → derive}/helpers.d.ts +1 -1
- package/dist/derive/helpers.d.ts.map +1 -0
- package/dist/{generate → derive}/helpers.js +2 -2
- package/dist/derive/helpers.js.map +1 -0
- package/dist/derive/index.d.ts +4 -0
- package/dist/derive/index.d.ts.map +1 -0
- package/dist/derive/index.js +4 -0
- package/dist/derive/index.js.map +1 -0
- package/dist/{generate → derive}/json-schema.d.ts +1 -1
- package/dist/derive/json-schema.d.ts.map +1 -0
- package/dist/{generate → derive}/json-schema.js +1 -1
- package/dist/derive/json-schema.js.map +1 -0
- package/dist/{describe.d.ts → derive-fields.d.ts} +2 -2
- package/dist/derive-fields.d.ts.map +1 -0
- package/dist/{describe.js → derive-fields.js} +2 -2
- package/dist/derive-fields.js.map +1 -0
- package/dist/{explain.d.ts → derive-provenance.d.ts} +5 -5
- package/dist/derive-provenance.d.ts.map +1 -0
- package/dist/{explain.js → derive-provenance.js} +8 -21
- package/dist/derive-provenance.js.map +1 -0
- package/dist/doctor.d.ts.map +1 -1
- package/dist/doctor.js +1 -37
- package/dist/doctor.js.map +1 -1
- package/dist/extensions.d.ts +1 -1
- package/dist/extensions.js +1 -1
- package/dist/index.d.ts +7 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -7
- package/dist/index.js.map +1 -1
- package/dist/ref.d.ts +8 -3
- package/dist/ref.d.ts.map +1 -1
- package/dist/ref.js +8 -3
- package/dist/ref.js.map +1 -1
- package/dist/registry.d.ts +2 -2
- package/dist/resolve.d.ts +6 -6
- package/dist/resolve.d.ts.map +1 -1
- package/dist/resolve.js +11 -8
- package/dist/resolve.js.map +1 -1
- package/dist/trails/config-check.d.ts +1 -1
- package/dist/trails/config-check.d.ts.map +1 -1
- package/dist/trails/config-check.js +12 -12
- package/dist/trails/config-check.js.map +1 -1
- package/dist/trails/config-describe.d.ts +1 -1
- package/dist/trails/config-describe.d.ts.map +1 -1
- package/dist/trails/config-describe.js +9 -9
- package/dist/trails/config-describe.js.map +1 -1
- package/dist/trails/config-explain.d.ts +1 -1
- package/dist/trails/config-explain.d.ts.map +1 -1
- package/dist/trails/config-explain.js +15 -15
- package/dist/trails/config-explain.js.map +1 -1
- package/dist/trails/config-init.d.ts +1 -1
- package/dist/trails/config-init.d.ts.map +1 -1
- package/dist/trails/config-init.js +16 -16
- package/dist/trails/config-init.js.map +1 -1
- package/dist/workspace.d.ts.map +1 -1
- package/dist/workspace.js +5 -0
- package/dist/workspace.js.map +1 -1
- package/package.json +2 -2
- package/src/__tests__/app-config.test.ts +19 -6
- package/src/__tests__/compose.test.ts +15 -15
- package/src/__tests__/config-check.test.ts +7 -7
- package/src/__tests__/config-describe.test.ts +7 -7
- package/src/__tests__/config-explain.test.ts +7 -7
- package/src/__tests__/config-init.test.ts +7 -7
- package/src/__tests__/{config-provision.test.ts → config-resource.test.ts} +12 -12
- package/src/__tests__/define-config.test.ts +24 -18
- package/src/__tests__/{describe.test.ts → derive-fields.test.ts} +11 -11
- package/src/__tests__/{explain.test.ts → derive-provenance.test.ts} +18 -18
- package/src/__tests__/{generate.test.ts → derive.test.ts} +30 -30
- package/src/__tests__/resolve.test.ts +31 -31
- package/src/app-config.ts +23 -12
- package/src/compose.ts +16 -22
- package/src/{config-provision.ts → config-resource.ts} +5 -5
- package/src/define-config.ts +12 -15
- package/src/{generate → derive}/env.ts +3 -3
- package/src/{generate → derive}/example.ts +1 -1
- package/src/{generate → derive}/helpers.ts +1 -1
- package/src/derive/index.ts +3 -0
- package/src/{generate → derive}/json-schema.ts +1 -1
- package/src/{describe.ts → derive-fields.ts} +1 -1
- package/src/{explain.ts → derive-provenance.ts} +6 -6
- package/src/index.ts +12 -18
- package/src/registry.ts +2 -2
- package/src/resolve.ts +13 -13
- package/src/trails/config-check.ts +3 -3
- package/src/trails/config-describe.ts +5 -5
- package/src/trails/config-explain.ts +13 -13
- package/src/trails/config-init.ts +10 -10
- package/src/workspace.ts +5 -0
- package/tsconfig.tests.json +10 -0
- package/tsconfig.tsbuildinfo +1 -1
- package/dist/config-service.d.ts +0 -3
- package/dist/config-service.d.ts.map +0 -1
- package/dist/config-service.js.map +0 -1
- package/dist/describe.d.ts.map +0 -1
- package/dist/describe.js.map +0 -1
- package/dist/explain.d.ts.map +0 -1
- package/dist/explain.js.map +0 -1
- package/dist/generate/env.d.ts.map +0 -1
- package/dist/generate/env.js.map +0 -1
- package/dist/generate/example.d.ts.map +0 -1
- package/dist/generate/example.js.map +0 -1
- package/dist/generate/helpers.d.ts.map +0 -1
- package/dist/generate/helpers.js.map +0 -1
- package/dist/generate/index.d.ts +0 -4
- package/dist/generate/index.d.ts.map +0 -1
- package/dist/generate/index.js +0 -4
- package/dist/generate/index.js.map +0 -1
- package/dist/generate/json-schema.d.ts.map +0 -1
- package/dist/generate/json-schema.js.map +0 -1
- package/src/__tests__/config-gate.test.ts +0 -53
- package/src/config-gate.ts +0 -15
- package/src/generate/index.ts +0 -3
package/.turbo/turbo-lint.log
CHANGED
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,23 @@
|
|
|
1
1
|
# @ontrails/config
|
|
2
2
|
|
|
3
|
+
## 1.0.0-beta.15
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Updated dependencies [4ad6b25]
|
|
8
|
+
- @ontrails/core@1.0.0-beta.15
|
|
9
|
+
|
|
10
|
+
## 1.0.0-beta.14
|
|
11
|
+
|
|
12
|
+
### Minor Changes
|
|
13
|
+
|
|
14
|
+
- 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.
|
|
15
|
+
|
|
16
|
+
### Patch Changes
|
|
17
|
+
|
|
18
|
+
- Updated dependencies [69057e9]
|
|
19
|
+
- @ontrails/core@1.0.0-beta.14
|
|
20
|
+
|
|
3
21
|
## 1.0.0-beta.13
|
|
4
22
|
|
|
5
23
|
### Minor Changes
|
package/README.md
ADDED
|
@@ -0,0 +1,204 @@
|
|
|
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, and `configResource` exposes resolved values to trail execution.
|
|
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
|
+
profiles: {
|
|
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
|
+
profile: 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
|
+
profile: process.env.TRAILS_ENV,
|
|
60
|
+
env: process.env,
|
|
61
|
+
});
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### 3. Access resolved config in trails
|
|
65
|
+
|
|
66
|
+
```typescript
|
|
67
|
+
import { configResource } from '@ontrails/config';
|
|
68
|
+
|
|
69
|
+
export const getStatus = trail('status.get', {
|
|
70
|
+
resources: [configResource],
|
|
71
|
+
blaze: (_input, ctx) => {
|
|
72
|
+
const state = configResource.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 → profile → local → env
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
Each layer overrides the previous. Environment variables always win.
|
|
90
|
+
|
|
91
|
+
`appConfig()` discovers `*.config.toml`, `*.config.json`, `*.config.jsonc`, and
|
|
92
|
+
`*.config.yaml` by default, plus dotfile equivalents when `dotfile: true`.
|
|
93
|
+
|
|
94
|
+
## Extensions
|
|
95
|
+
|
|
96
|
+
### `env()`
|
|
97
|
+
|
|
98
|
+
Bind a schema field to an environment variable:
|
|
99
|
+
|
|
100
|
+
```typescript
|
|
101
|
+
import { env } from '@ontrails/config';
|
|
102
|
+
|
|
103
|
+
const schema = z.object({
|
|
104
|
+
database: env(z.string(), 'DATABASE_URL'),
|
|
105
|
+
port: env(z.number(), 'PORT').default(3000),
|
|
106
|
+
});
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
Environment variables are coerced to the schema type. Apply `env()` before `.default()` so metadata lives on the inner type.
|
|
110
|
+
|
|
111
|
+
### `secret()`
|
|
112
|
+
|
|
113
|
+
Mark a schema field as sensitive:
|
|
114
|
+
|
|
115
|
+
```typescript
|
|
116
|
+
import { secret } from '@ontrails/config';
|
|
117
|
+
|
|
118
|
+
const schema = z.object({
|
|
119
|
+
apiKey: secret(z.string()),
|
|
120
|
+
password: secret(env(z.string(), 'DB_PASSWORD')),
|
|
121
|
+
});
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
Secret fields are redacted in explain output, diagnostics, and logs.
|
|
125
|
+
|
|
126
|
+
### `deprecated()`
|
|
127
|
+
|
|
128
|
+
Mark a field as deprecated with migration guidance:
|
|
129
|
+
|
|
130
|
+
```typescript
|
|
131
|
+
import { deprecated } from '@ontrails/config';
|
|
132
|
+
|
|
133
|
+
const schema = z.object({
|
|
134
|
+
oldField: deprecated(z.string(), 'Use newField instead'),
|
|
135
|
+
newField: z.string(),
|
|
136
|
+
});
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
## The resource
|
|
140
|
+
|
|
141
|
+
The config resource manages resolved config lifecycle:
|
|
142
|
+
|
|
143
|
+
```typescript
|
|
144
|
+
import { configResource } from '@ontrails/config';
|
|
145
|
+
|
|
146
|
+
export const myTrail = trail('my.trail', {
|
|
147
|
+
resources: [configResource],
|
|
148
|
+
blaze: (_input, ctx) => {
|
|
149
|
+
const state = configResource.from(ctx);
|
|
150
|
+
return Result.ok(state.resolved);
|
|
151
|
+
},
|
|
152
|
+
});
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
## Trail definitions
|
|
156
|
+
|
|
157
|
+
### `config.check`
|
|
158
|
+
|
|
159
|
+
Validate config values against the schema. Returns diagnostics with field-level status (valid, missing, invalid, deprecated, default).
|
|
160
|
+
|
|
161
|
+
### `config.describe`
|
|
162
|
+
|
|
163
|
+
Describe all fields in the schema — paths, types, defaults, env bindings, secret markers, deprecation messages.
|
|
164
|
+
|
|
165
|
+
### `config.explain`
|
|
166
|
+
|
|
167
|
+
Show which source won for each config field — defaults, base, profile, local, or env.
|
|
168
|
+
|
|
169
|
+
### `config.init`
|
|
170
|
+
|
|
171
|
+
Generate example config files in TOML, JSON, JSONC, or YAML. Optionally writes `.env.example` and `.schema.json`.
|
|
172
|
+
|
|
173
|
+
## Testing
|
|
174
|
+
|
|
175
|
+
Trails that depend on `configResource` auto-resolve with a mock when registered in the topo:
|
|
176
|
+
|
|
177
|
+
```typescript
|
|
178
|
+
import { testAll } from '@ontrails/testing';
|
|
179
|
+
|
|
180
|
+
const results = testAll(graph);
|
|
181
|
+
// configResource.mock() is called automatically
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
For explicit test setup:
|
|
185
|
+
|
|
186
|
+
```typescript
|
|
187
|
+
import { registerConfigState, clearConfigState } from '@ontrails/config';
|
|
188
|
+
|
|
189
|
+
afterEach(() => clearConfigState());
|
|
190
|
+
|
|
191
|
+
test('config trail', async () => {
|
|
192
|
+
registerConfigState({
|
|
193
|
+
resolved: { port: 3000 },
|
|
194
|
+
schema: z.object({ port: z.number() }),
|
|
195
|
+
});
|
|
196
|
+
// ...
|
|
197
|
+
});
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
## Installation
|
|
201
|
+
|
|
202
|
+
```bash
|
|
203
|
+
bun add @ontrails/config @ontrails/core zod
|
|
204
|
+
```
|
package/dist/app-config.d.ts
CHANGED
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
import { Result } from '@ontrails/core';
|
|
5
5
|
import type { z } from 'zod';
|
|
6
6
|
import type { CheckResult } from './doctor.js';
|
|
7
|
-
import type { FieldDescription } from './
|
|
8
|
-
import type {
|
|
7
|
+
import type { FieldDescription } from './derive-fields.js';
|
|
8
|
+
import type { DeriveConfigProvenanceOptions, ProvenanceEntry } from './derive-provenance.js';
|
|
9
9
|
import type { ConfigRef } from './ref.js';
|
|
10
10
|
/** Supported config file formats. */
|
|
11
11
|
export type ConfigFormat = 'toml' | 'json' | 'jsonc' | 'yaml';
|
|
@@ -23,7 +23,7 @@ export interface ResolveOptions {
|
|
|
23
23
|
readonly path?: string;
|
|
24
24
|
}
|
|
25
25
|
/** Options for the `explain()` method on AppConfig, excluding schema. */
|
|
26
|
-
export type
|
|
26
|
+
export type AppConfigDeriveProvenanceOptions = Omit<DeriveConfigProvenanceOptions<z.ZodType>, 'schema'>;
|
|
27
27
|
/** The resolved config contract returned by `appConfig()`. */
|
|
28
28
|
export interface AppConfig<T extends z.ZodType> {
|
|
29
29
|
readonly name: string;
|
|
@@ -38,7 +38,7 @@ export interface AppConfig<T extends z.ZodType> {
|
|
|
38
38
|
readonly env?: Record<string, string | undefined>;
|
|
39
39
|
}): CheckResult;
|
|
40
40
|
/** Show which source won for each config field. */
|
|
41
|
-
explain(options:
|
|
41
|
+
explain(options: AppConfigDeriveProvenanceOptions): readonly ProvenanceEntry[];
|
|
42
42
|
/** Create a lazy reference to a config field for use as a trail input default. */
|
|
43
43
|
ref(fieldPath: string): ConfigRef;
|
|
44
44
|
}
|
package/dist/app-config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app-config.d.ts","sourceRoot":"","sources":["../src/app-config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAiB,MAAM,EAAmB,MAAM,gBAAgB,CAAC;AACxE,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAE7B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"app-config.d.ts","sourceRoot":"","sources":["../src/app-config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAiB,MAAM,EAAmB,MAAM,gBAAgB,CAAC;AACxE,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAE7B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,OAAO,KAAK,EACV,6BAA6B,EAC7B,eAAe,EAChB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAO1C,qCAAqC;AACrC,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;AAE9D,0CAA0C;AAC1C,MAAM,WAAW,gBAAgB,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO;IACnD,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IACnB,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,YAAY,EAAE,CAAC;IAC3C,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,mEAAmE;AACnE,MAAM,WAAW,cAAc;IAC7B,oEAAoE;IACpE,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,0DAA0D;IAC1D,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,yEAAyE;AACzE,MAAM,MAAM,gCAAgC,GAAG,IAAI,CACjD,6BAA6B,CAAC,CAAC,CAAC,OAAO,CAAC,EACxC,QAAQ,CACT,CAAC;AAEF,8DAA8D;AAC9D,MAAM,WAAW,SAAS,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO;IAC5C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IACnB,QAAQ,CAAC,OAAO,EAAE,SAAS,YAAY,EAAE,CAAC;IAC1C,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,OAAO,CAAC,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;IAEtE,gEAAgE;IAChE,QAAQ,IAAI,SAAS,gBAAgB,EAAE,CAAC;IAExC,uEAAuE;IACvE,KAAK,CACH,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAA;KAAE,GAC9D,WAAW,CAAC;IAEf,mDAAmD;IACnD,OAAO,CACL,OAAO,EAAE,gCAAgC,GACxC,SAAS,eAAe,EAAE,CAAC;IAE9B,kFAAkF;IAClF,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;CACnC;AAwMD;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,SAAS,GAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAC3C,MAAM,MAAM,EACZ,SAAS,gBAAgB,CAAC,CAAC,CAAC,KAC3B,SAAS,CAAC,CAAC,CAsBb,CAAC"}
|
package/dist/app-config.js
CHANGED
|
@@ -4,13 +4,18 @@
|
|
|
4
4
|
import { dirname, join } from 'node:path';
|
|
5
5
|
import { NotFoundError, Result, ValidationError } from '@ontrails/core';
|
|
6
6
|
import { checkConfig } from './doctor.js';
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
7
|
+
import { deriveConfigFields } from './derive-fields.js';
|
|
8
|
+
import { deriveConfigProvenance } from './derive-provenance.js';
|
|
9
9
|
import { configRef } from './ref.js';
|
|
10
10
|
// ---------------------------------------------------------------------------
|
|
11
11
|
// Default values
|
|
12
12
|
// ---------------------------------------------------------------------------
|
|
13
|
-
const DEFAULT_FORMATS = [
|
|
13
|
+
const DEFAULT_FORMATS = [
|
|
14
|
+
'toml',
|
|
15
|
+
'json',
|
|
16
|
+
'jsonc',
|
|
17
|
+
'yaml',
|
|
18
|
+
];
|
|
14
19
|
// ---------------------------------------------------------------------------
|
|
15
20
|
// Internal helpers (defined before consumers — no-use-before-define)
|
|
16
21
|
// ---------------------------------------------------------------------------
|
|
@@ -117,7 +122,7 @@ const discoverConfigFile = async (name, formats, dotfile, startDir) => {
|
|
|
117
122
|
return undefined;
|
|
118
123
|
};
|
|
119
124
|
/** Resolve a config file — either from an explicit path or via discovery. */
|
|
120
|
-
const
|
|
125
|
+
const resolveAppConfigFile = async (name, schema, formats, dotfile, options) => {
|
|
121
126
|
const filePath = options?.path ??
|
|
122
127
|
(await discoverConfigFile(name, formats, dotfile, options?.cwd ?? process.cwd()));
|
|
123
128
|
if (filePath === undefined) {
|
|
@@ -159,13 +164,13 @@ export const appConfig = (name, options) => {
|
|
|
159
164
|
const { schema } = options;
|
|
160
165
|
return {
|
|
161
166
|
check: (values, checkOpts) => checkConfig(schema, values, checkOpts),
|
|
162
|
-
describe: () =>
|
|
167
|
+
describe: () => deriveConfigFields(schema),
|
|
163
168
|
dotfile,
|
|
164
|
-
explain: (explainOpts) =>
|
|
169
|
+
explain: (explainOpts) => deriveConfigProvenance({ ...explainOpts, schema }),
|
|
165
170
|
formats,
|
|
166
171
|
name,
|
|
167
172
|
ref: (fieldPath) => configRef(fieldPath),
|
|
168
|
-
resolve: (resolveOptions) =>
|
|
173
|
+
resolve: (resolveOptions) => resolveAppConfigFile(name, schema, formats, dotfile, resolveOptions),
|
|
169
174
|
schema,
|
|
170
175
|
};
|
|
171
176
|
};
|
package/dist/app-config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app-config.js","sourceRoot":"","sources":["../src/app-config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAE1C,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAIxE,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"app-config.js","sourceRoot":"","sources":["../src/app-config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAE1C,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAIxE,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAKxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAEhE,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAwDrC,8EAA8E;AAC9E,iBAAiB;AACjB,8EAA8E;AAE9E,MAAM,eAAe,GAA4B;IAC/C,MAAM;IACN,MAAM;IACN,OAAO;IACP,MAAM;CACP,CAAC;AAEF,8EAA8E;AAC9E,qEAAqE;AACrE,8EAA8E;AAE9E,oDAAoD;AACpD,MAAM,cAAc,GAAG,CACrB,IAAY,EACZ,MAAoB,EACpB,OAAgB,EACR,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,MAAM,MAAM,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,WAAW,MAAM,EAAE,CAAC,CAAC;AAE7E,qDAAqD;AACrD,MAAM,UAAU,GAAG,CAAC,QAAgB,EAAoB,EAAE,CACxD,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,CAAC;AAE9B,yEAAyE;AACzE,MAAM,eAAe,GAA4C;IAC/D,CAAC,OAAO,EAAE,QAAQ,CAAC;IACnB,CAAC,MAAM,EAAE,OAAO,CAAC;IACjB,CAAC,MAAM,EAAE,OAAO,CAAC;IACjB,CAAC,MAAM,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,0DAA0D;AAC1D,MAAM,YAAY,GAAG,CAAC,QAAgB,EAA4B,EAAE;IAClE,KAAK,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,eAAe,EAAE,CAAC;QAC/C,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAC9B,OAAO,MAAM,CAAC;QAChB,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AAEF,+DAA+D;AAC/D,MAAM,eAAe,GAAG,CACtB,QAAgB,EAChB,IAAY,EACY,EAAE;IAC1B,MAAM,MAAM,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;IAEtC,IAAI,CAAC;QACH,QAAQ,MAAM,EAAE,CAAC;YACf,KAAK,MAAM,CAAC,CAAC,CAAC;gBACZ,OAAO,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;YACrC,CAAC;YACD,KAAK,OAAO,CAAC,CAAC,CAAC;gBACb,OAAO,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;YAC1C,CAAC;YACD,KAAK,MAAM,CAAC,CAAC,CAAC;gBACZ,OAAO,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;YACzC,CAAC;YACD,KAAK,MAAM,CAAC,CAAC,CAAC;gBACZ,OAAO,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;YACzC,CAAC;YACD,OAAO,CAAC,CAAC,CAAC;gBACR,OAAO,MAAM,CAAC,GAAG,CACf,IAAI,eAAe,CAAC,mCAAmC,QAAQ,EAAE,EAAE;oBACjE,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;iBAC5B,CAAC,CACH,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,MAAM,CAAC,GAAG,CACf,IAAI,eAAe,CAAC,gCAAgC,QAAQ,EAAE,EAAE;YAC9D,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAChE,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;SAC5B,CAAC,CACH,CAAC;IACJ,CAAC;AACH,CAAC,CAAC;AAEF,kFAAkF;AAClF,MAAM,cAAc,GAAG,KAAK,EAC1B,QAAgB,EACiB,EAAE;IACnC,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,QAAQ,CAAC,CAAC;IAC1C,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,MAAM,CAAC,GAAG,CACf,IAAI,aAAa,CAAC,0BAA0B,QAAQ,EAAE,EAAE;YACtD,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;SAC5B,CAAC,CACH,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;IAC7C,OAAO,eAAe,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;AACzC,CAAC,CAAC;AAEF,iDAAiD;AACjD,MAAM,cAAc,GAAG,CACrB,MAAS,EACT,IAAa,EACb,QAAgB,EACW,EAAE;IAC7B,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACtC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,OAAO,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAkB,CAAC,CAAC;IAC9C,CAAC;IACD,OAAO,MAAM,CAAC,GAAG,CACf,IAAI,eAAe,CAAC,6BAA6B,QAAQ,EAAE,EAAE;QAC3D,OAAO,EAAE;YACP,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM;YAC3B,IAAI,EAAE,QAAQ;SACf;KACF,CAAC,CACH,CAAC;AACJ,CAAC,CAAC;AAEF,yDAAyD;AACzD,MAAM,SAAS,GAAG,KAAK,EACrB,GAAW,EACX,IAAY,EACZ,OAAgC,EAChC,OAAgB,EACa,EAAE;IAC/B,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;QACnE,IAAI,MAAM,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAChC,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AAEF,wEAAwE;AACxE,MAAM,kBAAkB,GAAG,KAAK,EAC9B,IAAY,EACZ,OAAgC,EAChC,OAAgB,EAChB,QAAgB,EACa,EAAE;IAC/B,IAAI,GAAG,GAAG,QAAQ,CAAC;IAEnB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,EAAE,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QAC3C,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAC3D,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QAC5B,0BAA0B;QAC1B,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;YACnB,MAAM;QACR,CAAC;QACD,GAAG,GAAG,MAAM,CAAC;IACf,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AAEF,6EAA6E;AAC7E,MAAM,oBAAoB,GAAG,KAAK,EAChC,IAAY,EACZ,MAAS,EACT,OAAgC,EAChC,OAAgB,EAChB,OAAwB,EACY,EAAE;IACtC,MAAM,QAAQ,GACZ,OAAO,EAAE,IAAI;QACb,CAAC,MAAM,kBAAkB,CACvB,IAAI,EACJ,OAAO,EACP,OAAO,EACP,OAAO,EAAE,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAC9B,CAAC,CAAC;IAEL,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,OAAO,MAAM,CAAC,GAAG,CACf,IAAI,aAAa,CAAC,6BAA6B,IAAI,GAAG,EAAE;YACtD,OAAO,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC,EAAE,IAAI,EAAE;SAClD,CAAC,CACH,CAAC;IACJ,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC;IAClD,IAAI,UAAU,CAAC,KAAK,EAAE,EAAE,CAAC;QACvB,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,OAAO,cAAc,CAAC,MAAM,EAAE,UAAU,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;AAC5D,CAAC,CAAC;AAEF,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,CACvB,IAAY,EACZ,OAA4B,EACd,EAAE;IAChB,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,eAAe,CAAC;IACnD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,KAAK,CAAC;IAEzC,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAE3B,OAAO;QACL,KAAK,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC;QACpE,QAAQ,EAAE,GAAG,EAAE,CACb,kBAAkB,CAChB,MAA2D,CAC5D;QACH,OAAO;QACP,OAAO,EAAE,CAAC,WAAW,EAAE,EAAE,CACvB,sBAAsB,CAAC,EAAE,GAAG,WAAW,EAAE,MAAM,EAAE,CAAC;QACpD,OAAO;QACP,IAAI;QACJ,GAAG,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,SAAS,CAAC;QACxC,OAAO,EAAE,CAAC,cAA+B,EAAE,EAAE,CAC3C,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,cAAc,CAAC;QACtE,MAAM;KACP,CAAC;AACJ,CAAC,CAAC"}
|
package/dist/compose.d.ts
CHANGED
|
@@ -1,26 +1,26 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Config composition utilities for
|
|
2
|
+
* Config composition utilities for resources.
|
|
3
3
|
*
|
|
4
|
-
* Collects config schemas from
|
|
4
|
+
* Collects config schemas from resource 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
|
|
9
|
-
export interface
|
|
10
|
-
readonly
|
|
8
|
+
/** A resource config schema entry extracted from a resource declaration. */
|
|
9
|
+
export interface ResourceConfigEntry {
|
|
10
|
+
readonly resourceId: string;
|
|
11
11
|
readonly schema: z.ZodType;
|
|
12
12
|
}
|
|
13
|
-
/** Minimal shape needed to extract config from a
|
|
14
|
-
interface
|
|
13
|
+
/** Minimal shape needed to extract config from a resource-like object. */
|
|
14
|
+
interface ResourceWithOptionalConfig {
|
|
15
15
|
readonly id: string;
|
|
16
16
|
readonly config?: z.ZodType | undefined;
|
|
17
17
|
}
|
|
18
18
|
/**
|
|
19
|
-
* Collect config schemas from
|
|
19
|
+
* Collect config schemas from resources that declare them.
|
|
20
20
|
*
|
|
21
|
-
* Returns entries keyed by
|
|
22
|
-
*
|
|
21
|
+
* Returns entries keyed by resource ID for composition into `defineConfig`.
|
|
22
|
+
* Resources without a `config` schema are excluded.
|
|
23
23
|
*/
|
|
24
|
-
export declare const
|
|
24
|
+
export declare const collectResourceConfigs: (resources: readonly ResourceWithOptionalConfig[]) => ResourceConfigEntry[];
|
|
25
25
|
export {};
|
|
26
26
|
//# sourceMappingURL=compose.d.ts.map
|
package/dist/compose.d.ts.map
CHANGED
|
@@ -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,
|
|
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,4EAA4E;AAC5E,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC;CAC5B;AAED,0EAA0E;AAC1E,UAAU,0BAA0B;IAClC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,OAAO,GAAG,SAAS,CAAC;CACzC;AAMD;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB,GACjC,WAAW,SAAS,0BAA0B,EAAE,KAC/C,mBAAmB,EAQyC,CAAC"}
|
package/dist/compose.js
CHANGED
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Config composition utilities for
|
|
2
|
+
* Config composition utilities for resources.
|
|
3
3
|
*
|
|
4
|
-
* Collects config schemas from
|
|
4
|
+
* Collects config schemas from resource 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
|
|
11
|
+
* Collect config schemas from resources that declare them.
|
|
12
12
|
*
|
|
13
|
-
* Returns entries keyed by
|
|
14
|
-
*
|
|
13
|
+
* Returns entries keyed by resource ID for composition into `defineConfig`.
|
|
14
|
+
* Resources without a `config` schema are excluded.
|
|
15
15
|
*/
|
|
16
|
-
export const
|
|
16
|
+
export const collectResourceConfigs = (resources) => resources
|
|
17
17
|
.filter((svc) => svc.config !== undefined)
|
|
18
|
-
.map((svc) => ({
|
|
18
|
+
.map((svc) => ({ resourceId: svc.id, schema: svc.config }));
|
|
19
19
|
//# sourceMappingURL=compose.js.map
|
package/dist/compose.js.map
CHANGED
|
@@ -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,
|
|
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,sBAAsB,GAAG,CACpC,SAAgD,EACzB,EAAE,CACzB,SAAS;KACN,MAAM,CACL,CACE,GAAG,EACiE,EAAE,CACtE,GAAG,CAAC,MAAM,KAAK,SAAS,CAC3B;KACA,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC"}
|
package/dist/config-layer.d.ts
CHANGED
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
* Config layer — attaches resolved config to the execution context.
|
|
3
3
|
*
|
|
4
4
|
* For v1, the layer is a pass-through: config resolution happens at
|
|
5
|
-
* bootstrap time and the
|
|
6
|
-
* config before any trail runs. The layer reserves a named slot so
|
|
7
|
-
*
|
|
5
|
+
* bootstrap time and the resource pipeline (TRL-91) injects the resolved
|
|
6
|
+
* config before any trail runs. The layer reserves a named slot so future
|
|
7
|
+
* versions can add per-trail config overrides or validation.
|
|
8
8
|
*/
|
|
9
9
|
import type { Layer } from '@ontrails/core';
|
|
10
10
|
export declare const configLayer: Layer;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-resource.d.ts","sourceRoot":"","sources":["../src/config-resource.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAGjD,eAAO,MAAM,cAAc,gDAkBzB,CAAC"}
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Config
|
|
2
|
+
* Config resource — manages resolved config lifecycle.
|
|
3
3
|
*
|
|
4
4
|
* The config is resolved during bootstrap (two-phase init per ADR-010)
|
|
5
|
-
* and registered via `registerConfigState`. This
|
|
6
|
-
* global registry so trails can access it through `
|
|
5
|
+
* and registered via `registerConfigState`. This resource reads from the
|
|
6
|
+
* global registry so trails can access it through `configResource.from(ctx)`.
|
|
7
7
|
*/
|
|
8
|
-
import { InternalError, Result,
|
|
8
|
+
import { InternalError, Result, resource } from '@ontrails/core';
|
|
9
9
|
import { z } from 'zod';
|
|
10
10
|
import { getConfigState } from './registry.js';
|
|
11
|
-
export const
|
|
11
|
+
export const configResource = resource('config', {
|
|
12
12
|
create: () => {
|
|
13
13
|
const state = getConfigState();
|
|
14
14
|
if (state === undefined) {
|
|
@@ -17,10 +17,10 @@ export const configService = service('config', {
|
|
|
17
17
|
return Result.ok(state);
|
|
18
18
|
},
|
|
19
19
|
description: 'Resolved application configuration',
|
|
20
|
-
|
|
20
|
+
meta: { category: 'infrastructure' },
|
|
21
21
|
mock: () => ({
|
|
22
22
|
resolved: {},
|
|
23
23
|
schema: z.object({}),
|
|
24
24
|
}),
|
|
25
25
|
});
|
|
26
|
-
//# sourceMappingURL=config-
|
|
26
|
+
//# sourceMappingURL=config-resource.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-resource.js","sourceRoot":"","sources":["../src/config-resource.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AACjE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE/C,MAAM,CAAC,MAAM,cAAc,GAAG,QAAQ,CAAc,QAAQ,EAAE;IAC5D,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"}
|
package/dist/define-config.d.ts
CHANGED
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Trails-specific config wrapper — `appConfig('trails', ...)` with
|
|
3
|
-
* framework conventions for
|
|
3
|
+
* framework conventions for profile selection and local overrides.
|
|
4
4
|
*/
|
|
5
5
|
import type { z } from 'zod';
|
|
6
6
|
/** Options for defining a Trails app config. */
|
|
7
7
|
export interface DefineConfigOptions<T extends z.ZodType> {
|
|
8
8
|
readonly schema: T;
|
|
9
9
|
readonly base?: Partial<z.infer<T>>;
|
|
10
|
-
readonly
|
|
10
|
+
readonly profiles?: Record<string, Partial<z.infer<T>>>;
|
|
11
11
|
/** When true, fall back to `NODE_ENV` when `TRAILS_ENV` is unset. */
|
|
12
12
|
readonly envFromNodeEnv?: boolean;
|
|
13
13
|
}
|
|
14
14
|
/** Options passed to `resolve()` on a defined config. */
|
|
15
15
|
interface DefineConfigResolveOptions {
|
|
16
|
-
readonly
|
|
16
|
+
readonly profile?: string;
|
|
17
17
|
readonly env?: Record<string, string | undefined>;
|
|
18
18
|
/** Working directory for local overrides discovery. Defaults to `process.cwd()`. */
|
|
19
19
|
readonly cwd?: string;
|
|
@@ -22,7 +22,7 @@ interface DefineConfigResolveOptions {
|
|
|
22
22
|
* Define Trails app config.
|
|
23
23
|
*
|
|
24
24
|
* This is `appConfig('trails', ...)` with the framework's own conventions:
|
|
25
|
-
* `TRAILS_ENV` selects the
|
|
25
|
+
* `TRAILS_ENV` selects the profile. When `envFromNodeEnv` is true,
|
|
26
26
|
* `NODE_ENV` is used as a fallback when `TRAILS_ENV` is unset.
|
|
27
27
|
*
|
|
28
28
|
* @example
|
|
@@ -33,7 +33,7 @@ interface DefineConfigResolveOptions {
|
|
|
33
33
|
* debug: z.boolean().default(false),
|
|
34
34
|
* }),
|
|
35
35
|
* base: { port: 8080 },
|
|
36
|
-
*
|
|
36
|
+
* profiles: {
|
|
37
37
|
* production: { debug: false },
|
|
38
38
|
* test: { debug: true, port: 0 },
|
|
39
39
|
* },
|
|
@@ -44,17 +44,17 @@ interface DefineConfigResolveOptions {
|
|
|
44
44
|
*/
|
|
45
45
|
export declare const defineConfig: <T extends z.ZodType>(options: DefineConfigOptions<T>) => {
|
|
46
46
|
base: Partial<z.core.output<T>> | undefined;
|
|
47
|
-
|
|
48
|
-
resolve: (resolveOpts?: DefineConfigResolveOptions) => Promise<import("
|
|
47
|
+
profiles: Record<string, Partial<z.core.output<T>>> | undefined;
|
|
48
|
+
resolve: (resolveOpts?: DefineConfigResolveOptions) => Promise<import("packages/core/src/result.js").Result<z.core.output<T>, Error>>;
|
|
49
49
|
schema: T;
|
|
50
50
|
name: string;
|
|
51
51
|
formats: readonly import("./app-config.js").ConfigFormat[];
|
|
52
52
|
dotfile: boolean;
|
|
53
|
-
describe(): readonly import("./
|
|
53
|
+
describe(): readonly import("./derive-fields.js").FieldDescription[];
|
|
54
54
|
check(values: Record<string, unknown>, options?: {
|
|
55
55
|
readonly env?: Record<string, string | undefined>;
|
|
56
56
|
}): import("./doctor.js").CheckResult;
|
|
57
|
-
explain(options: import("./app-config.js").
|
|
57
|
+
explain(options: import("./app-config.js").AppConfigDeriveProvenanceOptions): readonly import("./derive-provenance.js").ProvenanceEntry[];
|
|
58
58
|
ref(fieldPath: string): import("./ref.js").ConfigRef;
|
|
59
59
|
};
|
|
60
60
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"define-config.d.ts","sourceRoot":"","sources":["../src/define-config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAS7B,gDAAgD;AAChD,MAAM,WAAW,mBAAmB,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO;IACtD,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IACnB,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACpC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACxD,qEAAqE;IACrE,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC;CACnC;AAED,yDAAyD;AACzD,UAAU,0BAA0B;IAClC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IAClD,oFAAoF;IACpF,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;CACvB;AAoCD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,eAAO,MAAM,YAAY,GAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAC9C,SAAS,mBAAmB,CAAC,CAAC,CAAC;;;
|
|
1
|
+
{"version":3,"file":"define-config.d.ts","sourceRoot":"","sources":["../src/define-config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAS7B,gDAAgD;AAChD,MAAM,WAAW,mBAAmB,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO;IACtD,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IACnB,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACpC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACxD,qEAAqE;IACrE,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC;CACnC;AAED,yDAAyD;AACzD,UAAU,0BAA0B;IAClC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IAClD,oFAAoF;IACpF,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;CACvB;AAoCD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,eAAO,MAAM,YAAY,GAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAC9C,SAAS,mBAAmB,CAAC,CAAC,CAAC;;;4BAQC,0BAA0B;;;;;;;oBAnCvC,CAAC;;;;CAgErB,CAAC"}
|
package/dist/define-config.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Trails-specific config wrapper — `appConfig('trails', ...)` with
|
|
3
|
-
* framework conventions for
|
|
3
|
+
* framework conventions for profile selection and local overrides.
|
|
4
4
|
*/
|
|
5
5
|
import { existsSync } from 'node:fs';
|
|
6
6
|
import { join } from 'node:path';
|
|
7
7
|
import { appConfig } from './app-config.js';
|
|
8
|
-
import {
|
|
8
|
+
import { deriveConfig } from './resolve.js';
|
|
9
9
|
// ---------------------------------------------------------------------------
|
|
10
10
|
// Local overrides discovery
|
|
11
11
|
// ---------------------------------------------------------------------------
|
|
@@ -35,7 +35,7 @@ const discoverLocalOverrides = async (cwd, envRecord) => {
|
|
|
35
35
|
* Define Trails app config.
|
|
36
36
|
*
|
|
37
37
|
* This is `appConfig('trails', ...)` with the framework's own conventions:
|
|
38
|
-
* `TRAILS_ENV` selects the
|
|
38
|
+
* `TRAILS_ENV` selects the profile. When `envFromNodeEnv` is true,
|
|
39
39
|
* `NODE_ENV` is used as a fallback when `TRAILS_ENV` is unset.
|
|
40
40
|
*
|
|
41
41
|
* @example
|
|
@@ -46,7 +46,7 @@ const discoverLocalOverrides = async (cwd, envRecord) => {
|
|
|
46
46
|
* debug: z.boolean().default(false),
|
|
47
47
|
* }),
|
|
48
48
|
* base: { port: 8080 },
|
|
49
|
-
*
|
|
49
|
+
* profiles: {
|
|
50
50
|
* production: { debug: false },
|
|
51
51
|
* test: { debug: true, port: 0 },
|
|
52
52
|
* },
|
|
@@ -56,14 +56,11 @@ const discoverLocalOverrides = async (cwd, envRecord) => {
|
|
|
56
56
|
* ```
|
|
57
57
|
*/
|
|
58
58
|
export const defineConfig = (options) => {
|
|
59
|
-
const config = appConfig('trails', {
|
|
60
|
-
formats: ['toml', 'json'],
|
|
61
|
-
schema: options.schema,
|
|
62
|
-
});
|
|
59
|
+
const config = appConfig('trails', { schema: options.schema });
|
|
63
60
|
return {
|
|
64
61
|
...config,
|
|
65
62
|
base: options.base,
|
|
66
|
-
|
|
63
|
+
profiles: options.profiles,
|
|
67
64
|
resolve: async (resolveOpts) => {
|
|
68
65
|
const envRecord = {
|
|
69
66
|
...(resolveOpts?.env ?? process.env),
|
|
@@ -75,12 +72,12 @@ export const defineConfig = (options) => {
|
|
|
75
72
|
}
|
|
76
73
|
const cwd = resolveOpts?.cwd ?? process.cwd();
|
|
77
74
|
const localOverrides = await discoverLocalOverrides(cwd, envRecord);
|
|
78
|
-
return
|
|
75
|
+
return deriveConfig({
|
|
79
76
|
base: options.base,
|
|
80
77
|
env: envRecord,
|
|
81
|
-
loadout: resolveOpts?.loadout ?? envRecord['TRAILS_ENV'],
|
|
82
|
-
loadouts: options.loadouts,
|
|
83
78
|
localOverrides,
|
|
79
|
+
profile: resolveOpts?.profile ?? envRecord['TRAILS_ENV'],
|
|
80
|
+
profiles: options.profiles,
|
|
84
81
|
schema: options.schema,
|
|
85
82
|
});
|
|
86
83
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"define-config.js","sourceRoot":"","sources":["../src/define-config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAIjC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"define-config.js","sourceRoot":"","sources":["../src/define-config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAIjC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAuB5C,8EAA8E;AAC9E,4BAA4B;AAC5B,8EAA8E;AAE9E,MAAM,yBAAyB,GAAG,CAAC,UAAU,EAAE,UAAU,CAAU,CAAC;AAEpE;;;;GAIG;AACH,MAAM,sBAAsB,GAAG,KAAK,EAClC,GAAW,EACX,SAA6C,EACC,EAAE;IAChD,IAAI,SAAS,CAAC,YAAY,CAAC,KAAK,MAAM,EAAE,CAAC;QACvC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,KAAK,MAAM,QAAQ,IAAI,yBAAyB,EAAE,CAAC;QACjD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC3D,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC1B,MAAM,GAAG,GAA4B,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;YAC7D,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,GAAG,CAA4B,CAAC;QAC5D,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AAEF,8EAA8E;AAC9E,aAAa;AACb,8EAA8E;AAE9E;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAC1B,OAA+B,EAC/B,EAAE;IACF,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAE/D,OAAO;QACL,GAAG,MAAM;QACT,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,OAAO,EAAE,KAAK,EAAE,WAAwC,EAAE,EAAE;YAC1D,MAAM,SAAS,GAAG;gBAChB,GAAG,CAAC,WAAW,EAAE,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;aACC,CAAC;YAExC,IACE,OAAO,CAAC,cAAc;gBACtB,SAAS,CAAC,YAAY,CAAC,KAAK,SAAS;gBACrC,SAAS,CAAC,UAAU,CAAC,KAAK,SAAS,EACnC,CAAC;gBACD,SAAS,CAAC,YAAY,CAAC,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;YAClD,CAAC;YAED,MAAM,GAAG,GAAG,WAAW,EAAE,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;YAC9C,MAAM,cAAc,GAAG,MAAM,sBAAsB,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;YAEpE,OAAO,YAAY,CAAC;gBAClB,IAAI,EAAE,OAAO,CAAC,IAA2C;gBACzD,GAAG,EAAE,SAAS;gBACd,cAAc;gBACd,OAAO,EAAE,WAAW,EAAE,OAAO,IAAI,SAAS,CAAC,YAAY,CAAC;gBACxD,QAAQ,EAAE,OAAO,CAAC,QAEL;gBACb,MAAM,EAAE,OAAO,CAAC,MAAM;aACvB,CAAC,CAAC;QACL,CAAC;QACD,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -11,5 +11,5 @@ import type { z } from 'zod';
|
|
|
11
11
|
* Lists each env var with its type, default, and whether it is a secret.
|
|
12
12
|
* Returns an empty string when no env bindings are present.
|
|
13
13
|
*/
|
|
14
|
-
export declare const
|
|
14
|
+
export declare const deriveConfigEnvExample: (schema: z.ZodObject<Record<string, z.ZodType>>) => string;
|
|
15
15
|
//# sourceMappingURL=env.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/derive/env.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAsF7B;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB,GACjC,QAAQ,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,KAC7C,MAGF,CAAC"}
|