syncorejs 0.2.2 → 0.2.4
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/dist/_vendor/cli/app.d.mts.map +1 -1
- package/dist/_vendor/cli/app.mjs +8 -5
- package/dist/_vendor/cli/app.mjs.map +1 -1
- package/dist/_vendor/cli/context.mjs.map +1 -1
- package/dist/_vendor/cli/dev-session.mjs.map +1 -1
- package/dist/_vendor/cli/doctor.mjs.map +1 -1
- package/dist/_vendor/cli/errors.mjs.map +1 -1
- package/dist/_vendor/cli/help.mjs.map +1 -1
- package/dist/_vendor/cli/index.mjs +9 -2
- package/dist/_vendor/cli/index.mjs.map +1 -1
- package/dist/_vendor/cli/messages.mjs.map +1 -1
- package/dist/_vendor/cli/preflight.mjs.map +1 -1
- package/dist/_vendor/cli/project.mjs +20 -20
- package/dist/_vendor/cli/project.mjs.map +1 -1
- package/dist/_vendor/cli/render.mjs.map +1 -1
- package/dist/_vendor/cli/targets.mjs.map +1 -1
- package/dist/_vendor/core/cli.d.mts +8 -2
- package/dist/_vendor/core/cli.d.mts.map +1 -1
- package/dist/_vendor/core/cli.mjs +510 -71
- package/dist/_vendor/core/cli.mjs.map +1 -1
- package/dist/_vendor/core/devtools-auth.mjs.map +1 -1
- package/dist/_vendor/core/index.d.mts +3 -3
- package/dist/_vendor/core/runtime/components.d.mts.map +1 -1
- package/dist/_vendor/core/runtime/components.mjs.map +1 -1
- package/dist/_vendor/core/runtime/devtools.d.mts.map +1 -1
- package/dist/_vendor/core/runtime/devtools.mjs +261 -23
- package/dist/_vendor/core/runtime/devtools.mjs.map +1 -1
- package/dist/_vendor/core/runtime/functions.d.mts +388 -6
- package/dist/_vendor/core/runtime/functions.d.mts.map +1 -1
- package/dist/_vendor/core/runtime/functions.mjs +72 -1
- package/dist/_vendor/core/runtime/functions.mjs.map +1 -1
- package/dist/_vendor/core/runtime/id.d.mts.map +1 -1
- package/dist/_vendor/core/runtime/id.mjs.map +1 -1
- package/dist/_vendor/core/runtime/internal/engines/devtoolsEngine.mjs +12 -6
- package/dist/_vendor/core/runtime/internal/engines/devtoolsEngine.mjs.map +1 -1
- package/dist/_vendor/core/runtime/internal/engines/executionEngine.mjs +123 -20
- package/dist/_vendor/core/runtime/internal/engines/executionEngine.mjs.map +1 -1
- package/dist/_vendor/core/runtime/internal/engines/reactivityEngine.mjs +56 -8
- package/dist/_vendor/core/runtime/internal/engines/reactivityEngine.mjs.map +1 -1
- package/dist/_vendor/core/runtime/internal/engines/schedulerEngine.mjs +49 -14
- package/dist/_vendor/core/runtime/internal/engines/schedulerEngine.mjs.map +1 -1
- package/dist/_vendor/core/runtime/internal/engines/schemaEngine.mjs +4 -7
- package/dist/_vendor/core/runtime/internal/engines/schemaEngine.mjs.map +1 -1
- package/dist/_vendor/core/runtime/internal/engines/shared.mjs +81 -2
- package/dist/_vendor/core/runtime/internal/engines/shared.mjs.map +1 -1
- package/dist/_vendor/core/runtime/internal/engines/storageEngine.mjs +100 -13
- package/dist/_vendor/core/runtime/internal/engines/storageEngine.mjs.map +1 -1
- package/dist/_vendor/core/runtime/internal/runtimeKernel.mjs +42 -7
- package/dist/_vendor/core/runtime/internal/runtimeKernel.mjs.map +1 -1
- package/dist/_vendor/core/runtime/internal/runtimeStatus.mjs.map +1 -1
- package/dist/_vendor/core/runtime/internal/systemMeta.mjs.map +1 -1
- package/dist/_vendor/core/runtime/internal/transactionCoordinator.mjs +4 -0
- package/dist/_vendor/core/runtime/internal/transactionCoordinator.mjs.map +1 -1
- package/dist/_vendor/core/runtime/runtime.d.mts +1100 -12
- package/dist/_vendor/core/runtime/runtime.d.mts.map +1 -1
- package/dist/_vendor/core/runtime/runtime.mjs +63 -0
- package/dist/_vendor/core/runtime/runtime.mjs.map +1 -1
- package/dist/_vendor/core/transport.d.mts +2 -0
- package/dist/_vendor/core/transport.d.mts.map +1 -1
- package/dist/_vendor/core/transport.mjs +61 -27
- package/dist/_vendor/core/transport.mjs.map +1 -1
- package/dist/_vendor/devtools-protocol/index.d.ts +223 -4
- package/dist/_vendor/devtools-protocol/index.d.ts.map +1 -1
- package/dist/_vendor/devtools-protocol/index.js.map +1 -1
- package/dist/_vendor/next/config.d.ts +3 -4
- package/dist/_vendor/next/config.d.ts.map +1 -1
- package/dist/_vendor/next/config.js +37 -19
- package/dist/_vendor/next/config.js.map +1 -1
- package/dist/_vendor/next/index.d.ts +109 -29
- package/dist/_vendor/next/index.d.ts.map +1 -1
- package/dist/_vendor/next/index.js +86 -18
- package/dist/_vendor/next/index.js.map +1 -1
- package/dist/_vendor/platform-expo/index.d.ts +146 -27
- package/dist/_vendor/platform-expo/index.d.ts.map +1 -1
- package/dist/_vendor/platform-expo/index.js +81 -10
- package/dist/_vendor/platform-expo/index.js.map +1 -1
- package/dist/_vendor/platform-expo/react.js.map +1 -1
- package/dist/_vendor/platform-expo/web-sqljs-wasm.js +16 -0
- package/dist/_vendor/platform-expo/web-sqljs-wasm.js.map +1 -0
- package/dist/_vendor/platform-node/index.d.mts +174 -9
- package/dist/_vendor/platform-node/index.d.mts.map +1 -1
- package/dist/_vendor/platform-node/index.mjs +251 -95
- package/dist/_vendor/platform-node/index.mjs.map +1 -1
- package/dist/_vendor/platform-node/ipc-react.mjs +4 -0
- package/dist/_vendor/platform-node/ipc-react.mjs.map +1 -1
- package/dist/_vendor/platform-node/ipc.d.mts.map +1 -1
- package/dist/_vendor/platform-node/ipc.mjs.map +1 -1
- package/dist/_vendor/platform-web/external-change.d.ts +41 -0
- package/dist/_vendor/platform-web/external-change.d.ts.map +1 -1
- package/dist/_vendor/platform-web/external-change.js +30 -0
- package/dist/_vendor/platform-web/external-change.js.map +1 -1
- package/dist/_vendor/platform-web/index.d.ts +312 -37
- package/dist/_vendor/platform-web/index.d.ts.map +1 -1
- package/dist/_vendor/platform-web/index.js +247 -25
- package/dist/_vendor/platform-web/index.js.map +1 -1
- package/dist/_vendor/platform-web/indexeddb.d.ts +12 -0
- package/dist/_vendor/platform-web/indexeddb.d.ts.map +1 -1
- package/dist/_vendor/platform-web/indexeddb.js +10 -0
- package/dist/_vendor/platform-web/indexeddb.js.map +1 -1
- package/dist/_vendor/platform-web/opfs.d.ts +16 -1
- package/dist/_vendor/platform-web/opfs.d.ts.map +1 -1
- package/dist/_vendor/platform-web/opfs.js +41 -3
- package/dist/_vendor/platform-web/opfs.js.map +1 -1
- package/dist/_vendor/platform-web/persistence.d.ts +85 -1
- package/dist/_vendor/platform-web/persistence.d.ts.map +1 -1
- package/dist/_vendor/platform-web/persistence.js +15 -0
- package/dist/_vendor/platform-web/persistence.js.map +1 -1
- package/dist/_vendor/platform-web/react.d.ts +1 -2
- package/dist/_vendor/platform-web/react.d.ts.map +1 -1
- package/dist/_vendor/platform-web/react.js +11 -5
- package/dist/_vendor/platform-web/react.js.map +1 -1
- package/dist/_vendor/platform-web/sqljs.js +10 -1
- package/dist/_vendor/platform-web/sqljs.js.map +1 -1
- package/dist/_vendor/platform-web/web-sqljs-wasm.js +8 -0
- package/dist/_vendor/platform-web/web-sqljs-wasm.js.map +1 -0
- package/dist/_vendor/platform-web/worker.d.ts +60 -9
- package/dist/_vendor/platform-web/worker.d.ts.map +1 -1
- package/dist/_vendor/platform-web/worker.js +37 -4
- package/dist/_vendor/platform-web/worker.js.map +1 -1
- package/dist/_vendor/react/index.d.ts +197 -13
- package/dist/_vendor/react/index.d.ts.map +1 -1
- package/dist/_vendor/react/index.js +209 -17
- package/dist/_vendor/react/index.js.map +1 -1
- package/dist/_vendor/schema/definition.d.ts +129 -0
- package/dist/_vendor/schema/definition.d.ts.map +1 -1
- package/dist/_vendor/schema/definition.js +99 -0
- package/dist/_vendor/schema/definition.js.map +1 -1
- package/dist/_vendor/schema/planner.d.ts.map +1 -1
- package/dist/_vendor/schema/planner.js.map +1 -1
- package/dist/_vendor/schema/validators.d.ts +180 -4
- package/dist/_vendor/schema/validators.d.ts.map +1 -1
- package/dist/_vendor/schema/validators.js +35 -1
- package/dist/_vendor/schema/validators.js.map +1 -1
- package/dist/_vendor/svelte/index.d.ts +207 -7
- package/dist/_vendor/svelte/index.d.ts.map +1 -1
- package/dist/_vendor/svelte/index.js +201 -6
- package/dist/_vendor/svelte/index.js.map +1 -1
- package/dist/browser.d.ts.map +1 -1
- package/dist/cli.js +3 -1
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/package.json +24 -21
|
@@ -2,8 +2,25 @@
|
|
|
2
2
|
type Expand<T> = { [TKey in keyof T]: T[TKey] } & {};
|
|
3
3
|
type ValidatorKind = "string" | "number" | "boolean" | "literal" | "enum" | "array" | "object" | "record" | "union" | "id" | "optional" | "any" | "null" | "codec";
|
|
4
4
|
/**
|
|
5
|
-
* A schema field definition that combines validation,
|
|
6
|
-
* field-path metadata for Syncore
|
|
5
|
+
* A schema field definition that combines validation, serialisation, and
|
|
6
|
+
* field-path metadata for Syncore’s data model.
|
|
7
|
+
*
|
|
8
|
+
* Every type in the `s.*` builder namespace produces a `Validator`. You attach
|
|
9
|
+
* validators to table definitions via {@link defineTable} and to function
|
|
10
|
+
* arguments via the `args` field of {@link query}, {@link mutation}, and
|
|
11
|
+
* {@link action}.
|
|
12
|
+
*
|
|
13
|
+
* ```ts
|
|
14
|
+
* const titleValidator = s.string(); // Validator<string>
|
|
15
|
+
* const tagsValidator = s.array(s.string()); // Validator<string[]>
|
|
16
|
+
* ```
|
|
17
|
+
*
|
|
18
|
+
* Validators carry three type parameters:
|
|
19
|
+
* - `TValue` — the TypeScript type after parsing (used in application code).
|
|
20
|
+
* - `TStorage` — the serialised representation stored in SQLite (may differ
|
|
21
|
+
* for codec validators).
|
|
22
|
+
* - `TFieldPaths` — dotted paths to nested fields, used by the query builder
|
|
23
|
+
* for type-safe index and search-index references.
|
|
7
24
|
*/
|
|
8
25
|
interface Validator<TValue = unknown, TStorage = TValue, TFieldPaths extends string = never> {
|
|
9
26
|
readonly kind: ValidatorKind;
|
|
@@ -176,23 +193,161 @@ declare class CodecValidator<TValue, TStored, TStorageFieldValidator extends Val
|
|
|
176
193
|
describe(): ValidatorDescription;
|
|
177
194
|
}
|
|
178
195
|
/**
|
|
179
|
-
*
|
|
196
|
+
* Describes every method available on the `s` schema builder.
|
|
197
|
+
*
|
|
198
|
+
* You interact with this through the singleton {@link s} object rather than
|
|
199
|
+
* implementing this interface yourself.
|
|
180
200
|
*/
|
|
181
201
|
interface ValidatorBuilderApi {
|
|
202
|
+
/**
|
|
203
|
+
* Validates that the value is a `string`.
|
|
204
|
+
*
|
|
205
|
+
* ```ts
|
|
206
|
+
* const v = s.string(); // Validator<string>
|
|
207
|
+
* ```
|
|
208
|
+
*/
|
|
182
209
|
string(): StringValidator;
|
|
210
|
+
/**
|
|
211
|
+
* Validates that the value is a finite `number` (rejects `NaN`).
|
|
212
|
+
*
|
|
213
|
+
* ```ts
|
|
214
|
+
* const v = s.number(); // Validator<number>
|
|
215
|
+
* ```
|
|
216
|
+
*/
|
|
183
217
|
number(): NumberValidator;
|
|
218
|
+
/**
|
|
219
|
+
* Validates that the value is a `boolean`.
|
|
220
|
+
*
|
|
221
|
+
* ```ts
|
|
222
|
+
* const v = s.boolean(); // Validator<boolean>
|
|
223
|
+
* ```
|
|
224
|
+
*/
|
|
184
225
|
boolean(): BooleanValidator;
|
|
226
|
+
/**
|
|
227
|
+
* Validates that the value is exactly `null`.
|
|
228
|
+
*
|
|
229
|
+
* Usually combined with `s.union` — or use the convenience `s.nullable`
|
|
230
|
+
* helper instead.
|
|
231
|
+
*/
|
|
185
232
|
null(): NullValidator;
|
|
233
|
+
/**
|
|
234
|
+
* Accepts any value without validation.
|
|
235
|
+
*
|
|
236
|
+
* Use sparingly. Prefer typed validators wherever possible to preserve
|
|
237
|
+
* type safety and devtools introspection.
|
|
238
|
+
*/
|
|
186
239
|
any(): AnyValidator;
|
|
240
|
+
/**
|
|
241
|
+
* Validates that the value is exactly equal to `literalValue`.
|
|
242
|
+
*
|
|
243
|
+
* ```ts
|
|
244
|
+
* const v = s.literal("active"); // Validator<"active">
|
|
245
|
+
* ```
|
|
246
|
+
*/
|
|
187
247
|
literal<TValue extends string | number | boolean | null>(literalValue: TValue): LiteralValidator<TValue>;
|
|
248
|
+
/**
|
|
249
|
+
* Validates that the value is one of the provided string literals.
|
|
250
|
+
*
|
|
251
|
+
* Prefer this over `s.union(s.literal(…), …)` for string-enum fields
|
|
252
|
+
* because it generates a cleaner schema description.
|
|
253
|
+
*
|
|
254
|
+
* ```ts
|
|
255
|
+
* const v = s.enum(["todo", "in-progress", "done"] as const);
|
|
256
|
+
* // Validator<"todo" | "in-progress" | "done">
|
|
257
|
+
* ```
|
|
258
|
+
*/
|
|
188
259
|
enum<TValues extends readonly [string, ...string[]]>(values: TValues): EnumValidator<TValues>;
|
|
260
|
+
/**
|
|
261
|
+
* Validates that the value is an array where every item passes
|
|
262
|
+
* `itemValidator`.
|
|
263
|
+
*
|
|
264
|
+
* ```ts
|
|
265
|
+
* const v = s.array(s.string()); // Validator<string[]>
|
|
266
|
+
* ```
|
|
267
|
+
*/
|
|
189
268
|
array<TItem, TItemStorage, TValidator extends Validator<TItem, TItemStorage, string>>(itemValidator: TValidator): ArrayValidator<TItem, TItemStorage, TValidator>;
|
|
269
|
+
/**
|
|
270
|
+
* Validates that the value is a plain object matching `shape`.
|
|
271
|
+
*
|
|
272
|
+
* Keys whose validators are `s.optional(...)` become optional properties in
|
|
273
|
+
* the inferred type.
|
|
274
|
+
*
|
|
275
|
+
* ```ts
|
|
276
|
+
* const v = s.object({ x: s.number(), y: s.number() });
|
|
277
|
+
* // Validator<{ x: number; y: number }>
|
|
278
|
+
* ```
|
|
279
|
+
*/
|
|
190
280
|
object<TShape extends ObjectValidatorShape>(shape: TShape): ObjectValidator<TShape>;
|
|
281
|
+
/**
|
|
282
|
+
* Validates that the value is a non-empty string that represents a document
|
|
283
|
+
* `_id` in `tableName`.
|
|
284
|
+
*
|
|
285
|
+
* Using `s.id` instead of `s.string` for foreign-key fields enables devtools
|
|
286
|
+
* to show relationships between tables.
|
|
287
|
+
*
|
|
288
|
+
* ```ts
|
|
289
|
+
* const v = s.id("projects"); // Validator<string> (typed as a projects ID)
|
|
290
|
+
* ```
|
|
291
|
+
*/
|
|
191
292
|
id<TTableName extends string>(tableName: TTableName): IdValidator<TTableName>;
|
|
293
|
+
/**
|
|
294
|
+
* Makes a field optional (the value can be `undefined` / absent).
|
|
295
|
+
*
|
|
296
|
+
* Only use inside `s.object()` shapes or as a top-level table field. Nesting
|
|
297
|
+
* `s.optional` inside a non-object validator has no practical effect.
|
|
298
|
+
*
|
|
299
|
+
* ```ts
|
|
300
|
+
* const v = s.object({ name: s.string(), bio: s.optional(s.string()) });
|
|
301
|
+
* // Validator<{ name: string; bio?: string }>
|
|
302
|
+
* ```
|
|
303
|
+
*/
|
|
192
304
|
optional<TValue, TStorage, TFieldPaths extends string>(inner: Validator<TValue, TStorage, TFieldPaths>): OptionalValidator<TValue, TStorage, TFieldPaths>;
|
|
305
|
+
/**
|
|
306
|
+
* Validates that the value is a `Record<TKey, TValue>` (an object with
|
|
307
|
+
* dynamic keys of a specific type).
|
|
308
|
+
*
|
|
309
|
+
* ```ts
|
|
310
|
+
* const v = s.record(s.string(), s.number()); // Validator<Record<string, number>>
|
|
311
|
+
* ```
|
|
312
|
+
*/
|
|
193
313
|
record<TKey extends string, TValue, TStorage, TKeyValidator extends Validator<TKey, string, string>, TValueValidator extends Validator<TValue, TStorage, string>>(keyValidator: TKeyValidator, valueValidator: TValueValidator): RecordValidator<TKey, TValue, TStorage, TKeyValidator, TValueValidator>;
|
|
314
|
+
/**
|
|
315
|
+
* Validates that the value matches **one** of the provided validators
|
|
316
|
+
* (discriminated union).
|
|
317
|
+
*
|
|
318
|
+
* Validators are tried in order; the first one that parses without throwing
|
|
319
|
+
* wins.
|
|
320
|
+
*
|
|
321
|
+
* ```ts
|
|
322
|
+
* const v = s.union(s.string(), s.number()); // Validator<string | number>
|
|
323
|
+
* ```
|
|
324
|
+
*/
|
|
194
325
|
union<TMembers extends readonly Validator<unknown, unknown, string>[]>(...members: TMembers): UnionValidator<TMembers>;
|
|
326
|
+
/**
|
|
327
|
+
* Convenience wrapper for `s.union(inner, s.null())` that types the field
|
|
328
|
+
* as `TValue | null`.
|
|
329
|
+
*
|
|
330
|
+
* ```ts
|
|
331
|
+
* const v = s.nullable(s.id("projects")); // Validator<string | null>
|
|
332
|
+
* ```
|
|
333
|
+
*/
|
|
195
334
|
nullable<TValue, TStorage, TFieldPaths extends string>(inner: Validator<TValue, TStorage, TFieldPaths>): UnionValidator<readonly [Validator<TValue, TStorage, TFieldPaths>, NullValidator]>;
|
|
335
|
+
/**
|
|
336
|
+
* Creates a custom codec that stores a field as one type but exposes it as
|
|
337
|
+
* another.
|
|
338
|
+
*
|
|
339
|
+
* Useful for types that are not natively serialisable to JSON (e.g. `Date`,
|
|
340
|
+
* `Map`, binary IDs). The codec’s `serialize` / `deserialize` functions
|
|
341
|
+
* convert between the runtime value and the stored representation.
|
|
342
|
+
*
|
|
343
|
+
* ```ts
|
|
344
|
+
* const dateValidator = s.codec(s.string(), {
|
|
345
|
+
* storage: s.number(),
|
|
346
|
+
* serialize: (date: string) => new Date(date).getTime(),
|
|
347
|
+
* deserialize: (ts: number) => new Date(ts).toISOString(),
|
|
348
|
+
* });
|
|
349
|
+
* ```
|
|
350
|
+
*/
|
|
196
351
|
codec<TValue, TStored, TStorageFieldValidator extends Validator<TStored, unknown, string>, TValueFieldValidator extends Validator<TValue, unknown, string>>(valueValidator: TValueFieldValidator, config: {
|
|
197
352
|
storage: TStorageFieldValidator;
|
|
198
353
|
serialize(value: TValue): TStored;
|
|
@@ -200,7 +355,28 @@ interface ValidatorBuilderApi {
|
|
|
200
355
|
}): CodecValidator<TValue, TStored, TStorageFieldValidator, TValueFieldValidator>;
|
|
201
356
|
}
|
|
202
357
|
/**
|
|
203
|
-
* Primary schema builder
|
|
358
|
+
* Primary schema builder for Syncore’s data-model DSL.
|
|
359
|
+
*
|
|
360
|
+
* `s` is a namespace of factory functions for creating typed field validators.
|
|
361
|
+
* Use it when defining table schemas with {@link defineTable} and when
|
|
362
|
+
* declaring function argument shapes with {@link query}, {@link mutation}, or
|
|
363
|
+
* {@link action}.
|
|
364
|
+
*
|
|
365
|
+
* ```ts
|
|
366
|
+
* import { defineTable, defineSchema, s } from "syncorejs";
|
|
367
|
+
*
|
|
368
|
+
* export default defineSchema({
|
|
369
|
+
* tasks: defineTable({
|
|
370
|
+
* title: s.string(),
|
|
371
|
+
* status: s.enum(["todo", "done"] as const),
|
|
372
|
+
* projectId: s.nullable(s.id("projects")),
|
|
373
|
+
* tags: s.optional(s.array(s.string())),
|
|
374
|
+
* metadata: s.optional(s.object({ priority: s.number() })),
|
|
375
|
+
* })
|
|
376
|
+
* .index("by_status", ["status"])
|
|
377
|
+
* .searchIndex("search_title", { searchField: "title", filterFields: ["status"] }),
|
|
378
|
+
* });
|
|
379
|
+
* ```
|
|
204
380
|
*/
|
|
205
381
|
declare const s: ValidatorBuilderApi;
|
|
206
382
|
declare function isValidator(value: Validator<unknown, unknown, string> | ValidatorMap): value is Validator<unknown, unknown, string>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validators.d.ts","names":[],"sources":["../src/validators.ts"],"mappings":";KAAK,MAAA,uBAA6B,CAAA,GAAI,CAAA,CAAE,IAAA;AAAA,KAE5B,aAAA
|
|
1
|
+
{"version":3,"file":"validators.d.ts","names":[],"sources":["../src/validators.ts"],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
//#region src/validators.ts
|
|
2
2
|
var BaseValidator = class {
|
|
3
|
+
kind;
|
|
3
4
|
constructor(kind) {
|
|
4
5
|
this.kind = kind;
|
|
5
6
|
}
|
|
@@ -70,6 +71,7 @@ var AnyValidator = class extends BaseValidator {
|
|
|
70
71
|
}
|
|
71
72
|
};
|
|
72
73
|
var LiteralValidator = class extends BaseValidator {
|
|
74
|
+
literalValue;
|
|
73
75
|
constructor(literalValue) {
|
|
74
76
|
super("literal");
|
|
75
77
|
this.literalValue = literalValue;
|
|
@@ -86,6 +88,7 @@ var LiteralValidator = class extends BaseValidator {
|
|
|
86
88
|
}
|
|
87
89
|
};
|
|
88
90
|
var EnumValidator = class extends BaseValidator {
|
|
91
|
+
values;
|
|
89
92
|
constructor(values) {
|
|
90
93
|
super("enum");
|
|
91
94
|
this.values = values;
|
|
@@ -102,6 +105,7 @@ var EnumValidator = class extends BaseValidator {
|
|
|
102
105
|
}
|
|
103
106
|
};
|
|
104
107
|
var ArrayValidator = class extends BaseValidator {
|
|
108
|
+
itemValidator;
|
|
105
109
|
constructor(itemValidator) {
|
|
106
110
|
super("array");
|
|
107
111
|
this.itemValidator = itemValidator;
|
|
@@ -125,6 +129,7 @@ var ArrayValidator = class extends BaseValidator {
|
|
|
125
129
|
}
|
|
126
130
|
};
|
|
127
131
|
var ObjectValidator = class extends BaseValidator {
|
|
132
|
+
shape;
|
|
128
133
|
constructor(shape) {
|
|
129
134
|
super("object");
|
|
130
135
|
this.shape = shape;
|
|
@@ -169,6 +174,7 @@ var ObjectValidator = class extends BaseValidator {
|
|
|
169
174
|
}
|
|
170
175
|
};
|
|
171
176
|
var IdValidator = class extends BaseValidator {
|
|
177
|
+
tableName;
|
|
172
178
|
constructor(tableName) {
|
|
173
179
|
super("id");
|
|
174
180
|
this.tableName = tableName;
|
|
@@ -185,6 +191,7 @@ var IdValidator = class extends BaseValidator {
|
|
|
185
191
|
}
|
|
186
192
|
};
|
|
187
193
|
var OptionalValidator = class extends BaseValidator {
|
|
194
|
+
inner;
|
|
188
195
|
constructor(inner) {
|
|
189
196
|
super("optional");
|
|
190
197
|
this.inner = inner;
|
|
@@ -209,6 +216,8 @@ var OptionalValidator = class extends BaseValidator {
|
|
|
209
216
|
}
|
|
210
217
|
};
|
|
211
218
|
var RecordValidator = class extends BaseValidator {
|
|
219
|
+
keyValidator;
|
|
220
|
+
valueValidator;
|
|
212
221
|
constructor(keyValidator, valueValidator) {
|
|
213
222
|
super("record");
|
|
214
223
|
this.keyValidator = keyValidator;
|
|
@@ -249,6 +258,7 @@ var RecordValidator = class extends BaseValidator {
|
|
|
249
258
|
}
|
|
250
259
|
};
|
|
251
260
|
var UnionValidator = class extends BaseValidator {
|
|
261
|
+
members;
|
|
252
262
|
constructor(members) {
|
|
253
263
|
super("union");
|
|
254
264
|
this.members = members;
|
|
@@ -285,6 +295,9 @@ var UnionValidator = class extends BaseValidator {
|
|
|
285
295
|
}
|
|
286
296
|
};
|
|
287
297
|
var CodecValidator = class extends BaseValidator {
|
|
298
|
+
valueValidator;
|
|
299
|
+
storageValidator;
|
|
300
|
+
codec;
|
|
288
301
|
constructor(valueValidator, storageValidator, codec) {
|
|
289
302
|
super("codec");
|
|
290
303
|
this.valueValidator = valueValidator;
|
|
@@ -312,7 +325,28 @@ var CodecValidator = class extends BaseValidator {
|
|
|
312
325
|
}
|
|
313
326
|
};
|
|
314
327
|
/**
|
|
315
|
-
* Primary schema builder
|
|
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}.
|
|
334
|
+
*
|
|
335
|
+
* ```ts
|
|
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"] }),
|
|
348
|
+
* });
|
|
349
|
+
* ```
|
|
316
350
|
*/
|
|
317
351
|
const s = {
|
|
318
352
|
string: () => new StringValidator(),
|
|
@@ -1 +1 @@
|
|
|
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, serialization, and\n * field-path metadata for Syncore's data model.\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 as TValues[number];\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 as Record<TKey, TValue>;\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 as Record<TKey, TStorage>;\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 as Record<TKey, TValue>;\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 // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\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 * Public builder namespace for declaring Syncore schema fields and codecs.\n */\nexport interface ValidatorBuilderApi {\n string(): StringValidator;\n number(): NumberValidator;\n boolean(): BooleanValidator;\n null(): NullValidator;\n any(): AnyValidator;\n literal<TValue extends string | number | boolean | null>(\n literalValue: TValue\n ): LiteralValidator<TValue>;\n enum<TValues extends readonly [string, ...string[]]>(\n values: TValues\n ): EnumValidator<TValues>;\n array<\n TItem,\n TItemStorage,\n TValidator extends Validator<TItem, TItemStorage, string>\n >(itemValidator: TValidator): ArrayValidator<TItem, TItemStorage, TValidator>;\n object<TShape extends ObjectValidatorShape>(\n shape: TShape\n ): ObjectValidator<TShape>;\n id<TTableName extends string>(tableName: TTableName): IdValidator<TTableName>;\n optional<TValue, TStorage, TFieldPaths extends string>(\n inner: Validator<TValue, TStorage, TFieldPaths>\n ): OptionalValidator<TValue, TStorage, TFieldPaths>;\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 union<\n TMembers extends readonly Validator<unknown, unknown, string>[]\n >(...members: TMembers): UnionValidator<TMembers>;\n nullable<TValue, TStorage, TFieldPaths extends string>(\n inner: Validator<TValue, TStorage, TFieldPaths>\n ): UnionValidator<\n readonly [Validator<TValue, TStorage, TFieldPaths>, NullValidator]\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 namespace for Syncore's data-model DSL.\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 // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\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 // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\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 // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\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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"}
|
|
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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"}
|