@oyinlola141/lattice-schema 0.1.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/README.md +19 -0
- package/dist/.tsbuildinfo +1 -0
- package/dist/index.d.ts +40 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +37 -0
- package/dist/index.js.map +1 -0
- package/dist/schemaBase/index.d.ts +10 -0
- package/dist/schemaBase/index.d.ts.map +1 -0
- package/dist/schemaBase/index.js +9 -0
- package/dist/schemaBase/index.js.map +1 -0
- package/dist/schemaBase/schemaBase.context.d.ts +17 -0
- package/dist/schemaBase/schemaBase.context.d.ts.map +1 -0
- package/dist/schemaBase/schemaBase.context.js +44 -0
- package/dist/schemaBase/schemaBase.context.js.map +1 -0
- package/dist/schemaBase/schemaBase.core.d.ts +52 -0
- package/dist/schemaBase/schemaBase.core.d.ts.map +1 -0
- package/dist/schemaBase/schemaBase.core.js +99 -0
- package/dist/schemaBase/schemaBase.core.js.map +1 -0
- package/dist/schemaBase/schemaBase.result.d.ts +17 -0
- package/dist/schemaBase/schemaBase.result.d.ts.map +1 -0
- package/dist/schemaBase/schemaBase.result.js +29 -0
- package/dist/schemaBase/schemaBase.result.js.map +1 -0
- package/dist/schemaBase/schemaBase.type.d.ts +57 -0
- package/dist/schemaBase/schemaBase.type.d.ts.map +1 -0
- package/dist/schemaBase/schemaBase.type.js +7 -0
- package/dist/schemaBase/schemaBase.type.js.map +1 -0
- package/dist/schemaCoerce/index.d.ts +7 -0
- package/dist/schemaCoerce/index.d.ts.map +1 -0
- package/dist/schemaCoerce/index.js +7 -0
- package/dist/schemaCoerce/index.js.map +1 -0
- package/dist/schemaCoerce/schemaCoerce.core.d.ts +48 -0
- package/dist/schemaCoerce/schemaCoerce.core.d.ts.map +1 -0
- package/dist/schemaCoerce/schemaCoerce.core.js +126 -0
- package/dist/schemaCoerce/schemaCoerce.core.js.map +1 -0
- package/dist/schemaComposition/index.d.ts +10 -0
- package/dist/schemaComposition/index.d.ts.map +1 -0
- package/dist/schemaComposition/index.js +10 -0
- package/dist/schemaComposition/index.js.map +1 -0
- package/dist/schemaComposition/schemaEnum.core.d.ts +21 -0
- package/dist/schemaComposition/schemaEnum.core.d.ts.map +1 -0
- package/dist/schemaComposition/schemaEnum.core.js +41 -0
- package/dist/schemaComposition/schemaEnum.core.js.map +1 -0
- package/dist/schemaComposition/schemaIntersection.core.d.ts +21 -0
- package/dist/schemaComposition/schemaIntersection.core.d.ts.map +1 -0
- package/dist/schemaComposition/schemaIntersection.core.js +54 -0
- package/dist/schemaComposition/schemaIntersection.core.js.map +1 -0
- package/dist/schemaComposition/schemaLazy.core.d.ts +22 -0
- package/dist/schemaComposition/schemaLazy.core.d.ts.map +1 -0
- package/dist/schemaComposition/schemaLazy.core.js +33 -0
- package/dist/schemaComposition/schemaLazy.core.js.map +1 -0
- package/dist/schemaComposition/schemaUnion.core.d.ts +32 -0
- package/dist/schemaComposition/schemaUnion.core.d.ts.map +1 -0
- package/dist/schemaComposition/schemaUnion.core.js +89 -0
- package/dist/schemaComposition/schemaUnion.core.js.map +1 -0
- package/dist/schemaInference/index.d.ts +7 -0
- package/dist/schemaInference/index.d.ts.map +1 -0
- package/dist/schemaInference/index.js +7 -0
- package/dist/schemaInference/index.js.map +1 -0
- package/dist/schemaInference/schemaInfer.type.d.ts +27 -0
- package/dist/schemaInference/schemaInfer.type.d.ts.map +1 -0
- package/dist/schemaInference/schemaInfer.type.js +7 -0
- package/dist/schemaInference/schemaInfer.type.js.map +1 -0
- package/dist/schemaModifiers/index.d.ts +10 -0
- package/dist/schemaModifiers/index.d.ts.map +1 -0
- package/dist/schemaModifiers/index.js +10 -0
- package/dist/schemaModifiers/index.js.map +1 -0
- package/dist/schemaModifiers/schemaDefault.core.d.ts +20 -0
- package/dist/schemaModifiers/schemaDefault.core.d.ts.map +1 -0
- package/dist/schemaModifiers/schemaDefault.core.js +33 -0
- package/dist/schemaModifiers/schemaDefault.core.js.map +1 -0
- package/dist/schemaModifiers/schemaOptionalNullable.core.d.ts +30 -0
- package/dist/schemaModifiers/schemaOptionalNullable.core.d.ts.map +1 -0
- package/dist/schemaModifiers/schemaOptionalNullable.core.js +47 -0
- package/dist/schemaModifiers/schemaOptionalNullable.core.js.map +1 -0
- package/dist/schemaModifiers/schemaRefine.core.d.ts +21 -0
- package/dist/schemaModifiers/schemaRefine.core.d.ts.map +1 -0
- package/dist/schemaModifiers/schemaRefine.core.js +40 -0
- package/dist/schemaModifiers/schemaRefine.core.js.map +1 -0
- package/dist/schemaModifiers/schemaTransform.core.d.ts +20 -0
- package/dist/schemaModifiers/schemaTransform.core.d.ts.map +1 -0
- package/dist/schemaModifiers/schemaTransform.core.js +40 -0
- package/dist/schemaModifiers/schemaTransform.core.js.map +1 -0
- package/dist/schemaPrimitives/index.d.ts +12 -0
- package/dist/schemaPrimitives/index.d.ts.map +1 -0
- package/dist/schemaPrimitives/index.js +12 -0
- package/dist/schemaPrimitives/index.js.map +1 -0
- package/dist/schemaPrimitives/schemaBoolean.core.d.ts +26 -0
- package/dist/schemaPrimitives/schemaBoolean.core.d.ts.map +1 -0
- package/dist/schemaPrimitives/schemaBoolean.core.js +47 -0
- package/dist/schemaPrimitives/schemaBoolean.core.js.map +1 -0
- package/dist/schemaPrimitives/schemaLiteral.core.d.ts +19 -0
- package/dist/schemaPrimitives/schemaLiteral.core.d.ts.map +1 -0
- package/dist/schemaPrimitives/schemaLiteral.core.js +37 -0
- package/dist/schemaPrimitives/schemaLiteral.core.js.map +1 -0
- package/dist/schemaPrimitives/schemaNumber.core.d.ts +62 -0
- package/dist/schemaPrimitives/schemaNumber.core.d.ts.map +1 -0
- package/dist/schemaPrimitives/schemaNumber.core.js +191 -0
- package/dist/schemaPrimitives/schemaNumber.core.js.map +1 -0
- package/dist/schemaPrimitives/schemaSentinel.core.d.ts +53 -0
- package/dist/schemaPrimitives/schemaSentinel.core.d.ts.map +1 -0
- package/dist/schemaPrimitives/schemaSentinel.core.js +101 -0
- package/dist/schemaPrimitives/schemaSentinel.core.js.map +1 -0
- package/dist/schemaPrimitives/schemaString.core.d.ts +74 -0
- package/dist/schemaPrimitives/schemaString.core.d.ts.map +1 -0
- package/dist/schemaPrimitives/schemaString.core.js +208 -0
- package/dist/schemaPrimitives/schemaString.core.js.map +1 -0
- package/dist/schemaPrimitives/schemaTransform.core.d.ts +13 -0
- package/dist/schemaPrimitives/schemaTransform.core.d.ts.map +1 -0
- package/dist/schemaPrimitives/schemaTransform.core.js +31 -0
- package/dist/schemaPrimitives/schemaTransform.core.js.map +1 -0
- package/dist/schemaRoot/index.d.ts +7 -0
- package/dist/schemaRoot/index.d.ts.map +1 -0
- package/dist/schemaRoot/index.js +7 -0
- package/dist/schemaRoot/index.js.map +1 -0
- package/dist/schemaRoot/schemaRoot.namespace.d.ts +72 -0
- package/dist/schemaRoot/schemaRoot.namespace.d.ts.map +1 -0
- package/dist/schemaRoot/schemaRoot.namespace.js +79 -0
- package/dist/schemaRoot/schemaRoot.namespace.js.map +1 -0
- package/dist/schemaStructures/index.d.ts +12 -0
- package/dist/schemaStructures/index.d.ts.map +1 -0
- package/dist/schemaStructures/index.js +11 -0
- package/dist/schemaStructures/index.js.map +1 -0
- package/dist/schemaStructures/schemaArray.core.d.ts +36 -0
- package/dist/schemaStructures/schemaArray.core.d.ts.map +1 -0
- package/dist/schemaStructures/schemaArray.core.js +105 -0
- package/dist/schemaStructures/schemaArray.core.js.map +1 -0
- package/dist/schemaStructures/schemaMapSet.core.d.ts +31 -0
- package/dist/schemaStructures/schemaMapSet.core.d.ts.map +1 -0
- package/dist/schemaStructures/schemaMapSet.core.js +77 -0
- package/dist/schemaStructures/schemaMapSet.core.js.map +1 -0
- package/dist/schemaStructures/schemaObject.core.d.ts +66 -0
- package/dist/schemaStructures/schemaObject.core.d.ts.map +1 -0
- package/dist/schemaStructures/schemaObject.core.js +184 -0
- package/dist/schemaStructures/schemaObject.core.js.map +1 -0
- package/dist/schemaStructures/schemaRecord.core.d.ts +20 -0
- package/dist/schemaStructures/schemaRecord.core.d.ts.map +1 -0
- package/dist/schemaStructures/schemaRecord.core.js +66 -0
- package/dist/schemaStructures/schemaRecord.core.js.map +1 -0
- package/dist/schemaStructures/schemaTuple.core.d.ts +24 -0
- package/dist/schemaStructures/schemaTuple.core.d.ts.map +1 -0
- package/dist/schemaStructures/schemaTuple.core.js +60 -0
- package/dist/schemaStructures/schemaTuple.core.js.map +1 -0
- package/package.json +42 -0
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @latticejs/schema/structures/array
|
|
3
|
+
*
|
|
4
|
+
* Array schema with item validation and length constraints.
|
|
5
|
+
*/
|
|
6
|
+
import { Schema } from "../schemaBase/index.js";
|
|
7
|
+
import { addIssue, childContext } from "../schemaBase/index.js";
|
|
8
|
+
import { SchemaIssueCode } from "@latticejs/constants";
|
|
9
|
+
/**
|
|
10
|
+
* Schema for array values.
|
|
11
|
+
*/
|
|
12
|
+
export class ArraySchema extends Schema {
|
|
13
|
+
_type = "array";
|
|
14
|
+
_config;
|
|
15
|
+
constructor(config) {
|
|
16
|
+
super();
|
|
17
|
+
this._config = config;
|
|
18
|
+
}
|
|
19
|
+
_parse(ctx, input) {
|
|
20
|
+
if (!Array.isArray(input)) {
|
|
21
|
+
addIssue(ctx, {
|
|
22
|
+
code: SchemaIssueCode.INVALID_TYPE,
|
|
23
|
+
path: [...ctx.path],
|
|
24
|
+
message: `Expected array, received ${typeof input}`,
|
|
25
|
+
expected: "array",
|
|
26
|
+
received: typeof input,
|
|
27
|
+
});
|
|
28
|
+
throw new Error("Validation failed");
|
|
29
|
+
}
|
|
30
|
+
this._validateLength(ctx, input.length);
|
|
31
|
+
const result = [];
|
|
32
|
+
let failed = false;
|
|
33
|
+
for (let i = 0; i < input.length; i++) {
|
|
34
|
+
const childCtx = childContext(ctx, i);
|
|
35
|
+
try {
|
|
36
|
+
result.push(this._config.itemSchema._parse(childCtx, input[i]));
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
failed = true;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
if (failed) {
|
|
43
|
+
throw new Error("Validation failed");
|
|
44
|
+
}
|
|
45
|
+
return result;
|
|
46
|
+
}
|
|
47
|
+
_validateLength(ctx, length) {
|
|
48
|
+
const c = this._config;
|
|
49
|
+
let failed = false;
|
|
50
|
+
if (c.min !== undefined && length < c.min) {
|
|
51
|
+
addIssue(ctx, {
|
|
52
|
+
code: SchemaIssueCode.TOO_SMALL,
|
|
53
|
+
path: [...ctx.path],
|
|
54
|
+
message: `Array must have at least ${c.min} items`,
|
|
55
|
+
expected: `>= ${c.min}`,
|
|
56
|
+
received: String(length),
|
|
57
|
+
});
|
|
58
|
+
failed = true;
|
|
59
|
+
}
|
|
60
|
+
if (c.max !== undefined && length > c.max) {
|
|
61
|
+
addIssue(ctx, {
|
|
62
|
+
code: SchemaIssueCode.TOO_LARGE,
|
|
63
|
+
path: [...ctx.path],
|
|
64
|
+
message: `Array must have at most ${c.max} items`,
|
|
65
|
+
expected: `<= ${c.max}`,
|
|
66
|
+
received: String(length),
|
|
67
|
+
});
|
|
68
|
+
failed = true;
|
|
69
|
+
}
|
|
70
|
+
if (c.length !== undefined && length !== c.length) {
|
|
71
|
+
addIssue(ctx, {
|
|
72
|
+
code: SchemaIssueCode.INVALID_LENGTH,
|
|
73
|
+
path: [...ctx.path],
|
|
74
|
+
message: `Array must have exactly ${c.length} items`,
|
|
75
|
+
expected: String(c.length),
|
|
76
|
+
received: String(length),
|
|
77
|
+
});
|
|
78
|
+
failed = true;
|
|
79
|
+
}
|
|
80
|
+
if (failed) {
|
|
81
|
+
throw new Error("Validation failed");
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
/** Minimum number of items (inclusive). */
|
|
85
|
+
min(min) {
|
|
86
|
+
return new ArraySchema({ ...this._config, min });
|
|
87
|
+
}
|
|
88
|
+
/** Maximum number of items (inclusive). */
|
|
89
|
+
max(max) {
|
|
90
|
+
return new ArraySchema({ ...this._config, max });
|
|
91
|
+
}
|
|
92
|
+
/** Exact number of items. */
|
|
93
|
+
length(length) {
|
|
94
|
+
return new ArraySchema({ ...this._config, length });
|
|
95
|
+
}
|
|
96
|
+
/** Array must have at least one item. */
|
|
97
|
+
nonempty() {
|
|
98
|
+
return new ArraySchema({ ...this._config, min: 1 });
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
/** Creates an array schema from an item schema. */
|
|
102
|
+
export function arraySchema(itemSchema) {
|
|
103
|
+
return new ArraySchema({ itemSchema });
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=schemaArray.core.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schemaArray.core.js","sourceRoot":"","sources":["../../src/schemaStructures/schemaArray.core.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAEhD,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAUvD;;GAEG;AACH,MAAM,OAAO,WAAqB,SAAQ,MAAiB;IACzC,KAAK,GAAG,OAAO,CAAC;IACf,OAAO,CAA6B;IAErD,YAAY,MAAkC;QAC5C,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;IACxB,CAAC;IAEM,MAAM,CAAC,GAAuB,EAAE,KAAc;QACnD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1B,QAAQ,CAAC,GAAG,EAAE;gBACZ,IAAI,EAAE,eAAe,CAAC,YAAY;gBAClC,IAAI,EAAE,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC;gBACnB,OAAO,EAAE,4BAA4B,OAAO,KAAK,EAAE;gBACnD,QAAQ,EAAE,OAAO;gBACjB,QAAQ,EAAE,OAAO,KAAK;aACvB,CAAC,CAAC;YACH,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;QACvC,CAAC;QAED,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QAExC,MAAM,MAAM,GAAc,EAAE,CAAC;QAC7B,IAAI,MAAM,GAAG,KAAK,CAAC;QACnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YACtC,IAAI,CAAC;gBACH,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAClE,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,GAAG,IAAI,CAAC;YAChB,CAAC;QACH,CAAC;QAED,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;QACvC,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,eAAe,CAAC,GAAuB,EAAE,MAAc;QAC7D,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC;QACvB,IAAI,MAAM,GAAG,KAAK,CAAC;QAEnB,IAAI,CAAC,CAAC,GAAG,KAAK,SAAS,IAAI,MAAM,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;YAC1C,QAAQ,CAAC,GAAG,EAAE;gBACZ,IAAI,EAAE,eAAe,CAAC,SAAS;gBAC/B,IAAI,EAAE,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC;gBACnB,OAAO,EAAE,4BAA4B,CAAC,CAAC,GAAG,QAAQ;gBAClD,QAAQ,EAAE,MAAM,CAAC,CAAC,GAAG,EAAE;gBACvB,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC;aACzB,CAAC,CAAC;YACH,MAAM,GAAG,IAAI,CAAC;QAChB,CAAC;QACD,IAAI,CAAC,CAAC,GAAG,KAAK,SAAS,IAAI,MAAM,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;YAC1C,QAAQ,CAAC,GAAG,EAAE;gBACZ,IAAI,EAAE,eAAe,CAAC,SAAS;gBAC/B,IAAI,EAAE,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC;gBACnB,OAAO,EAAE,2BAA2B,CAAC,CAAC,GAAG,QAAQ;gBACjD,QAAQ,EAAE,MAAM,CAAC,CAAC,GAAG,EAAE;gBACvB,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC;aACzB,CAAC,CAAC;YACH,MAAM,GAAG,IAAI,CAAC;QAChB,CAAC;QACD,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC;YAClD,QAAQ,CAAC,GAAG,EAAE;gBACZ,IAAI,EAAE,eAAe,CAAC,cAAc;gBACpC,IAAI,EAAE,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC;gBACnB,OAAO,EAAE,2BAA2B,CAAC,CAAC,MAAM,QAAQ;gBACpD,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;gBAC1B,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC;aACzB,CAAC,CAAC;YACH,MAAM,GAAG,IAAI,CAAC;QAChB,CAAC;QAED,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IAED,2CAA2C;IACpC,GAAG,CAAC,GAAW;QACpB,OAAO,IAAI,WAAW,CAAC,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC;IACnD,CAAC;IAED,2CAA2C;IACpC,GAAG,CAAC,GAAW;QACpB,OAAO,IAAI,WAAW,CAAC,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC;IACnD,CAAC;IAED,6BAA6B;IACtB,MAAM,CAAC,MAAc;QAC1B,OAAO,IAAI,WAAW,CAAC,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;IACtD,CAAC;IAED,yCAAyC;IAClC,QAAQ;QACb,OAAO,IAAI,WAAW,CAAC,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;IACtD,CAAC;CACF;AAED,mDAAmD;AACnD,MAAM,UAAU,WAAW,CAAI,UAAqB;IAClD,OAAO,IAAI,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC;AACzC,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @oyinlola141/lattice-schema/structures/map-set
|
|
3
|
+
*
|
|
4
|
+
* Map and Set schemas.
|
|
5
|
+
*/
|
|
6
|
+
import { Schema } from "../schemaBase/index.js";
|
|
7
|
+
import type { SchemaParseContext } from "../schemaBase/index.js";
|
|
8
|
+
/**
|
|
9
|
+
* Schema for Map objects.
|
|
10
|
+
*/
|
|
11
|
+
export declare class MapSchema<TKey, TValue> extends Schema<Map<TKey, TValue>> {
|
|
12
|
+
private readonly _keySchema;
|
|
13
|
+
private readonly _valueSchema;
|
|
14
|
+
readonly _type = "map";
|
|
15
|
+
constructor(_keySchema: Schema<TKey>, _valueSchema: Schema<TValue>);
|
|
16
|
+
_parse(ctx: SchemaParseContext, input: unknown): Map<TKey, TValue>;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Schema for Set objects.
|
|
20
|
+
*/
|
|
21
|
+
export declare class SetSchema<TValue> extends Schema<Set<TValue>> {
|
|
22
|
+
private readonly _valueSchema;
|
|
23
|
+
readonly _type = "set";
|
|
24
|
+
constructor(_valueSchema: Schema<TValue>);
|
|
25
|
+
_parse(ctx: SchemaParseContext, input: unknown): Set<TValue>;
|
|
26
|
+
}
|
|
27
|
+
/** Creates a map schema from key and value schemas. */
|
|
28
|
+
export declare function mapSchema<TKey, TValue>(keySchema: Schema<TKey>, valueSchema: Schema<TValue>): MapSchema<TKey, TValue>;
|
|
29
|
+
/** Creates a set schema from a value schema. */
|
|
30
|
+
export declare function setSchema<TValue>(valueSchema: Schema<TValue>): SetSchema<TValue>;
|
|
31
|
+
//# sourceMappingURL=schemaMapSet.core.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schemaMapSet.core.d.ts","sourceRoot":"","sources":["../../src/schemaStructures/schemaMapSet.core.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAIjE;;GAEG;AACH,qBAAa,SAAS,CAAC,IAAI,EAAE,MAAM,CAAE,SAAQ,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAIlE,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAJ/B,SAAgB,KAAK,SAAS;IAE9B,YACmB,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,EACxB,YAAY,EAAE,MAAM,CAAC,MAAM,CAAC,EAG9C;IAEM,MAAM,CAAC,GAAG,EAAE,kBAAkB,EAAE,KAAK,EAAE,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAoBxE;CACF;AAED;;GAEG;AACH,qBAAa,SAAS,CAAC,MAAM,CAAE,SAAQ,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAG5C,OAAO,CAAC,QAAQ,CAAC,YAAY;IAFzC,SAAgB,KAAK,SAAS;IAE9B,YAA6B,YAAY,EAAE,MAAM,CAAC,MAAM,CAAC,EAExD;IAEM,MAAM,CAAC,GAAG,EAAE,kBAAkB,EAAE,KAAK,EAAE,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,CAkBlE;CACF;AAED,uDAAuD;AACvD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EACpC,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,EACvB,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC,GAC1B,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,CAEzB;AAED,gDAAgD;AAChD,wBAAgB,SAAS,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC,MAAM,CAAC,CAEhF"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @latticejs/schema/structures/map-set
|
|
3
|
+
*
|
|
4
|
+
* Map and Set schemas.
|
|
5
|
+
*/
|
|
6
|
+
import { Schema } from "../schemaBase/index.js";
|
|
7
|
+
import { addIssue } from "../schemaBase/index.js";
|
|
8
|
+
import { SchemaIssueCode } from "@latticejs/constants";
|
|
9
|
+
/**
|
|
10
|
+
* Schema for Map objects.
|
|
11
|
+
*/
|
|
12
|
+
export class MapSchema extends Schema {
|
|
13
|
+
_keySchema;
|
|
14
|
+
_valueSchema;
|
|
15
|
+
_type = "map";
|
|
16
|
+
constructor(_keySchema, _valueSchema) {
|
|
17
|
+
super();
|
|
18
|
+
this._keySchema = _keySchema;
|
|
19
|
+
this._valueSchema = _valueSchema;
|
|
20
|
+
}
|
|
21
|
+
_parse(ctx, input) {
|
|
22
|
+
if (!(input instanceof Map)) {
|
|
23
|
+
addIssue(ctx, {
|
|
24
|
+
code: SchemaIssueCode.INVALID_TYPE,
|
|
25
|
+
path: [...ctx.path],
|
|
26
|
+
message: `Expected Map, received ${typeof input}`,
|
|
27
|
+
expected: "Map",
|
|
28
|
+
received: typeof input,
|
|
29
|
+
});
|
|
30
|
+
throw new Error("Validation failed");
|
|
31
|
+
}
|
|
32
|
+
const result = new Map();
|
|
33
|
+
for (const [key, value] of input) {
|
|
34
|
+
const k = this._keySchema._parse(ctx, key);
|
|
35
|
+
const v = this._valueSchema._parse(ctx, value);
|
|
36
|
+
result.set(k, v);
|
|
37
|
+
}
|
|
38
|
+
return result;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Schema for Set objects.
|
|
43
|
+
*/
|
|
44
|
+
export class SetSchema extends Schema {
|
|
45
|
+
_valueSchema;
|
|
46
|
+
_type = "set";
|
|
47
|
+
constructor(_valueSchema) {
|
|
48
|
+
super();
|
|
49
|
+
this._valueSchema = _valueSchema;
|
|
50
|
+
}
|
|
51
|
+
_parse(ctx, input) {
|
|
52
|
+
if (!(input instanceof Set)) {
|
|
53
|
+
addIssue(ctx, {
|
|
54
|
+
code: SchemaIssueCode.INVALID_TYPE,
|
|
55
|
+
path: [...ctx.path],
|
|
56
|
+
message: `Expected Set, received ${typeof input}`,
|
|
57
|
+
expected: "Set",
|
|
58
|
+
received: typeof input,
|
|
59
|
+
});
|
|
60
|
+
throw new Error("Validation failed");
|
|
61
|
+
}
|
|
62
|
+
const result = new Set();
|
|
63
|
+
for (const value of input) {
|
|
64
|
+
result.add(this._valueSchema._parse(ctx, value));
|
|
65
|
+
}
|
|
66
|
+
return result;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
/** Creates a map schema from key and value schemas. */
|
|
70
|
+
export function mapSchema(keySchema, valueSchema) {
|
|
71
|
+
return new MapSchema(keySchema, valueSchema);
|
|
72
|
+
}
|
|
73
|
+
/** Creates a set schema from a value schema. */
|
|
74
|
+
export function setSchema(valueSchema) {
|
|
75
|
+
return new SetSchema(valueSchema);
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=schemaMapSet.core.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schemaMapSet.core.js","sourceRoot":"","sources":["../../src/schemaStructures/schemaMapSet.core.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAEhD,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD;;GAEG;AACH,MAAM,OAAO,SAAwB,SAAQ,MAAyB;IAIjD,UAAU;IACV,YAAY;IAJf,KAAK,GAAG,KAAK,CAAC;IAE9B,YACmB,UAAwB,EACxB,YAA4B;QAE7C,KAAK,EAAE,CAAC;0BAHS,UAAU;4BACV,YAAY;IAG/B,CAAC;IAEM,MAAM,CAAC,GAAuB,EAAE,KAAc;QACnD,IAAI,CAAC,CAAC,KAAK,YAAY,GAAG,CAAC,EAAE,CAAC;YAC5B,QAAQ,CAAC,GAAG,EAAE;gBACZ,IAAI,EAAE,eAAe,CAAC,YAAY;gBAClC,IAAI,EAAE,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC;gBACnB,OAAO,EAAE,0BAA0B,OAAO,KAAK,EAAE;gBACjD,QAAQ,EAAE,KAAK;gBACf,QAAQ,EAAE,OAAO,KAAK;aACvB,CAAC,CAAC;YACH,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;QACvC,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,GAAG,EAAgB,CAAC;QACvC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,KAAK,EAAE,CAAC;YACjC,MAAM,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YAC3C,MAAM,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YAC/C,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACnB,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,SAAkB,SAAQ,MAAmB;IAG3B,YAAY;IAFzB,KAAK,GAAG,KAAK,CAAC;IAE9B,YAA6B,YAA4B;QACvD,KAAK,EAAE,CAAC;4BADmB,YAAY;IAEzC,CAAC;IAEM,MAAM,CAAC,GAAuB,EAAE,KAAc;QACnD,IAAI,CAAC,CAAC,KAAK,YAAY,GAAG,CAAC,EAAE,CAAC;YAC5B,QAAQ,CAAC,GAAG,EAAE;gBACZ,IAAI,EAAE,eAAe,CAAC,YAAY;gBAClC,IAAI,EAAE,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC;gBACnB,OAAO,EAAE,0BAA0B,OAAO,KAAK,EAAE;gBACjD,QAAQ,EAAE,KAAK;gBACf,QAAQ,EAAE,OAAO,KAAK;aACvB,CAAC,CAAC;YACH,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;QACvC,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;QACjC,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE,CAAC;YAC1B,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;QACnD,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AAED,uDAAuD;AACvD,MAAM,UAAU,SAAS,CACvB,SAAuB,EACvB,WAA2B;IAE3B,OAAO,IAAI,SAAS,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;AAC/C,CAAC;AAED,gDAAgD;AAChD,MAAM,UAAU,SAAS,CAAS,WAA2B;IAC3D,OAAO,IAAI,SAAS,CAAC,WAAW,CAAC,CAAC;AACpC,CAAC"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @oyinlola141/lattice-schema/structures/object
|
|
3
|
+
*
|
|
4
|
+
* Object schema with shape validation, unknown key handling, and composition methods.
|
|
5
|
+
*/
|
|
6
|
+
import { Schema } from "../schemaBase/index.js";
|
|
7
|
+
import type { SchemaParseContext } from "../schemaBase/index.js";
|
|
8
|
+
/** Shape type — record of property names to schemas. */
|
|
9
|
+
export type SchemaShape = Record<string, Schema<unknown>>;
|
|
10
|
+
/** Unknown keys handling strategy. */
|
|
11
|
+
type UnknownKeyStrategy = "strip" | "strict" | "passthrough";
|
|
12
|
+
/** Configuration for object schema. */
|
|
13
|
+
interface ObjectSchemaConfig {
|
|
14
|
+
readonly shape: SchemaShape;
|
|
15
|
+
readonly unknownKeys?: UnknownKeyStrategy;
|
|
16
|
+
readonly requiredKeys?: ReadonlySet<string>;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Schema for object values with a defined shape.
|
|
20
|
+
*/
|
|
21
|
+
export declare class ObjectSchema<TOutput extends Record<string, unknown>> extends Schema<TOutput> {
|
|
22
|
+
readonly _type = "object";
|
|
23
|
+
private readonly _config;
|
|
24
|
+
private readonly _keys;
|
|
25
|
+
private readonly _keySet;
|
|
26
|
+
constructor(config: ObjectSchemaConfig);
|
|
27
|
+
_parse(ctx: SchemaParseContext, input: unknown): TOutput;
|
|
28
|
+
private _isOptional;
|
|
29
|
+
/** Creates a new schema with only the specified keys. */
|
|
30
|
+
pick<K extends keyof TOutput>(keys: readonly K[]): ObjectSchema<Pick<TOutput, K>>;
|
|
31
|
+
/** Creates a new schema without the specified keys. */
|
|
32
|
+
omit<K extends keyof TOutput>(keys: readonly K[]): ObjectSchema<Omit<TOutput, K>>;
|
|
33
|
+
/** Makes all properties optional. */
|
|
34
|
+
partial(): ObjectSchema<{
|
|
35
|
+
[K in keyof TOutput]?: TOutput[K];
|
|
36
|
+
}>;
|
|
37
|
+
/** Makes all properties required. */
|
|
38
|
+
required(): ObjectSchema<{
|
|
39
|
+
[K in keyof TOutput]-?: TOutput[K];
|
|
40
|
+
}>;
|
|
41
|
+
/** Merges another object schema's shape into this one. */
|
|
42
|
+
extend<TEnd extends Record<string, unknown>>(other: ObjectSchema<TEnd>): ObjectSchema<TOutput & TEnd>;
|
|
43
|
+
/** Merges two object schemas (last wins on conflicts). */
|
|
44
|
+
merge<TEnd extends Record<string, unknown>>(other: ObjectSchema<TEnd>): ObjectSchema<TOutput & TEnd>;
|
|
45
|
+
/** Sets unknown keys strategy to strip. */
|
|
46
|
+
strip(): ObjectSchema<TOutput>;
|
|
47
|
+
/** Sets unknown keys strategy to strict (reject unknown). */
|
|
48
|
+
strict(): ObjectSchema<TOutput>;
|
|
49
|
+
/** Sets unknown keys strategy to passthrough. */
|
|
50
|
+
passthrough(): ObjectSchema<TOutput>;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Wrapper schema that marks an inner schema as optional.
|
|
54
|
+
*/
|
|
55
|
+
export declare class OptionalSchema<T> extends Schema<T | undefined> {
|
|
56
|
+
readonly _inner: Schema<T>;
|
|
57
|
+
readonly _type = "optional";
|
|
58
|
+
constructor(_inner: Schema<T>);
|
|
59
|
+
_parse(ctx: SchemaParseContext, input: unknown): T | undefined;
|
|
60
|
+
}
|
|
61
|
+
/** Creates an object schema from a shape. */
|
|
62
|
+
export declare function objectSchema<T extends Record<string, Schema<unknown>>>(shape: T): ObjectSchema<{
|
|
63
|
+
[K in keyof T]: T[K] extends Schema<infer U> ? U : never;
|
|
64
|
+
}>;
|
|
65
|
+
export {};
|
|
66
|
+
//# sourceMappingURL=schemaObject.core.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schemaObject.core.d.ts","sourceRoot":"","sources":["../../src/schemaStructures/schemaObject.core.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @latticejs/schema/structures/object
|
|
3
|
+
*
|
|
4
|
+
* Object schema with shape validation, unknown key handling, and composition methods.
|
|
5
|
+
*/
|
|
6
|
+
import { Schema } from "../schemaBase/index.js";
|
|
7
|
+
import { addIssue, childContext } from "../schemaBase/index.js";
|
|
8
|
+
import { SchemaIssueCode, SCHEMA_FORBIDDEN_KEYS } from "@latticejs/constants";
|
|
9
|
+
/**
|
|
10
|
+
* Schema for object values with a defined shape.
|
|
11
|
+
*/
|
|
12
|
+
export class ObjectSchema extends Schema {
|
|
13
|
+
_type = "object";
|
|
14
|
+
_config;
|
|
15
|
+
_keys;
|
|
16
|
+
_keySet;
|
|
17
|
+
constructor(config) {
|
|
18
|
+
super();
|
|
19
|
+
this._config = config;
|
|
20
|
+
this._keys = Object.keys(config.shape);
|
|
21
|
+
this._keySet = new Set(this._keys);
|
|
22
|
+
}
|
|
23
|
+
_parse(ctx, input) {
|
|
24
|
+
if (typeof input !== "object" || input === null || Array.isArray(input)) {
|
|
25
|
+
addIssue(ctx, {
|
|
26
|
+
code: SchemaIssueCode.INVALID_TYPE,
|
|
27
|
+
path: [...ctx.path],
|
|
28
|
+
message: `Expected object, received ${Array.isArray(input) ? "array" : typeof input}`,
|
|
29
|
+
expected: "object",
|
|
30
|
+
received: Array.isArray(input) ? "array" : typeof input,
|
|
31
|
+
});
|
|
32
|
+
throw new Error("Validation failed");
|
|
33
|
+
}
|
|
34
|
+
const obj = input;
|
|
35
|
+
const result = {};
|
|
36
|
+
// Check for prototype pollution keys
|
|
37
|
+
for (const key of Object.keys(obj)) {
|
|
38
|
+
if (SCHEMA_FORBIDDEN_KEYS.has(key)) {
|
|
39
|
+
addIssue(ctx, {
|
|
40
|
+
code: SchemaIssueCode.INVALID_KEY,
|
|
41
|
+
path: [...ctx.path],
|
|
42
|
+
message: `Forbidden key: ${key}`,
|
|
43
|
+
});
|
|
44
|
+
throw new Error("Validation failed");
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
// Validate known properties
|
|
48
|
+
for (const key of this._keys) {
|
|
49
|
+
const childCtx = childContext(ctx, key);
|
|
50
|
+
const schema = this._config.shape[key];
|
|
51
|
+
if (!schema)
|
|
52
|
+
continue;
|
|
53
|
+
const value = obj[key];
|
|
54
|
+
if (value === undefined) {
|
|
55
|
+
if (this._config.requiredKeys?.has(key) || !this._isOptional(schema)) {
|
|
56
|
+
addIssue(ctx, {
|
|
57
|
+
code: SchemaIssueCode.REQUIRED,
|
|
58
|
+
path: [...childCtx.path],
|
|
59
|
+
message: `Required field missing: ${key}`,
|
|
60
|
+
});
|
|
61
|
+
if (ctx.options.abortEarly)
|
|
62
|
+
break;
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
result[key] = undefined;
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
try {
|
|
69
|
+
result[key] = schema._parse(childCtx, value);
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
if (ctx.options.abortEarly)
|
|
73
|
+
break;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
// Handle unknown keys
|
|
77
|
+
if (this._config.unknownKeys !== "passthrough") {
|
|
78
|
+
const extraKeys = Object.keys(obj).filter((k) => !this._keySet.has(k));
|
|
79
|
+
if (extraKeys.length > 0 && this._config.unknownKeys === "strict") {
|
|
80
|
+
for (const key of extraKeys) {
|
|
81
|
+
addIssue(ctx, {
|
|
82
|
+
code: SchemaIssueCode.UNKNOWN_KEYS,
|
|
83
|
+
path: [...ctx.path],
|
|
84
|
+
message: `Unknown key: ${key}`,
|
|
85
|
+
details: { key },
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
throw new Error("Validation failed");
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return result;
|
|
92
|
+
}
|
|
93
|
+
_isOptional(schema) {
|
|
94
|
+
return schema._type === "optional";
|
|
95
|
+
}
|
|
96
|
+
// --- Composition methods ---
|
|
97
|
+
/** Creates a new schema with only the specified keys. */
|
|
98
|
+
pick(keys) {
|
|
99
|
+
const newShape = {};
|
|
100
|
+
for (const key of keys) {
|
|
101
|
+
const k = key;
|
|
102
|
+
if (this._config.shape[k]) {
|
|
103
|
+
newShape[k] = this._config.shape[k];
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return new ObjectSchema({ shape: newShape, unknownKeys: "strip" });
|
|
107
|
+
}
|
|
108
|
+
/** Creates a new schema without the specified keys. */
|
|
109
|
+
omit(keys) {
|
|
110
|
+
const newShape = {};
|
|
111
|
+
for (const key of this._keys) {
|
|
112
|
+
if (!keys.includes(key) && this._config.shape[key]) {
|
|
113
|
+
newShape[key] = this._config.shape[key];
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return new ObjectSchema({ shape: newShape, unknownKeys: "strip" });
|
|
117
|
+
}
|
|
118
|
+
/** Makes all properties optional. */
|
|
119
|
+
partial() {
|
|
120
|
+
const newShape = {};
|
|
121
|
+
for (const key of this._keys) {
|
|
122
|
+
const schema = this._config.shape[key];
|
|
123
|
+
if (schema) {
|
|
124
|
+
newShape[key] = schema._type === "optional" ? schema : new OptionalSchema(schema);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
return new ObjectSchema({ shape: newShape, unknownKeys: this._config.unknownKeys });
|
|
128
|
+
}
|
|
129
|
+
/** Makes all properties required. */
|
|
130
|
+
required() {
|
|
131
|
+
const newShape = {};
|
|
132
|
+
for (const key of this._keys) {
|
|
133
|
+
const schema = this._config.shape[key];
|
|
134
|
+
if (!schema)
|
|
135
|
+
continue;
|
|
136
|
+
newShape[key] = schema._type === "optional"
|
|
137
|
+
? schema._inner
|
|
138
|
+
: schema;
|
|
139
|
+
}
|
|
140
|
+
return new ObjectSchema({ shape: newShape, unknownKeys: this._config.unknownKeys });
|
|
141
|
+
}
|
|
142
|
+
/** Merges another object schema's shape into this one. */
|
|
143
|
+
extend(other) {
|
|
144
|
+
const newShape = { ...this._config.shape, ...other._config.shape };
|
|
145
|
+
return new ObjectSchema({ shape: newShape, unknownKeys: this._config.unknownKeys });
|
|
146
|
+
}
|
|
147
|
+
/** Merges two object schemas (last wins on conflicts). */
|
|
148
|
+
merge(other) {
|
|
149
|
+
return this.extend(other);
|
|
150
|
+
}
|
|
151
|
+
/** Sets unknown keys strategy to strip. */
|
|
152
|
+
strip() {
|
|
153
|
+
return new ObjectSchema({ ...this._config, unknownKeys: "strip" });
|
|
154
|
+
}
|
|
155
|
+
/** Sets unknown keys strategy to strict (reject unknown). */
|
|
156
|
+
strict() {
|
|
157
|
+
return new ObjectSchema({ ...this._config, unknownKeys: "strict" });
|
|
158
|
+
}
|
|
159
|
+
/** Sets unknown keys strategy to passthrough. */
|
|
160
|
+
passthrough() {
|
|
161
|
+
return new ObjectSchema({ ...this._config, unknownKeys: "passthrough" });
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Wrapper schema that marks an inner schema as optional.
|
|
166
|
+
*/
|
|
167
|
+
export class OptionalSchema extends Schema {
|
|
168
|
+
_inner;
|
|
169
|
+
_type = "optional";
|
|
170
|
+
constructor(_inner) {
|
|
171
|
+
super();
|
|
172
|
+
this._inner = _inner;
|
|
173
|
+
}
|
|
174
|
+
_parse(ctx, input) {
|
|
175
|
+
if (input === undefined)
|
|
176
|
+
return undefined;
|
|
177
|
+
return this._inner._parse(ctx, input);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
/** Creates an object schema from a shape. */
|
|
181
|
+
export function objectSchema(shape) {
|
|
182
|
+
return new ObjectSchema({ shape: shape });
|
|
183
|
+
}
|
|
184
|
+
//# sourceMappingURL=schemaObject.core.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schemaObject.core.js","sourceRoot":"","sources":["../../src/schemaStructures/schemaObject.core.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @oyinlola141/lattice-schema/structures/record
|
|
3
|
+
*
|
|
4
|
+
* Record schema for objects with constrained keys and values.
|
|
5
|
+
*/
|
|
6
|
+
import { Schema } from "../schemaBase/index.js";
|
|
7
|
+
import type { SchemaParseContext } from "../schemaBase/index.js";
|
|
8
|
+
/**
|
|
9
|
+
* Schema for record objects with string keys and typed values.
|
|
10
|
+
*/
|
|
11
|
+
export declare class RecordSchema<TValue> extends Schema<Record<string, TValue>> {
|
|
12
|
+
private readonly _keySchema;
|
|
13
|
+
private readonly _valueSchema;
|
|
14
|
+
readonly _type = "record";
|
|
15
|
+
constructor(_keySchema: Schema<string>, _valueSchema: Schema<TValue>);
|
|
16
|
+
_parse(ctx: SchemaParseContext, input: unknown): Record<string, TValue>;
|
|
17
|
+
}
|
|
18
|
+
/** Creates a record schema. */
|
|
19
|
+
export declare function recordSchema<TValue>(valueSchema: Schema<TValue>): RecordSchema<TValue>;
|
|
20
|
+
//# sourceMappingURL=schemaRecord.core.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schemaRecord.core.d.ts","sourceRoot":"","sources":["../../src/schemaStructures/schemaRecord.core.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAKjE;;GAEG;AACH,qBAAa,YAAY,CAAC,MAAM,CAAE,SAAQ,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAIpE,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAJ/B,SAAgB,KAAK,YAAY;IAEjC,YACmB,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,EAC1B,YAAY,EAAE,MAAM,CAAC,MAAM,CAAC,EAG9C;IAEM,MAAM,CAAC,GAAG,EAAE,kBAAkB,EAAE,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CA2C7E;CACF;AAED,+BAA+B;AAC/B,wBAAgB,YAAY,CAAC,MAAM,EACjC,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC,GAC1B,YAAY,CAAC,MAAM,CAAC,CAEtB"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @latticejs/schema/structures/record
|
|
3
|
+
*
|
|
4
|
+
* Record schema for objects with constrained keys and values.
|
|
5
|
+
*/
|
|
6
|
+
import { Schema } from "../schemaBase/index.js";
|
|
7
|
+
import { addIssue, childContext } from "../schemaBase/index.js";
|
|
8
|
+
import { SchemaIssueCode, SCHEMA_FORBIDDEN_KEYS } from "@latticejs/constants";
|
|
9
|
+
import { StringSchema } from "../schemaPrimitives/index.js";
|
|
10
|
+
/**
|
|
11
|
+
* Schema for record objects with string keys and typed values.
|
|
12
|
+
*/
|
|
13
|
+
export class RecordSchema extends Schema {
|
|
14
|
+
_keySchema;
|
|
15
|
+
_valueSchema;
|
|
16
|
+
_type = "record";
|
|
17
|
+
constructor(_keySchema, _valueSchema) {
|
|
18
|
+
super();
|
|
19
|
+
this._keySchema = _keySchema;
|
|
20
|
+
this._valueSchema = _valueSchema;
|
|
21
|
+
}
|
|
22
|
+
_parse(ctx, input) {
|
|
23
|
+
if (typeof input !== "object" || input === null || Array.isArray(input)) {
|
|
24
|
+
addIssue(ctx, {
|
|
25
|
+
code: SchemaIssueCode.INVALID_TYPE,
|
|
26
|
+
path: [...ctx.path],
|
|
27
|
+
message: `Expected record, received ${Array.isArray(input) ? "array" : typeof input}`,
|
|
28
|
+
expected: "record",
|
|
29
|
+
received: Array.isArray(input) ? "array" : typeof input,
|
|
30
|
+
});
|
|
31
|
+
throw new Error("Validation failed");
|
|
32
|
+
}
|
|
33
|
+
const obj = input;
|
|
34
|
+
const result = {};
|
|
35
|
+
let failed = false;
|
|
36
|
+
for (const key of Object.keys(obj)) {
|
|
37
|
+
if (SCHEMA_FORBIDDEN_KEYS.has(key)) {
|
|
38
|
+
addIssue(ctx, {
|
|
39
|
+
code: SchemaIssueCode.INVALID_KEY,
|
|
40
|
+
path: [...ctx.path],
|
|
41
|
+
message: `Forbidden key: ${key}`,
|
|
42
|
+
});
|
|
43
|
+
failed = true;
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
const keyCtx = childContext(ctx, key);
|
|
47
|
+
const valueCtx = childContext(ctx, key);
|
|
48
|
+
try {
|
|
49
|
+
this._keySchema._parse(keyCtx, key);
|
|
50
|
+
result[key] = this._valueSchema._parse(valueCtx, obj[key]);
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
failed = true;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
if (failed) {
|
|
57
|
+
throw new Error("Validation failed");
|
|
58
|
+
}
|
|
59
|
+
return result;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/** Creates a record schema. */
|
|
63
|
+
export function recordSchema(valueSchema) {
|
|
64
|
+
return new RecordSchema(new StringSchema(), valueSchema);
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=schemaRecord.core.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schemaRecord.core.js","sourceRoot":"","sources":["../../src/schemaStructures/schemaRecord.core.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAEhD,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC9E,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAE5D;;GAEG;AACH,MAAM,OAAO,YAAqB,SAAQ,MAA8B;IAInD,UAAU;IACV,YAAY;IAJf,KAAK,GAAG,QAAQ,CAAC;IAEjC,YACmB,UAA0B,EAC1B,YAA4B;QAE7C,KAAK,EAAE,CAAC;0BAHS,UAAU;4BACV,YAAY;IAG/B,CAAC;IAEM,MAAM,CAAC,GAAuB,EAAE,KAAc;QACnD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACxE,QAAQ,CAAC,GAAG,EAAE;gBACZ,IAAI,EAAE,eAAe,CAAC,YAAY;gBAClC,IAAI,EAAE,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC;gBACnB,OAAO,EAAE,6BAA6B,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,KAAK,EAAE;gBACrF,QAAQ,EAAE,QAAQ;gBAClB,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,KAAK;aACxD,CAAC,CAAC;YACH,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;QACvC,CAAC;QAED,MAAM,GAAG,GAAG,KAAgC,CAAC;QAC7C,MAAM,MAAM,GAA2B,EAAE,CAAC;QAE1C,IAAI,MAAM,GAAG,KAAK,CAAC;QACnB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACnC,IAAI,qBAAqB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBACnC,QAAQ,CAAC,GAAG,EAAE;oBACZ,IAAI,EAAE,eAAe,CAAC,WAAW;oBACjC,IAAI,EAAE,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC;oBACnB,OAAO,EAAE,kBAAkB,GAAG,EAAE;iBACjC,CAAC,CAAC;gBACH,MAAM,GAAG,IAAI,CAAC;gBACd,SAAS;YACX,CAAC;YAED,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YACtC,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YAExC,IAAI,CAAC;gBACH,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;gBACpC,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;YAC7D,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,GAAG,IAAI,CAAC;YAChB,CAAC;QACH,CAAC;QAED,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;QACvC,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AAED,+BAA+B;AAC/B,MAAM,UAAU,YAAY,CAC1B,WAA2B;IAE3B,OAAO,IAAI,YAAY,CAAC,IAAI,YAAY,EAAE,EAAE,WAAW,CAAC,CAAC;AAC3D,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @oyinlola141/lattice-schema/structures/tuple
|
|
3
|
+
*
|
|
4
|
+
* Tuple schema for fixed-length arrays with per-position types.
|
|
5
|
+
*/
|
|
6
|
+
import { Schema } from "../schemaBase/index.js";
|
|
7
|
+
import type { SchemaParseContext } from "../schemaBase/index.js";
|
|
8
|
+
/** Helper type to infer tuple output type. */
|
|
9
|
+
type InferTuple<T extends readonly Schema<unknown>[]> = {
|
|
10
|
+
[K in keyof T]: T[K] extends Schema<infer U> ? U : never;
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Schema for fixed-length tuples.
|
|
14
|
+
*/
|
|
15
|
+
export declare class TupleSchema<TSchemas extends readonly Schema<unknown>[]> extends Schema<InferTuple<TSchemas>> {
|
|
16
|
+
private readonly _schemas;
|
|
17
|
+
readonly _type = "tuple";
|
|
18
|
+
constructor(_schemas: TSchemas);
|
|
19
|
+
_parse(ctx: SchemaParseContext, input: unknown): InferTuple<TSchemas>;
|
|
20
|
+
}
|
|
21
|
+
/** Creates a tuple schema from an array of schemas. */
|
|
22
|
+
export declare function tupleSchema<T extends readonly Schema<unknown>[]>(schemas: T): TupleSchema<T>;
|
|
23
|
+
export {};
|
|
24
|
+
//# sourceMappingURL=schemaTuple.core.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schemaTuple.core.d.ts","sourceRoot":"","sources":["../../src/schemaStructures/schemaTuple.core.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAIjE,8CAA8C;AAC9C,KAAK,UAAU,CAAC,CAAC,SAAS,SAAS,MAAM,CAAC,OAAO,CAAC,EAAE,IAAI;KACrD,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK;CACzD,CAAC;AAEF;;GAEG;AACH,qBAAa,WAAW,CAAC,QAAQ,SAAS,SAAS,MAAM,CAAC,OAAO,CAAC,EAAE,CAAE,SAAQ,MAAM,CAClF,UAAU,CAAC,QAAQ,CAAC,CACrB;IAGa,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAFrC,SAAgB,KAAK,WAAW;IAEhC,YAA6B,QAAQ,EAAE,QAAQ,EAE9C;IAEM,MAAM,CAAC,GAAG,EAAE,kBAAkB,EAAE,KAAK,EAAE,OAAO,GAAG,UAAU,CAAC,QAAQ,CAAC,CAoC3E;CACF;AAED,uDAAuD;AACvD,wBAAgB,WAAW,CAAC,CAAC,SAAS,SAAS,MAAM,CAAC,OAAO,CAAC,EAAE,EAC9D,OAAO,EAAE,CAAC,GACT,WAAW,CAAC,CAAC,CAAC,CAEhB"}
|