@relkit/schema 0.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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 rel-kit
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,51 @@
1
+ # @relkit/schema
2
+
3
+ `@relkit/schema` provides the default `z` builder and a Standard Schema v1
4
+ boundary for application validation. The public result keeps validation issues
5
+ structured, including their nested paths.
6
+
7
+ ## Validate values
8
+
9
+ ```ts
10
+ import { validateSync, z } from "@relkit/app/schema";
11
+
12
+ const user = z.object({
13
+ email: z.string().email(),
14
+ age: z.number().int().nonnegative(),
15
+ });
16
+
17
+ const result = validateSync(user, { email: "ada@example.com", age: 36 });
18
+
19
+ if ("issues" in result) {
20
+ console.error(result.issues);
21
+ } else {
22
+ console.log(result.value);
23
+ }
24
+ ```
25
+
26
+ Use `validate` for a schema that may perform asynchronous validation:
27
+
28
+ ```ts
29
+ import { validate, z } from "@relkit/app/schema";
30
+
31
+ const trimmed = z.string().transform(async (value) => value.trim());
32
+ const result = await validate(trimmed, " hello ");
33
+
34
+ if ("value" in result) console.log(result.value); // "hello"
35
+ ```
36
+
37
+ Other Standard Schema-compatible values can be passed to the same validation
38
+ helpers. `getJsonSchema` returns a deterministic projection when the schema
39
+ provides one, or a structured `RELKIT_SCHEMA_UNAVAILABLE` result when it does not.
40
+
41
+ ```ts
42
+ import { getJsonSchema, z } from "@relkit/app/schema";
43
+
44
+ const projection = getJsonSchema(z.object({ id: z.string().uuid() }));
45
+ if (projection.ok) console.log(projection.schema);
46
+ ```
47
+
48
+ For buffered multipart uploads, `z.file({ maxBytes, mediaTypes })` validates the
49
+ Web `File` type and projects OpenAPI binary-string metadata. Combine it with
50
+ `http.multipart(name)` or `http.multipartAll(name)` in an explicit route
51
+ request mapping.
@@ -0,0 +1,6 @@
1
+ import { type Schema } from "./standard-schema.js";
2
+ import type { AnySchema, InputOf, ObjectInput, ObjectOutput, OutputOf, SchemaTuple, Shape } from "./builder.js";
3
+ export declare function objectSchema<S extends Shape>(shape: S): Schema<ObjectInput<S>, ObjectOutput<S>>;
4
+ export declare function arraySchema<S extends AnySchema>(schema: S): Schema<InputOf<S>[], OutputOf<S>[]>;
5
+ export declare function unionSchema<S extends SchemaTuple>(schemas: S): Schema<InputOf<S[number]>, OutputOf<S[number]>>;
6
+ //# sourceMappingURL=builder-composites.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builder-composites.d.ts","sourceRoot":"","sources":["../src/builder-composites.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,MAAM,EAGZ,MAAM,sBAAsB,CAAC;AAG9B,OAAO,KAAK,EACV,SAAS,EACT,OAAO,EACP,WAAW,EACX,YAAY,EACZ,QAAQ,EACR,WAAW,EACX,KAAK,EACN,MAAM,cAAc,CAAC;AAGtB,wBAAgB,YAAY,CAAC,CAAC,SAAS,KAAK,EAAE,KAAK,EAAE,CAAC,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,CAsB/F;AAED,wBAAgB,WAAW,CAAC,CAAC,SAAS,SAAS,EAAE,MAAM,EAAE,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAY/F;AAED,wBAAgB,WAAW,CAAC,CAAC,SAAS,WAAW,EAC/C,OAAO,EAAE,CAAC,GACT,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAajD"}
@@ -0,0 +1,89 @@
1
+ import { createSchema, issue, isPromiseLike, runSchema, } from "./standard-schema.js";
2
+ import { getSchemaProjection, isSchemaOptional } from "./json-schema.js";
3
+ export function objectSchema(shape) {
4
+ const jsonSchema = objectProjection(shape);
5
+ return createSchema((value, path) => {
6
+ if (!isRecord(value))
7
+ return issue("Expected an object", path);
8
+ const entries = Object.entries(shape).map(([key, schema]) => [key, runSchema(schema, value[key], [...path, key])]);
9
+ return collectResults(entries.map(([, result]) => result), (values) => {
10
+ const output = {};
11
+ entries.forEach(([key], index) => {
12
+ const item = values[index];
13
+ if (item !== undefined || key in value)
14
+ output[key] = item;
15
+ });
16
+ return output;
17
+ });
18
+ }, jsonSchema ? { jsonSchema } : {});
19
+ }
20
+ export function arraySchema(schema) {
21
+ const itemProjection = getSchemaProjection(schema);
22
+ return createSchema((value, path) => {
23
+ if (!Array.isArray(value))
24
+ return issue("Expected an array", path);
25
+ const results = value.map((item, index) => runSchema(schema, item, [...path, index]));
26
+ return collectResults(results, (items) => items);
27
+ }, itemProjection ? { jsonSchema: () => ({ type: "array", items: itemProjection() }) } : {});
28
+ }
29
+ export function unionSchema(schemas) {
30
+ const projections = schemas.map(getSchemaProjection);
31
+ return createSchema((value, path) => {
32
+ const results = schemas.map((schema) => runSchema(schema, value, path));
33
+ return collectUnion(results, path);
34
+ }, projections.every((projection) => projection)
35
+ ? { jsonSchema: () => ({ anyOf: projections.map((projection) => projection()) }) }
36
+ : {});
37
+ }
38
+ function objectProjection(shape) {
39
+ const entries = Object.keys(shape)
40
+ .sort()
41
+ .map((key) => {
42
+ const schema = shape[key];
43
+ return [key, getSchemaProjection(schema), isSchemaOptional(schema)];
44
+ });
45
+ if (entries.some(([, projection]) => !projection))
46
+ return undefined;
47
+ return () => {
48
+ const properties = {};
49
+ const required = [];
50
+ for (const [key, projection, optional] of entries) {
51
+ properties[key] = projection();
52
+ if (!optional)
53
+ required.push(key);
54
+ }
55
+ const schema = { properties, type: "object" };
56
+ if (required.length > 0)
57
+ schema.required = required;
58
+ return schema;
59
+ };
60
+ }
61
+ function objectValue(value) {
62
+ return !("issues" in value) || value.issues === undefined;
63
+ }
64
+ function collectResults(results, map) {
65
+ if (results.some(isPromiseLike)) {
66
+ return Promise.all(results.map((result) => Promise.resolve(result))).then((resolved) => collectValues(resolved, map));
67
+ }
68
+ return collectValues(results, map);
69
+ }
70
+ function collectValues(results, map) {
71
+ const issues = results.flatMap((result) => (objectValue(result) ? [] : result.issues));
72
+ if (issues.length > 0)
73
+ return { issues };
74
+ return { value: map(results.map((result) => result.value)) };
75
+ }
76
+ function collectUnion(results, path) {
77
+ if (results.some(isPromiseLike)) {
78
+ return Promise.all(results.map((result) => Promise.resolve(result))).then((resolved) => unionValues(resolved, path));
79
+ }
80
+ return unionValues(results, path);
81
+ }
82
+ function unionValues(results, path) {
83
+ const success = results.find(objectValue);
84
+ return success ?? issue("Value did not match any union member", path);
85
+ }
86
+ function isRecord(value) {
87
+ return typeof value === "object" && value !== null && !Array.isArray(value);
88
+ }
89
+ //# sourceMappingURL=builder-composites.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builder-composites.js","sourceRoot":"","sources":["../src/builder-composites.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,KAAK,EACL,aAAa,EACb,SAAS,GAIV,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAazE,MAAM,UAAU,YAAY,CAAkB,KAAQ;IACpD,MAAM,UAAU,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;IAC3C,OAAO,YAAY,CACjB,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACd,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC,oBAAoB,EAAE,IAAI,CAAC,CAAC;QAC/D,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CACvC,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,CAAC,CAAC,CAAU,CACjF,CAAC;QACF,OAAO,cAAc,CACnB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,EACnC,CAAC,MAAM,EAAE,EAAE;YACT,MAAM,MAAM,GAA4B,EAAE,CAAC;YAC3C,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,EAAE;gBAC/B,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;gBAC3B,IAAI,IAAI,KAAK,SAAS,IAAI,GAAG,IAAI,KAAK;oBAAE,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;YAC7D,CAAC,CAAC,CAAC;YACH,OAAO,MAAyB,CAAC;QACnC,CAAC,CACF,CAAC;IACJ,CAAC,EACD,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CACjC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,WAAW,CAAsB,MAAS;IACxD,MAAM,cAAc,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;IACnD,OAAO,YAAY,CACjB,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACd,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC,mBAAmB,EAAE,IAAI,CAAC,CAAC;QACnE,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,CAAC,CAEjF,CAAC;QACJ,OAAO,cAAc,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;IACnD,CAAC,EACD,cAAc,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CACzF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,WAAW,CACzB,OAAU;IAEV,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IACrD,OAAO,YAAY,CACjB,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACd,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,CAEnE,CAAC;QACJ,OAAO,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACrC,CAAC,EACD,WAAW,CAAC,KAAK,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC;QAC3C,CAAC,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAW,EAAE,CAAC,EAAE,CAAC,EAAE;QACnF,CAAC,CAAC,EAAE,CACP,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAY;IACpC,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;SAC/B,IAAI,EAAE;SACN,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QACX,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAE,CAAC;QAC3B,OAAO,CAAC,GAAG,EAAE,mBAAmB,CAAC,MAAM,CAAC,EAAE,gBAAgB,CAAC,MAAM,CAAC,CAAU,CAAC;IAC/E,CAAC,CAAC,CAAC;IACL,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC;QAAE,OAAO,SAAS,CAAC;IACpE,OAAO,GAAG,EAAE;QACV,MAAM,UAAU,GAA8B,EAAE,CAAC;QACjD,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,KAAK,MAAM,CAAC,GAAG,EAAE,UAAU,EAAE,QAAQ,CAAC,IAAI,OAAO,EAAE,CAAC;YAClD,UAAU,CAAC,GAAG,CAAC,GAAG,UAAW,EAAE,CAAC;YAChC,IAAI,CAAC,QAAQ;gBAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACpC,CAAC;QACD,MAAM,MAAM,GAA8B,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;QACzE,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;YAAE,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACpD,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,KAA8B;IACjD,OAAO,CAAC,CAAC,QAAQ,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC;AAC5D,CAAC;AAED,SAAS,cAAc,CACrB,OAAoE,EACpE,GAAuB;IAEvB,IAAI,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;QAChC,OAAO,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CACrF,aAAa,CAAC,QAAQ,EAAE,GAAG,CAAC,CAC7B,CAAC;IACJ,CAAC;IACD,OAAO,aAAa,CAAC,OAAuC,EAAE,GAAG,CAAC,CAAC;AACrE,CAAC;AAED,SAAS,aAAa,CACpB,OAAqC,EACrC,GAAuB;IAEvB,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IACvF,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IACzC,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAE,MAAuB,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;AACjF,CAAC;AAED,SAAS,YAAY,CACnB,OAAoE,EACpE,IAAoC;IAEpC,IAAI,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;QAChC,OAAO,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CACrF,WAAW,CAAC,QAAQ,EAAE,IAAI,CAAC,CAC5B,CAAC;IACJ,CAAC;IACD,OAAO,WAAW,CAAC,OAAuC,EAAE,IAAI,CAAC,CAAC;AACpE,CAAC;AAED,SAAS,WAAW,CAClB,OAAqC,EACrC,IAAoC;IAEpC,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC1C,OAAO,OAAO,IAAI,KAAK,CAAC,sCAAsC,EAAE,IAAI,CAAC,CAAC;AACxE,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { NumberSchema, StringSchema } from "./builder.js";
2
+ export declare function stringSchema(): StringSchema;
3
+ export declare function numberSchema(): NumberSchema;
4
+ //# sourceMappingURL=builder-refinements.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builder-refinements.d.ts","sourceRoot":"","sources":["../src/builder-refinements.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAG/D,wBAAgB,YAAY,IAAI,YAAY,CAO3C;AAED,wBAAgB,YAAY,IAAI,YAAY,CAU3C"}
@@ -0,0 +1,48 @@
1
+ import { createSchema, issue } from "./standard-schema.js";
2
+ import { getSchemaMetadata, setSchemaMetadata } from "./schema-metadata.js";
3
+ export function stringSchema() {
4
+ return withString(createSchema((value, path) => (typeof value === "string" ? { value } : issue("Expected a string", path)), { jsonSchema: () => ({ type: "string" }) }));
5
+ }
6
+ export function numberSchema() {
7
+ return withNumber(createSchema((value, path) => typeof value === "number" && Number.isFinite(value)
8
+ ? { value }
9
+ : issue("Expected a finite number", path), { jsonSchema: () => ({ type: "number" }) }));
10
+ }
11
+ function withString(schema, projection = getSchemaMetadata(schema)?.jsonSchema) {
12
+ const refined = Object.assign(schema, {
13
+ min: (length, message) => withString(schema.refine((value) => value.length >= length, message ?? `Must contain at least ${length} characters`), addKeyword(projection, "minLength", length)),
14
+ max: (length, message) => withString(schema.refine((value) => value.length <= length, message ?? `Must contain at most ${length} characters`), addKeyword(projection, "maxLength", length)),
15
+ uuid: (message) => withString(schema.refine((value) => UUID.test(value), message ?? "Expected a UUID"), addKeyword(projection, "format", "uuid")),
16
+ datetime: (message) => withString(schema.refine((value) => !Number.isNaN(Date.parse(value)), message ?? "Expected an ISO datetime"), addKeyword(projection, "format", "date-time")),
17
+ email: (message) => withString(schema.refine((value) => EMAIL.test(value), message ?? "Expected an email address"), addKeyword(projection, "format", "email")),
18
+ });
19
+ setSchemaMetadata(refined, projection ? { jsonSchema: projection } : {});
20
+ return refined;
21
+ }
22
+ function withNumber(schema, projection = getSchemaMetadata(schema)?.jsonSchema) {
23
+ const refined = Object.assign(schema, {
24
+ min: (minimum, message) => withNumber(schema.refine((value) => value >= minimum, message ?? `Must be at least ${minimum}`), addKeyword(projection, "minimum", minimum)),
25
+ max: (maximum, message) => withNumber(schema.refine((value) => value <= maximum, message ?? `Must be at most ${maximum}`), addKeyword(projection, "maximum", maximum)),
26
+ int: (message) => withNumber(schema.refine(Number.isInteger, message ?? "Expected an integer"), addKeyword(projection, "type", "integer")),
27
+ positive: (message) => withNumber(schema.refine((value) => value > 0, message ?? "Expected a positive number"), addKeyword(projection, "exclusiveMinimum", 0)),
28
+ nonnegative: (message) => withNumber(schema.refine((value) => value >= 0, message ?? "Expected a nonnegative number"), addKeyword(projection, "minimum", 0)),
29
+ });
30
+ setSchemaMetadata(refined, projection ? { jsonSchema: projection } : {});
31
+ return refined;
32
+ }
33
+ function addKeyword(projection, key, value) {
34
+ if (!projection)
35
+ return undefined;
36
+ return () => {
37
+ const schema = projection();
38
+ if (!isRecord(schema))
39
+ throw new TypeError("Schema projection must be an object");
40
+ return { ...schema, [key]: value };
41
+ };
42
+ }
43
+ function isRecord(value) {
44
+ return typeof value === "object" && value !== null && !Array.isArray(value);
45
+ }
46
+ const UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
47
+ const EMAIL = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
48
+ //# sourceMappingURL=builder-refinements.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builder-refinements.js","sourceRoot":"","sources":["../src/builder-refinements.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,73 @@
1
+ import { type InferInput, type InferOutput, type Schema, type StandardSchemaV1 } from "./standard-schema.js";
2
+ import { type FileSchema, type FileSchemaOptions } from "./file.js";
3
+ export type AnySchema = StandardSchemaV1;
4
+ export type Shape = Record<string, AnySchema>;
5
+ export type InputOf<S extends AnySchema> = InferInput<S>;
6
+ export type OutputOf<S extends AnySchema> = InferOutput<S>;
7
+ type OptionalInputKeys<S extends Shape> = {
8
+ [K in keyof S]-?: undefined extends InputOf<S[K]> ? K : never;
9
+ }[keyof S];
10
+ type OptionalOutputKeys<S extends Shape> = {
11
+ [K in keyof S]-?: undefined extends OutputOf<S[K]> ? K : never;
12
+ }[keyof S];
13
+ type RequiredInputKeys<S extends Shape> = Exclude<keyof S, OptionalInputKeys<S>>;
14
+ type RequiredOutputKeys<S extends Shape> = Exclude<keyof S, OptionalOutputKeys<S>>;
15
+ export type ObjectInput<S extends Shape> = {
16
+ [K in RequiredInputKeys<S>]: InputOf<S[K]>;
17
+ } & {
18
+ [K in OptionalInputKeys<S>]?: Exclude<InputOf<S[K]>, undefined>;
19
+ };
20
+ export type ObjectOutput<S extends Shape> = {
21
+ [K in RequiredOutputKeys<S>]: OutputOf<S[K]>;
22
+ } & {
23
+ [K in OptionalOutputKeys<S>]?: Exclude<OutputOf<S[K]>, undefined>;
24
+ };
25
+ export type SchemaTuple = readonly [AnySchema, ...AnySchema[]];
26
+ /** A string schema with the common v3 format and length refinements. */
27
+ export interface StringSchema extends Schema<string, string> {
28
+ min(length: number, message?: string): StringSchema;
29
+ max(length: number, message?: string): StringSchema;
30
+ uuid(message?: string): StringSchema;
31
+ datetime(message?: string): StringSchema;
32
+ email(message?: string): StringSchema;
33
+ }
34
+ /** A finite-number schema with the common v3 numeric refinements. */
35
+ export interface NumberSchema extends Schema<number, number> {
36
+ min(value: number, message?: string): NumberSchema;
37
+ max(value: number, message?: string): NumberSchema;
38
+ int(message?: string): NumberSchema;
39
+ positive(message?: string): NumberSchema;
40
+ nonnegative(message?: string): NumberSchema;
41
+ }
42
+ /** The dependency-free familiar builder exposed as `z`. */
43
+ export interface ZBuilder {
44
+ string(): StringSchema;
45
+ number(): NumberSchema;
46
+ boolean(): Schema<boolean, boolean>;
47
+ unknown(): Schema<unknown, unknown>;
48
+ any(): Schema<unknown, unknown>;
49
+ null(): Schema<null, null>;
50
+ file(options?: FileSchemaOptions): FileSchema;
51
+ undefined(): Schema<undefined, undefined>;
52
+ void(): Schema<undefined, undefined>;
53
+ literal<T extends string | number | boolean | null | undefined>(value: T): Schema<T, T>;
54
+ object<S extends Shape>(shape: S): Schema<ObjectInput<S>, ObjectOutput<S>>;
55
+ array<S extends AnySchema>(schema: S): Schema<InputOf<S>[], OutputOf<S>[]>;
56
+ union<S extends SchemaTuple>(schemas: S): Schema<InputOf<S[number]>, OutputOf<S[number]>>;
57
+ }
58
+ /**
59
+ * Builds RELKIT Standard Schema validators with familiar composition helpers.
60
+ *
61
+ * @example
62
+ * ```ts
63
+ * import { z } from "@relkit/app/schema"
64
+ *
65
+ * const order = z.object({ id: z.string(), quantity: z.number().int().positive() })
66
+ * order.parse({ id: "order-1", quantity: 2 })
67
+ * ```
68
+ * @category Schemas
69
+ * @since 0.1.0
70
+ */
71
+ export declare const z: ZBuilder;
72
+ export {};
73
+ //# sourceMappingURL=builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../src/builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ import { createSchema, issue, } from "./standard-schema.js";
2
+ import { arraySchema, objectSchema, unionSchema } from "./builder-composites.js";
3
+ import { numberSchema, stringSchema } from "./builder-refinements.js";
4
+ import { fileSchema } from "./file.js";
5
+ /**
6
+ * Builds RELKIT Standard Schema validators with familiar composition helpers.
7
+ *
8
+ * @example
9
+ * ```ts
10
+ * import { z } from "@relkit/app/schema"
11
+ *
12
+ * const order = z.object({ id: z.string(), quantity: z.number().int().positive() })
13
+ * order.parse({ id: "order-1", quantity: 2 })
14
+ * ```
15
+ * @category Schemas
16
+ * @since 0.1.0
17
+ */
18
+ export const z = {
19
+ string: () => stringSchema(),
20
+ number: () => numberSchema(),
21
+ boolean: () => primitiveSchema("boolean", (value) => typeof value === "boolean"),
22
+ unknown: () => createSchema((value) => ({ value }), { jsonSchema: () => ({}) }),
23
+ any: () => createSchema((value) => ({ value }), { jsonSchema: () => ({}) }),
24
+ null: () => primitiveSchema("null", (value) => value === null),
25
+ file: fileSchema,
26
+ undefined: undefinedSchema,
27
+ void: undefinedSchema,
28
+ literal: literalSchema,
29
+ object: objectSchema,
30
+ array: arraySchema,
31
+ union: unionSchema,
32
+ };
33
+ function primitiveSchema(name, guard) {
34
+ return createSchema((value, path) => (guard(value) ? { value } : issue(`Expected ${name}`, path)), { jsonSchema: () => ({ type: name }) });
35
+ }
36
+ function literalSchema(expected) {
37
+ return createSchema((value, path) => Object.is(value, expected)
38
+ ? { value: expected }
39
+ : issue(`Expected ${String(expected)}`, path), {
40
+ jsonSchema: () => expected === undefined ? { "x-relkit-void": true } : { const: expected },
41
+ });
42
+ }
43
+ function undefinedSchema() {
44
+ return createSchema((value, path) => (value === undefined ? { value } : issue("Expected undefined", path)), { jsonSchema: () => ({ "x-relkit-void": true }) });
45
+ }
46
+ //# sourceMappingURL=builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builder.js","sourceRoot":"","sources":["../src/builder.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,KAAK,GAKN,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAE,UAAU,EAA2C,MAAM,WAAW,CAAC;AA8DhF;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,CAAC,GAAa;IACzB,MAAM,EAAE,GAAG,EAAE,CAAC,YAAY,EAAE;IAC5B,MAAM,EAAE,GAAG,EAAE,CAAC,YAAY,EAAE;IAC5B,OAAO,EAAE,GAAG,EAAE,CACZ,eAAe,CAAC,SAAS,EAAE,CAAC,KAAK,EAAoB,EAAE,CAAC,OAAO,KAAK,KAAK,SAAS,CAAC;IACrF,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IAC/E,GAAG,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IAC3E,IAAI,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,MAAM,EAAE,CAAC,KAAK,EAAiB,EAAE,CAAC,KAAK,KAAK,IAAI,CAAC;IAC7E,IAAI,EAAE,UAAU;IAChB,SAAS,EAAE,eAAe;IAC1B,IAAI,EAAE,eAAe;IACrB,OAAO,EAAE,aAAa;IACtB,MAAM,EAAE,YAAY;IACpB,KAAK,EAAE,WAAW;IAClB,KAAK,EAAE,WAAW;CACnB,CAAC;AAEF,SAAS,eAAe,CAAI,IAAY,EAAE,KAAqC;IAC7E,OAAO,YAAY,CACjB,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,YAAY,IAAI,EAAE,EAAE,IAAI,CAAC,CAAC,EAC7E,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,CACvC,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CACpB,QAAW;IAEX,OAAO,YAAY,CACjB,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CACd,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC;QACxB,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE;QACrB,CAAC,CAAC,KAAK,CAAC,YAAY,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC,EACjD;QACE,UAAU,EAAE,GAAG,EAAE,CACf,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,QAAqB,EAAE;KACxF,CACF,CAAC;AACJ,CAAC;AAED,SAAS,eAAe;IACtB,OAAO,YAAY,CACjB,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,oBAAoB,EAAE,IAAI,CAAC,CAAC,EACtF,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC,EAAE,CAClD,CAAC;AACJ,CAAC"}
package/dist/file.d.ts ADDED
@@ -0,0 +1,9 @@
1
+ import { type Schema } from "./standard-schema.js";
2
+ export interface FileSchemaOptions {
3
+ readonly maxBytes?: number;
4
+ readonly mediaTypes?: readonly string[];
5
+ }
6
+ export type FileSchema = Schema<File, File>;
7
+ /** Validates a buffered Web File and projects it as an OpenAPI binary value. */
8
+ export declare function fileSchema(options?: FileSchemaOptions): FileSchema;
9
+ //# sourceMappingURL=file.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file.d.ts","sourceRoot":"","sources":["../src/file.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,KAAK,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAExE,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACzC;AAED,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AAE5C,gFAAgF;AAChF,wBAAgB,UAAU,CAAC,OAAO,GAAE,iBAAsB,GAAG,UAAU,CAyBtE"}
package/dist/file.js ADDED
@@ -0,0 +1,51 @@
1
+ import { createSchema, issue } from "./standard-schema.js";
2
+ /** Validates a buffered Web File and projects it as an OpenAPI binary value. */
3
+ export function fileSchema(options = {}) {
4
+ const maxBytes = positive(options.maxBytes);
5
+ const mediaTypes = normalizeMediaTypes(options.mediaTypes);
6
+ return createSchema((value, path) => {
7
+ if (typeof File === "undefined" || !(value instanceof File)) {
8
+ return issue("Expected a file", path);
9
+ }
10
+ if (maxBytes !== undefined && value.size > maxBytes) {
11
+ return issue(`File exceeds ${maxBytes} bytes`, path);
12
+ }
13
+ if (mediaTypes !== undefined && !mediaTypes.some((type) => matches(type, value.type))) {
14
+ return issue(`Unsupported file media type "${mediaType(value.type) || "unknown"}"`, path);
15
+ }
16
+ return { value };
17
+ }, {
18
+ jsonSchema: () => ({
19
+ type: "string",
20
+ format: "binary",
21
+ ...(maxBytes === undefined ? {} : { "x-relkit-maxBytes": maxBytes }),
22
+ ...(mediaTypes === undefined ? {} : { "x-relkit-mediaTypes": mediaTypes }),
23
+ }),
24
+ });
25
+ }
26
+ function positive(value) {
27
+ if (value !== undefined && (!Number.isSafeInteger(value) || value < 1)) {
28
+ throw new TypeError("file.maxBytes must be a positive integer");
29
+ }
30
+ return value;
31
+ }
32
+ function normalizeMediaTypes(values) {
33
+ if (values === undefined)
34
+ return undefined;
35
+ if (!Array.isArray(values) || values.length === 0) {
36
+ throw new TypeError("file.mediaTypes must be a non-empty array");
37
+ }
38
+ const result = values.map((value) => value.trim().toLowerCase());
39
+ if (result.some((value) => !/^[a-z0-9!#$&^_.+-]+\/(?:\*|[a-z0-9!#$&^_.+-]+)$/.test(value))) {
40
+ throw new TypeError("file.mediaTypes contains an invalid media type");
41
+ }
42
+ return Object.freeze([...new Set(result)].sort());
43
+ }
44
+ function matches(expected, actual) {
45
+ const value = mediaType(actual);
46
+ return expected.endsWith("/*") ? value.startsWith(expected.slice(0, -1)) : value === expected;
47
+ }
48
+ function mediaType(value) {
49
+ return value.split(";", 1)[0].trim().toLowerCase();
50
+ }
51
+ //# sourceMappingURL=file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file.js","sourceRoot":"","sources":["../src/file.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,KAAK,EAAe,MAAM,sBAAsB,CAAC;AASxE,gFAAgF;AAChF,MAAM,UAAU,UAAU,CAAC,UAA6B,EAAE;IACxD,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC5C,MAAM,UAAU,GAAG,mBAAmB,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC3D,OAAO,YAAY,CACjB,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACd,IAAI,OAAO,IAAI,KAAK,WAAW,IAAI,CAAC,CAAC,KAAK,YAAY,IAAI,CAAC,EAAE,CAAC;YAC5D,OAAO,KAAK,CAAC,iBAAiB,EAAE,IAAI,CAAC,CAAC;QACxC,CAAC;QACD,IAAI,QAAQ,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,GAAG,QAAQ,EAAE,CAAC;YACpD,OAAO,KAAK,CAAC,gBAAgB,QAAQ,QAAQ,EAAE,IAAI,CAAC,CAAC;QACvD,CAAC;QACD,IAAI,UAAU,KAAK,SAAS,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;YACtF,OAAO,KAAK,CAAC,gCAAgC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,SAAS,GAAG,EAAE,IAAI,CAAC,CAAC;QAC5F,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,CAAC;IACnB,CAAC,EACD;QACE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;YACjB,IAAI,EAAE,QAAQ;YACd,MAAM,EAAE,QAAQ;YAChB,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,mBAAmB,EAAE,QAAQ,EAAE,CAAC;YACpE,GAAG,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,qBAAqB,EAAE,UAAU,EAAE,CAAC;SAC3E,CAAC;KACH,CACF,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,KAAyB;IACzC,IAAI,KAAK,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC;QACvE,MAAM,IAAI,SAAS,CAAC,0CAA0C,CAAC,CAAC;IAClE,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,mBAAmB,CAAC,MAAqC;IAChE,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC3C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClD,MAAM,IAAI,SAAS,CAAC,2CAA2C,CAAC,CAAC;IACnE,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;IACjE,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,iDAAiD,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;QAC3F,MAAM,IAAI,SAAS,CAAC,gDAAgD,CAAC,CAAC;IACxE,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;AACpD,CAAC;AAED,SAAS,OAAO,CAAC,QAAgB,EAAE,MAAc;IAC/C,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;IAChC,OAAO,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAC;AAChG,CAAC;AAED,SAAS,SAAS,CAAC,KAAa;IAC9B,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AACtD,CAAC"}
@@ -0,0 +1,8 @@
1
+ export { z } from "./builder.js";
2
+ export type { NumberSchema, StringSchema, ZBuilder } from "./builder.js";
3
+ export type { FileSchema, FileSchemaOptions } from "./file.js";
4
+ export { SchemaValidationError, validate, validateSync } from "./standard-schema.js";
5
+ export { getJsonSchema, isJsonSchemaAvailable, toJsonSchema, JSON_SCHEMA_UNAVAILABLE, } from "./json-schema.js";
6
+ export type { JsonSchema, JsonSchemaAvailable, JsonSchemaFactory, JsonSchemaResult, JsonSchemaUnavailable, } from "./json-schema.js";
7
+ export type { InferInput, InferOutput, Schema, StandardFailure, StandardIssue, StandardPathSegment, StandardResult, StandardSchemaOptions, StandardSchemaTypes, StandardSchemaV1, StandardJSONSchemaV1, StandardSuccess, RelkitSchema, } from "./standard-schema.js";
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,cAAc,CAAC;AACjC,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACzE,YAAY,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACrF,OAAO,EACL,aAAa,EACb,qBAAqB,EACrB,YAAY,EACZ,uBAAuB,GACxB,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACV,UAAU,EACV,mBAAmB,EACnB,iBAAiB,EACjB,gBAAgB,EAChB,qBAAqB,GACtB,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACV,UAAU,EACV,WAAW,EACX,MAAM,EACN,eAAe,EACf,aAAa,EACb,mBAAmB,EACnB,cAAc,EACd,qBAAqB,EACrB,mBAAmB,EACnB,gBAAgB,EAChB,oBAAoB,EACpB,eAAe,EACf,YAAY,GACb,MAAM,sBAAsB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,4 @@
1
+ export { z } from "./builder.js";
2
+ export { SchemaValidationError, validate, validateSync } from "./standard-schema.js";
3
+ export { getJsonSchema, isJsonSchemaAvailable, toJsonSchema, JSON_SCHEMA_UNAVAILABLE, } from "./json-schema.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,cAAc,CAAC;AAGjC,OAAO,EAAE,qBAAqB,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACrF,OAAO,EACL,aAAa,EACb,qBAAqB,EACrB,YAAY,EACZ,uBAAuB,GACxB,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,27 @@
1
+ import type { JsonValue, StandardSchemaV1 } from "./standard-schema.js";
2
+ export declare const JSON_SCHEMA_UNAVAILABLE: "RELKIT_SCHEMA_UNAVAILABLE";
3
+ /** A JSON Schema document with JSON-safe values and deterministic key order. */
4
+ export type JsonSchema = {
5
+ readonly [key: string]: JsonValue;
6
+ };
7
+ export interface JsonSchemaAvailable {
8
+ readonly ok: true;
9
+ readonly schema: JsonSchema;
10
+ }
11
+ export interface JsonSchemaUnavailable {
12
+ readonly ok: false;
13
+ readonly code: typeof JSON_SCHEMA_UNAVAILABLE;
14
+ readonly reason: string;
15
+ }
16
+ export type JsonSchemaResult = JsonSchemaAvailable | JsonSchemaUnavailable;
17
+ export type JsonSchemaFactory = () => JsonValue;
18
+ /** Returns a schema's deterministic projection hook without executing it. */
19
+ export declare function getSchemaProjection(schema: StandardSchemaV1): JsonSchemaFactory | undefined;
20
+ /** Returns whether a schema accepts an omitted object property. */
21
+ export declare function isSchemaOptional(schema: StandardSchemaV1): boolean;
22
+ /** Obtains or generates a canonical JSON Schema without guessing unsupported behavior. */
23
+ export declare function getJsonSchema(schema: StandardSchemaV1): JsonSchemaResult;
24
+ /** Alias for callers that describe projection as a conversion. */
25
+ export declare const toJsonSchema: typeof getJsonSchema;
26
+ export declare function isJsonSchemaAvailable(result: JsonSchemaResult): result is JsonSchemaAvailable;
27
+ //# sourceMappingURL=json-schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-schema.d.ts","sourceRoot":"","sources":["../src/json-schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAGxE,eAAO,MAAM,uBAAuB,EAAG,2BAAoC,CAAC;AAE5E,gFAAgF;AAChF,MAAM,MAAM,UAAU,GAAG;IAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAC;AAE/D,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAClB,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;CAC7B;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IACnB,QAAQ,CAAC,IAAI,EAAE,OAAO,uBAAuB,CAAC;IAC9C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,MAAM,gBAAgB,GAAG,mBAAmB,GAAG,qBAAqB,CAAC;AAC3E,MAAM,MAAM,iBAAiB,GAAG,MAAM,SAAS,CAAC;AAEhD,6EAA6E;AAC7E,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,gBAAgB,GAAG,iBAAiB,GAAG,SAAS,CAM3F;AAED,mEAAmE;AACnE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAElE;AAED,0FAA0F;AAC1F,wBAAgB,aAAa,CAAC,MAAM,EAAE,gBAAgB,GAAG,gBAAgB,CAaxE;AAED,kEAAkE;AAClE,eAAO,MAAM,YAAY,sBAAgB,CAAC;AAE1C,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,IAAI,mBAAmB,CAE7F"}
@@ -0,0 +1,89 @@
1
+ import { getSchemaMetadata } from "./schema-metadata.js";
2
+ export const JSON_SCHEMA_UNAVAILABLE = "RELKIT_SCHEMA_UNAVAILABLE";
3
+ /** Returns a schema's deterministic projection hook without executing it. */
4
+ export function getSchemaProjection(schema) {
5
+ const metadata = getSchemaMetadata(schema);
6
+ if (metadata?.jsonSchema)
7
+ return metadata.jsonSchema;
8
+ return schema.relkit?.jsonSchema;
9
+ }
10
+ /** Returns whether a schema accepts an omitted object property. */
11
+ export function isSchemaOptional(schema) {
12
+ return getSchemaMetadata(schema)?.optional === true;
13
+ }
14
+ /** Obtains or generates a canonical JSON Schema without guessing unsupported behavior. */
15
+ export function getJsonSchema(schema) {
16
+ try {
17
+ if (schema?.["~standard"]?.version !== 1) {
18
+ return unavailable("Schema is not a Standard Schema v1 validator");
19
+ }
20
+ const projection = getSchemaProjection(schema);
21
+ if (!projection)
22
+ return unavailable("Schema does not expose a deterministic projection");
23
+ const value = sortJsonValue(projection(), "$", undefined);
24
+ if (!isRecord(value))
25
+ return unavailable("Schema projection must be a JSON object");
26
+ return { ok: true, schema: value };
27
+ }
28
+ catch (error) {
29
+ return unavailable(error instanceof Error ? error.message : String(error));
30
+ }
31
+ }
32
+ /** Alias for callers that describe projection as a conversion. */
33
+ export const toJsonSchema = getJsonSchema;
34
+ export function isJsonSchemaAvailable(result) {
35
+ return result.ok;
36
+ }
37
+ function unavailable(reason) {
38
+ return { ok: false, code: JSON_SCHEMA_UNAVAILABLE, reason };
39
+ }
40
+ function sortJsonValue(value, path, key) {
41
+ if (value === null || typeof value === "string" || typeof value === "boolean")
42
+ return value;
43
+ if (typeof value === "number") {
44
+ if (!Number.isFinite(value))
45
+ throw invalid(path, "non-finite numbers are not supported");
46
+ return Object.is(value, -0) ? 0 : value;
47
+ }
48
+ if (Array.isArray(value)) {
49
+ if (Object.getPrototypeOf(value) !== Array.prototype)
50
+ throw invalid(path, "array prototype");
51
+ const names = Object.getOwnPropertyNames(value);
52
+ if (names.some((name) => name !== "length" && !isArrayIndex(name, value.length))) {
53
+ throw invalid(path, "array properties");
54
+ }
55
+ const items = value.map((item, index) => sortJsonValue(item, `${path}[${index}]`, undefined));
56
+ return key === "required" && items.every((item) => typeof item === "string")
57
+ ? [...items].sort()
58
+ : items;
59
+ }
60
+ if (typeof value !== "object" || value === undefined)
61
+ throw invalid(path, "non-JSON data");
62
+ if (!isPlainObject(value))
63
+ throw invalid(path, "object prototype");
64
+ if (Object.getOwnPropertySymbols(value).length > 0)
65
+ throw invalid(path, "symbol keys");
66
+ const result = {};
67
+ for (const name of Object.keys(value).sort()) {
68
+ const descriptor = Object.getOwnPropertyDescriptor(value, name);
69
+ if (!descriptor || !("value" in descriptor))
70
+ throw invalid(`${path}.${name}`, "accessor");
71
+ result[name] = sortJsonValue(descriptor.value, `${path}.${name}`, name);
72
+ }
73
+ return result;
74
+ }
75
+ function invalid(path, reason) {
76
+ return new TypeError(`Invalid JSON Schema projection at ${path}: ${reason}`);
77
+ }
78
+ function isRecord(value) {
79
+ return typeof value === "object" && value !== null && !Array.isArray(value);
80
+ }
81
+ function isPlainObject(value) {
82
+ const prototype = Object.getPrototypeOf(value);
83
+ return prototype === null || prototype === Object.prototype;
84
+ }
85
+ function isArrayIndex(key, length) {
86
+ const index = Number(key);
87
+ return Number.isInteger(index) && index >= 0 && index < length && String(index) === key;
88
+ }
89
+ //# sourceMappingURL=json-schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-schema.js","sourceRoot":"","sources":["../src/json-schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { Schema, StandardFailure, StandardPathSegment, StandardResult, StandardSchemaV1 } from "./standard-schema.js";
2
+ import { type SchemaMetadata } from "./schema-metadata.js";
3
+ type Check<T> = (value: unknown, path: readonly StandardPathSegment[]) => StandardResult<T> | Promise<StandardResult<T>>;
4
+ /** Error thrown by the familiar `parse` helper when validation fails. */
5
+ export declare class SchemaValidationError extends TypeError {
6
+ readonly issues: StandardFailure["issues"];
7
+ constructor(issues: StandardFailure["issues"]);
8
+ }
9
+ /** Creates a schema implementation without exposing its concrete class. */
10
+ export declare function createSchema<TInput, TOutput>(check: Check<TOutput>, metadata?: SchemaMetadata): Schema<TInput, TOutput>;
11
+ /** Runs either a RelKit schema or a third-party Standard Schema at a nested path. */
12
+ export declare function runSchema<TOutput>(schema: StandardSchemaV1<unknown, TOutput>, value: unknown, path?: readonly StandardPathSegment[]): StandardResult<TOutput> | Promise<StandardResult<TOutput>>;
13
+ export {};
14
+ //# sourceMappingURL=schema-impl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-impl.d.ts","sourceRoot":"","sources":["../src/schema-impl.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,MAAM,EACN,eAAe,EACf,mBAAmB,EACnB,cAAc,EAEd,gBAAgB,EAGjB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAKL,KAAK,cAAc,EACpB,MAAM,sBAAsB,CAAC;AAC9B,KAAK,KAAK,CAAC,CAAC,IAAI,CACd,KAAK,EAAE,OAAO,EACd,IAAI,EAAE,SAAS,mBAAmB,EAAE,KACjC,cAAc,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;AAIpD,yEAAyE;AACzE,qBAAa,qBAAsB,SAAQ,SAAS;IAClD,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC,QAAQ,CAAC,CAAC;gBAC/B,MAAM,EAAE,eAAe,CAAC,QAAQ,CAAC;CAK9C;AACD,2EAA2E;AAC3E,wBAAgB,YAAY,CAAC,MAAM,EAAE,OAAO,EAC1C,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,EACrB,QAAQ,GAAE,cAAmB,GAC5B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAIzB;AACD,qFAAqF;AACrF,wBAAgB,SAAS,CAAC,OAAO,EAC/B,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,EAC1C,KAAK,EAAE,OAAO,EACd,IAAI,GAAE,SAAS,mBAAmB,EAAO,GACxC,cAAc,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAI5D"}
@@ -0,0 +1,131 @@
1
+ import { setSchemaMetadata, withDefaultMetadata, withNullableMetadata, withOptionalMetadata, } from "./schema-metadata.js";
2
+ /** Error thrown by the familiar `parse` helper when validation fails. */
3
+ export class SchemaValidationError extends TypeError {
4
+ issues;
5
+ constructor(issues) {
6
+ super("Schema validation failed");
7
+ this.name = "SchemaValidationError";
8
+ this.issues = issues;
9
+ }
10
+ }
11
+ /** Creates a schema implementation without exposing its concrete class. */
12
+ export function createSchema(check, metadata = {}) {
13
+ const schema = new SchemaImplementation(check, metadata);
14
+ setSchemaMetadata(schema, metadata);
15
+ return schema;
16
+ }
17
+ /** Runs either a RelKit schema or a third-party Standard Schema at a nested path. */
18
+ export function runSchema(schema, value, path = []) {
19
+ const internal = schema;
20
+ if (typeof internal._run === "function")
21
+ return internal._run(value, path);
22
+ return addPath(schema["~standard"].validate(value), path);
23
+ }
24
+ class SchemaImplementation {
25
+ _run;
26
+ "~standard";
27
+ relkit;
28
+ constructor(check, metadata) {
29
+ this._run = check;
30
+ this.relkit = metadata.jsonSchema ? { jsonSchema: metadata.jsonSchema } : {};
31
+ this["~standard"] = {
32
+ version: 1,
33
+ vendor: "relkit",
34
+ types: undefined,
35
+ validate: (value, options) => {
36
+ void options;
37
+ return check(value, []);
38
+ },
39
+ jsonSchema: {
40
+ input: (options) => projectJsonSchema(metadata, options.target),
41
+ output: (options) => projectJsonSchema(metadata, options.target),
42
+ },
43
+ };
44
+ }
45
+ optional() {
46
+ return createSchema((value, path) => (value === undefined ? success(value) : this._run(value, path)), withOptionalMetadata(this));
47
+ }
48
+ nullable() {
49
+ return createSchema((value, path) => (value === null ? success(value) : this._run(value, path)), withNullableMetadata(this));
50
+ }
51
+ default(value) {
52
+ return createSchema((input, path) => input === undefined
53
+ ? this._run(typeof value === "function" ? value() : value, path)
54
+ : this._run(input, path), withDefaultMetadata(this, value));
55
+ }
56
+ transform(transform) {
57
+ return createSchema((value, path) => flatMapResult(this._run(value, path), (result) => mapValue(transform(result), (output) => success(output))));
58
+ }
59
+ refine(check, message = "Invalid value") {
60
+ return createSchema((value, path) => flatMapResult(this._run(value, path), (result) => mapValue(check(result), (valid) => (valid ? success(result) : failure(message, path)))));
61
+ }
62
+ parse(value) {
63
+ return unwrapSync(this._run(value, []));
64
+ }
65
+ async parseAsync(value) {
66
+ return unwrap(await Promise.resolve(this._run(value, [])));
67
+ }
68
+ safeParse(value) {
69
+ return this._run(value, []);
70
+ }
71
+ }
72
+ function projectJsonSchema(metadata, target) {
73
+ if (target !== "draft-2020-12" && target !== "draft-07" && target !== "openapi-3.0") {
74
+ throw new TypeError(`Unsupported JSON Schema target "${target}"`);
75
+ }
76
+ const value = metadata.jsonSchema?.();
77
+ if (value === undefined || value === null || Array.isArray(value) || typeof value !== "object") {
78
+ throw new TypeError("Schema does not expose a deterministic JSON Schema projection");
79
+ }
80
+ return value;
81
+ }
82
+ function addPath(result, path) {
83
+ return mapResult(result, (resolved) => {
84
+ if (!isFailure(resolved) || path.length === 0)
85
+ return resolved;
86
+ return {
87
+ issues: resolved.issues.map((issue) => ({
88
+ ...issue,
89
+ path: [...path, ...(issue.path ?? [])],
90
+ })),
91
+ };
92
+ });
93
+ }
94
+ function mapResult(result, map) {
95
+ return isPromiseLike(result) ? result.then(map) : map(result);
96
+ }
97
+ function flatMapResult(result, map) {
98
+ if (isPromiseLike(result)) {
99
+ return result.then((resolved) => (isFailure(resolved) ? resolved : map(resolved.value)));
100
+ }
101
+ return isFailure(result) ? result : map(result.value);
102
+ }
103
+ function mapValue(value, map) {
104
+ return isPromiseLike(value) ? value.then(map) : map(value);
105
+ }
106
+ function isPromiseLike(value) {
107
+ return (typeof value === "object" &&
108
+ value !== null &&
109
+ "then" in value &&
110
+ typeof value.then === "function");
111
+ }
112
+ function isFailure(result) {
113
+ return "issues" in result && result.issues !== undefined;
114
+ }
115
+ function success(value) {
116
+ return { value };
117
+ }
118
+ function failure(message, path) {
119
+ return { issues: [{ message, path }] };
120
+ }
121
+ function unwrap(result) {
122
+ if (isFailure(result))
123
+ throw new SchemaValidationError(result.issues);
124
+ return result.value;
125
+ }
126
+ function unwrapSync(result) {
127
+ if (isPromiseLike(result))
128
+ throw new TypeError("Schema validation is asynchronous");
129
+ return unwrap(result);
130
+ }
131
+ //# sourceMappingURL=schema-impl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-impl.js","sourceRoot":"","sources":["../src/schema-impl.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { JsonValue, StandardSchemaV1 } from "./standard-schema.js";
2
+ export interface SchemaMetadata {
3
+ readonly jsonSchema?: () => JsonValue;
4
+ readonly optional?: boolean;
5
+ }
6
+ export declare function getSchemaMetadata(schema: StandardSchemaV1): SchemaMetadata | undefined;
7
+ export declare function setSchemaMetadata(schema: StandardSchemaV1, metadata: SchemaMetadata): void;
8
+ export declare function withOptionalMetadata(schema: StandardSchemaV1): SchemaMetadata;
9
+ export declare function withNullableMetadata(schema: StandardSchemaV1): SchemaMetadata;
10
+ export declare function withDefaultMetadata<T>(schema: StandardSchemaV1, value: T | (() => T)): SchemaMetadata;
11
+ //# sourceMappingURL=schema-metadata.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-metadata.d.ts","sourceRoot":"","sources":["../src/schema-metadata.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAExE,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,SAAS,CAAC;IACtC,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;CAC7B;AAID,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,gBAAgB,GAAG,cAAc,GAAG,SAAS,CAEtF;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,gBAAgB,EAAE,QAAQ,EAAE,cAAc,GAAG,IAAI,CAE1F;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,gBAAgB,GAAG,cAAc,CAE7E;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,gBAAgB,GAAG,cAAc,CAO7E;AAED,wBAAgB,mBAAmB,CAAC,CAAC,EACnC,MAAM,EAAE,gBAAgB,EACxB,KAAK,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,GACnB,cAAc,CAYhB"}
@@ -0,0 +1,38 @@
1
+ const metadataBySchema = new WeakMap();
2
+ export function getSchemaMetadata(schema) {
3
+ return metadataBySchema.get(schema);
4
+ }
5
+ export function setSchemaMetadata(schema, metadata) {
6
+ metadataBySchema.set(schema, metadata);
7
+ }
8
+ export function withOptionalMetadata(schema) {
9
+ return { ...(getSchemaMetadata(schema) ?? {}), optional: true };
10
+ }
11
+ export function withNullableMetadata(schema) {
12
+ const metadata = getSchemaMetadata(schema);
13
+ if (!metadata?.jsonSchema)
14
+ return metadata ?? {};
15
+ return {
16
+ ...metadata,
17
+ jsonSchema: () => ({ anyOf: [metadata.jsonSchema(), { type: "null" }] }),
18
+ };
19
+ }
20
+ export function withDefaultMetadata(schema, value) {
21
+ const metadata = getSchemaMetadata(schema);
22
+ if (!metadata?.jsonSchema)
23
+ return metadata ? { ...metadata, optional: true } : { optional: true };
24
+ return {
25
+ ...metadata,
26
+ optional: true,
27
+ jsonSchema: () => {
28
+ const projected = metadata.jsonSchema();
29
+ if (!isRecord(projected))
30
+ throw new TypeError("Schema projection must be an object");
31
+ return { ...projected, default: value };
32
+ },
33
+ };
34
+ }
35
+ function isRecord(value) {
36
+ return typeof value === "object" && value !== null && !Array.isArray(value);
37
+ }
38
+ //# sourceMappingURL=schema-metadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-metadata.js","sourceRoot":"","sources":["../src/schema-metadata.ts"],"names":[],"mappings":"AAOA,MAAM,gBAAgB,GAAG,IAAI,OAAO,EAAoC,CAAC;AAEzE,MAAM,UAAU,iBAAiB,CAAC,MAAwB;IACxD,OAAO,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAAwB,EAAE,QAAwB;IAClF,gBAAgB,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,MAAwB;IAC3D,OAAO,EAAE,GAAG,CAAC,iBAAiB,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,MAAwB;IAC3D,MAAM,QAAQ,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAC3C,IAAI,CAAC,QAAQ,EAAE,UAAU;QAAE,OAAO,QAAQ,IAAI,EAAE,CAAC;IACjD,OAAO;QACL,GAAG,QAAQ;QACX,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,QAAQ,CAAC,UAAW,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;KAC1E,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,MAAwB,EACxB,KAAoB;IAEpB,MAAM,QAAQ,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAC3C,IAAI,CAAC,QAAQ,EAAE,UAAU;QAAE,OAAO,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAClG,OAAO;QACL,GAAG,QAAQ;QACX,QAAQ,EAAE,IAAI;QACd,UAAU,EAAE,GAAG,EAAE;YACf,MAAM,SAAS,GAAG,QAAQ,CAAC,UAAW,EAAE,CAAC;YACzC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;gBAAE,MAAM,IAAI,SAAS,CAAC,qCAAqC,CAAC,CAAC;YACrF,OAAO,EAAE,GAAG,SAAS,EAAE,OAAO,EAAE,KAA6B,EAAE,CAAC;QAClE,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,KAAgB;IAChC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC"}
@@ -0,0 +1,121 @@
1
+ /** A Standard Schema v1 path may use a key directly or a structured segment. */
2
+ export type StandardPathSegment = PropertyKey | {
3
+ readonly key: PropertyKey;
4
+ };
5
+ /** A portable validation issue. */
6
+ export interface StandardIssue {
7
+ readonly message: string;
8
+ readonly path?: readonly StandardPathSegment[];
9
+ }
10
+ /** The success result returned by a Standard Schema validator. */
11
+ export interface StandardSuccess<T> {
12
+ readonly value: T;
13
+ readonly issues?: undefined;
14
+ }
15
+ /** The failure result returned by a Standard Schema validator. */
16
+ export interface StandardFailure {
17
+ readonly issues: readonly StandardIssue[];
18
+ }
19
+ /** A Standard Schema v1 validation result. */
20
+ export type StandardResult<T> = StandardSuccess<T> | StandardFailure;
21
+ /** Standard Schema v1 options accepted by compatible validators. */
22
+ export interface StandardSchemaOptions {
23
+ readonly libraryOptions?: Record<string, unknown> | undefined;
24
+ }
25
+ /** Type-only input/output information advertised by Standard Schema. */
26
+ export interface StandardSchemaTypes<TInput = unknown, TOutput = TInput> {
27
+ readonly input: TInput;
28
+ readonly output: TOutput;
29
+ }
30
+ /** The Standard Schema v1 contract accepted by RelKit. */
31
+ export interface StandardSchemaV1<TInput = unknown, TOutput = TInput> {
32
+ readonly "~standard": {
33
+ readonly version: 1;
34
+ readonly vendor: string;
35
+ readonly validate: (value: unknown, options?: StandardSchemaOptions) => StandardResult<TOutput> | Promise<StandardResult<TOutput>>;
36
+ readonly types?: StandardSchemaTypes<TInput, TOutput>;
37
+ };
38
+ }
39
+ export interface StandardJSONSchemaV1<TInput = unknown, TOutput = TInput> {
40
+ readonly "~standard": StandardJSONSchemaV1.Props<TInput, TOutput>;
41
+ }
42
+ export declare namespace StandardJSONSchemaV1 {
43
+ interface Props<Input = unknown, Output = Input> {
44
+ readonly version: 1;
45
+ readonly vendor: string;
46
+ readonly types?: StandardSchemaTypes<Input, Output>;
47
+ readonly jsonSchema: {
48
+ readonly input: (options: Options) => Record<string, unknown>;
49
+ readonly output: (options: Options) => Record<string, unknown>;
50
+ };
51
+ }
52
+ interface Options {
53
+ readonly target: "draft-2020-12" | "draft-07" | "openapi-3.0" | ({} & string);
54
+ readonly libraryOptions?: Record<string, unknown> | undefined;
55
+ }
56
+ }
57
+ /** Namespace aliases matching the official Standard Schema v1 vocabulary. */
58
+ export declare namespace StandardSchemaV1 {
59
+ type Props<Input = unknown, Output = Input> = StandardSchemaV1<Input, Output>["~standard"];
60
+ type Result<Output> = StandardResult<Output>;
61
+ type SuccessResult<Output> = StandardSuccess<Output>;
62
+ type FailureResult = StandardFailure;
63
+ type Issue = StandardIssue;
64
+ type PathSegment = {
65
+ readonly key: PropertyKey;
66
+ };
67
+ type Types<Input = unknown, Output = Input> = StandardSchemaTypes<Input, Output>;
68
+ type Options = StandardSchemaOptions;
69
+ type InferInput<S extends StandardSchemaV1> = import("./standard-schema.js").InferInput<S>;
70
+ type InferOutput<S extends StandardSchemaV1> = import("./standard-schema.js").InferOutput<S>;
71
+ }
72
+ /** RelKit's public schema boundary, including its future projection hook. */
73
+ export interface RelkitSchema<TInput = unknown, TOutput = TInput> extends StandardSchemaV1<TInput, TOutput> {
74
+ readonly "~standard": StandardSchemaV1<TInput, TOutput>["~standard"] & StandardJSONSchemaV1<TInput, TOutput>["~standard"];
75
+ readonly relkit?: {
76
+ readonly jsonSchema?: () => JsonValue;
77
+ };
78
+ }
79
+ /** JSON-safe values used by the optional schema projection hook. */
80
+ export type JsonValue = string | number | boolean | null | readonly JsonValue[] | {
81
+ readonly [key: string]: JsonValue;
82
+ };
83
+ /** Infers a schema's accepted input type. */
84
+ export type InferInput<S extends StandardSchemaV1> = S["~standard"] extends {
85
+ readonly types?: infer Types;
86
+ } ? Types extends StandardSchemaTypes<infer Input, unknown> ? Input : unknown : unknown;
87
+ /** Infers a schema's validated output type. */
88
+ export type InferOutput<S extends StandardSchemaV1> = S["~standard"] extends {
89
+ readonly types?: infer Types;
90
+ } ? Types extends StandardSchemaTypes<unknown, infer Output> ? Output : unknown : unknown;
91
+ /** A RelKit schema with familiar parsing and composition helpers. */
92
+ export interface Schema<TInput = unknown, TOutput = TInput> extends RelkitSchema<TInput, TOutput> {
93
+ optional(): Schema<TInput | undefined, TOutput | undefined>;
94
+ nullable(): Schema<TInput | null, TOutput | null>;
95
+ default(value: TInput | (() => TInput)): Schema<TInput | undefined, TOutput>;
96
+ transform<TNext>(transform: (value: TOutput) => TNext | Promise<TNext>): Schema<TInput, TNext>;
97
+ refine(check: (value: TOutput) => boolean | Promise<boolean>, message?: string): Schema<TInput, TOutput>;
98
+ parse(value: unknown): TOutput;
99
+ parseAsync(value: unknown): Promise<TOutput>;
100
+ safeParse(value: unknown): StandardResult<TOutput> | Promise<StandardResult<TOutput>>;
101
+ }
102
+ /**
103
+ * Validates a value with any Standard Schema v1-compatible validator.
104
+ *
105
+ * @example
106
+ * ```ts
107
+ * import { validate, z } from "@relkit/app/schema"
108
+ *
109
+ * const result = await validate(z.string(), "ready")
110
+ * if (!("value" in result)) throw new Error("validation failed")
111
+ * ```
112
+ * @category Validation
113
+ * @since 0.1.0
114
+ */
115
+ export declare function validate<S extends StandardSchemaV1>(schema: S, value: InferInput<S>): StandardResult<InferOutput<S>> | Promise<StandardResult<InferOutput<S>>>;
116
+ /** Validates synchronously and rejects schemas that require asynchronous work. */
117
+ export declare function validateSync<S extends StandardSchemaV1>(schema: S, value: InferInput<S>): StandardResult<InferOutput<S>>;
118
+ export { SchemaValidationError, createSchema, runSchema } from "./schema-impl.js";
119
+ export declare function issue(message: string, path: readonly StandardPathSegment[]): StandardFailure;
120
+ export declare function isPromiseLike(value: unknown): value is PromiseLike<unknown>;
121
+ //# sourceMappingURL=standard-schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"standard-schema.d.ts","sourceRoot":"","sources":["../src/standard-schema.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,MAAM,MAAM,mBAAmB,GAAG,WAAW,GAAG;IAAE,QAAQ,CAAC,GAAG,EAAE,WAAW,CAAA;CAAE,CAAC;AAE9E,mCAAmC;AACnC,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,mBAAmB,EAAE,CAAC;CAChD;AAED,kEAAkE;AAClE,MAAM,WAAW,eAAe,CAAC,CAAC;IAChC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;IAClB,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC;CAC7B;AAED,kEAAkE;AAClE,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,MAAM,EAAE,SAAS,aAAa,EAAE,CAAC;CAC3C;AAED,8CAA8C;AAC9C,MAAM,MAAM,cAAc,CAAC,CAAC,IAAI,eAAe,CAAC,CAAC,CAAC,GAAG,eAAe,CAAC;AAErE,oEAAoE;AACpE,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;CAC/D;AAED,wEAAwE;AACxE,MAAM,WAAW,mBAAmB,CAAC,MAAM,GAAG,OAAO,EAAE,OAAO,GAAG,MAAM;IACrE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;CAC1B;AAED,0DAA0D;AAC1D,MAAM,WAAW,gBAAgB,CAAC,MAAM,GAAG,OAAO,EAAE,OAAO,GAAG,MAAM;IAClE,QAAQ,CAAC,WAAW,EAAE;QACpB,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;QACpB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,QAAQ,EAAE,CACjB,KAAK,EAAE,OAAO,EACd,OAAO,CAAC,EAAE,qBAAqB,KAC5B,cAAc,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC;QAChE,QAAQ,CAAC,KAAK,CAAC,EAAE,mBAAmB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACvD,CAAC;CACH;AAED,MAAM,WAAW,oBAAoB,CAAC,MAAM,GAAG,OAAO,EAAE,OAAO,GAAG,MAAM;IACtE,QAAQ,CAAC,WAAW,EAAE,oBAAoB,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnE;AAED,yBAAiB,oBAAoB,CAAC;IACpC,UAAiB,KAAK,CAAC,KAAK,GAAG,OAAO,EAAE,MAAM,GAAG,KAAK;QACpD,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;QACpB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,mBAAmB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACpD,QAAQ,CAAC,UAAU,EAAE;YACnB,QAAQ,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YAC9D,QAAQ,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;SAChE,CAAC;KACH;IACD,UAAiB,OAAO;QACtB,QAAQ,CAAC,MAAM,EAAE,eAAe,GAAG,UAAU,GAAG,aAAa,GAAG,CAAC,EAAE,GAAG,MAAM,CAAC,CAAC;QAC9E,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;KAC/D;CACF;AAED,6EAA6E;AAC7E,yBAAiB,gBAAgB,CAAC;IAChC,KAAY,KAAK,CAAC,KAAK,GAAG,OAAO,EAAE,MAAM,GAAG,KAAK,IAAI,gBAAgB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,WAAW,CAAC,CAAC;IAClG,KAAY,MAAM,CAAC,MAAM,IAAI,cAAc,CAAC,MAAM,CAAC,CAAC;IACpD,KAAY,aAAa,CAAC,MAAM,IAAI,eAAe,CAAC,MAAM,CAAC,CAAC;IAC5D,KAAY,aAAa,GAAG,eAAe,CAAC;IAC5C,KAAY,KAAK,GAAG,aAAa,CAAC;IAClC,KAAY,WAAW,GAAG;QAAE,QAAQ,CAAC,GAAG,EAAE,WAAW,CAAA;KAAE,CAAC;IACxD,KAAY,KAAK,CAAC,KAAK,GAAG,OAAO,EAAE,MAAM,GAAG,KAAK,IAAI,mBAAmB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACxF,KAAY,OAAO,GAAG,qBAAqB,CAAC;IAC5C,KAAY,UAAU,CAAC,CAAC,SAAS,gBAAgB,IAAI,OAAO,sBAAsB,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;IAClG,KAAY,WAAW,CAAC,CAAC,SAAS,gBAAgB,IAChD,OAAO,sBAAsB,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;CACjD;AAED,6EAA6E;AAC7E,MAAM,WAAW,YAAY,CAAC,MAAM,GAAG,OAAO,EAAE,OAAO,GAAG,MAAM,CAAE,SAAQ,gBAAgB,CACxF,MAAM,EACN,OAAO,CACR;IACC,QAAQ,CAAC,WAAW,EAAE,gBAAgB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,WAAW,CAAC,GAClE,oBAAoB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,WAAW,CAAC,CAAC;IACrD,QAAQ,CAAC,MAAM,CAAC,EAAE;QAChB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,SAAS,CAAC;KACvC,CAAC;CACH;AAED,oEAAoE;AACpE,MAAM,MAAM,SAAS,GACnB,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,SAAS,EAAE,GAAG;IAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAC;AAElG,6CAA6C;AAC7C,MAAM,MAAM,UAAU,CAAC,CAAC,SAAS,gBAAgB,IAAI,CAAC,CAAC,WAAW,CAAC,SAAS;IAC1E,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,KAAK,CAAC;CAC9B,GACG,KAAK,SAAS,mBAAmB,CAAC,MAAM,KAAK,EAAE,OAAO,CAAC,GACrD,KAAK,GACL,OAAO,GACT,OAAO,CAAC;AAEZ,+CAA+C;AAC/C,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,gBAAgB,IAAI,CAAC,CAAC,WAAW,CAAC,SAAS;IAC3E,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,KAAK,CAAC;CAC9B,GACG,KAAK,SAAS,mBAAmB,CAAC,OAAO,EAAE,MAAM,MAAM,CAAC,GACtD,MAAM,GACN,OAAO,GACT,OAAO,CAAC;AAEZ,qEAAqE;AACrE,MAAM,WAAW,MAAM,CAAC,MAAM,GAAG,OAAO,EAAE,OAAO,GAAG,MAAM,CAAE,SAAQ,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC;IAC/F,QAAQ,IAAI,MAAM,CAAC,MAAM,GAAG,SAAS,EAAE,OAAO,GAAG,SAAS,CAAC,CAAC;IAC5D,QAAQ,IAAI,MAAM,CAAC,MAAM,GAAG,IAAI,EAAE,OAAO,GAAG,IAAI,CAAC,CAAC;IAClD,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,SAAS,EAAE,OAAO,CAAC,CAAC;IAC7E,SAAS,CAAC,KAAK,EAAE,SAAS,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC/F,MAAM,CACJ,KAAK,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,EACrD,OAAO,CAAC,EAAE,MAAM,GACf,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3B,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC;IAC/B,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7C,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,cAAc,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC;CACvF;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,QAAQ,CAAC,CAAC,SAAS,gBAAgB,EACjD,MAAM,EAAE,CAAC,EACT,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,GACnB,cAAc,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAI1E;AAED,kFAAkF;AAClF,wBAAgB,YAAY,CAAC,CAAC,SAAS,gBAAgB,EACrD,MAAM,EAAE,CAAC,EACT,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,GACnB,cAAc,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAIhC;AAED,OAAO,EAAE,qBAAqB,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAElF,wBAAgB,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,mBAAmB,EAAE,GAAG,eAAe,CAE5F;AASD,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,WAAW,CAAC,OAAO,CAAC,CAO3E"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Validates a value with any Standard Schema v1-compatible validator.
3
+ *
4
+ * @example
5
+ * ```ts
6
+ * import { validate, z } from "@relkit/app/schema"
7
+ *
8
+ * const result = await validate(z.string(), "ready")
9
+ * if (!("value" in result)) throw new Error("validation failed")
10
+ * ```
11
+ * @category Validation
12
+ * @since 0.1.0
13
+ */
14
+ export function validate(schema, value) {
15
+ assertStandardSchema(schema);
16
+ return schema["~standard"].validate(value);
17
+ }
18
+ /** Validates synchronously and rejects schemas that require asynchronous work. */
19
+ export function validateSync(schema, value) {
20
+ const result = validate(schema, value);
21
+ if (isPromiseLike(result))
22
+ throw new TypeError("Schema validation is asynchronous");
23
+ return result;
24
+ }
25
+ export { SchemaValidationError, createSchema, runSchema } from "./schema-impl.js";
26
+ export function issue(message, path) {
27
+ return { issues: [{ message, path }] };
28
+ }
29
+ function assertStandardSchema(schema) {
30
+ const standard = schema?.["~standard"];
31
+ if (standard?.version !== 1 || typeof standard.validate !== "function") {
32
+ throw new TypeError("Value is not a Standard Schema v1 validator");
33
+ }
34
+ }
35
+ export function isPromiseLike(value) {
36
+ return (typeof value === "object" &&
37
+ value !== null &&
38
+ "then" in value &&
39
+ typeof value.then === "function");
40
+ }
41
+ //# sourceMappingURL=standard-schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"standard-schema.js","sourceRoot":"","sources":["../src/standard-schema.ts"],"names":[],"mappings":"AAmIA;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,QAAQ,CACtB,MAAS,EACT,KAAoB;IAEpB,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAC7B,OAAO,MAAM,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,KAAK,CACiC,CAAC;AAC7E,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,YAAY,CAC1B,MAAS,EACT,KAAoB;IAEpB,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACvC,IAAI,aAAa,CAAC,MAAM,CAAC;QAAE,MAAM,IAAI,SAAS,CAAC,mCAAmC,CAAC,CAAC;IACpF,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,OAAO,EAAE,qBAAqB,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAElF,MAAM,UAAU,KAAK,CAAC,OAAe,EAAE,IAAoC;IACzE,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;AACzC,CAAC;AAED,SAAS,oBAAoB,CAAC,MAAwB;IACpD,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,WAAW,CAAC,CAAC;IACvC,IAAI,QAAQ,EAAE,OAAO,KAAK,CAAC,IAAI,OAAO,QAAQ,CAAC,QAAQ,KAAK,UAAU,EAAE,CAAC;QACvE,MAAM,IAAI,SAAS,CAAC,6CAA6C,CAAC,CAAC;IACrE,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,MAAM,IAAI,KAAK;QACf,OAAO,KAAK,CAAC,IAAI,KAAK,UAAU,CACjC,CAAC;AACJ,CAAC"}
package/package.json ADDED
@@ -0,0 +1,36 @@
1
+ {
2
+ "name": "@relkit/schema",
3
+ "version": "0.0.0",
4
+ "description": "RELKIT schema API; prefer @relkit/app/schema in applications.",
5
+ "license": "MIT",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "https://github.com/rel-kit/relkit.git",
9
+ "directory": "packages/schema"
10
+ },
11
+ "homepage": "https://github.com/rel-kit/relkit#readme",
12
+ "bugs": {
13
+ "url": "https://github.com/rel-kit/relkit/issues"
14
+ },
15
+ "files": [
16
+ "dist"
17
+ ],
18
+ "publishConfig": {
19
+ "access": "public"
20
+ },
21
+ "engines": {
22
+ "bun": ">=1.3.10"
23
+ },
24
+ "type": "module",
25
+ "exports": {
26
+ ".": {
27
+ "types": "./dist/index.d.ts",
28
+ "import": "./dist/index.js"
29
+ }
30
+ },
31
+ "scripts": {
32
+ "build": "tsc -b",
33
+ "check": "tsc -b --pretty false",
34
+ "typecheck": "tsc -b --pretty false"
35
+ }
36
+ }