@voidhash/mimic 0.0.1 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +257 -42
- package/dist/Document.cjs +152 -0
- package/dist/Document.d.cts +67 -0
- package/dist/Document.d.cts.map +1 -0
- package/dist/Document.d.mts +68 -0
- package/dist/Document.d.mts.map +1 -0
- package/dist/Document.mjs +147 -0
- package/dist/Document.mjs.map +1 -0
- package/dist/EffectSchema.cjs +180 -0
- package/dist/EffectSchema.d.cts +84 -0
- package/dist/EffectSchema.d.cts.map +1 -0
- package/dist/EffectSchema.d.mts +84 -0
- package/dist/EffectSchema.d.mts.map +1 -0
- package/dist/EffectSchema.mjs +176 -0
- package/dist/EffectSchema.mjs.map +1 -0
- package/dist/FractionalIndex.cjs +365 -0
- package/dist/FractionalIndex.mjs +364 -0
- package/dist/FractionalIndex.mjs.map +1 -0
- package/dist/Operation.cjs +53 -0
- package/dist/Operation.d.cts +39 -0
- package/dist/Operation.d.cts.map +1 -0
- package/dist/Operation.d.mts +39 -0
- package/dist/Operation.d.mts.map +1 -0
- package/dist/Operation.mjs +46 -0
- package/dist/Operation.mjs.map +1 -0
- package/dist/OperationDefinition.cjs +13 -0
- package/dist/OperationDefinition.d.cts +12 -0
- package/dist/OperationDefinition.d.cts.map +1 -0
- package/dist/OperationDefinition.d.mts +12 -0
- package/dist/OperationDefinition.d.mts.map +1 -0
- package/dist/OperationDefinition.mjs +13 -0
- package/dist/OperationDefinition.mjs.map +1 -0
- package/dist/OperationPath.cjs +148 -0
- package/dist/OperationPath.d.cts +60 -0
- package/dist/OperationPath.d.cts.map +1 -0
- package/dist/OperationPath.d.mts +60 -0
- package/dist/OperationPath.d.mts.map +1 -0
- package/dist/OperationPath.mjs +138 -0
- package/dist/OperationPath.mjs.map +1 -0
- package/dist/{Presence-gWrmGBeu.cjs → Presence.cjs} +4 -39
- package/dist/{Presence-N8u7Eppr.d.mts → Presence.d.cts} +2 -2
- package/dist/Presence.d.cts.map +1 -0
- package/dist/{Presence-DKKP4v5X.d.cts → Presence.d.mts} +2 -2
- package/dist/Presence.d.mts.map +1 -0
- package/dist/{Presence-DdMVKcOv.mjs → Presence.mjs} +3 -28
- package/dist/Presence.mjs.map +1 -0
- package/dist/Primitive.cjs +52 -0
- package/dist/Primitive.d.cts +20 -0
- package/dist/Primitive.d.cts.map +1 -0
- package/dist/Primitive.d.mts +20 -0
- package/dist/Primitive.d.mts.map +1 -0
- package/dist/Primitive.mjs +48 -0
- package/dist/Primitive.mjs.map +1 -0
- package/dist/ProxyEnvironment.cjs +34 -0
- package/dist/ProxyEnvironment.d.cts +31 -0
- package/dist/ProxyEnvironment.d.cts.map +1 -0
- package/dist/ProxyEnvironment.d.mts +31 -0
- package/dist/ProxyEnvironment.d.mts.map +1 -0
- package/dist/ProxyEnvironment.mjs +29 -0
- package/dist/ProxyEnvironment.mjs.map +1 -0
- package/dist/Transaction.cjs +66 -0
- package/dist/Transaction.d.cts +56 -0
- package/dist/Transaction.d.cts.map +1 -0
- package/dist/Transaction.d.mts +56 -0
- package/dist/Transaction.d.mts.map +1 -0
- package/dist/Transaction.mjs +58 -0
- package/dist/Transaction.mjs.map +1 -0
- package/dist/Transform.cjs +11 -0
- package/dist/Transform.d.cts +21 -0
- package/dist/Transform.d.cts.map +1 -0
- package/dist/Transform.d.mts +21 -0
- package/dist/Transform.d.mts.map +1 -0
- package/dist/Transform.mjs +6 -0
- package/dist/Transform.mjs.map +1 -0
- package/dist/_virtual/_@oxc-project_runtime@0.103.0/helpers/defineProperty.cjs +14 -0
- package/dist/_virtual/_@oxc-project_runtime@0.103.0/helpers/defineProperty.mjs +14 -0
- package/dist/_virtual/_@oxc-project_runtime@0.103.0/helpers/objectSpread2.cjs +27 -0
- package/dist/_virtual/_@oxc-project_runtime@0.103.0/helpers/objectSpread2.mjs +27 -0
- package/dist/_virtual/_@oxc-project_runtime@0.103.0/helpers/toPrimitive.cjs +16 -0
- package/dist/_virtual/_@oxc-project_runtime@0.103.0/helpers/toPrimitive.mjs +16 -0
- package/dist/_virtual/_@oxc-project_runtime@0.103.0/helpers/toPropertyKey.cjs +11 -0
- package/dist/_virtual/_@oxc-project_runtime@0.103.0/helpers/toPropertyKey.mjs +11 -0
- package/dist/_virtual/_@oxc-project_runtime@0.103.0/helpers/typeof.cjs +18 -0
- package/dist/_virtual/_@oxc-project_runtime@0.103.0/helpers/typeof.mjs +12 -0
- package/dist/_virtual/rolldown_runtime.cjs +43 -0
- package/dist/{chunk-CLMFDpHK.mjs → _virtual/rolldown_runtime.mjs} +1 -1
- package/dist/client/ClientDocument.cjs +590 -0
- package/dist/client/ClientDocument.d.cts +161 -0
- package/dist/client/ClientDocument.d.cts.map +1 -0
- package/dist/client/ClientDocument.d.mts +162 -0
- package/dist/client/ClientDocument.d.mts.map +1 -0
- package/dist/client/ClientDocument.mjs +586 -0
- package/dist/client/ClientDocument.mjs.map +1 -0
- package/dist/client/Rebase.cjs +204 -0
- package/dist/client/Rebase.d.cts +87 -0
- package/dist/client/Rebase.d.cts.map +1 -0
- package/dist/client/Rebase.d.mts +88 -0
- package/dist/client/Rebase.d.mts.map +1 -0
- package/dist/client/Rebase.mjs +198 -0
- package/dist/client/Rebase.mjs.map +1 -0
- package/dist/client/StateMonitor.cjs +133 -0
- package/dist/client/StateMonitor.d.cts +122 -0
- package/dist/client/StateMonitor.d.cts.map +1 -0
- package/dist/client/StateMonitor.d.mts +122 -0
- package/dist/client/StateMonitor.d.mts.map +1 -0
- package/dist/client/StateMonitor.mjs +129 -0
- package/dist/client/StateMonitor.mjs.map +1 -0
- package/dist/client/Transport.cjs +11 -0
- package/dist/client/Transport.d.cts +237 -0
- package/dist/client/Transport.d.cts.map +1 -0
- package/dist/client/Transport.d.mts +237 -0
- package/dist/client/Transport.d.mts.map +1 -0
- package/dist/client/Transport.mjs +6 -0
- package/dist/client/Transport.mjs.map +1 -0
- package/dist/client/WebSocketTransport.cjs +396 -0
- package/dist/client/WebSocketTransport.d.cts +29 -0
- package/dist/client/WebSocketTransport.d.cts.map +1 -0
- package/dist/client/WebSocketTransport.d.mts +29 -0
- package/dist/client/WebSocketTransport.d.mts.map +1 -0
- package/dist/client/WebSocketTransport.mjs +392 -0
- package/dist/client/WebSocketTransport.mjs.map +1 -0
- package/dist/client/errors.cjs +135 -0
- package/dist/client/errors.d.cts +87 -0
- package/dist/client/errors.d.cts.map +1 -0
- package/dist/client/errors.d.mts +87 -0
- package/dist/client/errors.d.mts.map +1 -0
- package/dist/client/errors.mjs +127 -0
- package/dist/client/errors.mjs.map +1 -0
- package/dist/client/index.cjs +22 -1424
- package/dist/client/index.d.cts +8 -692
- package/dist/client/index.d.mts +8 -692
- package/dist/client/index.mjs +9 -1413
- package/dist/index.cjs +30 -2529
- package/dist/index.d.cts +12 -143
- package/dist/index.d.mts +12 -143
- package/dist/index.mjs +13 -2526
- package/dist/primitives/Array.cjs +302 -0
- package/dist/primitives/Array.d.cts +95 -0
- package/dist/primitives/Array.d.cts.map +1 -0
- package/dist/primitives/Array.d.mts +95 -0
- package/dist/primitives/Array.d.mts.map +1 -0
- package/dist/primitives/Array.mjs +301 -0
- package/dist/primitives/Array.mjs.map +1 -0
- package/dist/primitives/Boolean.cjs +95 -0
- package/dist/primitives/Boolean.d.cts +44 -0
- package/dist/primitives/Boolean.d.cts.map +1 -0
- package/dist/primitives/Boolean.d.mts +44 -0
- package/dist/primitives/Boolean.d.mts.map +1 -0
- package/dist/primitives/Boolean.mjs +94 -0
- package/dist/primitives/Boolean.mjs.map +1 -0
- package/dist/primitives/Either.cjs +200 -0
- package/dist/primitives/Either.d.cts +113 -0
- package/dist/primitives/Either.d.cts.map +1 -0
- package/dist/primitives/Either.d.mts +113 -0
- package/dist/primitives/Either.d.mts.map +1 -0
- package/dist/primitives/Either.mjs +199 -0
- package/dist/primitives/Either.mjs.map +1 -0
- package/dist/primitives/Lazy.cjs +46 -0
- package/dist/primitives/Lazy.d.cts +46 -0
- package/dist/primitives/Lazy.d.cts.map +1 -0
- package/dist/primitives/Lazy.d.mts +46 -0
- package/dist/primitives/Lazy.d.mts.map +1 -0
- package/dist/primitives/Lazy.mjs +46 -0
- package/dist/primitives/Lazy.mjs.map +1 -0
- package/dist/primitives/Literal.cjs +91 -0
- package/dist/primitives/Literal.d.cts +46 -0
- package/dist/primitives/Literal.d.cts.map +1 -0
- package/dist/primitives/Literal.d.mts +46 -0
- package/dist/primitives/Literal.d.mts.map +1 -0
- package/dist/primitives/Literal.mjs +90 -0
- package/dist/primitives/Literal.mjs.map +1 -0
- package/dist/primitives/Number.cjs +115 -0
- package/dist/primitives/Number.d.cts +54 -0
- package/dist/primitives/Number.d.cts.map +1 -0
- package/dist/primitives/Number.d.mts +54 -0
- package/dist/primitives/Number.d.mts.map +1 -0
- package/dist/primitives/Number.mjs +114 -0
- package/dist/primitives/Number.mjs.map +1 -0
- package/dist/primitives/String.cjs +127 -0
- package/dist/primitives/String.d.cts +56 -0
- package/dist/primitives/String.d.cts.map +1 -0
- package/dist/primitives/String.d.mts +56 -0
- package/dist/primitives/String.d.mts.map +1 -0
- package/dist/primitives/String.mjs +126 -0
- package/dist/primitives/String.mjs.map +1 -0
- package/dist/primitives/Struct.cjs +207 -0
- package/dist/primitives/Struct.d.cts +96 -0
- package/dist/primitives/Struct.d.cts.map +1 -0
- package/dist/primitives/Struct.d.mts +97 -0
- package/dist/primitives/Struct.d.mts.map +1 -0
- package/dist/primitives/Struct.mjs +206 -0
- package/dist/primitives/Struct.mjs.map +1 -0
- package/dist/primitives/Tree.cjs +575 -0
- package/dist/primitives/Tree.d.cts +185 -0
- package/dist/primitives/Tree.d.cts.map +1 -0
- package/dist/primitives/Tree.d.mts +185 -0
- package/dist/primitives/Tree.d.mts.map +1 -0
- package/dist/primitives/Tree.mjs +574 -0
- package/dist/primitives/Tree.mjs.map +1 -0
- package/dist/primitives/TreeNode.cjs +73 -0
- package/dist/primitives/TreeNode.d.cts +92 -0
- package/dist/primitives/TreeNode.d.cts.map +1 -0
- package/dist/primitives/TreeNode.d.mts +93 -0
- package/dist/primitives/TreeNode.d.mts.map +1 -0
- package/dist/primitives/TreeNode.mjs +72 -0
- package/dist/primitives/TreeNode.mjs.map +1 -0
- package/dist/primitives/Union.cjs +170 -0
- package/dist/primitives/Union.d.cts +81 -0
- package/dist/primitives/Union.d.cts.map +1 -0
- package/dist/primitives/Union.d.mts +81 -0
- package/dist/primitives/Union.d.mts.map +1 -0
- package/dist/primitives/Union.mjs +169 -0
- package/dist/primitives/Union.mjs.map +1 -0
- package/dist/primitives/shared.cjs +60 -0
- package/dist/primitives/shared.d.cts +147 -0
- package/dist/primitives/shared.d.cts.map +1 -0
- package/dist/primitives/shared.d.mts +147 -0
- package/dist/primitives/shared.d.mts.map +1 -0
- package/dist/primitives/shared.mjs +58 -0
- package/dist/primitives/shared.mjs.map +1 -0
- package/dist/server/ServerDocument.cjs +110 -0
- package/dist/server/ServerDocument.d.cts +98 -0
- package/dist/server/ServerDocument.d.cts.map +1 -0
- package/dist/server/ServerDocument.d.mts +99 -0
- package/dist/server/ServerDocument.d.mts.map +1 -0
- package/dist/server/ServerDocument.mjs +106 -0
- package/dist/server/ServerDocument.mjs.map +1 -0
- package/dist/server/errors.cjs +85 -0
- package/dist/server/errors.d.cts +53 -0
- package/dist/server/errors.d.cts.map +1 -0
- package/dist/server/errors.d.mts +53 -0
- package/dist/server/errors.d.mts.map +1 -0
- package/dist/server/errors.mjs +81 -0
- package/dist/server/errors.mjs.map +1 -0
- package/dist/server/index.cjs +9 -185
- package/dist/server/index.d.cts +3 -148
- package/dist/server/index.d.mts +3 -148
- package/dist/server/index.mjs +3 -181
- package/dist/types/index.cjs +16 -0
- package/dist/types/index.d.cts +16 -0
- package/dist/types/index.d.cts.map +1 -0
- package/dist/types/index.d.mts +16 -0
- package/dist/types/index.d.mts.map +1 -0
- package/dist/types/index.mjs +12 -0
- package/dist/types/index.mjs.map +1 -0
- package/dist/utils/tree-helpers.cjs +443 -0
- package/dist/utils/tree-helpers.d.cts +280 -0
- package/dist/utils/tree-helpers.d.cts.map +1 -0
- package/dist/utils/tree-helpers.d.mts +280 -0
- package/dist/utils/tree-helpers.d.mts.map +1 -0
- package/dist/utils/tree-helpers.mjs +439 -0
- package/dist/utils/tree-helpers.mjs.map +1 -0
- package/package.json +2 -2
- package/src/index.ts +2 -0
- package/src/primitives/shared.ts +7 -1
- package/src/types/index.ts +137 -0
- package/src/utils/index.ts +7 -0
- package/src/utils/tree-helpers.ts +648 -0
- package/tsdown.config.ts +1 -1
- package/dist/Document-ChuFrTk1.cjs +0 -571
- package/dist/Document-CwiAFTIq.mjs +0 -438
- package/dist/Document-CwiAFTIq.mjs.map +0 -1
- package/dist/Presence-DKKP4v5X.d.cts.map +0 -1
- package/dist/Presence-DdMVKcOv.mjs.map +0 -1
- package/dist/Presence-N8u7Eppr.d.mts.map +0 -1
- package/dist/Primitive-CvFVxR8_.d.cts +0 -1175
- package/dist/Primitive-CvFVxR8_.d.cts.map +0 -1
- package/dist/Primitive-lEhQyGVL.d.mts +0 -1175
- package/dist/Primitive-lEhQyGVL.d.mts.map +0 -1
- package/dist/client/index.d.cts.map +0 -1
- package/dist/client/index.d.mts.map +0 -1
- package/dist/client/index.mjs.map +0 -1
- package/dist/index.d.cts.map +0 -1
- package/dist/index.d.mts.map +0 -1
- package/dist/index.mjs.map +0 -1
- package/dist/server/index.d.cts.map +0 -1
- package/dist/server/index.d.mts.map +0 -1
- package/dist/server/index.mjs.map +0 -1
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
const require_rolldown_runtime = require('../_virtual/rolldown_runtime.cjs');
|
|
2
|
+
const require_defineProperty = require('../_virtual/_@oxc-project_runtime@0.103.0/helpers/defineProperty.cjs');
|
|
3
|
+
const require_objectSpread2 = require('../_virtual/_@oxc-project_runtime@0.103.0/helpers/objectSpread2.cjs');
|
|
4
|
+
const require_shared = require('./shared.cjs');
|
|
5
|
+
const require_OperationDefinition = require('../OperationDefinition.cjs');
|
|
6
|
+
const require_OperationPath = require('../OperationPath.cjs');
|
|
7
|
+
const require_Operation = require('../Operation.cjs');
|
|
8
|
+
require('../Primitive.cjs');
|
|
9
|
+
let effect = require("effect");
|
|
10
|
+
|
|
11
|
+
//#region src/primitives/Union.ts
|
|
12
|
+
var UnionPrimitive = class UnionPrimitive {
|
|
13
|
+
constructor(schema) {
|
|
14
|
+
require_defineProperty._defineProperty(this, "_tag", "UnionPrimitive");
|
|
15
|
+
require_defineProperty._defineProperty(this, "_State", void 0);
|
|
16
|
+
require_defineProperty._defineProperty(this, "_Proxy", void 0);
|
|
17
|
+
require_defineProperty._defineProperty(this, "_TRequired", void 0);
|
|
18
|
+
require_defineProperty._defineProperty(this, "_THasDefault", void 0);
|
|
19
|
+
require_defineProperty._defineProperty(this, "TSetInput", void 0);
|
|
20
|
+
require_defineProperty._defineProperty(this, "TUpdateInput", void 0);
|
|
21
|
+
require_defineProperty._defineProperty(this, "_schema", void 0);
|
|
22
|
+
require_defineProperty._defineProperty(this, "_opDefinitions", { set: require_OperationDefinition.make({
|
|
23
|
+
kind: "union.set",
|
|
24
|
+
payload: effect.Schema.Unknown,
|
|
25
|
+
target: effect.Schema.Unknown,
|
|
26
|
+
apply: (payload) => payload
|
|
27
|
+
}) });
|
|
28
|
+
require_defineProperty._defineProperty(this, "_internal", {
|
|
29
|
+
createProxy: (env, operationPath) => {
|
|
30
|
+
const variants = this._schema.variants;
|
|
31
|
+
const defaultValue = this._schema.defaultValue;
|
|
32
|
+
return {
|
|
33
|
+
get: () => {
|
|
34
|
+
const state = env.getState(operationPath);
|
|
35
|
+
return state !== null && state !== void 0 ? state : defaultValue;
|
|
36
|
+
},
|
|
37
|
+
set: (value) => {
|
|
38
|
+
const merged = this._applyVariantDefaults(value);
|
|
39
|
+
env.addOperation(require_Operation.fromDefinition(operationPath, this._opDefinitions.set, merged));
|
|
40
|
+
},
|
|
41
|
+
as: (variant) => {
|
|
42
|
+
const variantPrimitive = variants[variant];
|
|
43
|
+
if (!variantPrimitive) throw new require_shared.ValidationError(`Unknown variant: ${globalThis.String(variant)}`);
|
|
44
|
+
return variantPrimitive._internal.createProxy(env, operationPath);
|
|
45
|
+
},
|
|
46
|
+
match: (handlers) => {
|
|
47
|
+
const state = env.getState(operationPath);
|
|
48
|
+
if (!state) return void 0;
|
|
49
|
+
const variantKey = this._findVariantKey(state);
|
|
50
|
+
if (!variantKey) return void 0;
|
|
51
|
+
const handler = handlers[variantKey];
|
|
52
|
+
if (!handler) return void 0;
|
|
53
|
+
return handler(variants[variantKey]._internal.createProxy(env, operationPath));
|
|
54
|
+
},
|
|
55
|
+
toSnapshot: () => {
|
|
56
|
+
const state = env.getState(operationPath);
|
|
57
|
+
const effectiveState = state !== null && state !== void 0 ? state : defaultValue;
|
|
58
|
+
if (!effectiveState) return;
|
|
59
|
+
const variantKey = this._findVariantKey(effectiveState);
|
|
60
|
+
if (!variantKey) return;
|
|
61
|
+
return variants[variantKey]._internal.createProxy(env, operationPath).toSnapshot();
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
},
|
|
65
|
+
applyOperation: (state, operation) => {
|
|
66
|
+
if (operation.path.toTokens().filter((t) => t !== "").length === 0) {
|
|
67
|
+
if (operation.kind !== "union.set") throw new require_shared.ValidationError(`UnionPrimitive root cannot apply operation of kind: ${operation.kind}`);
|
|
68
|
+
const payload = operation.payload;
|
|
69
|
+
if (typeof payload !== "object" || payload === null) throw new require_shared.ValidationError(`UnionPrimitive.set requires an object payload`);
|
|
70
|
+
if (payload[this._schema.discriminator] === void 0) throw new require_shared.ValidationError(`UnionPrimitive.set requires a "${this._schema.discriminator}" discriminator field`);
|
|
71
|
+
return payload;
|
|
72
|
+
}
|
|
73
|
+
if (state === void 0) throw new require_shared.ValidationError(`Cannot apply nested operation to undefined union state`);
|
|
74
|
+
const variantKey = this._findVariantKey(state);
|
|
75
|
+
if (variantKey === void 0) throw new require_shared.ValidationError(`Cannot determine active variant from state`);
|
|
76
|
+
return this._schema.variants[variantKey]._internal.applyOperation(state, operation);
|
|
77
|
+
},
|
|
78
|
+
getInitialState: () => {
|
|
79
|
+
return this._schema.defaultValue;
|
|
80
|
+
},
|
|
81
|
+
transformOperation: (clientOp, serverOp) => {
|
|
82
|
+
const clientPath = clientOp.path;
|
|
83
|
+
const serverPath = serverOp.path;
|
|
84
|
+
if (!require_OperationPath.pathsOverlap(clientPath, serverPath)) return {
|
|
85
|
+
type: "transformed",
|
|
86
|
+
operation: clientOp
|
|
87
|
+
};
|
|
88
|
+
const clientTokens = clientPath.toTokens().filter((t) => t !== "");
|
|
89
|
+
const serverTokens = serverPath.toTokens().filter((t) => t !== "");
|
|
90
|
+
if (clientTokens.length === 0 && serverTokens.length === 0) return {
|
|
91
|
+
type: "transformed",
|
|
92
|
+
operation: clientOp
|
|
93
|
+
};
|
|
94
|
+
if (serverTokens.length === 0 && serverOp.kind === "union.set") return {
|
|
95
|
+
type: "transformed",
|
|
96
|
+
operation: clientOp
|
|
97
|
+
};
|
|
98
|
+
if (clientTokens.length === 0 && clientOp.kind === "union.set") return {
|
|
99
|
+
type: "transformed",
|
|
100
|
+
operation: clientOp
|
|
101
|
+
};
|
|
102
|
+
if (clientTokens.length > 0 && serverTokens.length > 0) {
|
|
103
|
+
if (clientTokens[0] !== serverTokens[0]) return {
|
|
104
|
+
type: "transformed",
|
|
105
|
+
operation: clientOp
|
|
106
|
+
};
|
|
107
|
+
const variantKeys = Object.keys(this._schema.variants);
|
|
108
|
+
if (variantKeys.length === 0) return {
|
|
109
|
+
type: "transformed",
|
|
110
|
+
operation: clientOp
|
|
111
|
+
};
|
|
112
|
+
return this._schema.variants[variantKeys[0]]._internal.transformOperation(clientOp, serverOp);
|
|
113
|
+
}
|
|
114
|
+
return {
|
|
115
|
+
type: "transformed",
|
|
116
|
+
operation: clientOp
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
this._schema = schema;
|
|
121
|
+
}
|
|
122
|
+
/** Mark this union as required */
|
|
123
|
+
required() {
|
|
124
|
+
return new UnionPrimitive(require_objectSpread2._objectSpread2(require_objectSpread2._objectSpread2({}, this._schema), {}, { required: true }));
|
|
125
|
+
}
|
|
126
|
+
/** Set a default value for this union */
|
|
127
|
+
default(defaultValue) {
|
|
128
|
+
const merged = this._applyVariantDefaults(defaultValue);
|
|
129
|
+
return new UnionPrimitive(require_objectSpread2._objectSpread2(require_objectSpread2._objectSpread2({}, this._schema), {}, { defaultValue: merged }));
|
|
130
|
+
}
|
|
131
|
+
/** Get the discriminator field name */
|
|
132
|
+
get discriminator() {
|
|
133
|
+
return this._schema.discriminator;
|
|
134
|
+
}
|
|
135
|
+
/** Get the variants */
|
|
136
|
+
get variants() {
|
|
137
|
+
return this._schema.variants;
|
|
138
|
+
}
|
|
139
|
+
/** Find the variant key from a state value */
|
|
140
|
+
_findVariantKey(state) {
|
|
141
|
+
if (typeof state !== "object" || state === null) return;
|
|
142
|
+
const discriminatorValue = state[this._schema.discriminator];
|
|
143
|
+
for (const key in this._schema.variants) {
|
|
144
|
+
const discriminatorField = this._schema.variants[key].fields[this._schema.discriminator];
|
|
145
|
+
if (discriminatorField && discriminatorField._tag === "LiteralPrimitive") {
|
|
146
|
+
if (discriminatorField.literal === discriminatorValue) return key;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
/** Apply defaults to a variant value based on the discriminator */
|
|
151
|
+
_applyVariantDefaults(value) {
|
|
152
|
+
const variantKey = this._findVariantKey(value);
|
|
153
|
+
if (!variantKey) return value;
|
|
154
|
+
const variantPrimitive = this._schema.variants[variantKey];
|
|
155
|
+
return require_shared.applyDefaults(variantPrimitive, value);
|
|
156
|
+
}
|
|
157
|
+
};
|
|
158
|
+
function Union(options) {
|
|
159
|
+
var _options$discriminato;
|
|
160
|
+
return new UnionPrimitive({
|
|
161
|
+
required: false,
|
|
162
|
+
defaultValue: void 0,
|
|
163
|
+
discriminator: (_options$discriminato = options.discriminator) !== null && _options$discriminato !== void 0 ? _options$discriminato : "type",
|
|
164
|
+
variants: options.variants
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
//#endregion
|
|
169
|
+
exports.Union = Union;
|
|
170
|
+
exports.UnionPrimitive = UnionPrimitive;
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { InferProxy, InferSetInput, InferSnapshot, InferState, MaybeUndefined, Primitive, PrimitiveInternal } from "./shared.cjs";
|
|
2
|
+
import { StructPrimitive } from "./Struct.cjs";
|
|
3
|
+
|
|
4
|
+
//#region src/primitives/Union.d.ts
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Type constraint for union variants - must be struct primitives
|
|
8
|
+
*/
|
|
9
|
+
type UnionVariants = Record<string, StructPrimitive<any, any, any>>;
|
|
10
|
+
/**
|
|
11
|
+
* Infer the union state type from variants
|
|
12
|
+
*/
|
|
13
|
+
type InferUnionState<TVariants extends UnionVariants> = { [K in keyof TVariants]: InferState<TVariants[K]> }[keyof TVariants];
|
|
14
|
+
/**
|
|
15
|
+
* Infer the union snapshot type from variants
|
|
16
|
+
*/
|
|
17
|
+
type InferUnionSnapshot<TVariants extends UnionVariants> = { [K in keyof TVariants]: InferSnapshot<TVariants[K]> }[keyof TVariants];
|
|
18
|
+
/**
|
|
19
|
+
* Compute the input type for union.set() operations.
|
|
20
|
+
* Uses each variant's TSetInput type.
|
|
21
|
+
*/
|
|
22
|
+
type UnionSetInput<TVariants extends UnionVariants> = { [K in keyof TVariants]: InferSetInput<TVariants[K]> }[keyof TVariants];
|
|
23
|
+
/**
|
|
24
|
+
* Proxy for accessing union variants
|
|
25
|
+
*/
|
|
26
|
+
interface UnionProxy<TVariants extends UnionVariants, _TDiscriminator extends string, TRequired extends boolean = false, THasDefault extends boolean = false> {
|
|
27
|
+
/** Gets the current union value */
|
|
28
|
+
get(): MaybeUndefined<InferUnionState<TVariants>, TRequired, THasDefault>;
|
|
29
|
+
/** Sets the entire union value (applies defaults for variant fields) */
|
|
30
|
+
set(value: UnionSetInput<TVariants>): void;
|
|
31
|
+
/** Access a specific variant's proxy (assumes the variant is active) */
|
|
32
|
+
as<K$1 extends keyof TVariants>(variant: K$1): InferProxy<TVariants[K$1]>;
|
|
33
|
+
/** Pattern match on the variant type */
|
|
34
|
+
match<R>(handlers: { [K in keyof TVariants]: (proxy: InferProxy<TVariants[K$1]>) => R }): R | undefined;
|
|
35
|
+
/** Returns a readonly snapshot of the union for rendering */
|
|
36
|
+
toSnapshot(): MaybeUndefined<InferUnionSnapshot<TVariants>, TRequired, THasDefault>;
|
|
37
|
+
}
|
|
38
|
+
interface UnionPrimitiveSchema<TVariants extends UnionVariants, TDiscriminator extends string> {
|
|
39
|
+
readonly required: boolean;
|
|
40
|
+
readonly defaultValue: InferUnionState<TVariants> | undefined;
|
|
41
|
+
readonly discriminator: TDiscriminator;
|
|
42
|
+
readonly variants: TVariants;
|
|
43
|
+
}
|
|
44
|
+
declare class UnionPrimitive<TVariants extends UnionVariants, TDiscriminator extends string = "type", TRequired extends boolean = false, THasDefault extends boolean = false> implements Primitive<InferUnionState<TVariants>, UnionProxy<TVariants, TDiscriminator, TRequired, THasDefault>, TRequired, THasDefault, UnionSetInput<TVariants>, UnionSetInput<TVariants>> {
|
|
45
|
+
readonly _tag: "UnionPrimitive";
|
|
46
|
+
readonly _State: InferUnionState<TVariants>;
|
|
47
|
+
readonly _Proxy: UnionProxy<TVariants, TDiscriminator, TRequired, THasDefault>;
|
|
48
|
+
readonly _TRequired: TRequired;
|
|
49
|
+
readonly _THasDefault: THasDefault;
|
|
50
|
+
readonly TSetInput: UnionSetInput<TVariants>;
|
|
51
|
+
readonly TUpdateInput: UnionSetInput<TVariants>;
|
|
52
|
+
private readonly _schema;
|
|
53
|
+
private readonly _opDefinitions;
|
|
54
|
+
constructor(schema: UnionPrimitiveSchema<TVariants, TDiscriminator>);
|
|
55
|
+
/** Mark this union as required */
|
|
56
|
+
required(): UnionPrimitive<TVariants, TDiscriminator, true, THasDefault>;
|
|
57
|
+
/** Set a default value for this union */
|
|
58
|
+
default(defaultValue: UnionSetInput<TVariants>): UnionPrimitive<TVariants, TDiscriminator, true, true>;
|
|
59
|
+
/** Get the discriminator field name */
|
|
60
|
+
get discriminator(): TDiscriminator;
|
|
61
|
+
/** Get the variants */
|
|
62
|
+
get variants(): TVariants;
|
|
63
|
+
/** Find the variant key from a state value */
|
|
64
|
+
private _findVariantKey;
|
|
65
|
+
/** Apply defaults to a variant value based on the discriminator */
|
|
66
|
+
private _applyVariantDefaults;
|
|
67
|
+
readonly _internal: PrimitiveInternal<InferUnionState<TVariants>, UnionProxy<TVariants, TDiscriminator, TRequired, THasDefault>>;
|
|
68
|
+
}
|
|
69
|
+
/** Options for creating a Union primitive */
|
|
70
|
+
interface UnionOptions<TVariants extends UnionVariants, TDiscriminator extends string> {
|
|
71
|
+
/** The field name used to discriminate between variants (defaults to "type") */
|
|
72
|
+
readonly discriminator?: TDiscriminator;
|
|
73
|
+
/** The variant struct primitives */
|
|
74
|
+
readonly variants: TVariants;
|
|
75
|
+
}
|
|
76
|
+
/** Creates a new UnionPrimitive with the given variants */
|
|
77
|
+
declare function Union<TVariants extends UnionVariants>(options: UnionOptions<TVariants, "type">): UnionPrimitive<TVariants, "type", false, false>;
|
|
78
|
+
declare function Union<TVariants extends UnionVariants, TDiscriminator extends string>(options: UnionOptions<TVariants, TDiscriminator>): UnionPrimitive<TVariants, TDiscriminator, false, false>;
|
|
79
|
+
//#endregion
|
|
80
|
+
export { InferUnionSnapshot, InferUnionState, Union, UnionOptions, UnionPrimitive, UnionProxy, UnionSetInput, UnionVariants };
|
|
81
|
+
//# sourceMappingURL=Union.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Union.d.cts","names":[],"sources":["../../src/primitives/Union.ts"],"sourcesContent":[],"mappings":";;;;;;;AAgBA;AAKY,KALA,aAAA,GAAgB,MAKD,CAAA,MAAA,EALgB,eAKhB,CAAA,GAAA,EAAA,GAAA,EAAA,GAAA,CAAA,CAAA;;;;AACoB,KADnC,eACmC,CAAA,kBADD,aACC,CAAA,GAAA,QAArB,MAAZ,SAAY,GAAA,UAAA,CAAW,SAAX,CAAqB,CAArB,CAAA,CAAA,EAClB,CAAA,MAAA,SAAA,CAAA;;AAKR;;AACc,KADF,kBACE,CAAA,kBADmC,aACnC,CAAA,GAAA,QAA0B,MAA1B,SAA0B,GAAd,aAAc,CAAA,SAAA,CAAU,CAAV,CAAA,CAAA,EAAU,CAAA,MAC1C,SAD0C,CAAA;;;;AAOlD;AAA4C,KAAhC,aAAgC,CAAA,kBAAA,aAAA,CAAA,GAAA,QAC9B,MAAA,SAAA,GAAY,aAAZ,CAA0B,SAA1B,CAAoC,CAApC,CAAA,CAAA,EAA0B,CAAA,MAChC,SADgC,CAAA;;;;AACvB,UAKA,UALA,CAAA,kBAK6B,aAL7B,EAAA,wBAAA,MAAA,EAAA,kBAAA,OAAA,GAAA,KAAA,EAAA,oBAAA,OAAA,GAAA,KAAA,CAAA,CAAA;EAKA;EAA6B,GAAA,EAAA,EAErC,cAFqC,CAEtB,eAFsB,CAEN,SAFM,CAAA,EAEM,SAFN,EAEiB,WAFjB,CAAA;EAEN;EAAhB,GAAA,CAAA,KAAA,EAGX,aAHW,CAGG,SAHH,CAAA,CAAA,EAAA,IAAA;EAA4B;EAAW,EAAA,CAAA,YAAA,MAM1C,SAN0C,CAAA,CAAA,OAAA,EAMtB,GANsB,CAAA,EAMlB,UANkB,CAMP,SANO,CAMG,GANH,CAAA,CAAA;EAAtD;EAGkB,KAAA,CAAA,CAAA,CAAA,CAAA,QAAA,EAAA,QAAd,MAOG,SAPH,GAAA,CAAA,KAAA,EAOuB,UAPvB,CAOkC,SAPlC,CAO4C,GAP5C,CAAA,CAAA,EAAA,GAOoD,CAPpD,EAGQ,CAAA,EAKf,CALe,GAAA,SAAA;EAAoB;EAAe,UAAA,EAAA,EAQxC,cARwC,CAQzB,kBARyB,CAQN,SARM,CAAA,EAQM,SARN,EAQiB,WARjB,CAAA;;UAW9C,oBAXmC,CAAA,kBAWI,aAXJ,EAAA,uBAAA,MAAA,CAAA,CAAA;EAI7B,SAAA,QAAA,EAAA,OAAA;EAA+B,SAAA,YAAA,EAStB,eATsB,CASN,SATM,CAAA,GAAA,SAAA;EAAU,SAAA,aAAA,EAU/B,cAV+B;EAArB,SAAA,QAAA,EAWf,SAXe;;AAC9B,cAaO,cAbP,CAAA,kBAawC,aAbxC,EAAA,uBAAA,MAAA,GAAA,MAAA,EAAA,kBAAA,OAAA,GAAA,KAAA,EAAA,oBAAA,OAAA,GAAA,KAAA,CAAA,YAcO,SAdP,CAciB,eAdjB,CAciC,SAdjC,CAAA,EAc6C,UAd7C,CAcwD,SAdxD,EAcmE,cAdnE,EAcmF,SAdnF,EAc8F,WAd9F,CAAA,EAc4G,SAd5G,EAcuH,WAdvH,EAcoI,aAdpI,CAckJ,SAdlJ,CAAA,EAc8J,aAd9J,CAc4K,SAd5K,CAAA,CAAA,CAAA;EAG4C,SAAA,IAAA,EAAA,gBAAA;EAAnB,SAAA,MAAA,EAcX,eAdW,CAcK,SAdL,CAAA;EAA+B,SAAA,MAAA,EAe1C,UAf0C,CAe/B,SAf+B,EAepB,cAfoB,EAeJ,SAfI,EAeO,WAfP,CAAA;EAAW,SAAA,UAAA,EAgBjD,SAhBiD;EAAzD,SAAA,YAAA,EAiBU,WAjBV;EAAc,SAAA,SAAA,EAkBP,aAlBO,CAkBO,SAlBP,CAAA;EAGpB,SAAA,YAAA,EAgBgB,aAhBI,CAgBU,SAhBV,CAAA;EAAmB,iBAAA,OAAA;EAER,iBAAA,cAAA;EAAhB,WAAA,CAAA,MAAA,EA2BH,oBA3BG,CA2BkB,SA3BlB,EA2B6B,cA3B7B,CAAA;EACC;EACL,QAAA,CAAA,CAAA,EA8BP,cA9BO,CA8BQ,SA9BR,EA8BmB,cA9BnB,EAAA,IAAA,EA8ByC,WA9BzC,CAAA;EAAS;EAGjB,OAAA,CAAA,YAAc,EAmCH,aAnCG,CAmCW,SAnCX,CAAA,CAAA,EAmCwB,cAnCxB,CAmCuC,SAnCvC,EAmCkD,cAnClD,EAAA,IAAA,EAAA,IAAA,CAAA;EAAmB;EACP,IAAA,aAAA,CAAA,CAAA,EA4ChB,cA5CgB;EAAhB;EAAuC,IAAA,QAAA,CAAA,CAAA,EAiD5C,SAjD4C;EAAW;EAAgB,QAAA,eAAA;EAAW;EAAjD,QAAA,qBAAA;EAA+D,SAAA,SAAA,EAqF5F,iBArF4F,CAqF1E,eArF0E,CAqF1D,SArF0D,CAAA,EAqF9C,UArF8C,CAqFnC,SArFmC,EAqFxB,cArFwB,EAqFR,SArFQ,EAqFG,WArFH,CAAA,CAAA;;;AAAwB,UAoQzH,YApQyH,CAAA,kBAoQ1F,aApQ0F,EAAA,uBAAA,MAAA,CAAA,CAAA;EAAwC;EAAd,SAAA,aAAA,CAAA,EAsQzI,cAtQyI;EAGhI;EAAhB,SAAA,QAAA,EAqQC,SArQD;;;AACsC,iBAwQ1C,KAxQ0C,CAAA,kBAwQlB,aAxQkB,CAAA,CAAA,OAAA,EAyQ/C,YAzQ+C,CAyQlC,SAzQkC,EAAA,MAAA,CAAA,CAAA,EA0QvD,cA1QuD,CA0QxC,SA1QwC,EAAA,MAAA,EAAA,KAAA,EAAA,KAAA,CAAA;AAAW,iBA2QrD,KA3QqD,CAAA,kBA2Q7B,aA3Q6B,EAAA,uBAAA,MAAA,CAAA,CAAA,OAAA,EA4Q1D,YA5Q0D,CA4Q7C,SA5Q6C,EA4QlC,cA5QkC,CAAA,CAAA,EA6QlE,cA7QkE,CA6QnD,SA7QmD,EA6QxC,cA7QwC,EAAA,KAAA,EAAA,KAAA,CAAA"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { InferProxy, InferSetInput, InferSnapshot, InferState, MaybeUndefined, Primitive, PrimitiveInternal } from "./shared.mjs";
|
|
2
|
+
import { StructPrimitive } from "./Struct.mjs";
|
|
3
|
+
import "../Primitive.mjs";
|
|
4
|
+
|
|
5
|
+
//#region src/primitives/Union.d.ts
|
|
6
|
+
/**
|
|
7
|
+
* Type constraint for union variants - must be struct primitives
|
|
8
|
+
*/
|
|
9
|
+
type UnionVariants = Record<string, StructPrimitive<any, any, any>>;
|
|
10
|
+
/**
|
|
11
|
+
* Infer the union state type from variants
|
|
12
|
+
*/
|
|
13
|
+
type InferUnionState<TVariants extends UnionVariants> = { [K in keyof TVariants]: InferState<TVariants[K]> }[keyof TVariants];
|
|
14
|
+
/**
|
|
15
|
+
* Infer the union snapshot type from variants
|
|
16
|
+
*/
|
|
17
|
+
type InferUnionSnapshot<TVariants extends UnionVariants> = { [K in keyof TVariants]: InferSnapshot<TVariants[K]> }[keyof TVariants];
|
|
18
|
+
/**
|
|
19
|
+
* Compute the input type for union.set() operations.
|
|
20
|
+
* Uses each variant's TSetInput type.
|
|
21
|
+
*/
|
|
22
|
+
type UnionSetInput<TVariants extends UnionVariants> = { [K in keyof TVariants]: InferSetInput<TVariants[K]> }[keyof TVariants];
|
|
23
|
+
/**
|
|
24
|
+
* Proxy for accessing union variants
|
|
25
|
+
*/
|
|
26
|
+
interface UnionProxy<TVariants extends UnionVariants, _TDiscriminator extends string, TRequired extends boolean = false, THasDefault extends boolean = false> {
|
|
27
|
+
/** Gets the current union value */
|
|
28
|
+
get(): MaybeUndefined<InferUnionState<TVariants>, TRequired, THasDefault>;
|
|
29
|
+
/** Sets the entire union value (applies defaults for variant fields) */
|
|
30
|
+
set(value: UnionSetInput<TVariants>): void;
|
|
31
|
+
/** Access a specific variant's proxy (assumes the variant is active) */
|
|
32
|
+
as<K$1 extends keyof TVariants>(variant: K$1): InferProxy<TVariants[K$1]>;
|
|
33
|
+
/** Pattern match on the variant type */
|
|
34
|
+
match<R>(handlers: { [K in keyof TVariants]: (proxy: InferProxy<TVariants[K$1]>) => R }): R | undefined;
|
|
35
|
+
/** Returns a readonly snapshot of the union for rendering */
|
|
36
|
+
toSnapshot(): MaybeUndefined<InferUnionSnapshot<TVariants>, TRequired, THasDefault>;
|
|
37
|
+
}
|
|
38
|
+
interface UnionPrimitiveSchema<TVariants extends UnionVariants, TDiscriminator extends string> {
|
|
39
|
+
readonly required: boolean;
|
|
40
|
+
readonly defaultValue: InferUnionState<TVariants> | undefined;
|
|
41
|
+
readonly discriminator: TDiscriminator;
|
|
42
|
+
readonly variants: TVariants;
|
|
43
|
+
}
|
|
44
|
+
declare class UnionPrimitive<TVariants extends UnionVariants, TDiscriminator extends string = "type", TRequired extends boolean = false, THasDefault extends boolean = false> implements Primitive<InferUnionState<TVariants>, UnionProxy<TVariants, TDiscriminator, TRequired, THasDefault>, TRequired, THasDefault, UnionSetInput<TVariants>, UnionSetInput<TVariants>> {
|
|
45
|
+
readonly _tag: "UnionPrimitive";
|
|
46
|
+
readonly _State: InferUnionState<TVariants>;
|
|
47
|
+
readonly _Proxy: UnionProxy<TVariants, TDiscriminator, TRequired, THasDefault>;
|
|
48
|
+
readonly _TRequired: TRequired;
|
|
49
|
+
readonly _THasDefault: THasDefault;
|
|
50
|
+
readonly TSetInput: UnionSetInput<TVariants>;
|
|
51
|
+
readonly TUpdateInput: UnionSetInput<TVariants>;
|
|
52
|
+
private readonly _schema;
|
|
53
|
+
private readonly _opDefinitions;
|
|
54
|
+
constructor(schema: UnionPrimitiveSchema<TVariants, TDiscriminator>);
|
|
55
|
+
/** Mark this union as required */
|
|
56
|
+
required(): UnionPrimitive<TVariants, TDiscriminator, true, THasDefault>;
|
|
57
|
+
/** Set a default value for this union */
|
|
58
|
+
default(defaultValue: UnionSetInput<TVariants>): UnionPrimitive<TVariants, TDiscriminator, true, true>;
|
|
59
|
+
/** Get the discriminator field name */
|
|
60
|
+
get discriminator(): TDiscriminator;
|
|
61
|
+
/** Get the variants */
|
|
62
|
+
get variants(): TVariants;
|
|
63
|
+
/** Find the variant key from a state value */
|
|
64
|
+
private _findVariantKey;
|
|
65
|
+
/** Apply defaults to a variant value based on the discriminator */
|
|
66
|
+
private _applyVariantDefaults;
|
|
67
|
+
readonly _internal: PrimitiveInternal<InferUnionState<TVariants>, UnionProxy<TVariants, TDiscriminator, TRequired, THasDefault>>;
|
|
68
|
+
}
|
|
69
|
+
/** Options for creating a Union primitive */
|
|
70
|
+
interface UnionOptions<TVariants extends UnionVariants, TDiscriminator extends string> {
|
|
71
|
+
/** The field name used to discriminate between variants (defaults to "type") */
|
|
72
|
+
readonly discriminator?: TDiscriminator;
|
|
73
|
+
/** The variant struct primitives */
|
|
74
|
+
readonly variants: TVariants;
|
|
75
|
+
}
|
|
76
|
+
/** Creates a new UnionPrimitive with the given variants */
|
|
77
|
+
declare function Union<TVariants extends UnionVariants>(options: UnionOptions<TVariants, "type">): UnionPrimitive<TVariants, "type", false, false>;
|
|
78
|
+
declare function Union<TVariants extends UnionVariants, TDiscriminator extends string>(options: UnionOptions<TVariants, TDiscriminator>): UnionPrimitive<TVariants, TDiscriminator, false, false>;
|
|
79
|
+
//#endregion
|
|
80
|
+
export { InferUnionSnapshot, InferUnionState, Union, UnionOptions, UnionPrimitive, UnionProxy, UnionSetInput, UnionVariants };
|
|
81
|
+
//# sourceMappingURL=Union.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Union.d.mts","names":[],"sources":["../../src/primitives/Union.ts"],"sourcesContent":[],"mappings":"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"}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import { _defineProperty } from "../_virtual/_@oxc-project_runtime@0.103.0/helpers/defineProperty.mjs";
|
|
2
|
+
import { _objectSpread2 } from "../_virtual/_@oxc-project_runtime@0.103.0/helpers/objectSpread2.mjs";
|
|
3
|
+
import { ValidationError, applyDefaults } from "./shared.mjs";
|
|
4
|
+
import { make } from "../OperationDefinition.mjs";
|
|
5
|
+
import { pathsOverlap } from "../OperationPath.mjs";
|
|
6
|
+
import { fromDefinition } from "../Operation.mjs";
|
|
7
|
+
import "../Primitive.mjs";
|
|
8
|
+
import { Schema } from "effect";
|
|
9
|
+
|
|
10
|
+
//#region src/primitives/Union.ts
|
|
11
|
+
var UnionPrimitive = class UnionPrimitive {
|
|
12
|
+
constructor(schema) {
|
|
13
|
+
_defineProperty(this, "_tag", "UnionPrimitive");
|
|
14
|
+
_defineProperty(this, "_State", void 0);
|
|
15
|
+
_defineProperty(this, "_Proxy", void 0);
|
|
16
|
+
_defineProperty(this, "_TRequired", void 0);
|
|
17
|
+
_defineProperty(this, "_THasDefault", void 0);
|
|
18
|
+
_defineProperty(this, "TSetInput", void 0);
|
|
19
|
+
_defineProperty(this, "TUpdateInput", void 0);
|
|
20
|
+
_defineProperty(this, "_schema", void 0);
|
|
21
|
+
_defineProperty(this, "_opDefinitions", { set: make({
|
|
22
|
+
kind: "union.set",
|
|
23
|
+
payload: Schema.Unknown,
|
|
24
|
+
target: Schema.Unknown,
|
|
25
|
+
apply: (payload) => payload
|
|
26
|
+
}) });
|
|
27
|
+
_defineProperty(this, "_internal", {
|
|
28
|
+
createProxy: (env, operationPath) => {
|
|
29
|
+
const variants = this._schema.variants;
|
|
30
|
+
const defaultValue = this._schema.defaultValue;
|
|
31
|
+
return {
|
|
32
|
+
get: () => {
|
|
33
|
+
const state = env.getState(operationPath);
|
|
34
|
+
return state !== null && state !== void 0 ? state : defaultValue;
|
|
35
|
+
},
|
|
36
|
+
set: (value) => {
|
|
37
|
+
const merged = this._applyVariantDefaults(value);
|
|
38
|
+
env.addOperation(fromDefinition(operationPath, this._opDefinitions.set, merged));
|
|
39
|
+
},
|
|
40
|
+
as: (variant) => {
|
|
41
|
+
const variantPrimitive = variants[variant];
|
|
42
|
+
if (!variantPrimitive) throw new ValidationError(`Unknown variant: ${globalThis.String(variant)}`);
|
|
43
|
+
return variantPrimitive._internal.createProxy(env, operationPath);
|
|
44
|
+
},
|
|
45
|
+
match: (handlers) => {
|
|
46
|
+
const state = env.getState(operationPath);
|
|
47
|
+
if (!state) return void 0;
|
|
48
|
+
const variantKey = this._findVariantKey(state);
|
|
49
|
+
if (!variantKey) return void 0;
|
|
50
|
+
const handler = handlers[variantKey];
|
|
51
|
+
if (!handler) return void 0;
|
|
52
|
+
return handler(variants[variantKey]._internal.createProxy(env, operationPath));
|
|
53
|
+
},
|
|
54
|
+
toSnapshot: () => {
|
|
55
|
+
const state = env.getState(operationPath);
|
|
56
|
+
const effectiveState = state !== null && state !== void 0 ? state : defaultValue;
|
|
57
|
+
if (!effectiveState) return;
|
|
58
|
+
const variantKey = this._findVariantKey(effectiveState);
|
|
59
|
+
if (!variantKey) return;
|
|
60
|
+
return variants[variantKey]._internal.createProxy(env, operationPath).toSnapshot();
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
},
|
|
64
|
+
applyOperation: (state, operation) => {
|
|
65
|
+
if (operation.path.toTokens().filter((t) => t !== "").length === 0) {
|
|
66
|
+
if (operation.kind !== "union.set") throw new ValidationError(`UnionPrimitive root cannot apply operation of kind: ${operation.kind}`);
|
|
67
|
+
const payload = operation.payload;
|
|
68
|
+
if (typeof payload !== "object" || payload === null) throw new ValidationError(`UnionPrimitive.set requires an object payload`);
|
|
69
|
+
if (payload[this._schema.discriminator] === void 0) throw new ValidationError(`UnionPrimitive.set requires a "${this._schema.discriminator}" discriminator field`);
|
|
70
|
+
return payload;
|
|
71
|
+
}
|
|
72
|
+
if (state === void 0) throw new ValidationError(`Cannot apply nested operation to undefined union state`);
|
|
73
|
+
const variantKey = this._findVariantKey(state);
|
|
74
|
+
if (variantKey === void 0) throw new ValidationError(`Cannot determine active variant from state`);
|
|
75
|
+
return this._schema.variants[variantKey]._internal.applyOperation(state, operation);
|
|
76
|
+
},
|
|
77
|
+
getInitialState: () => {
|
|
78
|
+
return this._schema.defaultValue;
|
|
79
|
+
},
|
|
80
|
+
transformOperation: (clientOp, serverOp) => {
|
|
81
|
+
const clientPath = clientOp.path;
|
|
82
|
+
const serverPath = serverOp.path;
|
|
83
|
+
if (!pathsOverlap(clientPath, serverPath)) return {
|
|
84
|
+
type: "transformed",
|
|
85
|
+
operation: clientOp
|
|
86
|
+
};
|
|
87
|
+
const clientTokens = clientPath.toTokens().filter((t) => t !== "");
|
|
88
|
+
const serverTokens = serverPath.toTokens().filter((t) => t !== "");
|
|
89
|
+
if (clientTokens.length === 0 && serverTokens.length === 0) return {
|
|
90
|
+
type: "transformed",
|
|
91
|
+
operation: clientOp
|
|
92
|
+
};
|
|
93
|
+
if (serverTokens.length === 0 && serverOp.kind === "union.set") return {
|
|
94
|
+
type: "transformed",
|
|
95
|
+
operation: clientOp
|
|
96
|
+
};
|
|
97
|
+
if (clientTokens.length === 0 && clientOp.kind === "union.set") return {
|
|
98
|
+
type: "transformed",
|
|
99
|
+
operation: clientOp
|
|
100
|
+
};
|
|
101
|
+
if (clientTokens.length > 0 && serverTokens.length > 0) {
|
|
102
|
+
if (clientTokens[0] !== serverTokens[0]) return {
|
|
103
|
+
type: "transformed",
|
|
104
|
+
operation: clientOp
|
|
105
|
+
};
|
|
106
|
+
const variantKeys = Object.keys(this._schema.variants);
|
|
107
|
+
if (variantKeys.length === 0) return {
|
|
108
|
+
type: "transformed",
|
|
109
|
+
operation: clientOp
|
|
110
|
+
};
|
|
111
|
+
return this._schema.variants[variantKeys[0]]._internal.transformOperation(clientOp, serverOp);
|
|
112
|
+
}
|
|
113
|
+
return {
|
|
114
|
+
type: "transformed",
|
|
115
|
+
operation: clientOp
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
this._schema = schema;
|
|
120
|
+
}
|
|
121
|
+
/** Mark this union as required */
|
|
122
|
+
required() {
|
|
123
|
+
return new UnionPrimitive(_objectSpread2(_objectSpread2({}, this._schema), {}, { required: true }));
|
|
124
|
+
}
|
|
125
|
+
/** Set a default value for this union */
|
|
126
|
+
default(defaultValue) {
|
|
127
|
+
const merged = this._applyVariantDefaults(defaultValue);
|
|
128
|
+
return new UnionPrimitive(_objectSpread2(_objectSpread2({}, this._schema), {}, { defaultValue: merged }));
|
|
129
|
+
}
|
|
130
|
+
/** Get the discriminator field name */
|
|
131
|
+
get discriminator() {
|
|
132
|
+
return this._schema.discriminator;
|
|
133
|
+
}
|
|
134
|
+
/** Get the variants */
|
|
135
|
+
get variants() {
|
|
136
|
+
return this._schema.variants;
|
|
137
|
+
}
|
|
138
|
+
/** Find the variant key from a state value */
|
|
139
|
+
_findVariantKey(state) {
|
|
140
|
+
if (typeof state !== "object" || state === null) return;
|
|
141
|
+
const discriminatorValue = state[this._schema.discriminator];
|
|
142
|
+
for (const key in this._schema.variants) {
|
|
143
|
+
const discriminatorField = this._schema.variants[key].fields[this._schema.discriminator];
|
|
144
|
+
if (discriminatorField && discriminatorField._tag === "LiteralPrimitive") {
|
|
145
|
+
if (discriminatorField.literal === discriminatorValue) return key;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
/** Apply defaults to a variant value based on the discriminator */
|
|
150
|
+
_applyVariantDefaults(value) {
|
|
151
|
+
const variantKey = this._findVariantKey(value);
|
|
152
|
+
if (!variantKey) return value;
|
|
153
|
+
const variantPrimitive = this._schema.variants[variantKey];
|
|
154
|
+
return applyDefaults(variantPrimitive, value);
|
|
155
|
+
}
|
|
156
|
+
};
|
|
157
|
+
function Union(options) {
|
|
158
|
+
var _options$discriminato;
|
|
159
|
+
return new UnionPrimitive({
|
|
160
|
+
required: false,
|
|
161
|
+
defaultValue: void 0,
|
|
162
|
+
discriminator: (_options$discriminato = options.discriminator) !== null && _options$discriminato !== void 0 ? _options$discriminato : "type",
|
|
163
|
+
variants: options.variants
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
//#endregion
|
|
168
|
+
export { Union, UnionPrimitive };
|
|
169
|
+
//# sourceMappingURL=Union.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Union.mjs","names":["OperationDefinition.make","Operation.fromDefinition","OperationPath.pathsOverlap"],"sources":["../../src/primitives/Union.ts"],"sourcesContent":["import { Effect, Schema } from \"effect\";\nimport * as OperationDefinition from \"../OperationDefinition\";\nimport * as Operation from \"../Operation\";\nimport * as OperationPath from \"../OperationPath\";\nimport * as ProxyEnvironment from \"../ProxyEnvironment\";\nimport * as Transform from \"../Transform\";\nimport type { Primitive, PrimitiveInternal, MaybeUndefined, AnyPrimitive, InferState, InferProxy, InferSnapshot, InferSetInput } from \"../Primitive\";\nimport { ValidationError } from \"../Primitive\";\nimport { LiteralPrimitive } from \"./Literal\";\nimport { StructPrimitive, InferStructState } from \"./Struct\";\nimport { runValidators, applyDefaults } from \"./shared\";\n\n\n/**\n * Type constraint for union variants - must be struct primitives\n */\nexport type UnionVariants = Record<string, StructPrimitive<any, any, any>>;\n\n/**\n * Infer the union state type from variants\n */\nexport type InferUnionState<TVariants extends UnionVariants> = {\n [K in keyof TVariants]: InferState<TVariants[K]>;\n}[keyof TVariants];\n\n/**\n * Infer the union snapshot type from variants\n */\nexport type InferUnionSnapshot<TVariants extends UnionVariants> = {\n [K in keyof TVariants]: InferSnapshot<TVariants[K]>;\n}[keyof TVariants];\n\n/**\n * Compute the input type for union.set() operations.\n * Uses each variant's TSetInput type.\n */\nexport type UnionSetInput<TVariants extends UnionVariants> = {\n [K in keyof TVariants]: InferSetInput<TVariants[K]>;\n}[keyof TVariants];\n\n/**\n * Proxy for accessing union variants\n */\nexport interface UnionProxy<TVariants extends UnionVariants, _TDiscriminator extends string, TRequired extends boolean = false, THasDefault extends boolean = false> {\n /** Gets the current union value */\n get(): MaybeUndefined<InferUnionState<TVariants>, TRequired, THasDefault>;\n \n /** Sets the entire union value (applies defaults for variant fields) */\n set(value: UnionSetInput<TVariants>): void;\n \n /** Access a specific variant's proxy (assumes the variant is active) */\n as<K extends keyof TVariants>(variant: K): InferProxy<TVariants[K]>;\n \n /** Pattern match on the variant type */\n match<R>(handlers: {\n [K in keyof TVariants]: (proxy: InferProxy<TVariants[K]>) => R;\n }): R | undefined;\n \n /** Returns a readonly snapshot of the union for rendering */\n toSnapshot(): MaybeUndefined<InferUnionSnapshot<TVariants>, TRequired, THasDefault>;\n}\n\ninterface UnionPrimitiveSchema<TVariants extends UnionVariants, TDiscriminator extends string> {\n readonly required: boolean;\n readonly defaultValue: InferUnionState<TVariants> | undefined;\n readonly discriminator: TDiscriminator;\n readonly variants: TVariants;\n}\n\nexport class UnionPrimitive<TVariants extends UnionVariants, TDiscriminator extends string = \"type\", TRequired extends boolean = false, THasDefault extends boolean = false>\n implements Primitive<InferUnionState<TVariants>, UnionProxy<TVariants, TDiscriminator, TRequired, THasDefault>, TRequired, THasDefault, UnionSetInput<TVariants>, UnionSetInput<TVariants>>\n{\n readonly _tag = \"UnionPrimitive\" as const;\n readonly _State!: InferUnionState<TVariants>;\n readonly _Proxy!: UnionProxy<TVariants, TDiscriminator, TRequired, THasDefault>;\n readonly _TRequired!: TRequired;\n readonly _THasDefault!: THasDefault;\n readonly TSetInput!: UnionSetInput<TVariants>;\n readonly TUpdateInput!: UnionSetInput<TVariants>;\n\n private readonly _schema: UnionPrimitiveSchema<TVariants, TDiscriminator>;\n\n private readonly _opDefinitions = {\n set: OperationDefinition.make({\n kind: \"union.set\" as const,\n payload: Schema.Unknown,\n target: Schema.Unknown,\n apply: (payload) => payload,\n }),\n };\n\n constructor(schema: UnionPrimitiveSchema<TVariants, TDiscriminator>) {\n this._schema = schema;\n }\n\n /** Mark this union as required */\n required(): UnionPrimitive<TVariants, TDiscriminator, true, THasDefault> {\n return new UnionPrimitive({\n ...this._schema,\n required: true,\n });\n }\n\n /** Set a default value for this union */\n default(defaultValue: UnionSetInput<TVariants>): UnionPrimitive<TVariants, TDiscriminator, true, true> {\n // Apply defaults to the variant\n const merged = this._applyVariantDefaults(defaultValue as Partial<InferUnionState<TVariants>>);\n return new UnionPrimitive({\n ...this._schema,\n defaultValue: merged,\n });\n }\n\n /** Get the discriminator field name */\n get discriminator(): TDiscriminator {\n return this._schema.discriminator;\n }\n\n /** Get the variants */\n get variants(): TVariants {\n return this._schema.variants;\n }\n\n /** Find the variant key from a state value */\n private _findVariantKey(state: InferUnionState<TVariants>): keyof TVariants | undefined {\n if (typeof state !== \"object\" || state === null) {\n return undefined;\n }\n const discriminatorValue = (state as Record<string, unknown>)[this._schema.discriminator];\n \n // Find the variant that matches this discriminator value\n for (const key in this._schema.variants) {\n const variant = this._schema.variants[key]!;\n const discriminatorField = variant.fields[this._schema.discriminator];\n if (discriminatorField && discriminatorField._tag === \"LiteralPrimitive\") {\n const literalPrimitive = discriminatorField as LiteralPrimitive<any, any, any>;\n if (literalPrimitive.literal === discriminatorValue) {\n return key;\n }\n }\n }\n return undefined;\n }\n\n /** Apply defaults to a variant value based on the discriminator */\n private _applyVariantDefaults(value: Partial<InferUnionState<TVariants>>): InferUnionState<TVariants> {\n const variantKey = this._findVariantKey(value as InferUnionState<TVariants>);\n if (!variantKey) {\n return value as InferUnionState<TVariants>;\n }\n \n const variantPrimitive = this._schema.variants[variantKey]!;\n return applyDefaults(variantPrimitive as AnyPrimitive, value) as InferUnionState<TVariants>;\n }\n\n readonly _internal: PrimitiveInternal<InferUnionState<TVariants>, UnionProxy<TVariants, TDiscriminator, TRequired, THasDefault>> = {\n createProxy: (\n env: ProxyEnvironment.ProxyEnvironment,\n operationPath: OperationPath.OperationPath\n ): UnionProxy<TVariants, TDiscriminator, TRequired, THasDefault> => {\n const variants = this._schema.variants;\n const defaultValue = this._schema.defaultValue;\n\n return {\n get: (): MaybeUndefined<InferUnionState<TVariants>, TRequired, THasDefault> => {\n const state = env.getState(operationPath) as InferUnionState<TVariants> | undefined;\n return (state ?? defaultValue) as MaybeUndefined<InferUnionState<TVariants>, TRequired, THasDefault>;\n },\n set: (value: UnionSetInput<TVariants>) => {\n // Apply defaults for the variant\n const merged = this._applyVariantDefaults(value as Partial<InferUnionState<TVariants>>);\n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.set, merged)\n );\n },\n as: <K extends keyof TVariants>(variant: K): InferProxy<TVariants[K]> => {\n const variantPrimitive = variants[variant];\n if (!variantPrimitive) {\n throw new ValidationError(`Unknown variant: ${globalThis.String(variant)}`);\n }\n return variantPrimitive._internal.createProxy(env, operationPath) as InferProxy<TVariants[K]>;\n },\n match: <R,>(handlers: { [K in keyof TVariants]: (proxy: InferProxy<TVariants[K]>) => R }): R | undefined => {\n const state = env.getState(operationPath) as InferUnionState<TVariants> | undefined;\n if (!state) return undefined;\n \n const variantKey = this._findVariantKey(state);\n if (!variantKey) return undefined;\n \n const handler = handlers[variantKey];\n if (!handler) return undefined;\n \n const variantProxy = variants[variantKey]!._internal.createProxy(env, operationPath) as InferProxy<TVariants[typeof variantKey]>;\n return handler(variantProxy);\n },\n toSnapshot: (): MaybeUndefined<InferUnionSnapshot<TVariants>, TRequired, THasDefault> => {\n const state = env.getState(operationPath) as InferUnionState<TVariants> | undefined;\n const effectiveState = state ?? defaultValue;\n if (!effectiveState) {\n return undefined as MaybeUndefined<InferUnionSnapshot<TVariants>, TRequired, THasDefault>;\n }\n \n const variantKey = this._findVariantKey(effectiveState);\n if (!variantKey) {\n return undefined as MaybeUndefined<InferUnionSnapshot<TVariants>, TRequired, THasDefault>;\n }\n \n const variantPrimitive = variants[variantKey]!;\n const variantProxy = variantPrimitive._internal.createProxy(env, operationPath);\n return (variantProxy as unknown as { toSnapshot(): InferUnionSnapshot<TVariants> }).toSnapshot() as MaybeUndefined<InferUnionSnapshot<TVariants>, TRequired, THasDefault>;\n },\n };\n },\n\n applyOperation: (\n state: InferUnionState<TVariants> | undefined,\n operation: Operation.Operation<any, any, any>\n ): InferUnionState<TVariants> => {\n const path = operation.path;\n const tokens = path.toTokens().filter((t: string) => t !== \"\");\n\n // If path is empty, this is a union-level operation\n if (tokens.length === 0) {\n if (operation.kind !== \"union.set\") {\n throw new ValidationError(`UnionPrimitive root cannot apply operation of kind: ${operation.kind}`);\n }\n\n const payload = operation.payload;\n if (typeof payload !== \"object\" || payload === null) {\n throw new ValidationError(`UnionPrimitive.set requires an object payload`);\n }\n\n // Validate that the discriminator field exists and matches a variant\n const discriminatorValue = (payload as Record<string, unknown>)[this._schema.discriminator];\n if (discriminatorValue === undefined) {\n throw new ValidationError(`UnionPrimitive.set requires a \"${this._schema.discriminator}\" discriminator field`);\n }\n\n return payload as InferUnionState<TVariants>;\n }\n\n // Otherwise, delegate to the active variant\n // We need to determine which variant is active based on current state\n if (state === undefined) {\n throw new ValidationError(`Cannot apply nested operation to undefined union state`);\n }\n\n const variantKey = this._findVariantKey(state);\n if (variantKey === undefined) {\n throw new ValidationError(`Cannot determine active variant from state`);\n }\n\n const variantPrimitive = this._schema.variants[variantKey]!;\n const newState = variantPrimitive._internal.applyOperation(\n state as InferState<typeof variantPrimitive>,\n operation\n );\n\n return newState as InferUnionState<TVariants>;\n },\n\n getInitialState: (): InferUnionState<TVariants> | undefined => {\n return this._schema.defaultValue;\n },\n\n transformOperation: (\n clientOp: Operation.Operation<any, any, any>,\n serverOp: Operation.Operation<any, any, any>\n ): Transform.TransformResult => {\n const clientPath = clientOp.path;\n const serverPath = serverOp.path;\n\n // If paths don't overlap at all, no transformation needed\n if (!OperationPath.pathsOverlap(clientPath, serverPath)) {\n return { type: \"transformed\", operation: clientOp };\n }\n\n const clientTokens = clientPath.toTokens().filter((t: string) => t !== \"\");\n const serverTokens = serverPath.toTokens().filter((t: string) => t !== \"\");\n\n // If both are at root level (union.set operations)\n if (clientTokens.length === 0 && serverTokens.length === 0) {\n // Client wins (last-write-wins)\n return { type: \"transformed\", operation: clientOp };\n }\n\n // If server set entire union and client is updating a field\n if (serverTokens.length === 0 && serverOp.kind === \"union.set\") {\n // Client's field operation proceeds - optimistic update\n // Server will validate/reject if needed\n return { type: \"transformed\", operation: clientOp };\n }\n\n // If client set entire union and server is updating a field\n if (clientTokens.length === 0 && clientOp.kind === \"union.set\") {\n // Client's union.set supersedes server's field update\n return { type: \"transformed\", operation: clientOp };\n }\n\n // Both operations target fields within the union\n // Since union variants are struct primitives, delegate to the first variant\n // that matches (they all should have the same field structure for the overlapping field)\n if (clientTokens.length > 0 && serverTokens.length > 0) {\n const clientField = clientTokens[0];\n const serverField = serverTokens[0];\n\n // Different fields - no conflict\n if (clientField !== serverField) {\n return { type: \"transformed\", operation: clientOp };\n }\n\n // Same field - delegate to a variant (use first variant as they share structure)\n const variantKeys = Object.keys(this._schema.variants);\n if (variantKeys.length === 0) {\n return { type: \"transformed\", operation: clientOp };\n }\n\n const firstVariant = this._schema.variants[variantKeys[0]!]!;\n const result = firstVariant._internal.transformOperation(clientOp, serverOp);\n\n return result;\n }\n\n // Default: no transformation needed\n return { type: \"transformed\", operation: clientOp };\n },\n };\n}\n\n/** Options for creating a Union primitive */\nexport interface UnionOptions<TVariants extends UnionVariants, TDiscriminator extends string> {\n /** The field name used to discriminate between variants (defaults to \"type\") */\n readonly discriminator?: TDiscriminator;\n /** The variant struct primitives */\n readonly variants: TVariants;\n}\n\n/** Creates a new UnionPrimitive with the given variants */\nexport function Union<TVariants extends UnionVariants>(\n options: UnionOptions<TVariants, \"type\">\n): UnionPrimitive<TVariants, \"type\", false, false>;\nexport function Union<TVariants extends UnionVariants, TDiscriminator extends string>(\n options: UnionOptions<TVariants, TDiscriminator>\n): UnionPrimitive<TVariants, TDiscriminator, false, false>;\nexport function Union<TVariants extends UnionVariants, TDiscriminator extends string = \"type\">(\n options: UnionOptions<TVariants, TDiscriminator>\n): UnionPrimitive<TVariants, TDiscriminator, false, false> {\n const discriminator = (options.discriminator ?? \"type\") as TDiscriminator;\n return new UnionPrimitive({\n required: false,\n defaultValue: undefined,\n discriminator,\n variants: options.variants,\n });\n}\n\n"],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
const require_defineProperty = require('../_virtual/_@oxc-project_runtime@0.103.0/helpers/defineProperty.cjs');
|
|
2
|
+
const require_objectSpread2 = require('../_virtual/_@oxc-project_runtime@0.103.0/helpers/objectSpread2.cjs');
|
|
3
|
+
|
|
4
|
+
//#region src/primitives/shared.ts
|
|
5
|
+
var ValidationError = class extends Error {
|
|
6
|
+
constructor(message) {
|
|
7
|
+
super(message);
|
|
8
|
+
require_defineProperty._defineProperty(this, "_tag", "ValidationError");
|
|
9
|
+
this.name = "ValidationError";
|
|
10
|
+
}
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Runs all validators against a value, throwing ValidationError if any fail.
|
|
14
|
+
*/
|
|
15
|
+
function runValidators(value, validators) {
|
|
16
|
+
for (const validator of validators) if (!validator.validate(value)) throw new ValidationError(validator.message);
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Checks if an operation is compatible with the given operation definitions.
|
|
20
|
+
* @param operation - The operation to check.
|
|
21
|
+
* @param operationDefinitions - The operation definitions to check against.
|
|
22
|
+
* @returns True if the operation is compatible, false otherwise.
|
|
23
|
+
*/
|
|
24
|
+
function isCompatibleOperation(operation, operationDefinitions) {
|
|
25
|
+
return Object.values(operationDefinitions).some((value) => value.kind === operation.kind);
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Applies default values to a partial input, recursively handling nested structs.
|
|
29
|
+
*
|
|
30
|
+
* Uses a two-layer approach:
|
|
31
|
+
* 1. First, get the struct's initial state (which includes struct-level defaults)
|
|
32
|
+
* 2. Then, layer the provided values on top
|
|
33
|
+
* 3. Finally, ensure nested structs are recursively processed
|
|
34
|
+
*
|
|
35
|
+
* @param primitive - The primitive definition containing field information
|
|
36
|
+
* @param value - The partial value provided by the user
|
|
37
|
+
* @returns The value with defaults applied for missing fields
|
|
38
|
+
*/
|
|
39
|
+
function applyDefaults(primitive, value) {
|
|
40
|
+
if (primitive._tag === "StructPrimitive") {
|
|
41
|
+
var _structPrimitive$_int;
|
|
42
|
+
const structPrimitive = primitive;
|
|
43
|
+
const result = require_objectSpread2._objectSpread2(require_objectSpread2._objectSpread2({}, (_structPrimitive$_int = structPrimitive._internal.getInitialState()) !== null && _structPrimitive$_int !== void 0 ? _structPrimitive$_int : {}), value);
|
|
44
|
+
for (const key in structPrimitive.fields) {
|
|
45
|
+
const fieldPrimitive = structPrimitive.fields[key];
|
|
46
|
+
if (result[key] === void 0) {
|
|
47
|
+
const fieldDefault = fieldPrimitive._internal.getInitialState();
|
|
48
|
+
if (fieldDefault !== void 0) result[key] = fieldDefault;
|
|
49
|
+
} else if (fieldPrimitive._tag === "StructPrimitive" && typeof result[key] === "object" && result[key] !== null) result[key] = applyDefaults(fieldPrimitive, result[key]);
|
|
50
|
+
}
|
|
51
|
+
return result;
|
|
52
|
+
}
|
|
53
|
+
return value;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
//#endregion
|
|
57
|
+
exports.ValidationError = ValidationError;
|
|
58
|
+
exports.applyDefaults = applyDefaults;
|
|
59
|
+
exports.isCompatibleOperation = isCompatibleOperation;
|
|
60
|
+
exports.runValidators = runValidators;
|