@nekostack/schema 1.0.0
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 +422 -0
- package/LICENSE +202 -0
- package/README.md +656 -0
- package/dist/src/builders/array.d.ts +12 -0
- package/dist/src/builders/array.d.ts.map +1 -0
- package/dist/src/builders/array.js +29 -0
- package/dist/src/builders/array.js.map +1 -0
- package/dist/src/builders/object.d.ts +62 -0
- package/dist/src/builders/object.d.ts.map +1 -0
- package/dist/src/builders/object.js +263 -0
- package/dist/src/builders/object.js.map +1 -0
- package/dist/src/builders/primitives.d.ts +37 -0
- package/dist/src/builders/primitives.d.ts.map +1 -0
- package/dist/src/builders/primitives.js +125 -0
- package/dist/src/builders/primitives.js.map +1 -0
- package/dist/src/builders/s.d.ts +27 -0
- package/dist/src/builders/s.d.ts.map +1 -0
- package/dist/src/builders/s.js +39 -0
- package/dist/src/builders/s.js.map +1 -0
- package/dist/src/builders/schema.d.ts +70 -0
- package/dist/src/builders/schema.d.ts.map +1 -0
- package/dist/src/builders/schema.js +98 -0
- package/dist/src/builders/schema.js.map +1 -0
- package/dist/src/cli-integration.d.ts +43 -0
- package/dist/src/cli-integration.d.ts.map +1 -0
- package/dist/src/cli-integration.js +48 -0
- package/dist/src/cli-integration.js.map +1 -0
- package/dist/src/errors/issue.d.ts +34 -0
- package/dist/src/errors/issue.d.ts.map +1 -0
- package/dist/src/errors/issue.js +89 -0
- package/dist/src/errors/issue.js.map +1 -0
- package/dist/src/generators/errors.d.ts +31 -0
- package/dist/src/generators/errors.d.ts.map +1 -0
- package/dist/src/generators/errors.js +34 -0
- package/dist/src/generators/errors.js.map +1 -0
- package/dist/src/generators/header.d.ts +42 -0
- package/dist/src/generators/header.d.ts.map +1 -0
- package/dist/src/generators/header.js +43 -0
- package/dist/src/generators/header.js.map +1 -0
- package/dist/src/generators/json-schema-meta.d.ts +36 -0
- package/dist/src/generators/json-schema-meta.d.ts.map +1 -0
- package/dist/src/generators/json-schema-meta.js +35 -0
- package/dist/src/generators/json-schema-meta.js.map +1 -0
- package/dist/src/generators/json-schema.d.ts +26 -0
- package/dist/src/generators/json-schema.d.ts.map +1 -0
- package/dist/src/generators/json-schema.js +88 -0
- package/dist/src/generators/json-schema.js.map +1 -0
- package/dist/src/generators/openapi.d.ts +33 -0
- package/dist/src/generators/openapi.d.ts.map +1 -0
- package/dist/src/generators/openapi.js +61 -0
- package/dist/src/generators/openapi.js.map +1 -0
- package/dist/src/generators/schema-fragment.d.ts +55 -0
- package/dist/src/generators/schema-fragment.d.ts.map +1 -0
- package/dist/src/generators/schema-fragment.js +253 -0
- package/dist/src/generators/schema-fragment.js.map +1 -0
- package/dist/src/generators/ts.d.ts +19 -0
- package/dist/src/generators/ts.d.ts.map +1 -0
- package/dist/src/generators/ts.js +252 -0
- package/dist/src/generators/ts.js.map +1 -0
- package/dist/src/generators/types.d.ts +96 -0
- package/dist/src/generators/types.d.ts.map +1 -0
- package/dist/src/generators/types.js +10 -0
- package/dist/src/generators/types.js.map +1 -0
- package/dist/src/generators/version.d.ts +11 -0
- package/dist/src/generators/version.d.ts.map +1 -0
- package/dist/src/generators/version.js +11 -0
- package/dist/src/generators/version.js.map +1 -0
- package/dist/src/generators/zod-mapping.d.ts +90 -0
- package/dist/src/generators/zod-mapping.d.ts.map +1 -0
- package/dist/src/generators/zod-mapping.js +174 -0
- package/dist/src/generators/zod-mapping.js.map +1 -0
- package/dist/src/generators/zod.d.ts +17 -0
- package/dist/src/generators/zod.d.ts.map +1 -0
- package/dist/src/generators/zod.js +118 -0
- package/dist/src/generators/zod.js.map +1 -0
- package/dist/src/index.d.ts +21 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +43 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/ir/hash.d.ts +19 -0
- package/dist/src/ir/hash.d.ts.map +1 -0
- package/dist/src/ir/hash.js +22 -0
- package/dist/src/ir/hash.js.map +1 -0
- package/dist/src/ir/nodes.d.ts +121 -0
- package/dist/src/ir/nodes.d.ts.map +1 -0
- package/dist/src/ir/nodes.js +14 -0
- package/dist/src/ir/nodes.js.map +1 -0
- package/dist/src/ir/serialize.d.ts +8 -0
- package/dist/src/ir/serialize.d.ts.map +1 -0
- package/dist/src/ir/serialize.js +23 -0
- package/dist/src/ir/serialize.js.map +1 -0
- package/dist/src/migrations/build-migration-registry.d.ts +46 -0
- package/dist/src/migrations/build-migration-registry.d.ts.map +1 -0
- package/dist/src/migrations/build-migration-registry.js +134 -0
- package/dist/src/migrations/build-migration-registry.js.map +1 -0
- package/dist/src/migrations/handlers/list.d.ts +35 -0
- package/dist/src/migrations/handlers/list.d.ts.map +1 -0
- package/dist/src/migrations/handlers/list.js +55 -0
- package/dist/src/migrations/handlers/list.js.map +1 -0
- package/dist/src/migrations/handlers/plan.d.ts +26 -0
- package/dist/src/migrations/handlers/plan.d.ts.map +1 -0
- package/dist/src/migrations/handlers/plan.js +28 -0
- package/dist/src/migrations/handlers/plan.js.map +1 -0
- package/dist/src/migrations/handlers/stub.d.ts +22 -0
- package/dist/src/migrations/handlers/stub.d.ts.map +1 -0
- package/dist/src/migrations/handlers/stub.js +24 -0
- package/dist/src/migrations/handlers/stub.js.map +1 -0
- package/dist/src/migrations/handlers/verify.d.ts +25 -0
- package/dist/src/migrations/handlers/verify.d.ts.map +1 -0
- package/dist/src/migrations/handlers/verify.js +27 -0
- package/dist/src/migrations/handlers/verify.js.map +1 -0
- package/dist/src/migrations/parse-provenance.d.ts +78 -0
- package/dist/src/migrations/parse-provenance.d.ts.map +1 -0
- package/dist/src/migrations/parse-provenance.js +157 -0
- package/dist/src/migrations/parse-provenance.js.map +1 -0
- package/dist/src/migrations/plan-migration.d.ts +50 -0
- package/dist/src/migrations/plan-migration.d.ts.map +1 -0
- package/dist/src/migrations/plan-migration.js +256 -0
- package/dist/src/migrations/plan-migration.js.map +1 -0
- package/dist/src/migrations/stub.d.ts +55 -0
- package/dist/src/migrations/stub.d.ts.map +1 -0
- package/dist/src/migrations/stub.js +201 -0
- package/dist/src/migrations/stub.js.map +1 -0
- package/dist/src/migrations/types.d.ts +297 -0
- package/dist/src/migrations/types.d.ts.map +1 -0
- package/dist/src/migrations/types.js +28 -0
- package/dist/src/migrations/types.js.map +1 -0
- package/dist/src/migrations/verify-provenance.d.ts +46 -0
- package/dist/src/migrations/verify-provenance.d.ts.map +1 -0
- package/dist/src/migrations/verify-provenance.js +158 -0
- package/dist/src/migrations/verify-provenance.js.map +1 -0
- package/dist/src/registry/build-registry.d.ts +65 -0
- package/dist/src/registry/build-registry.d.ts.map +1 -0
- package/dist/src/registry/build-registry.js +172 -0
- package/dist/src/registry/build-registry.js.map +1 -0
- package/dist/src/registry/diff.d.ts +25 -0
- package/dist/src/registry/diff.d.ts.map +1 -0
- package/dist/src/registry/diff.js +497 -0
- package/dist/src/registry/diff.js.map +1 -0
- package/dist/src/registry/handlers/check.d.ts +57 -0
- package/dist/src/registry/handlers/check.d.ts.map +1 -0
- package/dist/src/registry/handlers/check.js +181 -0
- package/dist/src/registry/handlers/check.js.map +1 -0
- package/dist/src/registry/handlers/diff.d.ts +33 -0
- package/dist/src/registry/handlers/diff.d.ts.map +1 -0
- package/dist/src/registry/handlers/diff.js +61 -0
- package/dist/src/registry/handlers/diff.js.map +1 -0
- package/dist/src/registry/handlers/generate.d.ts +87 -0
- package/dist/src/registry/handlers/generate.d.ts.map +1 -0
- package/dist/src/registry/handlers/generate.js +223 -0
- package/dist/src/registry/handlers/generate.js.map +1 -0
- package/dist/src/registry/handlers/list.d.ts +36 -0
- package/dist/src/registry/handlers/list.d.ts.map +1 -0
- package/dist/src/registry/handlers/list.js +84 -0
- package/dist/src/registry/handlers/list.js.map +1 -0
- package/dist/src/registry/parse-provenance.d.ts +63 -0
- package/dist/src/registry/parse-provenance.d.ts.map +1 -0
- package/dist/src/registry/parse-provenance.js +182 -0
- package/dist/src/registry/parse-provenance.js.map +1 -0
- package/dist/src/registry/source-hash.d.ts +28 -0
- package/dist/src/registry/source-hash.d.ts.map +1 -0
- package/dist/src/registry/source-hash.js +32 -0
- package/dist/src/registry/source-hash.js.map +1 -0
- package/dist/src/registry/types.d.ts +185 -0
- package/dist/src/registry/types.d.ts.map +1 -0
- package/dist/src/registry/types.js +22 -0
- package/dist/src/registry/types.js.map +1 -0
- package/dist/src/runtime/compile.d.ts +38 -0
- package/dist/src/runtime/compile.d.ts.map +1 -0
- package/dist/src/runtime/compile.js +45 -0
- package/dist/src/runtime/compile.js.map +1 -0
- package/dist/src/runtime/errors.d.ts +25 -0
- package/dist/src/runtime/errors.d.ts.map +1 -0
- package/dist/src/runtime/errors.js +43 -0
- package/dist/src/runtime/errors.js.map +1 -0
- package/dist/src/runtime/normalize-issues.d.ts +65 -0
- package/dist/src/runtime/normalize-issues.d.ts.map +1 -0
- package/dist/src/runtime/normalize-issues.js +208 -0
- package/dist/src/runtime/normalize-issues.js.map +1 -0
- package/dist/src/runtime/parse.d.ts +62 -0
- package/dist/src/runtime/parse.d.ts.map +1 -0
- package/dist/src/runtime/parse.js +107 -0
- package/dist/src/runtime/parse.js.map +1 -0
- package/dist/src/runtime/strip-defaults.d.ts +51 -0
- package/dist/src/runtime/strip-defaults.d.ts.map +1 -0
- package/dist/src/runtime/strip-defaults.js +81 -0
- package/dist/src/runtime/strip-defaults.js.map +1 -0
- package/dist/src/runtime/zod-compile.d.ts +27 -0
- package/dist/src/runtime/zod-compile.d.ts.map +1 -0
- package/dist/src/runtime/zod-compile.js +92 -0
- package/dist/src/runtime/zod-compile.js.map +1 -0
- package/dist/src/types.d.ts +116 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +2 -0
- package/dist/src/types.js.map +1 -0
- package/docs/ABSENCE_SEMANTICS.md +37 -0
- package/docs/BENCHMARKS.md +64 -0
- package/docs/COMPOSITION.md +206 -0
- package/docs/DIFF_CLASSIFICATION.md +137 -0
- package/docs/EXAMPLES.md +221 -0
- package/docs/HEADER_FORMAT.md +66 -0
- package/docs/INVARIANTS.md +58 -0
- package/docs/IR_CONTRACT.md +67 -0
- package/docs/ISSUE_CODES.md +99 -0
- package/docs/JSON_SCHEMA_MAPPING.md +149 -0
- package/docs/MIGRATIONS.md +406 -0
- package/docs/MIGRATION_GUIDE.md +150 -0
- package/docs/OPENAPI_MAPPING.md +66 -0
- package/docs/REGISTRY.md +336 -0
- package/docs/RUNTIME.md +279 -0
- package/docs/SCOPE.md +119 -0
- package/docs/USAGE.md +376 -0
- package/docs/ZOD_MODIFIER_ORDERING.md +77 -0
- package/package.json +45 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"array.d.ts","sourceRoot":"","sources":["../../../src/builders/array.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5D,OAAO,EAAE,MAAM,EAAE,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAEjD,qBAAa,WAAW,CAAC,CAAC,SAAS,SAAS,CAAE,SAAQ,MAAM,CAC1D,KAAK,CAAC,CAAC,CAAC,EAAE,EACV,MAAM,CAAC,CAAC,CAAC,EAAE,EACX,UAAU,EACV,UAAU,CACX;IAEG,OAAO,CAAC,QAAQ,CAAC,aAAa;gBAAb,aAAa,EAAE,CAAC,EACjC,IAAI,CAAC,EAAE,SAAS;IAKlB,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI;IAIvC,IAAI,OAAO,IAAI,CAAC,CAEf;IAED,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC;IAQlC,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC;CAOnC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { Schema } from "./schema.js";
|
|
2
|
+
export class ArraySchema extends Schema {
|
|
3
|
+
elementSchema;
|
|
4
|
+
constructor(elementSchema, node) {
|
|
5
|
+
super(node ?? { kind: "array", element: elementSchema.node });
|
|
6
|
+
this.elementSchema = elementSchema;
|
|
7
|
+
}
|
|
8
|
+
clone(node) {
|
|
9
|
+
return new ArraySchema(this.elementSchema, node);
|
|
10
|
+
}
|
|
11
|
+
get element() {
|
|
12
|
+
return this.elementSchema;
|
|
13
|
+
}
|
|
14
|
+
min(items) {
|
|
15
|
+
return this.withRefinement({
|
|
16
|
+
kind: "portable",
|
|
17
|
+
name: "minItems",
|
|
18
|
+
params: { value: items },
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
max(items) {
|
|
22
|
+
return this.withRefinement({
|
|
23
|
+
kind: "portable",
|
|
24
|
+
name: "maxItems",
|
|
25
|
+
params: { value: items },
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=array.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"array.js","sourceRoot":"","sources":["../../../src/builders/array.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAkB,MAAM,aAAa,CAAC;AAGrD,MAAM,OAAO,WAAiC,SAAQ,MAKrD;IAEoB;IADnB,YACmB,aAAgB,EACjC,IAAgB;QAEhB,KAAK,CAAC,IAAI,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC;QAH7C,kBAAa,GAAb,aAAa,CAAG;IAInC,CAAC;IAES,KAAK,CAAC,IAAgB;QAC9B,OAAO,IAAI,WAAW,CAAI,IAAI,CAAC,aAAa,EAAE,IAAiB,CAAS,CAAC;IAC3E,CAAC;IAED,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED,GAAG,CAAC,KAAa;QACf,OAAO,IAAI,CAAC,cAAc,CAAC;YACzB,IAAI,EAAE,UAAU;YAChB,IAAI,EAAE,UAAU;YAChB,MAAM,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE;SACzB,CAAC,CAAC;IACL,CAAC;IAED,GAAG,CAAC,KAAa;QACf,OAAO,IAAI,CAAC,cAAc,CAAC;YACzB,IAAI,EAAE,UAAU;YAChB,IAAI,EAAE,UAAU;YAChB,MAAM,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE;SACzB,CAAC,CAAC;IACL,CAAC;CACF"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import type { ObjectNode, SchemaNode } from "../ir/nodes.js";
|
|
2
|
+
import { Schema } from "./schema.js";
|
|
3
|
+
import type { ExtendShape, InferObjectInput, InferObjectOutput, Mask, MergeLeftShape, MergeOptions, MergeRightShape, MergeThrowShape, OmitShape, OverrideMask, OverrideShape, PartialByShape, PartialShape, PickShape, RawShape, RequiredByShape, RequiredShape } from "../types.js";
|
|
4
|
+
export declare class ObjectSchema<S extends RawShape> extends Schema<InferObjectInput<S>, InferObjectOutput<S>, "required", "required"> {
|
|
5
|
+
private readonly shape;
|
|
6
|
+
constructor(shape: S, node?: ObjectNode);
|
|
7
|
+
protected clone(node: SchemaNode): this;
|
|
8
|
+
/** Access the original shape map (preserves subclass-specific methods). */
|
|
9
|
+
get fields(): Readonly<S>;
|
|
10
|
+
strict(): ObjectSchema<S>;
|
|
11
|
+
stripUnknown(): ObjectSchema<S>;
|
|
12
|
+
passthrough(): ObjectSchema<S>;
|
|
13
|
+
private withUnknownKeys;
|
|
14
|
+
/**
|
|
15
|
+
* Add new fields to this object. Decision #1: throws if any key in the
|
|
16
|
+
* extension already exists in the base. To deliberately replace a field,
|
|
17
|
+
* use {@link override}.
|
|
18
|
+
*/
|
|
19
|
+
extend<E extends RawShape>(extension: E): ObjectSchema<ExtendShape<S, E>>;
|
|
20
|
+
/**
|
|
21
|
+
* Keep only the named keys. Decision #5: throws on any key not in the base.
|
|
22
|
+
*/
|
|
23
|
+
pick<M extends Mask<S>>(keys: M): ObjectSchema<PickShape<S, M>>;
|
|
24
|
+
/**
|
|
25
|
+
* Drop the named keys. Decision #5: throws on any key not in the base.
|
|
26
|
+
*/
|
|
27
|
+
omit<M extends Mask<S>>(keys: M): ObjectSchema<OmitShape<S, M>>;
|
|
28
|
+
/**
|
|
29
|
+
* Make fields optional. Decision #6 + #9: strips `default` from affected
|
|
30
|
+
* fields (symmetric with {@link required}). Defaults are explicitly NOT
|
|
31
|
+
* preserved — a partial schema should not silently inject defaults into a
|
|
32
|
+
* PATCH/update payload.
|
|
33
|
+
*/
|
|
34
|
+
partial(): ObjectSchema<PartialShape<S>>;
|
|
35
|
+
partial<M extends Mask<S>>(keys: M): ObjectSchema<PartialByShape<S, M>>;
|
|
36
|
+
/**
|
|
37
|
+
* Make fields required. Decision #8 + #9: strips both `optional` AND
|
|
38
|
+
* `default` from affected fields (symmetric with {@link partial}).
|
|
39
|
+
*/
|
|
40
|
+
required(): ObjectSchema<RequiredShape<S>>;
|
|
41
|
+
required<M extends Mask<S>>(keys: M): ObjectSchema<RequiredByShape<S, M>>;
|
|
42
|
+
/**
|
|
43
|
+
* Combine two object schemas. Decision #3 + #13: conflicts in fields OR
|
|
44
|
+
* in unknown-key policy throw by default; resolve explicitly with the
|
|
45
|
+
* `conflict` / `unknownKeys` options.
|
|
46
|
+
*/
|
|
47
|
+
merge<Other extends RawShape>(other: ObjectSchema<Other>, options?: MergeOptions & {
|
|
48
|
+
conflict?: "throw";
|
|
49
|
+
}): ObjectSchema<MergeThrowShape<S, Other>>;
|
|
50
|
+
merge<Other extends RawShape>(other: ObjectSchema<Other>, options: MergeOptions & {
|
|
51
|
+
conflict: "left";
|
|
52
|
+
}): ObjectSchema<MergeLeftShape<S, Other>>;
|
|
53
|
+
merge<Other extends RawShape>(other: ObjectSchema<Other>, options: MergeOptions & {
|
|
54
|
+
conflict: "right";
|
|
55
|
+
}): ObjectSchema<MergeRightShape<S, Other>>;
|
|
56
|
+
/**
|
|
57
|
+
* Replace existing fields' schemas. Decision #2: throws if any key in the
|
|
58
|
+
* override is NOT in the base. To add new fields, use {@link extend}.
|
|
59
|
+
*/
|
|
60
|
+
override<O extends OverrideMask<S>>(overrides: O): ObjectSchema<OverrideShape<S, O>>;
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=object.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"object.d.ts","sourceRoot":"","sources":["../../../src/builders/object.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
import { Schema } from "./schema.js";
|
|
2
|
+
export class ObjectSchema extends Schema {
|
|
3
|
+
shape;
|
|
4
|
+
constructor(shape, node) {
|
|
5
|
+
super(node ?? {
|
|
6
|
+
kind: "object",
|
|
7
|
+
fields: mapShapeToFields(shape),
|
|
8
|
+
unknownKeys: "strict",
|
|
9
|
+
});
|
|
10
|
+
this.shape = shape;
|
|
11
|
+
}
|
|
12
|
+
clone(node) {
|
|
13
|
+
return new ObjectSchema(this.shape, node);
|
|
14
|
+
}
|
|
15
|
+
/** Access the original shape map (preserves subclass-specific methods). */
|
|
16
|
+
get fields() {
|
|
17
|
+
return this.shape;
|
|
18
|
+
}
|
|
19
|
+
// ---- Unknown-key policy (strict is the default) ----
|
|
20
|
+
strict() {
|
|
21
|
+
return this.withUnknownKeys("strict");
|
|
22
|
+
}
|
|
23
|
+
stripUnknown() {
|
|
24
|
+
return this.withUnknownKeys("stripUnknown");
|
|
25
|
+
}
|
|
26
|
+
passthrough() {
|
|
27
|
+
return this.withUnknownKeys("passthrough");
|
|
28
|
+
}
|
|
29
|
+
withUnknownKeys(policy) {
|
|
30
|
+
const current = this.node;
|
|
31
|
+
return new ObjectSchema(this.shape, {
|
|
32
|
+
...current,
|
|
33
|
+
unknownKeys: policy,
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
// ===========================================================================
|
|
37
|
+
// Composition operators (v0.5) — see docs/COMPOSITION.md for the contract.
|
|
38
|
+
//
|
|
39
|
+
// All operators:
|
|
40
|
+
// - return a NEW ObjectSchema (no mutation)
|
|
41
|
+
// - drop top-level metadata (id / version / description / deprecated) —
|
|
42
|
+
// callers must re-tag the composed result
|
|
43
|
+
// - preserve field-level metadata
|
|
44
|
+
// - fail loudly on collisions / unknown keys / missing keys
|
|
45
|
+
// ===========================================================================
|
|
46
|
+
/**
|
|
47
|
+
* Add new fields to this object. Decision #1: throws if any key in the
|
|
48
|
+
* extension already exists in the base. To deliberately replace a field,
|
|
49
|
+
* use {@link override}.
|
|
50
|
+
*/
|
|
51
|
+
extend(extension) {
|
|
52
|
+
const collisions = Object.keys(extension).filter((k) => k in this.shape);
|
|
53
|
+
if (collisions.length > 0) {
|
|
54
|
+
throw new Error(`ObjectSchema.extend: key${collisions.length === 1 ? "" : "s"} already exists in base — ${formatKeys(collisions)}. Use .override() to replace deliberately, or .merge() with an explicit conflict policy.`);
|
|
55
|
+
}
|
|
56
|
+
const newShape = { ...this.shape, ...extension };
|
|
57
|
+
return composedObject(newShape, currentUnknownKeys(this.node));
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Keep only the named keys. Decision #5: throws on any key not in the base.
|
|
61
|
+
*/
|
|
62
|
+
pick(keys) {
|
|
63
|
+
assertMaskKeysInShape("pick", keys, this.shape);
|
|
64
|
+
const newShape = {};
|
|
65
|
+
for (const key of Object.keys(keys)) {
|
|
66
|
+
if (keys[key] === true) {
|
|
67
|
+
newShape[key] = this.shape[key];
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return composedObject(newShape, currentUnknownKeys(this.node));
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Drop the named keys. Decision #5: throws on any key not in the base.
|
|
74
|
+
*/
|
|
75
|
+
omit(keys) {
|
|
76
|
+
assertMaskKeysInShape("omit", keys, this.shape);
|
|
77
|
+
const newShape = {};
|
|
78
|
+
for (const key of Object.keys(this.shape)) {
|
|
79
|
+
if (keys[key] !== true) {
|
|
80
|
+
newShape[key] = this.shape[key];
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return composedObject(newShape, currentUnknownKeys(this.node));
|
|
84
|
+
}
|
|
85
|
+
partial(keys) {
|
|
86
|
+
if (keys !== undefined)
|
|
87
|
+
assertMaskKeysInShape("partial", keys, this.shape);
|
|
88
|
+
const newShape = {};
|
|
89
|
+
for (const key of Object.keys(this.shape)) {
|
|
90
|
+
const affected = keys === undefined || keys[key] === true;
|
|
91
|
+
newShape[key] = affected
|
|
92
|
+
? makePartial(this.shape[key])
|
|
93
|
+
: this.shape[key];
|
|
94
|
+
}
|
|
95
|
+
return composedObject(newShape, currentUnknownKeys(this.node));
|
|
96
|
+
}
|
|
97
|
+
required(keys) {
|
|
98
|
+
if (keys !== undefined)
|
|
99
|
+
assertMaskKeysInShape("required", keys, this.shape);
|
|
100
|
+
const newShape = {};
|
|
101
|
+
for (const key of Object.keys(this.shape)) {
|
|
102
|
+
const affected = keys === undefined || keys[key] === true;
|
|
103
|
+
newShape[key] = affected
|
|
104
|
+
? makeRequired(this.shape[key])
|
|
105
|
+
: this.shape[key];
|
|
106
|
+
}
|
|
107
|
+
return composedObject(newShape, currentUnknownKeys(this.node));
|
|
108
|
+
}
|
|
109
|
+
// Implementation signature — wider than any single overload because the
|
|
110
|
+
// narrowed return types from the overloads (MergeThrowShape /
|
|
111
|
+
// MergeLeftShape / MergeRightShape) aren't assignable to each other under
|
|
112
|
+
// ObjectSchema's private-field-induced invariance. `any` here is the
|
|
113
|
+
// pragmatic escape; callers only see the typed overloads.
|
|
114
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
115
|
+
merge(other, options = {}) {
|
|
116
|
+
const conflictPolicy = options.conflict ?? "throw";
|
|
117
|
+
const unknownPolicy = options.unknownKeys ?? "throw";
|
|
118
|
+
const otherShape = other.fields;
|
|
119
|
+
// Field-level resolution
|
|
120
|
+
const newShape = { ...this.shape };
|
|
121
|
+
const fieldCollisions = [];
|
|
122
|
+
for (const key of Object.keys(otherShape)) {
|
|
123
|
+
if (key in this.shape) {
|
|
124
|
+
if (conflictPolicy === "throw") {
|
|
125
|
+
fieldCollisions.push(key);
|
|
126
|
+
}
|
|
127
|
+
else if (conflictPolicy === "right") {
|
|
128
|
+
newShape[key] = otherShape[key];
|
|
129
|
+
}
|
|
130
|
+
// "left" → keep existing
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
newShape[key] = otherShape[key];
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
if (fieldCollisions.length > 0) {
|
|
137
|
+
throw new Error(`ObjectSchema.merge: field${fieldCollisions.length === 1 ? "" : "s"} ${formatKeys(fieldCollisions)} ${fieldCollisions.length === 1 ? "exists" : "exist"} in both operands. Pass { conflict: "left" } or { conflict: "right" } to resolve.`);
|
|
138
|
+
}
|
|
139
|
+
// unknownKeys resolution
|
|
140
|
+
const leftPolicy = currentUnknownKeys(this.node);
|
|
141
|
+
const rightPolicy = currentUnknownKeys(other.node);
|
|
142
|
+
let resolvedPolicy;
|
|
143
|
+
if (leftPolicy === rightPolicy) {
|
|
144
|
+
resolvedPolicy = leftPolicy;
|
|
145
|
+
}
|
|
146
|
+
else if (unknownPolicy === "throw") {
|
|
147
|
+
throw new Error(`ObjectSchema.merge: unknownKeys policies differ — left is "${leftPolicy}", right is "${rightPolicy}". Pass { unknownKeys: "left" } or { unknownKeys: "right" } to resolve.`);
|
|
148
|
+
}
|
|
149
|
+
else if (unknownPolicy === "left") {
|
|
150
|
+
resolvedPolicy = leftPolicy;
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
resolvedPolicy = rightPolicy;
|
|
154
|
+
}
|
|
155
|
+
return composedObject(newShape, resolvedPolicy);
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Replace existing fields' schemas. Decision #2: throws if any key in the
|
|
159
|
+
* override is NOT in the base. To add new fields, use {@link extend}.
|
|
160
|
+
*/
|
|
161
|
+
override(overrides) {
|
|
162
|
+
const unknown = Object.keys(overrides).filter((k) => !(k in this.shape));
|
|
163
|
+
if (unknown.length > 0) {
|
|
164
|
+
throw new Error(`ObjectSchema.override: key${unknown.length === 1 ? "" : "s"} ${formatKeys(unknown)} ${unknown.length === 1 ? "does" : "do"} not exist in base. Use .extend() to add new fields.`);
|
|
165
|
+
}
|
|
166
|
+
const newShape = { ...this.shape };
|
|
167
|
+
for (const key of Object.keys(overrides)) {
|
|
168
|
+
const replacement = overrides[key];
|
|
169
|
+
if (replacement !== undefined) {
|
|
170
|
+
newShape[key] = replacement;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
return composedObject(newShape, currentUnknownKeys(this.node));
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
// ===========================================================================
|
|
177
|
+
// helpers
|
|
178
|
+
// ===========================================================================
|
|
179
|
+
function mapShapeToFields(shape) {
|
|
180
|
+
const out = {};
|
|
181
|
+
for (const key of Object.keys(shape)) {
|
|
182
|
+
const field = shape[key];
|
|
183
|
+
out[key] = field.node;
|
|
184
|
+
}
|
|
185
|
+
return out;
|
|
186
|
+
}
|
|
187
|
+
function currentUnknownKeys(node) {
|
|
188
|
+
return node.unknownKeys;
|
|
189
|
+
}
|
|
190
|
+
function formatKeys(keys) {
|
|
191
|
+
return keys.map((k) => `'${k}'`).join(", ");
|
|
192
|
+
}
|
|
193
|
+
function assertMaskKeysInShape(op, mask, shape) {
|
|
194
|
+
const unknown = Object.keys(mask).filter((k) => !(k in shape));
|
|
195
|
+
if (unknown.length > 0) {
|
|
196
|
+
throw new Error(`ObjectSchema.${op}: key${unknown.length === 1 ? "" : "s"} ${formatKeys(unknown)} ${unknown.length === 1 ? "does" : "do"} not exist in base shape.`);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Construct a composed ObjectSchema. Decision #11: drops all top-level
|
|
201
|
+
* metadata so consumers re-tag explicitly via `.id()` / `.version()` /
|
|
202
|
+
* `.describe()`.
|
|
203
|
+
*/
|
|
204
|
+
function composedObject(shape, unknownKeys) {
|
|
205
|
+
const fields = {};
|
|
206
|
+
for (const key of Object.keys(shape)) {
|
|
207
|
+
fields[key] = shape[key].node;
|
|
208
|
+
}
|
|
209
|
+
const node = {
|
|
210
|
+
kind: "object",
|
|
211
|
+
fields,
|
|
212
|
+
unknownKeys,
|
|
213
|
+
};
|
|
214
|
+
return new ObjectSchema(shape, node);
|
|
215
|
+
}
|
|
216
|
+
// ===========================================================================
|
|
217
|
+
// Field-level mutators for partial / required (operate on an AnySchema
|
|
218
|
+
// instance by producing a new instance with adjusted modifiers + node).
|
|
219
|
+
// ===========================================================================
|
|
220
|
+
/**
|
|
221
|
+
* Build a partial version of a field: sets optional, strips default.
|
|
222
|
+
* Reaches in via the field's `node` and a new clone with adjusted modifiers.
|
|
223
|
+
* The underlying Schema subclass's `clone` builds the correct instance type.
|
|
224
|
+
*/
|
|
225
|
+
function makePartial(field) {
|
|
226
|
+
const oldMods = field.node.modifiers ?? {};
|
|
227
|
+
// Strip default; set optional (always true for partial).
|
|
228
|
+
const newMods = {
|
|
229
|
+
...oldMods,
|
|
230
|
+
optional: true,
|
|
231
|
+
};
|
|
232
|
+
delete newMods.default;
|
|
233
|
+
// Use the type-system escape hatch: clone is protected, but we own the
|
|
234
|
+
// composition flow and need to reach in to swap modifiers cleanly.
|
|
235
|
+
const newNode = withModifiers(field.node, newMods);
|
|
236
|
+
return cloneField(field, newNode);
|
|
237
|
+
}
|
|
238
|
+
function makeRequired(field) {
|
|
239
|
+
const oldMods = field.node.modifiers ?? {};
|
|
240
|
+
const newMods = { ...oldMods };
|
|
241
|
+
delete newMods.optional;
|
|
242
|
+
delete newMods.default;
|
|
243
|
+
const newNode = withModifiers(field.node, newMods);
|
|
244
|
+
return cloneField(field, newNode);
|
|
245
|
+
}
|
|
246
|
+
function withModifiers(node, modifiers) {
|
|
247
|
+
const next = { ...node, modifiers };
|
|
248
|
+
// If the modifiers object is now empty, drop the key to match v0.1's
|
|
249
|
+
// "modifiers undefined when none set" convention. Keeps IR canonical.
|
|
250
|
+
if (Object.keys(modifiers).length === 0) {
|
|
251
|
+
delete next.modifiers;
|
|
252
|
+
}
|
|
253
|
+
return next;
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Type-system gymnastic: Schema's `clone` is protected. We bridge via an
|
|
257
|
+
* exposed helper on Schema. (Defined as a static-ish utility colocated here
|
|
258
|
+
* to keep composition concerns visible in one place.)
|
|
259
|
+
*/
|
|
260
|
+
function cloneField(field, node) {
|
|
261
|
+
return field.clone(node);
|
|
262
|
+
}
|
|
263
|
+
//# sourceMappingURL=object.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"object.js","sourceRoot":"","sources":["../../../src/builders/object.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { BooleanNode, EnumNode, JsonValue, LiteralNode, NumberNode, SchemaNode, StringNode } from "../ir/nodes.js";
|
|
2
|
+
import { Schema } from "./schema.js";
|
|
3
|
+
export declare class StringSchema extends Schema<string, string, "required", "required"> {
|
|
4
|
+
constructor(node?: StringNode);
|
|
5
|
+
protected clone(node: SchemaNode): this;
|
|
6
|
+
min(length: number): StringSchema;
|
|
7
|
+
max(length: number): StringSchema;
|
|
8
|
+
length(length: number): StringSchema;
|
|
9
|
+
regex(pattern: RegExp): StringSchema;
|
|
10
|
+
email(): StringSchema;
|
|
11
|
+
uuid(): StringSchema;
|
|
12
|
+
url(): StringSchema;
|
|
13
|
+
}
|
|
14
|
+
export declare class NumberSchema extends Schema<number, number, "required", "required"> {
|
|
15
|
+
constructor(node?: NumberNode);
|
|
16
|
+
protected clone(node: SchemaNode): this;
|
|
17
|
+
int(): NumberSchema;
|
|
18
|
+
min(value: number): NumberSchema;
|
|
19
|
+
max(value: number): NumberSchema;
|
|
20
|
+
gt(value: number): NumberSchema;
|
|
21
|
+
lt(value: number): NumberSchema;
|
|
22
|
+
multipleOf(value: number): NumberSchema;
|
|
23
|
+
}
|
|
24
|
+
export declare class BooleanSchema extends Schema<boolean, boolean, "required", "required"> {
|
|
25
|
+
constructor(node?: BooleanNode);
|
|
26
|
+
protected clone(node: SchemaNode): this;
|
|
27
|
+
}
|
|
28
|
+
export declare class LiteralSchema<T extends JsonValue> extends Schema<T, T, "required", "required"> {
|
|
29
|
+
constructor(node: LiteralNode<T>);
|
|
30
|
+
protected clone(node: SchemaNode): this;
|
|
31
|
+
}
|
|
32
|
+
export declare class EnumSchema<T extends string | number> extends Schema<T, T, "required", "required"> {
|
|
33
|
+
constructor(node: EnumNode<T>);
|
|
34
|
+
protected clone(node: SchemaNode): this;
|
|
35
|
+
get values(): readonly T[];
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=primitives.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"primitives.d.ts","sourceRoot":"","sources":["../../../src/builders/primitives.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,QAAQ,EACR,SAAS,EACT,WAAW,EACX,UAAU,EACV,UAAU,EACV,UAAU,EACX,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAIrC,qBAAa,YAAa,SAAQ,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,CAAC;gBAClE,IAAI,GAAE,UAA+B;IAIjD,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI;IAIvC,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY;IAQjC,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY;IAQjC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY;IAQpC,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY;IAQpC,KAAK,IAAI,YAAY;IAIrB,IAAI,IAAI,YAAY;IAIpB,GAAG,IAAI,YAAY;CAGpB;AAID,qBAAa,YAAa,SAAQ,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,CAAC;gBAClE,IAAI,GAAE,UAA+B;IAIjD,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI;IAIvC,GAAG,IAAI,YAAY;IAInB,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY;IAQhC,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY;IAQhC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY;IAQ/B,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY;IAQ/B,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY;CAOxC;AAID,qBAAa,aAAc,SAAQ,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,CAAC;gBACrE,IAAI,GAAE,WAAiC;IAInD,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI;CAGxC;AAID,qBAAa,aAAa,CAAC,CAAC,SAAS,SAAS,CAAE,SAAQ,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,UAAU,EAAE,UAAU,CAAC;gBAC9E,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC;IAIhC,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI;CAGxC;AAID,qBAAa,UAAU,CACrB,CAAC,SAAS,MAAM,GAAG,MAAM,CACzB,SAAQ,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,UAAU,EAAE,UAAU,CAAC;gBAChC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;IAI7B,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI;IAIvC,IAAI,MAAM,IAAI,SAAS,CAAC,EAAE,CAEzB;CACF"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { Schema } from "./schema.js";
|
|
2
|
+
// ---------- string ----------
|
|
3
|
+
export class StringSchema extends Schema {
|
|
4
|
+
constructor(node = { kind: "string" }) {
|
|
5
|
+
super(node);
|
|
6
|
+
}
|
|
7
|
+
clone(node) {
|
|
8
|
+
return new StringSchema(node);
|
|
9
|
+
}
|
|
10
|
+
min(length) {
|
|
11
|
+
return this.withRefinement({
|
|
12
|
+
kind: "portable",
|
|
13
|
+
name: "minLength",
|
|
14
|
+
params: { value: length },
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
max(length) {
|
|
18
|
+
return this.withRefinement({
|
|
19
|
+
kind: "portable",
|
|
20
|
+
name: "maxLength",
|
|
21
|
+
params: { value: length },
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
length(length) {
|
|
25
|
+
return this.withRefinement({
|
|
26
|
+
kind: "portable",
|
|
27
|
+
name: "length",
|
|
28
|
+
params: { value: length },
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
regex(pattern) {
|
|
32
|
+
return this.withRefinement({
|
|
33
|
+
kind: "portable",
|
|
34
|
+
name: "regex",
|
|
35
|
+
params: { source: pattern.source, flags: pattern.flags },
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
email() {
|
|
39
|
+
return this.withRefinement({ kind: "portable", name: "email" });
|
|
40
|
+
}
|
|
41
|
+
uuid() {
|
|
42
|
+
return this.withRefinement({ kind: "portable", name: "uuid" });
|
|
43
|
+
}
|
|
44
|
+
url() {
|
|
45
|
+
return this.withRefinement({ kind: "portable", name: "url" });
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
// ---------- number ----------
|
|
49
|
+
export class NumberSchema extends Schema {
|
|
50
|
+
constructor(node = { kind: "number" }) {
|
|
51
|
+
super(node);
|
|
52
|
+
}
|
|
53
|
+
clone(node) {
|
|
54
|
+
return new NumberSchema(node);
|
|
55
|
+
}
|
|
56
|
+
int() {
|
|
57
|
+
return this.withRefinement({ kind: "portable", name: "int" });
|
|
58
|
+
}
|
|
59
|
+
min(value) {
|
|
60
|
+
return this.withRefinement({
|
|
61
|
+
kind: "portable",
|
|
62
|
+
name: "min",
|
|
63
|
+
params: { value },
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
max(value) {
|
|
67
|
+
return this.withRefinement({
|
|
68
|
+
kind: "portable",
|
|
69
|
+
name: "max",
|
|
70
|
+
params: { value },
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
gt(value) {
|
|
74
|
+
return this.withRefinement({
|
|
75
|
+
kind: "portable",
|
|
76
|
+
name: "gt",
|
|
77
|
+
params: { value },
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
lt(value) {
|
|
81
|
+
return this.withRefinement({
|
|
82
|
+
kind: "portable",
|
|
83
|
+
name: "lt",
|
|
84
|
+
params: { value },
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
multipleOf(value) {
|
|
88
|
+
return this.withRefinement({
|
|
89
|
+
kind: "portable",
|
|
90
|
+
name: "multipleOf",
|
|
91
|
+
params: { value },
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
// ---------- boolean ----------
|
|
96
|
+
export class BooleanSchema extends Schema {
|
|
97
|
+
constructor(node = { kind: "boolean" }) {
|
|
98
|
+
super(node);
|
|
99
|
+
}
|
|
100
|
+
clone(node) {
|
|
101
|
+
return new BooleanSchema(node);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
// ---------- literal ----------
|
|
105
|
+
export class LiteralSchema extends Schema {
|
|
106
|
+
constructor(node) {
|
|
107
|
+
super(node);
|
|
108
|
+
}
|
|
109
|
+
clone(node) {
|
|
110
|
+
return new LiteralSchema(node);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
// ---------- enum ----------
|
|
114
|
+
export class EnumSchema extends Schema {
|
|
115
|
+
constructor(node) {
|
|
116
|
+
super(node);
|
|
117
|
+
}
|
|
118
|
+
clone(node) {
|
|
119
|
+
return new EnumSchema(node);
|
|
120
|
+
}
|
|
121
|
+
get values() {
|
|
122
|
+
return this.node.values;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=primitives.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"primitives.js","sourceRoot":"","sources":["../../../src/builders/primitives.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { JsonValue } from "../ir/nodes.js";
|
|
2
|
+
import { ArraySchema } from "./array.js";
|
|
3
|
+
import { ObjectSchema } from "./object.js";
|
|
4
|
+
import { BooleanSchema, EnumSchema, LiteralSchema, NumberSchema, StringSchema } from "./primitives.js";
|
|
5
|
+
import type { AnySchema } from "./schema.js";
|
|
6
|
+
import type { Infer as InferType, Input as InputType, Output as OutputType, RawShape } from "../types.js";
|
|
7
|
+
/**
|
|
8
|
+
* The `s` namespace is the public DSL surface. Builders produce IR; type
|
|
9
|
+
* helpers (`s.infer`, `s.input`, `s.output`) extract static types. Keep the
|
|
10
|
+
* runtime and type sides aligned — adding a new builder requires no type
|
|
11
|
+
* helper change, but the existence of new IR node kinds may require it.
|
|
12
|
+
*/
|
|
13
|
+
export declare const s: {
|
|
14
|
+
string(): StringSchema;
|
|
15
|
+
number(): NumberSchema;
|
|
16
|
+
boolean(): BooleanSchema;
|
|
17
|
+
literal<T extends JsonValue>(value: T): LiteralSchema<T>;
|
|
18
|
+
enum<T extends readonly [string, ...string[]] | readonly [number, ...number[]]>(values: T): EnumSchema<T[number]>;
|
|
19
|
+
array<E extends AnySchema>(element: E): ArraySchema<E>;
|
|
20
|
+
object<S extends RawShape>(shape: S): ObjectSchema<S>;
|
|
21
|
+
};
|
|
22
|
+
export declare namespace s {
|
|
23
|
+
type infer<T> = InferType<T>;
|
|
24
|
+
type input<T> = InputType<T>;
|
|
25
|
+
type output<T> = OutputType<T>;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=s.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"s.d.ts","sourceRoot":"","sources":["../../../src/builders/s.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EACL,aAAa,EACb,UAAU,EACV,aAAa,EACb,YAAY,EACZ,YAAY,EACb,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,KAAK,EACV,KAAK,IAAI,SAAS,EAClB,KAAK,IAAI,SAAS,EAClB,MAAM,IAAI,UAAU,EACpB,QAAQ,EACT,MAAM,aAAa,CAAC;AAErB;;;;;GAKG;AACH,eAAO,MAAM,CAAC;cACF,YAAY;cAIZ,YAAY;eAIX,aAAa;YAIhB,CAAC,SAAS,SAAS,SAAS,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC;SAInD,CAAC,SAAS,SAAS,CAAC,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,UACpE,CAAC,GACR,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;UAUlB,CAAC,SAAS,SAAS,WAAW,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC;WAI/C,CAAC,SAAS,QAAQ,SAAS,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC;CAGtD,CAAC;AAMF,yBAAiB,CAAC,CAAC;IACjB,KAAY,KAAK,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC;IACpC,KAAY,KAAK,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC;IACpC,KAAY,MAAM,CAAC,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;CACvC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { ArraySchema } from "./array.js";
|
|
2
|
+
import { ObjectSchema } from "./object.js";
|
|
3
|
+
import { BooleanSchema, EnumSchema, LiteralSchema, NumberSchema, StringSchema, } from "./primitives.js";
|
|
4
|
+
/**
|
|
5
|
+
* The `s` namespace is the public DSL surface. Builders produce IR; type
|
|
6
|
+
* helpers (`s.infer`, `s.input`, `s.output`) extract static types. Keep the
|
|
7
|
+
* runtime and type sides aligned — adding a new builder requires no type
|
|
8
|
+
* helper change, but the existence of new IR node kinds may require it.
|
|
9
|
+
*/
|
|
10
|
+
export const s = {
|
|
11
|
+
string() {
|
|
12
|
+
return new StringSchema();
|
|
13
|
+
},
|
|
14
|
+
number() {
|
|
15
|
+
return new NumberSchema();
|
|
16
|
+
},
|
|
17
|
+
boolean() {
|
|
18
|
+
return new BooleanSchema();
|
|
19
|
+
},
|
|
20
|
+
literal(value) {
|
|
21
|
+
return new LiteralSchema({ kind: "literal", value });
|
|
22
|
+
},
|
|
23
|
+
enum(values) {
|
|
24
|
+
if (values.length === 0) {
|
|
25
|
+
throw new Error("s.enum() requires at least one value");
|
|
26
|
+
}
|
|
27
|
+
return new EnumSchema({
|
|
28
|
+
kind: "enum",
|
|
29
|
+
values: values,
|
|
30
|
+
});
|
|
31
|
+
},
|
|
32
|
+
array(element) {
|
|
33
|
+
return new ArraySchema(element);
|
|
34
|
+
},
|
|
35
|
+
object(shape) {
|
|
36
|
+
return new ObjectSchema(shape);
|
|
37
|
+
},
|
|
38
|
+
};
|
|
39
|
+
//# sourceMappingURL=s.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"s.js","sourceRoot":"","sources":["../../../src/builders/s.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EACL,aAAa,EACb,UAAU,EACV,aAAa,EACb,YAAY,EACZ,YAAY,GACb,MAAM,iBAAiB,CAAC;AASzB;;;;;GAKG;AACH,MAAM,CAAC,MAAM,CAAC,GAAG;IACf,MAAM;QACJ,OAAO,IAAI,YAAY,EAAE,CAAC;IAC5B,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,YAAY,EAAE,CAAC;IAC5B,CAAC;IAED,OAAO;QACL,OAAO,IAAI,aAAa,EAAE,CAAC;IAC7B,CAAC;IAED,OAAO,CAAsB,KAAQ;QACnC,OAAO,IAAI,aAAa,CAAI,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED,IAAI,CACF,MAAS;QAET,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAC1D,CAAC;QACD,OAAO,IAAI,UAAU,CAAY;YAC/B,IAAI,EAAE,MAAM;YACZ,MAAM,EAAE,MAA8B;SACvC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAsB,OAAU;QACnC,OAAO,IAAI,WAAW,CAAI,OAAO,CAAC,CAAC;IACrC,CAAC;IAED,MAAM,CAAqB,KAAQ;QACjC,OAAO,IAAI,YAAY,CAAI,KAAK,CAAC,CAAC;IACpC,CAAC;CACF,CAAC"}
|