@voidhash/mimic 1.0.0-beta.15 → 1.0.0-beta.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Document.cjs +0 -3
- package/dist/Document.d.mts.map +1 -1
- package/dist/Document.mjs +0 -3
- package/dist/Document.mjs.map +1 -1
- package/dist/EffectSchema.cjs +3 -3
- package/dist/EffectSchema.d.cts +5 -5
- package/dist/EffectSchema.d.cts.map +1 -1
- package/dist/EffectSchema.d.mts +5 -5
- package/dist/EffectSchema.d.mts.map +1 -1
- package/dist/EffectSchema.mjs +3 -3
- package/dist/EffectSchema.mjs.map +1 -1
- package/dist/FractionalIndex.mjs.map +1 -1
- package/dist/Operation.d.cts +4 -4
- package/dist/Operation.d.cts.map +1 -1
- package/dist/Operation.d.mts +4 -4
- package/dist/Operation.d.mts.map +1 -1
- package/dist/Operation.mjs.map +1 -1
- package/dist/OperationDefinition.d.cts +2 -2
- package/dist/OperationDefinition.d.cts.map +1 -1
- package/dist/OperationDefinition.d.mts +2 -2
- package/dist/OperationDefinition.d.mts.map +1 -1
- package/dist/OperationDefinition.mjs.map +1 -1
- package/dist/Presence.mjs.map +1 -1
- package/dist/Primitive.d.cts +2 -2
- package/dist/Primitive.d.mts +2 -2
- package/dist/SchemaJSON.cjs +305 -0
- package/dist/SchemaJSON.d.cts +11 -0
- package/dist/SchemaJSON.d.cts.map +1 -0
- package/dist/SchemaJSON.d.mts +11 -0
- package/dist/SchemaJSON.d.mts.map +1 -0
- package/dist/SchemaJSON.mjs +301 -0
- package/dist/SchemaJSON.mjs.map +1 -0
- package/dist/index.cjs +7 -0
- package/dist/index.d.cts +2 -1
- package/dist/index.d.mts +2 -1
- package/dist/index.mjs +2 -1
- package/dist/primitives/Array.cjs +12 -2
- package/dist/primitives/Array.d.cts.map +1 -1
- package/dist/primitives/Array.d.mts.map +1 -1
- package/dist/primitives/Array.mjs +12 -2
- package/dist/primitives/Array.mjs.map +1 -1
- package/dist/primitives/Boolean.mjs.map +1 -1
- package/dist/primitives/Either.mjs.map +1 -1
- package/dist/primitives/Literal.mjs.map +1 -1
- package/dist/primitives/Number.cjs +27 -5
- package/dist/primitives/Number.d.cts.map +1 -1
- package/dist/primitives/Number.d.mts.map +1 -1
- package/dist/primitives/Number.mjs +27 -5
- package/dist/primitives/Number.mjs.map +1 -1
- package/dist/primitives/String.cjs +44 -13
- package/dist/primitives/String.d.cts.map +1 -1
- package/dist/primitives/String.d.mts.map +1 -1
- package/dist/primitives/String.mjs +44 -13
- package/dist/primitives/String.mjs.map +1 -1
- package/dist/primitives/Struct.cjs +48 -9
- package/dist/primitives/Struct.d.cts +22 -3
- package/dist/primitives/Struct.d.cts.map +1 -1
- package/dist/primitives/Struct.d.mts +22 -3
- package/dist/primitives/Struct.d.mts.map +1 -1
- package/dist/primitives/Struct.mjs +48 -9
- package/dist/primitives/Struct.mjs.map +1 -1
- package/dist/primitives/Union.mjs.map +1 -1
- package/dist/primitives/shared.cjs +2 -5
- package/dist/primitives/shared.d.cts +2 -4
- package/dist/primitives/shared.d.cts.map +1 -1
- package/dist/primitives/shared.d.mts +2 -4
- package/dist/primitives/shared.d.mts.map +1 -1
- package/dist/primitives/shared.mjs +2 -5
- package/dist/primitives/shared.mjs.map +1 -1
- package/package.json +15 -8
- package/src/Document.ts +13 -4
- package/src/EffectSchema.ts +3 -3
- package/src/FractionalIndex.ts +18 -18
- package/src/Operation.ts +5 -5
- package/src/OperationDefinition.ts +2 -2
- package/src/Presence.ts +3 -3
- package/src/SchemaJSON.ts +396 -0
- package/src/index.ts +1 -0
- package/src/primitives/Array.ts +18 -8
- package/src/primitives/Boolean.ts +2 -2
- package/src/primitives/Either.ts +2 -2
- package/src/primitives/Literal.ts +2 -2
- package/src/primitives/Number.ts +44 -22
- package/src/primitives/String.ts +61 -34
- package/src/primitives/Struct.ts +100 -12
- package/src/primitives/Union.ts +1 -1
- package/src/primitives/shared.ts +12 -2
- package/.turbo/turbo-build.log +0 -270
- package/tests/Document.test.ts +0 -557
- package/tests/EffectSchema.test.ts +0 -546
- package/tests/FractionalIndex.test.ts +0 -377
- package/tests/OperationPath.test.ts +0 -151
- package/tests/Presence.test.ts +0 -321
- package/tests/Primitive.test.ts +0 -381
- package/tests/client/ClientDocument.test.ts +0 -1981
- package/tests/client/WebSocketTransport.test.ts +0 -1217
- package/tests/primitives/Array.test.ts +0 -526
- package/tests/primitives/Boolean.test.ts +0 -126
- package/tests/primitives/Either.test.ts +0 -707
- package/tests/primitives/Lazy.test.ts +0 -143
- package/tests/primitives/Literal.test.ts +0 -122
- package/tests/primitives/Number.test.ts +0 -133
- package/tests/primitives/String.test.ts +0 -128
- package/tests/primitives/Struct.test.ts +0 -1044
- package/tests/primitives/Tree.test.ts +0 -1139
- package/tests/primitives/TreeNode.test.ts +0 -50
- package/tests/primitives/Union.test.ts +0 -554
- package/tests/server/ServerDocument.test.ts +0 -903
- package/tsconfig.build.json +0 -24
- package/tsconfig.json +0 -8
- package/tsdown.config.ts +0 -18
- package/vitest.mts +0 -11
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Boolean.mjs","names":["OperationDefinition.make","Operation.fromDefinition","OperationPath.pathsOverlap"],"sources":["../../src/primitives/Boolean.ts"],"sourcesContent":["import { 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, Validator, NeedsValue } from \"./shared\";\nimport { runValidators, isCompatibleOperation, ValidationError } from \"./shared\";\n\n\ntype InferSetInput<TRequired extends boolean = false, THasDefault extends boolean = false> = NeedsValue<boolean, TRequired, THasDefault>\ntype InferUpdateInput<TRequired extends boolean = false, THasDefault extends boolean = false> = NeedsValue<boolean, TRequired, THasDefault>\n\nexport interface BooleanProxy<TRequired extends boolean = false, THasDefault extends boolean = false> {\n /** Gets the current boolean value */\n get(): MaybeUndefined<boolean, TRequired, THasDefault>;\n /** Sets the boolean value, generating a boolean.set operation */\n set(value: InferSetInput<TRequired, THasDefault>): void;\n /** This is the same as set. Updates the boolean value, generating a boolean.set operation */\n update(value: InferUpdateInput<TRequired, THasDefault>): void;\n /** Returns a readonly snapshot of the boolean value for rendering */\n toSnapshot(): MaybeUndefined<boolean, TRequired, THasDefault>;\n}\n\ninterface BooleanPrimitiveSchema {\n readonly required: boolean;\n readonly defaultValue: boolean | undefined;\n readonly validators: readonly Validator<boolean>[];\n}\n\nexport class BooleanPrimitive<TRequired extends boolean = false, THasDefault extends boolean = false> implements Primitive<boolean, BooleanProxy<TRequired, THasDefault>, TRequired, THasDefault, InferSetInput<TRequired, THasDefault>, InferUpdateInput<TRequired, THasDefault>> {\n readonly _tag = \"BooleanPrimitive\" as const;\n readonly _State!: boolean;\n readonly _Proxy!: BooleanProxy<TRequired, THasDefault>;\n readonly _TRequired!: TRequired;\n readonly _THasDefault!: THasDefault;\n readonly TUpdateInput!: InferUpdateInput<TRequired, THasDefault>;\n readonly TSetInput!: InferSetInput<TRequired, THasDefault>;\n\n private readonly _schema: BooleanPrimitiveSchema;\n\n private readonly _opDefinitions = {\n set: OperationDefinition.make({\n kind: \"boolean.set\" as const,\n payload: Schema.Boolean,\n target: Schema.Boolean,\n apply: (payload) => payload,\n deduplicable: true,\n }),\n };\n\n constructor(schema: BooleanPrimitiveSchema) {\n this._schema = schema;\n }\n\n /** Mark this boolean as required */\n required(): BooleanPrimitive<true, THasDefault> {\n return new BooleanPrimitive({\n ...this._schema,\n required: true,\n });\n }\n\n /** Set a default value for this boolean */\n default(defaultValue: boolean): BooleanPrimitive<TRequired, true> {\n return new BooleanPrimitive({\n ...this._schema,\n defaultValue,\n });\n }\n\n /** Add a custom validation rule */\n refine(fn: (value: boolean) => boolean, message: string): BooleanPrimitive<TRequired, THasDefault> {\n return new BooleanPrimitive({\n ...this._schema,\n validators: [...this._schema.validators, { validate: fn, message }],\n });\n }\n\n readonly _internal: PrimitiveInternal<boolean, BooleanProxy<TRequired, THasDefault>> = {\n createProxy: (env: ProxyEnvironment.ProxyEnvironment, operationPath: OperationPath.OperationPath): BooleanProxy<TRequired, THasDefault> => {\n const defaultValue = this._schema.defaultValue;\n return {\n get: (): MaybeUndefined<boolean, TRequired, THasDefault> => {\n const state = env.getState(operationPath) as boolean | undefined;\n return (state ?? defaultValue) as MaybeUndefined<boolean, TRequired, THasDefault>;\n },\n set: (value: InferSetInput<TRequired, THasDefault>) => {\n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.set, value)\n );\n },\n update: (value: InferUpdateInput<TRequired, THasDefault>) => {\n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.set, value)\n );\n },\n toSnapshot: (): MaybeUndefined<boolean, TRequired, THasDefault> => {\n const state = env.getState(operationPath) as boolean | undefined;\n return (state ?? defaultValue) as MaybeUndefined<boolean, TRequired, THasDefault>;\n },\n };\n },\n\n applyOperation: (_state: boolean | undefined, operation: Operation.Operation<any, any, any>): boolean => {\n if (operation.kind !== \"boolean.set\") {\n throw new ValidationError(`BooleanPrimitive cannot apply operation of kind: ${operation.kind}`);\n }\n\n const payload = operation.payload;\n if (typeof payload !== \"boolean\") {\n throw new ValidationError(`BooleanPrimitive.set requires a boolean payload, got: ${typeof payload}`);\n }\n\n // Run validators\n runValidators(payload, this._schema.validators);\n\n return payload;\n },\n\n getInitialState: (): boolean | 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 // If paths don't overlap, no transformation needed\n if (!OperationPath.pathsOverlap(clientOp.path, serverOp.path)) {\n return { type: \"transformed\", operation: clientOp };\n }\n\n // For same path, client wins (last-write-wins)\n return { type: \"transformed\", operation: clientOp };\n },\n };\n}\n\n/** Creates a new BooleanPrimitive */\nexport const Boolean = (): BooleanPrimitive<false, false> =>\n new BooleanPrimitive({ required: false, defaultValue: undefined, validators: [] });\n\n"],"mappings":";;;;;;;;;AA8BA,IAAa,mBAAb,MAAa,iBAAsQ;CAqBjR,YAAY,QAAgC;wBApBnC,QAAO;wBACP;wBACA;wBACA;wBACA;wBACA;wBACA;wBAEQ;wBAEA,kBAAiB,EAChC,KAAKA,KAAyB;GAC5B,MAAM;GACN,SAAS,OAAO;GAChB,QAAQ,OAAO;GACf,QAAQ,YAAY;GACpB,cAAc;GACf,CAAC,EACH;wBA8BQ,aAA8E;GACrF,cAAc,KAAwC,kBAAqF;IACzI,MAAM,eAAe,KAAK,QAAQ;AAClC,WAAO;KACL,WAA4D;MAC1D,MAAM,QAAQ,IAAI,SAAS,cAAc;AACzC,aAAQ,6CAAS;;KAEnB,MAAM,UAAiD;AACrD,UAAI,aACFC,eAAyB,eAAe,KAAK,eAAe,
|
|
1
|
+
{"version":3,"file":"Boolean.mjs","names":["OperationDefinition.make","Operation.fromDefinition","OperationPath.pathsOverlap"],"sources":["../../src/primitives/Boolean.ts"],"sourcesContent":["import { 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, Validator, NeedsValue } from \"./shared\";\nimport { runValidators, isCompatibleOperation, ValidationError } from \"./shared\";\n\n\ntype InferSetInput<TRequired extends boolean = false, THasDefault extends boolean = false> = NeedsValue<boolean, TRequired, THasDefault>\ntype InferUpdateInput<TRequired extends boolean = false, THasDefault extends boolean = false> = NeedsValue<boolean, TRequired, THasDefault>\n\nexport interface BooleanProxy<TRequired extends boolean = false, THasDefault extends boolean = false> {\n /** Gets the current boolean value */\n get(): MaybeUndefined<boolean, TRequired, THasDefault>;\n /** Sets the boolean value, generating a boolean.set operation */\n set(value: InferSetInput<TRequired, THasDefault>): void;\n /** This is the same as set. Updates the boolean value, generating a boolean.set operation */\n update(value: InferUpdateInput<TRequired, THasDefault>): void;\n /** Returns a readonly snapshot of the boolean value for rendering */\n toSnapshot(): MaybeUndefined<boolean, TRequired, THasDefault>;\n}\n\ninterface BooleanPrimitiveSchema {\n readonly required: boolean;\n readonly defaultValue: boolean | undefined;\n readonly validators: readonly Validator<boolean>[];\n}\n\nexport class BooleanPrimitive<TRequired extends boolean = false, THasDefault extends boolean = false> implements Primitive<boolean, BooleanProxy<TRequired, THasDefault>, TRequired, THasDefault, InferSetInput<TRequired, THasDefault>, InferUpdateInput<TRequired, THasDefault>> {\n readonly _tag = \"BooleanPrimitive\" as const;\n readonly _State!: boolean;\n readonly _Proxy!: BooleanProxy<TRequired, THasDefault>;\n readonly _TRequired!: TRequired;\n readonly _THasDefault!: THasDefault;\n readonly TUpdateInput!: InferUpdateInput<TRequired, THasDefault>;\n readonly TSetInput!: InferSetInput<TRequired, THasDefault>;\n\n private readonly _schema: BooleanPrimitiveSchema;\n\n private readonly _opDefinitions = {\n set: OperationDefinition.make({\n kind: \"boolean.set\" as const,\n payload: Schema.Boolean,\n target: Schema.Boolean,\n apply: (payload) => payload,\n deduplicable: true,\n }),\n };\n\n constructor(schema: BooleanPrimitiveSchema) {\n this._schema = schema;\n }\n\n /** Mark this boolean as required */\n required(): BooleanPrimitive<true, THasDefault> {\n return new BooleanPrimitive({\n ...this._schema,\n required: true,\n });\n }\n\n /** Set a default value for this boolean */\n default(defaultValue: boolean): BooleanPrimitive<TRequired, true> {\n return new BooleanPrimitive({\n ...this._schema,\n defaultValue,\n });\n }\n\n /** Add a custom validation rule */\n refine(fn: (value: boolean) => boolean, message: string): BooleanPrimitive<TRequired, THasDefault> {\n return new BooleanPrimitive({\n ...this._schema,\n validators: [...this._schema.validators, { validate: fn, message }],\n });\n }\n\n readonly _internal: PrimitiveInternal<boolean, BooleanProxy<TRequired, THasDefault>> = {\n createProxy: (env: ProxyEnvironment.ProxyEnvironment, operationPath: OperationPath.OperationPath): BooleanProxy<TRequired, THasDefault> => {\n const defaultValue = this._schema.defaultValue;\n return {\n get: (): MaybeUndefined<boolean, TRequired, THasDefault> => {\n const state = env.getState(operationPath) as boolean | undefined;\n return (state ?? defaultValue) as MaybeUndefined<boolean, TRequired, THasDefault>;\n },\n set: (value: InferSetInput<TRequired, THasDefault>) => {\n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.set as any, value)\n );\n },\n update: (value: InferUpdateInput<TRequired, THasDefault>) => {\n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.set as any, value)\n );\n },\n toSnapshot: (): MaybeUndefined<boolean, TRequired, THasDefault> => {\n const state = env.getState(operationPath) as boolean | undefined;\n return (state ?? defaultValue) as MaybeUndefined<boolean, TRequired, THasDefault>;\n },\n };\n },\n\n applyOperation: (_state: boolean | undefined, operation: Operation.Operation<any, any, any>): boolean => {\n if (operation.kind !== \"boolean.set\") {\n throw new ValidationError(`BooleanPrimitive cannot apply operation of kind: ${operation.kind}`);\n }\n\n const payload = operation.payload;\n if (typeof payload !== \"boolean\") {\n throw new ValidationError(`BooleanPrimitive.set requires a boolean payload, got: ${typeof payload}`);\n }\n\n // Run validators\n runValidators(payload, this._schema.validators);\n\n return payload;\n },\n\n getInitialState: (): boolean | 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 // If paths don't overlap, no transformation needed\n if (!OperationPath.pathsOverlap(clientOp.path, serverOp.path)) {\n return { type: \"transformed\", operation: clientOp };\n }\n\n // For same path, client wins (last-write-wins)\n return { type: \"transformed\", operation: clientOp };\n },\n };\n}\n\n/** Creates a new BooleanPrimitive */\nexport const Boolean = (): BooleanPrimitive<false, false> =>\n new BooleanPrimitive({ required: false, defaultValue: undefined, validators: [] });\n\n"],"mappings":";;;;;;;;;AA8BA,IAAa,mBAAb,MAAa,iBAAsQ;CAqBjR,YAAY,QAAgC;wBApBnC,QAAO;wBACP;wBACA;wBACA;wBACA;wBACA;wBACA;wBAEQ;wBAEA,kBAAiB,EAChC,KAAKA,KAAyB;GAC5B,MAAM;GACN,SAAS,OAAO;GAChB,QAAQ,OAAO;GACf,QAAQ,YAAY;GACpB,cAAc;GACf,CAAC,EACH;wBA8BQ,aAA8E;GACrF,cAAc,KAAwC,kBAAqF;IACzI,MAAM,eAAe,KAAK,QAAQ;AAClC,WAAO;KACL,WAA4D;MAC1D,MAAM,QAAQ,IAAI,SAAS,cAAc;AACzC,aAAQ,6CAAS;;KAEnB,MAAM,UAAiD;AACrD,UAAI,aACFC,eAAyB,eAAe,KAAK,eAAe,KAAY,MAAM,CAC/E;;KAEH,SAAS,UAAoD;AAC3D,UAAI,aACFA,eAAyB,eAAe,KAAK,eAAe,KAAY,MAAM,CAC/E;;KAEH,kBAAmE;MACjE,MAAM,QAAQ,IAAI,SAAS,cAAc;AACzC,aAAQ,6CAAS;;KAEpB;;GAGH,iBAAiB,QAA6B,cAA2D;AACvG,QAAI,UAAU,SAAS,cACrB,OAAM,IAAI,gBAAgB,oDAAoD,UAAU,OAAO;IAGjG,MAAM,UAAU,UAAU;AAC1B,QAAI,OAAO,YAAY,UACrB,OAAM,IAAI,gBAAgB,yDAAyD,OAAO,UAAU;AAItG,kBAAc,SAAS,KAAK,QAAQ,WAAW;AAE/C,WAAO;;GAGT,uBAA4C;AAC1C,WAAO,KAAK,QAAQ;;GAGtB,qBACE,UACA,aAC8B;AAE9B,QAAI,CAACC,aAA2B,SAAS,MAAM,SAAS,KAAK,CAC3D,QAAO;KAAE,MAAM;KAAe,WAAW;KAAU;AAIrD,WAAO;KAAE,MAAM;KAAe,WAAW;KAAU;;GAEtD;AApFC,OAAK,UAAU;;;CAIjB,WAAgD;AAC9C,SAAO,IAAI,mDACN,KAAK,gBACR,UAAU,QACV;;;CAIJ,QAAQ,cAA0D;AAChE,SAAO,IAAI,mDACN,KAAK,gBACR,gBACA;;;CAIJ,OAAO,IAAiC,SAA2D;AACjG,SAAO,IAAI,mDACN,KAAK,gBACR,YAAY,CAAC,GAAG,KAAK,QAAQ,YAAY;GAAE,UAAU;GAAI;GAAS,CAAC,IACnE;;;;AAgEN,MAAa,gBACX,IAAI,iBAAiB;CAAE,UAAU;CAAO,cAAc;CAAW,YAAY,EAAE;CAAE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Either.mjs","names":["OperationDefinition.make","Operation.fromDefinition","OperationPath.pathsOverlap","syntheticOp: Operation.Operation<any, any, any>"],"sources":["../../src/primitives/Either.ts"],"sourcesContent":["import { 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, InferState, NeedsValue } from \"./shared\";\nimport { ValidationError } from \"./shared\";\nimport { StringPrimitive } from \"./String\";\nimport { NumberPrimitive } from \"./Number\";\nimport { BooleanPrimitive } from \"./Boolean\";\nimport { LiteralPrimitive, LiteralValue } from \"./Literal\";\n\n// =============================================================================\n// Either Primitive - Simple Type Union\n// =============================================================================\n\ntype InferSetInput<TVariants extends readonly ScalarPrimitive[], TRequired extends boolean = false, THasDefault extends boolean = false> = NeedsValue<InferEitherState<TVariants>, TRequired, THasDefault>\ntype InferUpdateInput<TVariants extends readonly ScalarPrimitive[], TRequired extends boolean = false, THasDefault extends boolean = false> = NeedsValue<InferEitherState<TVariants>, TRequired, THasDefault>\n\n/**\n * Scalar primitives that can be used as variants in Either\n */\nexport type ScalarPrimitive =\n | StringPrimitive<any, any>\n | NumberPrimitive<any, any>\n | BooleanPrimitive<any, any>\n | LiteralPrimitive<any, any, any>;\n\n/**\n * Infer the union state type from a tuple of scalar primitives\n */\nexport type InferEitherState<TVariants extends readonly ScalarPrimitive[]> =\n InferState<TVariants[number]>;\n\n/**\n * Infer the union snapshot type from a tuple of scalar primitives\n */\nexport type InferEitherSnapshot<TVariants extends readonly ScalarPrimitive[]> =\n InferState<TVariants[number]>;\n\n/**\n * Match handlers for Either - optional handlers for each scalar type\n */\nexport interface EitherMatchHandlers<R> {\n string?: (value: string) => R;\n number?: (value: number) => R;\n boolean?: (value: boolean) => R;\n literal?: (value: LiteralValue) => R;\n}\n\n/**\n * Proxy for accessing Either values\n */\nexport interface EitherProxy<TVariants extends readonly ScalarPrimitive[], TRequired extends boolean = false, THasDefault extends boolean = false> {\n /** Gets the current value */\n get(): MaybeUndefined<InferEitherState<TVariants>, TRequired, THasDefault>;\n\n /** Sets the value to any of the allowed variant types */\n set(value: InferSetInput<TVariants, TRequired, THasDefault>): void;\n\n /** This is the same as set. Updates the value, generating an either.set operation */\n update(value: InferUpdateInput<TVariants, TRequired, THasDefault>): void;\n\n /** Pattern match on the value type */\n match<R>(handlers: EitherMatchHandlers<R>): R | undefined;\n\n /** Returns a readonly snapshot of the value for rendering */\n toSnapshot(): MaybeUndefined<InferEitherSnapshot<TVariants>, TRequired, THasDefault>;\n}\n\ninterface EitherPrimitiveSchema<TVariants extends readonly ScalarPrimitive[]> {\n readonly required: boolean;\n readonly defaultValue: InferEitherState<TVariants> | undefined;\n readonly variants: TVariants;\n}\n\nexport class EitherPrimitive<TVariants extends readonly ScalarPrimitive[], TRequired extends boolean = false, THasDefault extends boolean = false>\n implements Primitive<InferEitherState<TVariants>, EitherProxy<TVariants, TRequired, THasDefault>, TRequired, THasDefault, InferSetInput<TVariants, TRequired, THasDefault>, InferUpdateInput<TVariants, TRequired, THasDefault>>\n{\n readonly _tag = \"EitherPrimitive\" as const;\n readonly _State!: InferEitherState<TVariants>;\n readonly _Proxy!: EitherProxy<TVariants, TRequired, THasDefault>;\n readonly _TRequired!: TRequired;\n readonly _THasDefault!: THasDefault;\n readonly TUpdateInput!: InferUpdateInput<TVariants, TRequired, THasDefault>;\n readonly TSetInput!: InferSetInput<TVariants, TRequired, THasDefault>;\n\n private readonly _schema: EitherPrimitiveSchema<TVariants>;\n\n private readonly _opDefinitions = {\n set: OperationDefinition.make({\n kind: \"either.set\" as const,\n payload: Schema.Unknown,\n target: Schema.Unknown,\n apply: (payload) => payload,\n deduplicable: true,\n }),\n };\n\n constructor(schema: EitherPrimitiveSchema<TVariants>) {\n this._schema = schema;\n }\n\n /** Mark this either as required */\n required(): EitherPrimitive<TVariants, true, THasDefault> {\n return new EitherPrimitive({\n ...this._schema,\n required: true,\n });\n }\n\n /** Set a default value for this either */\n default(defaultValue: InferEitherState<TVariants>): EitherPrimitive<TVariants, TRequired, true> {\n return new EitherPrimitive({\n ...this._schema,\n defaultValue,\n });\n }\n\n /** Get the variants */\n get variants(): TVariants {\n return this._schema.variants;\n }\n\n /**\n * Determine the type category of a value based on the variants\n */\n private _getValueType(value: unknown): \"string\" | \"number\" | \"boolean\" | \"literal\" | undefined {\n const valueType = typeof value;\n\n // Check for literal matches first (they take priority)\n for (const variant of this._schema.variants) {\n if (variant._tag === \"LiteralPrimitive\") {\n const literalVariant = variant as LiteralPrimitive<any, any, any>;\n if (value === literalVariant.literal) {\n return \"literal\";\n }\n }\n }\n\n // Check for type matches\n if (valueType === \"string\") {\n for (const variant of this._schema.variants) {\n if (variant._tag === \"StringPrimitive\") {\n return \"string\";\n }\n }\n }\n\n if (valueType === \"number\") {\n for (const variant of this._schema.variants) {\n if (variant._tag === \"NumberPrimitive\") {\n return \"number\";\n }\n }\n }\n\n if (valueType === \"boolean\") {\n for (const variant of this._schema.variants) {\n if (variant._tag === \"BooleanPrimitive\") {\n return \"boolean\";\n }\n }\n }\n\n return undefined;\n }\n\n /**\n * Find the matching variant for a value.\n * For literals, matches exact value. For other types, matches by typeof.\n */\n private _findMatchingVariant(value: unknown): ScalarPrimitive | undefined {\n const valueType = typeof value;\n\n // Check for literal matches first (they take priority)\n for (const variant of this._schema.variants) {\n if (variant._tag === \"LiteralPrimitive\") {\n const literalVariant = variant as LiteralPrimitive<any, any, any>;\n if (value === literalVariant.literal) {\n return variant;\n }\n }\n }\n\n // Check for type matches\n if (valueType === \"string\") {\n for (const variant of this._schema.variants) {\n if (variant._tag === \"StringPrimitive\") {\n return variant;\n }\n }\n }\n\n if (valueType === \"number\") {\n for (const variant of this._schema.variants) {\n if (variant._tag === \"NumberPrimitive\") {\n return variant;\n }\n }\n }\n\n if (valueType === \"boolean\") {\n for (const variant of this._schema.variants) {\n if (variant._tag === \"BooleanPrimitive\") {\n return variant;\n }\n }\n }\n\n return undefined;\n }\n\n /**\n * Get the operation kind for a variant\n */\n private _getVariantOperationKind(variant: ScalarPrimitive): string {\n switch (variant._tag) {\n case \"StringPrimitive\":\n return \"string.set\";\n case \"NumberPrimitive\":\n return \"number.set\";\n case \"BooleanPrimitive\":\n return \"boolean.set\";\n case \"LiteralPrimitive\":\n return \"literal.set\";\n default:\n return \"unknown.set\";\n }\n }\n\n /**\n * Validate a value against the matching variant, including running its validators.\n * Throws ValidationError if the value doesn't match any variant or fails validation.\n */\n private _validateAndApplyToVariant(value: unknown, path: OperationPath.OperationPath): void {\n const matchingVariant = this._findMatchingVariant(value);\n \n if (!matchingVariant) {\n const allowedTypes = this._schema.variants.map((v) => v._tag).join(\", \");\n throw new ValidationError(\n `EitherPrimitive.set requires a value matching one of: ${allowedTypes}, got: ${typeof value}`\n );\n }\n\n // Create a synthetic operation for the variant's applyOperation\n const variantOpKind = this._getVariantOperationKind(matchingVariant);\n const syntheticOp: Operation.Operation<any, any, any> = {\n kind: variantOpKind,\n path: path,\n payload: value,\n };\n\n // Delegate to the variant's applyOperation which runs its validators\n // This will throw ValidationError if validation fails\n matchingVariant._internal.applyOperation(undefined, syntheticOp);\n }\n\n readonly _internal: PrimitiveInternal<InferEitherState<TVariants>, EitherProxy<TVariants, TRequired, THasDefault>> = {\n createProxy: (\n env: ProxyEnvironment.ProxyEnvironment,\n operationPath: OperationPath.OperationPath\n ): EitherProxy<TVariants, TRequired, THasDefault> => {\n const defaultValue = this._schema.defaultValue;\n\n return {\n get: (): MaybeUndefined<InferEitherState<TVariants>, TRequired, THasDefault> => {\n const state = env.getState(operationPath) as InferEitherState<TVariants> | undefined;\n return (state ?? defaultValue) as MaybeUndefined<InferEitherState<TVariants>, TRequired, THasDefault>;\n },\n set: (value: InferSetInput<TVariants, TRequired, THasDefault>) => {\n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.set, value)\n );\n },\n update: (value: InferUpdateInput<TVariants, TRequired, THasDefault>) => {\n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.set, value)\n );\n },\n match: <R,>(handlers: EitherMatchHandlers<R>): R | undefined => {\n const currentState = env.getState(operationPath) as InferEitherState<TVariants> | undefined;\n const effectiveState = currentState ?? defaultValue;\n if (effectiveState === undefined) return undefined;\n\n const valueType = this._getValueType(effectiveState);\n if (!valueType) return undefined;\n\n switch (valueType) {\n case \"string\":\n return handlers.string?.(effectiveState as string);\n case \"number\":\n return handlers.number?.(effectiveState as number);\n case \"boolean\":\n return handlers.boolean?.(effectiveState as boolean);\n case \"literal\":\n return handlers.literal?.(effectiveState as LiteralValue);\n default:\n return undefined;\n }\n },\n toSnapshot: (): MaybeUndefined<InferEitherSnapshot<TVariants>, TRequired, THasDefault> => {\n const state = env.getState(operationPath) as InferEitherState<TVariants> | undefined;\n return (state ?? defaultValue) as MaybeUndefined<InferEitherSnapshot<TVariants>, TRequired, THasDefault>;\n },\n };\n },\n\n applyOperation: (\n _state: InferEitherState<TVariants> | undefined,\n operation: Operation.Operation<any, any, any>\n ): InferEitherState<TVariants> => {\n if (operation.kind !== \"either.set\") {\n throw new ValidationError(`EitherPrimitive cannot apply operation of kind: ${operation.kind}`);\n }\n\n const payload = operation.payload;\n\n // Validate that the payload matches one of the variant types and passes its validators\n this._validateAndApplyToVariant(payload, operation.path);\n\n return payload as InferEitherState<TVariants>;\n },\n\n getInitialState: (): InferEitherState<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 // If paths don't overlap, no transformation needed\n if (!OperationPath.pathsOverlap(clientOp.path, serverOp.path)) {\n return { type: \"transformed\", operation: clientOp };\n }\n\n // For same path, client wins (last-write-wins)\n return { type: \"transformed\", operation: clientOp };\n },\n };\n}\n\n/**\n * Creates a new EitherPrimitive with the given scalar variant types.\n * Validators defined on the variants are applied when validating values.\n *\n * @example\n * ```typescript\n * // String or number\n * const value = Either(String(), Number());\n *\n * // String, number, or boolean\n * const status = Either(String(), Number(), Boolean()).default(\"pending\");\n *\n * // With literal types\n * const mode = Either(Literal(\"auto\"), Literal(\"manual\"), Number());\n *\n * // With validators - validates string length and number range\n * const constrained = Either(\n * String().min(2).max(50),\n * Number().max(255)\n * );\n * ```\n */\nexport function Either<TVariants extends readonly ScalarPrimitive[]>(\n ...variants: TVariants\n): EitherPrimitive<TVariants, false, false> {\n if (variants.length === 0) {\n throw new ValidationError(\"Either requires at least one variant\");\n }\n\n return new EitherPrimitive({\n required: false,\n defaultValue: undefined,\n variants,\n });\n}\n\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Either.mjs","names":["OperationDefinition.make","Operation.fromDefinition","OperationPath.pathsOverlap","syntheticOp: Operation.Operation<any, any, any>"],"sources":["../../src/primitives/Either.ts"],"sourcesContent":["import { 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, InferState, NeedsValue } from \"./shared\";\nimport { ValidationError } from \"./shared\";\nimport { StringPrimitive } from \"./String\";\nimport { NumberPrimitive } from \"./Number\";\nimport { BooleanPrimitive } from \"./Boolean\";\nimport { LiteralPrimitive, LiteralValue } from \"./Literal\";\n\n// =============================================================================\n// Either Primitive - Simple Type Union\n// =============================================================================\n\ntype InferSetInput<TVariants extends readonly ScalarPrimitive[], TRequired extends boolean = false, THasDefault extends boolean = false> = NeedsValue<InferEitherState<TVariants>, TRequired, THasDefault>\ntype InferUpdateInput<TVariants extends readonly ScalarPrimitive[], TRequired extends boolean = false, THasDefault extends boolean = false> = NeedsValue<InferEitherState<TVariants>, TRequired, THasDefault>\n\n/**\n * Scalar primitives that can be used as variants in Either\n */\nexport type ScalarPrimitive =\n | StringPrimitive<any, any>\n | NumberPrimitive<any, any>\n | BooleanPrimitive<any, any>\n | LiteralPrimitive<any, any, any>;\n\n/**\n * Infer the union state type from a tuple of scalar primitives\n */\nexport type InferEitherState<TVariants extends readonly ScalarPrimitive[]> =\n InferState<TVariants[number]>;\n\n/**\n * Infer the union snapshot type from a tuple of scalar primitives\n */\nexport type InferEitherSnapshot<TVariants extends readonly ScalarPrimitive[]> =\n InferState<TVariants[number]>;\n\n/**\n * Match handlers for Either - optional handlers for each scalar type\n */\nexport interface EitherMatchHandlers<R> {\n string?: (value: string) => R;\n number?: (value: number) => R;\n boolean?: (value: boolean) => R;\n literal?: (value: LiteralValue) => R;\n}\n\n/**\n * Proxy for accessing Either values\n */\nexport interface EitherProxy<TVariants extends readonly ScalarPrimitive[], TRequired extends boolean = false, THasDefault extends boolean = false> {\n /** Gets the current value */\n get(): MaybeUndefined<InferEitherState<TVariants>, TRequired, THasDefault>;\n\n /** Sets the value to any of the allowed variant types */\n set(value: InferSetInput<TVariants, TRequired, THasDefault>): void;\n\n /** This is the same as set. Updates the value, generating an either.set operation */\n update(value: InferUpdateInput<TVariants, TRequired, THasDefault>): void;\n\n /** Pattern match on the value type */\n match<R>(handlers: EitherMatchHandlers<R>): R | undefined;\n\n /** Returns a readonly snapshot of the value for rendering */\n toSnapshot(): MaybeUndefined<InferEitherSnapshot<TVariants>, TRequired, THasDefault>;\n}\n\ninterface EitherPrimitiveSchema<TVariants extends readonly ScalarPrimitive[]> {\n readonly required: boolean;\n readonly defaultValue: InferEitherState<TVariants> | undefined;\n readonly variants: TVariants;\n}\n\nexport class EitherPrimitive<TVariants extends readonly ScalarPrimitive[], TRequired extends boolean = false, THasDefault extends boolean = false>\n implements Primitive<InferEitherState<TVariants>, EitherProxy<TVariants, TRequired, THasDefault>, TRequired, THasDefault, InferSetInput<TVariants, TRequired, THasDefault>, InferUpdateInput<TVariants, TRequired, THasDefault>>\n{\n readonly _tag = \"EitherPrimitive\" as const;\n readonly _State!: InferEitherState<TVariants>;\n readonly _Proxy!: EitherProxy<TVariants, TRequired, THasDefault>;\n readonly _TRequired!: TRequired;\n readonly _THasDefault!: THasDefault;\n readonly TUpdateInput!: InferUpdateInput<TVariants, TRequired, THasDefault>;\n readonly TSetInput!: InferSetInput<TVariants, TRequired, THasDefault>;\n\n private readonly _schema: EitherPrimitiveSchema<TVariants>;\n\n private readonly _opDefinitions = {\n set: OperationDefinition.make({\n kind: \"either.set\" as const,\n payload: Schema.Unknown,\n target: Schema.Unknown,\n apply: (payload) => payload,\n deduplicable: true,\n }),\n };\n\n constructor(schema: EitherPrimitiveSchema<TVariants>) {\n this._schema = schema;\n }\n\n /** Mark this either as required */\n required(): EitherPrimitive<TVariants, true, THasDefault> {\n return new EitherPrimitive({\n ...this._schema,\n required: true,\n });\n }\n\n /** Set a default value for this either */\n default(defaultValue: InferEitherState<TVariants>): EitherPrimitive<TVariants, TRequired, true> {\n return new EitherPrimitive({\n ...this._schema,\n defaultValue,\n });\n }\n\n /** Get the variants */\n get variants(): TVariants {\n return this._schema.variants;\n }\n\n /**\n * Determine the type category of a value based on the variants\n */\n private _getValueType(value: unknown): \"string\" | \"number\" | \"boolean\" | \"literal\" | undefined {\n const valueType = typeof value;\n\n // Check for literal matches first (they take priority)\n for (const variant of this._schema.variants) {\n if (variant._tag === \"LiteralPrimitive\") {\n const literalVariant = variant as LiteralPrimitive<any, any, any>;\n if (value === literalVariant.literal) {\n return \"literal\";\n }\n }\n }\n\n // Check for type matches\n if (valueType === \"string\") {\n for (const variant of this._schema.variants) {\n if (variant._tag === \"StringPrimitive\") {\n return \"string\";\n }\n }\n }\n\n if (valueType === \"number\") {\n for (const variant of this._schema.variants) {\n if (variant._tag === \"NumberPrimitive\") {\n return \"number\";\n }\n }\n }\n\n if (valueType === \"boolean\") {\n for (const variant of this._schema.variants) {\n if (variant._tag === \"BooleanPrimitive\") {\n return \"boolean\";\n }\n }\n }\n\n return undefined;\n }\n\n /**\n * Find the matching variant for a value.\n * For literals, matches exact value. For other types, matches by typeof.\n */\n private _findMatchingVariant(value: unknown): ScalarPrimitive | undefined {\n const valueType = typeof value;\n\n // Check for literal matches first (they take priority)\n for (const variant of this._schema.variants) {\n if (variant._tag === \"LiteralPrimitive\") {\n const literalVariant = variant as LiteralPrimitive<any, any, any>;\n if (value === literalVariant.literal) {\n return variant;\n }\n }\n }\n\n // Check for type matches\n if (valueType === \"string\") {\n for (const variant of this._schema.variants) {\n if (variant._tag === \"StringPrimitive\") {\n return variant;\n }\n }\n }\n\n if (valueType === \"number\") {\n for (const variant of this._schema.variants) {\n if (variant._tag === \"NumberPrimitive\") {\n return variant;\n }\n }\n }\n\n if (valueType === \"boolean\") {\n for (const variant of this._schema.variants) {\n if (variant._tag === \"BooleanPrimitive\") {\n return variant;\n }\n }\n }\n\n return undefined;\n }\n\n /**\n * Get the operation kind for a variant\n */\n private _getVariantOperationKind(variant: ScalarPrimitive): string {\n switch (variant._tag) {\n case \"StringPrimitive\":\n return \"string.set\";\n case \"NumberPrimitive\":\n return \"number.set\";\n case \"BooleanPrimitive\":\n return \"boolean.set\";\n case \"LiteralPrimitive\":\n return \"literal.set\";\n default:\n return \"unknown.set\";\n }\n }\n\n /**\n * Validate a value against the matching variant, including running its validators.\n * Throws ValidationError if the value doesn't match any variant or fails validation.\n */\n private _validateAndApplyToVariant(value: unknown, path: OperationPath.OperationPath): void {\n const matchingVariant = this._findMatchingVariant(value);\n \n if (!matchingVariant) {\n const allowedTypes = this._schema.variants.map((v) => v._tag).join(\", \");\n throw new ValidationError(\n `EitherPrimitive.set requires a value matching one of: ${allowedTypes}, got: ${typeof value}`\n );\n }\n\n // Create a synthetic operation for the variant's applyOperation\n const variantOpKind = this._getVariantOperationKind(matchingVariant);\n const syntheticOp: Operation.Operation<any, any, any> = {\n kind: variantOpKind,\n path: path,\n payload: value,\n };\n\n // Delegate to the variant's applyOperation which runs its validators\n // This will throw ValidationError if validation fails\n matchingVariant._internal.applyOperation(undefined, syntheticOp);\n }\n\n readonly _internal: PrimitiveInternal<InferEitherState<TVariants>, EitherProxy<TVariants, TRequired, THasDefault>> = {\n createProxy: (\n env: ProxyEnvironment.ProxyEnvironment,\n operationPath: OperationPath.OperationPath\n ): EitherProxy<TVariants, TRequired, THasDefault> => {\n const defaultValue = this._schema.defaultValue;\n\n return {\n get: (): MaybeUndefined<InferEitherState<TVariants>, TRequired, THasDefault> => {\n const state = env.getState(operationPath) as InferEitherState<TVariants> | undefined;\n return (state ?? defaultValue) as MaybeUndefined<InferEitherState<TVariants>, TRequired, THasDefault>;\n },\n set: (value: InferSetInput<TVariants, TRequired, THasDefault>) => {\n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.set as any, value)\n );\n },\n update: (value: InferUpdateInput<TVariants, TRequired, THasDefault>) => {\n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.set as any, value)\n );\n },\n match: <R,>(handlers: EitherMatchHandlers<R>): R | undefined => {\n const currentState = env.getState(operationPath) as InferEitherState<TVariants> | undefined;\n const effectiveState = currentState ?? defaultValue;\n if (effectiveState === undefined) return undefined;\n\n const valueType = this._getValueType(effectiveState);\n if (!valueType) return undefined;\n\n switch (valueType) {\n case \"string\":\n return handlers.string?.(effectiveState as string);\n case \"number\":\n return handlers.number?.(effectiveState as number);\n case \"boolean\":\n return handlers.boolean?.(effectiveState as boolean);\n case \"literal\":\n return handlers.literal?.(effectiveState as LiteralValue);\n default:\n return undefined;\n }\n },\n toSnapshot: (): MaybeUndefined<InferEitherSnapshot<TVariants>, TRequired, THasDefault> => {\n const state = env.getState(operationPath) as InferEitherState<TVariants> | undefined;\n return (state ?? defaultValue) as MaybeUndefined<InferEitherSnapshot<TVariants>, TRequired, THasDefault>;\n },\n };\n },\n\n applyOperation: (\n _state: InferEitherState<TVariants> | undefined,\n operation: Operation.Operation<any, any, any>\n ): InferEitherState<TVariants> => {\n if (operation.kind !== \"either.set\") {\n throw new ValidationError(`EitherPrimitive cannot apply operation of kind: ${operation.kind}`);\n }\n\n const payload = operation.payload;\n\n // Validate that the payload matches one of the variant types and passes its validators\n this._validateAndApplyToVariant(payload, operation.path);\n\n return payload as InferEitherState<TVariants>;\n },\n\n getInitialState: (): InferEitherState<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 // If paths don't overlap, no transformation needed\n if (!OperationPath.pathsOverlap(clientOp.path, serverOp.path)) {\n return { type: \"transformed\", operation: clientOp };\n }\n\n // For same path, client wins (last-write-wins)\n return { type: \"transformed\", operation: clientOp };\n },\n };\n}\n\n/**\n * Creates a new EitherPrimitive with the given scalar variant types.\n * Validators defined on the variants are applied when validating values.\n *\n * @example\n * ```typescript\n * // String or number\n * const value = Either(String(), Number());\n *\n * // String, number, or boolean\n * const status = Either(String(), Number(), Boolean()).default(\"pending\");\n *\n * // With literal types\n * const mode = Either(Literal(\"auto\"), Literal(\"manual\"), Number());\n *\n * // With validators - validates string length and number range\n * const constrained = Either(\n * String().min(2).max(50),\n * Number().max(255)\n * );\n * ```\n */\nexport function Either<TVariants extends readonly ScalarPrimitive[]>(\n ...variants: TVariants\n): EitherPrimitive<TVariants, false, false> {\n if (variants.length === 0) {\n throw new ValidationError(\"Either requires at least one variant\");\n }\n\n return new EitherPrimitive({\n required: false,\n defaultValue: undefined,\n variants,\n });\n}\n\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Literal.mjs","names":["OperationDefinition.make","Operation.fromDefinition","OperationPath.pathsOverlap"],"sources":["../../src/primitives/Literal.ts"],"sourcesContent":["import { 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, Validator, NeedsValue } from \"./shared\";\nimport { ValidationError, runValidators, isCompatibleOperation } from \"./shared\";\n\n\n/** Valid literal types */\nexport type LiteralValue = string | number | boolean | null;\n\ntype InferSetInput<T extends LiteralValue, TRequired extends boolean = false, THasDefault extends boolean = false> = NeedsValue<T, TRequired, THasDefault>\ntype InferUpdateInput<T extends LiteralValue, TRequired extends boolean = false, THasDefault extends boolean = false> = NeedsValue<T, TRequired, THasDefault>\n\nexport interface LiteralProxy<T extends LiteralValue, TRequired extends boolean = false, THasDefault extends boolean = false> {\n /** Gets the current literal value */\n get(): MaybeUndefined<T, TRequired, THasDefault>;\n /** Sets the literal value (must match the exact literal type) */\n set(value: InferSetInput<T, TRequired, THasDefault>): void;\n /** This is the same as set. Updates the literal value, generating a literal.set operation */\n update(value: InferUpdateInput<T, TRequired, THasDefault>): void;\n /** Returns a readonly snapshot of the literal value for rendering */\n toSnapshot(): MaybeUndefined<T, TRequired, THasDefault>;\n}\n\ninterface LiteralPrimitiveSchema<T extends LiteralValue> {\n readonly required: boolean;\n readonly defaultValue: T | undefined;\n readonly literal: T;\n}\n\nexport class LiteralPrimitive<T extends LiteralValue, TRequired extends boolean = false, THasDefault extends boolean = false> implements Primitive<T, LiteralProxy<T, TRequired, THasDefault>, TRequired, THasDefault, InferSetInput<T, TRequired, THasDefault>, InferUpdateInput<T, TRequired, THasDefault>> {\n readonly _tag = \"LiteralPrimitive\" as const;\n readonly _State!: T;\n readonly _Proxy!: LiteralProxy<T, TRequired, THasDefault>;\n readonly _TRequired!: TRequired;\n readonly _THasDefault!: THasDefault;\n readonly TUpdateInput!: InferUpdateInput<T, TRequired, THasDefault>;\n readonly TSetInput!: InferSetInput<T, TRequired, THasDefault>;\n\n private readonly _schema: LiteralPrimitiveSchema<T>;\n\n private readonly _opDefinitions = {\n set: OperationDefinition.make({\n kind: \"literal.set\" as const,\n payload: Schema.Unknown,\n target: Schema.Unknown,\n apply: (payload) => payload,\n deduplicable: true,\n }),\n };\n\n constructor(schema: LiteralPrimitiveSchema<T>) {\n this._schema = schema;\n }\n\n /** Mark this literal as required */\n required(): LiteralPrimitive<T, true, THasDefault> {\n return new LiteralPrimitive({\n ...this._schema,\n required: true,\n });\n }\n\n /** Set a default value for this literal */\n default(defaultValue: T): LiteralPrimitive<T, TRequired, true> {\n return new LiteralPrimitive({\n ...this._schema,\n defaultValue,\n });\n }\n\n /** Get the literal value this primitive represents */\n get literal(): T {\n return this._schema.literal;\n }\n\n readonly _internal: PrimitiveInternal<T, LiteralProxy<T, TRequired, THasDefault>> = {\n createProxy: (env: ProxyEnvironment.ProxyEnvironment, operationPath: OperationPath.OperationPath): LiteralProxy<T, TRequired, THasDefault> => {\n const defaultValue = this._schema.defaultValue;\n return {\n get: (): MaybeUndefined<T, TRequired, THasDefault> => {\n const state = env.getState(operationPath) as T | undefined;\n return (state ?? defaultValue) as MaybeUndefined<T, TRequired, THasDefault>;\n },\n set: (value: InferSetInput<T, TRequired, THasDefault>) => {\n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.set, value)\n );\n },\n update: (value: InferUpdateInput<T, TRequired, THasDefault>) => {\n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.set, value)\n );\n },\n toSnapshot: (): MaybeUndefined<T, TRequired, THasDefault> => {\n const state = env.getState(operationPath) as T | undefined;\n return (state ?? defaultValue) as MaybeUndefined<T, TRequired, THasDefault>;\n },\n };\n },\n\n applyOperation: (_state: T | undefined, operation: Operation.Operation<any, any, any>): T => {\n if (operation.kind !== \"literal.set\") {\n throw new ValidationError(`LiteralPrimitive cannot apply operation of kind: ${operation.kind}`);\n }\n\n const payload = operation.payload;\n if (payload !== this._schema.literal) {\n throw new ValidationError(\n `LiteralPrimitive.set requires the exact literal value \"${globalThis.String(this._schema.literal)}\", got: \"${globalThis.String(payload)}\"`\n );\n }\n\n return payload as T;\n },\n\n getInitialState: (): T | 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 // If paths don't overlap, no transformation needed\n if (!OperationPath.pathsOverlap(clientOp.path, serverOp.path)) {\n return { type: \"transformed\", operation: clientOp };\n }\n\n // For same path, client wins (last-write-wins)\n return { type: \"transformed\", operation: clientOp };\n },\n };\n}\n\n/** Creates a new LiteralPrimitive with the given literal value */\nexport const Literal = <T extends LiteralValue>(literal: T): LiteralPrimitive<T, false, false> =>\n new LiteralPrimitive({ required: false, defaultValue: undefined, literal });\n\n"],"mappings":";;;;;;;;;AAiCA,IAAa,mBAAb,MAAa,iBAAiS;CAqB5S,YAAY,QAAmC;wBApBtC,QAAO;wBACP;wBACA;wBACA;wBACA;wBACA;wBACA;wBAEQ;wBAEA,kBAAiB,EAChC,KAAKA,KAAyB;GAC5B,MAAM;GACN,SAAS,OAAO;GAChB,QAAQ,OAAO;GACf,QAAQ,YAAY;GACpB,cAAc;GACf,CAAC,EACH;wBA2BQ,aAA2E;GAClF,cAAc,KAAwC,kBAAwF;IAC5I,MAAM,eAAe,KAAK,QAAQ;AAClC,WAAO;KACL,WAAsD;MACpD,MAAM,QAAQ,IAAI,SAAS,cAAc;AACzC,aAAQ,6CAAS;;KAEnB,MAAM,UAAoD;AACxD,UAAI,aACFC,eAAyB,eAAe,KAAK,eAAe,
|
|
1
|
+
{"version":3,"file":"Literal.mjs","names":["OperationDefinition.make","Operation.fromDefinition","OperationPath.pathsOverlap"],"sources":["../../src/primitives/Literal.ts"],"sourcesContent":["import { 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, Validator, NeedsValue } from \"./shared\";\nimport { ValidationError, runValidators, isCompatibleOperation } from \"./shared\";\n\n\n/** Valid literal types */\nexport type LiteralValue = string | number | boolean | null;\n\ntype InferSetInput<T extends LiteralValue, TRequired extends boolean = false, THasDefault extends boolean = false> = NeedsValue<T, TRequired, THasDefault>\ntype InferUpdateInput<T extends LiteralValue, TRequired extends boolean = false, THasDefault extends boolean = false> = NeedsValue<T, TRequired, THasDefault>\n\nexport interface LiteralProxy<T extends LiteralValue, TRequired extends boolean = false, THasDefault extends boolean = false> {\n /** Gets the current literal value */\n get(): MaybeUndefined<T, TRequired, THasDefault>;\n /** Sets the literal value (must match the exact literal type) */\n set(value: InferSetInput<T, TRequired, THasDefault>): void;\n /** This is the same as set. Updates the literal value, generating a literal.set operation */\n update(value: InferUpdateInput<T, TRequired, THasDefault>): void;\n /** Returns a readonly snapshot of the literal value for rendering */\n toSnapshot(): MaybeUndefined<T, TRequired, THasDefault>;\n}\n\ninterface LiteralPrimitiveSchema<T extends LiteralValue> {\n readonly required: boolean;\n readonly defaultValue: T | undefined;\n readonly literal: T;\n}\n\nexport class LiteralPrimitive<T extends LiteralValue, TRequired extends boolean = false, THasDefault extends boolean = false> implements Primitive<T, LiteralProxy<T, TRequired, THasDefault>, TRequired, THasDefault, InferSetInput<T, TRequired, THasDefault>, InferUpdateInput<T, TRequired, THasDefault>> {\n readonly _tag = \"LiteralPrimitive\" as const;\n readonly _State!: T;\n readonly _Proxy!: LiteralProxy<T, TRequired, THasDefault>;\n readonly _TRequired!: TRequired;\n readonly _THasDefault!: THasDefault;\n readonly TUpdateInput!: InferUpdateInput<T, TRequired, THasDefault>;\n readonly TSetInput!: InferSetInput<T, TRequired, THasDefault>;\n\n private readonly _schema: LiteralPrimitiveSchema<T>;\n\n private readonly _opDefinitions = {\n set: OperationDefinition.make({\n kind: \"literal.set\" as const,\n payload: Schema.Unknown,\n target: Schema.Unknown,\n apply: (payload) => payload,\n deduplicable: true,\n }),\n };\n\n constructor(schema: LiteralPrimitiveSchema<T>) {\n this._schema = schema;\n }\n\n /** Mark this literal as required */\n required(): LiteralPrimitive<T, true, THasDefault> {\n return new LiteralPrimitive({\n ...this._schema,\n required: true,\n });\n }\n\n /** Set a default value for this literal */\n default(defaultValue: T): LiteralPrimitive<T, TRequired, true> {\n return new LiteralPrimitive({\n ...this._schema,\n defaultValue,\n });\n }\n\n /** Get the literal value this primitive represents */\n get literal(): T {\n return this._schema.literal;\n }\n\n readonly _internal: PrimitiveInternal<T, LiteralProxy<T, TRequired, THasDefault>> = {\n createProxy: (env: ProxyEnvironment.ProxyEnvironment, operationPath: OperationPath.OperationPath): LiteralProxy<T, TRequired, THasDefault> => {\n const defaultValue = this._schema.defaultValue;\n return {\n get: (): MaybeUndefined<T, TRequired, THasDefault> => {\n const state = env.getState(operationPath) as T | undefined;\n return (state ?? defaultValue) as MaybeUndefined<T, TRequired, THasDefault>;\n },\n set: (value: InferSetInput<T, TRequired, THasDefault>) => {\n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.set as any, value)\n );\n },\n update: (value: InferUpdateInput<T, TRequired, THasDefault>) => {\n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.set as any, value)\n );\n },\n toSnapshot: (): MaybeUndefined<T, TRequired, THasDefault> => {\n const state = env.getState(operationPath) as T | undefined;\n return (state ?? defaultValue) as MaybeUndefined<T, TRequired, THasDefault>;\n },\n };\n },\n\n applyOperation: (_state: T | undefined, operation: Operation.Operation<any, any, any>): T => {\n if (operation.kind !== \"literal.set\") {\n throw new ValidationError(`LiteralPrimitive cannot apply operation of kind: ${operation.kind}`);\n }\n\n const payload = operation.payload;\n if (payload !== this._schema.literal) {\n throw new ValidationError(\n `LiteralPrimitive.set requires the exact literal value \"${globalThis.String(this._schema.literal)}\", got: \"${globalThis.String(payload)}\"`\n );\n }\n\n return payload as T;\n },\n\n getInitialState: (): T | 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 // If paths don't overlap, no transformation needed\n if (!OperationPath.pathsOverlap(clientOp.path, serverOp.path)) {\n return { type: \"transformed\", operation: clientOp };\n }\n\n // For same path, client wins (last-write-wins)\n return { type: \"transformed\", operation: clientOp };\n },\n };\n}\n\n/** Creates a new LiteralPrimitive with the given literal value */\nexport const Literal = <T extends LiteralValue>(literal: T): LiteralPrimitive<T, false, false> =>\n new LiteralPrimitive({ required: false, defaultValue: undefined, literal });\n\n"],"mappings":";;;;;;;;;AAiCA,IAAa,mBAAb,MAAa,iBAAiS;CAqB5S,YAAY,QAAmC;wBApBtC,QAAO;wBACP;wBACA;wBACA;wBACA;wBACA;wBACA;wBAEQ;wBAEA,kBAAiB,EAChC,KAAKA,KAAyB;GAC5B,MAAM;GACN,SAAS,OAAO;GAChB,QAAQ,OAAO;GACf,QAAQ,YAAY;GACpB,cAAc;GACf,CAAC,EACH;wBA2BQ,aAA2E;GAClF,cAAc,KAAwC,kBAAwF;IAC5I,MAAM,eAAe,KAAK,QAAQ;AAClC,WAAO;KACL,WAAsD;MACpD,MAAM,QAAQ,IAAI,SAAS,cAAc;AACzC,aAAQ,6CAAS;;KAEnB,MAAM,UAAoD;AACxD,UAAI,aACFC,eAAyB,eAAe,KAAK,eAAe,KAAY,MAAM,CAC/E;;KAEH,SAAS,UAAuD;AAC9D,UAAI,aACFA,eAAyB,eAAe,KAAK,eAAe,KAAY,MAAM,CAC/E;;KAEH,kBAA6D;MAC3D,MAAM,QAAQ,IAAI,SAAS,cAAc;AACzC,aAAQ,6CAAS;;KAEpB;;GAGH,iBAAiB,QAAuB,cAAqD;AAC3F,QAAI,UAAU,SAAS,cACrB,OAAM,IAAI,gBAAgB,oDAAoD,UAAU,OAAO;IAGjG,MAAM,UAAU,UAAU;AAC1B,QAAI,YAAY,KAAK,QAAQ,QAC3B,OAAM,IAAI,gBACR,0DAA0D,WAAW,OAAO,KAAK,QAAQ,QAAQ,CAAC,WAAW,WAAW,OAAO,QAAQ,CAAC,GACzI;AAGH,WAAO;;GAGT,uBAAsC;AACpC,WAAO,KAAK,QAAQ;;GAGtB,qBACE,UACA,aAC8B;AAE9B,QAAI,CAACC,aAA2B,SAAS,MAAM,SAAS,KAAK,CAC3D,QAAO;KAAE,MAAM;KAAe,WAAW;KAAU;AAIrD,WAAO;KAAE,MAAM;KAAe,WAAW;KAAU;;GAEtD;AAhFC,OAAK,UAAU;;;CAIjB,WAAmD;AACjD,SAAO,IAAI,mDACN,KAAK,gBACR,UAAU,QACV;;;CAIJ,QAAQ,cAAuD;AAC7D,SAAO,IAAI,mDACN,KAAK,gBACR,gBACA;;;CAIJ,IAAI,UAAa;AACf,SAAO,KAAK,QAAQ;;;;AA+DxB,MAAa,WAAmC,YAC9C,IAAI,iBAAiB;CAAE,UAAU;CAAO,cAAc;CAAW;CAAS,CAAC"}
|
|
@@ -85,23 +85,45 @@ var NumberPrimitive = class NumberPrimitive {
|
|
|
85
85
|
}
|
|
86
86
|
/** Minimum value (inclusive) */
|
|
87
87
|
min(value) {
|
|
88
|
-
return
|
|
88
|
+
return new NumberPrimitive(require_objectSpread2._objectSpread2(require_objectSpread2._objectSpread2({}, this._schema), {}, { validators: [...this._schema.validators, {
|
|
89
|
+
validate: (v) => v >= value,
|
|
90
|
+
message: `Number must be at least ${value}`,
|
|
91
|
+
kind: "min",
|
|
92
|
+
params: { value }
|
|
93
|
+
}] }));
|
|
89
94
|
}
|
|
90
95
|
/** Maximum value (inclusive) */
|
|
91
96
|
max(value) {
|
|
92
|
-
return
|
|
97
|
+
return new NumberPrimitive(require_objectSpread2._objectSpread2(require_objectSpread2._objectSpread2({}, this._schema), {}, { validators: [...this._schema.validators, {
|
|
98
|
+
validate: (v) => v <= value,
|
|
99
|
+
message: `Number must be at most ${value}`,
|
|
100
|
+
kind: "max",
|
|
101
|
+
params: { value }
|
|
102
|
+
}] }));
|
|
93
103
|
}
|
|
94
104
|
/** Must be positive (> 0) */
|
|
95
105
|
positive() {
|
|
96
|
-
return
|
|
106
|
+
return new NumberPrimitive(require_objectSpread2._objectSpread2(require_objectSpread2._objectSpread2({}, this._schema), {}, { validators: [...this._schema.validators, {
|
|
107
|
+
validate: (v) => v > 0,
|
|
108
|
+
message: "Number must be positive",
|
|
109
|
+
kind: "positive"
|
|
110
|
+
}] }));
|
|
97
111
|
}
|
|
98
112
|
/** Must be negative (< 0) */
|
|
99
113
|
negative() {
|
|
100
|
-
return
|
|
114
|
+
return new NumberPrimitive(require_objectSpread2._objectSpread2(require_objectSpread2._objectSpread2({}, this._schema), {}, { validators: [...this._schema.validators, {
|
|
115
|
+
validate: (v) => v < 0,
|
|
116
|
+
message: "Number must be negative",
|
|
117
|
+
kind: "negative"
|
|
118
|
+
}] }));
|
|
101
119
|
}
|
|
102
120
|
/** Must be an integer */
|
|
103
121
|
int() {
|
|
104
|
-
return
|
|
122
|
+
return new NumberPrimitive(require_objectSpread2._objectSpread2(require_objectSpread2._objectSpread2({}, this._schema), {}, { validators: [...this._schema.validators, {
|
|
123
|
+
validate: (v) => globalThis.Number.isInteger(v),
|
|
124
|
+
message: "Number must be an integer",
|
|
125
|
+
kind: "int"
|
|
126
|
+
}] }));
|
|
105
127
|
}
|
|
106
128
|
};
|
|
107
129
|
/** Creates a new NumberPrimitive */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Number.d.cts","names":[],"sources":["../../src/primitives/Number.ts"],"sourcesContent":[],"mappings":";;;KAUK,wFAAwF,mBAAmB,WAAW;KACtH,2FAA2F,mBAAmB,WAAW;AADzH,UAGY,WAHC,CAAA,kBAAA,OAAA,GAAA,KAAA,EAAA,oBAAA,OAAA,GAAA,KAAA,CAAA,CAAA;EAA8F;EAAW,GAAA,EAAA,EAKlH,cALkH,CAAA,MAAA,EAK3F,SAL2F,EAKhF,WALgF,CAAA;EAA9B;EAAU,GAAA,CAAA,KAAA,EAO1F,aAP0F,CAO5E,SAP4E,EAOjE,WAPiE,CAAA,CAAA,EAAA,IAAA;EAClG;EAA8G,MAAA,CAAA,KAAA,EAQnG,gBARmG,CAQlF,SARkF,EAQvE,WARuE,CAAA,CAAA,EAAA,IAAA;EAAW;EAA9B,UAAA,EAAA,EAUhF,cAVgF,CAAA,MAAA,EAUzD,SAVyD,EAU9C,WAV8C,CAAA;;AAEhG,UAWU,qBAAA,CAXkB;EAEI,SAAA,QAAA,EAAA,OAAA;EAAW,SAAA,YAAA,EAAA,MAAA,GAAA,SAAA;EAAlC,SAAA,UAAA,EAAA,SAYuB,SAZvB,CAAA,MAAA,CAAA,EAAA;;AAE6B,cAazB,eAbyB,CAAA,kBAAA,OAAA,GAAA,KAAA,EAAA,oBAAA,OAAA,GAAA,KAAA,CAAA,YAa0E,SAb1E,CAAA,MAAA,EAa4F,WAb5F,CAawG,SAbxG,EAamH,WAbnH,CAAA,EAaiI,SAbjI,EAa4I,WAb5I,EAayJ,aAbzJ,CAauK,SAbvK,EAakL,WAblL,CAAA,EAagM,gBAbhM,CAaiN,SAbjN,EAa4N,WAb5N,CAAA,CAAA,CAAA;EAAzB,SAAA,IAAA,EAAA,iBAAA;EAEoB,SAAA,MAAA,EAAA,MAAA;EAAW,SAAA,MAAA,EAcxB,WAdwB,CAcZ,SAdY,EAcD,WAdC,CAAA;EAA5B,SAAA,UAAA,EAeQ,SAfR;EAEuB,SAAA,YAAA,EAcb,WAda;EAAW,SAAA,YAAA,EAexB,gBAfwB,CAeP,SAfO,EAeI,WAfJ,CAAA;EAAlC,SAAA,SAAA,EAgBO,aAhBP,CAgBqB,SAhBrB,EAgBgC,WAhBhC,CAAA;EAAc,iBAAA,OAAA;EAGpB,iBAAA,cAAqB;EAMlB,WAAA,CAAA,MAAe,EAqBN,qBArBM;EAAkH;EAAW,QAAA,CAAA,CAAA,EA0B3I,eA1B2I,CAAA,IAAA,EA0BrH,WA1BqH,CAAA;EAAvB;EAAqC,OAAA,CAAA,YAAA,EAAA,MAAA,CAAA,EAkCtI,eAlCsI,CAkCtH,SAlCsH,EAAA,IAAA,CAAA;EAAW;EAA2B,MAAA,CAAA,EAAA,EAAA,CAAA,KAAA,EAAA,MAAA,EAAA,GAAA,OAAA,EAAA,OAAA,EAAA,MAAA,CAAA,EA0ClJ,eA1CkJ,CA0ClI,SA1CkI,EA0CvH,WA1CuH,CAAA;EAAW;EAAzB,GAAA,CAAA,KAAA,EAAA,MAAA,CAAA,EAkDzK,eAlDyK,CAkDzJ,SAlDyJ,EAkD9I,WAlD8I,CAAA;EAAwD;EAAW,GAAA,CAAA,KAAA,EAAA,MAAA,CAAA,
|
|
1
|
+
{"version":3,"file":"Number.d.cts","names":[],"sources":["../../src/primitives/Number.ts"],"sourcesContent":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Number.d.mts","names":[],"sources":["../../src/primitives/Number.ts"],"sourcesContent":[],"mappings":";;;KAUK,wFAAwF,mBAAmB,WAAW;KACtH,2FAA2F,mBAAmB,WAAW;AADzH,UAGY,WAHC,CAAA,kBAAA,OAAA,GAAA,KAAA,EAAA,oBAAA,OAAA,GAAA,KAAA,CAAA,CAAA;EAA8F;EAAW,GAAA,EAAA,EAKlH,cALkH,CAAA,MAAA,EAK3F,SAL2F,EAKhF,WALgF,CAAA;EAA9B;EAAU,GAAA,CAAA,KAAA,EAO1F,aAP0F,CAO5E,SAP4E,EAOjE,WAPiE,CAAA,CAAA,EAAA,IAAA;EAClG;EAA8G,MAAA,CAAA,KAAA,EAQnG,gBARmG,CAQlF,SARkF,EAQvE,WARuE,CAAA,CAAA,EAAA,IAAA;EAAW;EAA9B,UAAA,EAAA,EAUhF,cAVgF,CAAA,MAAA,EAUzD,SAVyD,EAU9C,WAV8C,CAAA;;AAEhG,UAWU,qBAAA,CAXkB;EAEI,SAAA,QAAA,EAAA,OAAA;EAAW,SAAA,YAAA,EAAA,MAAA,GAAA,SAAA;EAAlC,SAAA,UAAA,EAAA,SAYuB,SAZvB,CAAA,MAAA,CAAA,EAAA;;AAE6B,cAazB,eAbyB,CAAA,kBAAA,OAAA,GAAA,KAAA,EAAA,oBAAA,OAAA,GAAA,KAAA,CAAA,YAa0E,SAb1E,CAAA,MAAA,EAa4F,WAb5F,CAawG,SAbxG,EAamH,WAbnH,CAAA,EAaiI,SAbjI,EAa4I,WAb5I,EAayJ,aAbzJ,CAauK,SAbvK,EAakL,WAblL,CAAA,EAagM,gBAbhM,CAaiN,SAbjN,EAa4N,WAb5N,CAAA,CAAA,CAAA;EAAzB,SAAA,IAAA,EAAA,iBAAA;EAEoB,SAAA,MAAA,EAAA,MAAA;EAAW,SAAA,MAAA,EAcxB,WAdwB,CAcZ,SAdY,EAcD,WAdC,CAAA;EAA5B,SAAA,UAAA,EAeQ,SAfR;EAEuB,SAAA,YAAA,EAcb,WAda;EAAW,SAAA,YAAA,EAexB,gBAfwB,CAeP,SAfO,EAeI,WAfJ,CAAA;EAAlC,SAAA,SAAA,EAgBO,aAhBP,CAgBqB,SAhBrB,EAgBgC,WAhBhC,CAAA;EAAc,iBAAA,OAAA;EAGpB,iBAAA,cAAqB;EAMlB,WAAA,CAAA,MAAe,EAqBN,qBArBM;EAAkH;EAAW,QAAA,CAAA,CAAA,EA0B3I,eA1B2I,CAAA,IAAA,EA0BrH,WA1BqH,CAAA;EAAvB;EAAqC,OAAA,CAAA,YAAA,EAAA,MAAA,CAAA,EAkCtI,eAlCsI,CAkCtH,SAlCsH,EAAA,IAAA,CAAA;EAAW;EAA2B,MAAA,CAAA,EAAA,EAAA,CAAA,KAAA,EAAA,MAAA,EAAA,GAAA,OAAA,EAAA,OAAA,EAAA,MAAA,CAAA,EA0ClJ,eA1CkJ,CA0ClI,SA1CkI,EA0CvH,WA1CuH,CAAA;EAAW;EAAzB,GAAA,CAAA,KAAA,EAAA,MAAA,CAAA,EAkDzK,eAlDyK,CAkDzJ,SAlDyJ,EAkD9I,WAlD8I,CAAA;EAAwD;EAAW,GAAA,CAAA,KAAA,EAAA,MAAA,CAAA,
|
|
1
|
+
{"version":3,"file":"Number.d.mts","names":[],"sources":["../../src/primitives/Number.ts"],"sourcesContent":[],"mappings":"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"}
|
|
@@ -84,23 +84,45 @@ var NumberPrimitive = class NumberPrimitive {
|
|
|
84
84
|
}
|
|
85
85
|
/** Minimum value (inclusive) */
|
|
86
86
|
min(value) {
|
|
87
|
-
return this.
|
|
87
|
+
return new NumberPrimitive(_objectSpread2(_objectSpread2({}, this._schema), {}, { validators: [...this._schema.validators, {
|
|
88
|
+
validate: (v) => v >= value,
|
|
89
|
+
message: `Number must be at least ${value}`,
|
|
90
|
+
kind: "min",
|
|
91
|
+
params: { value }
|
|
92
|
+
}] }));
|
|
88
93
|
}
|
|
89
94
|
/** Maximum value (inclusive) */
|
|
90
95
|
max(value) {
|
|
91
|
-
return this.
|
|
96
|
+
return new NumberPrimitive(_objectSpread2(_objectSpread2({}, this._schema), {}, { validators: [...this._schema.validators, {
|
|
97
|
+
validate: (v) => v <= value,
|
|
98
|
+
message: `Number must be at most ${value}`,
|
|
99
|
+
kind: "max",
|
|
100
|
+
params: { value }
|
|
101
|
+
}] }));
|
|
92
102
|
}
|
|
93
103
|
/** Must be positive (> 0) */
|
|
94
104
|
positive() {
|
|
95
|
-
return this.
|
|
105
|
+
return new NumberPrimitive(_objectSpread2(_objectSpread2({}, this._schema), {}, { validators: [...this._schema.validators, {
|
|
106
|
+
validate: (v) => v > 0,
|
|
107
|
+
message: "Number must be positive",
|
|
108
|
+
kind: "positive"
|
|
109
|
+
}] }));
|
|
96
110
|
}
|
|
97
111
|
/** Must be negative (< 0) */
|
|
98
112
|
negative() {
|
|
99
|
-
return this.
|
|
113
|
+
return new NumberPrimitive(_objectSpread2(_objectSpread2({}, this._schema), {}, { validators: [...this._schema.validators, {
|
|
114
|
+
validate: (v) => v < 0,
|
|
115
|
+
message: "Number must be negative",
|
|
116
|
+
kind: "negative"
|
|
117
|
+
}] }));
|
|
100
118
|
}
|
|
101
119
|
/** Must be an integer */
|
|
102
120
|
int() {
|
|
103
|
-
return
|
|
121
|
+
return new NumberPrimitive(_objectSpread2(_objectSpread2({}, this._schema), {}, { validators: [...this._schema.validators, {
|
|
122
|
+
validate: (v) => globalThis.Number.isInteger(v),
|
|
123
|
+
message: "Number must be an integer",
|
|
124
|
+
kind: "int"
|
|
125
|
+
}] }));
|
|
104
126
|
}
|
|
105
127
|
};
|
|
106
128
|
/** Creates a new NumberPrimitive */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Number.mjs","names":["OperationDefinition.make","Operation.fromDefinition","OperationPath.pathsOverlap"],"sources":["../../src/primitives/Number.ts"],"sourcesContent":["import { 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, Validator, NeedsValue } from \"./shared\";\nimport { ValidationError, runValidators, isCompatibleOperation } from \"./shared\";\n\n\ntype InferSetInput<TRequired extends boolean = false, THasDefault extends boolean = false> = NeedsValue<number, TRequired, THasDefault>\ntype InferUpdateInput<TRequired extends boolean = false, THasDefault extends boolean = false> = NeedsValue<number, TRequired, THasDefault>\n\nexport interface NumberProxy<TRequired extends boolean = false, THasDefault extends boolean = false> {\n /** Gets the current number value */\n get(): MaybeUndefined<number, TRequired, THasDefault>;\n /** Sets the number value, generating a number.set operation */\n set(value: InferSetInput<TRequired, THasDefault>): void;\n /** This is the same as set. Updates the number value, generating a number.set operation */\n update(value: InferUpdateInput<TRequired, THasDefault>): void;\n /** Returns a readonly snapshot of the number value for rendering */\n toSnapshot(): MaybeUndefined<number, TRequired, THasDefault>;\n}\n\ninterface NumberPrimitiveSchema {\n readonly required: boolean;\n readonly defaultValue: number | undefined;\n readonly validators: readonly Validator<number>[];\n}\n\nexport class NumberPrimitive<TRequired extends boolean = false, THasDefault extends boolean = false> implements Primitive<number, NumberProxy<TRequired, THasDefault>, TRequired, THasDefault, InferSetInput<TRequired, THasDefault>, InferUpdateInput<TRequired, THasDefault>> {\n readonly _tag = \"NumberPrimitive\" as const;\n readonly _State!: number;\n readonly _Proxy!: NumberProxy<TRequired, THasDefault>;\n readonly _TRequired!: TRequired;\n readonly _THasDefault!: THasDefault;\n readonly TUpdateInput!: InferUpdateInput<TRequired, THasDefault>;\n readonly TSetInput!: InferSetInput<TRequired, THasDefault>;\n\n private readonly _schema: NumberPrimitiveSchema;\n\n private readonly _opDefinitions = {\n set: OperationDefinition.make({\n kind: \"number.set\" as const,\n payload: Schema.Number,\n target: Schema.Number,\n apply: (payload) => payload,\n deduplicable: true,\n }),\n };\n\n constructor(schema: NumberPrimitiveSchema) {\n this._schema = schema;\n }\n\n /** Mark this number as required */\n required(): NumberPrimitive<true, THasDefault> {\n return new NumberPrimitive({\n ...this._schema,\n required: true,\n });\n }\n\n /** Set a default value for this number */\n default(defaultValue: number): NumberPrimitive<TRequired, true> {\n return new NumberPrimitive({\n ...this._schema,\n defaultValue,\n });\n }\n\n /** Add a custom validation rule */\n refine(fn: (value: number) => boolean, message: string): NumberPrimitive<TRequired, THasDefault> {\n return new NumberPrimitive({\n ...this._schema,\n validators: [...this._schema.validators, { validate: fn, message }],\n });\n }\n\n /** Minimum value (inclusive) */\n min(value: number): NumberPrimitive<TRequired, THasDefault> {\n return this.
|
|
1
|
+
{"version":3,"file":"Number.mjs","names":["OperationDefinition.make","Operation.fromDefinition","OperationPath.pathsOverlap"],"sources":["../../src/primitives/Number.ts"],"sourcesContent":["import { 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, Validator, NeedsValue } from \"./shared\";\nimport { ValidationError, runValidators, isCompatibleOperation } from \"./shared\";\n\n\ntype InferSetInput<TRequired extends boolean = false, THasDefault extends boolean = false> = NeedsValue<number, TRequired, THasDefault>\ntype InferUpdateInput<TRequired extends boolean = false, THasDefault extends boolean = false> = NeedsValue<number, TRequired, THasDefault>\n\nexport interface NumberProxy<TRequired extends boolean = false, THasDefault extends boolean = false> {\n /** Gets the current number value */\n get(): MaybeUndefined<number, TRequired, THasDefault>;\n /** Sets the number value, generating a number.set operation */\n set(value: InferSetInput<TRequired, THasDefault>): void;\n /** This is the same as set. Updates the number value, generating a number.set operation */\n update(value: InferUpdateInput<TRequired, THasDefault>): void;\n /** Returns a readonly snapshot of the number value for rendering */\n toSnapshot(): MaybeUndefined<number, TRequired, THasDefault>;\n}\n\ninterface NumberPrimitiveSchema {\n readonly required: boolean;\n readonly defaultValue: number | undefined;\n readonly validators: readonly Validator<number>[];\n}\n\nexport class NumberPrimitive<TRequired extends boolean = false, THasDefault extends boolean = false> implements Primitive<number, NumberProxy<TRequired, THasDefault>, TRequired, THasDefault, InferSetInput<TRequired, THasDefault>, InferUpdateInput<TRequired, THasDefault>> {\n readonly _tag = \"NumberPrimitive\" as const;\n readonly _State!: number;\n readonly _Proxy!: NumberProxy<TRequired, THasDefault>;\n readonly _TRequired!: TRequired;\n readonly _THasDefault!: THasDefault;\n readonly TUpdateInput!: InferUpdateInput<TRequired, THasDefault>;\n readonly TSetInput!: InferSetInput<TRequired, THasDefault>;\n\n private readonly _schema: NumberPrimitiveSchema;\n\n private readonly _opDefinitions = {\n set: OperationDefinition.make({\n kind: \"number.set\" as const,\n payload: Schema.Number,\n target: Schema.Number,\n apply: (payload) => payload,\n deduplicable: true,\n }),\n };\n\n constructor(schema: NumberPrimitiveSchema) {\n this._schema = schema;\n }\n\n /** Mark this number as required */\n required(): NumberPrimitive<true, THasDefault> {\n return new NumberPrimitive({\n ...this._schema,\n required: true,\n });\n }\n\n /** Set a default value for this number */\n default(defaultValue: number): NumberPrimitive<TRequired, true> {\n return new NumberPrimitive({\n ...this._schema,\n defaultValue,\n });\n }\n\n /** Add a custom validation rule */\n refine(fn: (value: number) => boolean, message: string): NumberPrimitive<TRequired, THasDefault> {\n return new NumberPrimitive({\n ...this._schema,\n validators: [...this._schema.validators, { validate: fn, message }],\n });\n }\n\n /** Minimum value (inclusive) */\n min(value: number): NumberPrimitive<TRequired, THasDefault> {\n return new NumberPrimitive({\n ...this._schema,\n validators: [...this._schema.validators, {\n validate: (v) => v >= value,\n message: `Number must be at least ${value}`,\n kind: \"min\",\n params: { value },\n }],\n });\n }\n\n /** Maximum value (inclusive) */\n max(value: number): NumberPrimitive<TRequired, THasDefault> {\n return new NumberPrimitive({\n ...this._schema,\n validators: [...this._schema.validators, {\n validate: (v) => v <= value,\n message: `Number must be at most ${value}`,\n kind: \"max\",\n params: { value },\n }],\n });\n }\n\n /** Must be positive (> 0) */\n positive(): NumberPrimitive<TRequired, THasDefault> {\n return new NumberPrimitive({\n ...this._schema,\n validators: [...this._schema.validators, {\n validate: (v) => v > 0,\n message: \"Number must be positive\",\n kind: \"positive\",\n }],\n });\n }\n\n /** Must be negative (< 0) */\n negative(): NumberPrimitive<TRequired, THasDefault> {\n return new NumberPrimitive({\n ...this._schema,\n validators: [...this._schema.validators, {\n validate: (v) => v < 0,\n message: \"Number must be negative\",\n kind: \"negative\",\n }],\n });\n }\n\n /** Must be an integer */\n int(): NumberPrimitive<TRequired, THasDefault> {\n return new NumberPrimitive({\n ...this._schema,\n validators: [...this._schema.validators, {\n validate: (v) => globalThis.Number.isInteger(v),\n message: \"Number must be an integer\",\n kind: \"int\",\n }],\n });\n }\n\n readonly _internal: PrimitiveInternal<number, NumberProxy<TRequired, THasDefault>> = {\n createProxy: (env: ProxyEnvironment.ProxyEnvironment, operationPath: OperationPath.OperationPath): NumberProxy<TRequired, THasDefault> => {\n const defaultValue = this._schema.defaultValue;\n return {\n get: (): MaybeUndefined<number, TRequired, THasDefault> => {\n const state = env.getState(operationPath) as number | undefined;\n return (state ?? defaultValue) as MaybeUndefined<number, TRequired, THasDefault>;\n },\n set: (value: InferSetInput<TRequired, THasDefault>) => {\n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.set as any, value)\n );\n },\n update: (value: InferUpdateInput<TRequired, THasDefault>) => {\n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.set as any, value)\n );\n },\n toSnapshot: (): MaybeUndefined<number, TRequired, THasDefault> => {\n const state = env.getState(operationPath) as number | undefined;\n return (state ?? defaultValue) as MaybeUndefined<number, TRequired, THasDefault>;\n },\n };\n },\n\n applyOperation: (_state: number | undefined, operation: Operation.Operation<any, any, any>): number => {\n if (operation.kind !== \"number.set\") {\n throw new ValidationError(`NumberPrimitive cannot apply operation of kind: ${operation.kind}`);\n }\n\n const payload = operation.payload;\n if (typeof payload !== \"number\") {\n throw new ValidationError(`NumberPrimitive.set requires a number payload, got: ${typeof payload}`);\n }\n\n // Run validators\n runValidators(payload, this._schema.validators);\n\n return payload;\n },\n\n getInitialState: (): number | 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 // If paths don't overlap, no transformation needed\n if (!OperationPath.pathsOverlap(clientOp.path, serverOp.path)) {\n return { type: \"transformed\", operation: clientOp };\n }\n\n // For same path, client wins (last-write-wins)\n return { type: \"transformed\", operation: clientOp };\n },\n };\n}\n\n/** Creates a new NumberPrimitive */\nexport const Number = (): NumberPrimitive<false, false> =>\n new NumberPrimitive({ required: false, defaultValue: undefined, validators: [] });\n\n"],"mappings":"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"}
|
|
@@ -85,35 +85,66 @@ var StringPrimitive = class StringPrimitive {
|
|
|
85
85
|
}
|
|
86
86
|
/** Minimum string length */
|
|
87
87
|
min(length) {
|
|
88
|
-
return
|
|
88
|
+
return new StringPrimitive(require_objectSpread2._objectSpread2(require_objectSpread2._objectSpread2({}, this._schema), {}, { validators: [...this._schema.validators, {
|
|
89
|
+
validate: (v) => v.length >= length,
|
|
90
|
+
message: `String must be at least ${length} characters`,
|
|
91
|
+
kind: "min",
|
|
92
|
+
params: { value: length }
|
|
93
|
+
}] }));
|
|
89
94
|
}
|
|
90
95
|
/** Maximum string length */
|
|
91
96
|
max(length) {
|
|
92
|
-
return
|
|
97
|
+
return new StringPrimitive(require_objectSpread2._objectSpread2(require_objectSpread2._objectSpread2({}, this._schema), {}, { validators: [...this._schema.validators, {
|
|
98
|
+
validate: (v) => v.length <= length,
|
|
99
|
+
message: `String must be at most ${length} characters`,
|
|
100
|
+
kind: "max",
|
|
101
|
+
params: { value: length }
|
|
102
|
+
}] }));
|
|
93
103
|
}
|
|
94
104
|
/** Exact string length */
|
|
95
105
|
length(exact) {
|
|
96
|
-
return
|
|
106
|
+
return new StringPrimitive(require_objectSpread2._objectSpread2(require_objectSpread2._objectSpread2({}, this._schema), {}, { validators: [...this._schema.validators, {
|
|
107
|
+
validate: (v) => v.length === exact,
|
|
108
|
+
message: `String must be exactly ${exact} characters`,
|
|
109
|
+
kind: "length",
|
|
110
|
+
params: { value: exact }
|
|
111
|
+
}] }));
|
|
97
112
|
}
|
|
98
113
|
/** Match a regex pattern */
|
|
99
114
|
regex(pattern, message) {
|
|
100
|
-
return
|
|
115
|
+
return new StringPrimitive(require_objectSpread2._objectSpread2(require_objectSpread2._objectSpread2({}, this._schema), {}, { validators: [...this._schema.validators, {
|
|
116
|
+
validate: (v) => pattern.test(v),
|
|
117
|
+
message: message !== null && message !== void 0 ? message : `String must match pattern ${pattern}`,
|
|
118
|
+
kind: "regex",
|
|
119
|
+
params: {
|
|
120
|
+
pattern: pattern.source,
|
|
121
|
+
flags: pattern.flags
|
|
122
|
+
}
|
|
123
|
+
}] }));
|
|
101
124
|
}
|
|
102
125
|
/** Validate as email format */
|
|
103
126
|
email() {
|
|
104
127
|
const emailPattern = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
|
105
|
-
return
|
|
128
|
+
return new StringPrimitive(require_objectSpread2._objectSpread2(require_objectSpread2._objectSpread2({}, this._schema), {}, { validators: [...this._schema.validators, {
|
|
129
|
+
validate: (v) => emailPattern.test(v),
|
|
130
|
+
message: "Invalid email format",
|
|
131
|
+
kind: "email"
|
|
132
|
+
}] }));
|
|
106
133
|
}
|
|
107
134
|
/** Validate as URL format */
|
|
108
135
|
url() {
|
|
109
|
-
return
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
136
|
+
return new StringPrimitive(require_objectSpread2._objectSpread2(require_objectSpread2._objectSpread2({}, this._schema), {}, { validators: [...this._schema.validators, {
|
|
137
|
+
validate: (v) => {
|
|
138
|
+
try {
|
|
139
|
+
new URL(v);
|
|
140
|
+
return true;
|
|
141
|
+
} catch (_unused) {
|
|
142
|
+
return false;
|
|
143
|
+
}
|
|
144
|
+
},
|
|
145
|
+
message: "Invalid URL format",
|
|
146
|
+
kind: "url"
|
|
147
|
+
}] }));
|
|
117
148
|
}
|
|
118
149
|
};
|
|
119
150
|
/** Creates a new StringPrimitive */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"String.d.cts","names":[],"sources":["../../src/primitives/String.ts"],"sourcesContent":[],"mappings":";;;KAUK,wFAAwF,mBAAmB,WAAW;KACtH,2FAA2F,mBAAmB,WAAW;AADzH,UAOY,WAPC,CAAA,kBAAA,OAAA,GAAA,KAAA,EAAA,oBAAA,OAAA,GAAA,KAAA,CAAA,CAAA;EAA8F;EAAW,GAAA,EAAA,EASlH,cATkH,CAAA,MAAA,EAS3F,SAT2F,EAShF,WATgF,CAAA;EAA9B;EAAU,GAAA,CAAA,KAAA,EAW1F,aAX0F,CAW5E,SAX4E,EAWjE,WAXiE,CAAA,CAAA,EAAA,IAAA;EAClG;EAA8G,MAAA,CAAA,KAAA,EAYnG,gBAZmG,CAYlF,SAZkF,EAYvE,WAZuE,CAAA,CAAA,EAAA,IAAA;EAAW;EAA9B,UAAA,EAAA,EAchF,cAdgF,CAAA,MAAA,EAczD,SAdyD,EAc9C,WAd8C,CAAA;;AAMhG,UAWU,qBAAA,CAXkB;EAEI,SAAA,QAAA,EAAA,OAAA;EAAW,SAAA,YAAA,EAAA,MAAA,GAAA,SAAA;EAAlC,SAAA,UAAA,EAAA,SAYuB,SAZvB,CAAA,MAAA,CAAA,EAAA;;AAE6B,cAazB,eAbyB,CAAA,kBAAA,OAAA,GAAA,KAAA,EAAA,oBAAA,OAAA,GAAA,KAAA,CAAA,YAa0E,SAb1E,CAAA,MAAA,EAa4F,WAb5F,CAawG,SAbxG,EAamH,WAbnH,CAAA,EAaiI,SAbjI,EAa4I,WAb5I,EAayJ,aAbzJ,CAauK,SAbvK,EAakL,WAblL,CAAA,EAagM,gBAbhM,CAaiN,SAbjN,EAa4N,WAb5N,CAAA,CAAA,CAAA;EAAzB,SAAA,IAAA,EAAA,iBAAA;EAEoB,SAAA,MAAA,EAAA,MAAA;EAAW,SAAA,MAAA,EAcxB,WAdwB,CAcZ,SAdY,EAcD,WAdC,CAAA;EAA5B,SAAA,UAAA,EAeQ,SAfR;EAEuB,SAAA,YAAA,EAcb,WAda;EAAW,SAAA,YAAA,EAexB,gBAfwB,CAeP,SAfO,EAeI,WAfJ,CAAA;EAAlC,SAAA,SAAA,EAgBO,aAhBP,CAgBqB,SAhBrB,EAgBgC,WAhBhC,CAAA;EAAc,iBAAA,OAAA;EAGpB,iBAAA,cAAqB;EAMlB,WAAA,CAAA,MAAe,EAqBN,qBArBM;EAAkH;EAAW,QAAA,CAAA,CAAA,EA0B3I,eA1B2I,CAAA,IAAA,EA0BrH,WA1BqH,CAAA;EAAvB;EAAqC,OAAA,CAAA,YAAA,EAAA,MAAA,CAAA,EAkCtI,eAlCsI,CAkCtH,SAlCsH,EAAA,IAAA,CAAA;EAAW;EAA2B,MAAA,CAAA,EAAA,EAAA,CAAA,KAAA,EAAA,MAAA,EAAA,GAAA,OAAA,EAAA,OAAA,EAAA,MAAA,CAAA,EA0ClJ,eA1CkJ,CA0ClI,SA1CkI,EA0CvH,WA1CuH,CAAA;EAAW;EAAzB,GAAA,CAAA,MAAA,EAAA,MAAA,CAAA,EAkDxK,eAlDwK,CAkDxJ,SAlDwJ,EAkD7I,WAlD6I,CAAA;EAAwD;EAAW,GAAA,CAAA,MAAA,EAAA,MAAA,CAAA,
|
|
1
|
+
{"version":3,"file":"String.d.cts","names":[],"sources":["../../src/primitives/String.ts"],"sourcesContent":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"String.d.mts","names":[],"sources":["../../src/primitives/String.ts"],"sourcesContent":[],"mappings":";;;KAUK,wFAAwF,mBAAmB,WAAW;KACtH,2FAA2F,mBAAmB,WAAW;AADzH,UAOY,WAPC,CAAA,kBAAA,OAAA,GAAA,KAAA,EAAA,oBAAA,OAAA,GAAA,KAAA,CAAA,CAAA;EAA8F;EAAW,GAAA,EAAA,EASlH,cATkH,CAAA,MAAA,EAS3F,SAT2F,EAShF,WATgF,CAAA;EAA9B;EAAU,GAAA,CAAA,KAAA,EAW1F,aAX0F,CAW5E,SAX4E,EAWjE,WAXiE,CAAA,CAAA,EAAA,IAAA;EAClG;EAA8G,MAAA,CAAA,KAAA,EAYnG,gBAZmG,CAYlF,SAZkF,EAYvE,WAZuE,CAAA,CAAA,EAAA,IAAA;EAAW;EAA9B,UAAA,EAAA,EAchF,cAdgF,CAAA,MAAA,EAczD,SAdyD,EAc9C,WAd8C,CAAA;;AAMhG,UAWU,qBAAA,CAXkB;EAEI,SAAA,QAAA,EAAA,OAAA;EAAW,SAAA,YAAA,EAAA,MAAA,GAAA,SAAA;EAAlC,SAAA,UAAA,EAAA,SAYuB,SAZvB,CAAA,MAAA,CAAA,EAAA;;AAE6B,cAazB,eAbyB,CAAA,kBAAA,OAAA,GAAA,KAAA,EAAA,oBAAA,OAAA,GAAA,KAAA,CAAA,YAa0E,SAb1E,CAAA,MAAA,EAa4F,WAb5F,CAawG,SAbxG,EAamH,WAbnH,CAAA,EAaiI,SAbjI,EAa4I,WAb5I,EAayJ,aAbzJ,CAauK,SAbvK,EAakL,WAblL,CAAA,EAagM,gBAbhM,CAaiN,SAbjN,EAa4N,WAb5N,CAAA,CAAA,CAAA;EAAzB,SAAA,IAAA,EAAA,iBAAA;EAEoB,SAAA,MAAA,EAAA,MAAA;EAAW,SAAA,MAAA,EAcxB,WAdwB,CAcZ,SAdY,EAcD,WAdC,CAAA;EAA5B,SAAA,UAAA,EAeQ,SAfR;EAEuB,SAAA,YAAA,EAcb,WAda;EAAW,SAAA,YAAA,EAexB,gBAfwB,CAeP,SAfO,EAeI,WAfJ,CAAA;EAAlC,SAAA,SAAA,EAgBO,aAhBP,CAgBqB,SAhBrB,EAgBgC,WAhBhC,CAAA;EAAc,iBAAA,OAAA;EAGpB,iBAAA,cAAqB;EAMlB,WAAA,CAAA,MAAe,EAqBN,qBArBM;EAAkH;EAAW,QAAA,CAAA,CAAA,EA0B3I,eA1B2I,CAAA,IAAA,EA0BrH,WA1BqH,CAAA;EAAvB;EAAqC,OAAA,CAAA,YAAA,EAAA,MAAA,CAAA,EAkCtI,eAlCsI,CAkCtH,SAlCsH,EAAA,IAAA,CAAA;EAAW;EAA2B,MAAA,CAAA,EAAA,EAAA,CAAA,KAAA,EAAA,MAAA,EAAA,GAAA,OAAA,EAAA,OAAA,EAAA,MAAA,CAAA,EA0ClJ,eA1CkJ,CA0ClI,SA1CkI,EA0CvH,WA1CuH,CAAA;EAAW;EAAzB,GAAA,CAAA,MAAA,EAAA,MAAA,CAAA,EAkDxK,eAlDwK,CAkDxJ,SAlDwJ,EAkD7I,WAlD6I,CAAA;EAAwD;EAAW,GAAA,CAAA,MAAA,EAAA,MAAA,CAAA,
|
|
1
|
+
{"version":3,"file":"String.d.mts","names":[],"sources":["../../src/primitives/String.ts"],"sourcesContent":[],"mappings":"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"}
|
|
@@ -84,35 +84,66 @@ var StringPrimitive = class StringPrimitive {
|
|
|
84
84
|
}
|
|
85
85
|
/** Minimum string length */
|
|
86
86
|
min(length) {
|
|
87
|
-
return
|
|
87
|
+
return new StringPrimitive(_objectSpread2(_objectSpread2({}, this._schema), {}, { validators: [...this._schema.validators, {
|
|
88
|
+
validate: (v) => v.length >= length,
|
|
89
|
+
message: `String must be at least ${length} characters`,
|
|
90
|
+
kind: "min",
|
|
91
|
+
params: { value: length }
|
|
92
|
+
}] }));
|
|
88
93
|
}
|
|
89
94
|
/** Maximum string length */
|
|
90
95
|
max(length) {
|
|
91
|
-
return
|
|
96
|
+
return new StringPrimitive(_objectSpread2(_objectSpread2({}, this._schema), {}, { validators: [...this._schema.validators, {
|
|
97
|
+
validate: (v) => v.length <= length,
|
|
98
|
+
message: `String must be at most ${length} characters`,
|
|
99
|
+
kind: "max",
|
|
100
|
+
params: { value: length }
|
|
101
|
+
}] }));
|
|
92
102
|
}
|
|
93
103
|
/** Exact string length */
|
|
94
104
|
length(exact) {
|
|
95
|
-
return
|
|
105
|
+
return new StringPrimitive(_objectSpread2(_objectSpread2({}, this._schema), {}, { validators: [...this._schema.validators, {
|
|
106
|
+
validate: (v) => v.length === exact,
|
|
107
|
+
message: `String must be exactly ${exact} characters`,
|
|
108
|
+
kind: "length",
|
|
109
|
+
params: { value: exact }
|
|
110
|
+
}] }));
|
|
96
111
|
}
|
|
97
112
|
/** Match a regex pattern */
|
|
98
113
|
regex(pattern, message) {
|
|
99
|
-
return
|
|
114
|
+
return new StringPrimitive(_objectSpread2(_objectSpread2({}, this._schema), {}, { validators: [...this._schema.validators, {
|
|
115
|
+
validate: (v) => pattern.test(v),
|
|
116
|
+
message: message !== null && message !== void 0 ? message : `String must match pattern ${pattern}`,
|
|
117
|
+
kind: "regex",
|
|
118
|
+
params: {
|
|
119
|
+
pattern: pattern.source,
|
|
120
|
+
flags: pattern.flags
|
|
121
|
+
}
|
|
122
|
+
}] }));
|
|
100
123
|
}
|
|
101
124
|
/** Validate as email format */
|
|
102
125
|
email() {
|
|
103
126
|
const emailPattern = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
|
104
|
-
return
|
|
127
|
+
return new StringPrimitive(_objectSpread2(_objectSpread2({}, this._schema), {}, { validators: [...this._schema.validators, {
|
|
128
|
+
validate: (v) => emailPattern.test(v),
|
|
129
|
+
message: "Invalid email format",
|
|
130
|
+
kind: "email"
|
|
131
|
+
}] }));
|
|
105
132
|
}
|
|
106
133
|
/** Validate as URL format */
|
|
107
134
|
url() {
|
|
108
|
-
return this.
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
135
|
+
return new StringPrimitive(_objectSpread2(_objectSpread2({}, this._schema), {}, { validators: [...this._schema.validators, {
|
|
136
|
+
validate: (v) => {
|
|
137
|
+
try {
|
|
138
|
+
new URL(v);
|
|
139
|
+
return true;
|
|
140
|
+
} catch (_unused) {
|
|
141
|
+
return false;
|
|
142
|
+
}
|
|
143
|
+
},
|
|
144
|
+
message: "Invalid URL format",
|
|
145
|
+
kind: "url"
|
|
146
|
+
}] }));
|
|
116
147
|
}
|
|
117
148
|
};
|
|
118
149
|
/** Creates a new StringPrimitive */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"String.mjs","names":["OperationDefinition.make","Operation.fromDefinition","OperationPath.pathsOverlap"],"sources":["../../src/primitives/String.ts"],"sourcesContent":["import { 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, Validator, NeedsValue } from \"./shared\";\nimport { runValidators, isCompatibleOperation, ValidationError } from \"./shared\";\n\n\ntype InferSetInput<TRequired extends boolean = false, THasDefault extends boolean = false> = NeedsValue<string, TRequired, THasDefault>\ntype InferUpdateInput<TRequired extends boolean = false, THasDefault extends boolean = false> = NeedsValue<string, TRequired, THasDefault>\n\n// =============================================================================\n// String Primitive\n// =============================================================================\n\nexport interface StringProxy<TRequired extends boolean = false, THasDefault extends boolean = false> {\n /** Gets the current string value */\n get(): MaybeUndefined<string, TRequired, THasDefault>;\n /** Sets the string value, generating a string.set operation */\n set(value: InferSetInput<TRequired, THasDefault>): void;\n /** This is the same as set. Updates the string value, generating a string.set operation */\n update(value: InferUpdateInput<TRequired, THasDefault>): void;\n /** Returns a readonly snapshot of the string value for rendering */\n toSnapshot(): MaybeUndefined<string, TRequired, THasDefault>;\n}\n\ninterface StringPrimitiveSchema {\n readonly required: boolean;\n readonly defaultValue: string | undefined;\n readonly validators: readonly Validator<string>[];\n}\n\nexport class StringPrimitive<TRequired extends boolean = false, THasDefault extends boolean = false> implements Primitive<string, StringProxy<TRequired, THasDefault>, TRequired, THasDefault, InferSetInput<TRequired, THasDefault>, InferUpdateInput<TRequired, THasDefault>> {\n readonly _tag = \"StringPrimitive\" as const;\n readonly _State!: string;\n readonly _Proxy!: StringProxy<TRequired, THasDefault>;\n readonly _TRequired!: TRequired;\n readonly _THasDefault!: THasDefault;\n readonly TUpdateInput!: InferUpdateInput<TRequired, THasDefault>;\n readonly TSetInput!: InferSetInput<TRequired, THasDefault>;\n\n private readonly _schema: StringPrimitiveSchema;\n\n private readonly _opDefinitions = {\n set: OperationDefinition.make({\n kind: \"string.set\" as const,\n payload: Schema.String,\n target: Schema.String,\n apply: (payload) => payload,\n deduplicable: true,\n }),\n };\n\n constructor(schema: StringPrimitiveSchema) {\n this._schema = schema;\n }\n\n /** Mark this string as required */\n required(): StringPrimitive<true, THasDefault> {\n return new StringPrimitive({\n ...this._schema,\n required: true,\n });\n }\n\n /** Set a default value for this string */\n default(defaultValue: string): StringPrimitive<TRequired, true> {\n return new StringPrimitive({\n ...this._schema,\n defaultValue,\n });\n }\n\n /** Add a custom validation rule */\n refine(fn: (value: string) => boolean, message: string): StringPrimitive<TRequired, THasDefault> {\n return new StringPrimitive({\n ...this._schema,\n validators: [...this._schema.validators, { validate: fn, message }],\n });\n }\n\n /** Minimum string length */\n min(length: number): StringPrimitive<TRequired, THasDefault> {\n return this.refine(\n (v) => v.length >= length,\n `String must be at least ${length} characters`\n );\n }\n\n /** Maximum string length */\n max(length: number): StringPrimitive<TRequired, THasDefault> {\n return this.refine(\n (v) => v.length <= length,\n `String must be at most ${length} characters`\n );\n }\n\n /** Exact string length */\n length(exact: number): StringPrimitive<TRequired, THasDefault> {\n return this.refine(\n (v) => v.length === exact,\n `String must be exactly ${exact} characters`\n );\n }\n\n /** Match a regex pattern */\n regex(pattern: RegExp, message?: string): StringPrimitive<TRequired, THasDefault> {\n return this.refine(\n (v) => pattern.test(v),\n message ?? `String must match pattern ${pattern}`\n );\n }\n\n /** Validate as email format */\n email(): StringPrimitive<TRequired, THasDefault> {\n // Simple email regex - covers most common cases\n const emailPattern = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n return this.refine(\n (v) => emailPattern.test(v),\n \"Invalid email format\"\n );\n }\n\n /** Validate as URL format */\n url(): StringPrimitive<TRequired, THasDefault> {\n return this.refine(\n (v) => {\n try {\n new URL(v);\n return true;\n } catch {\n return false;\n }\n },\n \"Invalid URL format\"\n );\n }\n\n readonly _internal: PrimitiveInternal<string, StringProxy<TRequired, THasDefault>> = {\n createProxy: (env: ProxyEnvironment.ProxyEnvironment, operationPath: OperationPath.OperationPath): StringProxy<TRequired, THasDefault> => {\n const defaultValue = this._schema.defaultValue;\n return {\n get: (): MaybeUndefined<string, TRequired, THasDefault> => {\n const state = env.getState(operationPath) as string | undefined;\n return (state ?? defaultValue) as MaybeUndefined<string, TRequired, THasDefault>;\n },\n set: (value: InferSetInput<TRequired, THasDefault>) => {\n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.set, value)\n );\n },\n update: (value: InferUpdateInput<TRequired, THasDefault>) => {\n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.set, value)\n );\n },\n toSnapshot: (): MaybeUndefined<string, TRequired, THasDefault> => {\n const state = env.getState(operationPath) as string | undefined;\n return (state ?? defaultValue) as MaybeUndefined<string, TRequired, THasDefault>;\n },\n };\n },\n\n applyOperation: (_state: string | undefined, operation: Operation.Operation<any, any, any>): string => {\n if (!isCompatibleOperation(operation, this._opDefinitions)) {\n throw new ValidationError(`StringPrimitive cannot apply operation of kind: ${operation.kind}`);\n }\n\n const payload = operation.payload;\n if (typeof payload !== \"string\") {\n throw new ValidationError(`StringPrimitive.set requires a string payload, got: ${typeof payload}`);\n }\n\n // Run validators\n runValidators(payload, this._schema.validators);\n\n return payload;\n },\n\n getInitialState: (): string | 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 // If paths don't overlap, no transformation needed\n if (!OperationPath.pathsOverlap(clientOp.path, serverOp.path)) {\n return { type: \"transformed\", operation: clientOp };\n }\n\n // For same path, client wins (last-write-wins)\n // Client operation proceeds as-is\n return { type: \"transformed\", operation: clientOp };\n },\n };\n}\n\n/** Creates a new StringPrimitive */\nexport const String = (): StringPrimitive<false, false> =>\n new StringPrimitive({ required: false, defaultValue: undefined, validators: [] });\n\n"],"mappings":";;;;;;;;;AAkCA,IAAa,kBAAb,MAAa,gBAAmQ;CAqB9Q,YAAY,QAA+B;wBApBlC,QAAO;wBACP;wBACA;wBACA;wBACA;wBACA;wBACA;wBAEQ;wBAEA,kBAAiB,EAChC,KAAKA,KAAyB;GAC5B,MAAM;GACN,SAAS,OAAO;GAChB,QAAQ,OAAO;GACf,QAAQ,YAAY;GACpB,cAAc;GACf,CAAC,EACH;wBAuFQ,aAA4E;GACnF,cAAc,KAAwC,kBAAoF;IACxI,MAAM,eAAe,KAAK,QAAQ;AAClC,WAAO;KACL,WAA2D;MACzD,MAAM,QAAQ,IAAI,SAAS,cAAc;AACzC,aAAQ,6CAAS;;KAEnB,MAAM,UAAiD;AACrD,UAAI,aACFC,eAAyB,eAAe,KAAK,eAAe,KAAK,MAAM,CACxE;;KAEH,SAAS,UAAoD;AAC3D,UAAI,aACFA,eAAyB,eAAe,KAAK,eAAe,KAAK,MAAM,CACxE;;KAEH,kBAAkE;MAChE,MAAM,QAAQ,IAAI,SAAS,cAAc;AACzC,aAAQ,6CAAS;;KAEpB;;GAGH,iBAAiB,QAA4B,cAA0D;AACrG,QAAI,CAAC,sBAAsB,WAAW,KAAK,eAAe,CACxD,OAAM,IAAI,gBAAgB,mDAAmD,UAAU,OAAO;IAGhG,MAAM,UAAU,UAAU;AAC1B,QAAI,OAAO,YAAY,SACrB,OAAM,IAAI,gBAAgB,uDAAuD,OAAO,UAAU;AAIpG,kBAAc,SAAS,KAAK,QAAQ,WAAW;AAE/C,WAAO;;GAGT,uBAA2C;AACzC,WAAO,KAAK,QAAQ;;GAGtB,qBACE,UACA,aAC8B;AAE9B,QAAI,CAACC,aAA2B,SAAS,MAAM,SAAS,KAAK,CAC3D,QAAO;KAAE,MAAM;KAAe,WAAW;KAAU;AAKrD,WAAO;KAAE,MAAM;KAAe,WAAW;KAAU;;GAEtD;AA9IC,OAAK,UAAU;;;CAIjB,WAA+C;AAC7C,SAAO,IAAI,kDACN,KAAK,gBACR,UAAU,QACV;;;CAIJ,QAAQ,cAAwD;AAC9D,SAAO,IAAI,kDACN,KAAK,gBACR,gBACA;;;CAIJ,OAAO,IAAgC,SAA0D;AAC/F,SAAO,IAAI,kDACN,KAAK,gBACR,YAAY,CAAC,GAAG,KAAK,QAAQ,YAAY;GAAE,UAAU;GAAI;GAAS,CAAC,IACnE;;;CAIJ,IAAI,QAAyD;AAC3D,SAAO,KAAK,QACT,MAAM,EAAE,UAAU,QACnB,2BAA2B,OAAO,aACnC;;;CAIH,IAAI,QAAyD;AAC3D,SAAO,KAAK,QACT,MAAM,EAAE,UAAU,QACnB,0BAA0B,OAAO,aAClC;;;CAIH,OAAO,OAAwD;AAC7D,SAAO,KAAK,QACT,MAAM,EAAE,WAAW,OACpB,0BAA0B,MAAM,aACjC;;;CAIH,MAAM,SAAiB,SAA2D;AAChF,SAAO,KAAK,QACT,MAAM,QAAQ,KAAK,EAAE,EACtB,mDAAW,6BAA6B,UACzC;;;CAIH,QAAiD;EAE/C,MAAM,eAAe;AACrB,SAAO,KAAK,QACT,MAAM,aAAa,KAAK,EAAE,EAC3B,uBACD;;;CAIH,MAA+C;AAC7C,SAAO,KAAK,QACT,MAAM;AACL,OAAI;AACF,QAAI,IAAI,EAAE;AACV,WAAO;qBACD;AACN,WAAO;;KAGX,qBACD;;;;AAiEL,MAAa,eACX,IAAI,gBAAgB;CAAE,UAAU;CAAO,cAAc;CAAW,YAAY,EAAE;CAAE,CAAC"}
|
|
1
|
+
{"version":3,"file":"String.mjs","names":["OperationDefinition.make","Operation.fromDefinition","OperationPath.pathsOverlap"],"sources":["../../src/primitives/String.ts"],"sourcesContent":["import { 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, Validator, NeedsValue } from \"./shared\";\nimport { runValidators, isCompatibleOperation, ValidationError } from \"./shared\";\n\n\ntype InferSetInput<TRequired extends boolean = false, THasDefault extends boolean = false> = NeedsValue<string, TRequired, THasDefault>\ntype InferUpdateInput<TRequired extends boolean = false, THasDefault extends boolean = false> = NeedsValue<string, TRequired, THasDefault>\n\n// =============================================================================\n// String Primitive\n// =============================================================================\n\nexport interface StringProxy<TRequired extends boolean = false, THasDefault extends boolean = false> {\n /** Gets the current string value */\n get(): MaybeUndefined<string, TRequired, THasDefault>;\n /** Sets the string value, generating a string.set operation */\n set(value: InferSetInput<TRequired, THasDefault>): void;\n /** This is the same as set. Updates the string value, generating a string.set operation */\n update(value: InferUpdateInput<TRequired, THasDefault>): void;\n /** Returns a readonly snapshot of the string value for rendering */\n toSnapshot(): MaybeUndefined<string, TRequired, THasDefault>;\n}\n\ninterface StringPrimitiveSchema {\n readonly required: boolean;\n readonly defaultValue: string | undefined;\n readonly validators: readonly Validator<string>[];\n}\n\nexport class StringPrimitive<TRequired extends boolean = false, THasDefault extends boolean = false> implements Primitive<string, StringProxy<TRequired, THasDefault>, TRequired, THasDefault, InferSetInput<TRequired, THasDefault>, InferUpdateInput<TRequired, THasDefault>> {\n readonly _tag = \"StringPrimitive\" as const;\n readonly _State!: string;\n readonly _Proxy!: StringProxy<TRequired, THasDefault>;\n readonly _TRequired!: TRequired;\n readonly _THasDefault!: THasDefault;\n readonly TUpdateInput!: InferUpdateInput<TRequired, THasDefault>;\n readonly TSetInput!: InferSetInput<TRequired, THasDefault>;\n\n private readonly _schema: StringPrimitiveSchema;\n\n private readonly _opDefinitions = {\n set: OperationDefinition.make({\n kind: \"string.set\" as const,\n payload: Schema.String,\n target: Schema.String,\n apply: (payload) => payload,\n deduplicable: true,\n }),\n };\n\n constructor(schema: StringPrimitiveSchema) {\n this._schema = schema;\n }\n\n /** Mark this string as required */\n required(): StringPrimitive<true, THasDefault> {\n return new StringPrimitive({\n ...this._schema,\n required: true,\n });\n }\n\n /** Set a default value for this string */\n default(defaultValue: string): StringPrimitive<TRequired, true> {\n return new StringPrimitive({\n ...this._schema,\n defaultValue,\n });\n }\n\n /** Add a custom validation rule */\n refine(fn: (value: string) => boolean, message: string): StringPrimitive<TRequired, THasDefault> {\n return new StringPrimitive({\n ...this._schema,\n validators: [...this._schema.validators, { validate: fn, message }],\n });\n }\n\n /** Minimum string length */\n min(length: number): StringPrimitive<TRequired, THasDefault> {\n return new StringPrimitive({\n ...this._schema,\n validators: [...this._schema.validators, {\n validate: (v) => v.length >= length,\n message: `String must be at least ${length} characters`,\n kind: \"min\",\n params: { value: length },\n }],\n });\n }\n\n /** Maximum string length */\n max(length: number): StringPrimitive<TRequired, THasDefault> {\n return new StringPrimitive({\n ...this._schema,\n validators: [...this._schema.validators, {\n validate: (v) => v.length <= length,\n message: `String must be at most ${length} characters`,\n kind: \"max\",\n params: { value: length },\n }],\n });\n }\n\n /** Exact string length */\n length(exact: number): StringPrimitive<TRequired, THasDefault> {\n return new StringPrimitive({\n ...this._schema,\n validators: [...this._schema.validators, {\n validate: (v) => v.length === exact,\n message: `String must be exactly ${exact} characters`,\n kind: \"length\",\n params: { value: exact },\n }],\n });\n }\n\n /** Match a regex pattern */\n regex(pattern: RegExp, message?: string): StringPrimitive<TRequired, THasDefault> {\n return new StringPrimitive({\n ...this._schema,\n validators: [...this._schema.validators, {\n validate: (v) => pattern.test(v),\n message: message ?? `String must match pattern ${pattern}`,\n kind: \"regex\",\n params: { pattern: pattern.source, flags: pattern.flags },\n }],\n });\n }\n\n /** Validate as email format */\n email(): StringPrimitive<TRequired, THasDefault> {\n const emailPattern = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n return new StringPrimitive({\n ...this._schema,\n validators: [...this._schema.validators, {\n validate: (v) => emailPattern.test(v),\n message: \"Invalid email format\",\n kind: \"email\",\n }],\n });\n }\n\n /** Validate as URL format */\n url(): StringPrimitive<TRequired, THasDefault> {\n return new StringPrimitive({\n ...this._schema,\n validators: [...this._schema.validators, {\n validate: (v) => {\n try {\n new URL(v);\n return true;\n } catch {\n return false;\n }\n },\n message: \"Invalid URL format\",\n kind: \"url\",\n }],\n });\n }\n\n readonly _internal: PrimitiveInternal<string, StringProxy<TRequired, THasDefault>> = {\n createProxy: (env: ProxyEnvironment.ProxyEnvironment, operationPath: OperationPath.OperationPath): StringProxy<TRequired, THasDefault> => {\n const defaultValue = this._schema.defaultValue;\n return {\n get: (): MaybeUndefined<string, TRequired, THasDefault> => {\n const state = env.getState(operationPath) as string | undefined;\n return (state ?? defaultValue) as MaybeUndefined<string, TRequired, THasDefault>;\n },\n set: (value: InferSetInput<TRequired, THasDefault>) => {\n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.set as any, value)\n );\n },\n update: (value: InferUpdateInput<TRequired, THasDefault>) => {\n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.set as any, value)\n );\n },\n toSnapshot: (): MaybeUndefined<string, TRequired, THasDefault> => {\n const state = env.getState(operationPath) as string | undefined;\n return (state ?? defaultValue) as MaybeUndefined<string, TRequired, THasDefault>;\n },\n };\n },\n\n applyOperation: (_state: string | undefined, operation: Operation.Operation<any, any, any>): string => {\n if (!isCompatibleOperation(operation, this._opDefinitions)) {\n throw new ValidationError(`StringPrimitive cannot apply operation of kind: ${operation.kind}`);\n }\n\n const payload = operation.payload;\n if (typeof payload !== \"string\") {\n throw new ValidationError(`StringPrimitive.set requires a string payload, got: ${typeof payload}`);\n }\n\n // Run validators\n runValidators(payload, this._schema.validators);\n\n return payload;\n },\n\n getInitialState: (): string | 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 // If paths don't overlap, no transformation needed\n if (!OperationPath.pathsOverlap(clientOp.path, serverOp.path)) {\n return { type: \"transformed\", operation: clientOp };\n }\n\n // For same path, client wins (last-write-wins)\n // Client operation proceeds as-is\n return { type: \"transformed\", operation: clientOp };\n },\n };\n}\n\n/** Creates a new StringPrimitive */\nexport const String = (): StringPrimitive<false, false> =>\n new StringPrimitive({ required: false, defaultValue: undefined, validators: [] });\n\n"],"mappings":"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"}
|