@voidhash/mimic 1.0.0-beta.16 → 1.0.0-beta.18

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 (95) hide show
  1. package/dist/EffectSchema.cjs +3 -3
  2. package/dist/EffectSchema.d.cts +5 -5
  3. package/dist/EffectSchema.d.cts.map +1 -1
  4. package/dist/EffectSchema.d.mts +5 -5
  5. package/dist/EffectSchema.d.mts.map +1 -1
  6. package/dist/EffectSchema.mjs +3 -3
  7. package/dist/EffectSchema.mjs.map +1 -1
  8. package/dist/FractionalIndex.mjs.map +1 -1
  9. package/dist/Operation.d.cts +4 -4
  10. package/dist/Operation.d.cts.map +1 -1
  11. package/dist/Operation.d.mts +4 -4
  12. package/dist/Operation.d.mts.map +1 -1
  13. package/dist/Operation.mjs.map +1 -1
  14. package/dist/OperationDefinition.d.cts +2 -2
  15. package/dist/OperationDefinition.d.cts.map +1 -1
  16. package/dist/OperationDefinition.d.mts +2 -2
  17. package/dist/OperationDefinition.d.mts.map +1 -1
  18. package/dist/OperationDefinition.mjs.map +1 -1
  19. package/dist/Presence.mjs.map +1 -1
  20. package/dist/SchemaJSON.cjs +305 -0
  21. package/dist/SchemaJSON.d.cts +11 -0
  22. package/dist/SchemaJSON.d.cts.map +1 -0
  23. package/dist/SchemaJSON.d.mts +11 -0
  24. package/dist/SchemaJSON.d.mts.map +1 -0
  25. package/dist/SchemaJSON.mjs +301 -0
  26. package/dist/SchemaJSON.mjs.map +1 -0
  27. package/dist/index.cjs +7 -0
  28. package/dist/index.d.cts +2 -1
  29. package/dist/index.d.mts +2 -1
  30. package/dist/index.mjs +2 -1
  31. package/dist/primitives/Array.cjs +12 -2
  32. package/dist/primitives/Array.d.cts.map +1 -1
  33. package/dist/primitives/Array.d.mts.map +1 -1
  34. package/dist/primitives/Array.mjs +12 -2
  35. package/dist/primitives/Array.mjs.map +1 -1
  36. package/dist/primitives/Boolean.mjs.map +1 -1
  37. package/dist/primitives/Either.mjs.map +1 -1
  38. package/dist/primitives/Literal.mjs.map +1 -1
  39. package/dist/primitives/Number.cjs +27 -5
  40. package/dist/primitives/Number.d.cts.map +1 -1
  41. package/dist/primitives/Number.d.mts.map +1 -1
  42. package/dist/primitives/Number.mjs +27 -5
  43. package/dist/primitives/Number.mjs.map +1 -1
  44. package/dist/primitives/String.cjs +44 -13
  45. package/dist/primitives/String.d.cts.map +1 -1
  46. package/dist/primitives/String.d.mts.map +1 -1
  47. package/dist/primitives/String.mjs +44 -13
  48. package/dist/primitives/String.mjs.map +1 -1
  49. package/dist/primitives/Union.mjs.map +1 -1
  50. package/dist/primitives/shared.d.cts +2 -0
  51. package/dist/primitives/shared.d.cts.map +1 -1
  52. package/dist/primitives/shared.d.mts +2 -0
  53. package/dist/primitives/shared.d.mts.map +1 -1
  54. package/dist/primitives/shared.mjs.map +1 -1
  55. package/package.json +15 -8
  56. package/src/EffectSchema.ts +3 -3
  57. package/src/FractionalIndex.ts +18 -18
  58. package/src/Operation.ts +5 -5
  59. package/src/OperationDefinition.ts +2 -2
  60. package/src/Presence.ts +3 -3
  61. package/src/SchemaJSON.ts +396 -0
  62. package/src/index.ts +1 -0
  63. package/src/primitives/Array.ts +18 -8
  64. package/src/primitives/Boolean.ts +2 -2
  65. package/src/primitives/Either.ts +2 -2
  66. package/src/primitives/Literal.ts +2 -2
  67. package/src/primitives/Number.ts +44 -22
  68. package/src/primitives/String.ts +61 -34
  69. package/src/primitives/Union.ts +1 -1
  70. package/src/primitives/shared.ts +2 -0
  71. package/.turbo/turbo-build.log +0 -270
  72. package/tests/Document.test.ts +0 -557
  73. package/tests/EffectSchema.test.ts +0 -546
  74. package/tests/FractionalIndex.test.ts +0 -377
  75. package/tests/OperationPath.test.ts +0 -151
  76. package/tests/Presence.test.ts +0 -321
  77. package/tests/Primitive.test.ts +0 -381
  78. package/tests/client/ClientDocument.test.ts +0 -1981
  79. package/tests/client/WebSocketTransport.test.ts +0 -1217
  80. package/tests/primitives/Array.test.ts +0 -526
  81. package/tests/primitives/Boolean.test.ts +0 -126
  82. package/tests/primitives/Either.test.ts +0 -707
  83. package/tests/primitives/Lazy.test.ts +0 -143
  84. package/tests/primitives/Literal.test.ts +0 -122
  85. package/tests/primitives/Number.test.ts +0 -133
  86. package/tests/primitives/String.test.ts +0 -128
  87. package/tests/primitives/Struct.test.ts +0 -1154
  88. package/tests/primitives/Tree.test.ts +0 -1139
  89. package/tests/primitives/TreeNode.test.ts +0 -50
  90. package/tests/primitives/Union.test.ts +0 -554
  91. package/tests/server/ServerDocument.test.ts +0 -903
  92. package/tsconfig.build.json +0 -24
  93. package/tsconfig.json +0 -8
  94. package/tsdown.config.ts +0 -18
  95. package/vitest.mts +0 -11
@@ -1 +1 @@
1
- {"version":3,"file":"OperationDefinition.d.mts","names":[],"sources":["../src/OperationDefinition.ts"],"sourcesContent":[],"mappings":";;;;;;KAEK,aAAa,UAAU,yBAAyB,MAAM,6BAA6B,IAAI,EAAE;UAE7E,4CAA4C,MAAA,CAAO,MAAA,CAAO,qBAAqB,MAAA,CAAO,MAAA,CAAO;iBAC3F;oBACG;mBACD;EALhB,SAAA,YAAO,CAAA,EAAA,OAAA;;AAAgB,cASf,IATe,EAAA,CAAA,KAAA,EAAA,iBASiB,MAAA,CAAO,MAAA,CAAO,GAT/B,EAAA,gBASoD,MAAA,CAAO,MAAA,CAAO,GATlE,CAAA,CAAA,OAAA,EAAA;EAA+B,SAAA,IAAA,EAUxC,KAVwC;EAAN,SAAA,OAAA,EAW/B,QAX+B;EAAmC,SAAA,MAAA,EAYnE,OAZmE;EAAI,SAAA,KAAA,EAAA,CAAA,OAAA,EAa9D,MAAA,CAAO,MAAA,CAAO,IAbgD,CAa3C,QAb2C,CAAA,EAAA,MAAA,EAaxB,OAbwB,CAahB,MAAA,CAAO,MAAA,CAAO,IAbE,CAaG,OAbH,CAAA,CAAA,EAAA,GAAA,IAAA;EAAE,SAAA,YAAA,CAAA,EAAA,OAAA;CAAC,EAAA,GAAA;EAE9E,SAAA,YAAA,CAAmB,EAAA,OAAA,GAAA,SAAA;EAAyB,SAAO,IAAO,OAAA;EAAqB,SAAO,OAAO,UAAA;EAC3F,SAAA,MAAA,SAAA;EACG,SAAA,KAAA,EAAA,CAAA,OAAA,EASQ,MAAA,CAAO,MAAA,CAAO,IATtB,CAS2B,QAT3B,CAAA,EAAA,MAAA,EAS8C,OAT9C,CASsD,MAAA,CAAO,MAAA,CAAO,IATpE,CASyE,OATzE,CAAA,CAAA,EAAA,GAAA,IAAA;CACD"}
1
+ {"version":3,"file":"OperationDefinition.d.mts","names":[],"sources":["../src/OperationDefinition.ts"],"sourcesContent":[],"mappings":";;;;;;KAEK,aAAa,UAAU,yBAAyB,MAAM,6BAA6B,IAAI,EAAE;UAE7E,4CAA4C,MAAA,CAAO,qBAAqB,MAAA,CAAO;iBAC7E;oBACG;mBACD;EALhB,SAAA,YAAO,CAAA,EAAA,OAAA;;AAAgB,cASf,IATe,EAAA,CAAA,KAAA,EAAA,iBASiB,MAAA,CAAO,GATxB,EAAA,gBAS6C,MAAA,CAAO,GATpD,CAAA,CAAA,OAAA,EAAA;EAA+B,SAAA,IAAA,EAUxC,KAVwC;EAAN,SAAA,OAAA,EAW/B,QAX+B;EAAmC,SAAA,MAAA,EAYnE,OAZmE;EAAI,SAAA,KAAA,EAAA,CAAA,OAAA,EAa9D,MAAA,CAAO,MAAA,CAAO,IAbgD,CAa3C,QAb2C,CAAA,EAAA,MAAA,EAaxB,OAbwB,CAahB,MAAA,CAAO,MAAA,CAAO,IAbE,CAaG,OAbH,CAAA,CAAA,EAAA,GAAA,IAAA;EAAE,SAAA,YAAA,CAAA,EAAA,OAAA;CAAC,EAAA,GAAA;EAE9E,SAAA,YAAA,CAAmB,EAAA,OAAA,GAAA,SAAA;EAAyB,SAAO,IAAA,OAAA;EAAqB,SAAO,OAAA,UAAA;EAC7E,SAAA,MAAA,SAAA;EACG,SAAA,KAAA,EAAA,CAAA,OAAA,EASQ,MAAA,CAAO,MAAA,CAAO,IATtB,CAS2B,QAT3B,CAAA,EAAA,MAAA,EAS8C,OAT9C,CASsD,MAAA,CAAO,MAAA,CAAO,IATpE,CASyE,OATzE,CAAA,CAAA,EAAA,GAAA,IAAA;CACD"}
@@ -1 +1 @@
1
- {"version":3,"file":"OperationDefinition.mjs","names":[],"sources":["../src/OperationDefinition.ts"],"sourcesContent":["import { Schema } from \"effect\";\n\ntype Mutable<T> = T extends ReadonlyArray<infer U> ? Array<U> : { -readonly [K in keyof T]: T[K] };\n\nexport interface OperationDefinition<TKind, TPayload extends Schema.Schema.Any, TTarget extends Schema.Schema.Any> {\n readonly kind: TKind\n readonly payload: TPayload\n readonly target: TTarget\n readonly deduplicable?: boolean\n}\n\nexport const make = <TKind, TPayload extends Schema.Schema.Any, TTarget extends Schema.Schema.Any>(options: {\n readonly kind: TKind\n readonly payload: TPayload\n readonly target: TTarget\n readonly apply: (payload: Schema.Schema.Type<TPayload>, target: Mutable<Schema.Schema.Type<TTarget>>) => void\n readonly deduplicable?: boolean\n}) => {\n return {\n kind: options.kind,\n payload: options.payload,\n target: options.target,\n apply: options.apply,\n ...(options.deduplicable !== undefined ? { deduplicable: options.deduplicable } : {}),\n } as const;\n}"],"mappings":";;;;;AAWA,MAAa,QAAsF,YAM7F;AACF;EACI,MAAM,QAAQ;EACd,SAAS,QAAQ;EACjB,QAAQ,QAAQ;EAChB,OAAO,QAAQ;IACX,QAAQ,iBAAiB,SAAY,EAAE,cAAc,QAAQ,cAAc,GAAG,EAAE"}
1
+ {"version":3,"file":"OperationDefinition.mjs","names":[],"sources":["../src/OperationDefinition.ts"],"sourcesContent":["import { Schema } from \"effect\";\n\ntype Mutable<T> = T extends ReadonlyArray<infer U> ? Array<U> : { -readonly [K in keyof T]: T[K] };\n\nexport interface OperationDefinition<TKind, TPayload extends Schema.Top, TTarget extends Schema.Top> {\n readonly kind: TKind\n readonly payload: TPayload\n readonly target: TTarget\n readonly deduplicable?: boolean\n}\n\nexport const make = <TKind, TPayload extends Schema.Top, TTarget extends Schema.Top>(options: {\n readonly kind: TKind\n readonly payload: TPayload\n readonly target: TTarget\n readonly apply: (payload: Schema.Schema.Type<TPayload>, target: Mutable<Schema.Schema.Type<TTarget>>) => void\n readonly deduplicable?: boolean\n}) => {\n return {\n kind: options.kind,\n payload: options.payload,\n target: options.target,\n apply: options.apply,\n ...(options.deduplicable !== undefined ? { deduplicable: options.deduplicable } : {}),\n } as const;\n}"],"mappings":";;;;;AAWA,MAAa,QAAwE,YAM/E;AACF;EACI,MAAM,QAAQ;EACd,SAAS,QAAQ;EACjB,QAAQ,QAAQ;EAChB,OAAO,QAAQ;IACX,QAAQ,iBAAiB,SAAY,EAAE,cAAc,QAAQ,cAAc,GAAG,EAAE"}
@@ -1 +1 @@
1
- {"version":3,"file":"Presence.mjs","names":[],"sources":["../src/Presence.ts"],"sourcesContent":["/**\n * @since 0.0.1\n * Presence module for ephemeral per-connection state.\n * Used by both client and server for schema validation.\n */\nimport * as Schema from \"effect/Schema\";\n\n// =============================================================================\n// Presence Types\n// =============================================================================\n\n/**\n * A Presence schema wrapper that holds an Effect Schema for validation.\n * This is used by both client and server to validate presence data.\n */\nexport interface Presence<TData> {\n readonly _tag: \"Presence\";\n /** The Effect Schema used for validation */\n readonly schema: Schema.Schema<TData>;\n /** Branded type marker for inference */\n readonly _Data: TData;\n}\n\n/**\n * Options for creating a Presence instance.\n */\nexport interface PresenceOptions<TData> {\n /** The Effect Schema defining the presence data structure */\n readonly schema: Schema.Schema<TData>;\n}\n\n/**\n * Infer the data type from a Presence instance.\n */\nexport type Infer<P extends Presence<any>> = P[\"_Data\"];\n\n/**\n * Any Presence type (for generic constraints).\n */\nexport type AnyPresence = Presence<any>;\n\n// =============================================================================\n// Presence Entry (for storage/transport)\n// =============================================================================\n\n/**\n * A presence entry as stored/transmitted.\n */\nexport interface PresenceEntry<TData = unknown> {\n /** The presence data */\n readonly data: TData;\n /** Optional user ID from authentication */\n readonly userId?: string;\n}\n\n// =============================================================================\n// Factory Function\n// =============================================================================\n\n/**\n * Creates a new Presence schema wrapper.\n *\n * @example\n * ```typescript\n * import { Presence } from \"@voidhash/mimic\";\n * import { Schema } from \"effect\";\n *\n * const CursorPresence = Presence.make({\n * schema: Schema.Struct({\n * name: Schema.String,\n * cursor: Schema.Struct({\n * x: Schema.Number,\n * y: Schema.Number,\n * }),\n * }),\n * });\n * ```\n */\nexport const make = <TData,>(options: PresenceOptions<TData>): Presence<TData> => ({\n _tag: \"Presence\",\n schema: options.schema,\n _Data: undefined as unknown as TData,\n});\n\n// =============================================================================\n// Validation Functions\n// =============================================================================\n\n/**\n * Validates unknown data against a Presence schema.\n * Throws a ParseError if validation fails.\n *\n * @param presence - The Presence instance with the schema\n * @param data - Unknown data to validate\n * @returns The validated and typed data\n * @throws ParseError if validation fails\n */\nexport const validate = <TData,>(\n presence: Presence<TData>,\n data: unknown\n): TData => {\n return Schema.decodeUnknownSync(presence.schema)(data);\n};\n\n/**\n * Safely validates unknown data against a Presence schema.\n * Returns undefined if validation fails instead of throwing.\n *\n * @param presence - The Presence instance with the schema\n * @param data - Unknown data to validate\n * @returns The validated data or undefined if invalid\n */\nexport const validateSafe = <TData,>(\n presence: Presence<TData>,\n data: unknown\n): TData | undefined => {\n try {\n return Schema.decodeUnknownSync(presence.schema)(data);\n } catch {\n return undefined;\n }\n};\n\n/**\n * Checks if unknown data is valid according to a Presence schema.\n *\n * @param presence - The Presence instance with the schema\n * @param data - Unknown data to check\n * @returns true if valid, false otherwise\n */\nexport const isValid = <TData,>(\n presence: Presence<TData>,\n data: unknown\n): data is TData => {\n try {\n Schema.decodeUnknownSync(presence.schema)(data);\n return true;\n } catch {\n return false;\n }\n};\n\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8EA,MAAa,QAAgB,aAAsD;CACjF,MAAM;CACN,QAAQ,QAAQ;CAChB,OAAO;CACR;;;;;;;;;;AAeD,MAAa,YACX,UACA,SACU;AACV,QAAO,OAAO,kBAAkB,SAAS,OAAO,CAAC,KAAK;;;;;;;;;;AAWxD,MAAa,gBACX,UACA,SACsB;AACtB,KAAI;AACF,SAAO,OAAO,kBAAkB,SAAS,OAAO,CAAC,KAAK;mBAChD;AACN;;;;;;;;;;AAWJ,MAAa,WACX,UACA,SACkB;AAClB,KAAI;AACF,SAAO,kBAAkB,SAAS,OAAO,CAAC,KAAK;AAC/C,SAAO;oBACD;AACN,SAAO"}
1
+ {"version":3,"file":"Presence.mjs","names":[],"sources":["../src/Presence.ts"],"sourcesContent":["/**\n * @since 0.0.1\n * Presence module for ephemeral per-connection state.\n * Used by both client and server for schema validation.\n */\nimport * as Schema from \"effect/Schema\";\n\n// =============================================================================\n// Presence Types\n// =============================================================================\n\n/**\n * A Presence schema wrapper that holds an Effect Schema for validation.\n * This is used by both client and server to validate presence data.\n */\nexport interface Presence<TData> {\n readonly _tag: \"Presence\";\n /** The Effect Schema used for validation */\n readonly schema: Schema.Schema<TData>;\n /** Branded type marker for inference */\n readonly _Data: TData;\n}\n\n/**\n * Options for creating a Presence instance.\n */\nexport interface PresenceOptions<TData> {\n /** The Effect Schema defining the presence data structure */\n readonly schema: Schema.Schema<TData>;\n}\n\n/**\n * Infer the data type from a Presence instance.\n */\nexport type Infer<P extends Presence<any>> = P[\"_Data\"];\n\n/**\n * Any Presence type (for generic constraints).\n */\nexport type AnyPresence = Presence<any>;\n\n// =============================================================================\n// Presence Entry (for storage/transport)\n// =============================================================================\n\n/**\n * A presence entry as stored/transmitted.\n */\nexport interface PresenceEntry<TData = unknown> {\n /** The presence data */\n readonly data: TData;\n /** Optional user ID from authentication */\n readonly userId?: string;\n}\n\n// =============================================================================\n// Factory Function\n// =============================================================================\n\n/**\n * Creates a new Presence schema wrapper.\n *\n * @example\n * ```typescript\n * import { Presence } from \"@voidhash/mimic\";\n * import { Schema } from \"effect\";\n *\n * const CursorPresence = Presence.make({\n * schema: Schema.Struct({\n * name: Schema.String,\n * cursor: Schema.Struct({\n * x: Schema.Number,\n * y: Schema.Number,\n * }),\n * }),\n * });\n * ```\n */\nexport const make = <TData,>(options: PresenceOptions<TData>): Presence<TData> => ({\n _tag: \"Presence\",\n schema: options.schema,\n _Data: undefined as unknown as TData,\n});\n\n// =============================================================================\n// Validation Functions\n// =============================================================================\n\n/**\n * Validates unknown data against a Presence schema.\n * Throws a ParseError if validation fails.\n *\n * @param presence - The Presence instance with the schema\n * @param data - Unknown data to validate\n * @returns The validated and typed data\n * @throws ParseError if validation fails\n */\nexport const validate = <TData,>(\n presence: Presence<TData>,\n data: unknown\n): TData => {\n return Schema.decodeUnknownSync(presence.schema as any)(data);\n};\n\n/**\n * Safely validates unknown data against a Presence schema.\n * Returns undefined if validation fails instead of throwing.\n *\n * @param presence - The Presence instance with the schema\n * @param data - Unknown data to validate\n * @returns The validated data or undefined if invalid\n */\nexport const validateSafe = <TData,>(\n presence: Presence<TData>,\n data: unknown\n): TData | undefined => {\n try {\n return Schema.decodeUnknownSync(presence.schema as any)(data);\n } catch {\n return undefined;\n }\n};\n\n/**\n * Checks if unknown data is valid according to a Presence schema.\n *\n * @param presence - The Presence instance with the schema\n * @param data - Unknown data to check\n * @returns true if valid, false otherwise\n */\nexport const isValid = <TData,>(\n presence: Presence<TData>,\n data: unknown\n): data is TData => {\n try {\n Schema.decodeUnknownSync(presence.schema as any)(data);\n return true;\n } catch {\n return false;\n }\n};\n\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8EA,MAAa,QAAgB,aAAsD;CACjF,MAAM;CACN,QAAQ,QAAQ;CAChB,OAAO;CACR;;;;;;;;;;AAeD,MAAa,YACX,UACA,SACU;AACV,QAAO,OAAO,kBAAkB,SAAS,OAAc,CAAC,KAAK;;;;;;;;;;AAW/D,MAAa,gBACX,UACA,SACsB;AACtB,KAAI;AACF,SAAO,OAAO,kBAAkB,SAAS,OAAc,CAAC,KAAK;mBACvD;AACN;;;;;;;;;;AAWJ,MAAa,WACX,UACA,SACkB;AAClB,KAAI;AACF,SAAO,kBAAkB,SAAS,OAAc,CAAC,KAAK;AACtD,SAAO;oBACD;AACN,SAAO"}
@@ -0,0 +1,305 @@
1
+ const require_rolldown_runtime = require('./_virtual/rolldown_runtime.cjs');
2
+ const require_objectSpread2 = require('./_virtual/_@oxc-project_runtime@0.103.0/helpers/objectSpread2.cjs');
3
+ const require_String = require('./primitives/String.cjs');
4
+ const require_Struct = require('./primitives/Struct.cjs');
5
+ const require_Boolean = require('./primitives/Boolean.cjs');
6
+ const require_Number = require('./primitives/Number.cjs');
7
+ const require_Literal = require('./primitives/Literal.cjs');
8
+ const require_Array = require('./primitives/Array.cjs');
9
+ const require_Lazy = require('./primitives/Lazy.cjs');
10
+ const require_Union = require('./primitives/Union.cjs');
11
+ const require_Either = require('./primitives/Either.cjs');
12
+ const require_TreeNode = require('./primitives/TreeNode.cjs');
13
+ const require_Tree = require('./primitives/Tree.cjs');
14
+ require('./Primitive.cjs');
15
+
16
+ //#region src/SchemaJSON.ts
17
+ var SchemaJSON_exports = /* @__PURE__ */ require_rolldown_runtime.__export({
18
+ fromJSON: () => fromJSON,
19
+ toJSON: () => toJSON
20
+ });
21
+ function getSchema(primitive) {
22
+ return primitive._schema;
23
+ }
24
+ function serializeValidators(validators) {
25
+ const serializable = validators.filter((v) => v.kind != null);
26
+ if (serializable.length === 0) return void 0;
27
+ return serializable.map((v) => {
28
+ const json = { kind: v.kind };
29
+ if (v.params !== void 0) return require_objectSpread2._objectSpread2(require_objectSpread2._objectSpread2({}, json), {}, { params: v.params });
30
+ return json;
31
+ });
32
+ }
33
+ function collectTreeNodes(node, visited) {
34
+ if (visited.has(node.type)) return;
35
+ visited.set(node.type, node);
36
+ for (const child of node.children) collectTreeNodes(child, visited);
37
+ }
38
+ function toJSON(primitive) {
39
+ if (primitive instanceof require_Lazy.LazyPrimitive) return toJSON(primitive._resolve());
40
+ const schema = getSchema(primitive);
41
+ if (primitive instanceof require_String.StringPrimitive) {
42
+ const json = {
43
+ type: "string",
44
+ required: schema.required
45
+ };
46
+ if (schema.defaultValue !== void 0) json.default = schema.defaultValue;
47
+ const validators = serializeValidators(schema.validators);
48
+ if (validators) json.validators = validators;
49
+ return json;
50
+ }
51
+ if (primitive instanceof require_Number.NumberPrimitive) {
52
+ const json = {
53
+ type: "number",
54
+ required: schema.required
55
+ };
56
+ if (schema.defaultValue !== void 0) json.default = schema.defaultValue;
57
+ const validators = serializeValidators(schema.validators);
58
+ if (validators) json.validators = validators;
59
+ return json;
60
+ }
61
+ if (primitive instanceof require_Boolean.BooleanPrimitive) {
62
+ const json = {
63
+ type: "boolean",
64
+ required: schema.required
65
+ };
66
+ if (schema.defaultValue !== void 0) json.default = schema.defaultValue;
67
+ return json;
68
+ }
69
+ if (primitive instanceof require_Literal.LiteralPrimitive) {
70
+ const json = {
71
+ type: "literal",
72
+ value: primitive.literal,
73
+ required: schema.required
74
+ };
75
+ if (schema.defaultValue !== void 0) json.default = schema.defaultValue;
76
+ return json;
77
+ }
78
+ if (primitive instanceof require_Struct.StructPrimitive) {
79
+ const fields = {};
80
+ const structFields = primitive.fields;
81
+ for (const key in structFields) fields[key] = toJSON(structFields[key]);
82
+ const json = {
83
+ type: "struct",
84
+ required: schema.required,
85
+ fields
86
+ };
87
+ if (schema.defaultValue !== void 0) json.default = schema.defaultValue;
88
+ return json;
89
+ }
90
+ if (primitive instanceof require_Array.ArrayPrimitive) {
91
+ const json = {
92
+ type: "array",
93
+ required: schema.required,
94
+ element: toJSON(primitive.element)
95
+ };
96
+ if (schema.defaultValue !== void 0) json.default = schema.defaultValue;
97
+ const validators = serializeValidators(schema.validators);
98
+ if (validators) json.validators = validators;
99
+ return json;
100
+ }
101
+ if (primitive instanceof require_Union.UnionPrimitive) {
102
+ const variants = {};
103
+ const unionVariants = primitive.variants;
104
+ for (const key in unionVariants) variants[key] = toJSON(unionVariants[key]);
105
+ const json = {
106
+ type: "union",
107
+ required: schema.required,
108
+ discriminator: primitive.discriminator,
109
+ variants
110
+ };
111
+ if (schema.defaultValue !== void 0) json.default = schema.defaultValue;
112
+ return json;
113
+ }
114
+ if (primitive instanceof require_Either.EitherPrimitive) {
115
+ const variants = primitive.variants;
116
+ const json = {
117
+ type: "either",
118
+ required: schema.required,
119
+ variants: variants.map((v) => toJSON(v))
120
+ };
121
+ if (schema.defaultValue !== void 0) json.default = schema.defaultValue;
122
+ return json;
123
+ }
124
+ if (primitive instanceof require_Tree.TreePrimitive) {
125
+ const root = primitive.root;
126
+ const nodeMap = /* @__PURE__ */ new Map();
127
+ collectTreeNodes(root, nodeMap);
128
+ const nodes = {};
129
+ for (const [nodeType, node] of nodeMap) nodes[nodeType] = {
130
+ type: "treeNode",
131
+ nodeType,
132
+ data: toJSON(node.data),
133
+ children: node.children.map((c) => c.type)
134
+ };
135
+ const json = {
136
+ type: "tree",
137
+ required: schema.required,
138
+ root: root.type,
139
+ nodes
140
+ };
141
+ if (schema.defaultInput !== void 0) json.default = schema.defaultInput;
142
+ return json;
143
+ }
144
+ throw new Error(`Unknown primitive type: ${primitive._tag}`);
145
+ }
146
+ function applyStringValidators(p, validators) {
147
+ let result = p;
148
+ for (const v of validators) {
149
+ const params = v.params;
150
+ switch (v.kind) {
151
+ case "min":
152
+ result = result.min(params.value);
153
+ break;
154
+ case "max":
155
+ result = result.max(params.value);
156
+ break;
157
+ case "length":
158
+ result = result.length(params.value);
159
+ break;
160
+ case "regex":
161
+ result = result.regex(new RegExp(params.pattern, params.flags));
162
+ break;
163
+ case "email":
164
+ result = result.email();
165
+ break;
166
+ case "url":
167
+ result = result.url();
168
+ break;
169
+ }
170
+ }
171
+ return result;
172
+ }
173
+ function applyNumberValidators(p, validators) {
174
+ let result = p;
175
+ for (const v of validators) {
176
+ const params = v.params;
177
+ switch (v.kind) {
178
+ case "min":
179
+ result = result.min(params.value);
180
+ break;
181
+ case "max":
182
+ result = result.max(params.value);
183
+ break;
184
+ case "positive":
185
+ result = result.positive();
186
+ break;
187
+ case "negative":
188
+ result = result.negative();
189
+ break;
190
+ case "int":
191
+ result = result.int();
192
+ break;
193
+ }
194
+ }
195
+ return result;
196
+ }
197
+ function applyArrayValidators(p, validators) {
198
+ let result = p;
199
+ for (const v of validators) {
200
+ const params = v.params;
201
+ switch (v.kind) {
202
+ case "minLength":
203
+ result = result.minLength(params.value);
204
+ break;
205
+ case "maxLength":
206
+ result = result.maxLength(params.value);
207
+ break;
208
+ }
209
+ }
210
+ return result;
211
+ }
212
+ function fromJSON(json) {
213
+ const obj = json;
214
+ switch (obj.type) {
215
+ case "string": {
216
+ let p = require_String.String();
217
+ if (obj.validators) p = applyStringValidators(p, obj.validators);
218
+ if (obj.required) p = p.required();
219
+ if (obj.default !== void 0) p = p.default(obj.default);
220
+ return p;
221
+ }
222
+ case "number": {
223
+ let p = require_Number.Number();
224
+ if (obj.validators) p = applyNumberValidators(p, obj.validators);
225
+ if (obj.required) p = p.required();
226
+ if (obj.default !== void 0) p = p.default(obj.default);
227
+ return p;
228
+ }
229
+ case "boolean": {
230
+ let p = require_Boolean.Boolean();
231
+ if (obj.required) p = p.required();
232
+ if (obj.default !== void 0) p = p.default(obj.default);
233
+ return p;
234
+ }
235
+ case "literal": {
236
+ let p = require_Literal.Literal(obj.value);
237
+ if (obj.required) p = p.required();
238
+ if (obj.default !== void 0) p = p.default(obj.default);
239
+ return p;
240
+ }
241
+ case "struct": {
242
+ const fields = {};
243
+ for (const key in obj.fields) fields[key] = fromJSON(obj.fields[key]);
244
+ let p = require_Struct.Struct(fields);
245
+ if (obj.required) p = p.required();
246
+ if (obj.default !== void 0) p = p.default(obj.default);
247
+ return p;
248
+ }
249
+ case "array": {
250
+ const element = fromJSON(obj.element);
251
+ let p = require_Array.Array(element);
252
+ if (obj.validators) p = applyArrayValidators(p, obj.validators);
253
+ if (obj.required) p = p.required();
254
+ if (obj.default !== void 0) p = p.default(obj.default);
255
+ return p;
256
+ }
257
+ case "union": {
258
+ const variants = {};
259
+ for (const key in obj.variants) variants[key] = fromJSON(obj.variants[key]);
260
+ let p = require_Union.Union({
261
+ discriminator: obj.discriminator,
262
+ variants
263
+ });
264
+ if (obj.required) p = p.required();
265
+ if (obj.default !== void 0) p = p.default(obj.default);
266
+ return p;
267
+ }
268
+ case "either": {
269
+ const variants = obj.variants.map((v) => fromJSON(v));
270
+ let p = require_Either.Either(...variants);
271
+ if (obj.required) p = p.required();
272
+ if (obj.default !== void 0) p = p.default(obj.default);
273
+ return p;
274
+ }
275
+ case "tree": {
276
+ const treeJSON = obj;
277
+ const nodeMap = /* @__PURE__ */ new Map();
278
+ const nodeJSONMap = /* @__PURE__ */ new Map();
279
+ for (const nodeType in treeJSON.nodes) nodeJSONMap.set(nodeType, treeJSON.nodes[nodeType]);
280
+ for (const [nodeType, nodeJSON] of nodeJSONMap) {
281
+ const data = fromJSON(nodeJSON.data);
282
+ const childTypes = nodeJSON.children;
283
+ const node = require_TreeNode.TreeNode(nodeType, {
284
+ data,
285
+ children: () => childTypes.map((ct) => nodeMap.get(ct))
286
+ });
287
+ nodeMap.set(nodeType, node);
288
+ }
289
+ const root = nodeMap.get(treeJSON.root);
290
+ let p = require_Tree.Tree({ root });
291
+ if (obj.required) p = p.required();
292
+ if (obj.default !== void 0) p = p.default(obj.default);
293
+ return p;
294
+ }
295
+ default: throw new Error(`Unknown JSON schema type: ${obj.type}`);
296
+ }
297
+ }
298
+
299
+ //#endregion
300
+ Object.defineProperty(exports, 'SchemaJSON_exports', {
301
+ enumerable: true,
302
+ get: function () {
303
+ return SchemaJSON_exports;
304
+ }
305
+ });
@@ -0,0 +1,11 @@
1
+ import { AnyPrimitive } from "./primitives/shared.cjs";
2
+
3
+ //#region src/SchemaJSON.d.ts
4
+ declare namespace SchemaJSON_d_exports {
5
+ export { fromJSON, toJSON };
6
+ }
7
+ declare function toJSON(primitive: AnyPrimitive): unknown;
8
+ declare function fromJSON(json: unknown): AnyPrimitive;
9
+ //#endregion
10
+ export { SchemaJSON_d_exports };
11
+ //# sourceMappingURL=SchemaJSON.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SchemaJSON.d.cts","names":[],"sources":["../src/SchemaJSON.ts"],"sourcesContent":[],"mappings":";;;;;;iBAyHgB,MAAA,YAAkB;iBAsKlB,QAAA,iBAAyB"}
@@ -0,0 +1,11 @@
1
+ import { AnyPrimitive } from "./primitives/shared.mjs";
2
+
3
+ //#region src/SchemaJSON.d.ts
4
+ declare namespace SchemaJSON_d_exports {
5
+ export { fromJSON, toJSON };
6
+ }
7
+ declare function toJSON(primitive: AnyPrimitive): unknown;
8
+ declare function fromJSON(json: unknown): AnyPrimitive;
9
+ //#endregion
10
+ export { SchemaJSON_d_exports };
11
+ //# sourceMappingURL=SchemaJSON.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SchemaJSON.d.mts","names":[],"sources":["../src/SchemaJSON.ts"],"sourcesContent":[],"mappings":";;;;;;iBAyHgB,MAAA,YAAkB;iBAsKlB,QAAA,iBAAyB"}
@@ -0,0 +1,301 @@
1
+ import { __export } from "./_virtual/rolldown_runtime.mjs";
2
+ import { _objectSpread2 } from "./_virtual/_@oxc-project_runtime@0.103.0/helpers/objectSpread2.mjs";
3
+ import { String, StringPrimitive } from "./primitives/String.mjs";
4
+ import { Struct, StructPrimitive } from "./primitives/Struct.mjs";
5
+ import { Boolean, BooleanPrimitive } from "./primitives/Boolean.mjs";
6
+ import { Number, NumberPrimitive } from "./primitives/Number.mjs";
7
+ import { Literal, LiteralPrimitive } from "./primitives/Literal.mjs";
8
+ import { Array, ArrayPrimitive } from "./primitives/Array.mjs";
9
+ import { LazyPrimitive } from "./primitives/Lazy.mjs";
10
+ import { Union, UnionPrimitive } from "./primitives/Union.mjs";
11
+ import { Either, EitherPrimitive } from "./primitives/Either.mjs";
12
+ import { TreeNode } from "./primitives/TreeNode.mjs";
13
+ import { Tree, TreePrimitive } from "./primitives/Tree.mjs";
14
+ import "./Primitive.mjs";
15
+
16
+ //#region src/SchemaJSON.ts
17
+ var SchemaJSON_exports = /* @__PURE__ */ __export({
18
+ fromJSON: () => fromJSON,
19
+ toJSON: () => toJSON
20
+ });
21
+ function getSchema(primitive) {
22
+ return primitive._schema;
23
+ }
24
+ function serializeValidators(validators) {
25
+ const serializable = validators.filter((v) => v.kind != null);
26
+ if (serializable.length === 0) return void 0;
27
+ return serializable.map((v) => {
28
+ const json = { kind: v.kind };
29
+ if (v.params !== void 0) return _objectSpread2(_objectSpread2({}, json), {}, { params: v.params });
30
+ return json;
31
+ });
32
+ }
33
+ function collectTreeNodes(node, visited) {
34
+ if (visited.has(node.type)) return;
35
+ visited.set(node.type, node);
36
+ for (const child of node.children) collectTreeNodes(child, visited);
37
+ }
38
+ function toJSON(primitive) {
39
+ if (primitive instanceof LazyPrimitive) return toJSON(primitive._resolve());
40
+ const schema = getSchema(primitive);
41
+ if (primitive instanceof StringPrimitive) {
42
+ const json = {
43
+ type: "string",
44
+ required: schema.required
45
+ };
46
+ if (schema.defaultValue !== void 0) json.default = schema.defaultValue;
47
+ const validators = serializeValidators(schema.validators);
48
+ if (validators) json.validators = validators;
49
+ return json;
50
+ }
51
+ if (primitive instanceof NumberPrimitive) {
52
+ const json = {
53
+ type: "number",
54
+ required: schema.required
55
+ };
56
+ if (schema.defaultValue !== void 0) json.default = schema.defaultValue;
57
+ const validators = serializeValidators(schema.validators);
58
+ if (validators) json.validators = validators;
59
+ return json;
60
+ }
61
+ if (primitive instanceof BooleanPrimitive) {
62
+ const json = {
63
+ type: "boolean",
64
+ required: schema.required
65
+ };
66
+ if (schema.defaultValue !== void 0) json.default = schema.defaultValue;
67
+ return json;
68
+ }
69
+ if (primitive instanceof LiteralPrimitive) {
70
+ const json = {
71
+ type: "literal",
72
+ value: primitive.literal,
73
+ required: schema.required
74
+ };
75
+ if (schema.defaultValue !== void 0) json.default = schema.defaultValue;
76
+ return json;
77
+ }
78
+ if (primitive instanceof StructPrimitive) {
79
+ const fields = {};
80
+ const structFields = primitive.fields;
81
+ for (const key in structFields) fields[key] = toJSON(structFields[key]);
82
+ const json = {
83
+ type: "struct",
84
+ required: schema.required,
85
+ fields
86
+ };
87
+ if (schema.defaultValue !== void 0) json.default = schema.defaultValue;
88
+ return json;
89
+ }
90
+ if (primitive instanceof ArrayPrimitive) {
91
+ const json = {
92
+ type: "array",
93
+ required: schema.required,
94
+ element: toJSON(primitive.element)
95
+ };
96
+ if (schema.defaultValue !== void 0) json.default = schema.defaultValue;
97
+ const validators = serializeValidators(schema.validators);
98
+ if (validators) json.validators = validators;
99
+ return json;
100
+ }
101
+ if (primitive instanceof UnionPrimitive) {
102
+ const variants = {};
103
+ const unionVariants = primitive.variants;
104
+ for (const key in unionVariants) variants[key] = toJSON(unionVariants[key]);
105
+ const json = {
106
+ type: "union",
107
+ required: schema.required,
108
+ discriminator: primitive.discriminator,
109
+ variants
110
+ };
111
+ if (schema.defaultValue !== void 0) json.default = schema.defaultValue;
112
+ return json;
113
+ }
114
+ if (primitive instanceof EitherPrimitive) {
115
+ const variants = primitive.variants;
116
+ const json = {
117
+ type: "either",
118
+ required: schema.required,
119
+ variants: variants.map((v) => toJSON(v))
120
+ };
121
+ if (schema.defaultValue !== void 0) json.default = schema.defaultValue;
122
+ return json;
123
+ }
124
+ if (primitive instanceof TreePrimitive) {
125
+ const root = primitive.root;
126
+ const nodeMap = /* @__PURE__ */ new Map();
127
+ collectTreeNodes(root, nodeMap);
128
+ const nodes = {};
129
+ for (const [nodeType, node] of nodeMap) nodes[nodeType] = {
130
+ type: "treeNode",
131
+ nodeType,
132
+ data: toJSON(node.data),
133
+ children: node.children.map((c) => c.type)
134
+ };
135
+ const json = {
136
+ type: "tree",
137
+ required: schema.required,
138
+ root: root.type,
139
+ nodes
140
+ };
141
+ if (schema.defaultInput !== void 0) json.default = schema.defaultInput;
142
+ return json;
143
+ }
144
+ throw new Error(`Unknown primitive type: ${primitive._tag}`);
145
+ }
146
+ function applyStringValidators(p, validators) {
147
+ let result = p;
148
+ for (const v of validators) {
149
+ const params = v.params;
150
+ switch (v.kind) {
151
+ case "min":
152
+ result = result.min(params.value);
153
+ break;
154
+ case "max":
155
+ result = result.max(params.value);
156
+ break;
157
+ case "length":
158
+ result = result.length(params.value);
159
+ break;
160
+ case "regex":
161
+ result = result.regex(new RegExp(params.pattern, params.flags));
162
+ break;
163
+ case "email":
164
+ result = result.email();
165
+ break;
166
+ case "url":
167
+ result = result.url();
168
+ break;
169
+ }
170
+ }
171
+ return result;
172
+ }
173
+ function applyNumberValidators(p, validators) {
174
+ let result = p;
175
+ for (const v of validators) {
176
+ const params = v.params;
177
+ switch (v.kind) {
178
+ case "min":
179
+ result = result.min(params.value);
180
+ break;
181
+ case "max":
182
+ result = result.max(params.value);
183
+ break;
184
+ case "positive":
185
+ result = result.positive();
186
+ break;
187
+ case "negative":
188
+ result = result.negative();
189
+ break;
190
+ case "int":
191
+ result = result.int();
192
+ break;
193
+ }
194
+ }
195
+ return result;
196
+ }
197
+ function applyArrayValidators(p, validators) {
198
+ let result = p;
199
+ for (const v of validators) {
200
+ const params = v.params;
201
+ switch (v.kind) {
202
+ case "minLength":
203
+ result = result.minLength(params.value);
204
+ break;
205
+ case "maxLength":
206
+ result = result.maxLength(params.value);
207
+ break;
208
+ }
209
+ }
210
+ return result;
211
+ }
212
+ function fromJSON(json) {
213
+ const obj = json;
214
+ switch (obj.type) {
215
+ case "string": {
216
+ let p = String();
217
+ if (obj.validators) p = applyStringValidators(p, obj.validators);
218
+ if (obj.required) p = p.required();
219
+ if (obj.default !== void 0) p = p.default(obj.default);
220
+ return p;
221
+ }
222
+ case "number": {
223
+ let p = Number();
224
+ if (obj.validators) p = applyNumberValidators(p, obj.validators);
225
+ if (obj.required) p = p.required();
226
+ if (obj.default !== void 0) p = p.default(obj.default);
227
+ return p;
228
+ }
229
+ case "boolean": {
230
+ let p = Boolean();
231
+ if (obj.required) p = p.required();
232
+ if (obj.default !== void 0) p = p.default(obj.default);
233
+ return p;
234
+ }
235
+ case "literal": {
236
+ let p = Literal(obj.value);
237
+ if (obj.required) p = p.required();
238
+ if (obj.default !== void 0) p = p.default(obj.default);
239
+ return p;
240
+ }
241
+ case "struct": {
242
+ const fields = {};
243
+ for (const key in obj.fields) fields[key] = fromJSON(obj.fields[key]);
244
+ let p = Struct(fields);
245
+ if (obj.required) p = p.required();
246
+ if (obj.default !== void 0) p = p.default(obj.default);
247
+ return p;
248
+ }
249
+ case "array": {
250
+ const element = fromJSON(obj.element);
251
+ let p = Array(element);
252
+ if (obj.validators) p = applyArrayValidators(p, obj.validators);
253
+ if (obj.required) p = p.required();
254
+ if (obj.default !== void 0) p = p.default(obj.default);
255
+ return p;
256
+ }
257
+ case "union": {
258
+ const variants = {};
259
+ for (const key in obj.variants) variants[key] = fromJSON(obj.variants[key]);
260
+ let p = Union({
261
+ discriminator: obj.discriminator,
262
+ variants
263
+ });
264
+ if (obj.required) p = p.required();
265
+ if (obj.default !== void 0) p = p.default(obj.default);
266
+ return p;
267
+ }
268
+ case "either": {
269
+ const variants = obj.variants.map((v) => fromJSON(v));
270
+ let p = Either(...variants);
271
+ if (obj.required) p = p.required();
272
+ if (obj.default !== void 0) p = p.default(obj.default);
273
+ return p;
274
+ }
275
+ case "tree": {
276
+ const treeJSON = obj;
277
+ const nodeMap = /* @__PURE__ */ new Map();
278
+ const nodeJSONMap = /* @__PURE__ */ new Map();
279
+ for (const nodeType in treeJSON.nodes) nodeJSONMap.set(nodeType, treeJSON.nodes[nodeType]);
280
+ for (const [nodeType, nodeJSON] of nodeJSONMap) {
281
+ const data = fromJSON(nodeJSON.data);
282
+ const childTypes = nodeJSON.children;
283
+ const node = TreeNode(nodeType, {
284
+ data,
285
+ children: () => childTypes.map((ct) => nodeMap.get(ct))
286
+ });
287
+ nodeMap.set(nodeType, node);
288
+ }
289
+ const root = nodeMap.get(treeJSON.root);
290
+ let p = Tree({ root });
291
+ if (obj.required) p = p.required();
292
+ if (obj.default !== void 0) p = p.default(obj.default);
293
+ return p;
294
+ }
295
+ default: throw new Error(`Unknown JSON schema type: ${obj.type}`);
296
+ }
297
+ }
298
+
299
+ //#endregion
300
+ export { SchemaJSON_exports };
301
+ //# sourceMappingURL=SchemaJSON.mjs.map