syncorejs 0.2.1 → 0.2.3

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.
Files changed (169) hide show
  1. package/README.md +2 -1
  2. package/dist/_vendor/cli/app.d.mts.map +1 -1
  3. package/dist/_vendor/cli/app.mjs +330 -46
  4. package/dist/_vendor/cli/app.mjs.map +1 -1
  5. package/dist/_vendor/cli/context.mjs +27 -9
  6. package/dist/_vendor/cli/context.mjs.map +1 -1
  7. package/dist/_vendor/cli/dev-session.mjs.map +1 -1
  8. package/dist/_vendor/cli/doctor.mjs +513 -46
  9. package/dist/_vendor/cli/doctor.mjs.map +1 -1
  10. package/dist/_vendor/cli/errors.mjs.map +1 -1
  11. package/dist/_vendor/cli/help.mjs.map +1 -1
  12. package/dist/_vendor/cli/index.mjs +9 -2
  13. package/dist/_vendor/cli/index.mjs.map +1 -1
  14. package/dist/_vendor/cli/messages.mjs +5 -4
  15. package/dist/_vendor/cli/messages.mjs.map +1 -1
  16. package/dist/_vendor/cli/preflight.mjs.map +1 -1
  17. package/dist/_vendor/cli/project.mjs +125 -27
  18. package/dist/_vendor/cli/project.mjs.map +1 -1
  19. package/dist/_vendor/cli/render.mjs +57 -9
  20. package/dist/_vendor/cli/render.mjs.map +1 -1
  21. package/dist/_vendor/cli/targets.mjs +4 -3
  22. package/dist/_vendor/cli/targets.mjs.map +1 -1
  23. package/dist/_vendor/core/cli.d.mts +20 -4
  24. package/dist/_vendor/core/cli.d.mts.map +1 -1
  25. package/dist/_vendor/core/cli.mjs +458 -133
  26. package/dist/_vendor/core/cli.mjs.map +1 -1
  27. package/dist/_vendor/core/devtools-auth.mjs +60 -0
  28. package/dist/_vendor/core/devtools-auth.mjs.map +1 -0
  29. package/dist/_vendor/core/index.d.mts +5 -3
  30. package/dist/_vendor/core/index.mjs +22 -2
  31. package/dist/_vendor/core/index.mjs.map +1 -1
  32. package/dist/_vendor/core/runtime/components.d.mts +111 -0
  33. package/dist/_vendor/core/runtime/components.d.mts.map +1 -0
  34. package/dist/_vendor/core/runtime/components.mjs +186 -0
  35. package/dist/_vendor/core/runtime/components.mjs.map +1 -0
  36. package/dist/_vendor/core/runtime/devtools.d.mts +4 -4
  37. package/dist/_vendor/core/runtime/devtools.d.mts.map +1 -1
  38. package/dist/_vendor/core/runtime/devtools.mjs +178 -60
  39. package/dist/_vendor/core/runtime/devtools.mjs.map +1 -1
  40. package/dist/_vendor/core/runtime/functions.d.mts +398 -16
  41. package/dist/_vendor/core/runtime/functions.d.mts.map +1 -1
  42. package/dist/_vendor/core/runtime/functions.mjs +74 -3
  43. package/dist/_vendor/core/runtime/functions.mjs.map +1 -1
  44. package/dist/_vendor/core/runtime/id.d.mts.map +1 -1
  45. package/dist/_vendor/core/runtime/id.mjs.map +1 -1
  46. package/dist/_vendor/core/runtime/internal/engines/devtoolsEngine.mjs +83 -0
  47. package/dist/_vendor/core/runtime/internal/engines/devtoolsEngine.mjs.map +1 -0
  48. package/dist/_vendor/core/runtime/internal/engines/executionEngine.mjs +720 -0
  49. package/dist/_vendor/core/runtime/internal/engines/executionEngine.mjs.map +1 -0
  50. package/dist/_vendor/core/runtime/internal/engines/reactivityEngine.mjs +234 -0
  51. package/dist/_vendor/core/runtime/internal/engines/reactivityEngine.mjs.map +1 -0
  52. package/dist/_vendor/core/runtime/internal/engines/schedulerEngine.mjs +255 -0
  53. package/dist/_vendor/core/runtime/internal/engines/schedulerEngine.mjs.map +1 -0
  54. package/dist/_vendor/core/runtime/internal/engines/schemaEngine.mjs +200 -0
  55. package/dist/_vendor/core/runtime/internal/engines/schemaEngine.mjs.map +1 -0
  56. package/dist/_vendor/core/runtime/internal/engines/shared.mjs +252 -0
  57. package/dist/_vendor/core/runtime/internal/engines/shared.mjs.map +1 -0
  58. package/dist/_vendor/core/runtime/internal/engines/storageEngine.mjs +145 -0
  59. package/dist/_vendor/core/runtime/internal/engines/storageEngine.mjs.map +1 -0
  60. package/dist/_vendor/core/runtime/internal/runtimeKernel.mjs +221 -0
  61. package/dist/_vendor/core/runtime/internal/runtimeKernel.mjs.map +1 -0
  62. package/dist/_vendor/core/runtime/internal/runtimeStatus.mjs +32 -0
  63. package/dist/_vendor/core/runtime/internal/runtimeStatus.mjs.map +1 -0
  64. package/dist/_vendor/core/runtime/internal/systemMeta.mjs +61 -0
  65. package/dist/_vendor/core/runtime/internal/systemMeta.mjs.map +1 -0
  66. package/dist/_vendor/core/runtime/internal/transactionCoordinator.mjs +41 -0
  67. package/dist/_vendor/core/runtime/internal/transactionCoordinator.mjs.map +1 -0
  68. package/dist/_vendor/core/runtime/runtime.d.mts +1187 -202
  69. package/dist/_vendor/core/runtime/runtime.d.mts.map +1 -1
  70. package/dist/_vendor/core/runtime/runtime.mjs +73 -1365
  71. package/dist/_vendor/core/runtime/runtime.mjs.map +1 -1
  72. package/dist/_vendor/core/transport.d.mts +113 -0
  73. package/dist/_vendor/core/transport.d.mts.map +1 -0
  74. package/dist/_vendor/core/transport.mjs +428 -0
  75. package/dist/_vendor/core/transport.mjs.map +1 -0
  76. package/dist/_vendor/devtools-protocol/index.d.ts +187 -4
  77. package/dist/_vendor/devtools-protocol/index.d.ts.map +1 -1
  78. package/dist/_vendor/devtools-protocol/index.js +25 -9
  79. package/dist/_vendor/devtools-protocol/index.js.map +1 -1
  80. package/dist/_vendor/next/config.d.ts +3 -4
  81. package/dist/_vendor/next/config.d.ts.map +1 -1
  82. package/dist/_vendor/next/config.js +37 -19
  83. package/dist/_vendor/next/config.js.map +1 -1
  84. package/dist/_vendor/next/index.d.ts +109 -29
  85. package/dist/_vendor/next/index.d.ts.map +1 -1
  86. package/dist/_vendor/next/index.js +104 -26
  87. package/dist/_vendor/next/index.js.map +1 -1
  88. package/dist/_vendor/platform-expo/index.d.ts +156 -37
  89. package/dist/_vendor/platform-expo/index.d.ts.map +1 -1
  90. package/dist/_vendor/platform-expo/index.js +80 -12
  91. package/dist/_vendor/platform-expo/index.js.map +1 -1
  92. package/dist/_vendor/platform-expo/react.d.ts.map +1 -1
  93. package/dist/_vendor/platform-expo/react.js +11 -10
  94. package/dist/_vendor/platform-expo/react.js.map +1 -1
  95. package/dist/_vendor/platform-expo/web-sqljs-wasm.js +16 -0
  96. package/dist/_vendor/platform-expo/web-sqljs-wasm.js.map +1 -0
  97. package/dist/_vendor/platform-node/index.d.mts +192 -24
  98. package/dist/_vendor/platform-node/index.d.mts.map +1 -1
  99. package/dist/_vendor/platform-node/index.mjs +236 -97
  100. package/dist/_vendor/platform-node/index.mjs.map +1 -1
  101. package/dist/_vendor/platform-node/ipc-react.d.mts.map +1 -1
  102. package/dist/_vendor/platform-node/ipc-react.mjs +15 -2
  103. package/dist/_vendor/platform-node/ipc-react.mjs.map +1 -1
  104. package/dist/_vendor/platform-node/ipc.d.mts +11 -35
  105. package/dist/_vendor/platform-node/ipc.d.mts.map +1 -1
  106. package/dist/_vendor/platform-node/ipc.mjs +3 -273
  107. package/dist/_vendor/platform-node/ipc.mjs.map +1 -1
  108. package/dist/_vendor/platform-web/external-change.d.ts +43 -1
  109. package/dist/_vendor/platform-web/external-change.d.ts.map +1 -1
  110. package/dist/_vendor/platform-web/external-change.js +32 -1
  111. package/dist/_vendor/platform-web/external-change.js.map +1 -1
  112. package/dist/_vendor/platform-web/index.d.ts +323 -51
  113. package/dist/_vendor/platform-web/index.d.ts.map +1 -1
  114. package/dist/_vendor/platform-web/index.js +233 -30
  115. package/dist/_vendor/platform-web/index.js.map +1 -1
  116. package/dist/_vendor/platform-web/indexeddb.d.ts +12 -0
  117. package/dist/_vendor/platform-web/indexeddb.d.ts.map +1 -1
  118. package/dist/_vendor/platform-web/indexeddb.js +10 -0
  119. package/dist/_vendor/platform-web/indexeddb.js.map +1 -1
  120. package/dist/_vendor/platform-web/opfs.d.ts +13 -0
  121. package/dist/_vendor/platform-web/opfs.d.ts.map +1 -1
  122. package/dist/_vendor/platform-web/opfs.js +12 -0
  123. package/dist/_vendor/platform-web/opfs.js.map +1 -1
  124. package/dist/_vendor/platform-web/persistence.d.ts +54 -0
  125. package/dist/_vendor/platform-web/persistence.d.ts.map +1 -1
  126. package/dist/_vendor/platform-web/persistence.js +15 -0
  127. package/dist/_vendor/platform-web/persistence.js.map +1 -1
  128. package/dist/_vendor/platform-web/react.d.ts +1 -2
  129. package/dist/_vendor/platform-web/react.d.ts.map +1 -1
  130. package/dist/_vendor/platform-web/react.js +27 -13
  131. package/dist/_vendor/platform-web/react.js.map +1 -1
  132. package/dist/_vendor/platform-web/sqljs.js +10 -1
  133. package/dist/_vendor/platform-web/sqljs.js.map +1 -1
  134. package/dist/_vendor/platform-web/web-sqljs-wasm.js +8 -0
  135. package/dist/_vendor/platform-web/web-sqljs-wasm.js.map +1 -0
  136. package/dist/_vendor/platform-web/worker.d.ts +71 -44
  137. package/dist/_vendor/platform-web/worker.d.ts.map +1 -1
  138. package/dist/_vendor/platform-web/worker.js +40 -271
  139. package/dist/_vendor/platform-web/worker.js.map +1 -1
  140. package/dist/_vendor/react/index.d.ts +222 -23
  141. package/dist/_vendor/react/index.d.ts.map +1 -1
  142. package/dist/_vendor/react/index.js +476 -63
  143. package/dist/_vendor/react/index.js.map +1 -1
  144. package/dist/_vendor/schema/definition.d.ts +151 -37
  145. package/dist/_vendor/schema/definition.d.ts.map +1 -1
  146. package/dist/_vendor/schema/definition.js +102 -20
  147. package/dist/_vendor/schema/definition.js.map +1 -1
  148. package/dist/_vendor/schema/index.d.ts +4 -4
  149. package/dist/_vendor/schema/index.js +2 -2
  150. package/dist/_vendor/schema/planner.d.ts +19 -2
  151. package/dist/_vendor/schema/planner.d.ts.map +1 -1
  152. package/dist/_vendor/schema/planner.js +79 -3
  153. package/dist/_vendor/schema/planner.js.map +1 -1
  154. package/dist/_vendor/schema/validators.d.ts +279 -83
  155. package/dist/_vendor/schema/validators.d.ts.map +1 -1
  156. package/dist/_vendor/schema/validators.js +330 -38
  157. package/dist/_vendor/schema/validators.js.map +1 -1
  158. package/dist/_vendor/svelte/index.d.ts +245 -19
  159. package/dist/_vendor/svelte/index.d.ts.map +1 -1
  160. package/dist/_vendor/svelte/index.js +443 -20
  161. package/dist/_vendor/svelte/index.js.map +1 -1
  162. package/dist/browser.d.ts.map +1 -1
  163. package/dist/cli.js +3 -1
  164. package/dist/cli.js.map +1 -1
  165. package/dist/components.d.ts +2 -0
  166. package/dist/components.js +2 -0
  167. package/dist/index.d.ts +3 -2
  168. package/dist/index.js +2 -1
  169. package/package.json +29 -21
@@ -1,61 +1,137 @@
1
1
  //#region src/validators.ts
2
- var StringValidator = class {
3
- kind = "string";
2
+ var BaseValidator = class {
3
+ kind;
4
+ constructor(kind) {
5
+ this.kind = kind;
6
+ }
7
+ serialize(value, path = "value") {
8
+ return this.parse(value, path);
9
+ }
10
+ deserialize(value, path = "value") {
11
+ return this.parse(value, path);
12
+ }
13
+ };
14
+ var StringValidator = class extends BaseValidator {
15
+ constructor() {
16
+ super("string");
17
+ }
4
18
  parse(value, path = "value") {
5
19
  if (typeof value !== "string") throw new Error(`${path} must be a string.`);
6
20
  return value;
7
21
  }
22
+ describe() {
23
+ return { kind: "string" };
24
+ }
8
25
  };
9
- var NumberValidator = class {
10
- kind = "number";
26
+ var NumberValidator = class extends BaseValidator {
27
+ constructor() {
28
+ super("number");
29
+ }
11
30
  parse(value, path = "value") {
12
31
  if (typeof value !== "number" || Number.isNaN(value)) throw new Error(`${path} must be a number.`);
13
32
  return value;
14
33
  }
34
+ describe() {
35
+ return { kind: "number" };
36
+ }
15
37
  };
16
- var BooleanValidator = class {
17
- kind = "boolean";
38
+ var BooleanValidator = class extends BaseValidator {
39
+ constructor() {
40
+ super("boolean");
41
+ }
18
42
  parse(value, path = "value") {
19
43
  if (typeof value !== "boolean") throw new Error(`${path} must be a boolean.`);
20
44
  return value;
21
45
  }
46
+ describe() {
47
+ return { kind: "boolean" };
48
+ }
22
49
  };
23
- var NullValidator = class {
24
- kind = "null";
50
+ var NullValidator = class extends BaseValidator {
51
+ constructor() {
52
+ super("null");
53
+ }
25
54
  parse(value, path = "value") {
26
55
  if (value !== null) throw new Error(`${path} must be null.`);
27
56
  return null;
28
57
  }
58
+ describe() {
59
+ return { kind: "null" };
60
+ }
29
61
  };
30
- var AnyValidator = class {
31
- kind = "any";
62
+ var AnyValidator = class extends BaseValidator {
63
+ constructor() {
64
+ super("any");
65
+ }
32
66
  parse(value) {
33
67
  return value;
34
68
  }
69
+ describe() {
70
+ return { kind: "any" };
71
+ }
35
72
  };
36
- var LiteralValidator = class {
37
- kind = "literal";
73
+ var LiteralValidator = class extends BaseValidator {
74
+ literalValue;
38
75
  constructor(literalValue) {
76
+ super("literal");
39
77
  this.literalValue = literalValue;
40
78
  }
41
79
  parse(value, path = "value") {
42
80
  if (value !== this.literalValue) throw new Error(`${path} must equal ${String(this.literalValue)}.`);
43
81
  return this.literalValue;
44
82
  }
83
+ describe() {
84
+ return {
85
+ kind: "literal",
86
+ value: this.literalValue
87
+ };
88
+ }
89
+ };
90
+ var EnumValidator = class extends BaseValidator {
91
+ values;
92
+ constructor(values) {
93
+ super("enum");
94
+ this.values = values;
95
+ }
96
+ parse(value, path = "value") {
97
+ if (typeof value !== "string" || !this.values.includes(value)) throw new Error(`${path} must be one of ${this.values.map((item) => JSON.stringify(item)).join(", ")}.`);
98
+ return value;
99
+ }
100
+ describe() {
101
+ return {
102
+ kind: "enum",
103
+ values: [...this.values]
104
+ };
105
+ }
45
106
  };
46
- var ArrayValidator = class {
47
- kind = "array";
107
+ var ArrayValidator = class extends BaseValidator {
108
+ itemValidator;
48
109
  constructor(itemValidator) {
110
+ super("array");
49
111
  this.itemValidator = itemValidator;
50
112
  }
51
113
  parse(value, path = "value") {
52
114
  if (!Array.isArray(value)) throw new Error(`${path} must be an array.`);
53
115
  return value.map((item, index) => this.itemValidator.parse(item, `${path}[${index}]`));
54
116
  }
117
+ serialize(value, path = "value") {
118
+ return this.parse(value, path).map((item, index) => serializeValue(this.itemValidator, item, `${path}[${index}]`));
119
+ }
120
+ deserialize(value, path = "value") {
121
+ if (!Array.isArray(value)) throw new Error(`${path} must be an array.`);
122
+ return value.map((item, index) => deserializeValue(this.itemValidator, item, `${path}[${index}]`));
123
+ }
124
+ describe() {
125
+ return {
126
+ kind: "array",
127
+ item: describeValidator(this.itemValidator)
128
+ };
129
+ }
55
130
  };
56
- var ObjectValidator = class {
57
- kind = "object";
131
+ var ObjectValidator = class extends BaseValidator {
132
+ shape;
58
133
  constructor(shape) {
134
+ super("object");
59
135
  this.shape = shape;
60
136
  }
61
137
  parse(value, path = "value") {
@@ -68,59 +144,247 @@ var ObjectValidator = class {
68
144
  }
69
145
  return parsed;
70
146
  }
147
+ serialize(value, path = "value") {
148
+ const parsed = this.parse(value, path);
149
+ const serialized = {};
150
+ for (const [key, validator] of Object.entries(this.shape)) {
151
+ if (parsed[key] === void 0 && validator.kind === "optional") continue;
152
+ serialized[key] = serializeValue(validator, parsed[key], `${path}.${key}`);
153
+ }
154
+ return serialized;
155
+ }
156
+ deserialize(value, path = "value") {
157
+ if (typeof value !== "object" || value === null || Array.isArray(value)) throw new Error(`${path} must be an object.`);
158
+ const source = value;
159
+ const parsed = {};
160
+ for (const [key, validator] of Object.entries(this.shape)) {
161
+ if (validator.kind === "optional" && source[key] === void 0) continue;
162
+ parsed[key] = deserializeValue(validator, source[key], `${path}.${key}`);
163
+ }
164
+ return parsed;
165
+ }
166
+ describe() {
167
+ return {
168
+ kind: "object",
169
+ shape: Object.fromEntries(Object.entries(this.shape).map(([key, validator]) => [key, {
170
+ validator: validator.kind === "optional" ? describeValidator(validator.inner) : describeValidator(validator),
171
+ optional: validator.kind === "optional"
172
+ }]))
173
+ };
174
+ }
71
175
  };
72
- var IdValidator = class {
73
- kind = "id";
176
+ var IdValidator = class extends BaseValidator {
177
+ tableName;
74
178
  constructor(tableName) {
179
+ super("id");
75
180
  this.tableName = tableName;
76
181
  }
77
182
  parse(value, path = "value") {
78
183
  if (typeof value !== "string" || value.length === 0) throw new Error(`${path} must be a non-empty id string.`);
79
184
  return value;
80
185
  }
186
+ describe() {
187
+ return {
188
+ kind: "id",
189
+ tableName: this.tableName
190
+ };
191
+ }
81
192
  };
82
- var OptionalValidator = class {
83
- kind = "optional";
193
+ var OptionalValidator = class extends BaseValidator {
194
+ inner;
84
195
  constructor(inner) {
196
+ super("optional");
85
197
  this.inner = inner;
86
198
  }
87
199
  parse(value, path = "value") {
88
200
  if (value === void 0) return;
89
201
  return this.inner.parse(value, path);
90
202
  }
203
+ serialize(value, path = "value") {
204
+ if (value === void 0) return;
205
+ return serializeValue(this.inner, value, path);
206
+ }
207
+ deserialize(value, path = "value") {
208
+ if (value === void 0) return;
209
+ return deserializeValue(this.inner, value, path);
210
+ }
211
+ describe() {
212
+ return {
213
+ kind: "optional",
214
+ inner: describeValidator(this.inner)
215
+ };
216
+ }
217
+ };
218
+ var RecordValidator = class extends BaseValidator {
219
+ keyValidator;
220
+ valueValidator;
221
+ constructor(keyValidator, valueValidator) {
222
+ super("record");
223
+ this.keyValidator = keyValidator;
224
+ this.valueValidator = valueValidator;
225
+ }
226
+ parse(value, path = "value") {
227
+ if (typeof value !== "object" || value === null || Array.isArray(value)) throw new Error(`${path} must be an object.`);
228
+ const source = value;
229
+ const parsed = {};
230
+ for (const [key, item] of Object.entries(source)) {
231
+ const parsedKey = this.keyValidator.parse(key, `${path}.{key}`);
232
+ parsed[parsedKey] = this.valueValidator.parse(item, `${path}.${key}`);
233
+ }
234
+ return parsed;
235
+ }
236
+ serialize(value, path = "value") {
237
+ const parsed = this.parse(value, path);
238
+ const serialized = {};
239
+ for (const [key, item] of Object.entries(parsed)) serialized[key] = serializeValue(this.valueValidator, item, `${path}.${key}`);
240
+ return serialized;
241
+ }
242
+ deserialize(value, path = "value") {
243
+ if (typeof value !== "object" || value === null || Array.isArray(value)) throw new Error(`${path} must be an object.`);
244
+ const source = value;
245
+ const parsed = {};
246
+ for (const [key, item] of Object.entries(source)) {
247
+ const parsedKey = this.keyValidator.parse(key, `${path}.{key}`);
248
+ parsed[parsedKey] = deserializeValue(this.valueValidator, item, `${path}.${key}`);
249
+ }
250
+ return parsed;
251
+ }
252
+ describe() {
253
+ return {
254
+ kind: "record",
255
+ key: describeValidator(this.keyValidator),
256
+ value: describeValidator(this.valueValidator)
257
+ };
258
+ }
259
+ };
260
+ var UnionValidator = class extends BaseValidator {
261
+ members;
262
+ constructor(members) {
263
+ super("union");
264
+ this.members = members;
265
+ }
266
+ parse(value, path = "value") {
267
+ for (const member of this.members) try {
268
+ return member.parse(value, path);
269
+ } catch {
270
+ continue;
271
+ }
272
+ throw new Error(`${path} did not match any union member.`);
273
+ }
274
+ serialize(value, path = "value") {
275
+ for (const member of this.members) try {
276
+ return serializeValue(member, member.parse(value, path), path);
277
+ } catch {
278
+ continue;
279
+ }
280
+ throw new Error(`${path} did not match any union member.`);
281
+ }
282
+ deserialize(value, path = "value") {
283
+ for (const member of this.members) try {
284
+ return deserializeValue(member, value, path);
285
+ } catch {
286
+ continue;
287
+ }
288
+ throw new Error(`${path} did not match any union member.`);
289
+ }
290
+ describe() {
291
+ return {
292
+ kind: "union",
293
+ members: this.members.map((member) => describeValidator(member))
294
+ };
295
+ }
296
+ };
297
+ var CodecValidator = class extends BaseValidator {
298
+ valueValidator;
299
+ storageValidator;
300
+ codec;
301
+ constructor(valueValidator, storageValidator, codec) {
302
+ super("codec");
303
+ this.valueValidator = valueValidator;
304
+ this.storageValidator = storageValidator;
305
+ this.codec = codec;
306
+ }
307
+ parse(value, path = "value") {
308
+ return this.valueValidator.parse(value, path);
309
+ }
310
+ serialize(value, path = "value") {
311
+ const parsed = this.valueValidator.parse(value, path);
312
+ const serialized = this.codec.serialize(parsed);
313
+ return serializeValue(this.storageValidator, this.storageValidator.parse(serialized, path), path);
314
+ }
315
+ deserialize(value, path = "value") {
316
+ const parsedStored = deserializeValue(this.storageValidator, value, path);
317
+ return this.valueValidator.parse(this.codec.deserialize(parsedStored), path);
318
+ }
319
+ describe() {
320
+ return {
321
+ kind: "codec",
322
+ value: describeValidator(this.valueValidator),
323
+ storage: describeValidator(this.storageValidator)
324
+ };
325
+ }
91
326
  };
92
- function isValidator(value) {
93
- return typeof value.parse === "function";
94
- }
95
- function ensureObjectValidator(value) {
96
- if (isValidator(value)) return value;
97
- return new ObjectValidator(value);
98
- }
99
327
  /**
100
- * Build runtime validators for schemas, function args, and return values.
328
+ * Primary schema builder for Syncore’s data-model DSL.
329
+ *
330
+ * `s` is a namespace of factory functions for creating typed field validators.
331
+ * Use it when defining table schemas with {@link defineTable} and when
332
+ * declaring function argument shapes with {@link query}, {@link mutation}, or
333
+ * {@link action}.
101
334
  *
102
- * @example
103
335
  * ```ts
104
- * defineTable({
105
- * text: v.string(),
106
- * done: v.boolean(),
107
- * ownerId: v.optional(v.id("users"))
336
+ * import { defineTable, defineSchema, s } from "syncorejs";
337
+ *
338
+ * export default defineSchema({
339
+ * tasks: defineTable({
340
+ * title: s.string(),
341
+ * status: s.enum(["todo", "done"] as const),
342
+ * projectId: s.nullable(s.id("projects")),
343
+ * tags: s.optional(s.array(s.string())),
344
+ * metadata: s.optional(s.object({ priority: s.number() })),
345
+ * })
346
+ * .index("by_status", ["status"])
347
+ * .searchIndex("search_title", { searchField: "title", filterFields: ["status"] }),
108
348
  * });
109
349
  * ```
110
350
  */
111
- const v = {
351
+ const s = {
112
352
  string: () => new StringValidator(),
113
353
  number: () => new NumberValidator(),
114
354
  boolean: () => new BooleanValidator(),
115
355
  null: () => new NullValidator(),
116
356
  any: () => new AnyValidator(),
117
357
  literal: (literalValue) => new LiteralValidator(literalValue),
358
+ enum: (values) => new EnumValidator(values),
118
359
  array: (itemValidator) => new ArrayValidator(itemValidator),
119
360
  object: (shape) => new ObjectValidator(shape),
120
361
  id: (tableName) => new IdValidator(tableName),
121
- optional: (inner) => new OptionalValidator(inner)
362
+ optional: (inner) => new OptionalValidator(inner),
363
+ record: (keyValidator, valueValidator) => new RecordValidator(keyValidator, valueValidator),
364
+ union: (...members) => new UnionValidator(members),
365
+ nullable: (inner) => new UnionValidator([inner, new NullValidator()]),
366
+ codec: (valueValidator, config) => new CodecValidator(valueValidator, config.storage, {
367
+ serialize: (value) => config.serialize(value),
368
+ deserialize: (value) => config.deserialize(value)
369
+ })
122
370
  };
371
+ function isValidator(value) {
372
+ return typeof value.parse === "function";
373
+ }
374
+ function ensureObjectValidator(value) {
375
+ if (isValidator(value)) return value;
376
+ return new ObjectValidator(value);
377
+ }
378
+ function serializeValue(validator, value, path = "value") {
379
+ if (validator.serialize) return validator.serialize(value, path);
380
+ return value;
381
+ }
382
+ function deserializeValue(validator, value, path = "value") {
383
+ if (validator.deserialize) return validator.deserialize(value, path);
384
+ return validator.parse(value, path);
385
+ }
123
386
  function describeValidator(validator) {
387
+ if (validator.describe) return validator.describe();
124
388
  switch (validator.kind) {
125
389
  case "string":
126
390
  case "number":
@@ -131,17 +395,40 @@ function describeValidator(validator) {
131
395
  kind: "literal",
132
396
  value: validator.literalValue
133
397
  };
398
+ case "enum": return {
399
+ kind: "enum",
400
+ values: [...validator.values]
401
+ };
134
402
  case "array": return {
135
403
  kind: "array",
136
404
  item: describeValidator(validator.itemValidator)
137
405
  };
138
406
  case "object": {
139
- const objectValidator = validator;
407
+ const objectShape = "shape" in validator ? validator.shape : {};
140
408
  return {
141
409
  kind: "object",
142
- shape: Object.fromEntries(Object.entries(objectValidator.shape).map(([key, nested]) => [key, describeValidator(nested)]))
410
+ shape: Object.fromEntries(Object.entries(objectShape).map(([key, field]) => {
411
+ if (isValidator(field)) return [key, {
412
+ validator: field.kind === "optional" ? describeValidator(field.inner) : describeValidator(field),
413
+ optional: field.kind === "optional"
414
+ }];
415
+ const metadata = field;
416
+ return [key, {
417
+ validator: metadata.validator ?? metadata.field ?? { kind: "any" },
418
+ optional: metadata.optional ?? false
419
+ }];
420
+ }))
143
421
  };
144
422
  }
423
+ case "record": return {
424
+ kind: "record",
425
+ key: describeValidator(validator.keyValidator),
426
+ value: describeValidator(validator.valueValidator)
427
+ };
428
+ case "union": return {
429
+ kind: "union",
430
+ members: validator.members.map((member) => describeValidator(member))
431
+ };
145
432
  case "id": return {
146
433
  kind: "id",
147
434
  tableName: validator.tableName
@@ -150,9 +437,14 @@ function describeValidator(validator) {
150
437
  kind: "optional",
151
438
  inner: describeValidator(validator.inner)
152
439
  };
440
+ case "codec": return {
441
+ kind: "codec",
442
+ value: describeValidator(validator.valueValidator),
443
+ storage: describeValidator(validator.storageValidator)
444
+ };
153
445
  }
154
446
  }
155
447
  //#endregion
156
- export { AnyValidator, ArrayValidator, BooleanValidator, IdValidator, LiteralValidator, NullValidator, NumberValidator, ObjectValidator, OptionalValidator, StringValidator, describeValidator, ensureObjectValidator, v };
448
+ export { AnyValidator, ArrayValidator, BooleanValidator, CodecValidator, EnumValidator, IdValidator, LiteralValidator, NullValidator, NumberValidator, ObjectValidator, OptionalValidator, RecordValidator, StringValidator, UnionValidator, describeValidator, deserializeValue, ensureObjectValidator, isValidator, s, serializeValue };
157
449
 
158
450
  //# sourceMappingURL=validators.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"validators.js","names":[],"sources":["../src/validators.ts"],"sourcesContent":["export type ValidatorKind =\n | \"string\"\n | \"number\"\n | \"boolean\"\n | \"literal\"\n | \"array\"\n | \"object\"\n | \"id\"\n | \"optional\"\n | \"any\"\n | \"null\";\n\n/**\n * Validates unknown input at runtime and carries its parsed TypeScript type.\n *\n * Syncore uses validators for function arguments, return values, and table\n * definitions. Most apps create validators through {@link v} instead of\n * instantiating validator classes directly.\n */\nexport interface Validator<TValue> {\n readonly kind: ValidatorKind;\n\n /**\n * Parse and validate an unknown value.\n *\n * @param value - The value to validate.\n * @param path - A human-readable path used in validation errors.\n * @returns The parsed value when validation succeeds.\n */\n parse(value: unknown, path?: string): TValue;\n}\n\nexport type ValidatorDescription =\n | { kind: \"string\" }\n | { kind: \"number\" }\n | { kind: \"boolean\" }\n | { kind: \"null\" }\n | { kind: \"any\" }\n | { kind: \"literal\"; value: string | number | boolean | null }\n | { kind: \"array\"; item: ValidatorDescription }\n | { kind: \"object\"; shape: Record<string, ValidatorDescription> }\n | { kind: \"id\"; tableName: string }\n | { kind: \"optional\"; inner: ValidatorDescription };\n\nexport interface ObjectValidatorShape {\n [key: string]: Validator<unknown>;\n}\n\nexport class StringValidator implements Validator<string> {\n readonly kind = \"string\" as const;\n\n parse(value: unknown, path = \"value\"): string {\n if (typeof value !== \"string\") {\n throw new Error(`${path} must be a string.`);\n }\n return value;\n }\n}\n\nexport class NumberValidator implements Validator<number> {\n readonly kind = \"number\" as const;\n\n parse(value: unknown, path = \"value\"): number {\n if (typeof value !== \"number\" || Number.isNaN(value)) {\n throw new Error(`${path} must be a number.`);\n }\n return value;\n }\n}\n\nexport class BooleanValidator implements Validator<boolean> {\n readonly kind = \"boolean\" as const;\n\n parse(value: unknown, path = \"value\"): boolean {\n if (typeof value !== \"boolean\") {\n throw new Error(`${path} must be a boolean.`);\n }\n return value;\n }\n}\n\nexport class NullValidator implements Validator<null> {\n readonly kind = \"null\" as const;\n\n parse(value: unknown, path = \"value\"): null {\n if (value !== null) {\n throw new Error(`${path} must be null.`);\n }\n return null;\n }\n}\n\nexport class AnyValidator implements Validator<unknown> {\n readonly kind = \"any\" as const;\n\n parse(value: unknown): unknown {\n return value;\n }\n}\n\nexport class LiteralValidator<\n TValue extends string | number | boolean | null\n> implements Validator<TValue> {\n readonly kind = \"literal\" as const;\n\n constructor(public readonly literalValue: TValue) {}\n\n parse(value: unknown, path = \"value\"): TValue {\n if (value !== this.literalValue) {\n throw new Error(`${path} must equal ${String(this.literalValue)}.`);\n }\n return this.literalValue;\n }\n}\n\nexport class ArrayValidator<TItem> implements Validator<TItem[]> {\n readonly kind = \"array\" as const;\n\n constructor(public readonly itemValidator: Validator<TItem>) {}\n\n parse(value: unknown, path = \"value\"): TItem[] {\n if (!Array.isArray(value)) {\n throw new Error(`${path} must be an array.`);\n }\n return value.map((item, index) =>\n this.itemValidator.parse(item, `${path}[${index}]`)\n );\n }\n}\n\nexport class ObjectValidator<\n TShape extends ObjectValidatorShape\n> implements Validator<{ [TKey in keyof TShape]: Infer<TShape[TKey]> }> {\n readonly kind = \"object\" as const;\n\n constructor(public readonly shape: TShape) {}\n\n parse(\n value: unknown,\n path = \"value\"\n ): { [TKey in keyof TShape]: Infer<TShape[TKey]> } {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n throw new Error(`${path} must be an object.`);\n }\n\n const source = value as Record<string, unknown>;\n const parsed: Record<string, unknown> = {};\n\n for (const [key, validator] of Object.entries(this.shape)) {\n const optional =\n validator.kind === \"optional\" && source[key] === undefined;\n if (optional) {\n continue;\n }\n parsed[key] = validator.parse(source[key], `${path}.${key}`);\n }\n\n return parsed as { [TKey in keyof TShape]: Infer<TShape[TKey]> };\n }\n}\n\nexport class IdValidator<\n TTableName extends string\n> implements Validator<string> {\n readonly kind = \"id\" as const;\n\n constructor(public readonly tableName: TTableName) {}\n\n parse(value: unknown, path = \"value\"): string {\n if (typeof value !== \"string\" || value.length === 0) {\n throw new Error(`${path} must be a non-empty id string.`);\n }\n return value;\n }\n}\n\nexport class OptionalValidator<TValue> implements Validator<\n TValue | undefined\n> {\n readonly kind = \"optional\" as const;\n\n constructor(public readonly inner: Validator<TValue>) {}\n\n parse(value: unknown, path = \"value\"): TValue | undefined {\n if (value === undefined) {\n return undefined;\n }\n return this.inner.parse(value, path);\n }\n}\n\nexport type Infer<TValidator> =\n TValidator extends Validator<infer TValue> ? TValue : never;\n\nexport type ValidatorMap = Record<string, Validator<unknown>>;\n\n/**\n * The public validator builder API.\n *\n * Hover each property in your editor to see what it validates and how to use it.\n */\nexport interface ValidatorBuilderApi {\n /**\n * Validate a string value.\n *\n * @returns A validator that accepts JavaScript strings.\n */\n string(): StringValidator;\n\n /**\n * Validate a number value.\n *\n * @returns A validator that accepts finite JavaScript numbers.\n */\n number(): NumberValidator;\n\n /**\n * Validate a boolean value.\n *\n * @returns A validator that accepts `true` and `false`.\n */\n boolean(): BooleanValidator;\n\n /**\n * Validate the literal value `null`.\n *\n * @returns A validator that only accepts `null`.\n */\n null(): NullValidator;\n\n /**\n * Accept any value without validation.\n *\n * Use this sparingly for escape hatches when you do not want Syncore to\n * enforce a more specific runtime shape.\n */\n any(): AnyValidator;\n\n /**\n * Validate a single literal value.\n *\n * @param literalValue - The exact value that must be provided.\n * @returns A validator that only accepts that one value.\n */\n literal<TValue extends string | number | boolean | null>(\n literalValue: TValue\n ): LiteralValidator<TValue>;\n\n /**\n * Validate an array whose items all use the same validator.\n *\n * @param itemValidator - The validator for each item in the array.\n * @returns A validator for arrays of the provided item type.\n */\n array<TItem>(itemValidator: Validator<TItem>): ArrayValidator<TItem>;\n\n /**\n * Validate an object with a fixed property shape.\n *\n * @param shape - The validators for each property on the object.\n * @returns A validator for objects matching that shape.\n */\n object<TShape extends ObjectValidatorShape>(\n shape: TShape\n ): ObjectValidator<TShape>;\n\n /**\n * Validate an identifier string that points at a table.\n *\n * Use this for document ids that come from Syncore tables.\n *\n * @param tableName - The name of the referenced table.\n * @returns A validator for ids belonging to that table.\n */\n id<TTableName extends string>(tableName: TTableName): IdValidator<TTableName>;\n\n /**\n * Make another validator optional.\n *\n * @param inner - The validator for the defined case.\n * @returns A validator that accepts `undefined` or the inner value.\n */\n optional<TValue>(inner: Validator<TValue>): OptionalValidator<TValue>;\n}\n\nfunction isValidator(\n value: Validator<unknown> | ValidatorMap\n): value is Validator<unknown> {\n return typeof (value as Validator<unknown>).parse === \"function\";\n}\n\nexport function ensureObjectValidator(\n value: Validator<unknown> | ValidatorMap\n): Validator<unknown> {\n if (isValidator(value)) {\n return value;\n }\n return new ObjectValidator(value);\n}\n\n/**\n * Build runtime validators for schemas, function args, and return values.\n *\n * @example\n * ```ts\n * defineTable({\n * text: v.string(),\n * done: v.boolean(),\n * ownerId: v.optional(v.id(\"users\"))\n * });\n * ```\n */\nexport const v: ValidatorBuilderApi = {\n string: () => new StringValidator(),\n number: () => new NumberValidator(),\n boolean: () => new BooleanValidator(),\n null: () => new NullValidator(),\n any: () => new AnyValidator(),\n literal: <TValue extends string | number | boolean | null>(\n literalValue: TValue\n ) => new LiteralValidator(literalValue),\n array: <TItem>(itemValidator: Validator<TItem>) =>\n new ArrayValidator(itemValidator),\n object: <TShape extends ObjectValidatorShape>(shape: TShape) =>\n new ObjectValidator(shape),\n id: <TTableName extends string>(tableName: TTableName) =>\n new IdValidator(tableName),\n optional: <TValue>(inner: Validator<TValue>) => new OptionalValidator(inner)\n};\n\nexport function describeValidator(\n validator: Validator<unknown>\n): ValidatorDescription {\n switch (validator.kind) {\n case \"string\":\n case \"number\":\n case \"boolean\":\n case \"null\":\n case \"any\":\n return { kind: validator.kind };\n case \"literal\":\n return {\n kind: \"literal\",\n value: (validator as LiteralValidator<string | number | boolean | null>)\n .literalValue\n };\n case \"array\":\n return {\n kind: \"array\",\n item: describeValidator(\n (validator as ArrayValidator<unknown>).itemValidator\n )\n };\n case \"object\": {\n const objectValidator =\n validator as ObjectValidator<ObjectValidatorShape>;\n return {\n kind: \"object\",\n shape: Object.fromEntries(\n Object.entries(objectValidator.shape).map(([key, nested]) => [\n key,\n describeValidator(nested)\n ])\n )\n };\n }\n case \"id\":\n return {\n kind: \"id\",\n tableName: (validator as IdValidator<string>).tableName\n };\n case \"optional\":\n return {\n kind: \"optional\",\n inner: describeValidator(\n (validator as OptionalValidator<unknown>).inner\n )\n };\n }\n}\n"],"mappings":";AAgDA,IAAa,kBAAb,MAA0D;CACxD,OAAgB;CAEhB,MAAM,OAAgB,OAAO,SAAiB;AAC5C,MAAI,OAAO,UAAU,SACnB,OAAM,IAAI,MAAM,GAAG,KAAK,oBAAoB;AAE9C,SAAO;;;AAIX,IAAa,kBAAb,MAA0D;CACxD,OAAgB;CAEhB,MAAM,OAAgB,OAAO,SAAiB;AAC5C,MAAI,OAAO,UAAU,YAAY,OAAO,MAAM,MAAM,CAClD,OAAM,IAAI,MAAM,GAAG,KAAK,oBAAoB;AAE9C,SAAO;;;AAIX,IAAa,mBAAb,MAA4D;CAC1D,OAAgB;CAEhB,MAAM,OAAgB,OAAO,SAAkB;AAC7C,MAAI,OAAO,UAAU,UACnB,OAAM,IAAI,MAAM,GAAG,KAAK,qBAAqB;AAE/C,SAAO;;;AAIX,IAAa,gBAAb,MAAsD;CACpD,OAAgB;CAEhB,MAAM,OAAgB,OAAO,SAAe;AAC1C,MAAI,UAAU,KACZ,OAAM,IAAI,MAAM,GAAG,KAAK,gBAAgB;AAE1C,SAAO;;;AAIX,IAAa,eAAb,MAAwD;CACtD,OAAgB;CAEhB,MAAM,OAAyB;AAC7B,SAAO;;;AAIX,IAAa,mBAAb,MAE+B;CAC7B,OAAgB;CAEhB,YAAY,cAAsC;AAAtB,OAAA,eAAA;;CAE5B,MAAM,OAAgB,OAAO,SAAiB;AAC5C,MAAI,UAAU,KAAK,aACjB,OAAM,IAAI,MAAM,GAAG,KAAK,cAAc,OAAO,KAAK,aAAa,CAAC,GAAG;AAErE,SAAO,KAAK;;;AAIhB,IAAa,iBAAb,MAAiE;CAC/D,OAAgB;CAEhB,YAAY,eAAiD;AAAjC,OAAA,gBAAA;;CAE5B,MAAM,OAAgB,OAAO,SAAkB;AAC7C,MAAI,CAAC,MAAM,QAAQ,MAAM,CACvB,OAAM,IAAI,MAAM,GAAG,KAAK,oBAAoB;AAE9C,SAAO,MAAM,KAAK,MAAM,UACtB,KAAK,cAAc,MAAM,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,CACpD;;;AAIL,IAAa,kBAAb,MAEwE;CACtE,OAAgB;CAEhB,YAAY,OAA+B;AAAf,OAAA,QAAA;;CAE5B,MACE,OACA,OAAO,SAC0C;AACjD,MAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,MAAM,QAAQ,MAAM,CACrE,OAAM,IAAI,MAAM,GAAG,KAAK,qBAAqB;EAG/C,MAAM,SAAS;EACf,MAAM,SAAkC,EAAE;AAE1C,OAAK,MAAM,CAAC,KAAK,cAAc,OAAO,QAAQ,KAAK,MAAM,EAAE;AAGzD,OADE,UAAU,SAAS,cAAc,OAAO,SAAS,KAAA,EAEjD;AAEF,UAAO,OAAO,UAAU,MAAM,OAAO,MAAM,GAAG,KAAK,GAAG,MAAM;;AAG9D,SAAO;;;AAIX,IAAa,cAAb,MAE+B;CAC7B,OAAgB;CAEhB,YAAY,WAAuC;AAAvB,OAAA,YAAA;;CAE5B,MAAM,OAAgB,OAAO,SAAiB;AAC5C,MAAI,OAAO,UAAU,YAAY,MAAM,WAAW,EAChD,OAAM,IAAI,MAAM,GAAG,KAAK,iCAAiC;AAE3D,SAAO;;;AAIX,IAAa,oBAAb,MAEE;CACA,OAAgB;CAEhB,YAAY,OAA0C;AAA1B,OAAA,QAAA;;CAE5B,MAAM,OAAgB,OAAO,SAA6B;AACxD,MAAI,UAAU,KAAA,EACZ;AAEF,SAAO,KAAK,MAAM,MAAM,OAAO,KAAK;;;AAkGxC,SAAS,YACP,OAC6B;AAC7B,QAAO,OAAQ,MAA6B,UAAU;;AAGxD,SAAgB,sBACd,OACoB;AACpB,KAAI,YAAY,MAAM,CACpB,QAAO;AAET,QAAO,IAAI,gBAAgB,MAAM;;;;;;;;;;;;;;AAenC,MAAa,IAAyB;CACpC,cAAc,IAAI,iBAAiB;CACnC,cAAc,IAAI,iBAAiB;CACnC,eAAe,IAAI,kBAAkB;CACrC,YAAY,IAAI,eAAe;CAC/B,WAAW,IAAI,cAAc;CAC7B,UACE,iBACG,IAAI,iBAAiB,aAAa;CACvC,QAAe,kBACb,IAAI,eAAe,cAAc;CACnC,SAA8C,UAC5C,IAAI,gBAAgB,MAAM;CAC5B,KAAgC,cAC9B,IAAI,YAAY,UAAU;CAC5B,WAAmB,UAA6B,IAAI,kBAAkB,MAAM;CAC7E;AAED,SAAgB,kBACd,WACsB;AACtB,SAAQ,UAAU,MAAlB;EACE,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK,MACH,QAAO,EAAE,MAAM,UAAU,MAAM;EACjC,KAAK,UACH,QAAO;GACL,MAAM;GACN,OAAQ,UACL;GACJ;EACH,KAAK,QACH,QAAO;GACL,MAAM;GACN,MAAM,kBACH,UAAsC,cACxC;GACF;EACH,KAAK,UAAU;GACb,MAAM,kBACJ;AACF,UAAO;IACL,MAAM;IACN,OAAO,OAAO,YACZ,OAAO,QAAQ,gBAAgB,MAAM,CAAC,KAAK,CAAC,KAAK,YAAY,CAC3D,KACA,kBAAkB,OAAO,CAC1B,CAAC,CACH;IACF;;EAEH,KAAK,KACH,QAAO;GACL,MAAM;GACN,WAAY,UAAkC;GAC/C;EACH,KAAK,WACH,QAAO;GACL,MAAM;GACN,OAAO,kBACJ,UAAyC,MAC3C;GACF"}
1
+ {"version":3,"file":"validators.js","names":[],"sources":["../src/validators.ts"],"sourcesContent":["type Expand<T> = { [TKey in keyof T]: T[TKey] } & {};\n\nexport type ValidatorKind =\n | \"string\"\n | \"number\"\n | \"boolean\"\n | \"literal\"\n | \"enum\"\n | \"array\"\n | \"object\"\n | \"record\"\n | \"union\"\n | \"id\"\n | \"optional\"\n | \"any\"\n | \"null\"\n | \"codec\";\n\n/**\n * A schema field definition that combines validation, serialisation, and\n * field-path metadata for Syncore’s data model.\n *\n * Every type in the `s.*` builder namespace produces a `Validator`. You attach\n * validators to table definitions via {@link defineTable} and to function\n * arguments via the `args` field of {@link query}, {@link mutation}, and\n * {@link action}.\n *\n * ```ts\n * const titleValidator = s.string(); // Validator<string>\n * const tagsValidator = s.array(s.string()); // Validator<string[]>\n * ```\n *\n * Validators carry three type parameters:\n * - `TValue` — the TypeScript type after parsing (used in application code).\n * - `TStorage` — the serialised representation stored in SQLite (may differ\n * for codec validators).\n * - `TFieldPaths` — dotted paths to nested fields, used by the query builder\n * for type-safe index and search-index references.\n */\nexport interface Validator<\n TValue = unknown,\n TStorage = TValue,\n TFieldPaths extends string = never\n> {\n readonly kind: ValidatorKind;\n readonly fieldPaths?: TFieldPaths;\n parse(value: unknown, path?: string): TValue;\n serialize?(value: TValue, path?: string): TStorage;\n deserialize?(value: unknown, path?: string): TValue;\n describe?(): ValidatorDescription;\n}\n\nexport type ValidatorDescription =\n | { kind: \"string\" }\n | { kind: \"number\" }\n | { kind: \"boolean\" }\n | { kind: \"null\" }\n | { kind: \"any\" }\n | { kind: \"literal\"; value: string | number | boolean | null }\n | { kind: \"enum\"; values: string[] }\n | { kind: \"array\"; item: ValidatorDescription }\n | {\n kind: \"object\";\n shape: Record<\n string,\n {\n validator: ValidatorDescription;\n optional: boolean;\n }\n >;\n }\n | { kind: \"record\"; key: ValidatorDescription; value: ValidatorDescription }\n | { kind: \"union\"; members: ValidatorDescription[] }\n | { kind: \"id\"; tableName: string }\n | { kind: \"optional\"; inner: ValidatorDescription }\n | {\n kind: \"codec\";\n value: ValidatorDescription;\n storage: ValidatorDescription;\n };\n\nexport type Infer<TValidator> =\n TValidator extends Validator<infer TValue, unknown, string> ? TValue : never;\n\nexport type InferStorage<TValidator> =\n TValidator extends Validator<unknown, infer TStorage, string>\n ? TStorage\n : never;\n\nexport type FieldPaths<TValidator> =\n TValidator extends Validator<unknown, unknown, infer TFieldPaths>\n ? TFieldPaths\n : never;\n\nexport interface ObjectValidatorShape {\n [key: string]: Validator<unknown, unknown, string>;\n}\n\nexport type ValidatorMap = Record<string, Validator<unknown, unknown, string>>;\n\ntype OptionalKeys<TShape extends ObjectValidatorShape> = {\n [TKey in keyof TShape]:\n TShape[TKey] extends OptionalValidator<unknown, unknown, string>\n ? TKey\n : never;\n}[keyof TShape];\n\ntype RequiredKeys<TShape extends ObjectValidatorShape> = Exclude<\n keyof TShape,\n OptionalKeys<TShape>\n>;\n\ntype InferObject<TShape extends ObjectValidatorShape> = Expand<\n {\n [TKey in OptionalKeys<TShape>]?: Exclude<Infer<TShape[TKey]>, undefined>;\n } & {\n [TKey in RequiredKeys<TShape>]: Infer<TShape[TKey]>;\n }\n>;\n\ntype InferStoredObject<TShape extends ObjectValidatorShape> = Expand<\n {\n [TKey in OptionalKeys<TShape>]?: Exclude<\n InferStorage<TShape[TKey]>,\n undefined\n >;\n } & {\n [TKey in RequiredKeys<TShape>]: InferStorage<TShape[TKey]>;\n }\n>;\n\nexport type JoinFieldPaths<\n TStart extends string,\n TEnd extends string\n> = `${TStart}.${TEnd}`;\n\ntype ShapeFieldPaths<TShape extends ObjectValidatorShape> = {\n [TKey in keyof TShape & string]: FieldPaths<TShape[TKey]> extends never\n ? TKey\n : TKey | JoinFieldPaths<TKey, FieldPaths<TShape[TKey]>>;\n}[keyof TShape & string];\n\nabstract class BaseValidator<\n TValue,\n TStorage = TValue,\n TFieldPaths extends string = never\n> implements Validator<TValue, TStorage, TFieldPaths> {\n declare readonly fieldPaths: TFieldPaths;\n\n constructor(public readonly kind: ValidatorKind) {}\n\n abstract parse(value: unknown, path?: string): TValue;\n\n serialize(value: TValue, path = \"value\"): TStorage {\n return this.parse(value, path) as unknown as TStorage;\n }\n\n deserialize(value: unknown, path = \"value\"): TValue {\n return this.parse(value, path);\n }\n\n abstract describe(): ValidatorDescription;\n}\n\nexport class StringValidator extends BaseValidator<string> {\n constructor() {\n super(\"string\");\n }\n\n parse(value: unknown, path = \"value\"): string {\n if (typeof value !== \"string\") {\n throw new Error(`${path} must be a string.`);\n }\n return value;\n }\n\n describe(): ValidatorDescription {\n return { kind: \"string\" };\n }\n}\n\nexport class NumberValidator extends BaseValidator<number> {\n constructor() {\n super(\"number\");\n }\n\n parse(value: unknown, path = \"value\"): number {\n if (typeof value !== \"number\" || Number.isNaN(value)) {\n throw new Error(`${path} must be a number.`);\n }\n return value;\n }\n\n describe(): ValidatorDescription {\n return { kind: \"number\" };\n }\n}\n\nexport class BooleanValidator extends BaseValidator<boolean> {\n constructor() {\n super(\"boolean\");\n }\n\n parse(value: unknown, path = \"value\"): boolean {\n if (typeof value !== \"boolean\") {\n throw new Error(`${path} must be a boolean.`);\n }\n return value;\n }\n\n describe(): ValidatorDescription {\n return { kind: \"boolean\" };\n }\n}\n\nexport class NullValidator extends BaseValidator<null> {\n constructor() {\n super(\"null\");\n }\n\n parse(value: unknown, path = \"value\"): null {\n if (value !== null) {\n throw new Error(`${path} must be null.`);\n }\n return null;\n }\n\n describe(): ValidatorDescription {\n return { kind: \"null\" };\n }\n}\n\nexport class AnyValidator extends BaseValidator<unknown, unknown, never> {\n constructor() {\n super(\"any\");\n }\n\n parse(value: unknown): unknown {\n return value;\n }\n\n describe(): ValidatorDescription {\n return { kind: \"any\" };\n }\n}\n\nexport class LiteralValidator<\n TValue extends string | number | boolean | null\n> extends BaseValidator<TValue> {\n constructor(public readonly literalValue: TValue) {\n super(\"literal\");\n }\n\n parse(value: unknown, path = \"value\"): TValue {\n if (value !== this.literalValue) {\n throw new Error(`${path} must equal ${String(this.literalValue)}.`);\n }\n return this.literalValue;\n }\n\n describe(): ValidatorDescription {\n return {\n kind: \"literal\",\n value: this.literalValue\n };\n }\n}\n\nexport class EnumValidator<\n TValues extends readonly [string, ...string[]]\n> extends BaseValidator<TValues[number]> {\n constructor(public readonly values: TValues) {\n super(\"enum\");\n }\n\n parse(value: unknown, path = \"value\"): TValues[number] {\n if (typeof value !== \"string\" || !this.values.includes(value)) {\n throw new Error(\n `${path} must be one of ${this.values.map((item) => JSON.stringify(item)).join(\", \")}.`\n );\n }\n return value;\n }\n\n describe(): ValidatorDescription {\n return {\n kind: \"enum\",\n values: [...this.values]\n };\n }\n}\n\nexport class ArrayValidator<\n TItem,\n TItemStorage,\n TItemValidator extends Validator<TItem, TItemStorage, string>\n> extends BaseValidator<TItem[], TItemStorage[], never> {\n constructor(public readonly itemValidator: TItemValidator) {\n super(\"array\");\n }\n\n parse(value: unknown, path = \"value\"): TItem[] {\n if (!Array.isArray(value)) {\n throw new Error(`${path} must be an array.`);\n }\n return value.map((item, index) =>\n this.itemValidator.parse(item, `${path}[${index}]`)\n );\n }\n\n override serialize(value: TItem[], path = \"value\"): TItemStorage[] {\n const parsed = this.parse(value, path);\n return parsed.map((item, index) =>\n serializeValue(this.itemValidator, item, `${path}[${index}]`)\n );\n }\n\n override deserialize(value: unknown, path = \"value\"): TItem[] {\n if (!Array.isArray(value)) {\n throw new Error(`${path} must be an array.`);\n }\n return value.map((item, index) =>\n deserializeValue(this.itemValidator, item, `${path}[${index}]`)\n );\n }\n\n describe(): ValidatorDescription {\n return {\n kind: \"array\",\n item: describeValidator(this.itemValidator)\n };\n }\n}\n\nexport class ObjectValidator<\n TShape extends ObjectValidatorShape\n> extends BaseValidator<\n InferObject<TShape>,\n InferStoredObject<TShape>,\n ShapeFieldPaths<TShape>\n> {\n constructor(public readonly shape: TShape) {\n super(\"object\");\n }\n\n parse(value: unknown, path = \"value\"): InferObject<TShape> {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n throw new Error(`${path} must be an object.`);\n }\n\n const source = value as Record<string, unknown>;\n const parsed: Record<string, unknown> = {};\n\n for (const [key, validator] of Object.entries(this.shape)) {\n if (validator.kind === \"optional\" && source[key] === undefined) {\n continue;\n }\n parsed[key] = validator.parse(source[key], `${path}.${key}`);\n }\n\n return parsed as InferObject<TShape>;\n }\n\n override serialize(\n value: InferObject<TShape>,\n path = \"value\"\n ): InferStoredObject<TShape> {\n const parsed = this.parse(value, path) as Record<string, unknown>;\n const serialized: Record<string, unknown> = {};\n\n for (const [key, validator] of Object.entries(this.shape)) {\n if (parsed[key] === undefined && validator.kind === \"optional\") {\n continue;\n }\n serialized[key] = serializeValue(\n validator,\n parsed[key],\n `${path}.${key}`\n );\n }\n\n return serialized as InferStoredObject<TShape>;\n }\n\n override deserialize(value: unknown, path = \"value\"): InferObject<TShape> {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n throw new Error(`${path} must be an object.`);\n }\n\n const source = value as Record<string, unknown>;\n const parsed: Record<string, unknown> = {};\n\n for (const [key, validator] of Object.entries(this.shape)) {\n if (validator.kind === \"optional\" && source[key] === undefined) {\n continue;\n }\n parsed[key] = deserializeValue(validator, source[key], `${path}.${key}`);\n }\n\n return parsed as InferObject<TShape>;\n }\n\n describe(): ValidatorDescription {\n return {\n kind: \"object\",\n shape: Object.fromEntries(\n Object.entries(this.shape).map(([key, validator]) => [\n key,\n {\n validator:\n validator.kind === \"optional\"\n ? describeValidator(\n (validator as OptionalValidator<unknown, unknown, string>).inner\n )\n : describeValidator(validator),\n optional: validator.kind === \"optional\"\n }\n ])\n )\n };\n }\n}\n\nexport class IdValidator<\n TTableName extends string\n> extends BaseValidator<string> {\n constructor(public readonly tableName: TTableName) {\n super(\"id\");\n }\n\n parse(value: unknown, path = \"value\"): string {\n if (typeof value !== \"string\" || value.length === 0) {\n throw new Error(`${path} must be a non-empty id string.`);\n }\n return value;\n }\n\n describe(): ValidatorDescription {\n return {\n kind: \"id\",\n tableName: this.tableName\n };\n }\n}\n\nexport class OptionalValidator<\n TValue,\n TStorage = TValue,\n TFieldPaths extends string = never\n> extends BaseValidator<\n TValue | undefined,\n TStorage | undefined,\n TFieldPaths\n> {\n constructor(public readonly inner: Validator<TValue, TStorage, TFieldPaths>) {\n super(\"optional\");\n }\n\n parse(value: unknown, path = \"value\"): TValue | undefined {\n if (value === undefined) {\n return undefined;\n }\n return this.inner.parse(value, path);\n }\n\n override serialize(\n value: TValue | undefined,\n path = \"value\"\n ): TStorage | undefined {\n if (value === undefined) {\n return undefined;\n }\n return serializeValue(this.inner, value, path);\n }\n\n override deserialize(\n value: unknown,\n path = \"value\"\n ): TValue | undefined {\n if (value === undefined) {\n return undefined;\n }\n return deserializeValue(this.inner, value, path);\n }\n\n describe(): ValidatorDescription {\n return {\n kind: \"optional\",\n inner: describeValidator(this.inner)\n };\n }\n}\n\nexport class RecordValidator<\n TKey extends string,\n TValue,\n TStorage,\n TKeyValidator extends Validator<TKey, string, string>,\n TValueValidator extends Validator<TValue, TStorage, string>\n> extends BaseValidator<Record<TKey, TValue>, Record<TKey, TStorage>, never> {\n constructor(\n public readonly keyValidator: TKeyValidator,\n public readonly valueValidator: TValueValidator\n ) {\n super(\"record\");\n }\n\n parse(value: unknown, path = \"value\"): Record<TKey, TValue> {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n throw new Error(`${path} must be an object.`);\n }\n const source = value as Record<string, unknown>;\n const parsed: Record<string, TValue> = {};\n for (const [key, item] of Object.entries(source)) {\n const parsedKey = this.keyValidator.parse(key, `${path}.{key}`);\n parsed[parsedKey] = this.valueValidator.parse(item, `${path}.${key}`);\n }\n return parsed;\n }\n\n override serialize(\n value: Record<TKey, TValue>,\n path = \"value\"\n ): Record<TKey, TStorage> {\n const parsed = this.parse(value, path);\n const serialized: Record<string, TStorage> = {};\n for (const [key, item] of Object.entries(parsed)) {\n serialized[key] = serializeValue(this.valueValidator, item, `${path}.${key}`);\n }\n return serialized;\n }\n\n override deserialize(\n value: unknown,\n path = \"value\"\n ): Record<TKey, TValue> {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n throw new Error(`${path} must be an object.`);\n }\n const source = value as Record<string, unknown>;\n const parsed: Record<string, TValue> = {};\n for (const [key, item] of Object.entries(source)) {\n const parsedKey = this.keyValidator.parse(key, `${path}.{key}`);\n parsed[parsedKey] = deserializeValue(\n this.valueValidator,\n item,\n `${path}.${key}`\n );\n }\n return parsed;\n }\n\n describe(): ValidatorDescription {\n return {\n kind: \"record\",\n key: describeValidator(this.keyValidator),\n value: describeValidator(this.valueValidator)\n };\n }\n}\n\nexport class UnionValidator<\n TMembers extends readonly Validator<unknown, unknown, string>[]\n> extends BaseValidator<\n Infer<TMembers[number]>,\n InferStorage<TMembers[number]>,\n FieldPaths<TMembers[number]>\n> {\n constructor(public readonly members: TMembers) {\n super(\"union\");\n }\n\n parse(value: unknown, path = \"value\"): Infer<TMembers[number]> {\n for (const member of this.members) {\n try {\n return member.parse(value, path) as Infer<TMembers[number]>;\n } catch {\n continue;\n }\n }\n throw new Error(`${path} did not match any union member.`);\n }\n\n override serialize(\n value: Infer<TMembers[number]>,\n path = \"value\"\n ): InferStorage<TMembers[number]> {\n for (const member of this.members) {\n try {\n const parsed = member.parse(value, path);\n return serializeValue(\n member as Validator<\n Infer<TMembers[number]>,\n InferStorage<TMembers[number]>,\n string\n >,\n parsed,\n path\n ) as InferStorage<TMembers[number]>;\n } catch {\n continue;\n }\n }\n throw new Error(`${path} did not match any union member.`);\n }\n\n override deserialize(\n value: unknown,\n path = \"value\"\n ): Infer<TMembers[number]> {\n for (const member of this.members) {\n try {\n return deserializeValue(\n member as Validator<Infer<TMembers[number]>, InferStorage<TMembers[number]>, string>,\n value,\n path\n );\n } catch {\n continue;\n }\n }\n throw new Error(`${path} did not match any union member.`);\n }\n\n describe(): ValidatorDescription {\n return {\n kind: \"union\",\n members: this.members.map((member) => describeValidator(member))\n };\n }\n}\n\nexport class CodecValidator<\n TValue,\n TStored,\n TStorageFieldValidator extends Validator<TStored, unknown, string>,\n TValueFieldValidator extends Validator<TValue, unknown, string>\n> extends BaseValidator<\n TValue,\n InferStorage<TStorageFieldValidator>,\n FieldPaths<TValueFieldValidator>\n> {\n constructor(\n public readonly valueValidator: TValueFieldValidator,\n public readonly storageValidator: TStorageFieldValidator,\n private readonly codec: {\n serialize(value: TValue): TStored;\n deserialize(value: TStored): TValue;\n }\n ) {\n super(\"codec\");\n }\n\n parse(value: unknown, path = \"value\"): TValue {\n return this.valueValidator.parse(value, path);\n }\n\n override serialize(\n value: TValue,\n path = \"value\"\n ): InferStorage<TStorageFieldValidator> {\n const parsed = this.valueValidator.parse(value, path);\n const serialized = this.codec.serialize(parsed);\n return serializeValue(\n this.storageValidator,\n this.storageValidator.parse(serialized, path),\n path\n ) as InferStorage<TStorageFieldValidator>;\n }\n\n override deserialize(value: unknown, path = \"value\"): TValue {\n const parsedStored = deserializeValue(this.storageValidator, value, path);\n return this.valueValidator.parse(\n this.codec.deserialize(parsedStored),\n path\n );\n }\n\n describe(): ValidatorDescription {\n return {\n kind: \"codec\",\n value: describeValidator(this.valueValidator),\n storage: describeValidator(this.storageValidator)\n };\n }\n}\n\n/**\n * Describes every method available on the `s` schema builder.\n *\n * You interact with this through the singleton {@link s} object rather than\n * implementing this interface yourself.\n */\nexport interface ValidatorBuilderApi {\n /**\n * Validates that the value is a `string`.\n *\n * ```ts\n * const v = s.string(); // Validator<string>\n * ```\n */\n string(): StringValidator;\n /**\n * Validates that the value is a finite `number` (rejects `NaN`).\n *\n * ```ts\n * const v = s.number(); // Validator<number>\n * ```\n */\n number(): NumberValidator;\n /**\n * Validates that the value is a `boolean`.\n *\n * ```ts\n * const v = s.boolean(); // Validator<boolean>\n * ```\n */\n boolean(): BooleanValidator;\n /**\n * Validates that the value is exactly `null`.\n *\n * Usually combined with `s.union` — or use the convenience `s.nullable`\n * helper instead.\n */\n null(): NullValidator;\n /**\n * Accepts any value without validation.\n *\n * Use sparingly. Prefer typed validators wherever possible to preserve\n * type safety and devtools introspection.\n */\n any(): AnyValidator;\n /**\n * Validates that the value is exactly equal to `literalValue`.\n *\n * ```ts\n * const v = s.literal(\"active\"); // Validator<\"active\">\n * ```\n */\n literal<TValue extends string | number | boolean | null>(\n literalValue: TValue\n ): LiteralValidator<TValue>;\n /**\n * Validates that the value is one of the provided string literals.\n *\n * Prefer this over `s.union(s.literal(…), …)` for string-enum fields\n * because it generates a cleaner schema description.\n *\n * ```ts\n * const v = s.enum([\"todo\", \"in-progress\", \"done\"] as const);\n * // Validator<\"todo\" | \"in-progress\" | \"done\">\n * ```\n */\n enum<TValues extends readonly [string, ...string[]]>(\n values: TValues\n ): EnumValidator<TValues>;\n /**\n * Validates that the value is an array where every item passes\n * `itemValidator`.\n *\n * ```ts\n * const v = s.array(s.string()); // Validator<string[]>\n * ```\n */\n array<\n TItem,\n TItemStorage,\n TValidator extends Validator<TItem, TItemStorage, string>\n >(itemValidator: TValidator): ArrayValidator<TItem, TItemStorage, TValidator>;\n /**\n * Validates that the value is a plain object matching `shape`.\n *\n * Keys whose validators are `s.optional(...)` become optional properties in\n * the inferred type.\n *\n * ```ts\n * const v = s.object({ x: s.number(), y: s.number() });\n * // Validator<{ x: number; y: number }>\n * ```\n */\n object<TShape extends ObjectValidatorShape>(\n shape: TShape\n ): ObjectValidator<TShape>;\n /**\n * Validates that the value is a non-empty string that represents a document\n * `_id` in `tableName`.\n *\n * Using `s.id` instead of `s.string` for foreign-key fields enables devtools\n * to show relationships between tables.\n *\n * ```ts\n * const v = s.id(\"projects\"); // Validator<string> (typed as a projects ID)\n * ```\n */\n id<TTableName extends string>(tableName: TTableName): IdValidator<TTableName>;\n /**\n * Makes a field optional (the value can be `undefined` / absent).\n *\n * Only use inside `s.object()` shapes or as a top-level table field. Nesting\n * `s.optional` inside a non-object validator has no practical effect.\n *\n * ```ts\n * const v = s.object({ name: s.string(), bio: s.optional(s.string()) });\n * // Validator<{ name: string; bio?: string }>\n * ```\n */\n optional<TValue, TStorage, TFieldPaths extends string>(\n inner: Validator<TValue, TStorage, TFieldPaths>\n ): OptionalValidator<TValue, TStorage, TFieldPaths>;\n /**\n * Validates that the value is a `Record<TKey, TValue>` (an object with\n * dynamic keys of a specific type).\n *\n * ```ts\n * const v = s.record(s.string(), s.number()); // Validator<Record<string, number>>\n * ```\n */\n record<\n TKey extends string,\n TValue,\n TStorage,\n TKeyValidator extends Validator<TKey, string, string>,\n TValueValidator extends Validator<TValue, TStorage, string>\n >(\n keyValidator: TKeyValidator,\n valueValidator: TValueValidator\n ): RecordValidator<TKey, TValue, TStorage, TKeyValidator, TValueValidator>;\n /**\n * Validates that the value matches **one** of the provided validators\n * (discriminated union).\n *\n * Validators are tried in order; the first one that parses without throwing\n * wins.\n *\n * ```ts\n * const v = s.union(s.string(), s.number()); // Validator<string | number>\n * ```\n */\n union<\n TMembers extends readonly Validator<unknown, unknown, string>[]\n >(...members: TMembers): UnionValidator<TMembers>;\n /**\n * Convenience wrapper for `s.union(inner, s.null())` that types the field\n * as `TValue | null`.\n *\n * ```ts\n * const v = s.nullable(s.id(\"projects\")); // Validator<string | null>\n * ```\n */\n nullable<TValue, TStorage, TFieldPaths extends string>(\n inner: Validator<TValue, TStorage, TFieldPaths>\n ): UnionValidator<\n readonly [Validator<TValue, TStorage, TFieldPaths>, NullValidator]\n >;\n /**\n * Creates a custom codec that stores a field as one type but exposes it as\n * another.\n *\n * Useful for types that are not natively serialisable to JSON (e.g. `Date`,\n * `Map`, binary IDs). The codec’s `serialize` / `deserialize` functions\n * convert between the runtime value and the stored representation.\n *\n * ```ts\n * const dateValidator = s.codec(s.string(), {\n * storage: s.number(),\n * serialize: (date: string) => new Date(date).getTime(),\n * deserialize: (ts: number) => new Date(ts).toISOString(),\n * });\n * ```\n */\n codec<\n TValue,\n TStored,\n TStorageFieldValidator extends Validator<TStored, unknown, string>,\n TValueFieldValidator extends Validator<TValue, unknown, string>\n >(\n valueValidator: TValueFieldValidator,\n config: {\n storage: TStorageFieldValidator;\n serialize(value: TValue): TStored;\n deserialize(value: TStored): TValue;\n }\n ): CodecValidator<\n TValue,\n TStored,\n TStorageFieldValidator,\n TValueFieldValidator\n >;\n}\n\n/**\n * Primary schema builder for Syncore’s data-model DSL.\n *\n * `s` is a namespace of factory functions for creating typed field validators.\n * Use it when defining table schemas with {@link defineTable} and when\n * declaring function argument shapes with {@link query}, {@link mutation}, or\n * {@link action}.\n *\n * ```ts\n * import { defineTable, defineSchema, s } from \"syncorejs\";\n *\n * export default defineSchema({\n * tasks: defineTable({\n * title: s.string(),\n * status: s.enum([\"todo\", \"done\"] as const),\n * projectId: s.nullable(s.id(\"projects\")),\n * tags: s.optional(s.array(s.string())),\n * metadata: s.optional(s.object({ priority: s.number() })),\n * })\n * .index(\"by_status\", [\"status\"])\n * .searchIndex(\"search_title\", { searchField: \"title\", filterFields: [\"status\"] }),\n * });\n * ```\n */\nexport const s: ValidatorBuilderApi = {\n string: () => new StringValidator(),\n number: () => new NumberValidator(),\n boolean: () => new BooleanValidator(),\n null: () => new NullValidator(),\n any: () => new AnyValidator(),\n literal: <TValue extends string | number | boolean | null>(\n literalValue: TValue\n ) => new LiteralValidator(literalValue),\n enum: <TValues extends readonly [string, ...string[]]>(values: TValues) =>\n new EnumValidator(values),\n array: <\n TItem,\n TItemStorage,\n TValidator extends Validator<TItem, TItemStorage, string>\n >(\n itemValidator: TValidator\n ) =>\n new ArrayValidator(itemValidator) as ArrayValidator<TItem, TItemStorage, TValidator>,\n object: <TShape extends ObjectValidatorShape>(shape: TShape) =>\n new ObjectValidator(shape),\n id: <TTableName extends string>(tableName: TTableName) =>\n new IdValidator(tableName),\n optional: <TValue, TStorage, TFieldPaths extends string>(\n inner: Validator<TValue, TStorage, TFieldPaths>\n ) => new OptionalValidator(inner),\n record: <\n TKey extends string,\n TValue,\n TStorage,\n TKeyValidator extends Validator<TKey, string, string>,\n TValueValidator extends Validator<TValue, TStorage, string>\n >(\n keyValidator: TKeyValidator,\n valueValidator: TValueValidator\n ) =>\n new RecordValidator(keyValidator, valueValidator) as RecordValidator<\n TKey,\n TValue,\n TStorage,\n TKeyValidator,\n TValueValidator\n >,\n union: <TMembers extends readonly Validator<unknown, unknown, string>[]>(\n ...members: TMembers\n ) => new UnionValidator(members),\n nullable: <TValue, TStorage, TFieldPaths extends string>(\n inner: Validator<TValue, TStorage, TFieldPaths>\n ) => new UnionValidator([inner, new NullValidator()] as const),\n codec: <\n TValue,\n TStored,\n TStorageFieldValidator extends Validator<TStored, unknown, string>,\n TValueFieldValidator extends Validator<TValue, unknown, string>\n >(\n valueValidator: TValueFieldValidator,\n config: {\n storage: TStorageFieldValidator;\n serialize(value: TValue): TStored;\n deserialize(value: TStored): TValue;\n }\n ) =>\n new CodecValidator(valueValidator, config.storage, {\n serialize: (value) => config.serialize(value),\n deserialize: (value) => config.deserialize(value)\n }) as CodecValidator<\n TValue,\n TStored,\n TStorageFieldValidator,\n TValueFieldValidator\n >\n};\n\nexport function isValidator(\n value: Validator<unknown, unknown, string> | ValidatorMap\n): value is Validator<unknown, unknown, string> {\n return typeof (value as Validator<unknown, unknown, string>).parse === \"function\";\n}\n\nexport function ensureObjectValidator<TShape extends ObjectValidatorShape>(\n value: TShape\n): ObjectValidator<TShape>;\nexport function ensureObjectValidator<TValidator extends Validator<unknown, unknown, string>>(\n value: TValidator\n): TValidator;\nexport function ensureObjectValidator(\n value: Validator<unknown, unknown, string> | ValidatorMap\n): Validator<unknown, unknown, string> {\n if (isValidator(value)) {\n return value;\n }\n return new ObjectValidator(value);\n}\n\nexport function serializeValue<TValue, TStorage, TFieldPaths extends string>(\n validator: Validator<TValue, TStorage, TFieldPaths>,\n value: TValue,\n path = \"value\"\n): TStorage {\n if (validator.serialize) {\n return validator.serialize(value, path);\n }\n return value as unknown as TStorage;\n}\n\nexport function deserializeValue<\n TValue,\n TStorage,\n TFieldPaths extends string\n>(\n validator: Validator<TValue, TStorage, TFieldPaths>,\n value: unknown,\n path = \"value\"\n): TValue {\n if (validator.deserialize) {\n return validator.deserialize(value, path);\n }\n return validator.parse(value, path);\n}\n\nexport function describeValidator(\n validator: Validator<unknown, unknown, string>\n): ValidatorDescription {\n if (validator.describe) {\n return validator.describe();\n }\n\n switch (validator.kind) {\n case \"string\":\n case \"number\":\n case \"boolean\":\n case \"null\":\n case \"any\":\n return { kind: validator.kind };\n case \"literal\":\n return {\n kind: \"literal\",\n value: (validator as LiteralValidator<string | number | boolean | null>)\n .literalValue\n };\n case \"enum\":\n return {\n kind: \"enum\",\n values: [...(validator as EnumValidator<readonly [string, ...string[]]>).values]\n };\n case \"array\":\n return {\n kind: \"array\",\n item: describeValidator(\n (validator as ArrayValidator<unknown, unknown, Validator<unknown, unknown, string>>)\n .itemValidator\n )\n };\n case \"object\": {\n const objectShape =\n \"shape\" in validator\n ? (validator as {\n shape: Record<\n string,\n | Validator<unknown, unknown, string>\n | {\n validator?: ValidatorDescription;\n field?: ValidatorDescription;\n optional?: boolean;\n }\n >;\n }).shape\n : {};\n\n return {\n kind: \"object\",\n shape: Object.fromEntries(\n Object.entries(objectShape).map(([key, field]) => {\n if (isValidator(field as Validator<unknown, unknown, string>)) {\n return [\n key,\n {\n validator:\n (field as Validator<unknown, unknown, string>).kind === \"optional\"\n ? describeValidator(\n (\n field as OptionalValidator<unknown, unknown, string>\n ).inner\n )\n : describeValidator(\n field as Validator<unknown, unknown, string>\n ),\n optional:\n (field as Validator<unknown, unknown, string>).kind === \"optional\"\n }\n ];\n }\n const metadata = field as {\n validator?: ValidatorDescription;\n field?: ValidatorDescription;\n optional?: boolean;\n };\n return [\n key,\n {\n validator:\n metadata.validator ??\n metadata.field ??\n ({ kind: \"any\" } satisfies ValidatorDescription),\n optional: metadata.optional ?? false\n }\n ];\n })\n )\n };\n }\n case \"record\":\n return {\n kind: \"record\",\n key: describeValidator(\n (validator as RecordValidator<\n string,\n unknown,\n unknown,\n Validator<string, string, string>,\n Validator<unknown, unknown, string>\n >).keyValidator\n ),\n value: describeValidator(\n (validator as RecordValidator<\n string,\n unknown,\n unknown,\n Validator<string, string, string>,\n Validator<unknown, unknown, string>\n >).valueValidator\n )\n };\n case \"union\":\n return {\n kind: \"union\",\n members: (\n validator as UnionValidator<readonly Validator<unknown, unknown, string>[]>\n ).members.map((member) => describeValidator(member))\n };\n case \"id\":\n return {\n kind: \"id\",\n tableName: (validator as IdValidator<string>).tableName\n };\n case \"optional\":\n return {\n kind: \"optional\",\n inner: describeValidator(\n (validator as OptionalValidator<unknown, unknown, string>).inner\n )\n };\n case \"codec\":\n return {\n kind: \"codec\",\n value: describeValidator(\n (validator as CodecValidator<\n unknown,\n unknown,\n Validator<unknown, unknown, string>,\n Validator<unknown, unknown, string>\n >).valueValidator\n ),\n storage: describeValidator(\n (validator as CodecValidator<\n unknown,\n unknown,\n Validator<unknown, unknown, string>,\n Validator<unknown, unknown, string>\n >).storageValidator\n )\n };\n }\n}\n"],"mappings":"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"}