@estokad/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/LICENSE +17 -0
- package/README.md +111 -0
- package/dist/compile.d.ts +9 -0
- package/dist/compile.d.ts.map +1 -0
- package/dist/compile.js +357 -0
- package/dist/compile.js.map +1 -0
- package/dist/define.d.ts +20 -0
- package/dist/define.d.ts.map +1 -0
- package/dist/define.js +13 -0
- package/dist/define.js.map +1 -0
- package/dist/generate.d.ts +8 -0
- package/dist/generate.d.ts.map +1 -0
- package/dist/generate.js +268 -0
- package/dist/generate.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/modules.d.ts +5 -0
- package/dist/modules.d.ts.map +1 -0
- package/dist/modules.js +34 -0
- package/dist/modules.js.map +1 -0
- package/dist/types.d.ts +240 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +12 -0
- package/dist/types.js.map +1 -0
- package/dist/zod.d.ts +14 -0
- package/dist/zod.d.ts.map +1 -0
- package/dist/zod.js +140 -0
- package/dist/zod.js.map +1 -0
- package/package.json +41 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zod.d.ts","sourceRoot":"","sources":["../src/zod.ts"],"names":[],"mappings":"AAQA,OAAO,EAAK,KAAK,OAAO,EAAE,MAAM,KAAK,CAAA;AAErC,OAAO,KAAK,EAAW,MAAM,EAAE,MAAM,YAAY,CAAA;AAuBjD,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACxC;AAED,MAAM,WAAW,cAAc;IAC7B;;;oEAGgE;IAChE,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAC3B;AAED,wBAAgB,OAAO,CAAC,EAAE,EAAE,aAAa,CAAC,MAAM,CAAC,EAAE,OAAO,GAAE,cAAmB,GAAG,UAAU,CAoC3F"}
|
package/dist/zod.js
ADDED
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
// IR -> Zod schema generation, used by the API to validate entry data on
|
|
2
|
+
// every write. The IR field types map to specific Zod constructions; we
|
|
3
|
+
// keep the mapping in one switch statement so the relationship is visible.
|
|
4
|
+
//
|
|
5
|
+
// Lazy resolution lets embedded types reference one another in any order;
|
|
6
|
+
// the API caches the resulting schemas per workspace so the cost of building
|
|
7
|
+
// is amortized across requests.
|
|
8
|
+
import { z } from 'zod';
|
|
9
|
+
const RICH_TEXT_NODE = z
|
|
10
|
+
.object({
|
|
11
|
+
type: z.string(),
|
|
12
|
+
content: z.array(z.unknown()).optional(),
|
|
13
|
+
text: z.string().optional(),
|
|
14
|
+
marks: z.array(z.unknown()).optional(),
|
|
15
|
+
attrs: z.record(z.unknown()).optional(),
|
|
16
|
+
})
|
|
17
|
+
.passthrough();
|
|
18
|
+
const RICH_TEXT_DOC = z
|
|
19
|
+
.object({
|
|
20
|
+
type: z.literal('doc'),
|
|
21
|
+
content: z.array(RICH_TEXT_NODE).optional(),
|
|
22
|
+
})
|
|
23
|
+
.passthrough();
|
|
24
|
+
const GEO_POINT = z.object({ lat: z.number(), lng: z.number() });
|
|
25
|
+
const SLUG_DEFAULT_PATTERN = /^[a-z0-9-]+$/;
|
|
26
|
+
export function makeZod(ir, options = {}) {
|
|
27
|
+
const partial = options.partial ?? false;
|
|
28
|
+
const byName = new Map(ir.map((t) => [t.name, t]));
|
|
29
|
+
const cache = new Map();
|
|
30
|
+
function resolve(name) {
|
|
31
|
+
const cached = cache.get(name);
|
|
32
|
+
if (cached)
|
|
33
|
+
return cached;
|
|
34
|
+
const type = byName.get(name);
|
|
35
|
+
if (!type) {
|
|
36
|
+
throw new Error(`Unknown type '${name}' referenced in schema set.`);
|
|
37
|
+
}
|
|
38
|
+
// Cache a lazy thunk before recursing so cycles via embedded references
|
|
39
|
+
// resolve without infinite recursion. The thunk reads `built` at call
|
|
40
|
+
// time; we populate it after building the field shape.
|
|
41
|
+
let built = null;
|
|
42
|
+
const lazy = z.lazy(() => {
|
|
43
|
+
if (!built)
|
|
44
|
+
throw new Error(`Schema for '${name}' not yet built.`);
|
|
45
|
+
return built;
|
|
46
|
+
});
|
|
47
|
+
cache.set(name, lazy);
|
|
48
|
+
const shape = {};
|
|
49
|
+
for (const field of type.fields) {
|
|
50
|
+
shape[field.name] = makeFieldZod(field, resolve, partial);
|
|
51
|
+
}
|
|
52
|
+
built = z.object(shape);
|
|
53
|
+
return lazy;
|
|
54
|
+
}
|
|
55
|
+
const types = {};
|
|
56
|
+
for (const t of ir) {
|
|
57
|
+
types[t.name] = resolve(t.name);
|
|
58
|
+
}
|
|
59
|
+
return { types };
|
|
60
|
+
}
|
|
61
|
+
function makeFieldZod(field, resolve, partial) {
|
|
62
|
+
let base;
|
|
63
|
+
switch (field.type) {
|
|
64
|
+
case 'text': {
|
|
65
|
+
let s = z.string();
|
|
66
|
+
if (field.min != null)
|
|
67
|
+
s = s.min(field.min);
|
|
68
|
+
if (field.max != null)
|
|
69
|
+
s = s.max(field.max);
|
|
70
|
+
if (field.pattern)
|
|
71
|
+
s = s.regex(new RegExp(field.pattern));
|
|
72
|
+
base = s;
|
|
73
|
+
break;
|
|
74
|
+
}
|
|
75
|
+
case 'markdown': {
|
|
76
|
+
base = z.string();
|
|
77
|
+
break;
|
|
78
|
+
}
|
|
79
|
+
case 'richText': {
|
|
80
|
+
base = RICH_TEXT_DOC;
|
|
81
|
+
break;
|
|
82
|
+
}
|
|
83
|
+
case 'number': {
|
|
84
|
+
let n = z.number();
|
|
85
|
+
if (field.integer !== false)
|
|
86
|
+
n = n.int();
|
|
87
|
+
if (field.min != null)
|
|
88
|
+
n = n.min(field.min);
|
|
89
|
+
if (field.max != null)
|
|
90
|
+
n = n.max(field.max);
|
|
91
|
+
base = n;
|
|
92
|
+
break;
|
|
93
|
+
}
|
|
94
|
+
case 'boolean':
|
|
95
|
+
base = z.boolean();
|
|
96
|
+
break;
|
|
97
|
+
case 'datetime':
|
|
98
|
+
base = z.string().datetime({ offset: true });
|
|
99
|
+
break;
|
|
100
|
+
case 'date':
|
|
101
|
+
base = z.string().regex(/^\d{4}-\d{2}-\d{2}$/, 'YYYY-MM-DD');
|
|
102
|
+
break;
|
|
103
|
+
case 'slug': {
|
|
104
|
+
const pattern = field.pattern ? new RegExp(field.pattern) : SLUG_DEFAULT_PATTERN;
|
|
105
|
+
base = z.string().regex(pattern);
|
|
106
|
+
break;
|
|
107
|
+
}
|
|
108
|
+
case 'asset':
|
|
109
|
+
case 'reference':
|
|
110
|
+
base = z.string().uuid();
|
|
111
|
+
break;
|
|
112
|
+
case 'assetList':
|
|
113
|
+
case 'referenceList': {
|
|
114
|
+
let arr = z.array(z.string().uuid());
|
|
115
|
+
if (field.min != null)
|
|
116
|
+
arr = arr.min(field.min);
|
|
117
|
+
if (field.max != null)
|
|
118
|
+
arr = arr.max(field.max);
|
|
119
|
+
base = arr;
|
|
120
|
+
break;
|
|
121
|
+
}
|
|
122
|
+
case 'enum':
|
|
123
|
+
// z.enum needs a non-empty tuple; the compiler validates this already.
|
|
124
|
+
base = z.enum(field.options);
|
|
125
|
+
break;
|
|
126
|
+
case 'geoPoint':
|
|
127
|
+
base = GEO_POINT;
|
|
128
|
+
break;
|
|
129
|
+
case 'embedded':
|
|
130
|
+
base = resolve(field.of);
|
|
131
|
+
break;
|
|
132
|
+
case 'json':
|
|
133
|
+
base = z.unknown();
|
|
134
|
+
break;
|
|
135
|
+
}
|
|
136
|
+
if (field.required && !partial)
|
|
137
|
+
return base;
|
|
138
|
+
return base.nullable().optional();
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=zod.js.map
|
package/dist/zod.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zod.js","sourceRoot":"","sources":["../src/zod.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@estokad/schema",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"description": "defineType(), defineEmbedded(), field types, JSON IR compiler.",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "https://github.com/ELIASspaceMercer/estokad.git",
|
|
10
|
+
"directory": "packages/schema"
|
|
11
|
+
},
|
|
12
|
+
"homepage": "https://docs.estokad.com/docs/schema",
|
|
13
|
+
"publishConfig": {
|
|
14
|
+
"access": "public"
|
|
15
|
+
},
|
|
16
|
+
"main": "./dist/index.js",
|
|
17
|
+
"types": "./dist/index.d.ts",
|
|
18
|
+
"exports": {
|
|
19
|
+
".": {
|
|
20
|
+
"types": "./dist/index.d.ts",
|
|
21
|
+
"import": "./dist/index.js"
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
"files": [
|
|
25
|
+
"dist"
|
|
26
|
+
],
|
|
27
|
+
"dependencies": {
|
|
28
|
+
"zod": "^3.23.0"
|
|
29
|
+
},
|
|
30
|
+
"devDependencies": {
|
|
31
|
+
"@types/node": "^22.10.0",
|
|
32
|
+
"typescript": "^5.7.0",
|
|
33
|
+
"vitest": "^2.1.0"
|
|
34
|
+
},
|
|
35
|
+
"scripts": {
|
|
36
|
+
"build": "tsc -p tsconfig.json",
|
|
37
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
38
|
+
"test": "vitest run",
|
|
39
|
+
"lint": "eslint ."
|
|
40
|
+
}
|
|
41
|
+
}
|