@ontrails/config 1.0.0-beta.15 → 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.
- package/CHANGELOG.md +34 -0
- package/README.md +1 -1
- package/package.json +10 -2
- package/src/define-config.ts +6 -3
- package/src/extensions.ts +1 -1
- package/src/index.ts +0 -1
- package/src/registry.ts +1 -1
- package/src/resolve.ts +4 -2
- package/.turbo/turbo-build.log +0 -1
- package/.turbo/turbo-lint.log +0 -3
- package/.turbo/turbo-typecheck.log +0 -1
- package/dist/app-config.d.ts +0 -65
- package/dist/app-config.d.ts.map +0 -1
- package/dist/app-config.js +0 -177
- package/dist/app-config.js.map +0 -1
- package/dist/collect.d.ts +0 -11
- package/dist/collect.d.ts.map +0 -1
- package/dist/collect.js +0 -81
- package/dist/collect.js.map +0 -1
- package/dist/compose.d.ts +0 -26
- package/dist/compose.d.ts.map +0 -1
- package/dist/compose.js +0 -19
- package/dist/compose.js.map +0 -1
- package/dist/config-layer.d.ts +0 -11
- package/dist/config-layer.d.ts.map +0 -1
- package/dist/config-layer.js +0 -6
- package/dist/config-layer.js.map +0 -1
- package/dist/config-resource.d.ts +0 -3
- package/dist/config-resource.d.ts.map +0 -1
- package/dist/config-resource.js +0 -26
- package/dist/config-resource.js.map +0 -1
- package/dist/define-config.d.ts +0 -61
- package/dist/define-config.d.ts.map +0 -1
- package/dist/define-config.js +0 -87
- package/dist/define-config.js.map +0 -1
- package/dist/derive/env.d.ts +0 -15
- package/dist/derive/env.d.ts.map +0 -1
- package/dist/derive/env.js +0 -65
- package/dist/derive/env.js.map +0 -1
- package/dist/derive/example.d.ts +0 -16
- package/dist/derive/example.d.ts.map +0 -1
- package/dist/derive/example.js +0 -138
- package/dist/derive/example.js.map +0 -1
- package/dist/derive/helpers.d.ts +0 -35
- package/dist/derive/helpers.d.ts.map +0 -1
- package/dist/derive/helpers.js +0 -116
- package/dist/derive/helpers.js.map +0 -1
- package/dist/derive/index.d.ts +0 -4
- package/dist/derive/index.d.ts.map +0 -1
- package/dist/derive/index.js +0 -4
- package/dist/derive/index.js.map +0 -1
- package/dist/derive/json-schema.d.ts +0 -18
- package/dist/derive/json-schema.d.ts.map +0 -1
- package/dist/derive/json-schema.js +0 -97
- package/dist/derive/json-schema.js.map +0 -1
- package/dist/derive-fields.d.ts +0 -25
- package/dist/derive-fields.d.ts.map +0 -1
- package/dist/derive-fields.js +0 -147
- package/dist/derive-fields.js.map +0 -1
- package/dist/derive-provenance.d.ts +0 -30
- package/dist/derive-provenance.d.ts.map +0 -1
- package/dist/derive-provenance.js +0 -101
- package/dist/derive-provenance.js.map +0 -1
- package/dist/doctor.d.ts +0 -27
- package/dist/doctor.d.ts.map +0 -1
- package/dist/doctor.js +0 -131
- package/dist/doctor.js.map +0 -1
- package/dist/extensions.d.ts +0 -38
- package/dist/extensions.d.ts.map +0 -1
- package/dist/extensions.js +0 -35
- package/dist/extensions.js.map +0 -1
- package/dist/index.d.ts +0 -20
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -20
- package/dist/index.js.map +0 -1
- package/dist/merge.d.ts +0 -16
- package/dist/merge.d.ts.map +0 -1
- package/dist/merge.js +0 -34
- package/dist/merge.js.map +0 -1
- package/dist/ref.d.ts +0 -29
- package/dist/ref.d.ts.map +0 -1
- package/dist/ref.js +0 -30
- package/dist/ref.js.map +0 -1
- package/dist/registry.d.ts +0 -24
- package/dist/registry.d.ts.map +0 -1
- package/dist/registry.js +0 -12
- package/dist/registry.js.map +0 -1
- package/dist/resolve.d.ts +0 -21
- package/dist/resolve.d.ts.map +0 -1
- package/dist/resolve.js +0 -177
- package/dist/resolve.js.map +0 -1
- package/dist/secret-heuristics.d.ts +0 -10
- package/dist/secret-heuristics.d.ts.map +0 -1
- package/dist/secret-heuristics.js +0 -11
- package/dist/secret-heuristics.js.map +0 -1
- package/dist/trails/config-check.d.ts +0 -11
- package/dist/trails/config-check.d.ts.map +0 -1
- package/dist/trails/config-check.js +0 -53
- package/dist/trails/config-check.js.map +0 -1
- package/dist/trails/config-describe.d.ts +0 -12
- package/dist/trails/config-describe.d.ts.map +0 -1
- package/dist/trails/config-describe.js +0 -41
- package/dist/trails/config-describe.js.map +0 -1
- package/dist/trails/config-explain.d.ts +0 -8
- package/dist/trails/config-explain.d.ts.map +0 -1
- package/dist/trails/config-explain.js +0 -74
- package/dist/trails/config-explain.js.map +0 -1
- package/dist/trails/config-init.d.ts +0 -9
- package/dist/trails/config-init.d.ts.map +0 -1
- package/dist/trails/config-init.js +0 -78
- package/dist/trails/config-init.js.map +0 -1
- package/dist/workspace.d.ts +0 -9
- package/dist/workspace.d.ts.map +0 -1
- package/dist/workspace.js +0 -49
- package/dist/workspace.js.map +0 -1
- package/dist/zod-utils.d.ts +0 -14
- package/dist/zod-utils.d.ts.map +0 -1
- package/dist/zod-utils.js +0 -41
- package/dist/zod-utils.js.map +0 -1
- package/src/__tests__/app-config.test.ts +0 -342
- package/src/__tests__/compose.test.ts +0 -59
- package/src/__tests__/config-check.test.ts +0 -171
- package/src/__tests__/config-describe.test.ts +0 -154
- package/src/__tests__/config-explain.test.ts +0 -167
- package/src/__tests__/config-init.test.ts +0 -210
- package/src/__tests__/config-resource.test.ts +0 -87
- package/src/__tests__/define-config.test.ts +0 -269
- package/src/__tests__/derive-fields.test.ts +0 -158
- package/src/__tests__/derive-provenance.test.ts +0 -139
- package/src/__tests__/derive.test.ts +0 -269
- package/src/__tests__/doctor.test.ts +0 -172
- package/src/__tests__/extensions.test.ts +0 -134
- package/src/__tests__/ref.test.ts +0 -35
- package/src/__tests__/resolve.test.ts +0 -246
- package/src/__tests__/workspace.test.ts +0 -64
- package/src/workspace.ts +0 -56
- package/tsconfig.json +0 -9
- package/tsconfig.tests.json +0 -10
- package/tsconfig.tsbuildinfo +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,39 @@
|
|
|
1
1
|
# @ontrails/config
|
|
2
2
|
|
|
3
|
+
## 1.0.0-beta.16
|
|
4
|
+
|
|
5
|
+
### Major Changes
|
|
6
|
+
|
|
7
|
+
- 10eae9a: Migrate the Trails workspace to the documented `.trails/` layout: committed `.lock` files at the workspace root, ignored `cache/` for rebuildable derived data, ignored `state/` for mutable runtime state, and `.trails/config.local.{ts,js}` for local overrides. The default SQLite path is now `.trails/state/trails.db`. Workspace bootstrap creates only `cache/` and `state/` — the legacy `dev/` and `generated/` subdirectories are no longer created. Dev reset cleans both the new `.trails/state/` paths and legacy `.trails/trails.db*` and `.trails/dev/tracing.db*` paths for one cycle. Scaffold and workspace gitignores reflect the new layout.
|
|
8
|
+
|
|
9
|
+
Workspace bootstrap is now owned by a single canonical source in `@ontrails/core`. The package exposes `ensureTrailsWorkspace()`, `WORKSPACE_GITIGNORE_CONTENT`, and `WORKSPACE_GITIGNORE_LINES`. `@ontrails/config` no longer exports its own `ensureWorkspace` (consumers should import from `@ontrails/core`). `trails create` now writes `.trails/.gitignore` during scaffolding so a fresh-scaffolded project's initial commit includes the workspace gitignore (resolves TRL-703).
|
|
10
|
+
|
|
11
|
+
### Patch Changes
|
|
12
|
+
|
|
13
|
+
- 49c2e7d: Refresh published package README taxonomy to use adapter language instead of retired connector vocabulary.
|
|
14
|
+
- Updated dependencies [73622ae]
|
|
15
|
+
- Updated dependencies [6300f70]
|
|
16
|
+
- Updated dependencies [d172013]
|
|
17
|
+
- Updated dependencies [c3fc5c3]
|
|
18
|
+
- Updated dependencies [20d7a5c]
|
|
19
|
+
- Updated dependencies [be5fb46]
|
|
20
|
+
- Updated dependencies [e898cc4]
|
|
21
|
+
- Updated dependencies [3395234]
|
|
22
|
+
- Updated dependencies [bcdc484]
|
|
23
|
+
- Updated dependencies [331e3a9]
|
|
24
|
+
- Updated dependencies [4399fdb]
|
|
25
|
+
- Updated dependencies [4b8d13b]
|
|
26
|
+
- Updated dependencies [112b9f2]
|
|
27
|
+
- Updated dependencies [893025e]
|
|
28
|
+
- Updated dependencies [eec5e9d]
|
|
29
|
+
- Updated dependencies [ebd4434]
|
|
30
|
+
- Updated dependencies [863d473]
|
|
31
|
+
- Updated dependencies [344f2f7]
|
|
32
|
+
- Updated dependencies [26f9ffd]
|
|
33
|
+
- Updated dependencies [10eae9a]
|
|
34
|
+
- Updated dependencies [22c6c06]
|
|
35
|
+
- @ontrails/core@1.0.0-beta.16
|
|
36
|
+
|
|
3
37
|
## 1.0.0-beta.15
|
|
4
38
|
|
|
5
39
|
### Patch Changes
|
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
Schema-derived configuration for Trails.
|
|
4
4
|
|
|
5
|
-
The root package owns the
|
|
5
|
+
The root package owns the runtime-agnostic config declaration and resolution engine. Schemas define the contract, and `configResource` exposes resolved values to trail execution.
|
|
6
6
|
|
|
7
7
|
## The core pattern
|
|
8
8
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ontrails/config",
|
|
3
|
-
"version": "1.0.0-beta.
|
|
3
|
+
"version": "1.0.0-beta.16",
|
|
4
|
+
"files": [
|
|
5
|
+
"src/**/*.ts",
|
|
6
|
+
"!src/**/__tests__/**",
|
|
7
|
+
"!src/**/*.test.ts",
|
|
8
|
+
"!src/**/*.test-d.ts",
|
|
9
|
+
"README.md",
|
|
10
|
+
"CHANGELOG.md"
|
|
11
|
+
],
|
|
4
12
|
"type": "module",
|
|
5
13
|
"exports": {
|
|
6
14
|
".": "./src/index.ts",
|
|
@@ -14,7 +22,7 @@
|
|
|
14
22
|
"clean": "rm -rf dist *.tsbuildinfo"
|
|
15
23
|
},
|
|
16
24
|
"peerDependencies": {
|
|
17
|
-
"@ontrails/core": "^1.0.0-beta.
|
|
25
|
+
"@ontrails/core": "^1.0.0-beta.15",
|
|
18
26
|
"zod": "^4.3.5"
|
|
19
27
|
}
|
|
20
28
|
}
|
package/src/define-config.ts
CHANGED
|
@@ -36,10 +36,13 @@ interface DefineConfigResolveOptions {
|
|
|
36
36
|
// Local overrides discovery
|
|
37
37
|
// ---------------------------------------------------------------------------
|
|
38
38
|
|
|
39
|
-
const LOCAL_OVERRIDE_CANDIDATES = [
|
|
39
|
+
const LOCAL_OVERRIDE_CANDIDATES = [
|
|
40
|
+
'config.local.ts',
|
|
41
|
+
'config.local.js',
|
|
42
|
+
] as const;
|
|
40
43
|
|
|
41
44
|
/**
|
|
42
|
-
* Discover and synchronously import a `.trails/config
|
|
45
|
+
* Discover and synchronously import a `.trails/config.local.{ts,js}` file.
|
|
43
46
|
*
|
|
44
47
|
* Skipped when `TRAILS_ENV=test` for hermetic test environments.
|
|
45
48
|
*/
|
|
@@ -52,7 +55,7 @@ const discoverLocalOverrides = async (
|
|
|
52
55
|
}
|
|
53
56
|
|
|
54
57
|
for (const filename of LOCAL_OVERRIDE_CANDIDATES) {
|
|
55
|
-
const candidate = join(cwd, '.trails',
|
|
58
|
+
const candidate = join(cwd, '.trails', filename);
|
|
56
59
|
if (existsSync(candidate)) {
|
|
57
60
|
const mod: Record<string, unknown> = await import(candidate);
|
|
58
61
|
return (mod['default'] ?? mod) as Record<string, unknown>;
|
package/src/extensions.ts
CHANGED
|
@@ -34,7 +34,7 @@ export const secret = <T extends z.ZodType>(schema: T): T =>
|
|
|
34
34
|
* standard key. We set `deprecated: true` so Zod-native tooling (schema
|
|
35
35
|
* serializers, OpenAPI generators) recognises the field as deprecated, and store
|
|
36
36
|
* the human-readable message under `deprecationMessage` for our own
|
|
37
|
-
* `collectConfigMeta` / survey / explain
|
|
37
|
+
* `collectConfigMeta` / survey / explain surfaces.
|
|
38
38
|
*
|
|
39
39
|
* Must be called BEFORE `.default()`, `.optional()`, or other transforms
|
|
40
40
|
* so that the metadata lives on the inner type where `collectConfigMeta`
|
package/src/index.ts
CHANGED
|
@@ -40,4 +40,3 @@ export { configCheck } from './trails/config-check.js';
|
|
|
40
40
|
export { configDescribe } from './trails/config-describe.js';
|
|
41
41
|
export { configExplain } from './trails/config-explain.js';
|
|
42
42
|
export { configInit } from './trails/config-init.js';
|
|
43
|
-
export { ensureWorkspace } from './workspace.js';
|
package/src/registry.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Module-level config state registry.
|
|
3
3
|
*
|
|
4
4
|
* Config is resolved once at bootstrap (two-phase init per ADR-010) and
|
|
5
|
-
* registered here so `configResource` can expose it to
|
|
5
|
+
* registered here so `configResource` can expose it to surfaces. This is
|
|
6
6
|
* a process-level singleton — config resolution is inherently global.
|
|
7
7
|
*/
|
|
8
8
|
import type { z } from 'zod';
|
package/src/resolve.ts
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
|
|
6
6
|
import type { z } from 'zod';
|
|
7
7
|
|
|
8
|
-
import { Result } from '@ontrails/core';
|
|
8
|
+
import { Result, ValidationError } from '@ontrails/core';
|
|
9
9
|
|
|
10
10
|
import { collectConfigMeta } from './collect.js';
|
|
11
11
|
import { deepMerge } from './merge.js';
|
|
@@ -275,5 +275,7 @@ export const deriveConfig = <T extends z.ZodType>(
|
|
|
275
275
|
return Result.ok(parsed.data as z.infer<T>);
|
|
276
276
|
}
|
|
277
277
|
|
|
278
|
-
return Result.err(
|
|
278
|
+
return Result.err(
|
|
279
|
+
new ValidationError(formatValidationError(parsed.error.issues))
|
|
280
|
+
);
|
|
279
281
|
};
|
package/.turbo/turbo-build.log
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
$ tsc -b
|
package/.turbo/turbo-lint.log
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
$ tsc --noEmit
|
package/dist/app-config.d.ts
DELETED
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* App config factory — declare a config contract once, discover and validate at runtime.
|
|
3
|
-
*/
|
|
4
|
-
import { Result } from '@ontrails/core';
|
|
5
|
-
import type { z } from 'zod';
|
|
6
|
-
import type { CheckResult } from './doctor.js';
|
|
7
|
-
import type { FieldDescription } from './derive-fields.js';
|
|
8
|
-
import type { DeriveConfigProvenanceOptions, ProvenanceEntry } from './derive-provenance.js';
|
|
9
|
-
import type { ConfigRef } from './ref.js';
|
|
10
|
-
/** Supported config file formats. */
|
|
11
|
-
export type ConfigFormat = 'toml' | 'json' | 'jsonc' | 'yaml';
|
|
12
|
-
/** Options for creating an app config. */
|
|
13
|
-
export interface AppConfigOptions<T extends z.ZodType> {
|
|
14
|
-
readonly schema: T;
|
|
15
|
-
readonly formats?: readonly ConfigFormat[];
|
|
16
|
-
readonly dotfile?: boolean;
|
|
17
|
-
}
|
|
18
|
-
/** Options for resolving (discovering + parsing) a config file. */
|
|
19
|
-
export interface ResolveOptions {
|
|
20
|
-
/** Working directory for discovery. Defaults to `process.cwd()`. */
|
|
21
|
-
readonly cwd?: string;
|
|
22
|
-
/** Explicit file path — skips discovery when provided. */
|
|
23
|
-
readonly path?: string;
|
|
24
|
-
}
|
|
25
|
-
/** Options for the `explain()` method on AppConfig, excluding schema. */
|
|
26
|
-
export type AppConfigDeriveProvenanceOptions = Omit<DeriveConfigProvenanceOptions<z.ZodType>, 'schema'>;
|
|
27
|
-
/** The resolved config contract returned by `appConfig()`. */
|
|
28
|
-
export interface AppConfig<T extends z.ZodType> {
|
|
29
|
-
readonly name: string;
|
|
30
|
-
readonly schema: T;
|
|
31
|
-
readonly formats: readonly ConfigFormat[];
|
|
32
|
-
readonly dotfile: boolean;
|
|
33
|
-
resolve(options?: ResolveOptions): Promise<Result<z.infer<T>, Error>>;
|
|
34
|
-
/** Describe all fields in the schema without needing values. */
|
|
35
|
-
describe(): readonly FieldDescription[];
|
|
36
|
-
/** Check a config object against the schema and return diagnostics. */
|
|
37
|
-
check(values: Record<string, unknown>, options?: {
|
|
38
|
-
readonly env?: Record<string, string | undefined>;
|
|
39
|
-
}): CheckResult;
|
|
40
|
-
/** Show which source won for each config field. */
|
|
41
|
-
explain(options: AppConfigDeriveProvenanceOptions): readonly ProvenanceEntry[];
|
|
42
|
-
/** Create a lazy reference to a config field for use as a trail input default. */
|
|
43
|
-
ref(fieldPath: string): ConfigRef;
|
|
44
|
-
}
|
|
45
|
-
/**
|
|
46
|
-
* Declare a config contract for an app.
|
|
47
|
-
*
|
|
48
|
-
* The returned `AppConfig` exposes `resolve()` to discover, parse, and validate
|
|
49
|
-
* a config file matching the app name and format conventions.
|
|
50
|
-
*
|
|
51
|
-
* @example
|
|
52
|
-
* ```ts
|
|
53
|
-
* const config = appConfig('myapp', {
|
|
54
|
-
* schema: z.object({
|
|
55
|
-
* output: z.string().default('./output'),
|
|
56
|
-
* verbose: z.boolean().default(false),
|
|
57
|
-
* }),
|
|
58
|
-
* });
|
|
59
|
-
*
|
|
60
|
-
* const result = await config.resolve();
|
|
61
|
-
* if (result.isOk()) console.log(result.value.output);
|
|
62
|
-
* ```
|
|
63
|
-
*/
|
|
64
|
-
export declare const appConfig: <T extends z.ZodType>(name: string, options: AppConfigOptions<T>) => AppConfig<T>;
|
|
65
|
-
//# sourceMappingURL=app-config.d.ts.map
|
package/dist/app-config.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
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
DELETED
|
@@ -1,177 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* App config factory — declare a config contract once, discover and validate at runtime.
|
|
3
|
-
*/
|
|
4
|
-
import { dirname, join } from 'node:path';
|
|
5
|
-
import { NotFoundError, Result, ValidationError } from '@ontrails/core';
|
|
6
|
-
import { checkConfig } from './doctor.js';
|
|
7
|
-
import { deriveConfigFields } from './derive-fields.js';
|
|
8
|
-
import { deriveConfigProvenance } from './derive-provenance.js';
|
|
9
|
-
import { configRef } from './ref.js';
|
|
10
|
-
// ---------------------------------------------------------------------------
|
|
11
|
-
// Default values
|
|
12
|
-
// ---------------------------------------------------------------------------
|
|
13
|
-
const DEFAULT_FORMATS = [
|
|
14
|
-
'toml',
|
|
15
|
-
'json',
|
|
16
|
-
'jsonc',
|
|
17
|
-
'yaml',
|
|
18
|
-
];
|
|
19
|
-
// ---------------------------------------------------------------------------
|
|
20
|
-
// Internal helpers (defined before consumers — no-use-before-define)
|
|
21
|
-
// ---------------------------------------------------------------------------
|
|
22
|
-
/** Build the config filename for a given format. */
|
|
23
|
-
const configFileName = (name, format, dotfile) => (dotfile ? `.${name}rc.${format}` : `${name}.config.${format}`);
|
|
24
|
-
/** Check whether a file exists at the given path. */
|
|
25
|
-
const fileExists = (filePath) => Bun.file(filePath).exists();
|
|
26
|
-
/** Known config suffixes, ordered to avoid `.json` matching `.jsonc`. */
|
|
27
|
-
const FORMAT_SUFFIXES = [
|
|
28
|
-
['jsonc', '.jsonc'],
|
|
29
|
-
['json', '.json'],
|
|
30
|
-
['toml', '.toml'],
|
|
31
|
-
['yaml', '.yaml'],
|
|
32
|
-
];
|
|
33
|
-
/** Detect the declared config format from a file path. */
|
|
34
|
-
const detectFormat = (filePath) => {
|
|
35
|
-
for (const [format, suffix] of FORMAT_SUFFIXES) {
|
|
36
|
-
if (filePath.endsWith(suffix)) {
|
|
37
|
-
return format;
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
return undefined;
|
|
41
|
-
};
|
|
42
|
-
/** Parse config file text with Bun's native format parsers. */
|
|
43
|
-
const parseConfigText = (filePath, text) => {
|
|
44
|
-
const format = detectFormat(filePath);
|
|
45
|
-
try {
|
|
46
|
-
switch (format) {
|
|
47
|
-
case 'json': {
|
|
48
|
-
return Result.ok(JSON.parse(text));
|
|
49
|
-
}
|
|
50
|
-
case 'jsonc': {
|
|
51
|
-
return Result.ok(Bun.JSONC.parse(text));
|
|
52
|
-
}
|
|
53
|
-
case 'toml': {
|
|
54
|
-
return Result.ok(Bun.TOML.parse(text));
|
|
55
|
-
}
|
|
56
|
-
case 'yaml': {
|
|
57
|
-
return Result.ok(Bun.YAML.parse(text));
|
|
58
|
-
}
|
|
59
|
-
default: {
|
|
60
|
-
return Result.err(new ValidationError(`Unsupported config file format: ${filePath}`, {
|
|
61
|
-
context: { path: filePath },
|
|
62
|
-
}));
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
catch (error) {
|
|
67
|
-
return Result.err(new ValidationError(`Failed to parse config file: ${filePath}`, {
|
|
68
|
-
cause: error instanceof Error ? error : new Error(String(error)),
|
|
69
|
-
context: { path: filePath },
|
|
70
|
-
}));
|
|
71
|
-
}
|
|
72
|
-
};
|
|
73
|
-
/** Read and parse a config file, always reflecting the latest on-disk content. */
|
|
74
|
-
const readConfigFile = async (filePath) => {
|
|
75
|
-
const exists = await fileExists(filePath);
|
|
76
|
-
if (!exists) {
|
|
77
|
-
return Result.err(new NotFoundError(`Config file not found: ${filePath}`, {
|
|
78
|
-
context: { path: filePath },
|
|
79
|
-
}));
|
|
80
|
-
}
|
|
81
|
-
const text = await Bun.file(filePath).text();
|
|
82
|
-
return parseConfigText(filePath, text);
|
|
83
|
-
};
|
|
84
|
-
/** Validate parsed data against a Zod schema. */
|
|
85
|
-
const validateConfig = (schema, data, filePath) => {
|
|
86
|
-
const parsed = schema.safeParse(data);
|
|
87
|
-
if (parsed.success) {
|
|
88
|
-
return Result.ok(parsed.data);
|
|
89
|
-
}
|
|
90
|
-
return Result.err(new ValidationError(`Config validation failed: ${filePath}`, {
|
|
91
|
-
context: {
|
|
92
|
-
issues: parsed.error.issues,
|
|
93
|
-
path: filePath,
|
|
94
|
-
},
|
|
95
|
-
}));
|
|
96
|
-
};
|
|
97
|
-
/** Check all format candidates in a single directory. */
|
|
98
|
-
const findInDir = async (dir, name, formats, dotfile) => {
|
|
99
|
-
for (const format of formats) {
|
|
100
|
-
const candidate = join(dir, configFileName(name, format, dotfile));
|
|
101
|
-
if (await fileExists(candidate)) {
|
|
102
|
-
return candidate;
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
return undefined;
|
|
106
|
-
};
|
|
107
|
-
/** Walk up from `startDir` looking for any matching config filename. */
|
|
108
|
-
const discoverConfigFile = async (name, formats, dotfile, startDir) => {
|
|
109
|
-
let dir = startDir;
|
|
110
|
-
for (let depth = 0; depth < 64; depth += 1) {
|
|
111
|
-
const found = await findInDir(dir, name, formats, dotfile);
|
|
112
|
-
if (found !== undefined) {
|
|
113
|
-
return found;
|
|
114
|
-
}
|
|
115
|
-
const parent = dirname(dir);
|
|
116
|
-
// Reached filesystem root
|
|
117
|
-
if (parent === dir) {
|
|
118
|
-
break;
|
|
119
|
-
}
|
|
120
|
-
dir = parent;
|
|
121
|
-
}
|
|
122
|
-
return undefined;
|
|
123
|
-
};
|
|
124
|
-
/** Resolve a config file — either from an explicit path or via discovery. */
|
|
125
|
-
const resolveAppConfigFile = async (name, schema, formats, dotfile, options) => {
|
|
126
|
-
const filePath = options?.path ??
|
|
127
|
-
(await discoverConfigFile(name, formats, dotfile, options?.cwd ?? process.cwd()));
|
|
128
|
-
if (filePath === undefined) {
|
|
129
|
-
return Result.err(new NotFoundError(`No config file found for "${name}"`, {
|
|
130
|
-
context: { dotfile, formats: [...formats], name },
|
|
131
|
-
}));
|
|
132
|
-
}
|
|
133
|
-
const readResult = await readConfigFile(filePath);
|
|
134
|
-
if (readResult.isErr()) {
|
|
135
|
-
return readResult;
|
|
136
|
-
}
|
|
137
|
-
return validateConfig(schema, readResult.value, filePath);
|
|
138
|
-
};
|
|
139
|
-
// ---------------------------------------------------------------------------
|
|
140
|
-
// Factory
|
|
141
|
-
// ---------------------------------------------------------------------------
|
|
142
|
-
/**
|
|
143
|
-
* Declare a config contract for an app.
|
|
144
|
-
*
|
|
145
|
-
* The returned `AppConfig` exposes `resolve()` to discover, parse, and validate
|
|
146
|
-
* a config file matching the app name and format conventions.
|
|
147
|
-
*
|
|
148
|
-
* @example
|
|
149
|
-
* ```ts
|
|
150
|
-
* const config = appConfig('myapp', {
|
|
151
|
-
* schema: z.object({
|
|
152
|
-
* output: z.string().default('./output'),
|
|
153
|
-
* verbose: z.boolean().default(false),
|
|
154
|
-
* }),
|
|
155
|
-
* });
|
|
156
|
-
*
|
|
157
|
-
* const result = await config.resolve();
|
|
158
|
-
* if (result.isOk()) console.log(result.value.output);
|
|
159
|
-
* ```
|
|
160
|
-
*/
|
|
161
|
-
export const appConfig = (name, options) => {
|
|
162
|
-
const formats = options.formats ?? DEFAULT_FORMATS;
|
|
163
|
-
const dotfile = options.dotfile ?? false;
|
|
164
|
-
const { schema } = options;
|
|
165
|
-
return {
|
|
166
|
-
check: (values, checkOpts) => checkConfig(schema, values, checkOpts),
|
|
167
|
-
describe: () => deriveConfigFields(schema),
|
|
168
|
-
dotfile,
|
|
169
|
-
explain: (explainOpts) => deriveConfigProvenance({ ...explainOpts, schema }),
|
|
170
|
-
formats,
|
|
171
|
-
name,
|
|
172
|
-
ref: (fieldPath) => configRef(fieldPath),
|
|
173
|
-
resolve: (resolveOptions) => resolveAppConfigFile(name, schema, formats, dotfile, resolveOptions),
|
|
174
|
-
schema,
|
|
175
|
-
};
|
|
176
|
-
};
|
|
177
|
-
//# sourceMappingURL=app-config.js.map
|
package/dist/app-config.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
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/collect.d.ts
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import type { z } from 'zod';
|
|
2
|
-
import type { ConfigFieldMeta } from './extensions.js';
|
|
3
|
-
/**
|
|
4
|
-
* Walk a Zod object schema and collect `ConfigFieldMeta` for each field.
|
|
5
|
-
*
|
|
6
|
-
* Handles unwrapping `.default()`, `.optional()`, `.nullable()` wrappers
|
|
7
|
-
* that don't carry inner metadata forward. Recurses into nested `ZodObject`
|
|
8
|
-
* fields using dot-separated paths.
|
|
9
|
-
*/
|
|
10
|
-
export declare const collectConfigMeta: (schema: z.ZodObject<Record<string, z.ZodType>>, prefix?: string) => Map<string, ConfigFieldMeta>;
|
|
11
|
-
//# sourceMappingURL=collect.d.ts.map
|
package/dist/collect.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"collect.d.ts","sourceRoot":"","sources":["../src/collect.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAE7B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AA+FvD;;;;;;GAMG;AACH,eAAO,MAAM,iBAAiB,GAC5B,QAAQ,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,EAC9C,eAAW,KACV,GAAG,CAAC,MAAM,EAAE,eAAe,CAS7B,CAAC"}
|
package/dist/collect.js
DELETED
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
import { globalRegistry } from 'zod';
|
|
2
|
-
import { isZodObject, unwrapToBase } from './zod-utils.js';
|
|
3
|
-
/** Config meta keys we look for in Zod registry entries. */
|
|
4
|
-
const META_EXTRACTORS = [
|
|
5
|
-
{
|
|
6
|
-
extract: (r) => ({ env: r['env'] }),
|
|
7
|
-
test: (r) => typeof r['env'] === 'string',
|
|
8
|
-
},
|
|
9
|
-
{
|
|
10
|
-
extract: () => ({ secret: true }),
|
|
11
|
-
test: (r) => r['secret'] === true,
|
|
12
|
-
},
|
|
13
|
-
{
|
|
14
|
-
extract: (r) => ({ deprecated: r['deprecationMessage'] }),
|
|
15
|
-
test: (r) => typeof r['deprecationMessage'] === 'string',
|
|
16
|
-
},
|
|
17
|
-
];
|
|
18
|
-
/**
|
|
19
|
-
* Pick only `ConfigFieldMeta` keys from a raw registry entry.
|
|
20
|
-
* Uses a lookup table to stay under the max-statements limit.
|
|
21
|
-
*/
|
|
22
|
-
const pickConfigMeta = (raw) => {
|
|
23
|
-
if (!raw) {
|
|
24
|
-
return undefined;
|
|
25
|
-
}
|
|
26
|
-
const parts = META_EXTRACTORS.filter((e) => e.test(raw)).map((e) => e.extract(raw));
|
|
27
|
-
return parts.length > 0
|
|
28
|
-
? Object.assign({}, ...parts)
|
|
29
|
-
: undefined;
|
|
30
|
-
};
|
|
31
|
-
/**
|
|
32
|
-
* Extract `ConfigFieldMeta` from a schema, unwrapping through
|
|
33
|
-
* `.default()`, `.optional()`, `.nullable()` wrappers as needed.
|
|
34
|
-
*/
|
|
35
|
-
const extractConfigMeta = (schema) => {
|
|
36
|
-
let current = schema;
|
|
37
|
-
while (current) {
|
|
38
|
-
const meta = pickConfigMeta(globalRegistry.get(current));
|
|
39
|
-
if (meta) {
|
|
40
|
-
return meta;
|
|
41
|
-
}
|
|
42
|
-
const def = current.def;
|
|
43
|
-
current = def['innerType'];
|
|
44
|
-
}
|
|
45
|
-
return undefined;
|
|
46
|
-
};
|
|
47
|
-
/** Process one level of an object schema, queuing nested objects. */
|
|
48
|
-
const walkObjectShape = (schema, prefix, result, queue) => {
|
|
49
|
-
const shape = schema.shape;
|
|
50
|
-
for (const [key, fieldSchema] of Object.entries(shape)) {
|
|
51
|
-
const path = prefix ? `${prefix}.${key}` : key;
|
|
52
|
-
if (isZodObject(fieldSchema)) {
|
|
53
|
-
queue.push({
|
|
54
|
-
prefix: path,
|
|
55
|
-
schema: unwrapToBase(fieldSchema),
|
|
56
|
-
});
|
|
57
|
-
}
|
|
58
|
-
else {
|
|
59
|
-
const meta = extractConfigMeta(fieldSchema);
|
|
60
|
-
if (meta) {
|
|
61
|
-
result.set(path, meta);
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
};
|
|
66
|
-
/**
|
|
67
|
-
* Walk a Zod object schema and collect `ConfigFieldMeta` for each field.
|
|
68
|
-
*
|
|
69
|
-
* Handles unwrapping `.default()`, `.optional()`, `.nullable()` wrappers
|
|
70
|
-
* that don't carry inner metadata forward. Recurses into nested `ZodObject`
|
|
71
|
-
* fields using dot-separated paths.
|
|
72
|
-
*/
|
|
73
|
-
export const collectConfigMeta = (schema, prefix = '') => {
|
|
74
|
-
const result = new Map();
|
|
75
|
-
const queue = [{ prefix, schema }];
|
|
76
|
-
for (let entry = queue.pop(); entry; entry = queue.pop()) {
|
|
77
|
-
walkObjectShape(entry.schema, entry.prefix, result, queue);
|
|
78
|
-
}
|
|
79
|
-
return result;
|
|
80
|
-
};
|
|
81
|
-
//# sourceMappingURL=collect.js.map
|
package/dist/collect.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"collect.js","sourceRoot":"","sources":["../src/collect.ts"],"names":[],"mappings":"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"}
|
package/dist/compose.d.ts
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Config composition utilities for resources.
|
|
3
|
-
*
|
|
4
|
-
* Collects config schemas from resource declarations so they can be
|
|
5
|
-
* composed into a unified config structure via `defineConfig`.
|
|
6
|
-
*/
|
|
7
|
-
import type { z } from 'zod';
|
|
8
|
-
/** A resource config schema entry extracted from a resource declaration. */
|
|
9
|
-
export interface ResourceConfigEntry {
|
|
10
|
-
readonly resourceId: string;
|
|
11
|
-
readonly schema: z.ZodType;
|
|
12
|
-
}
|
|
13
|
-
/** Minimal shape needed to extract config from a resource-like object. */
|
|
14
|
-
interface ResourceWithOptionalConfig {
|
|
15
|
-
readonly id: string;
|
|
16
|
-
readonly config?: z.ZodType | undefined;
|
|
17
|
-
}
|
|
18
|
-
/**
|
|
19
|
-
* Collect config schemas from resources that declare them.
|
|
20
|
-
*
|
|
21
|
-
* Returns entries keyed by resource ID for composition into `defineConfig`.
|
|
22
|
-
* Resources without a `config` schema are excluded.
|
|
23
|
-
*/
|
|
24
|
-
export declare const collectResourceConfigs: (resources: readonly ResourceWithOptionalConfig[]) => ResourceConfigEntry[];
|
|
25
|
-
export {};
|
|
26
|
-
//# sourceMappingURL=compose.d.ts.map
|
package/dist/compose.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
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
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Config composition utilities for resources.
|
|
3
|
-
*
|
|
4
|
-
* Collects config schemas from resource declarations so they can be
|
|
5
|
-
* composed into a unified config structure via `defineConfig`.
|
|
6
|
-
*/
|
|
7
|
-
// ---------------------------------------------------------------------------
|
|
8
|
-
// Public API
|
|
9
|
-
// ---------------------------------------------------------------------------
|
|
10
|
-
/**
|
|
11
|
-
* Collect config schemas from resources that declare them.
|
|
12
|
-
*
|
|
13
|
-
* Returns entries keyed by resource ID for composition into `defineConfig`.
|
|
14
|
-
* Resources without a `config` schema are excluded.
|
|
15
|
-
*/
|
|
16
|
-
export const collectResourceConfigs = (resources) => resources
|
|
17
|
-
.filter((svc) => svc.config !== undefined)
|
|
18
|
-
.map((svc) => ({ resourceId: svc.id, schema: svc.config }));
|
|
19
|
-
//# sourceMappingURL=compose.js.map
|
package/dist/compose.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
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
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Config layer — attaches resolved config to the execution context.
|
|
3
|
-
*
|
|
4
|
-
* For v1, the layer is a pass-through: config resolution happens at
|
|
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
|
-
*/
|
|
9
|
-
import type { Layer } from '@ontrails/core';
|
|
10
|
-
export declare const configLayer: Layer;
|
|
11
|
-
//# sourceMappingURL=config-layer.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"config-layer.d.ts","sourceRoot":"","sources":["../src/config-layer.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAE5C,eAAO,MAAM,WAAW,EAAE,KAIzB,CAAC"}
|
package/dist/config-layer.js
DELETED
package/dist/config-layer.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"config-layer.js","sourceRoot":"","sources":["../src/config-layer.ts"],"names":[],"mappings":"AAUA,MAAM,CAAC,MAAM,WAAW,GAAU;IAChC,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"}
|
|
@@ -1 +0,0 @@
|
|
|
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"}
|
package/dist/config-resource.js
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Config resource — manages resolved config lifecycle.
|
|
3
|
-
*
|
|
4
|
-
* The config is resolved during bootstrap (two-phase init per ADR-010)
|
|
5
|
-
* and registered via `registerConfigState`. This resource reads from the
|
|
6
|
-
* global registry so trails can access it through `configResource.from(ctx)`.
|
|
7
|
-
*/
|
|
8
|
-
import { InternalError, Result, resource } from '@ontrails/core';
|
|
9
|
-
import { z } from 'zod';
|
|
10
|
-
import { getConfigState } from './registry.js';
|
|
11
|
-
export const configResource = resource('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-resource.js.map
|
|
@@ -1 +0,0 @@
|
|
|
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"}
|