fetchium 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (138) hide show
  1. package/CHANGELOG.md +6 -5
  2. package/dist/cjs/development/QueryClient-CLi3ONNM.js +2 -0
  3. package/dist/cjs/development/QueryClient-CLi3ONNM.js.map +1 -0
  4. package/dist/cjs/development/QueryController-BQA49OYU.js +2 -0
  5. package/dist/cjs/development/QueryController-BQA49OYU.js.map +1 -0
  6. package/dist/cjs/development/index.js +1 -1
  7. package/dist/cjs/development/index.js.map +1 -1
  8. package/dist/cjs/development/mutation-CikIl_6k.js +2 -0
  9. package/dist/cjs/development/mutation-CikIl_6k.js.map +1 -0
  10. package/dist/cjs/development/react/index.js +1 -1
  11. package/dist/cjs/development/rest/index.js +2 -0
  12. package/dist/cjs/development/rest/index.js.map +1 -0
  13. package/dist/cjs/development/topic/index.js +2 -0
  14. package/dist/cjs/development/topic/index.js.map +1 -0
  15. package/dist/cjs/production/QueryClient-N0MJmuHW.js +2 -0
  16. package/dist/cjs/production/QueryClient-N0MJmuHW.js.map +1 -0
  17. package/dist/cjs/production/QueryController-BQA49OYU.js +2 -0
  18. package/dist/cjs/production/QueryController-BQA49OYU.js.map +1 -0
  19. package/dist/cjs/production/index.js +1 -1
  20. package/dist/cjs/production/index.js.map +1 -1
  21. package/dist/cjs/production/mutation-P_Yb4LI9.js +2 -0
  22. package/dist/cjs/production/mutation-P_Yb4LI9.js.map +1 -0
  23. package/dist/cjs/production/react/index.js +1 -1
  24. package/dist/cjs/production/rest/index.js +2 -0
  25. package/dist/cjs/production/rest/index.js.map +1 -0
  26. package/dist/cjs/production/topic/index.js +2 -0
  27. package/dist/cjs/production/topic/index.js.map +1 -0
  28. package/dist/esm/MutationResult.d.ts +0 -1
  29. package/dist/esm/MutationResult.d.ts.map +1 -1
  30. package/dist/esm/QueryClient.d.ts +26 -4
  31. package/dist/esm/QueryClient.d.ts.map +1 -1
  32. package/dist/esm/QueryController.d.ts +49 -0
  33. package/dist/esm/QueryController.d.ts.map +1 -0
  34. package/dist/esm/QueryResult.d.ts +10 -10
  35. package/dist/esm/QueryResult.d.ts.map +1 -1
  36. package/dist/esm/development/QueryClient-Dtde3pss.js +2572 -0
  37. package/dist/esm/development/QueryClient-Dtde3pss.js.map +1 -0
  38. package/dist/esm/development/QueryController-Ch_ncxiI.js +14 -0
  39. package/dist/esm/development/QueryController-Ch_ncxiI.js.map +1 -0
  40. package/dist/esm/development/index.js +29 -100
  41. package/dist/esm/development/index.js.map +1 -1
  42. package/dist/esm/development/mutation-UZshUQAf.js +58 -0
  43. package/dist/esm/development/mutation-UZshUQAf.js.map +1 -0
  44. package/dist/esm/development/react/index.js +1 -1
  45. package/dist/esm/development/rest/index.js +142 -0
  46. package/dist/esm/development/rest/index.js.map +1 -0
  47. package/dist/esm/development/{shared-Dq2yW78d.js → shared-DcuVH8Pf.js} +5 -5
  48. package/dist/esm/development/{shared-Dq2yW78d.js.map → shared-DcuVH8Pf.js.map} +1 -1
  49. package/dist/esm/development/stores/async.js +6 -6
  50. package/dist/esm/development/stores/sync.js +5 -5
  51. package/dist/esm/development/topic/index.js +86 -0
  52. package/dist/esm/development/topic/index.js.map +1 -0
  53. package/dist/esm/index.d.ts +5 -4
  54. package/dist/esm/index.d.ts.map +1 -1
  55. package/dist/esm/mutation.d.ts +6 -19
  56. package/dist/esm/mutation.d.ts.map +1 -1
  57. package/dist/esm/production/{QueryClient-BP0Z1rQV.js → QueryClient-YqnBxFy1.js} +972 -968
  58. package/dist/esm/production/QueryClient-YqnBxFy1.js.map +1 -0
  59. package/dist/esm/production/QueryController-Ch_ncxiI.js +14 -0
  60. package/dist/esm/production/QueryController-Ch_ncxiI.js.map +1 -0
  61. package/dist/esm/production/index.js +29 -100
  62. package/dist/esm/production/index.js.map +1 -1
  63. package/dist/esm/production/mutation-pgFl1uIY.js +58 -0
  64. package/dist/esm/production/mutation-pgFl1uIY.js.map +1 -0
  65. package/dist/esm/production/react/index.js +1 -1
  66. package/dist/esm/production/rest/index.js +142 -0
  67. package/dist/esm/production/rest/index.js.map +1 -0
  68. package/dist/esm/production/{shared-Dq2yW78d.js → shared-DcuVH8Pf.js} +5 -5
  69. package/dist/esm/production/{shared-Dq2yW78d.js.map → shared-DcuVH8Pf.js.map} +1 -1
  70. package/dist/esm/production/stores/async.js +6 -6
  71. package/dist/esm/production/stores/sync.js +5 -5
  72. package/dist/esm/production/topic/index.js +86 -0
  73. package/dist/esm/production/topic/index.js.map +1 -0
  74. package/dist/esm/query-types.d.ts +2 -4
  75. package/dist/esm/query-types.d.ts.map +1 -1
  76. package/dist/esm/query.d.ts +17 -39
  77. package/dist/esm/query.d.ts.map +1 -1
  78. package/dist/esm/rest/RESTMutation.d.ts +18 -0
  79. package/dist/esm/rest/RESTMutation.d.ts.map +1 -0
  80. package/dist/esm/rest/RESTQuery.d.ts +24 -0
  81. package/dist/esm/rest/RESTQuery.d.ts.map +1 -0
  82. package/dist/esm/rest/RESTQueryController.d.ts +34 -0
  83. package/dist/esm/rest/RESTQueryController.d.ts.map +1 -0
  84. package/dist/esm/rest/index.d.ts +5 -0
  85. package/dist/esm/rest/index.d.ts.map +1 -0
  86. package/dist/esm/stores/shared.d.ts.map +1 -1
  87. package/dist/esm/testing/MockClient.d.ts +64 -0
  88. package/dist/esm/testing/MockClient.d.ts.map +1 -0
  89. package/dist/esm/testing/auto-generate.d.ts +20 -0
  90. package/dist/esm/testing/auto-generate.d.ts.map +1 -0
  91. package/dist/esm/testing/entity-factory.d.ts +13 -0
  92. package/dist/esm/testing/entity-factory.d.ts.map +1 -0
  93. package/dist/esm/testing/index.d.ts +6 -0
  94. package/dist/esm/testing/index.d.ts.map +1 -0
  95. package/dist/esm/testing/types.d.ts +37 -0
  96. package/dist/esm/testing/types.d.ts.map +1 -0
  97. package/dist/esm/topic/TopicQuery.d.ts +10 -0
  98. package/dist/esm/topic/TopicQuery.d.ts.map +1 -0
  99. package/dist/esm/topic/TopicQueryController.d.ts +43 -0
  100. package/dist/esm/topic/TopicQueryController.d.ts.map +1 -0
  101. package/dist/esm/topic/index.d.ts +3 -0
  102. package/dist/esm/topic/index.d.ts.map +1 -0
  103. package/dist/esm/typeDefs.d.ts +1 -1
  104. package/dist/esm/types.d.ts +9 -4
  105. package/dist/esm/types.d.ts.map +1 -1
  106. package/package.json +51 -4
  107. package/plugin/.claude-plugin/plugin.json +10 -0
  108. package/plugin/agents/fetchium.md +168 -0
  109. package/plugin/docs/api/fetchium-react.md +135 -0
  110. package/plugin/docs/api/fetchium.md +674 -0
  111. package/plugin/docs/api/stores-async.md +219 -0
  112. package/plugin/docs/api/stores-sync.md +133 -0
  113. package/plugin/docs/core/entities.md +351 -0
  114. package/plugin/docs/core/queries.md +600 -0
  115. package/plugin/docs/core/streaming.md +550 -0
  116. package/plugin/docs/core/types.md +374 -0
  117. package/plugin/docs/data/caching.md +298 -0
  118. package/plugin/docs/data/live-data.md +435 -0
  119. package/plugin/docs/data/mutations.md +465 -0
  120. package/plugin/docs/guides/auth.md +318 -0
  121. package/plugin/docs/guides/error-handling.md +351 -0
  122. package/plugin/docs/guides/offline.md +270 -0
  123. package/plugin/docs/guides/testing.md +301 -0
  124. package/plugin/docs/quickstart.md +170 -0
  125. package/plugin/docs/reference/pagination.md +519 -0
  126. package/plugin/docs/reference/rest-queries.md +107 -0
  127. package/plugin/docs/reference/why-signalium.md +364 -0
  128. package/plugin/docs/setup/project-setup.md +319 -0
  129. package/plugin/install.mjs +88 -0
  130. package/plugin/skills/design/SKILL.md +140 -0
  131. package/plugin/skills/teach/SKILL.md +105 -0
  132. package/dist/cjs/development/QueryClient-CpmwggOn.js +0 -2
  133. package/dist/cjs/development/QueryClient-CpmwggOn.js.map +0 -1
  134. package/dist/cjs/production/QueryClient-qi3bR0eD.js +0 -2
  135. package/dist/cjs/production/QueryClient-qi3bR0eD.js.map +0 -1
  136. package/dist/esm/development/QueryClient-DRZtPKFD.js +0 -2568
  137. package/dist/esm/development/QueryClient-DRZtPKFD.js.map +0 -1
  138. package/dist/esm/production/QueryClient-BP0Z1rQV.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"QueryClient-Dtde3pss.js","sources":["../../../src/types.ts","../../../src/proxyId.ts","../../../src/GcManager.ts","../../../src/fieldRef.ts","../../../src/proxy.ts","../../../src/typeDefs.ts","../../../src/errors.ts","../../../src/utils.ts","../../../src/parseEntities.ts","../../../src/EntityInstance.ts","../../../src/EntityStore.ts","../../../src/NetworkManager.ts","../../../src/query.ts","../../../src/retry.ts","../../../src/QueryResult.ts","../../../src/MutationResult.ts","../../../src/ConstraintMatcher.ts","../../../src/LiveCollection.ts","../../../src/applyEntities.ts","../../../src/query-types.ts","../../../src/QueryClient.ts"],"sourcesContent":["import { DiscriminatedReactivePromise, type Signal } from 'signalium';\nimport type { Query } from './query.js';\n\n// ================================\n// Base URL and Request Types\n// ================================\n\n/**\n * Flexible base URL value - can be a static string, a Signal, or a function.\n * Functions are wrapped in reactiveSignal internally for memoization.\n */\nexport type BaseUrlValue = string | Signal<string> | (() => string);\n\n/**\n * Extended RequestInit with additional query-specific options.\n * This is what gets passed to the fetch function.\n */\nexport interface QueryRequestInit extends RequestInit {\n baseUrl?: string;\n searchParams?: URLSearchParams;\n}\n\n/**\n * Request options that can be specified at the query definition level.\n * These can override context-level settings.\n */\nexport interface QueryRequestOptions {\n baseUrl?: BaseUrlValue;\n credentials?: RequestCredentials;\n mode?: RequestMode;\n cache?: RequestCache;\n redirect?: RequestRedirect;\n referrer?: string;\n referrerPolicy?: ReferrerPolicy;\n integrity?: string;\n keepalive?: boolean;\n signal?: AbortSignal;\n}\n\n// ================================\n// Type Definitions\n// ================================\n\nexport enum NetworkMode {\n /**\n * Always fetch regardless of network status\n */\n Always = 'always',\n /**\n * Only fetch when online (default)\n */\n Online = 'online',\n /**\n * Fetch if cached data exists, even when offline\n */\n OfflineFirst = 'offlineFirst',\n}\n\nexport interface RetryConfig {\n /**\n * Number of retry attempts\n */\n retries: number;\n /**\n * Optional custom delay function (receives attempt index starting at 0)\n * Default: exponential backoff (1000ms * 2^attempt)\n */\n retryDelay?: (attemptIndex: number) => number;\n}\n\nexport const enum Mask {\n // Fundamental types\n UNDEFINED = 1 << 0,\n NULL = 1 << 1,\n NUMBER = 1 << 2,\n STRING = 1 << 3,\n BOOLEAN = 1 << 4,\n OBJECT = 1 << 5,\n ARRAY = 1 << 6,\n ID = 1 << 7,\n\n // Complex types\n RECORD = 1 << 8,\n UNION = 1 << 9,\n ENTITY = 1 << 10,\n\n // Flags\n HAS_FORMAT = 1 << 12,\n IS_EAGER_FORMAT = 1 << 13,\n PARSE_RESULT = 1 << 14,\n LIVE = 1 << 15,\n}\n\n// ================================\n// ParseResult Types\n// ================================\n\nexport type ParseSuccess<T> = { success: true; value: T };\nexport type ParseError = { success: false; error: Error };\nexport type ParseResult<T> = ParseSuccess<T> | ParseError;\n\n/**\n * Interface for case-insensitive enum sets.\n * String values are matched case-insensitively during parsing,\n * but always return the canonical (originally defined) casing.\n */\nexport interface CaseInsensitiveEnumSet<T extends string | boolean | number> extends Set<T> {\n /**\n * Check if a value exists in the set (case-insensitively for strings).\n */\n has(value: unknown): boolean;\n\n /**\n * Get the canonical value for a given input.\n * For strings, performs case-insensitive lookup and returns the canonical casing.\n * For numbers/booleans, performs exact match.\n * Returns undefined if no match is found.\n */\n get(value: unknown): T | undefined;\n}\n\n// ================================\n// Public Branded TypeDef\n// ================================\n\n/**\n * Branded phantom type representing a type definition in the public API.\n * At runtime, values are Masks, Sets, ValidatorDefs, etc. but the type system\n * sees them as TypeDef<T> where T is the extracted TypeScript type.\n *\n * Uses a string brand instead of unique symbol to avoid TS4029 errors\n * during declaration emit in downstream packages.\n * See: https://github.com/microsoft/TypeScript/issues/56107\n */\nexport type TypeDef<T = unknown> = T & { readonly __fetchiumTypeDef: T };\n\n// ================================\n// Internal Type Definitions\n// ================================\n\nexport type SimpleTypeDef =\n // Sets are constant values\n | Set<string | boolean | number>\n\n // Case-insensitive enum sets\n | CaseInsensitiveEnumSet<string | boolean | number>\n\n // Numbers are primitive type masks (potentially multiple masks combined)\n | Mask;\n\nexport type ComplexTypeDef =\n // Objects, arrays, records, unions, and parse results are definitions\n ObjectDef | EntityDef | ArrayDef | RecordDef | UnionDef | ParseResultDef;\n\nexport type InternalTypeDef = SimpleTypeDef | ComplexTypeDef;\n\nexport type InternalObjectFieldTypeDef = InternalTypeDef | string;\n\nexport type InternalObjectShape = Record<string, InternalObjectFieldTypeDef>;\n\nexport const ARRAY_KEY = Symbol('array');\nexport const RECORD_KEY = Symbol('record');\nexport const QUERY_ID = Symbol('QUERY_ID');\n\nexport interface UnionTypeDefs {\n [ARRAY_KEY]?: InternalTypeDef;\n [RECORD_KEY]?: InternalTypeDef;\n [key: string]: ObjectDef | EntityDef;\n}\n\nexport interface BaseTypeDef {\n mask: Mask;\n typenameField: string;\n typenameValue: string;\n idField: string | symbol;\n values: Set<string | boolean | number> | undefined;\n}\n\nexport type EntityMethods = Record<string, (...args: any[]) => any>;\n\n// Entity configuration options\nexport interface EntityConfig {\n hasSubscribe: boolean;\n}\n\nexport interface EntityDef<T extends InternalObjectShape = InternalObjectShape> extends BaseTypeDef {\n mask: Mask.ENTITY;\n shape: T;\n}\n\nexport interface ObjectDef<T extends InternalObjectShape = InternalObjectShape> extends BaseTypeDef {\n mask: Mask.OBJECT;\n shape: T;\n}\n\nexport interface ArrayDef<T extends InternalTypeDef = InternalTypeDef> extends BaseTypeDef {\n mask: Mask.ARRAY;\n shape: T;\n}\n\nexport interface UnionDef<_T extends readonly InternalTypeDef[] = readonly InternalTypeDef[]> extends BaseTypeDef {\n mask: Mask.UNION;\n shape: UnionTypeDefs | undefined;\n}\n\nexport interface RecordDef<T extends InternalTypeDef = InternalTypeDef> extends BaseTypeDef {\n mask: Mask.RECORD;\n shape: T;\n}\n\nexport interface ParseResultDef<T extends InternalTypeDef = InternalTypeDef> extends BaseTypeDef {\n mask: Mask.PARSE_RESULT;\n shape: T;\n}\n\n/**\n * Global format registry interface that maps format names to their TypeScript types.\n * This can be extended via module augmentation using the SignaliumQuery namespace.\n */\ndeclare global {\n // eslint-disable-next-line @typescript-eslint/no-namespace\n namespace SignaliumQuery {\n interface FormatRegistry {\n date: Date;\n 'date-time': Date;\n // Users can extend this via module augmentation\n // Example: declare global { namespace SignaliumQuery { interface FormatRegistry { 'custom-format': CustomType } } }\n }\n }\n}\n\nexport interface APITypes {\n format: <K extends keyof SignaliumQuery.FormatRegistry>(format: K) => TypeDef<SignaliumQuery.FormatRegistry[K]>;\n typename: <T extends string>(value: T) => TypeDef<T>;\n const: <T extends string | boolean | number>(value: T) => TypeDef<T>;\n enum: {\n <T extends readonly (string | boolean | number)[]>(...values: T): TypeDef<T[number]>;\n caseInsensitive<T extends readonly (string | boolean | number)[]>(...values: T): TypeDef<T[number]>;\n };\n\n id: TypeDef<string | number>;\n string: TypeDef<string>;\n number: TypeDef<number>;\n boolean: TypeDef<boolean>;\n null: TypeDef<null>;\n undefined: TypeDef<undefined>;\n\n array: <T extends TypeDef>(shape: T) => TypeDef<ExtractType<T>[]>;\n object: <T extends TypeDefShape>(shape: T) => TypeDef<ExtractType<T>>;\n record: <T extends TypeDef>(shape: T) => TypeDef<Record<string, ExtractType<T>>>;\n union: <VS extends readonly TypeDef[]>(...types: VS) => TypeDef<ExtractType<VS[number]>>;\n\n nullish: <T extends TypeDef>(type: T) => TypeDef<ExtractType<T> | undefined | null>;\n optional: <T extends TypeDef>(type: T) => TypeDef<ExtractType<T> | undefined>;\n nullable: <T extends TypeDef>(type: T) => TypeDef<ExtractType<T> | null>;\n\n result: <T extends TypeDef>(type: T) => TypeDef<ParseResult<ExtractType<T>>>;\n\n entity: <T extends import('./proxy.js').Entity>(cls: new () => T) => TypeDef<T>;\n\n liveArray: {\n <E extends import('./proxy.js').Entity>(entity: new () => E, opts?: LiveArrayOptions<E>): TypeDef<E[]>;\n <E extends import('./proxy.js').Entity>(entities: (new () => E)[], opts?: LiveArrayOptions<E>): TypeDef<E[]>;\n };\n\n liveValue: {\n <V, E extends import('./proxy.js').Entity>(\n type: TypeDef<V>,\n entity: new () => E,\n opts: LiveValueOptions<V, E>,\n ): TypeDef<V>;\n <V, E extends import('./proxy.js').Entity>(\n type: TypeDef<V>,\n entities: (new () => E)[],\n opts: LiveValueOptions<V, E>,\n ): TypeDef<V>;\n };\n}\n\n// ================================\n// Type Extraction\n// ================================\n\ntype IsAny<T> = 0 extends 1 & T ? true : false;\n\nexport type ExtractType<T> =\n IsAny<T> extends true\n ? any\n : T extends TypeDef<infer U>\n ? ExtractType<U>\n : T extends (...args: infer V) => infer Q\n ? (...args: V) => ExtractType<Q>\n : T extends object\n ? { [K in keyof T]: ExtractType<T[K]> }\n : T;\n\nexport type TypeDefShape = Record<string, TypeDef> | TypeDef;\n\n// ================================\n// Query Types\n// ================================\n\nexport type QueryResult<T extends Query> = ExtractType<T['result']> & {\n __refetch(): DiscriminatedReactivePromise<QueryResult<T>>;\n __fetchNext(): Promise<QueryResult<T>>;\n __hasNext: boolean;\n __isFetchingNext: boolean;\n};\n\nexport type QueryPromise<T extends Query> = DiscriminatedReactivePromise<QueryResult<T>>;\n\n// ================================\n// Mutation Events\n// ================================\n\nexport interface CreateEvent {\n type: 'create';\n typename: string;\n data: Record<string, unknown>;\n id?: unknown;\n __eventSource?: number;\n}\n\nexport interface UpdateEvent {\n type: 'update';\n typename: string;\n data: Record<string, unknown>;\n id?: unknown;\n __eventSource?: number;\n}\n\nexport interface DeleteEvent {\n type: 'delete';\n typename: string;\n data: string | number | Record<string, unknown>;\n id?: unknown;\n __eventSource?: number;\n}\n\nexport type MutationEvent = CreateEvent | UpdateEvent | DeleteEvent;\n\n// ================================\n// LiveArray / LiveValue\n// ================================\n\nexport type ConstraintMap = Record<string, unknown>;\n\nexport type ConstraintDef<E extends import('./proxy.js').Entity> = ConstraintMap | Array<[new () => E, ConstraintMap]>;\n\nexport interface LiveArrayOptions<E extends import('./proxy.js').Entity> {\n constraints?: ConstraintDef<E>;\n sort?: (a: E, b: E) => number;\n}\n\nexport interface LiveValueOptions<V, E extends import('./proxy.js').Entity> {\n constraints?: ConstraintDef<E>;\n onCreate: (value: V, entity: E) => V;\n onUpdate: (value: V, entity: E) => V;\n onDelete: (value: V, entity: E) => V;\n}\n\nexport const enum LiveFieldType {\n Array = 0,\n Value = 1,\n}\n\nexport class LiveFieldConfig {\n type: LiveFieldType;\n entityDefs: import('./typeDefs.js').ValidatorDef<any>[];\n constraintFieldRefs: Map<string, Array<[string, unknown]>> | undefined;\n sort: ((a: unknown, b: unknown) => number) | undefined;\n valueType: InternalTypeDef | undefined;\n onCreate: ((value: unknown, entity: unknown) => unknown) | undefined;\n onUpdate: ((value: unknown, entity: unknown) => unknown) | undefined;\n onDelete: ((value: unknown, entity: unknown) => unknown) | undefined;\n\n constructor(\n type: LiveFieldType,\n entityDefs: import('./typeDefs.js').ValidatorDef<any>[],\n constraintFieldRefs: Map<string, Array<[string, unknown]>> | undefined,\n sort: ((a: unknown, b: unknown) => number) | undefined,\n valueType: InternalTypeDef | undefined,\n onCreate: ((value: unknown, entity: unknown) => unknown) | undefined,\n onUpdate: ((value: unknown, entity: unknown) => unknown) | undefined,\n onDelete: ((value: unknown, entity: unknown) => unknown) | undefined,\n ) {\n this.type = type;\n this.entityDefs = entityDefs;\n this.constraintFieldRefs = constraintFieldRefs;\n this.sort = sort;\n this.valueType = valueType;\n this.onCreate = onCreate;\n this.onUpdate = onUpdate;\n this.onDelete = onDelete;\n }\n\n static array(\n entityDefs: import('./typeDefs.js').ValidatorDef<any>[],\n constraintFieldRefs: Map<string, Array<[string, unknown]>> | undefined,\n sort?: (a: unknown, b: unknown) => number,\n ): LiveFieldConfig {\n return new LiveFieldConfig(\n LiveFieldType.Array,\n entityDefs,\n constraintFieldRefs,\n sort,\n undefined,\n undefined,\n undefined,\n undefined,\n );\n }\n\n static value(\n entityDefs: import('./typeDefs.js').ValidatorDef<any>[],\n constraintFieldRefs: Map<string, Array<[string, unknown]>> | undefined,\n valueType: InternalTypeDef,\n onCreate: (value: unknown, entity: unknown) => unknown,\n onUpdate: (value: unknown, entity: unknown) => unknown,\n onDelete: (value: unknown, entity: unknown) => unknown,\n ): LiveFieldConfig {\n return new LiveFieldConfig(\n LiveFieldType.Value,\n entityDefs,\n constraintFieldRefs,\n undefined,\n valueType,\n onCreate,\n onUpdate,\n onDelete,\n );\n }\n}\n\n// ================================\n// Mutation Effects\n// ================================\n\nexport type EntityClassOrTypename = string | (new () => import('./proxy.js').Entity);\n\nexport type InvalidateTarget =\n | (new () => import('./query.js').Query)\n | readonly [new () => import('./query.js').Query, Record<string, unknown>];\n\nexport interface MutationEffects {\n readonly creates?: ReadonlyArray<readonly [EntityClassOrTypename, unknown]>;\n readonly updates?: ReadonlyArray<readonly [EntityClassOrTypename, unknown]>;\n readonly deletes?: ReadonlyArray<readonly [EntityClassOrTypename, unknown]>;\n readonly invalidates?: ReadonlyArray<InvalidateTarget>;\n}\n","/**\n * WeakMap that brands entity proxies with their numeric key.\n * Shared between EntityInstance (writes) and proxy.ts (reads for\n * parseObjectValue / mergeValues identity checks).\n */\nexport const PROXY_ID = new WeakMap<object, number>();\n\nexport function getProxyId(object: Record<string, unknown>): number | undefined {\n return PROXY_ID.get(object);\n}\n","/**\n * GcManager — bucket-based in-memory garbage collection.\n *\n * Each unique `gcTime` value (in minutes) gets its own interval with two\n * rotating sets (`currentFlush` / `nextFlush`). When `schedule(key, gcTime)`\n * is called the key is added to `nextFlush`. On the next tick of that\n * bucket's interval the set rotates, so the key lands in `currentFlush` and\n * is evicted on the *following* tick. This means:\n *\n * minimum eviction delay ≈ gcTime\n * maximum eviction delay ≈ 2 × gcTime\n *\n * Special values:\n * gcTime === 0 → evict on the next microtask (setTimeout(0))\n * gcTime === Infinity → never evict\n */\n\nexport const enum GcKeyType {\n Query = 0,\n Entity = 1,\n}\n\nclass GcBucket {\n private _currentFlush = new Map<number, GcKeyType>();\n private _nextFlush = new Map<number, GcKeyType>();\n private _intervalId: ReturnType<typeof setInterval>;\n\n constructor(\n gcTimeMinutes: number,\n private _onEvict: (key: number, type: GcKeyType) => void,\n multiplier: number,\n ) {\n this._intervalId = setInterval(this._tick, gcTimeMinutes * 60_000 * multiplier);\n }\n\n schedule(key: number, type: GcKeyType): void {\n this._nextFlush.set(key, type);\n }\n\n cancel(key: number): void {\n this._currentFlush.delete(key);\n this._nextFlush.delete(key);\n }\n\n private _tick = (): void => {\n const { _currentFlush, _nextFlush, _onEvict } = this;\n for (const [key, type] of _currentFlush) {\n _onEvict(key, type);\n }\n this._currentFlush = _nextFlush;\n this._nextFlush = new Map();\n };\n\n destroy(): void {\n clearInterval(this._intervalId);\n }\n}\n\nexport class GcManager {\n private _buckets = new Map<number, GcBucket>();\n private _nextTickEntries = new Map<number, GcKeyType>();\n private _nextTickScheduled = false;\n private _onEvict: (key: number, type: GcKeyType) => void;\n private _multiplier: number;\n\n constructor(onEvict: (key: number, type: GcKeyType) => void, multiplier: number = 1) {\n this._onEvict = onEvict;\n this._multiplier = multiplier;\n }\n\n schedule(key: number, gcTime: number, type: GcKeyType): void {\n if (gcTime === Infinity) return;\n\n if (gcTime === 0) {\n const { _nextTickEntries } = this;\n _nextTickEntries.set(key, type);\n if (!this._nextTickScheduled) {\n this._nextTickScheduled = true;\n setTimeout(this._flushNextTick, 0);\n }\n return;\n }\n\n const { _buckets } = this;\n let bucket = _buckets.get(gcTime);\n if (!bucket) {\n bucket = new GcBucket(gcTime, this._onEvict, this._multiplier);\n _buckets.set(gcTime, bucket);\n }\n bucket.schedule(key, type);\n }\n\n cancel(key: number, gcTime: number): void {\n if (gcTime === Infinity) return;\n\n if (gcTime === 0) {\n this._nextTickEntries.delete(key);\n return;\n }\n\n this._buckets.get(gcTime)?.cancel(key);\n }\n\n private _flushNextTick = (): void => {\n const { _nextTickEntries, _onEvict } = this;\n this._nextTickScheduled = false;\n for (const [key, type] of _nextTickEntries) {\n _onEvict(key, type);\n }\n _nextTickEntries.clear();\n };\n\n destroy(): void {\n const { _buckets, _nextTickEntries } = this;\n for (const bucket of _buckets.values()) {\n bucket.destroy();\n }\n _buckets.clear();\n _nextTickEntries.clear();\n }\n}\n\nexport class NoOpGcManager {\n schedule(_key: number, _gcTime: number, _type: GcKeyType): void {}\n cancel(_key: number, _gcTime: number): void {}\n destroy(): void {}\n}\n","import type { QueryContext } from './QueryClient.js';\n\n// ================================\n// Symbols\n// ================================\n\nconst FIELD_REF_BRAND = Symbol('fieldRef');\nconst FIELD_REF_PATH = Symbol('fieldRefPath');\n\nexport const DEFINITION_TARGET = Symbol('DEFINITION_TARGET');\nexport const CANCEL_PROXY = Symbol('CANCEL_PROXY');\n\n// ================================\n// FieldRef placeholder regex\n// ================================\n\nconst FIELD_REF_PLACEHOLDER = /\\[([^\\]]+)\\]/g;\n\n// ================================\n// FieldRef (recursive Proxy)\n// ================================\n\nfunction createFieldRef(path: string[]): unknown {\n const target = {\n [FIELD_REF_BRAND]: true,\n [FIELD_REF_PATH]: path,\n };\n\n return new Proxy(target, fieldRefHandler);\n}\n\nconst fieldRefHandler: ProxyHandler<Record<symbol, unknown>> = {\n get(target, prop) {\n if (prop === FIELD_REF_BRAND) return true;\n if (prop === FIELD_REF_PATH) return target[FIELD_REF_PATH];\n\n if (prop === Symbol.toPrimitive || prop === 'toString' || prop === 'valueOf') {\n const path = target[FIELD_REF_PATH] as string[];\n return () => `[${path.join('.')}]`;\n }\n\n if (typeof prop === 'symbol') return undefined;\n\n const parentPath = target[FIELD_REF_PATH] as string[];\n return createFieldRef([...parentPath, prop]);\n },\n\n has(target, prop) {\n return prop === FIELD_REF_BRAND || prop === FIELD_REF_PATH;\n },\n};\n\nexport function isFieldRef(value: unknown): boolean {\n return typeof value === 'object' && value !== null && (value as any)[FIELD_REF_BRAND] === true;\n}\n\nexport function getFieldRefPath(ref: unknown): string[] {\n return (ref as any)[FIELD_REF_PATH];\n}\n\n// ================================\n// Definition Proxy (wraps `this`)\n// ================================\n\nexport function createDefinitionProxy<T extends object>(target: T): T {\n let cancelled = false;\n\n return new Proxy(target, {\n set(target, prop, value) {\n (target as any)[prop] = value;\n return true;\n },\n\n get(target, prop) {\n if (IS_DEV && cancelled) {\n throw new Error('Definition proxy accessed after extraction. Avoid arrow functions that capture `this`.');\n }\n\n if (prop === DEFINITION_TARGET) return target;\n if (prop === CANCEL_PROXY)\n return () => {\n cancelled = true;\n };\n\n if (typeof prop === 'symbol') return (target as any)[prop];\n\n return createFieldRef([prop]);\n },\n }) as T;\n}\n\n// ================================\n// Definition Extraction\n// ================================\n\nexport interface CapturedDefinition<T = Record<string, unknown>> {\n fields: T;\n methods: T;\n}\n\nexport function extractDefinition<T>(instance: T): CapturedDefinition<T> {\n const raw = (instance as any)[DEFINITION_TARGET];\n (instance as any)[CANCEL_PROXY]();\n\n const fields: Record<string, unknown> = {};\n for (const key of Object.getOwnPropertyNames(raw)) {\n fields[key] = raw[key];\n }\n\n const methods: Record<string, (...args: unknown[]) => unknown> = {};\n let proto = Object.getPrototypeOf(raw);\n\n while (proto && proto !== Object.prototype) {\n for (const key of Object.getOwnPropertyNames(proto)) {\n if (key === 'constructor') continue;\n const desc = Object.getOwnPropertyDescriptor(proto, key)!;\n\n if (typeof desc.value === 'function' && !(key in methods)) {\n methods[key] = desc.value;\n }\n }\n proto = Object.getPrototypeOf(proto);\n }\n\n return { fields: fields as T, methods: methods as T };\n}\n\n// ================================\n// Reification (FieldRef → actual values)\n// ================================\n\nexport function resolveFieldRefPath(path: string[], root: Record<string, unknown>): unknown {\n let current: unknown = root;\n for (const segment of path) {\n if (current === undefined || current === null) return undefined;\n current = (current as Record<string, unknown>)[segment];\n }\n return current;\n}\n\nfunction reifyStringPlaceholders(str: string, root: Record<string, unknown>): string {\n return str.replace(FIELD_REF_PLACEHOLDER, (_match, pathStr: string) => {\n const path = pathStr.split('.');\n const value = resolveFieldRefPath(path, root);\n return value !== undefined && value !== null ? encodeURIComponent(String(value)) : '';\n });\n}\n\nexport function reifyValue(value: unknown, root: Record<string, unknown>): unknown {\n if (isFieldRef(value)) {\n return resolveFieldRefPath(getFieldRefPath(value), root);\n }\n\n if (typeof value === 'string') {\n return reifyStringPlaceholders(value, root);\n }\n\n if (Array.isArray(value)) {\n return value.map(v => reifyValue(v, root));\n }\n\n if (typeof value === 'object' && value !== null && Object.getPrototypeOf(value) === Object.prototype) {\n const result: Record<string, unknown> = {};\n for (const key of Object.keys(value)) {\n result[key] = reifyValue((value as Record<string, unknown>)[key], root);\n }\n return result;\n }\n\n return value;\n}\n\n// ================================\n// Execution Context\n// ================================\n\nexport function createExecutionContext<T>(\n captured: CapturedDefinition<T>,\n actualParams: Record<string, unknown>,\n queryContext: QueryContext,\n): T {\n const fields = captured.fields as Record<string, unknown>;\n const methods = captured.methods as Record<string, (...args: unknown[]) => unknown>;\n\n const root: Record<string, unknown> = { params: actualParams };\n const ctx: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(fields)) {\n ctx[key] = reifyValue(value, root);\n }\n\n ctx.params = actualParams;\n ctx.context = queryContext;\n\n for (const [key, method] of Object.entries(methods)) {\n ctx[key] = method.bind(ctx);\n }\n\n return ctx as T;\n}\n","import { createDefinitionProxy, DEFINITION_TARGET, CANCEL_PROXY } from './fieldRef.js';\nimport { PROXY_ID } from './proxyId.js';\n\nexport type WarnFn = (message: string, context?: Record<string, unknown>) => void;\n\nconst entries = Object.entries;\nconst isArray = Array.isArray;\n\n/**\n * Base class for entity definitions. Users extend this to define entity shapes.\n * Also serves as the prototype for entity proxies, so `proxy instanceof Entity` works.\n */\nexport class Entity {\n static cache?: {\n gcTime?: number; // minutes - in-memory eviction time. Use 0 for next-tick, Infinity to never GC.\n };\n\n __subscribe?(onEvent: (event: import('./types.js').MutationEvent) => void): (() => void) | undefined;\n\n constructor() {\n return createDefinitionProxy(this);\n }\n}\n\nconst ObjectProto = Object.prototype;\n\nfunction isPlainObject(v: unknown): v is Record<string, unknown> {\n return typeof v === 'object' && v !== null && Object.getPrototypeOf(v) === ObjectProto;\n}\n\n/**\n * Deep merge two objects, with the update object taking precedence.\n * Arrays and non-plain objects (Date, etc.) are replaced, not merged.\n * Only plain objects are recursively merged.\n */\nexport function mergeValues<T extends Record<string, unknown>>(\n target: Record<string, unknown>,\n update: Record<string, unknown>,\n): T {\n for (const [key, value] of entries(update)) {\n const targetValue = target[key];\n if (isPlainObject(value) && !PROXY_ID.has(value) && isPlainObject(targetValue) && !PROXY_ID.has(targetValue)) {\n mergeValues(targetValue, value);\n } else {\n target[key] = value;\n }\n }\n\n return target as T;\n}\n\nexport { PROXY_ID, getProxyId } from './proxyId.js';\n","import {\n APITypes,\n ARRAY_KEY,\n ComplexTypeDef,\n EntityConfig,\n EntityMethods,\n ExtractType,\n InternalTypeDef,\n InternalObjectShape,\n LiveArrayOptions,\n LiveFieldConfig,\n LiveValueOptions,\n Mask,\n ObjectDef,\n RECORD_KEY,\n TypeDef,\n UnionDef,\n UnionTypeDefs,\n} from './types.js';\nimport { Prettify } from './type-utils.js';\nimport { hashValue, registerCustomHash } from 'signalium/utils';\n\nconst entries = Object.entries;\nconst isArray = Array.isArray;\nconst keys = Object.keys;\n\nlet assertFieldTypesCompatible: (typename: string, field: string, a: unknown, b: unknown) => void = () => {};\n\nif (IS_DEV) {\n const SHIFT = 16;\n\n const setsEqual = (a: Set<unknown>, b: Set<unknown>): boolean => {\n if (a.size !== b.size) return false;\n for (const v of a) {\n if (!b.has(v)) return false;\n }\n return true;\n };\n\n const fieldTypesCompatible = (a: unknown, b: unknown): boolean => {\n if (a === b) return true;\n if (typeof a !== typeof b) return false;\n\n if (typeof a === 'number') {\n const bNum = b as number;\n if ((a & 0xffff) !== (bNum & 0xffff)) return false;\n const aFormat = a >> SHIFT;\n const bFormat = bNum >> SHIFT;\n if (aFormat !== 0 && bFormat !== 0 && aFormat !== bFormat) return false;\n return true;\n }\n\n if (typeof a === 'string') return a === b;\n\n if (a instanceof Set && b instanceof Set) {\n return setsEqual(a, b);\n }\n\n if (a instanceof ValidatorDef && b instanceof ValidatorDef) {\n const aMask = a.mask as number;\n const bMask = b.mask as number;\n if ((aMask & 0xffff) !== (bMask & 0xffff)) return false;\n const aFormat = aMask >> SHIFT;\n const bFormat = bMask >> SHIFT;\n if (aFormat !== 0 && bFormat !== 0 && aFormat !== bFormat) return false;\n\n if (a.shape === b.shape) return true;\n\n if (\n a.shape !== undefined &&\n b.shape !== undefined &&\n typeof a.shape === 'object' &&\n typeof b.shape === 'object'\n ) {\n const aShape = a.shape as Record<string, unknown>;\n const bShape = b.shape as Record<string, unknown>;\n for (const key of Object.keys(aShape)) {\n if (key in bShape && !fieldTypesCompatible(aShape[key], bShape[key])) return false;\n }\n for (const key of Object.keys(bShape)) {\n if (key in aShape && !fieldTypesCompatible(aShape[key], bShape[key])) return false;\n }\n }\n\n return true;\n }\n\n return false;\n };\n\n assertFieldTypesCompatible = (typename: string, field: string, a: unknown, b: unknown) => {\n if (!fieldTypesCompatible(a, b)) {\n throw new Error(\n `[fetchium] Entity typename '${typename}' has incompatible type for field '${field}' across different entity definitions`,\n );\n }\n };\n}\n\nfunction makeOptional(fieldDef: unknown): unknown {\n if (typeof fieldDef === 'number') {\n return fieldDef | Mask.UNDEFINED;\n }\n if (fieldDef instanceof ValidatorDef) {\n if ((fieldDef.mask & Mask.UNDEFINED) !== 0) return fieldDef;\n return ValidatorDef.cloneWith(fieldDef, Mask.UNDEFINED);\n }\n return fieldDef;\n}\n\nfunction isPlainObjectDef(fieldDef: unknown): fieldDef is ValidatorDef<any> {\n return (\n fieldDef instanceof ValidatorDef &&\n (fieldDef.mask & Mask.OBJECT) !== 0 &&\n (fieldDef.mask & (Mask.ENTITY | Mask.ARRAY | Mask.UNION | Mask.RECORD | Mask.LIVE)) === 0\n );\n}\n\nfunction mergeObjectShapes(\n shapes: (Record<string, unknown> | undefined)[],\n count: number,\n typename: string,\n): Record<string, unknown> {\n const allKeys = new Set<string>();\n for (const shape of shapes) {\n if (shape !== undefined) {\n for (const key of Object.keys(shape)) {\n allKeys.add(key);\n }\n }\n }\n\n const merged: Record<string, unknown> = {};\n\n for (const key of allKeys) {\n let presentCount = 0;\n let firstDef: unknown = undefined;\n const nestedShapes: (Record<string, unknown> | undefined)[] = [];\n let allPlainObjects = true;\n\n for (const shape of shapes) {\n const fieldDef = shape?.[key];\n if (fieldDef !== undefined) {\n presentCount++;\n if (firstDef === undefined) firstDef = fieldDef;\n if (IS_DEV && firstDef !== undefined && fieldDef !== firstDef && !isPlainObjectDef(fieldDef)) {\n assertFieldTypesCompatible(typename, key, firstDef, fieldDef);\n }\n if (isPlainObjectDef(fieldDef)) {\n nestedShapes.push(fieldDef.shape as Record<string, unknown>);\n } else {\n allPlainObjects = false;\n nestedShapes.push(undefined);\n }\n } else {\n allPlainObjects = false;\n nestedShapes.push(undefined);\n }\n }\n\n if (allPlainObjects && presentCount > 0) {\n const innerMerged = mergeObjectShapes(nestedShapes, count, typename);\n const newDef = new ValidatorDef(Mask.OBJECT, innerMerged as any);\n merged[key] = presentCount < count ? makeOptional(newDef) : newDef;\n } else {\n merged[key] = presentCount < count ? makeOptional(firstDef!) : firstDef!;\n }\n }\n\n return merged;\n}\n\nexport class ValidatorDef<T> {\n public mask: Mask;\n public shape: InternalTypeDef | InternalObjectShape | UnionTypeDefs | ComplexTypeDef[] | undefined;\n public typenameField: string | undefined = undefined;\n public typenameValue: string | undefined = undefined;\n public idField: string | symbol | undefined = undefined;\n public values: Set<string | boolean | number> | undefined = undefined;\n\n /**\n * Methods object for entity definitions.\n * Shared across all proxies, but each proxy binds its own reactive method wrappers.\n */\n public _methods: EntityMethods | undefined = undefined;\n\n /**\n * Entity configuration including stream options.\n */\n public _entityConfig: EntityConfig | undefined = undefined;\n\n /**\n * The original Entity class for this definition.\n * Used by createEntityProxy to set the proxy prototype so `instanceof` works.\n */\n public _entityClass: (new () => any) | undefined = undefined;\n\n /**\n * Entity cache options (e.g. gcTime for in-memory eviction).\n */\n public _entityCache: { gcTime?: number } | undefined = undefined;\n\n /**\n * Live data configuration (shared by LiveArray and LiveValue).\n */\n public _liveConfig: LiveFieldConfig | undefined = undefined;\n\n constructor(\n mask: Mask,\n shape: InternalTypeDef | InternalObjectShape | UnionTypeDefs | ComplexTypeDef[] | undefined,\n values?: Set<string | boolean | number>,\n typenameField?: string,\n typenameValue?: string,\n idField?: string | symbol,\n ) {\n this.mask = mask;\n this.shape = shape;\n this.values = values;\n this.typenameField = typenameField;\n this.typenameValue = typenameValue;\n this.idField = idField;\n }\n\n static merge(defs: ValidatorDef<any>[]): ValidatorDef<any> {\n if (defs.length === 1) return defs[0];\n\n const count = defs.length;\n const shapes = defs.map(d => d.shape as Record<string, unknown> | undefined);\n const typename = defs[0].typenameValue ?? '(unknown)';\n\n const mergedShape = mergeObjectShapes(shapes, count, typename);\n\n let idField: string | symbol | undefined;\n let typenameField: string | undefined;\n let typenameValue: string | undefined;\n\n for (const def of defs) {\n if (idField === undefined && def.idField !== undefined) {\n idField = def.idField;\n } else if (idField !== undefined && def.idField !== undefined && def.idField !== idField) {\n throw new Error(\n `[fetchium] Entity typename '${def.typenameValue}' has conflicting id fields: '${String(idField)}' vs '${String(def.idField)}'`,\n );\n }\n\n if (typenameField === undefined) typenameField = def.typenameField;\n if (typenameValue === undefined) typenameValue = def.typenameValue;\n }\n\n return new ValidatorDef(\n Mask.ENTITY | Mask.OBJECT,\n mergedShape as any,\n undefined,\n typenameField,\n typenameValue,\n idField,\n );\n }\n\n static cloneWith(def: ValidatorDef<any>, mask: Mask): ValidatorDef<any> {\n const newDef = new ValidatorDef(\n mask | def.mask,\n def.shape,\n def.values,\n def.typenameField,\n def.typenameValue,\n def.idField,\n );\n newDef._methods = def._methods;\n newDef._entityConfig = def._entityConfig;\n newDef._entityClass = def._entityClass;\n newDef._entityCache = def._entityCache;\n newDef._liveConfig = def._liveConfig;\n return newDef;\n }\n}\n\n// -----------------------------------------------------------------------------\n// Case-Insensitive Enum Set\n// -----------------------------------------------------------------------------\n\n/**\n * A Set-like class for enum values that matches string values case-insensitively.\n * Non-string values (numbers, booleans) are matched exactly.\n * Returns the canonical (originally defined) casing when a match is found.\n */\nexport class CaseInsensitiveSet<T extends string | boolean | number> extends Set<T> {\n private readonly lowercaseMap: Map<string, T>; // lowercase -> canonical (strings only)\n\n constructor(values: readonly T[]) {\n super(values);\n\n this.lowercaseMap = new Map<string, T>();\n\n for (const value of values) {\n if (typeof value === 'string') {\n const lowercase = value.toLowerCase();\n const existing = this.lowercaseMap.get(lowercase);\n\n if (existing !== undefined) {\n throw new Error(\n `Case-insensitive enum cannot have multiple values with the same lowercase form: '${existing}' and '${value}' both become '${lowercase}'`,\n );\n }\n\n this.lowercaseMap.set(lowercase, value);\n }\n }\n }\n\n /**\n * Check if a value exists in the set (case-insensitively for strings).\n * Used for backwards compatibility with Set-based checks.\n */\n has(value: unknown): boolean {\n return this.get(value) !== undefined;\n }\n\n /**\n * Get the canonical value for a given input.\n * For strings, performs case-insensitive lookup and returns the canonical casing.\n * For numbers/booleans, performs exact match.\n * Returns undefined if no match is found.\n */\n get(value: unknown): T | undefined {\n if (typeof value === 'string') {\n return this.lowercaseMap.get(value.toLowerCase());\n }\n\n if (super.has(value as T)) {\n return value as T;\n }\n\n return undefined;\n }\n}\n\nconst CASE_INSENSITIVE_SET_SEED = 0x43494553;\n\nregisterCustomHash(CaseInsensitiveSet, set => {\n let sum = CASE_INSENSITIVE_SET_SEED;\n for (const value of set) {\n sum += hashValue(value);\n }\n return sum >>> 0;\n});\n\n// -----------------------------------------------------------------------------\n// Complex Type Definitions\n// -----------------------------------------------------------------------------\n\nfunction defineWrapperType(mask: Mask, shape: InternalTypeDef): ValidatorDef<any> {\n return new ValidatorDef(mask, shape);\n}\n\nexport function defineArray<T extends TypeDef>(shape: T): TypeDef<ExtractType<T>[]> {\n return defineWrapperType(Mask.ARRAY, shape as unknown as InternalTypeDef) as unknown as TypeDef<ExtractType<T>[]>;\n}\n\nexport function defineRecord<T extends TypeDef>(shape: T): TypeDef<Record<string, ExtractType<T>>> {\n return defineWrapperType(Mask.RECORD | Mask.OBJECT, shape as unknown as InternalTypeDef) as unknown as TypeDef<\n Record<string, ExtractType<T>>\n >;\n}\n\nexport function defineParseResult<T extends TypeDef>(\n innerType: T,\n): TypeDef<import('./types.js').ParseResult<ExtractType<T>>> {\n return defineWrapperType(Mask.PARSE_RESULT, innerType as unknown as InternalTypeDef) as unknown as TypeDef<\n import('./types.js').ParseResult<ExtractType<T>>\n >;\n}\n\nfunction defineObjectOrEntity(baseMask: Mask, shape: InternalObjectShape): ValidatorDef<any> {\n let mask = baseMask;\n let idField: string | undefined = undefined;\n let typenameField: string | undefined = undefined;\n let typenameValue: string | undefined = undefined;\n\n for (const [key, value] of entries(shape)) {\n switch (typeof value) {\n case 'number':\n if ((value & Mask.ID) !== 0) {\n if (idField !== undefined) {\n throw new Error(`Duplicate id field: ${key}`);\n }\n\n idField = key;\n }\n break;\n case 'string':\n if (typenameField !== undefined && typenameField !== key) {\n throw new Error(`Duplicate typename field: ${key}`);\n }\n\n typenameField = key;\n typenameValue = value;\n break;\n case 'object':\n if (value instanceof CaseInsensitiveSet || value instanceof Set) {\n break;\n }\n\n if (value.mask & Mask.LIVE) {\n mask |= Mask.LIVE;\n }\n break;\n }\n }\n\n return new ValidatorDef(mask, shape, undefined, typenameField, typenameValue, idField);\n}\n\nexport function defineObject<T extends Record<string, TypeDef>>(shape: T): TypeDef<ExtractType<T>> {\n return defineObjectOrEntity(Mask.OBJECT, shape as unknown as InternalObjectShape) as unknown as TypeDef<\n ExtractType<T>\n >;\n}\n\nfunction addDefToUnion(\n def: ComplexTypeDef,\n unionShape: UnionTypeDefs,\n unionTypenameField: string | undefined,\n): string | undefined {\n const nestedMask = def.mask;\n\n if ((nestedMask & Mask.UNION) !== 0) {\n const nestedUnion = def as UnionDef;\n\n if (nestedUnion.typenameField !== undefined) {\n if (unionTypenameField !== undefined && unionTypenameField !== nestedUnion.typenameField) {\n throw new Error(\n `Union typename field conflict: Cannot merge unions with different typename fields ('${unionTypenameField}' vs '${nestedUnion.typenameField}')`,\n );\n }\n unionTypenameField = nestedUnion.typenameField;\n }\n\n const nestedShape = nestedUnion.shape;\n\n if (nestedShape !== undefined) {\n for (const key of [...keys(nestedShape), ARRAY_KEY, RECORD_KEY] as const) {\n const value = nestedShape[key];\n\n if (unionShape[key] !== undefined && unionShape[key] !== value) {\n throw new Error(\n `Union merge conflict: Duplicate typename value '${String(key)}' found when merging nested unions (${String(unionShape[key])} vs ${String(value)})`,\n );\n }\n\n unionShape[key] = value as any;\n }\n }\n } else if ((nestedMask & Mask.ARRAY) !== 0) {\n if (unionShape[ARRAY_KEY] !== undefined) {\n throw new Error('Array shape already defined');\n }\n\n unionShape[ARRAY_KEY] = def.shape as InternalTypeDef;\n } else if ((nestedMask & Mask.RECORD) !== 0) {\n if (unionShape[RECORD_KEY] !== undefined) {\n throw new Error('Record shape already defined');\n }\n\n unionShape[RECORD_KEY] = def.shape as InternalTypeDef;\n } else {\n const typenameField = (def as ObjectDef).typenameField;\n const typename = (def as ObjectDef).typenameValue;\n\n if (typename === undefined) {\n throw new Error(\n 'Object definitions must have a typename to be in a union with other objects, records, or arrays',\n );\n }\n\n if (unionTypenameField !== undefined && typenameField !== unionTypenameField) {\n throw new Error('Object definitions must have the same typename field to be in the same union');\n }\n\n unionTypenameField = typenameField;\n unionShape[typename] = def as ObjectDef;\n }\n\n return unionTypenameField;\n}\n\nfunction defineUnion<T extends readonly TypeDef[]>(...types: T): TypeDef<ExtractType<T[number]>> {\n type R = TypeDef<ExtractType<T[number]>>;\n const internalTypes = types as unknown as readonly InternalTypeDef[];\n\n let mask = 0;\n let defCount = 0;\n let firstDef: ComplexTypeDef | undefined;\n let values: Set<string | boolean | number> | undefined;\n let unionShape: UnionTypeDefs | undefined;\n let unionTypenameField: string | undefined;\n let defMask = 0;\n\n for (const type of internalTypes) {\n if (typeof type === 'number') {\n mask |= type;\n continue;\n }\n\n if (type instanceof Set) {\n if (values === undefined) {\n values = new Set(type);\n } else {\n for (const val of type) {\n values.add(val);\n }\n }\n\n continue;\n }\n\n defCount++;\n defMask |= type.mask;\n\n if (defCount === 1) {\n firstDef = type;\n continue;\n }\n\n if (defCount === 2) {\n unionShape = Object.create(null);\n unionTypenameField = addDefToUnion(firstDef!, unionShape!, unionTypenameField);\n }\n\n unionTypenameField = addDefToUnion(type, unionShape!, unionTypenameField);\n }\n\n if (defCount === 0) {\n if (values === undefined) {\n return mask as unknown as R;\n }\n\n if (mask === 0) {\n return values as unknown as R;\n }\n\n return new ValidatorDef(mask | Mask.UNION, undefined, values) as unknown as R;\n }\n\n if (defCount === 1) {\n return ValidatorDef.cloneWith(firstDef as ValidatorDef<any>, mask) as unknown as R;\n }\n\n const finalMask = mask | defMask | Mask.UNION;\n return new ValidatorDef(finalMask, unionShape!, values, unionTypenameField) as unknown as R;\n}\n\nfunction defineWithMask(type: TypeDef, mask: Mask, cache: WeakMap<ValidatorDef<any>, ValidatorDef<any>>): TypeDef {\n const t = type as unknown as InternalTypeDef;\n\n if (typeof t === 'number') {\n return (t | mask) as unknown as TypeDef;\n }\n\n if (t instanceof Set) {\n return defineUnion(type, mask as unknown as TypeDef);\n }\n\n let cached = cache.get(t as ValidatorDef<any>);\n if (cached === undefined) {\n cached = ValidatorDef.cloneWith(t as ValidatorDef<any>, mask);\n cache.set(t as ValidatorDef<any>, cached);\n }\n return cached as unknown as TypeDef;\n}\n\nconst optionalCache = new WeakMap<ValidatorDef<any>, ValidatorDef<any>>();\nconst nullableCache = new WeakMap<ValidatorDef<any>, ValidatorDef<any>>();\nconst nullishCache = new WeakMap<ValidatorDef<any>, ValidatorDef<any>>();\n\nfunction defineNullish<T extends TypeDef>(type: T): TypeDef<ExtractType<T> | undefined | null> {\n return defineWithMask(type, Mask.UNDEFINED | Mask.NULL, nullishCache) as TypeDef<ExtractType<T> | undefined | null>;\n}\n\nfunction defineOptional<T extends TypeDef>(type: T): TypeDef<ExtractType<T> | undefined> {\n return defineWithMask(type, Mask.UNDEFINED, optionalCache) as TypeDef<ExtractType<T> | undefined>;\n}\n\nfunction defineNullable<T extends TypeDef>(type: T): TypeDef<ExtractType<T> | null> {\n return defineWithMask(type, Mask.NULL, nullableCache) as TypeDef<ExtractType<T> | null>;\n}\n\n// -----------------------------------------------------------------------------\n// Marker Functions\n// -----------------------------------------------------------------------------\n\nfunction defineTypename<T extends string>(value: T): TypeDef<T> {\n return value as unknown as TypeDef<T>;\n}\n\nfunction defineConst<T extends string | boolean | number>(value: T): TypeDef<T> {\n return new Set([value]) as unknown as TypeDef<T>;\n}\n\nconst defineEnum = (<T extends readonly (string | boolean | number)[]>(...values: T): TypeDef<T[number]> => {\n return new Set(values as unknown as T[number][]) as unknown as TypeDef<T[number]>;\n}) as unknown as APITypes['enum'];\n\n(defineEnum as any).caseInsensitive = <T extends readonly (string | boolean | number)[]>(\n ...values: T\n): TypeDef<T[number]> => {\n return new CaseInsensitiveSet(values as unknown as T[number][]) as unknown as TypeDef<T[number]>;\n};\n\n// -----------------------------------------------------------------------------\n// Formatted Values\n// -----------------------------------------------------------------------------\n\nexport const FORMAT_MASK_SHIFT = 16;\n\nlet nextFormatId = 0;\nconst FORMAT_PARSERS: ((value: unknown) => unknown)[] = [];\nconst FORMAT_SERIALIZERS: ((value: unknown) => unknown)[] = [];\nconst FORMAT_MAP = new Map<string, number>();\nconst FORMAT_ID_TO_NAME: Map<number, string> | undefined = IS_DEV ? new Map<number, string>() : undefined;\n\nexport const WRAPPED_VALUE = new WeakSet();\n\nexport class FormattedValue {\n _raw: unknown;\n private _formatted: unknown;\n private _parsed: boolean;\n private _formatId: number;\n\n constructor(raw: unknown, formatId: number, eager: boolean) {\n this._raw = raw;\n this._formatId = formatId;\n if (eager) {\n this._formatted = FORMAT_PARSERS[formatId](raw);\n this._parsed = true;\n } else {\n this._parsed = false;\n }\n WRAPPED_VALUE.add(this);\n }\n\n getValue(): unknown {\n if (!this._parsed) {\n this._formatted = FORMAT_PARSERS[this._formatId](this._raw);\n this._parsed = true;\n }\n return this._formatted;\n }\n\n toJSON(): unknown {\n if (this._parsed) {\n return FORMAT_SERIALIZERS[this._formatId](this._formatted);\n }\n return this._raw;\n }\n}\n\nfunction defineFormatted<K extends keyof SignaliumQuery.FormatRegistry>(\n format: K,\n): TypeDef<SignaliumQuery.FormatRegistry[K]> {\n const mask = FORMAT_MAP.get(format);\n\n if (mask === undefined) {\n throw new Error(`Format ${format} not registered`);\n }\n\n return mask as unknown as TypeDef<SignaliumQuery.FormatRegistry[K]>;\n}\n\nexport function getFormat(mask: number): (value: unknown) => unknown {\n const formatId = mask >> FORMAT_MASK_SHIFT;\n return FORMAT_PARSERS[formatId];\n}\n\nexport function getSerializer(mask: number): (value: unknown) => unknown {\n const formatId = mask >> FORMAT_MASK_SHIFT;\n return FORMAT_SERIALIZERS[formatId];\n}\n\nexport function getFormatName(mask: number): string | undefined {\n if (!IS_DEV) return undefined;\n const formatId = mask >> FORMAT_MASK_SHIFT;\n return FORMAT_ID_TO_NAME!.get(formatId);\n}\n\nexport function registerFormat<Input extends Mask.STRING | Mask.NUMBER, T>(\n name: string,\n type: Input,\n parse: (value: Input extends Mask.STRING ? string : number) => T,\n serialize: (value: T) => Input extends Mask.STRING ? string : number,\n options?: { eager?: boolean },\n) {\n const maskId = nextFormatId++;\n FORMAT_PARSERS[maskId] = parse as (value: unknown) => unknown;\n FORMAT_SERIALIZERS[maskId] = serialize as (value: unknown) => unknown;\n if (IS_DEV) FORMAT_ID_TO_NAME!.set(maskId, name);\n\n const eager = options?.eager ?? true;\n const shiftedId = maskId << FORMAT_MASK_SHIFT;\n const mask = shiftedId | type | Mask.HAS_FORMAT | (eager ? Mask.IS_EAGER_FORMAT : 0);\n\n FORMAT_MAP.set(name, mask);\n}\n\n// -----------------------------------------------------------------------------\n// Built-in Formats\n// -----------------------------------------------------------------------------\n\n// Register 'date' format: ISO date string (YYYY-MM-DD) ↔ Date\nregisterFormat(\n 'date',\n Mask.STRING,\n value => {\n // Parse YYYY-MM-DD as UTC date to avoid timezone issues\n const match = value.match(/^(\\d{4})-(\\d{2})-(\\d{2})$/);\n if (!match) {\n throw new Error(`Invalid date string: ${value}. Expected YYYY-MM-DD format.`);\n }\n const [, year, month, day] = match;\n const date = new Date(Date.UTC(parseInt(year, 10), parseInt(month, 10) - 1, parseInt(day, 10)));\n if (isNaN(date.getTime())) {\n throw new Error(`Invalid date string: ${value}`);\n }\n return date;\n },\n value => {\n // Format as YYYY-MM-DD using UTC to avoid timezone issues\n const year = value.getUTCFullYear();\n const month = String(value.getUTCMonth() + 1).padStart(2, '0');\n const day = String(value.getUTCDate()).padStart(2, '0');\n return `${year}-${month}-${day}`;\n },\n);\n\n// Register 'date-time' format: ISO datetime string (ISO 8601) ↔ Date\nregisterFormat(\n 'date-time',\n Mask.STRING,\n value => {\n const date = new Date(value);\n if (isNaN(date.getTime())) {\n throw new Error(`Invalid date-time string: ${value}`);\n }\n return date;\n },\n value => {\n // Format as ISO 8601 string\n return value.toISOString();\n },\n);\n\n// -----------------------------------------------------------------------------\n// Entity Definitions\n// -----------------------------------------------------------------------------\n\nimport { Entity } from './proxy.js';\n\nconst entityDefCache = new WeakMap<new () => Entity, ValidatorDef<any>>();\n\n/**\n * Gets or creates a ValidatorDef for an Entity class. Instantiates the class once,\n * extracts field values as the shape and prototype methods, then caches the result.\n */\nexport function getEntityDef(cls: new () => Entity): ValidatorDef<any> {\n let def = entityDefCache.get(cls);\n\n if (def === undefined) {\n const instance = new cls();\n\n const raw = (instance as any)[DEFINITION_TARGET] ?? instance;\n if ((instance as any)[CANCEL_PROXY]) {\n (instance as any)[CANCEL_PROXY]();\n }\n\n const shape: InternalObjectShape = {};\n for (const [key, value] of entries(raw as Record<string, unknown>)) {\n if (IS_DEV) {\n const isValidDef =\n typeof value === 'number' ||\n typeof value === 'string' ||\n value instanceof Set ||\n value instanceof ValidatorDef ||\n value instanceof CaseInsensitiveSet;\n\n if (!isValidDef) {\n throw new Error(\n `[fetchium] Entity '${cls.name}' field '${key}' has an invalid type definition. ` +\n `All entity fields must be type definitions (e.g. t.string, t.number, t.entity(...), etc). ` +\n `Got: ${typeof value === 'object' ? (value?.constructor?.name ?? typeof value) : typeof value}`,\n );\n }\n }\n shape[key] = value as any;\n }\n\n // Throw when subclass redefines a field that exists on a parent Entity.\n // Only throw when the subclass provides a different value for a parent key (shadowing), not for inherited keys.\n const parentProto = Object.getPrototypeOf(cls.prototype);\n if (parentProto != null) {\n const ParentClass = parentProto.constructor as new () => Entity;\n if (ParentClass !== Entity && typeof ParentClass === 'function') {\n const parentDef = getEntityDef(ParentClass);\n const parentShape = parentDef.shape as InternalObjectShape;\n for (const key of keys(parentShape)) {\n if (key in shape && shape[key] !== parentShape[key]) {\n throw new Error(`Cannot extend: field '${key}' already exists in type definition`);\n }\n }\n }\n }\n\n const methods: EntityMethods = {};\n const proto = cls.prototype;\n for (const key of Object.getOwnPropertyNames(proto)) {\n if (key !== 'constructor' && typeof proto[key] === 'function') {\n methods[key] = proto[key];\n }\n }\n\n def = defineObjectOrEntity(Mask.ENTITY | Mask.OBJECT, shape);\n\n def._entityClass = cls;\n\n if (keys(methods).length > 0) {\n def._methods = methods;\n }\n\n if (typeof methods['__subscribe'] === 'function') {\n def._entityConfig = { hasSubscribe: true };\n }\n\n const staticCls = cls as typeof Entity;\n\n if (staticCls.cache) {\n def._entityCache = staticCls.cache;\n }\n\n entityDefCache.set(cls, def);\n }\n\n return def;\n}\n\nfunction defineEntityType(cls: new () => Entity): TypeDef<any> {\n return getEntityDef(cls) as unknown as TypeDef<any>;\n}\n\n// -----------------------------------------------------------------------------\n// LiveArray / LiveValue Definitions\n// -----------------------------------------------------------------------------\n\nimport { isFieldRef, DEFINITION_TARGET, CANCEL_PROXY } from './fieldRef.js';\n\nfunction buildConstraintFieldRefs(\n entityDefs: ValidatorDef<any>[],\n constraints: unknown,\n): Map<string, Array<[string, unknown]>> | undefined {\n if (constraints === undefined || constraints === null) return undefined;\n\n const result = new Map<string, Array<[string, unknown]>>();\n\n if (Array.isArray(constraints)) {\n for (const entry of constraints) {\n const [cls, constraintMap] = entry as [new () => Entity, Record<string, unknown>];\n const def = getEntityDef(cls);\n const typename = def.typenameValue;\n if (typename === undefined) continue;\n const pairs: Array<[string, unknown]> = [];\n for (const [field, ref] of Object.entries(constraintMap)) {\n pairs.push([field, ref]);\n }\n if (pairs.length > 0) {\n result.set(typename, pairs);\n }\n }\n } else {\n const constraintMap = constraints as Record<string, unknown>;\n const constraintEntries = Object.entries(constraintMap);\n if (constraintEntries.length === 0) return undefined;\n\n const pairs: Array<[string, unknown]> = constraintEntries.map(([field, ref]) => [field, ref]);\n\n for (const def of entityDefs) {\n const typename = def.typenameValue;\n if (typename !== undefined) {\n result.set(typename, pairs);\n }\n }\n }\n\n return result.size > 0 ? result : undefined;\n}\n\nfunction resolveEntityDefs(entityOrArray: unknown): ValidatorDef<any>[] {\n if (Array.isArray(entityOrArray)) {\n return entityOrArray.map(cls => getEntityDef(cls as new () => Entity));\n }\n return [getEntityDef(entityOrArray as new () => Entity)];\n}\n\nfunction defineLiveArray(entityOrArray: unknown, opts?: LiveArrayOptions<any>): TypeDef<any> {\n const entityDefs = resolveEntityDefs(entityOrArray);\n\n const innerDef =\n entityDefs.length === 1\n ? entityDefs[0]\n : (defineUnion(...entityDefs.map(d => d as unknown as TypeDef)) as unknown as ValidatorDef<any>);\n\n const mask = Mask.ARRAY | Mask.LIVE;\n const def = new ValidatorDef(mask, innerDef as unknown as InternalTypeDef);\n\n def._liveConfig = LiveFieldConfig.array(\n entityDefs,\n buildConstraintFieldRefs(entityDefs, opts?.constraints),\n opts?.sort as ((a: unknown, b: unknown) => number) | undefined,\n );\n\n return def as unknown as TypeDef<any>;\n}\n\nfunction defineLiveValue(valueType: TypeDef, entityOrArray: unknown, opts: LiveValueOptions<any, any>): TypeDef<any> {\n const entityDefs = resolveEntityDefs(entityOrArray);\n\n const valueInternalType = valueType as unknown as InternalTypeDef;\n\n const mask = Mask.LIVE;\n const def = new ValidatorDef(mask, undefined);\n\n def._liveConfig = LiveFieldConfig.value(\n entityDefs,\n buildConstraintFieldRefs(entityDefs, opts?.constraints),\n valueInternalType,\n opts.onCreate,\n opts.onUpdate,\n opts.onDelete,\n );\n\n return def as unknown as TypeDef<any>;\n}\n\nexport const t: APITypes = {\n format: defineFormatted,\n typename: defineTypename,\n const: defineConst,\n enum: defineEnum,\n id: (Mask.ID | Mask.STRING | Mask.NUMBER) as unknown as TypeDef<string | number>,\n string: Mask.STRING as unknown as TypeDef<string>,\n number: Mask.NUMBER as unknown as TypeDef<number>,\n boolean: Mask.BOOLEAN as unknown as TypeDef<boolean>,\n null: Mask.NULL as unknown as TypeDef<null>,\n undefined: Mask.UNDEFINED as unknown as TypeDef<undefined>,\n array: defineArray,\n object: defineObject as APITypes['object'],\n record: defineRecord,\n union: defineUnion,\n nullish: defineNullish,\n optional: defineOptional,\n nullable: defineNullable,\n result: defineParseResult,\n entity: defineEntityType,\n liveArray: defineLiveArray as APITypes['liveArray'],\n liveValue: defineLiveValue as APITypes['liveValue'],\n};\n","import {\n ARRAY_KEY,\n ArrayDef,\n EntityDef,\n InternalObjectFieldTypeDef,\n Mask,\n ObjectDef,\n RECORD_KEY,\n RecordDef,\n UnionDef,\n} from './types.js';\nimport { CaseInsensitiveSet, getFormatName } from './typeDefs.js';\n\nexport function typeToString(type: InternalObjectFieldTypeDef): string {\n // Handle case-insensitive enum sets\n if (type instanceof CaseInsensitiveSet) {\n const values = Array.from(type).map(v => (typeof v === 'string' ? `\"${v}\"` : String(v)));\n return values.join(' | ');\n }\n\n // Handle Set-based constants/enums\n if (type instanceof Set) {\n const values = Array.from(type).map(v => (typeof v === 'string' ? `\"${v}\"` : String(v)));\n return values.join(' | ');\n }\n\n // Handle constants\n if (typeof type === 'string') {\n return `\"${type}\"`;\n }\n\n if (typeof type === 'boolean') {\n return String(type);\n }\n\n // Handle primitive masks\n if (typeof type === 'number') {\n // Check for formatted types first\n const hasFormat = (type & Mask.HAS_FORMAT) !== 0;\n if (hasFormat) {\n const formatName = getFormatName(type);\n if (formatName) {\n // Show format name instead of base type\n return `\"${formatName}\"`;\n }\n }\n\n const types: string[] = [];\n\n if (type & Mask.UNDEFINED) types.push('undefined');\n if (type & Mask.NULL) types.push('null');\n if (type & Mask.NUMBER) types.push('number');\n if (type & Mask.STRING) types.push('string');\n if (type & Mask.BOOLEAN) types.push('boolean');\n if (type & Mask.OBJECT) types.push('object');\n if (type & Mask.ARRAY) types.push('array');\n\n if (types.length === 0) {\n return 'unknown';\n }\n\n return types.length === 1 ? types[0] : types.join(' | ');\n }\n\n // Handle complex types - CHECK UNION FIRST since it contains other types\n let mask = type.mask;\n\n if (mask & Mask.UNION) {\n const unionType = type as UnionDef;\n const parts: string[] = [];\n\n // Add const/enum values from the values Set\n if (unionType.values !== undefined && unionType.values.size > 0) {\n for (const val of unionType.values) {\n const valStr = typeof val === 'string' ? `\"${val}\"` : String(val);\n parts.push(valStr);\n }\n }\n\n // Add complex types from the shape object\n if (unionType.shape !== undefined) {\n if (unionType.shape[ARRAY_KEY] !== undefined) {\n parts.push(`Array<${typeToString(unionType.shape[ARRAY_KEY] as InternalObjectFieldTypeDef)}>`);\n }\n\n if (unionType.shape[RECORD_KEY] !== undefined) {\n parts.push(`Record<string, ${typeToString(unionType.shape[RECORD_KEY] as InternalObjectFieldTypeDef)}>`);\n }\n\n // Add entity/object types by typename\n for (const [key, value] of Object.entries(unionType.shape)) {\n if (key !== (ARRAY_KEY as any) && key !== (RECORD_KEY as any)) {\n // key is the typename value (e.g., \"User\", \"Post\")\n parts.push(key);\n }\n }\n }\n\n mask = unionType.mask;\n\n // Check for formatted types in union mask\n const hasFormat = (mask & Mask.HAS_FORMAT) !== 0;\n if (hasFormat) {\n const formatName = getFormatName(mask);\n if (formatName) {\n parts.push(`\"${formatName}\"`);\n }\n }\n\n // Add primitive types from the mask\n if (mask & Mask.UNDEFINED) parts.push('undefined');\n if (mask & Mask.NULL) parts.push('null');\n if (mask & Mask.NUMBER) parts.push('number');\n if (mask & Mask.STRING) parts.push('string');\n if (mask & Mask.BOOLEAN) parts.push('boolean');\n\n if (parts.length === 0) {\n return 'union';\n }\n\n return parts.join(' | ');\n }\n\n if (mask & Mask.ENTITY) {\n return `Entity<${(type as EntityDef).typenameValue}>`;\n }\n\n if (mask & Mask.ARRAY) {\n const shape = (type as ArrayDef).shape;\n return `Array<${typeToString(shape)}>`;\n }\n\n if (mask & Mask.RECORD) {\n const shape = (type as RecordDef).shape;\n return `Record<string, ${typeToString(shape)}>`;\n }\n\n if (mask & Mask.OBJECT) {\n const typename = (type as ObjectDef).typenameValue;\n return typename ? `Object<${typename}>` : 'object';\n }\n\n return 'unknown';\n}\n\nexport function typeError(path: string, expectedType: InternalObjectFieldTypeDef, value: unknown): Error {\n if (IS_DEV) {\n return new TypeError(\n `Validation error at ${path}: expected ${typeToString(expectedType)}, got ${\n typeof value === 'object' ? (value === null ? 'null' : Array.isArray(value) ? 'array' : 'object') : typeof value\n }`,\n );\n }\n return new TypeError(`Validation error at ${path}`);\n}\n","import { Mask } from './types.js';\n\nconst isArray = Array.isArray;\n\nexport function typeMaskOf(value: unknown): Mask {\n if (value === null) return Mask.NULL;\n\n switch (typeof value) {\n case 'number':\n return Mask.NUMBER;\n case 'string':\n return Mask.STRING;\n case 'boolean':\n return Mask.BOOLEAN;\n case 'undefined':\n return Mask.UNDEFINED;\n case 'object':\n return isArray(value) ? Mask.ARRAY : Mask.OBJECT;\n default:\n throw new Error(`Invalid type: ${typeof value}`);\n }\n}\n\n// ================================\n// Draft Helper Types\n// ================================\n\n/**\n * Recursively makes all properties of T mutable (removes readonly).\n * This is the return type of the draft() function.\n */\nexport type Draft<T> = T extends readonly (infer U)[]\n ? Draft<U>[]\n : T extends Date\n ? Date\n : T extends Map<infer K, infer V>\n ? Map<Draft<K>, Draft<V>>\n : T extends Set<infer U>\n ? Set<Draft<U>>\n : T extends object\n ? { -readonly [K in keyof T]: Draft<T[K]> }\n : T;\n\n/**\n * Deep clones an entity or object, returning a plain mutable copy.\n * This is useful for creating a \"draft\" version of an entity that can be modified\n * before being passed to a mutation.\n *\n * The draft is a plain JavaScript object (not an entity proxy), so:\n * - All fields are mutable via property assignment\n * - Changes don't affect the original entity\n * - When passed to a mutation, it's serialized as a normal object\n *\n * @example\n * ```ts\n * // Get an entity from a query\n * const user = await getUser({ id: '123' });\n *\n * // Create a draft to modify\n * const updatedUser = draft(user);\n * updatedUser.name = 'New Name';\n * updatedUser.email = 'new@example.com';\n *\n * // Pass to mutation\n * await updateUser().run(updatedUser);\n * ```\n *\n * @param entity - The entity or object to clone\n * @returns A deep clone of the entity as a plain mutable object\n */\nexport function draft<T>(entity: T): Draft<T> {\n return deepClone(entity) as Draft<T>;\n}\n\n/**\n * Deep clones a value, handling objects, arrays, and primitives.\n * Entity proxies are converted to plain objects by reading all enumerable properties.\n */\nfunction deepClone<T>(value: T): T {\n // Handle null and primitives\n if (value === null || typeof value !== 'object') {\n return value;\n }\n\n // Handle arrays\n if (isArray(value)) {\n return value.map(item => deepClone(item)) as T;\n }\n\n // Handle Date objects\n if (value instanceof Date) {\n return new Date(value.getTime()) as T;\n }\n\n // Handle Map\n if (value instanceof Map) {\n const clonedMap = new Map();\n for (const [k, v] of value) {\n clonedMap.set(deepClone(k), deepClone(v));\n }\n return clonedMap as T;\n }\n\n // Handle Set\n if (value instanceof Set) {\n const clonedSet = new Set();\n for (const v of value) {\n clonedSet.add(deepClone(v));\n }\n return clonedSet as T;\n }\n\n // Handle plain objects (including entity proxies)\n // For entity proxies, reading properties will extract the underlying data\n const result: Record<string, unknown> = {};\n\n // Get all enumerable own properties (works for both plain objects and proxies)\n for (const key of Object.keys(value as object)) {\n result[key] = deepClone((value as Record<string, unknown>)[key]);\n }\n\n return result as T;\n}\n","// -----------------------------------------------------------------------------\n// Parse System\n//\n// parseEntities/parseData: Validates, formats, produces parsed entity data\n// objects. Entities are deduplicated via ctx.seen/ctx.seenByKey.\n// -----------------------------------------------------------------------------\n\nimport { hashValue } from 'signalium/utils';\nimport type { QueryClient, PreloadedEntityMap } from './QueryClient.js';\nimport { CaseInsensitiveSet, FormattedValue, FORMAT_MASK_SHIFT, ValidatorDef } from './typeDefs.js';\nimport { typeError } from './errors.js';\nimport {\n ARRAY_KEY,\n ArrayDef,\n ComplexTypeDef,\n EntityDef,\n InternalObjectFieldTypeDef,\n LiveFieldType,\n Mask,\n ObjectDef,\n ParseResultDef,\n RECORD_KEY,\n RecordDef,\n TypeDef,\n UnionDef,\n} from './types.js';\nimport { typeMaskOf } from './utils.js';\nimport { PROXY_ID } from './proxyId.js';\n\nimport type { WarnFn } from './proxy.js';\n\nconst entries = Object.entries;\nconst noopWarn: WarnFn = () => {};\n\n// ======================================================\n// ParsedEntity — lightweight struct for parsed entity data\n// ======================================================\n\nexport interface ParsedEntity {\n key: number;\n shape: EntityDef;\n data: Record<string, unknown>;\n /** Set for partial event updates — restricts mergeFields to only these keys. */\n rawKeys: Set<string> | undefined;\n}\n\n// ======================================================\n// Parse context — bundles threading parameters\n// ======================================================\n\nexport class ParseContext {\n queryClient: QueryClient | undefined = undefined;\n preloadedEntities: PreloadedEntityMap | undefined = undefined;\n warn: WarnFn = noopWarn;\n /** When true, missing optional fields on existing entities are set to\n * undefined. False for mutation events (truly partial payloads). */\n isPartialEvent: boolean = false;\n seen: Map<Record<string, unknown>, ParsedEntity> | undefined = undefined;\n seenByKey: Map<number, ParsedEntity> | undefined = undefined;\n\n reset(\n queryClient: QueryClient | undefined,\n preloadedEntities: PreloadedEntityMap | undefined,\n warn: WarnFn,\n isPartialEvent: boolean = false,\n ): void {\n this.queryClient = queryClient;\n this.preloadedEntities = preloadedEntities;\n this.warn = warn;\n this.isPartialEvent = isPartialEvent;\n if (queryClient !== undefined) {\n if (this.seen === undefined) {\n this.seen = new Map();\n this.seenByKey = new Map();\n } else {\n this.seen.clear();\n this.seenByKey!.clear();\n }\n }\n }\n}\n\nexport interface ParseResult {\n data: unknown;\n ctx: ParseContext;\n}\n\n// ======================================================\n// Entry points\n// ======================================================\n\n/**\n * Parse data: validates types, applies formats, produces parsed entity data\n * objects (stored in ctx.seen). Does NOT touch the entity store.\n *\n * After parsing, call applyEntityRefs() to apply entities and reify the tree.\n */\nexport function parseEntities(value: unknown, typeDef: TypeDef | ComplexTypeDef, ctx: ParseContext): unknown {\n return parseData(value, typeDef, ctx, '');\n}\n\n/**\n * Standalone value parser for non-entity values. Used by tests and LiveCollection.\n * Validates types and applies eager formats. Does not perform entity resolution.\n */\nexport function parseValue(\n value: unknown,\n typeDef: TypeDef | ComplexTypeDef,\n path: string,\n warn: WarnFn = noopWarn,\n): unknown {\n const ctx = new ParseContext();\n ctx.reset(undefined, undefined, warn);\n const result = parseData(value, typeDef, ctx, path);\n return unwrapFormattedValues(result);\n}\n\n/**\n * Parse a single entity. Returns its parsed data object.\n */\nexport function parseEntity(\n obj: Record<string, unknown>,\n entityShape: EntityDef,\n ctx: ParseContext,\n): Record<string, unknown> {\n return parseEntityData(obj, entityShape, ctx);\n}\n\n// ======================================================\n// Internal helpers\n// ======================================================\n\nfunction unwrapFormattedValues(value: unknown): unknown {\n if (value instanceof FormattedValue) {\n return value.getValue();\n }\n if (Array.isArray(value)) {\n for (let i = 0; i < value.length; i++) {\n value[i] = unwrapFormattedValues(value[i]);\n }\n return value;\n }\n if (typeof value === 'object' && value !== null) {\n const obj = value as Record<string, unknown>;\n for (const key of Object.keys(obj)) {\n obj[key] = unwrapFormattedValues(obj[key]);\n }\n }\n return value;\n}\n\nfunction parseFormattedValue(\n mask: number,\n value: unknown,\n ctx: ParseContext,\n path: string,\n): FormattedValue | undefined {\n const formatId = mask >> FORMAT_MASK_SHIFT;\n const eager = (mask & Mask.IS_EAGER_FORMAT) !== 0;\n if (eager) {\n try {\n return new FormattedValue(value, formatId, true);\n } catch (e) {\n if ((mask & Mask.UNDEFINED) !== 0) {\n ctx.warn('Invalid formatted value for optional type, defaulting to undefined', {\n value,\n path,\n error: e instanceof Error ? e.message : String(e),\n });\n return undefined;\n }\n throw e;\n }\n }\n return new FormattedValue(value, formatId, false);\n}\n\n// ======================================================\n// Parse dispatcher\n// ======================================================\n\nfunction parseData(value: unknown, typeDef: TypeDef | ComplexTypeDef, ctx: ParseContext, path: string): unknown {\n const def = typeDef as unknown as InternalObjectFieldTypeDef;\n\n if (def instanceof CaseInsensitiveSet) {\n const canonical = def.get(value);\n if (canonical === undefined) throw typeError(path, def as any, value);\n return canonical;\n }\n\n if (def instanceof Set) {\n if (!def.has(value as string | boolean | number)) throw typeError(path, def as any, value);\n return value;\n }\n\n if (typeof def === 'string') {\n if (value === undefined || value === null) return def;\n if (value !== def) throw typeError(path, def, value);\n return value;\n }\n\n if (typeof def === 'number') {\n const valueType = typeMaskOf(value);\n\n if ((def & valueType) === 0) {\n if ((def & Mask.UNDEFINED) !== 0) {\n ctx.warn('Invalid value for optional type, defaulting to undefined', { value, path });\n return undefined;\n }\n throw typeError(path, def, value);\n }\n\n if ((def & Mask.HAS_FORMAT) !== 0 && value !== null && value !== undefined) {\n return parseFormattedValue(def, value, ctx, path);\n }\n\n return value;\n }\n\n // --- Complex types (ValidatorDef) ---\n\n const propMask = def.mask;\n\n const liveConfig = (def as unknown as ValidatorDef<unknown>)._liveConfig;\n if (liveConfig !== undefined && liveConfig.type === LiveFieldType.Value) {\n if (liveConfig.valueType !== undefined) {\n return parseData(value, liveConfig.valueType as unknown as TypeDef, ctx, path);\n }\n return value;\n }\n\n if ((propMask & Mask.PARSE_RESULT) !== 0) {\n try {\n const innerResult = parseData(value, (def as unknown as ParseResultDef).shape as ComplexTypeDef, ctx, path);\n return { success: true as const, value: innerResult };\n } catch (e) {\n return { success: false as const, error: e instanceof Error ? e : new Error(String(e)) };\n }\n }\n\n const valueType = typeMaskOf(value);\n\n if ((propMask & valueType) === 0 && !def.values?.has(value as string | boolean | number)) {\n if ((propMask & Mask.UNDEFINED) !== 0) {\n ctx.warn('Invalid value for optional type, defaulting to undefined', { value, path });\n return undefined;\n }\n throw typeError(path, propMask, value);\n }\n\n if (valueType < Mask.OBJECT) {\n if ((propMask & Mask.HAS_FORMAT) !== 0 && value !== null && value !== undefined) {\n return parseFormattedValue(propMask, value, ctx, path);\n }\n\n return value;\n }\n\n if ((propMask & Mask.UNION) !== 0) {\n return parseUnionData(valueType, value as Record<string, unknown> | unknown[], def as UnionDef, ctx, path);\n }\n\n if (valueType === Mask.ARRAY) {\n return parseArrayData(value as unknown[], (def as ArrayDef).shape as ComplexTypeDef, ctx, path);\n }\n\n if ((propMask & Mask.RECORD) !== 0) {\n return parseRecordData(value as Record<string, unknown>, (def as RecordDef).shape as ComplexTypeDef, ctx, path);\n }\n\n if ((propMask & Mask.ENTITY) !== 0 && ctx.queryClient !== undefined) {\n return parseEntityData(value as Record<string, unknown>, def as EntityDef, ctx);\n }\n\n return parseObjectData(value as Record<string, unknown>, def as ObjectDef | EntityDef, ctx, path);\n}\n\n// ======================================================\n// Union\n// ======================================================\n\nfunction parseUnionData(\n valueType: number,\n value: Record<string, unknown> | unknown[],\n unionDef: UnionDef,\n ctx: ParseContext,\n path: string,\n): unknown {\n if (valueType === Mask.ARRAY) {\n const shape = unionDef.shape![ARRAY_KEY];\n\n if (shape === undefined || typeof shape === 'number') {\n return value;\n }\n\n return parseArrayData(value as unknown[], shape as ComplexTypeDef, ctx, path);\n } else {\n const typenameField = unionDef.typenameField;\n const typename = typenameField ? (value as Record<string, unknown>)[typenameField] : undefined;\n\n if (typename === undefined || typeof typename !== 'string') {\n const recordShape = unionDef.shape![RECORD_KEY];\n\n if (recordShape === undefined) {\n throw new Error(\n `Typename field '${typenameField}' is required for union discrimination but was not found in the data`,\n );\n }\n\n return parseRecordData(value as Record<string, unknown>, recordShape as ComplexTypeDef, ctx, path);\n }\n\n const matchingDef = unionDef.shape![typename];\n\n if (matchingDef === undefined || typeof matchingDef === 'number') {\n throw new Error(`Unknown typename '${typename}' in union`);\n }\n\n if (matchingDef.mask & Mask.ENTITY && ctx.queryClient !== undefined) {\n return parseEntityData(value as Record<string, unknown>, matchingDef as EntityDef, ctx);\n }\n\n return parseObjectData(value as Record<string, unknown>, matchingDef as ObjectDef | EntityDef, ctx, path);\n }\n}\n\n// ======================================================\n// Array / Record / Object\n// ======================================================\n\nfunction parseArrayData(array: unknown[], itemShape: ComplexTypeDef, ctx: ParseContext, path: string): unknown[] {\n const result: unknown[] = [];\n\n for (let i = 0; i < array.length; i++) {\n try {\n result.push(parseData(array[i], itemShape as unknown as TypeDef, ctx, `${path}[${i}]`));\n } catch (e) {\n ctx.warn('Failed to parse array item, filtering out', {\n index: i,\n value: array[i],\n error: e instanceof Error ? e.message : String(e),\n });\n }\n }\n\n return result;\n}\n\nfunction parseRecordData(\n record: Record<string, unknown>,\n valueShape: ComplexTypeDef,\n ctx: ParseContext,\n path: string,\n): Record<string, unknown> {\n for (const [key, value] of entries(record)) {\n record[key] = parseData(value, valueShape as unknown as TypeDef, ctx, `${path}[\"${key}\"]`);\n }\n\n return record;\n}\n\nfunction parseObjectData(\n obj: Record<string, unknown>,\n objectShape: ObjectDef | EntityDef,\n ctx: ParseContext,\n path: string,\n): Record<string, unknown> {\n if (PROXY_ID.has(obj)) {\n return obj;\n }\n\n const shape = objectShape.shape;\n\n for (const [key, propShape] of entries(shape)) {\n obj[key] = parseData(obj[key], propShape as unknown as TypeDef, ctx, `${path}.${key}`);\n }\n\n return obj;\n}\n\n// ======================================================\n// Entity — parse into parsed data object, register in seen\n// ======================================================\n\nfunction parseEntityData(\n obj: Record<string, unknown>,\n entityShape: EntityDef,\n ctx: ParseContext,\n): Record<string, unknown> {\n const queryClient = ctx.queryClient!;\n const preloadedEntities = ctx.preloadedEntities;\n let key: number;\n let id: string | number;\n\n if (preloadedEntities !== undefined) {\n key = obj.__entityRef as number;\n // For preloaded entities, the id is embedded in the key. Use key as id\n // since the original value may not survive JSON serialization (symbols).\n id = key;\n } else {\n const rawId = (obj as Record<string | symbol, unknown>)[entityShape.idField];\n\n if (rawId === undefined || rawId === null || (typeof rawId !== 'string' && typeof rawId !== 'number')) {\n throw new Error(`Entity id must be a string or number: ${entityShape.typenameValue} (got ${typeof rawId})`);\n }\n\n id = rawId;\n key = hashValue([entityShape.typenameValue, id]);\n }\n\n const existingEntry = ctx.seenByKey!.get(key);\n if (existingEntry !== undefined) {\n return existingEntry.data;\n }\n\n if (preloadedEntities !== undefined) {\n const existing = queryClient.entityMap.getEntity(key);\n const preloaded = existing?.data ?? preloadedEntities.get(key);\n\n if (preloaded === undefined) {\n throw new Error(`Cached entity ${key} not found in preloaded map`);\n }\n\n obj = preloaded;\n }\n\n const parsedData: Record<string | symbol, unknown> = {};\n // For symbol id fields (QUERY_ID), copy the id onto parsedData so\n // getOrCreateEntity can read it. entries(shape) skips symbol keys.\n if (typeof entityShape.idField === 'symbol') {\n parsedData[entityShape.idField] = id;\n }\n // For mutation events updating existing entities, track which keys are\n // present so mergeFields only touches those fields (true partial update).\n const existingInStore = queryClient.entityMap.getEntity(key);\n const isPartial = ctx.isPartialEvent && existingInStore !== undefined;\n\n const entry: ParsedEntity = {\n key,\n shape: entityShape,\n data: parsedData,\n rawKeys: isPartial ? new Set(Object.keys(obj)) : undefined,\n };\n ctx.seen!.set(parsedData, entry);\n ctx.seenByKey!.set(key, entry);\n\n const entityDesc = `[[${entityShape.typenameValue}:${id}]]`;\n const shape = entityShape.shape;\n\n for (const [fieldKey, propShape] of entries(shape)) {\n // For partial event updates (mutation events), skip fields not in the payload.\n if (isPartial && !(fieldKey in obj)) continue;\n // For full responses (queries/mutations), always parse every field —\n // missing fields are treated as undefined (JSON drops undefined values).\n parsedData[fieldKey] = parseData(obj[fieldKey], propShape as unknown as TypeDef, ctx, `${entityDesc}.${fieldKey}`);\n }\n\n return parsedData;\n}\n\n// ======================================================\n// entitySatisfiesShape\n// ======================================================\n\nexport function entitySatisfiesShape(data: Record<string, unknown>, def: ValidatorDef<any>): boolean {\n return objectSatisfiesShape(data, def.shape as Record<string, unknown>, def.typenameField);\n}\n\nfunction objectSatisfiesShape(\n data: Record<string, unknown>,\n shape: Record<string, unknown> | undefined,\n typenameField?: string,\n): boolean {\n if (shape === undefined) return true;\n\n for (const key of Object.keys(shape)) {\n if (key === typenameField) continue;\n\n const fieldDef = shape[key];\n\n if (fieldDef instanceof ValidatorDef) {\n if ((fieldDef.mask & Mask.UNDEFINED) !== 0) continue;\n if (!(key in data) || data[key] === undefined) return false;\n } else if (typeof fieldDef === 'number') {\n if ((fieldDef & Mask.UNDEFINED) !== 0) continue;\n if (!(key in data) || data[key] === undefined) return false;\n } else {\n if (!(key in data) || data[key] === undefined) return false;\n }\n }\n return true;\n}\n","import {\n relay,\n type DiscriminatedReactivePromise,\n type Notifier,\n notifier,\n reactiveMethod,\n setScopeOwner,\n} from 'signalium';\nimport { type EntityDef, Mask } from './types.js';\nimport { GcKeyType } from './GcManager.js';\nimport { Entity } from './proxy.js';\nimport { PROXY_ID } from './proxyId.js';\nimport type { QueryClient } from './QueryClient.js';\nimport { ValidatorDef, WRAPPED_VALUE } from './typeDefs.js';\nimport type { LiveCollectionBinding } from './LiveCollection.js';\nimport { entitySatisfiesShape } from './parseEntities.js';\n\n// ======================================================\n// Nested proxy wrapping — transparently unwraps WRAPPED_VALUE items\n// (FormattedValue, LiveCollectionBinding) inside plain objects and arrays.\n// ======================================================\n\nconst ObjectProto = Object.prototype;\nconst wrappingCache = new WeakMap<object, object>();\n\nfunction wrapValue(value: unknown): unknown {\n if (typeof value !== 'object' || value === null) return value;\n if (WRAPPED_VALUE.has(value)) return wrapValue((value as { getValue(): unknown }).getValue());\n if (PROXY_ID.has(value as object)) return value;\n\n if (Array.isArray(value)) {\n let cached = wrappingCache.get(value);\n if (cached === undefined) {\n cached = new Proxy(value, arrayWrappingHandler);\n wrappingCache.set(value, cached);\n }\n return cached;\n }\n\n if (Object.getPrototypeOf(value) === ObjectProto) {\n let cached = wrappingCache.get(value);\n if (cached === undefined) {\n cached = new Proxy(value as Record<string, unknown>, objectWrappingHandler);\n wrappingCache.set(value, cached);\n }\n return cached;\n }\n\n return value;\n}\n\nconst arrayWrappingHandler: ProxyHandler<unknown[]> = {\n get(target, prop, receiver) {\n if (typeof prop === 'string') {\n const idx = Number(prop);\n if (Number.isInteger(idx) && idx >= 0 && idx < target.length) {\n return wrapValue(target[idx]);\n }\n }\n return Reflect.get(target, prop, receiver);\n },\n set() {\n if (IS_DEV) throw new Error('Cannot mutate a read-only array');\n return false;\n },\n deleteProperty() {\n if (IS_DEV) throw new Error('Cannot mutate a read-only array');\n return false;\n },\n};\n\nconst objectWrappingHandler: ProxyHandler<Record<string, unknown>> = {\n get(target, prop, receiver) {\n if (typeof prop === 'string') {\n return wrapValue(target[prop]);\n }\n return Reflect.get(target, prop, receiver);\n },\n set() {\n if (IS_DEV) throw new Error('Cannot mutate a read-only object');\n return false;\n },\n deleteProperty() {\n if (IS_DEV) throw new Error('Cannot mutate a read-only object');\n return false;\n },\n has(target, prop) {\n return prop in target;\n },\n ownKeys(target) {\n return Reflect.ownKeys(target);\n },\n getOwnPropertyDescriptor(target, prop) {\n return Object.getOwnPropertyDescriptor(target, prop);\n },\n};\n\n// ======================================================\n\nexport class EntityInstance {\n private _notifier: Notifier;\n _queryClient: QueryClient;\n private _proxies = new Map<ValidatorDef<unknown>, Record<string, unknown>>();\n\n key: number;\n typename: string;\n id: string | number;\n idField: string | symbol;\n data: Record<string, unknown>;\n refCount: number = 0;\n entityRefs: Map<EntityInstance, number> | undefined;\n liveCollections: LiveCollectionBinding[] = [];\n satisfiedDefs: WeakSet<ValidatorDef<unknown>> = new WeakSet();\n parseId: number = -1;\n _entityCache: { gcTime?: number } | undefined;\n _extraMethods: Record<string, (...args: unknown[]) => unknown> | undefined;\n _extraGetters: Record<string, () => unknown> | undefined;\n\n constructor(\n key: number,\n typename: string,\n id: string | number,\n idField: string | symbol,\n data: Record<string, unknown>,\n queryClient: QueryClient,\n ) {\n this._notifier = notifier();\n this._queryClient = queryClient;\n this.key = key;\n this.typename = typename;\n this.id = id;\n this.idField = idField;\n this.data = data;\n this.entityRefs = undefined;\n }\n\n retain(): void {\n this.refCount++;\n const gcTime = this._entityCache?.gcTime;\n if (gcTime !== undefined) {\n this._queryClient.gcManager.cancel(this.key, gcTime);\n }\n }\n\n release(): void {\n if (--this.refCount > 0) return;\n if (this.refCount < 0) {\n if (IS_DEV) throw new Error(`Entity ${this.typename}:${this.id} released more times than retained`);\n return;\n }\n const gcTime = this._entityCache?.gcTime;\n if (gcTime !== undefined) {\n this._queryClient.gcManager.schedule(this.key, gcTime, GcKeyType.Entity);\n } else {\n this.evict();\n }\n }\n\n evict(): void {\n const bindings = this.liveCollections.slice();\n this.liveCollections.length = 0;\n for (const binding of bindings) binding.destroy();\n this._queryClient.entityMap.remove(this.key);\n const refs = this.entityRefs;\n this.entityRefs = undefined;\n if (refs) {\n for (const child of refs.keys()) child.release();\n }\n }\n\n setChildRefs(newRefs: Map<EntityInstance, number> | undefined, persist?: boolean): void {\n const oldRefs = this.entityRefs;\n if (newRefs !== undefined && newRefs.size > 0) {\n for (const child of newRefs.keys()) {\n if (oldRefs === undefined || !oldRefs.has(child)) child.retain();\n }\n }\n if (oldRefs !== undefined && oldRefs.size > 0) {\n for (const child of oldRefs.keys()) {\n if (newRefs === undefined || !newRefs.has(child)) child.release();\n }\n }\n this.entityRefs = newRefs;\n if (persist) this.save();\n }\n\n addChildRef(child: EntityInstance): void {\n if (this.entityRefs === undefined) this.entityRefs = new Map();\n const count = this.entityRefs.get(child) ?? 0;\n this.entityRefs.set(child, count + 1);\n if (count === 0) child.retain();\n this.save();\n }\n\n removeChildRef(child: EntityInstance): void {\n if (this.entityRefs === undefined) return;\n const count = this.entityRefs.get(child);\n if (count === undefined) return;\n if (count <= 1) {\n this.entityRefs.delete(child);\n child.release();\n } else {\n this.entityRefs.set(child, count - 1);\n }\n this.save();\n }\n\n getProxy(shape: EntityDef): Record<string, unknown> {\n const validatorDef = shape as unknown as ValidatorDef<unknown>;\n let proxy = this._proxies.get(validatorDef);\n if (proxy === undefined) {\n proxy = createProxy(this, this.key, shape, this._notifier, this._queryClient);\n this._proxies.set(validatorDef, proxy);\n }\n return proxy;\n }\n\n get proxy(): Record<string, unknown> | undefined {\n return this._proxies.values().next().value;\n }\n\n satisfiesDef(def: ValidatorDef<unknown>): boolean {\n if (this.satisfiedDefs.has(def)) return true;\n if (entitySatisfiesShape(this.data, def)) {\n this.satisfiedDefs.add(def);\n return true;\n }\n return false;\n }\n\n save(): void {\n this._queryClient.entityMap.save(this);\n }\n\n notify(): void {\n this._notifier.notify();\n }\n\n consume(): void {\n this._notifier.consume();\n }\n}\n\nfunction filterEntityArray(array: unknown[], innerDef: ValidatorDef<unknown>, queryClient: QueryClient): unknown[] {\n const result: unknown[] = [];\n for (const item of array) {\n if (typeof item !== 'object' || item === null) continue;\n const entityKey = PROXY_ID.get(item);\n if (entityKey === undefined) continue;\n const entityInstance = queryClient.entityMap.getEntity(entityKey);\n if (entityInstance !== undefined && entityInstance.satisfiesDef(innerDef)) {\n result.push(item);\n }\n }\n return result;\n}\n\n// ======================================================\n// Proxy Creation (module-level function, not a method)\n// ======================================================\n\nfunction createProxy(\n instance: EntityInstance,\n key: number,\n shape: EntityDef,\n entityNotifier: Notifier,\n queryClient: QueryClient,\n): Record<string, unknown> {\n const shapeFields = shape.shape ?? {};\n const validatorDef = shape as unknown as ValidatorDef<unknown>;\n const methods = validatorDef._methods;\n const entityClass = validatorDef._entityClass;\n const entityConfig = validatorDef._entityConfig;\n const proto = entityClass ? entityClass.prototype : Entity.prototype;\n const typenameField = shape.typenameField;\n\n const wrappedMethods = new Map<string, (...args: unknown[]) => unknown>();\n const filterCache = new Map<string, { source: unknown[]; filtered: unknown[] }>();\n\n const toJSON = () => ({ __entityRef: key });\n\n let entityRelay: DiscriminatedReactivePromise<Record<string, unknown>> | undefined;\n\n if (entityConfig?.hasSubscribe && methods && '__subscribe' in methods) {\n entityRelay = relay(state => {\n const onEvent = (event: import('./types.js').MutationEvent) => {\n event.__eventSource = key;\n queryClient.applyMutationEvent(event);\n };\n\n const unsubscribe = methods['__subscribe'].call(proxy, onEvent);\n state.value = proxy;\n\n return unsubscribe;\n });\n }\n\n let proxy: Record<string, unknown>;\n\n if (IS_DEV && typenameField && !(typenameField in shapeFields)) {\n throw new Error(`typenameField \"${typenameField}\" must be declared in the entity shape`);\n }\n\n const baseOwnKeys = Object.keys(shapeFields);\n if (!baseOwnKeys.includes('__typename')) {\n baseOwnKeys.push('__typename');\n }\n if (methods) {\n for (const methodKey of Object.keys(methods)) {\n if (!baseOwnKeys.includes(methodKey)) {\n baseOwnKeys.push(methodKey);\n }\n }\n }\n\n // Cache the full ownKeys list (including extra methods) — rebuilt when\n // _extraMethods changes (set lazily after entity creation).\n let cachedExtraMethods: Record<string, unknown> | undefined;\n let ownKeysList = baseOwnKeys;\n\n function getOwnKeys(): string[] {\n const current = instance._extraMethods;\n if (current !== cachedExtraMethods) {\n cachedExtraMethods = current;\n ownKeysList = baseOwnKeys.slice();\n if (current !== undefined) {\n for (const methodKey of Object.keys(current)) {\n if (!ownKeysList.includes(methodKey)) {\n ownKeysList.push(methodKey);\n }\n }\n }\n const getters = instance._extraGetters;\n if (getters !== undefined) {\n for (const getterKey of Object.keys(getters)) {\n if (!ownKeysList.includes(getterKey)) {\n ownKeysList.push(getterKey);\n }\n }\n }\n }\n return ownKeysList;\n }\n\n const handler: ProxyHandler<object> = {\n getPrototypeOf() {\n return proto;\n },\n\n get(target, prop) {\n if (typeof prop === 'symbol') return undefined;\n if (prop === 'toJSON') return toJSON;\n if (prop === '__context') return queryClient.getContext();\n if (prop === '__typename') return instance.typename;\n\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n entityRelay?.value;\n\n entityNotifier.consume();\n\n if (typeof prop === 'string') {\n const extraGetters = instance._extraGetters;\n if (extraGetters !== undefined && prop in extraGetters) {\n return extraGetters[prop]();\n }\n\n const extraMethods = instance._extraMethods;\n if (extraMethods !== undefined && prop in extraMethods) {\n let bound = wrappedMethods.get(prop);\n if (!bound) {\n bound = extraMethods[prop].bind(proxy);\n wrappedMethods.set(prop, bound);\n }\n return bound;\n }\n\n if (methods && prop in methods) {\n let wrapped = wrappedMethods.get(prop);\n if (!wrapped) {\n wrapped = reactiveMethod(proxy, methods[prop].bind(proxy));\n wrappedMethods.set(prop, wrapped);\n }\n return wrapped;\n }\n }\n\n const value = instance.data[prop as string];\n\n if (typeof value === 'object' && value !== null && WRAPPED_VALUE.has(value)) {\n return wrapValue((value as { getValue(): unknown }).getValue());\n }\n\n if (Array.isArray(value) && typeof prop === 'string') {\n const fieldDef = shapeFields[prop];\n if (fieldDef instanceof ValidatorDef && (fieldDef.mask & Mask.ARRAY) !== 0) {\n const innerDef = fieldDef.shape as ValidatorDef<unknown> | undefined;\n if (innerDef instanceof ValidatorDef && (innerDef.mask & Mask.ENTITY) !== 0) {\n const typename = innerDef.typenameValue;\n if (typename !== undefined) {\n const defs = queryClient.getEntityDefsForTypename(typename);\n if (defs !== undefined && defs.length > 1) {\n const cached = filterCache.get(prop);\n if (cached !== undefined && cached.source === value) {\n return wrapValue(cached.filtered);\n }\n const filtered = filterEntityArray(value, innerDef, queryClient);\n filterCache.set(prop, { source: value, filtered });\n return wrapValue(filtered);\n }\n }\n }\n }\n return wrapValue(value);\n }\n\n return wrapValue(value);\n },\n\n set() {\n if (IS_DEV) throw new Error('Entity properties are read-only');\n return false;\n },\n\n has(target, prop) {\n if (prop === '__typename') return true;\n if (typeof prop === 'string') {\n const extraGetters = instance._extraGetters;\n if (extraGetters && prop in extraGetters) return true;\n const extraMethods = instance._extraMethods;\n if (extraMethods && prop in extraMethods) return true;\n if (methods && prop in methods) return true;\n }\n return prop in shapeFields;\n },\n\n ownKeys() {\n return getOwnKeys();\n },\n\n getOwnPropertyDescriptor(target, prop) {\n if (prop === '__typename') {\n return { enumerable: true, configurable: true, value: instance.typename, writable: false };\n }\n if (prop in shapeFields) {\n return { enumerable: true, configurable: true, value: handler.get!(target, prop, proxy), writable: false };\n }\n if (typeof prop === 'string') {\n const extraGetters = instance._extraGetters;\n if (extraGetters && prop in extraGetters) {\n return { enumerable: true, configurable: true, value: handler.get!(target, prop, proxy), writable: false };\n }\n const extraMethods = instance._extraMethods;\n if (extraMethods && prop in extraMethods) {\n return { enumerable: true, configurable: true, value: handler.get!(target, prop, proxy), writable: false };\n }\n if (methods && prop in methods) {\n return { enumerable: false, configurable: true, value: handler.get!(target, prop, proxy), writable: false };\n }\n }\n return undefined;\n },\n };\n\n proxy = new Proxy<Record<string, unknown>>({} as Record<string, unknown>, handler);\n\n PROXY_ID.set(proxy, key);\n setScopeOwner(proxy, queryClient);\n\n return proxy;\n}\n","import { EntityDef } from './types.js';\nimport type { QueryClient } from './QueryClient.js';\nimport { EntityInstance } from './EntityInstance.js';\nimport { ValidatorDef } from './typeDefs.js';\n\nexport class EntityStore {\n private instances = new Map<number, EntityInstance>();\n private persistEntity: (key: number, data: Record<string, unknown>, refKeys?: Set<number>) => void;\n\n constructor(persistEntity: (key: number, data: Record<string, unknown>, refKeys?: Set<number>) => void) {\n this.persistEntity = persistEntity;\n }\n\n hasEntity(key: number): boolean {\n return this.instances.has(key);\n }\n\n getEntity(key: number): EntityInstance | undefined {\n return this.instances.get(key);\n }\n\n getOrCreateEntity(\n key: number,\n data: Record<string, unknown>,\n shape: EntityDef,\n queryClient: QueryClient,\n ): EntityInstance {\n let instance = this.instances.get(key);\n\n if (instance === undefined) {\n const idField = shape.idField;\n if (idField === undefined) {\n throw new Error(`Entity id field is required ${shape.typenameValue}`);\n }\n\n const id = (data as Record<string | symbol, unknown>)[idField];\n if (typeof id !== 'string' && typeof id !== 'number') {\n throw new Error(`Entity id must be string or number: ${shape.typenameValue}`);\n }\n\n const validatorDef = shape as unknown as ValidatorDef<unknown>;\n\n instance = new EntityInstance(key, shape.typenameValue!, id, idField, data, queryClient);\n instance._entityCache = validatorDef._entityCache;\n this.instances.set(key, instance);\n }\n\n instance.parseId = queryClient.currentParseId;\n\n return instance;\n }\n\n remove(key: number): void {\n this.instances.delete(key);\n }\n\n save(instance: EntityInstance): void {\n let refKeys: Set<number> | undefined;\n if (instance.entityRefs) {\n refKeys = new Set<number>();\n for (const e of instance.entityRefs.keys()) refKeys.add(e.key);\n }\n this.persistEntity(instance.key, instance.data, refKeys);\n }\n}\n","/**\n * NetworkManager - Tracks network connectivity status\n *\n * Features:\n * - Signal-based reactivity for online/offline status\n * - Automatic detection using navigator.onLine and events\n * - Manual override capability for testing and custom scenarios\n * - Platform-agnostic (works in browser and React Native)\n */\n\nimport { signal, Signal, context, Context } from 'signalium';\n\nexport class NetworkManager {\n private onlineSignal: Signal<boolean>;\n private manualOverride: boolean | undefined = undefined;\n private eventListenersAttached = false;\n\n constructor(initialStatus?: boolean) {\n // Initialize with manual status if provided, otherwise detect from environment\n const initialOnlineStatus = initialStatus ?? this.detectOnlineStatus();\n this.onlineSignal = signal(initialOnlineStatus);\n\n // Automatically attach event listeners if in browser/React Native environment\n if (this.canAttachListeners()) {\n this.attachEventListeners();\n }\n }\n\n /**\n * Returns true if the network is currently online\n */\n get isOnline(): boolean {\n // Manual override takes precedence\n if (this.manualOverride !== undefined) {\n return this.manualOverride;\n }\n\n return this.onlineSignal.value;\n }\n\n /**\n * Manually set the network status (useful for testing)\n */\n setNetworkStatus(online: boolean): void {\n this.manualOverride = online;\n this.onlineSignal.value = online;\n }\n\n /**\n * Clear manual override and return to automatic detection\n */\n clearManualOverride(): void {\n this.manualOverride = undefined;\n this.onlineSignal.value = this.detectOnlineStatus();\n }\n\n /**\n * Get the reactive signal for online status\n * This allows reactive functions to depend on network status\n */\n getOnlineSignal(): Signal<boolean> {\n return this.onlineSignal;\n }\n\n /**\n * Detect current online status from the environment\n */\n private detectOnlineStatus(): boolean {\n // Check if we're in a browser or React Native environment\n if (typeof navigator !== 'undefined' && 'onLine' in navigator) {\n return navigator.onLine;\n }\n\n // Default to online if we can't detect (e.g., Node.js/SSR)\n return true;\n }\n\n /**\n * Check if we can attach event listeners (browser or React Native)\n */\n private canAttachListeners(): boolean {\n return typeof window !== 'undefined' && typeof window.addEventListener === 'function';\n }\n\n /**\n * Remove event listeners and clean up resources.\n */\n destroy(): void {\n if (this.eventListenersAttached && this.handleOnline && this.handleOffline) {\n window.removeEventListener('online', this.handleOnline);\n window.removeEventListener('offline', this.handleOffline);\n this.eventListenersAttached = false;\n }\n }\n\n private handleOnline: (() => void) | undefined = undefined;\n private handleOffline: (() => void) | undefined = undefined;\n\n /**\n * Attach event listeners for online/offline events\n */\n private attachEventListeners(): void {\n if (this.eventListenersAttached) {\n return;\n }\n\n this.handleOnline = () => {\n if (this.manualOverride === undefined) {\n this.onlineSignal.value = true;\n }\n };\n\n this.handleOffline = () => {\n if (this.manualOverride === undefined) {\n this.onlineSignal.value = false;\n }\n };\n\n window.addEventListener('online', this.handleOnline);\n window.addEventListener('offline', this.handleOffline);\n\n this.eventListenersAttached = true;\n }\n}\n\n// No-op implementation for SSR environments where network status tracking is not needed\nexport class NoOpNetworkManager {\n private static readonly onlineSignal: Signal<boolean> = signal(true);\n\n get isOnline(): boolean {\n return true;\n }\n\n setNetworkStatus(_online: boolean): void {\n // No-op: do nothing\n }\n\n clearManualOverride(): void {\n // No-op: do nothing\n }\n\n getOnlineSignal(): Signal<boolean> {\n return NoOpNetworkManager.onlineSignal;\n }\n\n destroy(): void {\n // No-op: do nothing\n }\n}\n\n// Default singleton instance for convenience\nexport const defaultNetworkManager = new NetworkManager();\n\n// Context for dependency injection\nexport const NetworkManagerContext: Context<NetworkManager> = context<NetworkManager>(defaultNetworkManager);\n","import { getContext } from 'signalium';\nimport { ExtractType, TypeDef, TypeDefShape, RetryConfig, QueryPromise, Mask, QUERY_ID } from './types.js';\nimport {\n QueryCacheOptions,\n QueryConfigOptions,\n FetchNextConfig,\n QueryClientContext,\n QueryParams,\n queryKeyFor,\n} from './QueryClient.js';\nimport { ValidatorDef, t } from './typeDefs.js';\nimport { HasRequiredKeys, Optionalize, Signalize } from './type-utils.js';\nimport {\n createDefinitionProxy,\n extractDefinition,\n createExecutionContext as createExecutionContextUtil,\n type CapturedDefinition,\n} from './fieldRef.js';\nimport type { QueryController } from './QueryController.js';\n\n// ================================\n// Retry config\n// ================================\n\nexport interface ResolvedRetryConfig {\n retries: number;\n retryDelay: (attempt: number) => number;\n}\n\nexport function resolveRetryConfig(\n retryOption: RetryConfig | number | boolean | undefined,\n isServer: boolean = typeof window === 'undefined',\n): ResolvedRetryConfig {\n let retries: number;\n\n if (retryOption === false) {\n retries = 0;\n } else if (retryOption === undefined || retryOption === true) {\n retries = isServer ? 0 : 3;\n } else if (typeof retryOption === 'number') {\n retries = retryOption;\n } else {\n retries = retryOption.retries;\n }\n\n const retryDelay =\n typeof retryOption === 'object' && retryOption.retryDelay\n ? retryOption.retryDelay\n : (attempt: number) => 1000 * Math.pow(2, attempt);\n\n return { retries, retryDelay };\n}\n\n// ================================\n// Query base class\n// ================================\n\nexport abstract class Query {\n static cache?: QueryCacheOptions;\n /**\n * The controller class responsible for sending requests for this query type.\n * Must be set on each concrete Query subclass (or inherited from a base like RESTQuery).\n */\n static controller?: typeof QueryController;\n\n params?: Record<string, TypeDef>;\n abstract result: TypeDefShape;\n config?: QueryConfigOptions;\n\n declare context: import('./query-types.js').QueryContext;\n declare refetch: () => void;\n declare resultData: Record<string, unknown>;\n declare rawFetchNext: FetchNextConfig | undefined;\n\n abstract getIdentityKey(): unknown;\n\n getConfig?(): QueryConfigOptions | undefined;\n\n constructor() {\n return createDefinitionProxy(this);\n }\n}\n\n// ================================\n// Query definition\n// ================================\n\nconst queryDefCache = new WeakMap<new () => Query, QueryDefinition<any, any, any>>();\n\nexport interface ResolvedQueryOptions {\n config: QueryConfigOptions | undefined;\n retryConfig: ResolvedRetryConfig;\n}\n\nexport interface QueryDefinitionStatics {\n readonly id: string;\n /** Root entity shape. For non-entity results this is a synthetic EntityDef\n * with QUERY_ID as idField. For entity results this is the entity's own\n * ValidatorDef. */\n readonly shape: ValidatorDef<unknown>;\n readonly cache: QueryCacheOptions | undefined;\n /** Raw fetchNext config with unresolved FieldRefs, extracted before reification. */\n readonly rawFetchNext: FetchNextConfig | undefined;\n /** Whether the controller implements sendNext(). */\n readonly hasSendNext: boolean;\n /** Whether the result shape is already an entity (vs synthetic wrapper). */\n readonly isEntityResult: boolean;\n /** The controller class responsible for sending requests. */\n readonly controllerClass: typeof QueryController;\n}\n\nexport class QueryDefinition<Params extends QueryParams | undefined, Result, StreamType> {\n readonly statics: QueryDefinitionStatics;\n\n constructor(\n statics: QueryDefinitionStatics,\n public readonly captured: CapturedDefinition<Query>,\n ) {\n this.statics = statics;\n }\n\n createExecutionContext(\n actualParams: Record<string, unknown>,\n queryContext: import('./query-types.js').QueryContext,\n ): Query {\n return createExecutionContextUtil(this.captured, actualParams, queryContext);\n }\n\n resolveOptions(ctx: Query): ResolvedQueryOptions {\n const { methods } = this.captured;\n\n const config = methods.getConfig ? methods.getConfig.call(ctx) : ctx.config;\n const retryConfig = resolveRetryConfig(config?.retry);\n\n return { config, retryConfig };\n }\n\n static for(QueryClass: new () => Query): QueryDefinition<any, any, any> {\n let queryDefinition = queryDefCache.get(QueryClass);\n\n if (queryDefinition !== undefined) {\n return queryDefinition;\n }\n\n const instance = new QueryClass();\n const captured = extractDefinition(instance);\n\n const id = String(captured.methods.getIdentityKey.call(captured.fields));\n const resultDef = captured.fields.result;\n const shape =\n resultDef instanceof ValidatorDef\n ? (resultDef as ValidatorDef<unknown>)\n : (t.object(resultDef) as unknown as ValidatorDef<unknown>);\n const isEntityResult = (shape.mask & Mask.ENTITY) !== 0;\n const cache = (QueryClass as typeof Query).cache;\n\n // Extract raw fetchNext config before reification so FieldRefs survive\n const rawFetchNext = (captured.fields as unknown as Record<string, unknown>).fetchNext as\n | FetchNextConfig\n | undefined;\n\n // Resolve the controller class from the Query class static property\n const controllerClass = (QueryClass as typeof Query).controller;\n if (!controllerClass) {\n throw new Error(\n `Query class \"${QueryClass.name}\" must define a static \\`controller\\` property. ` +\n `Extend RESTQuery (from fetchium/rest) or set \\`static controller = MyController\\` on your query class.`,\n );\n }\n\n // Derive hasSendNext from the controller prototype\n const hasSendNext = typeof controllerClass.prototype.sendNext === 'function';\n\n // For entity results, the root entity IS the result entity.\n // For non-entity results, create a synthetic EntityDef with QUERY_ID as idField.\n const rootEntityShape = isEntityResult\n ? shape\n : new ValidatorDef(\n Mask.ENTITY | Mask.OBJECT,\n shape.shape,\n undefined,\n undefined,\n id, // typenameValue — unique per query class\n QUERY_ID, // idField — symbol, injected onto payload before parse\n );\n\n queryDefinition = new QueryDefinition(\n { id, shape: rootEntityShape, cache, rawFetchNext, hasSendNext, isEntityResult, controllerClass },\n captured,\n );\n\n queryDefCache.set(QueryClass, queryDefinition);\n return queryDefinition;\n }\n}\n\n// ================================\n// Type extraction from Query classes\n// ================================\n\nexport type ExtractQueryParams<T extends Query> =\n T['params'] extends Record<string, TypeDef>\n ? { [K in keyof T['params']]: ExtractType<T['params'][K]> }\n : // eslint-disable-next-line @typescript-eslint/no-empty-object-type\n {};\n\n// ================================\n// Query definition lookup\n// ================================\n\nexport const queryKeyForClass = (cls: new () => Query, params: unknown): number => {\n const queryDef = QueryDefinition.for(cls);\n return queryKeyFor(queryDef, params);\n};\n\nexport function getQueryDefinition(QueryClass: new () => Query): QueryDefinition<any, any, any> {\n return QueryDefinition.for(QueryClass);\n}\n\n// ================================\n// Public API\n// ================================\n\nexport function fetchQuery<T extends Query>(\n QueryClass: new () => T,\n ...args: HasRequiredKeys<ExtractType<T['params']>> extends true\n ? [params: Optionalize<Signalize<ExtractType<T['params']>>>]\n : [params?: Optionalize<Signalize<ExtractType<T['params']>>> | undefined]\n): QueryPromise<T> {\n const queryDef = QueryDefinition.for(QueryClass);\n\n const queryClient = getContext(QueryClientContext);\n\n if (queryClient === undefined) {\n throw new Error('QueryClient not found');\n }\n\n const params = args[0] as QueryParams | undefined;\n\n return queryClient.getQuery(queryDef, params);\n}\n","import type { ResolvedRetryConfig } from './query.js';\n\nexport function sleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal?.aborted) {\n reject(signal.reason);\n return;\n }\n const timer = setTimeout(resolve, ms);\n signal?.addEventListener(\n 'abort',\n () => {\n clearTimeout(timer);\n reject(signal.reason);\n },\n { once: true },\n );\n });\n}\n\nexport async function withRetry<T>(\n fn: () => Promise<T>,\n config: ResolvedRetryConfig,\n signal?: AbortSignal,\n): Promise<T> {\n if (IS_DEV && config.retries < 0) {\n throw new Error('retries must be non-negative');\n }\n const retries = Math.max(0, config.retries);\n let lastError: unknown;\n for (let attempt = 0; attempt <= retries; attempt++) {\n signal?.throwIfAborted();\n try {\n return await fn();\n } catch (error) {\n lastError = error;\n if (attempt >= retries) throw error;\n await sleep(config.retryDelay(attempt), signal);\n }\n }\n throw lastError;\n}\n","import { relay, type RelayState, DiscriminatedReactivePromise } from 'signalium';\nimport { NetworkMode, type QueryResult, type EntityDef } from './types.js';\nimport {\n type QueryClient,\n type QueryParams,\n type QueryConfigOptions,\n extractParamsForKey,\n queryKeyFor,\n CachedQuery,\n} from './QueryClient.js';\nimport { DEFAULT_GC_TIME } from './stores/shared.js';\nimport { GcKeyType } from './GcManager.js';\nimport { Query, QueryDefinition, type ResolvedRetryConfig, resolveRetryConfig } from './query.js';\nimport { EntityInstance } from './EntityInstance.js';\nimport { hashValue } from 'signalium/utils';\nimport { sleep, withRetry } from './retry.js';\n\n/**\n * Thin fetch/relay orchestrator. Data management (proxy, notifier, child refs,\n * live data) is fully delegated to a root EntityInstance.\n */\nexport class QueryInstance<T extends Query> {\n def: QueryDefinition<any, any, any>;\n queryKey: number;\n storageKey: number = -1;\n\n /** The public-facing ReactivePromise returned to consumers. */\n readonly relay: DiscriminatedReactivePromise<QueryResult<T>>;\n\n private queryClient: QueryClient;\n private initialized: boolean = false;\n private updatedAt: number | undefined = undefined;\n private params: QueryParams | undefined = undefined;\n\n private unsubscribe?: () => void = undefined;\n\n private _relayState: RelayState<QueryResult<T>> | undefined = undefined;\n private wasPaused: boolean = false;\n private currentParams: QueryParams | undefined = undefined;\n private debounceTimer: ReturnType<typeof setTimeout> | undefined = undefined;\n\n /** Resolved per-instance options (depend on actual params). */\n config: QueryConfigOptions | undefined = undefined;\n retryConfig: ResolvedRetryConfig = resolveRetryConfig(undefined);\n\n /** Controller for aborting in-flight fetches and retry waits. */\n private _abortController: AbortController | undefined = undefined;\n\n /** Cached execution context, recreated only when storageKey (params) changes. */\n private _executionCtx: Query | undefined = undefined;\n private _executionCtxKey: number = -1;\n\n /** Root entity that holds parsed data, proxy, child refs, and bindings.\n * For entity results, this is undefined until the first apply discovers it. */\n rootEntity: EntityInstance | undefined;\n\n /** Extra methods (__refetch, __fetchNext) attached to the root entity proxy. */\n private _extraMethods: Record<string, (...args: unknown[]) => unknown> = {};\n\n /** Query id injected as QUERY_ID on non-entity payloads. */\n private _queryId: number = 0;\n\n get key(): number {\n return this.queryKey;\n }\n\n private get relayState(): RelayState<QueryResult<T>> {\n if (IS_DEV && !this._relayState) {\n throw new Error('Relay state not initialized');\n }\n return this._relayState!;\n }\n\n constructor(\n def: QueryDefinition<any, any, any>,\n queryClient: QueryClient,\n queryKey: number,\n params: QueryParams | undefined,\n ) {\n this.def = def;\n this.queryClient = queryClient;\n this.queryKey = queryKey;\n this.params = params;\n\n this._extraMethods = { __refetch: this.refetch };\n if (def.statics.hasSendNext) {\n this._extraMethods.__fetchNext = this.fetchNext;\n }\n\n // Compute the query id used for QUERY_ID injection on non-entity results.\n const extractedParams = extractParamsForKey(params);\n this._queryId = extractedParams !== undefined ? hashValue(extractedParams) : 0;\n\n // Create the relay whose value is the root entity's proxy (stable identity)\n this.relay = relay<QueryResult<T>>(\n state => {\n this._relayState = state;\n\n const deactivate = () => {\n clearTimeout(this.debounceTimer);\n this.debounceTimer = undefined;\n\n this._abortController?.abort();\n this._abortController = undefined;\n\n this._fetchNextAbort?.abort();\n this._fetchNextAbort = undefined;\n this._fetchNextPromise = undefined;\n\n this.unsubscribe?.();\n this.unsubscribe = undefined;\n\n const gcTime = this.config?.gcTime ?? DEFAULT_GC_TIME;\n this.queryClient.gcManager.schedule(this.queryKey, gcTime, GcKeyType.Query);\n };\n\n const update = (activating: boolean = false) => {\n const { wasPaused, isPaused, initialized } = this;\n this.wasPaused = isPaused;\n\n if (isPaused && !wasPaused && initialized) {\n deactivate();\n return;\n }\n\n const newExtractedParams = extractParamsForKey(this.params);\n const newStorageKey = queryKeyFor(this.def, newExtractedParams);\n\n const paramsDidChange = newStorageKey !== this.storageKey;\n\n if (paramsDidChange) {\n this.currentParams = newExtractedParams as QueryParams;\n this.storageKey = newStorageKey;\n }\n\n this.getOrCreateExecutionContext();\n\n if (!this.initialized) {\n this.queryClient.activateQuery(this);\n this.initialize();\n } else if (wasPaused || activating) {\n this.queryClient.activateQuery(this);\n\n if (activating && this.updatedAt !== undefined) {\n this.setupSubscription();\n }\n\n const refreshStaleOnReconnect = this.config?.refreshStaleOnReconnect ?? true;\n if (refreshStaleOnReconnect && this.isStale) {\n this.runDebounced();\n }\n } else if (paramsDidChange) {\n this.setupSubscription();\n this.runDebounced();\n }\n };\n\n update(true);\n\n return {\n update,\n deactivate,\n };\n },\n { desc: `Query(${def.statics.id})` },\n );\n }\n\n /** Apply raw data (fresh or cached) to the root entity and return the proxy. */\n private applyData(\n data: unknown,\n persist: boolean,\n appendMode: boolean = false,\n preloadedEntities?: import('./query-types.js').PreloadedEntityMap,\n ): QueryResult<T> {\n const def = this.def;\n this.rootEntity = this.queryClient.parseAndApplyRootEntity(\n data,\n this._queryId,\n def.statics.shape,\n persist,\n appendMode,\n preloadedEntities,\n );\n\n // Attach extra methods and getters on first discovery\n if (this.rootEntity._extraMethods === undefined) {\n this.rootEntity._extraMethods = this._extraMethods;\n this.rootEntity._extraGetters = {\n __hasNext: () => this.hasNext,\n __isFetchingNext: () => this._fetchNextPromise !== undefined,\n };\n }\n\n return this.rootEntity.getProxy(def.statics.shape as unknown as EntityDef) as QueryResult<T>;\n }\n\n /** Save query metadata (the __entityRef pointer, updatedAt, ref set). */\n private saveQueryMetadata(): void {\n if (this.rootEntity === undefined || this.updatedAt === undefined) return;\n const refs = new Map(this.rootEntity.entityRefs ?? []);\n refs.set(this.rootEntity, 1);\n this.queryClient.saveQueryData(\n this.def,\n this.storageKey,\n { __entityRef: this.rootEntity.key },\n this.updatedAt,\n refs,\n );\n }\n\n private async initialize(): Promise<void> {\n const qc = this.queryClient;\n const state = this.relayState;\n\n this.initialized = true;\n\n let cached: CachedQuery | undefined;\n\n try {\n cached = await qc.loadCachedQuery(this.def, this.storageKey);\n\n if (cached !== undefined) {\n this.updatedAt = cached.updatedAt;\n state.value = this.applyData(cached.value, false, false, cached.preloadedEntities);\n }\n } catch (error) {\n qc.store.deleteQuery(this.storageKey);\n qc.getContext().log?.warn?.('Failed to initialize query, the query cache may be corrupted or invalid', error);\n }\n\n if (this.isPaused) {\n return;\n }\n\n try {\n if (cached !== undefined) {\n this.setupSubscription();\n }\n\n if (cached === undefined || this.isStale) {\n await sleep(0);\n if (this.isPaused) return;\n this.runQueryImmediately();\n }\n } catch (error) {\n state.setError(error as Error);\n }\n }\n\n private setupSubscription(): void {\n this.unsubscribe?.();\n this.unsubscribe = undefined;\n\n const subscribeFn = this.config?.subscribe;\n if (!subscribeFn) return;\n\n const ctx = this._executionCtx;\n this.unsubscribe = subscribeFn.call(ctx, (event: import('./types.js').MutationEvent) => {\n event.__eventSource = this.queryKey;\n this.queryClient.applyMutationEvent(event);\n });\n }\n\n private getOrCreateExecutionContext(): Query {\n if (this._executionCtx === undefined || this._executionCtxKey !== this.storageKey) {\n this._executionCtxKey = this.storageKey;\n this._executionCtx = this.def.createExecutionContext(\n (this.currentParams ?? {}) as Record<string, unknown>,\n this.queryClient.getContext(),\n );\n this._executionCtx.refetch = () => this.refetch();\n this._executionCtx.rawFetchNext = this.def.statics.rawFetchNext;\n }\n\n this.resolveAndApplyOptions();\n\n return this._executionCtx;\n }\n\n private resolveAndApplyOptions(): void {\n const resolved = this.def.resolveOptions(this._executionCtx!);\n this.config = resolved.config;\n this.retryConfig = resolved.retryConfig;\n }\n\n private async runQuery(): Promise<QueryResult<T>> {\n const def = this.def;\n\n if (this.isPaused) {\n throw new Error('Query is paused due to network status');\n }\n\n const ctx = this.getOrCreateExecutionContext();\n const controller = this.queryClient.getController(def.statics.controllerClass);\n const signal = this._abortController?.signal ?? new AbortController().signal;\n\n return withRetry(\n async () => {\n const freshData = await controller.send(ctx, signal);\n this.updatedAt = Date.now();\n\n const result = this.applyData(freshData, true);\n this.saveQueryMetadata();\n\n if (this.unsubscribe === undefined) {\n this.setupSubscription();\n }\n\n return result;\n },\n this.retryConfig,\n signal,\n );\n }\n\n private runQueryImmediately(): void {\n this._abortController?.abort();\n this._abortController = new AbortController();\n this._fetchNextAbort?.abort();\n this._fetchNextAbort = undefined;\n this._fetchNextPromise = undefined;\n this.relayState.setPromise(this.runQuery());\n }\n\n private runDebounced(): void {\n if (this.relayState.isPending) return;\n\n const debounce = this.config?.debounce ?? 0;\n\n clearTimeout(this.debounceTimer);\n\n this.debounceTimer = setTimeout(() => {\n this.debounceTimer = undefined;\n this.runQueryImmediately();\n }, debounce);\n }\n\n // ======================================================\n // Public methods\n // ======================================================\n\n refetch = (): DiscriminatedReactivePromise<QueryResult<T>> => {\n if (this.relayState.isPending) return this.relay;\n this.runQueryImmediately();\n return this.relay;\n };\n\n markStale(): void {\n this.updatedAt = 0;\n }\n\n get resolvedParams(): QueryParams | undefined {\n return this.currentParams;\n }\n\n /** In-flight fetchNext promise for deduplication. */\n private _fetchNextPromise: Promise<QueryResult<T>> | undefined = undefined;\n\n /** Controller for aborting in-flight fetchNext requests. */\n private _fetchNextAbort: AbortController | undefined = undefined;\n\n fetchNext = (): Promise<QueryResult<T>> => {\n if (this.updatedAt === undefined) {\n throw new Error('Cannot call __fetchNext before initial data has loaded');\n }\n if (this._fetchNextPromise !== undefined) {\n return this._fetchNextPromise;\n }\n // Schedule notification so __isFetchingNext becomes true reactively.\n // Must be async to avoid \"dirtied after consumed\" when called from\n // within a reactive context (the proxy consumes the notifier on access).\n queueMicrotask(() => this.rootEntity?.notify());\n this._fetchNextPromise = this.runFetchNext().then(\n result => {\n this._fetchNextPromise = undefined;\n // Notify so __isFetchingNext transitions to false.\n // applyData already notified for the data change; this second\n // notify is needed because _fetchNextPromise was still set at\n // that point and is only cleared here.\n this.rootEntity?.notify();\n return result;\n },\n error => {\n this._fetchNextPromise = undefined;\n this.rootEntity?.notify();\n throw error;\n },\n );\n return this._fetchNextPromise;\n };\n\n private get hasNext(): boolean {\n if (this.rootEntity === undefined || !this._executionCtx) return false;\n const controller = this.queryClient.getController(this.def.statics.controllerClass);\n if (!controller.hasNext) return false;\n this._executionCtx.resultData = this.rootEntity.data;\n return controller.hasNext(this._executionCtx);\n }\n\n private async runFetchNext(): Promise<QueryResult<T>> {\n const def = this.def;\n this._fetchNextAbort = new AbortController();\n const signal = this._fetchNextAbort.signal;\n const ctx = this.getOrCreateExecutionContext();\n ctx.resultData = this.rootEntity!.data;\n const controller = this.queryClient.getController(def.statics.controllerClass);\n\n return withRetry(\n async () => {\n const freshData = await controller.sendNext!(ctx, signal);\n this.updatedAt = Date.now();\n\n const result = this.applyData(freshData, true, true);\n this.saveQueryMetadata();\n\n return result;\n },\n this.retryConfig,\n signal,\n );\n }\n\n // ======================================================\n // Internal computed properties\n // ======================================================\n\n private get isStale(): boolean {\n if (this.updatedAt === undefined) {\n return true;\n }\n\n const staleTime = this.config?.staleTime ?? 0;\n return Date.now() - this.updatedAt >= staleTime;\n }\n\n private get isPaused(): boolean {\n const networkMode = this.config?.networkMode ?? NetworkMode.Online;\n\n if (networkMode === NetworkMode.Always) {\n return false;\n }\n\n const isOnline = this.queryClient.networkManager.getOnlineSignal().value;\n\n switch (networkMode) {\n case NetworkMode.Online:\n return !isOnline;\n case NetworkMode.OfflineFirst:\n return !isOnline && this.updatedAt === undefined;\n default:\n return false;\n }\n }\n}\n","import { task, type ReactiveTask } from 'signalium';\nimport { ComplexTypeDef, MutationEffects, EntityClassOrTypename } from './types.js';\nimport { ValidatorDef, getEntityDef } from './typeDefs.js';\nimport { type QueryClient } from './QueryClient.js';\nimport { MutationDefinition } from './mutation.js';\nimport { resolveRetryConfig } from './query.js';\nimport { parseEntities, ParseContext } from './parseEntities.js';\nimport { createExecutionContext, reifyValue } from './fieldRef.js';\nimport { Entity } from './proxy.js';\nimport { withRetry } from './retry.js';\n\n/**\n * Internal mutation manager. Consumers interact with the public `task` property,\n * which is a standard ReactiveTask whose resolved value is the validated response.\n *\n * Mutations use Phase 1 only (parseData) for response validation. Entity store\n * updates are handled exclusively through effects (creates/updates/deletes).\n */\nexport class MutationResultImpl<Request, Result> {\n def: MutationDefinition<Request, Result>;\n private queryClient: QueryClient;\n private _inFlight: boolean = false;\n\n readonly task: ReactiveTask<Result, [Request]>;\n\n constructor(def: MutationDefinition<Request, Result>, queryClient: QueryClient) {\n this.def = def;\n this.queryClient = queryClient;\n this.task = this.createTask();\n }\n\n private createTask(): ReactiveTask<Result, [Request]> {\n return task(\n async (request: Request): Promise<Result> => {\n if (this._inFlight) {\n throw new Error('A mutation is already in progress. Await the previous call before starting a new one.');\n }\n this._inFlight = true;\n try {\n const response = await this.executeWithRetry(request);\n\n const parsedResponse = this.validateResponse(response);\n\n this.processEffects(request, parsedResponse);\n\n return parsedResponse;\n } finally {\n this._inFlight = false;\n }\n },\n { desc: `Mutation(${this.def.id})` },\n );\n }\n\n private validateResponse(response: unknown): Result {\n const responseShape = this.def.responseShape;\n\n if (!(responseShape instanceof ValidatorDef)) {\n return response as Result;\n }\n\n const warn = this.queryClient.getContext().log?.warn ?? (() => {});\n const ctx = new ParseContext();\n ctx.reset(undefined, undefined, warn);\n return parseEntities(response, responseShape as ComplexTypeDef, ctx) as Result;\n }\n\n // ======================================================\n // Effects processing\n // ======================================================\n\n private processEffects(request: Request, parsedResult: Result): void {\n let effects: MutationEffects | undefined;\n\n if (this.def.hasGetEffects) {\n const ctx = createExecutionContext(\n this.def.captured,\n (request ?? {}) as Record<string, unknown>,\n this.queryClient.getContext(),\n );\n (ctx as any).result = parsedResult;\n effects = (ctx as any).getEffects();\n } else if (this.def.effects !== undefined) {\n const root = { params: request as Record<string, unknown>, result: parsedResult as Record<string, unknown> };\n effects = reifyValue(this.def.effects, root as Record<string, unknown>) as MutationEffects;\n }\n\n if (effects === undefined) return;\n\n const qc = this.queryClient;\n applyEffects(effects.creates, 'create', qc);\n applyEffects(effects.updates, 'update', qc);\n applyEffects(effects.deletes, 'delete', qc);\n\n if (effects.invalidates) {\n qc.invalidateQueries(effects.invalidates);\n }\n }\n\n // ======================================================\n // Retry logic\n // ======================================================\n\n private executeWithRetry(request: Request): Promise<Result> {\n const retryConfig = resolveRetryConfig(this.def.config?.retry, true);\n const controller = this.queryClient.getController(this.def.controllerClass);\n\n if (!controller.sendMutation) {\n throw new Error(\n `Controller \"${this.def.controllerClass.name}\" does not implement sendMutation(). ` +\n `Add a sendMutation() method to handle mutations.`,\n );\n }\n\n return withRetry(async () => {\n const abortController = new AbortController();\n const ctx = createExecutionContext(\n this.def.captured,\n (request ?? {}) as Record<string, unknown>,\n this.queryClient.getContext(),\n );\n\n return (await controller.sendMutation!(ctx, abortController.signal)) as Result;\n }, retryConfig);\n }\n}\n\nfunction resolveTypename(entityRef: EntityClassOrTypename): string | undefined {\n if (typeof entityRef === 'string') return entityRef;\n const def = getEntityDef(entityRef as new () => Entity);\n return def.typenameValue;\n}\n\nfunction applyEffects(\n entries: ReadonlyArray<readonly [EntityClassOrTypename, unknown]> | undefined,\n type: 'create' | 'update' | 'delete',\n qc: QueryClient,\n): void {\n if (!entries) return;\n for (const [entityRef, data] of entries) {\n const typename = resolveTypename(entityRef);\n if (typename !== undefined) {\n qc.applyMutationEvent({ type, typename, data: data as Record<string, unknown> });\n }\n }\n}\n","import { hashValue } from 'signalium/utils';\nimport { isFieldRef, getFieldRefPath, resolveFieldRefPath } from './fieldRef.js';\nimport type { LiveCollectionBinding } from './LiveCollection.js';\n\n// ======================================================\n// Constants\n// ======================================================\n\nexport const EVENT_SOURCE_FIELD = '__eventSource';\n\n// ======================================================\n// Constraint Hash Computation\n// ======================================================\n\n/**\n * Pre-computed field path: original field name + split segments (for dotted paths).\n */\nexport interface FieldPath {\n field: string;\n segments: string[] | undefined;\n}\n\nexport function buildFieldPath(field: string): FieldPath {\n return { field, segments: field.indexOf('.') !== -1 ? field.split('.') : undefined };\n}\n\nexport function buildFieldPaths(fields: string[]): FieldPath[] {\n return fields.map(buildFieldPath);\n}\n\nfunction resolveFieldPath(data: Record<string, unknown>, fp: FieldPath): unknown {\n if (fp.segments === undefined) return data[fp.field];\n let current: unknown = data;\n for (const segment of fp.segments) {\n if (current === undefined || current === null) return undefined;\n current = (current as Record<string, unknown>)[segment];\n }\n return current;\n}\n\n/**\n * Compute a constraint hash from an entity's data given pre-computed field paths.\n * Returns undefined if any constraint field is missing from the entity data.\n */\nexport function computeConstraintHash(\n entityData: Record<string, unknown>,\n fieldPaths: FieldPath[],\n): number | undefined {\n const values: unknown[] = [];\n for (let i = 0; i < fieldPaths.length; i++) {\n const fp = fieldPaths[i];\n const val = resolveFieldPath(entityData, fp);\n if (val === undefined) return undefined;\n values.push(fp.field, val);\n }\n return hashValue(values);\n}\n\n/**\n * Resolve constraint FieldRefs against a data object to produce concrete constraint\n * hashes. Used when creating a LiveArrayInstance/LiveValueInstance to compute the\n * hash under which it should be registered.\n */\nexport function resolveConstraintHashes(\n constraintFieldRefs: Map<string, Array<[string, unknown]>> | undefined,\n parentData: Record<string, unknown>,\n): Map<string, number> | undefined {\n if (constraintFieldRefs === undefined) return undefined;\n\n const result = new Map<string, number>();\n\n for (const [typename, pairs] of constraintFieldRefs) {\n const sorted = pairs.slice().sort((a, b) => (a[0] < b[0] ? -1 : a[0] > b[0] ? 1 : 0));\n const resolved: unknown[] = [];\n let valid = true;\n\n for (const [field, ref] of sorted) {\n let value: unknown;\n if (isFieldRef(ref)) {\n const path = getFieldRefPath(ref);\n value = resolveFieldRefPath(path, parentData);\n } else {\n value = ref;\n }\n if (value === undefined) {\n valid = false;\n break;\n }\n resolved.push(field, value);\n }\n\n if (valid) {\n result.set(typename, hashValue(resolved));\n }\n }\n\n return result.size > 0 ? result : undefined;\n}\n\nfunction getFieldNames(fieldRefs: Map<string, Array<[string, unknown]>>, typename: string): string[] | undefined {\n const pairs = fieldRefs.get(typename);\n if (pairs === undefined) return undefined;\n return pairs.map(([field]) => field).sort();\n}\n\n// ======================================================\n// ConstraintGroup — collections sharing the same field set\n// ======================================================\n\nexport class ConstraintGroup {\n fields: string[];\n fieldPaths: FieldPath[];\n private _bindings: Map<number, Set<LiveCollectionBinding>> = new Map();\n\n constructor(fields: string[]) {\n this.fields = fields;\n this.fieldPaths = fields.map(buildFieldPath);\n }\n\n register(constraintHash: number, binding: LiveCollectionBinding): void {\n let set = this._bindings.get(constraintHash);\n if (set === undefined) {\n set = new Set();\n this._bindings.set(constraintHash, set);\n }\n set.add(binding);\n }\n\n unregister(constraintHash: number, binding: LiveCollectionBinding): void {\n const set = this._bindings.get(constraintHash);\n if (set !== undefined) {\n set.delete(binding);\n if (set.size === 0) {\n this._bindings.delete(constraintHash);\n }\n }\n }\n\n getMatching(constraintHash: number): Set<LiveCollectionBinding> | undefined {\n return this._bindings.get(constraintHash);\n }\n\n get isEmpty(): boolean {\n return this._bindings.size === 0;\n }\n}\n\n// ======================================================\n// ConstraintMatcher (per-typename)\n// ======================================================\n\nfunction fieldSetKey(fields: string[]): number {\n return hashValue(fields); // fields are already sorted by getFieldNames\n}\n\nexport class ConstraintMatcher {\n private _groups: Map<number, ConstraintGroup> = new Map();\n\n private getOrCreateGroup(fields: string[]): ConstraintGroup {\n const key = fieldSetKey(fields);\n let group = this._groups.get(key);\n if (group === undefined) {\n group = new ConstraintGroup(fields);\n this._groups.set(key, group);\n }\n return group;\n }\n\n register(constraintHash: number, fields: string[], binding: LiveCollectionBinding): void {\n this.getOrCreateGroup(fields).register(constraintHash, binding);\n }\n\n unregister(constraintHash: number, fields: string[], binding: LiveCollectionBinding): void {\n const key = fieldSetKey(fields);\n const group = this._groups.get(key);\n if (group !== undefined) {\n group.unregister(constraintHash, binding);\n if (group.isEmpty) {\n this._groups.delete(key);\n }\n }\n }\n\n registerBinding(binding: LiveCollectionBinding, typename: string): void {\n const hash = binding._constraintHashes.get(typename);\n if (hash === undefined) return;\n\n const fields = getFieldNames(binding._constraintFieldRefs, typename);\n if (fields !== undefined) {\n this.register(hash, fields, binding);\n }\n }\n\n unregisterBinding(binding: LiveCollectionBinding, typename: string): void {\n const hash = binding._constraintHashes.get(typename);\n if (hash === undefined) return;\n\n const fields = getFieldNames(binding._constraintFieldRefs, typename);\n if (fields !== undefined) {\n this.unregister(hash, fields, binding);\n }\n }\n\n routeEvent(\n typename: string,\n entityData: Record<string, unknown>,\n entityKey: number,\n eventType: 'create' | 'update' | 'delete',\n onMatch?: () => void,\n deleteData?: Record<string, unknown>,\n ): void {\n for (const group of this._groups.values()) {\n const hash = computeConstraintHash(entityData, group.fieldPaths);\n if (hash === undefined) continue;\n\n const bindings = group.getMatching(hash);\n if (bindings !== undefined) {\n for (const binding of bindings) {\n binding.onEvent(typename, entityKey, eventType, onMatch, deleteData);\n }\n }\n }\n }\n}\n","import { type Notifier, notifier, reactiveSignal, type ReadonlySignal } from 'signalium';\nimport { LiveFieldType, Mask, type LiveFieldConfig, type EntityDef } from './types.js';\nimport type { QueryClient } from './QueryClient.js';\nimport type { EntityInstance } from './EntityInstance.js';\nimport { getProxyId } from './proxyId.js';\nimport {\n resolveConstraintHashes,\n computeConstraintHash,\n EVENT_SOURCE_FIELD,\n type FieldPath,\n buildFieldPaths,\n} from './ConstraintMatcher.js';\nimport { ValidatorDef, WRAPPED_VALUE } from './typeDefs.js';\n\nfunction buildKeySet(items: unknown[]): Set<number> {\n const keys = new Set<number>();\n for (const item of items) {\n if (typeof item === 'object' && item !== null) {\n const key = getProxyId(item as Record<string, unknown>);\n if (key !== undefined) keys.add(key);\n }\n }\n return keys;\n}\n\n// ======================================================\n// LiveCollectionParent — structural interface satisfied by EntityInstance\n// ======================================================\n\nexport interface LiveCollectionParent {\n key: number;\n entityRefs: Map<EntityInstance, number> | undefined;\n liveCollections: LiveCollectionBinding[];\n addChildRef(child: EntityInstance): void;\n removeChildRef(child: EntityInstance): void;\n save(): void;\n}\n\n// ======================================================\n// LiveInstance — shared interface for LiveArrayInstance and LiveValueInstance\n// ======================================================\n\nexport interface LiveInstance {\n getValue(): unknown;\n getRawValue(): unknown;\n reset(raw: unknown): void;\n append(raw: unknown): void;\n onEvent(\n entityKey: number,\n entity: unknown,\n entityData: Record<string, unknown>,\n eventType: 'create' | 'update' | 'delete',\n ): void;\n}\n\n// ======================================================\n// LiveCollectionBinding — shared wrapper for constraint routing\n// ======================================================\n\nexport class LiveCollectionBinding {\n _queryClient: QueryClient;\n _parent: LiveCollectionParent;\n _constraintHashes: Map<string, number>;\n _entityDefsByTypename: Map<string, ValidatorDef<any>>;\n _constraintFieldRefs: Map<string, Array<[string, unknown]>>;\n readonly instance: LiveInstance;\n\n constructor(\n entityDefs: ValidatorDef<any>[],\n constraintFieldRefs: Map<string, Array<[string, unknown]>>,\n queryClient: QueryClient,\n parent: LiveCollectionParent,\n constraintHashes: Map<string, number>,\n instance: LiveInstance,\n ) {\n this._queryClient = queryClient;\n this._parent = parent;\n this._constraintHashes = constraintHashes;\n this._constraintFieldRefs = constraintFieldRefs;\n this.instance = instance;\n\n this._entityDefsByTypename = new Map();\n for (const def of entityDefs) {\n if (def.typenameValue !== undefined) {\n this._entityDefsByTypename.set(def.typenameValue, def);\n }\n }\n\n WRAPPED_VALUE.add(this);\n }\n\n getValue(): unknown {\n return this.instance.getValue();\n }\n\n toJSON(): unknown {\n return this.instance.getRawValue();\n }\n\n reset(parsed: unknown): void {\n this.instance.reset(parsed);\n }\n\n append(parsed: unknown): void {\n this.instance.append(parsed);\n }\n\n /**\n * Handle an entity event. The entity has already been created/updated at the\n * root level by applyMutationEvent. The binding just checks if the entity's\n * current data satisfies this binding's shape and forwards to the instance.\n */\n onEvent(\n typename: string,\n entityKey: number,\n eventType: 'create' | 'update' | 'delete',\n onMatch?: () => void,\n deleteData?: Record<string, unknown>,\n ): void {\n const def = this._entityDefsByTypename.get(typename);\n if (def === undefined) return;\n const entityInstance = this._queryClient.entityMap.getEntity(entityKey);\n\n if (eventType === 'delete') {\n const entity = entityInstance !== undefined ? entityInstance.getProxy(def as unknown as EntityDef) : deleteData;\n if (entity !== undefined) {\n this.instance.onEvent(entityKey, entity, deleteData ?? entityInstance?.data ?? {}, 'delete');\n onMatch?.();\n }\n return;\n }\n\n if (entityInstance === undefined) return;\n if (!entityInstance.satisfiesDef(def as unknown as ValidatorDef<unknown>)) return;\n\n onMatch?.();\n const proxy = entityInstance.getProxy(def as unknown as EntityDef);\n this.instance.onEvent(entityKey, proxy, entityInstance.data, eventType);\n }\n\n destroy(): void {\n this._queryClient.unregisterLiveCollection(this);\n const collections = this._parent.liveCollections;\n const idx = collections.indexOf(this);\n if (idx !== -1) collections.splice(idx, 1);\n }\n}\n\n// ======================================================\n// LiveArrayInstance\n// ======================================================\n\nexport class LiveArrayInstance {\n _notifier: Notifier;\n _items: unknown[];\n _keys: Set<number>;\n _outputSignal: ReadonlySignal<unknown[]> | undefined;\n _queryClient: QueryClient;\n _parent: LiveCollectionParent;\n\n constructor(\n queryClient: QueryClient,\n parent: LiveCollectionParent,\n items: unknown[],\n constraintFieldPaths?: FieldPath[],\n constraintHash?: number,\n sort?: (a: unknown, b: unknown) => number,\n ) {\n this._notifier = notifier();\n this._items = items;\n this._keys = buildKeySet(items);\n this._queryClient = queryClient;\n this._parent = parent;\n\n const needsFilter = constraintFieldPaths !== undefined && constraintHash !== undefined;\n const needsSort = sort !== undefined;\n\n if (needsFilter || needsSort) {\n this._outputSignal = reactiveSignal(() => {\n this._notifier.consume();\n let result = this._items;\n\n if (needsFilter) {\n const filtered: unknown[] = [];\n for (const item of result) {\n if (typeof item !== 'object' || item === null) {\n filtered.push(item);\n continue;\n }\n const entityKey = getProxyId(item as Record<string, unknown>);\n if (entityKey === undefined) {\n filtered.push(item);\n continue;\n }\n const entity = queryClient.entityMap.getEntity(entityKey);\n if (entity === undefined) {\n filtered.push(item);\n continue;\n }\n entity.consume();\n const hash = computeConstraintHash(entity.data, constraintFieldPaths!);\n if (hash === constraintHash) {\n filtered.push(item);\n }\n }\n result = filtered;\n }\n\n if (needsSort) {\n result = (result === this._items ? result.slice() : result).sort(sort!);\n }\n\n return result;\n });\n }\n }\n\n onEvent(\n entityKey: number,\n entity: unknown,\n _entityData: Record<string, unknown>,\n eventType: 'create' | 'update' | 'delete',\n ): void {\n switch (eventType) {\n case 'create':\n this.add(entityKey, entity!);\n break;\n case 'update':\n if (!this.has(entityKey) && entity !== undefined) {\n this.add(entityKey, entity);\n }\n break;\n case 'delete':\n this.remove(entityKey);\n break;\n }\n }\n\n getValue(): unknown[] {\n if (this._outputSignal !== undefined) {\n return this._outputSignal.value;\n }\n this._notifier.consume();\n return this._items;\n }\n\n getRawValue(): unknown[] {\n return this._items;\n }\n\n add(key: number, proxy: unknown): boolean {\n if (this._keys.has(key)) return false;\n this._keys.add(key);\n this._items.push(proxy);\n\n const child = this._queryClient.entityMap.getEntity(key);\n if (child !== undefined) {\n this._parent.addChildRef(child);\n child.save();\n }\n\n this._notifier.notify();\n return true;\n }\n\n remove(key: number): boolean {\n if (!this._keys.has(key)) return false;\n this._keys.delete(key);\n const idx = this._findIndex(key);\n if (idx !== -1) this._items.splice(idx, 1);\n\n const child = this._queryClient.entityMap.getEntity(key);\n if (child !== undefined) {\n this._parent.removeChildRef(child);\n }\n\n this._notifier.notify();\n return true;\n }\n\n has(key: number): boolean {\n return this._keys.has(key);\n }\n\n reset(rawValue: unknown): void {\n const oldItems = this._items;\n const newItems = Array.isArray(rawValue) ? rawValue : [];\n this._items = newItems;\n this._keys = buildKeySet(newItems);\n\n // Add refs for new items BEFORE removing old ones to prevent\n // premature eviction of entities that appear in both arrays.\n for (const item of newItems) {\n if (typeof item === 'object' && item !== null) {\n const key = getProxyId(item as Record<string, unknown>);\n if (key !== undefined) {\n const child = this._queryClient.entityMap.getEntity(key);\n if (child !== undefined) {\n this._parent.addChildRef(child);\n }\n }\n }\n }\n for (const item of oldItems) {\n if (typeof item === 'object' && item !== null) {\n const key = getProxyId(item as Record<string, unknown>);\n if (key !== undefined) {\n const child = this._queryClient.entityMap.getEntity(key);\n if (child !== undefined) {\n this._parent.removeChildRef(child);\n }\n }\n }\n }\n this._notifier.notify();\n }\n\n append(rawValue: unknown): void {\n if (!Array.isArray(rawValue)) return;\n for (const item of rawValue) {\n if (typeof item !== 'object' || item === null) continue;\n const key = getProxyId(item as Record<string, unknown>);\n if (key !== undefined) {\n this.add(key, item);\n }\n }\n }\n\n private _findIndex(key: number): number {\n for (let i = 0; i < this._items.length; i++) {\n const item = this._items[i];\n if (typeof item === 'object' && item !== null) {\n if (getProxyId(item as Record<string, unknown>) === key) return i;\n }\n }\n return -1;\n }\n}\n\n// ======================================================\n// LiveValueInstance\n// ======================================================\n\nexport class LiveValueInstance {\n _notifier: Notifier;\n _value: unknown;\n _createdKeys: Set<number>;\n _deletedKeys: Set<number>;\n _queryClient: QueryClient;\n _parent: LiveCollectionParent;\n private _onCreate: (value: unknown, entity: unknown) => unknown;\n private _onUpdate: (value: unknown, entity: unknown) => unknown;\n private _onDelete: (value: unknown, entity: unknown) => unknown;\n\n constructor(\n queryClient: QueryClient,\n parent: LiveCollectionParent,\n initialValue: unknown,\n onCreate: (value: unknown, entity: unknown) => unknown,\n onUpdate: (value: unknown, entity: unknown) => unknown,\n onDelete: (value: unknown, entity: unknown) => unknown,\n ) {\n this._notifier = notifier();\n this._value = initialValue;\n this._createdKeys = new Set();\n this._deletedKeys = new Set();\n this._queryClient = queryClient;\n this._parent = parent;\n this._onCreate = onCreate;\n this._onUpdate = onUpdate;\n this._onDelete = onDelete;\n }\n\n onEvent(\n entityKey: number,\n entity: unknown,\n entityData: Record<string, unknown>,\n eventType: 'create' | 'update' | 'delete',\n ): void {\n switch (eventType) {\n case 'create':\n if (this._createdKeys.has(entityKey)) return;\n this._createdKeys.add(entityKey);\n this._value = this._onCreate(this._value, entity!);\n break;\n case 'update':\n this._value = this._onUpdate(this._value, entity ?? entityData);\n break;\n case 'delete':\n if (this._deletedKeys.has(entityKey)) return;\n this._deletedKeys.add(entityKey);\n this._value = this._onDelete(this._value, entity ?? entityData);\n break;\n }\n this._notifier.notify();\n }\n\n getValue(): unknown {\n this._notifier.consume();\n return this._value;\n }\n\n getRawValue(): unknown {\n return this._value;\n }\n\n reset(value: unknown): void {\n this._value = value;\n this._createdKeys.clear();\n this._deletedKeys.clear();\n this._notifier.notify();\n }\n\n append(_value: unknown): void {\n // LiveValue doesn't accumulate — append is a no-op.\n // New page's reducer events are handled via the normal event system.\n }\n}\n\n// ======================================================\n// Shared factory functions\n// ======================================================\n\nexport function createLiveCollection(\n config: LiveFieldConfig,\n parsedValue: unknown,\n parent: LiveCollectionParent,\n parentData: Record<string, unknown>,\n queryClient: QueryClient,\n): LiveCollectionBinding {\n let constraintFieldRefs = config.constraintFieldRefs;\n\n if (constraintFieldRefs === undefined) {\n constraintFieldRefs = new Map();\n for (const def of config.entityDefs) {\n const typename = def.typenameValue;\n if (typename !== undefined) {\n constraintFieldRefs.set(typename, [[EVENT_SOURCE_FIELD, parent.key]]);\n }\n }\n }\n\n const constraintHashes = resolveConstraintHashes(constraintFieldRefs, parentData) ?? new Map();\n\n let inner: LiveInstance;\n\n if (config.type === LiveFieldType.Array) {\n let arrayConstraintFieldPaths: FieldPath[] | undefined;\n let arrayConstraintHash: number | undefined;\n if (config.constraintFieldRefs !== undefined && constraintHashes.size > 0) {\n if (constraintHashes.size === 1) {\n for (const [typename] of config.constraintFieldRefs) {\n const hash = constraintHashes.get(typename);\n if (hash !== undefined) {\n arrayConstraintHash = hash;\n const pairs = config.constraintFieldRefs.get(typename);\n if (pairs !== undefined) {\n arrayConstraintFieldPaths = buildFieldPaths(pairs.map(([field]) => field));\n }\n break;\n }\n }\n }\n }\n inner = new LiveArrayInstance(\n queryClient,\n parent,\n Array.isArray(parsedValue) ? parsedValue : [],\n arrayConstraintFieldPaths,\n arrayConstraintHash,\n config.sort,\n );\n } else {\n inner = new LiveValueInstance(\n queryClient,\n parent,\n parsedValue,\n config.onCreate!,\n config.onUpdate!,\n config.onDelete!,\n );\n }\n\n const binding = new LiveCollectionBinding(\n config.entityDefs,\n constraintFieldRefs,\n queryClient,\n parent,\n constraintHashes,\n inner,\n );\n\n parent.liveCollections.push(binding);\n queryClient.registerLiveCollection(binding);\n return binding;\n}\n\n/**\n * Walk an object shape and create or update LiveCollectionBinding instances for\n * live fields. Values in `data` should already be parsed.\n * Bindings are stored directly in `data[fieldName]`.\n * On first call, creates new bindings. On subsequent calls (e.g. refetch),\n * resets existing instances with fresh data.\n */\nexport function initializeLiveFields(\n shape: Record<string, unknown>,\n data: Record<string, unknown>,\n previousData: Record<string, unknown> | undefined,\n parent: LiveCollectionParent,\n queryClient: QueryClient,\n appendMode: boolean = false,\n): void {\n for (const fieldName of Object.keys(shape)) {\n const fieldDef = shape[fieldName];\n if (!(fieldDef instanceof ValidatorDef)) continue;\n\n if (fieldDef._liveConfig !== undefined) {\n const config = fieldDef._liveConfig;\n const existing = previousData?.[fieldName];\n\n if (existing instanceof LiveCollectionBinding) {\n if (appendMode) {\n existing.append(data[fieldName]);\n } else {\n existing.reset(data[fieldName]);\n }\n data[fieldName] = existing;\n } else {\n data[fieldName] = createLiveCollection(config, data[fieldName], parent, data, queryClient);\n }\n } else if (\n (fieldDef.mask & Mask.OBJECT) !== 0 &&\n (fieldDef.mask & (Mask.ENTITY | Mask.ARRAY | Mask.UNION | Mask.RECORD | Mask.LIVE)) === 0 &&\n fieldDef.shape !== undefined\n ) {\n const nestedData = data[fieldName] as Record<string, unknown> | undefined;\n if (nestedData !== undefined && nestedData !== null && typeof nestedData === 'object') {\n const nestedPrevious = previousData?.[fieldName] as Record<string, unknown> | undefined;\n initializeLiveFields(\n fieldDef.shape as Record<string, unknown>,\n nestedData,\n nestedPrevious,\n parent,\n queryClient,\n appendMode,\n );\n }\n }\n }\n}\n","// -----------------------------------------------------------------------------\n// Apply Entities\n//\n// Single depth-first walk from the root that applies parsed entities to the\n// entity store, replaces parsed data objects with entity proxies, and counts\n// child refs. Entity fields are reified inline during the merge/init loops\n// so there is only one iteration per entity's shape fields.\n// -----------------------------------------------------------------------------\n\nimport type { QueryClient } from './QueryClient.js';\nimport type { EntityInstance } from './EntityInstance.js';\nimport type { ParseContext, ParsedEntity } from './parseEntities.js';\nimport { FormattedValue, ValidatorDef } from './typeDefs.js';\nimport { createLiveCollection, LiveCollectionBinding } from './LiveCollection.js';\nimport { PROXY_ID } from './proxyId.js';\n\nconst entries = Object.entries;\nconst ObjectProto = Object.prototype;\n\n// ======================================================\n// Public API\n// ======================================================\n\nexport interface ApplyResult {\n data: unknown;\n entityRefs: Map<EntityInstance, number>;\n}\n\n/**\n * Single depth-first walk from the root that applies entities to the store,\n * replaces parsed data objects with entity proxies, and counts child refs.\n */\nexport function applyEntityRefs(\n ctx: ParseContext,\n rootData: unknown,\n persist: boolean,\n appendMode: boolean = false,\n): ApplyResult {\n const queryClient = ctx.queryClient!;\n queryClient.currentParseId++;\n\n const seen = ctx.seen!;\n const entityRefs = new Map<EntityInstance, number>();\n const data = reifyAndApply(rootData, seen, queryClient, persist, entityRefs, appendMode);\n\n return { data, entityRefs };\n}\n\n// ======================================================\n// Depth-first walk\n// ======================================================\n\nfunction reifyAndApply(\n value: unknown,\n seen: Map<Record<string, unknown>, ParsedEntity>,\n queryClient: QueryClient,\n persist: boolean,\n entityRefs: Map<EntityInstance, number>,\n appendMode: boolean,\n): unknown {\n if (typeof value !== 'object' || value === null) return value;\n\n const entity = seen.get(value as Record<string, unknown>);\n if (entity !== undefined) {\n return applyEntity(entity, seen, queryClient, persist, entityRefs, appendMode);\n }\n\n if (Array.isArray(value)) {\n for (let i = 0; i < value.length; i++) {\n const item = value[i];\n if (typeof item === 'object' && item !== null && !(item instanceof FormattedValue) && !PROXY_ID.has(item)) {\n value[i] = reifyAndApply(item, seen, queryClient, persist, entityRefs, appendMode);\n }\n }\n return value;\n }\n\n if (Object.getPrototypeOf(value) === ObjectProto && !PROXY_ID.has(value as object)) {\n const obj = value as Record<string, unknown>;\n for (const key of Object.keys(obj)) {\n const v = obj[key];\n if (typeof v === 'object' && v !== null && !(v instanceof FormattedValue) && !PROXY_ID.has(v)) {\n obj[key] = reifyAndApply(v, seen, queryClient, persist, entityRefs, appendMode);\n }\n }\n }\n\n return value;\n}\n\nfunction shouldReify(v: unknown): boolean {\n return typeof v === 'object' && v !== null && !(v instanceof FormattedValue) && !PROXY_ID.has(v);\n}\n\n// ======================================================\n// Entity apply — reify fields + merge data + wire child refs\n// ======================================================\n\nfunction applyEntity(\n entity: ParsedEntity,\n seen: Map<Record<string, unknown>, ParsedEntity>,\n queryClient: QueryClient,\n persist: boolean,\n parentEntityRefs: Map<EntityInstance, number>,\n appendMode: boolean,\n): Record<string, unknown> {\n const { key, data, shape: entityShape, rawKeys } = entity;\n const shapeFields = entityShape.shape;\n\n const entityInstance = queryClient.prepareEntity(key, data, entityShape);\n const existingData = entityInstance.data;\n const isUpdate = existingData !== data;\n\n // For partial updates (rawKeys defined), seed childRefs with existing refs\n // so unchanged entity-ref fields aren't released by setChildRefs.\n const childRefs =\n isUpdate && rawKeys !== undefined && entityInstance.entityRefs !== undefined\n ? new Map(entityInstance.entityRefs)\n : new Map<EntityInstance, number>();\n\n if (isUpdate) {\n mergeFields(\n shapeFields,\n data,\n existingData,\n rawKeys,\n entityInstance,\n existingData,\n seen,\n queryClient,\n persist,\n childRefs,\n appendMode,\n );\n entityInstance.notify();\n } else {\n initFields(shapeFields, data, entityInstance, data, seen, queryClient, persist, childRefs, appendMode);\n }\n\n if (appendMode && entityInstance.liveCollections.length > 0) {\n for (const binding of entityInstance.liveCollections) {\n const raw = binding.instance.getRawValue();\n if (!Array.isArray(raw)) continue;\n for (const item of raw) {\n if (typeof item !== 'object' || item === null) continue;\n const itemKey = PROXY_ID.get(item as object);\n if (itemKey === undefined) continue;\n const child = queryClient.entityMap.getEntity(itemKey);\n if (child !== undefined) {\n childRefs.set(child, (childRefs.get(child) ?? 0) + 1);\n }\n }\n }\n }\n\n entityInstance.setChildRefs(childRefs.size > 0 ? childRefs : undefined, persist);\n\n const proxy = entityInstance.getProxy(entityShape);\n\n parentEntityRefs.set(entityInstance, (parentEntityRefs.get(entityInstance) ?? 0) + 1);\n\n return proxy;\n}\n\n// ======================================================\n// Field merge (update path) — reify + merge in one loop\n// ======================================================\n\nfunction mergeFields(\n shape: Record<string, unknown>,\n data: Record<string, unknown>,\n existingData: Record<string, unknown>,\n rawKeys: Set<string> | undefined,\n entityInstance: EntityInstance,\n entityData: Record<string, unknown>,\n seen: Map<Record<string, unknown>, ParsedEntity>,\n queryClient: QueryClient,\n persist: boolean,\n childRefs: Map<EntityInstance, number>,\n appendMode: boolean,\n): void {\n for (const [fieldKey, propShape] of entries(shape)) {\n if (rawKeys !== undefined && !rawKeys.has(fieldKey)) continue;\n\n if (shouldReify(data[fieldKey])) {\n data[fieldKey] = reifyAndApply(data[fieldKey], seen, queryClient, persist, childRefs, appendMode);\n }\n\n if (propShape instanceof ValidatorDef && propShape._liveConfig !== undefined) {\n const existingValue = existingData[fieldKey];\n if (existingValue instanceof LiveCollectionBinding) {\n if (appendMode) {\n existingValue.append(data[fieldKey]);\n } else {\n existingValue.reset(data[fieldKey]);\n }\n } else {\n existingData[fieldKey] = createLiveCollection(\n propShape._liveConfig,\n data[fieldKey],\n entityInstance,\n entityData,\n queryClient,\n );\n }\n } else {\n const newVal = data[fieldKey];\n const oldVal = existingData[fieldKey];\n if (isPlainObject(newVal) && isPlainObject(oldVal)) {\n const nestedShape =\n propShape instanceof ValidatorDef && propShape.shape !== undefined\n ? (propShape.shape as Record<string, unknown>)\n : undefined;\n if (nestedShape !== undefined) {\n mergeFields(\n nestedShape,\n newVal,\n oldVal,\n undefined,\n entityInstance,\n entityData,\n seen,\n queryClient,\n persist,\n childRefs,\n appendMode,\n );\n } else {\n for (const k of Object.keys(newVal)) {\n oldVal[k] = newVal[k];\n }\n }\n existingData[fieldKey] = oldVal;\n } else {\n existingData[fieldKey] = newVal;\n }\n }\n }\n}\n\n// ======================================================\n// Field init (new entity path) — reify + create live data in one loop\n// ======================================================\n\nfunction initFields(\n shape: Record<string, unknown>,\n data: Record<string, unknown>,\n entityInstance: EntityInstance,\n entityData: Record<string, unknown>,\n seen: Map<Record<string, unknown>, ParsedEntity>,\n queryClient: QueryClient,\n persist: boolean,\n childRefs: Map<EntityInstance, number>,\n appendMode: boolean,\n): void {\n for (const [fieldKey, propShape] of entries(shape)) {\n if (!(fieldKey in data)) continue;\n\n if (shouldReify(data[fieldKey])) {\n data[fieldKey] = reifyAndApply(data[fieldKey], seen, queryClient, persist, childRefs, appendMode);\n }\n\n if (propShape instanceof ValidatorDef && propShape._liveConfig !== undefined) {\n data[fieldKey] = createLiveCollection(\n propShape._liveConfig,\n data[fieldKey],\n entityInstance,\n entityData,\n queryClient,\n );\n } else {\n const val = data[fieldKey];\n if (isPlainObject(val)) {\n const nestedShape =\n propShape instanceof ValidatorDef && propShape.shape !== undefined\n ? (propShape.shape as Record<string, unknown>)\n : undefined;\n if (nestedShape !== undefined) {\n initFields(nestedShape, val, entityInstance, entityData, seen, queryClient, persist, childRefs, appendMode);\n }\n }\n }\n }\n}\n\n// ======================================================\n// Helpers\n// ======================================================\n\nfunction isPlainObject(v: unknown): v is Record<string, unknown> {\n return (\n typeof v === 'object' &&\n v !== null &&\n !Array.isArray(v) &&\n Object.getPrototypeOf(v) === ObjectProto &&\n !PROXY_ID.has(v)\n );\n}\n","import { type Signal, isSignal as isSignalCheck } from 'signalium';\nimport { hashValue } from 'signalium/utils';\nimport { NetworkMode, RetryConfig, BaseUrlValue } from './types.js';\nimport { QueryDefinition } from './query.js';\n\n// -----------------------------------------------------------------------------\n// Query Types\n// -----------------------------------------------------------------------------\n\nexport interface QueryContext {\n log?: {\n error?: (message: string, error?: unknown) => void;\n warn?: (message: string, error?: unknown) => void;\n info?: (message: string) => void;\n debug?: (message: string) => void;\n };\n evictionMultiplier?: number;\n}\n\n/**\n * Resolves a BaseUrlValue to a string.\n * Handles static strings, Signals, and functions.\n */\nexport function resolveBaseUrl(baseUrl: BaseUrlValue | undefined): string | undefined {\n if (baseUrl === undefined) return undefined;\n if (typeof baseUrl === 'string') return baseUrl;\n if (typeof baseUrl === 'function') return baseUrl();\n return baseUrl.value; // Signal\n}\n\nexport interface QueryCacheOptions {\n maxCount?: number;\n cacheTime?: number; // minutes - on-disk/persistent storage expiration. Default: 1440 (24 hours)\n}\n\nexport interface FetchNextConfig {\n /** Override the URL/path for the next page request. Can be a FieldRef (e.g. this.result.nextUrl). */\n url?: unknown;\n /** Search params for the next page. Values can be FieldRefs (e.g. this.result.nextCursor). */\n searchParams?: Record<string, unknown>;\n}\n\nexport interface QueryConfigOptions {\n gcTime?: number; // minutes - in-memory eviction time. Default: 5. Use 0 for next-tick, Infinity to never GC.\n staleTime?: number; // milliseconds - how long data is considered fresh. Default: 0 (always stale)\n debounce?: number; // milliseconds - debounce delay for param-change refetches. Default: 0\n networkMode?: NetworkMode; // default: NetworkMode.Online\n retry?: RetryConfig | number | boolean; // default: 3 on client, 0 on server\n refreshStaleOnReconnect?: boolean; // default: true\n subscribe?: (this: any, onEvent: (event: import('./types.js').MutationEvent) => void) => () => void;\n}\n\nexport type QueryParams = Record<\n string,\n | string\n | number\n | boolean\n | undefined\n | null\n | Signal<string | number | boolean | undefined | null>\n | unknown[] // For body array params\n | Record<string, unknown> // For body object params\n>;\n\n// -----------------------------------------------------------------------------\n// QueryStore Interface\n// -----------------------------------------------------------------------------\n\nexport type PreloadedEntityMap = Map<number, Record<string, unknown>>;\n\nexport interface CachedQuery {\n value: unknown;\n refIds: Set<number> | undefined;\n updatedAt: number;\n preloadedEntities?: PreloadedEntityMap;\n}\n\nexport interface QueryStore {\n loadQuery(queryDef: QueryDefinition<any, any, any>, queryKey: number): MaybePromise<CachedQuery | undefined>;\n\n saveQuery(\n queryDef: QueryDefinition<any, any, any>,\n queryKey: number,\n value: unknown,\n updatedAt: number,\n refIds?: Set<number>,\n ): void;\n\n saveEntity(entityKey: number, value: unknown, refIds?: Set<number>): void;\n\n activateQuery(queryDef: QueryDefinition<any, any, any>, storageKey: number): void;\n\n deleteQuery(queryKey: number): void;\n\n purgeStaleQueries?(): MaybePromise<void>;\n}\n\nexport type MaybePromise<T> = T | Promise<T>;\n\n// -----------------------------------------------------------------------------\n// Helpers\n// -----------------------------------------------------------------------------\n\nfunction isSignal(value: unknown): value is Signal<any> {\n return isSignalCheck(value);\n}\n\nexport function extractParamsForKey(params: QueryParams | undefined): Record<string, unknown> | undefined {\n if (params === undefined) {\n return undefined;\n }\n\n const extracted: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(params)) {\n if (isSignal(value)) {\n extracted[key] = value.value;\n } else {\n extracted[key] = value;\n }\n }\n\n return extracted;\n}\n\n/**\n * Computes the query key for instance lookup. Instance keys use raw params\n * (with Signals), storage keys use extracted params (Signal values read).\n */\nexport const queryKeyFor = (queryDef: QueryDefinition<any, any, any>, params: unknown): number => {\n return hashValue([queryDef.statics.id, params]);\n};\n","import { context, watcher, ReactiveTask, type Context } from 'signalium';\nimport { hashValue } from 'signalium/utils';\nimport {\n EntityDef,\n MutationEvent,\n QueryPromise,\n ComplexTypeDef,\n InternalTypeDef,\n QUERY_ID,\n InvalidateTarget,\n} from './types.js';\nimport { PROXY_ID } from './proxyId.js';\nimport { EntityStore } from './EntityStore.js';\nimport { EntityInstance } from './EntityInstance.js';\nimport { NetworkManager } from './NetworkManager.js';\nimport { QueryInstance } from './QueryResult.js';\nimport { MutationResultImpl } from './MutationResult.js';\nimport { MutationDefinition } from './mutation.js';\nimport { GcManager, NoOpGcManager, GcKeyType } from './GcManager.js';\nimport { DEFAULT_GC_TIME } from './stores/shared.js';\nimport { Query, QueryDefinition } from './query.js';\nimport { ParseContext, parseEntities, parseEntity, type ParseResult } from './parseEntities.js';\nimport { applyEntityRefs, type ApplyResult } from './applyEntities.js';\nimport { ValidatorDef } from './typeDefs.js';\nimport { ConstraintMatcher, EVENT_SOURCE_FIELD } from './ConstraintMatcher.js';\nimport { LiveCollectionBinding } from './LiveCollection.js';\nimport { QueryController } from './QueryController.js';\nimport {\n type QueryContext,\n type QueryStore,\n type QueryParams,\n type PreloadedEntityMap,\n queryKeyFor,\n} from './query-types.js';\nimport { SyncQueryStore, MemoryPersistentStore } from './stores/sync.js';\n\nexport interface QueryClientConfig {\n store?: QueryStore;\n controllers?: QueryController[];\n networkManager?: NetworkManager;\n gcManager?: GcManager | NoOpGcManager;\n log?: {\n error?: (message: string, error?: unknown) => void;\n warn?: (message: string, error?: unknown) => void;\n info?: (message: string) => void;\n debug?: (message: string) => void;\n };\n evictionMultiplier?: number;\n}\n\nexport {\n type QueryContext,\n type QueryCacheOptions,\n type QueryConfigOptions,\n type FetchNextConfig,\n type QueryParams,\n type QueryStore,\n type CachedQuery,\n type PreloadedEntityMap,\n type MaybePromise,\n resolveBaseUrl,\n extractParamsForKey,\n queryKeyFor,\n} from './query-types.js';\n\nexport class QueryClient {\n entityMap: EntityStore;\n queryInstances = new Map<number, QueryInstance<any>>();\n mutationInstances = new Map<string, MutationResultImpl<unknown, unknown>>();\n gcManager: GcManager | NoOpGcManager;\n networkManager: NetworkManager;\n isServer: boolean;\n store: QueryStore;\n\n currentParseId: number = 0;\n\n private context!: QueryContext;\n private typenameRegistry = new Map<string, ValidatorDef<any>[]>();\n private constraintRegistry = new Map<string, ConstraintMatcher>();\n private mergedDefCache = new Map<string, ValidatorDef<any>>();\n private controllers = new Map<typeof QueryController, QueryController>();\n private networkUnsubscribe: (() => void) | undefined;\n\n constructor(config: QueryClientConfig = {}) {\n const {\n store = new SyncQueryStore(new MemoryPersistentStore()),\n log,\n evictionMultiplier,\n controllers: _c,\n networkManager: _n,\n gcManager: _g,\n ...rest\n } = config as QueryClientConfig & Record<string, unknown>;\n this.isServer = typeof window === 'undefined';\n this.store = store;\n this.context = { ...rest, log: log ?? console, evictionMultiplier };\n this.gcManager =\n config.gcManager ??\n (this.isServer ? new NoOpGcManager() : new GcManager(this.handleEviction, evictionMultiplier));\n this.networkManager = config.networkManager ?? new NetworkManager();\n this.entityMap = new EntityStore((key, data, refs) => this.store.saveEntity(key, data, refs));\n\n // Register user-supplied controllers\n for (const controller of config.controllers ?? []) {\n this.controllers.set(controller.constructor as typeof QueryController, controller);\n controller.register(this);\n }\n\n // Notify controllers when network status changes\n const onlineSignal = this.networkManager.getOnlineSignal();\n const networkWatcher = watcher(() => onlineSignal.value);\n this.networkUnsubscribe = networkWatcher.addListener(\n () => {\n const isOnline = onlineSignal.value;\n for (const controller of this.controllers.values()) {\n controller.onNetworkStatusChange?.(isOnline);\n }\n },\n { skipInitial: true },\n );\n\n this.store.purgeStaleQueries?.();\n }\n\n /**\n * Returns the registered controller instance for the given controller class.\n * Throws if no controller of that class has been registered.\n */\n getController(controllerClass: typeof QueryController): QueryController {\n let controller = this.controllers.get(controllerClass);\n if (!controller) {\n // Auto-instantiate with no-arg constructor as fallback.\n // Works for controllers like RESTQueryController that default to globalThis.fetch.\n // Controllers that require explicit configuration will throw here, prompting\n // the user to register an instance explicitly.\n try {\n controller = new (controllerClass as new () => QueryController)();\n } catch {\n throw new Error(\n `No controller registered for ${controllerClass.name} and auto-instantiation failed. ` +\n `Pass an instance via QueryClient config: new QueryClient({ store, controllers: [new ${controllerClass.name}(...)] })`,\n );\n }\n this.controllers.set(controllerClass, controller);\n controller.register(this);\n }\n return controller;\n }\n\n getContext(): QueryContext {\n return this.context;\n }\n\n // ======================================================\n // Typename Registry (per-client)\n // ======================================================\n\n private registerEntityDef(def: ValidatorDef<any>): void {\n const typename = def.typenameValue;\n if (typename === undefined) return;\n if (def._entityClass === undefined) return;\n\n const existing = this.typenameRegistry.get(typename);\n\n if (existing !== undefined) {\n if (existing.indexOf(def) !== -1) return;\n\n existing.push(def);\n this.mergedDefCache.delete(typename);\n this.getMergedDef(typename);\n } else {\n this.typenameRegistry.set(typename, [def]);\n }\n }\n\n getEntityDefsForTypename(typename: string): ValidatorDef<any>[] | undefined {\n return this.typenameRegistry.get(typename);\n }\n\n getMergedDef(typename: string): ValidatorDef<any> | undefined {\n let merged = this.mergedDefCache.get(typename);\n if (merged !== undefined) return merged;\n\n const defs = this.typenameRegistry.get(typename);\n if (defs === undefined) return undefined;\n\n merged = ValidatorDef.merge(defs);\n this.mergedDefCache.set(typename, merged);\n return merged;\n }\n\n saveQueryData(\n queryDef: QueryDefinition<QueryParams | undefined, unknown, unknown>,\n queryKey: number,\n data: unknown,\n updatedAt: number,\n entityRefs?: Map<EntityInstance, number>,\n ): void {\n const refKeys =\n entityRefs !== undefined && entityRefs.size > 0\n ? new Set<number>([...entityRefs.keys()].map(e => e.key))\n : undefined;\n this.store.saveQuery(queryDef as any, queryKey, data, updatedAt, refKeys);\n }\n\n activateQuery(queryInstance: QueryInstance<any>): void {\n const { def, queryKey, storageKey, config } = queryInstance;\n this.store.activateQuery(def as any, storageKey);\n\n const gcTime = config?.gcTime ?? DEFAULT_GC_TIME;\n this.gcManager.cancel(queryKey, gcTime);\n }\n\n loadCachedQuery(queryDef: QueryDefinition<QueryParams | undefined, unknown, unknown>, queryKey: number) {\n return this.store.loadQuery(queryDef as any, queryKey);\n }\n\n /**\n * Loads a query from the document store and returns a QueryResult\n * that triggers fetches and prepopulates with cached data\n */\n getQuery<T extends Query>(\n queryDef: QueryDefinition<any, any, any>,\n params: QueryParams | undefined,\n ): QueryPromise<T> {\n const queryKey = queryKeyFor(queryDef, params);\n\n let queryInstance = this.queryInstances.get(queryKey) as QueryInstance<T> | undefined;\n\n // Create a new instance if it doesn't exist\n if (queryInstance === undefined) {\n queryInstance = new QueryInstance(queryDef, this, queryKey, params);\n\n // Store for future use\n this.queryInstances.set(queryKey, queryInstance as QueryInstance<any>);\n }\n\n return queryInstance.relay;\n }\n\n /**\n * Gets or creates a MutationResult for the given mutation definition.\n * Mutations are cached by their definition ID.\n */\n getMutation<Request, Response>(\n mutationDef: MutationDefinition<Request, Response>,\n ): ReactiveTask<Response, [Request]> {\n const mutationId = mutationDef.id;\n\n let mutationInstance = this.mutationInstances.get(mutationId) as MutationResultImpl<Request, Response> | undefined;\n\n // Create a new instance if it doesn't exist\n if (mutationInstance === undefined) {\n mutationInstance = new MutationResultImpl(mutationDef, this);\n\n // Store for future use\n this.mutationInstances.set(mutationId, mutationInstance as MutationResultImpl<unknown, unknown>);\n }\n\n return mutationInstance.task;\n }\n\n /**\n * Parse data: validates, formats, produces parsed entity data objects.\n * Does NOT touch the entity store. Call applyRefs() after to commit entities.\n */\n parseData(obj: unknown, shape: InternalTypeDef, preloadedEntities?: PreloadedEntityMap): ParseResult {\n const warn = this.context.log?.warn ?? (() => {});\n const ctx = new ParseContext();\n ctx.reset(this, preloadedEntities, warn);\n const data = parseEntities(obj, shape as unknown as ComplexTypeDef, ctx);\n return { data, ctx };\n }\n\n /**\n * Apply entities from parseData() via a single depth-first walk: creates/\n * updates EntityInstances, replaces parsed data with proxies, counts child\n * refs. Returns the reified data and root-level entity refs.\n */\n applyRefs(parseResult: ParseResult, persist: boolean = true, appendMode: boolean = false): ApplyResult {\n return applyEntityRefs(parseResult.ctx, parseResult.data, persist, appendMode);\n }\n\n /**\n * Parse and apply data as a root entity. For non-entity results, injects\n * QUERY_ID onto the payload. Returns the root EntityInstance (created or\n * found in the store by the standard entity pipeline).\n */\n parseAndApplyRootEntity(\n obj: unknown,\n queryId: number,\n rootEntityShape: ValidatorDef<any>,\n persist: boolean,\n appendMode: boolean = false,\n preloadedEntities?: PreloadedEntityMap,\n ): EntityInstance {\n // For non-entity results (QUERY_ID idField), inject the query id onto\n // fresh data payloads. Cached data arrives as { __entityRef } so\n // parseEntityData reads the key directly from that instead.\n if (\n typeof rootEntityShape.idField === 'symbol' &&\n typeof obj === 'object' &&\n obj !== null &&\n !('__entityRef' in (obj as Record<string, unknown>))\n ) {\n (obj as Record<string | symbol, unknown>)[QUERY_ID] = queryId;\n }\n\n const parseResult = this.parseData(obj, rootEntityShape as unknown as InternalTypeDef, preloadedEntities);\n const result = applyEntityRefs(parseResult.ctx, parseResult.data, persist, appendMode);\n\n // Discover the root entity from the returned proxy\n const proxyKey = PROXY_ID.get(result.data as object);\n return this.entityMap.getEntity(proxyKey!)!;\n }\n\n prepareEntity(key: number, obj: Record<string, unknown>, shape: EntityDef): EntityInstance {\n this.registerEntityDef(shape as unknown as ValidatorDef<any>);\n return this.entityMap.getOrCreateEntity(key, obj, shape, this);\n }\n\n // ======================================================\n // Mutation Events\n // ======================================================\n\n applyMutationEvent(event: MutationEvent): void {\n const { type, typename } = event;\n\n const mergedDef = this.getMergedDef(typename);\n if (mergedDef === undefined) return;\n\n const idField = mergedDef.idField;\n if (idField === undefined || typeof idField === 'symbol') return;\n\n const rawData = event.data;\n const id =\n event.id !== undefined\n ? event.id\n : type === 'delete' && (typeof rawData === 'string' || typeof rawData === 'number')\n ? rawData\n : (rawData as Record<string, unknown>)[idField];\n\n if (id === undefined) return;\n\n const key = hashValue([typename, id]);\n const eventSource = event.__eventSource;\n const data = (typeof rawData === 'object' && rawData !== null ? rawData : {}) as Record<string, unknown>;\n\n const existing = this.entityMap.getEntity(key);\n\n if (type === 'delete') {\n const entityData = existing !== undefined ? existing.data : data;\n this.routeEvent(typename, entityData, key, type, eventSource, undefined, entityData);\n return;\n }\n\n try {\n const warn = this.context.log?.warn ?? (() => {});\n const parseCtx = new ParseContext();\n parseCtx.reset(this, undefined, warn, /* isPartialEvent */ true);\n const parsedData = parseEntity(data, mergedDef as unknown as EntityDef, parseCtx);\n applyEntityRefs(parseCtx, parsedData, true);\n } catch (e) {\n this.context.log?.warn?.('Failed to apply mutation event', e);\n if (existing === undefined) {\n const created = this.entityMap.getEntity(key);\n if (created !== undefined) created.evict();\n }\n return;\n }\n\n const entity = this.entityMap.getEntity(key);\n if (entity === undefined) return;\n\n this.entityMap.save(entity);\n\n const wasNew = existing === undefined;\n let matched = false;\n\n this.routeEvent(typename, entity.data, key, type, eventSource, () => {\n matched = true;\n });\n\n if (wasNew && !matched) {\n entity.evict();\n }\n }\n\n // ======================================================\n // Query Invalidation\n // ======================================================\n\n invalidateQueries(targets: ReadonlyArray<InvalidateTarget>): void {\n for (const target of targets) {\n const isArray = Array.isArray(target);\n const QueryClass = (isArray ? target[0] : target) as new () => Query;\n const paramSubset = isArray ? (target[1] as Record<string, unknown>) : undefined;\n\n const queryDef = QueryDefinition.for(QueryClass);\n const defId = queryDef.statics.id;\n\n for (const [, instance] of this.queryInstances) {\n if (instance.def.statics.id !== defId) continue;\n\n if (paramSubset === undefined || paramsMatch(instance.resolvedParams, paramSubset)) {\n instance.markStale();\n }\n }\n }\n }\n\n // ======================================================\n // In-Memory GC\n // ======================================================\n\n private handleEviction = (key: number, type: GcKeyType): void => {\n if (type === GcKeyType.Query) {\n const instance = this.queryInstances.get(key);\n if (instance === undefined) return;\n instance.rootEntity?.evict();\n this.queryInstances.delete(key);\n return;\n }\n const entity = this.entityMap.getEntity(key);\n if (entity !== undefined) entity.evict();\n };\n\n // ======================================================\n // Constraint Registry (Live Data)\n // ======================================================\n\n getOrCreateMatcher(typename: string): ConstraintMatcher {\n let matcher = this.constraintRegistry.get(typename);\n if (matcher === undefined) {\n matcher = new ConstraintMatcher();\n this.constraintRegistry.set(typename, matcher);\n }\n return matcher;\n }\n\n registerLiveCollection(binding: LiveCollectionBinding): void {\n for (const [typename, def] of binding._entityDefsByTypename) {\n this.registerEntityDef(def);\n this.getOrCreateMatcher(typename).registerBinding(binding, typename);\n }\n }\n\n unregisterLiveCollection(binding: LiveCollectionBinding): void {\n for (const typename of binding._entityDefsByTypename.keys()) {\n const matcher = this.constraintRegistry.get(typename);\n if (matcher !== undefined) {\n matcher.unregisterBinding(binding, typename);\n }\n }\n }\n\n private routeEvent(\n typename: string,\n entityData: Record<string, unknown>,\n entityKey: number,\n eventType: 'create' | 'update' | 'delete',\n eventSource: number | undefined,\n onMatch?: () => void,\n deleteData?: Record<string, unknown>,\n ): void {\n const matcher = this.constraintRegistry.get(typename);\n if (matcher === undefined) return;\n\n const data = eventSource !== undefined ? { ...entityData, [EVENT_SOURCE_FIELD]: eventSource } : entityData;\n matcher.routeEvent(typename, data, entityKey, eventType, onMatch, deleteData);\n }\n\n destroy(): void {\n this.networkUnsubscribe?.();\n this.gcManager.destroy();\n this.networkManager.destroy();\n for (const controller of this.controllers.values()) {\n controller.destroy?.();\n }\n this.controllers.clear();\n this.queryInstances.clear();\n this.mutationInstances.clear();\n this.constraintRegistry.clear();\n this.typenameRegistry.clear();\n this.mergedDefCache.clear();\n }\n}\n\nexport const QueryClientContext: Context<QueryClient | undefined> = context<QueryClient | undefined>(undefined);\n\nfunction paramsMatch(instanceParams: Record<string, unknown> | undefined, subset: Record<string, unknown>): boolean {\n if (instanceParams === undefined) return false;\n for (const key in subset) {\n if (instanceParams[key] !== subset[key]) return false;\n }\n return true;\n}\n"],"names":["NetworkMode","Mask","ARRAY_KEY","RECORD_KEY","QUERY_ID","LiveFieldType","LiveFieldConfig","type","entityDefs","constraintFieldRefs","sort","valueType","onCreate","onUpdate","onDelete","PROXY_ID","getProxyId","object","GcKeyType","GcBucket","gcTimeMinutes","_onEvict","multiplier","key","_currentFlush","_nextFlush","GcManager","onEvict","gcTime","_nextTickEntries","_buckets","bucket","NoOpGcManager","_key","_gcTime","_type","FIELD_REF_BRAND","FIELD_REF_PATH","DEFINITION_TARGET","CANCEL_PROXY","FIELD_REF_PLACEHOLDER","createFieldRef","path","target","fieldRefHandler","prop","parentPath","isFieldRef","value","getFieldRefPath","ref","createDefinitionProxy","cancelled","extractDefinition","instance","raw","fields","methods","proto","desc","resolveFieldRefPath","root","current","segment","reifyStringPlaceholders","str","_match","pathStr","reifyValue","v","result","createExecutionContext","captured","actualParams","queryContext","ctx","method","Entity","entries","keys","assertFieldTypesCompatible","setsEqual","a","b","fieldTypesCompatible","bNum","aFormat","bFormat","ValidatorDef","aMask","bMask","aShape","bShape","typename","field","makeOptional","fieldDef","isPlainObjectDef","mergeObjectShapes","shapes","count","allKeys","shape","merged","presentCount","firstDef","nestedShapes","allPlainObjects","innerMerged","newDef","mask","values","typenameField","typenameValue","idField","defs","d","mergedShape","def","CaseInsensitiveSet","lowercase","existing","CASE_INSENSITIVE_SET_SEED","registerCustomHash","set","sum","hashValue","defineWrapperType","defineArray","defineRecord","defineParseResult","innerType","defineObjectOrEntity","baseMask","defineObject","addDefToUnion","unionShape","unionTypenameField","nestedMask","nestedUnion","nestedShape","defineUnion","types","internalTypes","defCount","defMask","val","finalMask","defineWithMask","cache","t","cached","optionalCache","nullableCache","nullishCache","defineNullish","defineOptional","defineNullable","defineTypename","defineConst","defineEnum","FORMAT_MASK_SHIFT","nextFormatId","FORMAT_PARSERS","FORMAT_SERIALIZERS","FORMAT_MAP","FORMAT_ID_TO_NAME","WRAPPED_VALUE","FormattedValue","formatId","eager","defineFormatted","format","getFormatName","registerFormat","name","parse","serialize","options","maskId","match","year","month","day","date","entityDefCache","getEntityDef","cls","parentProto","ParentClass","parentShape","staticCls","defineEntityType","buildConstraintFieldRefs","constraints","entry","constraintMap","pairs","constraintEntries","resolveEntityDefs","entityOrArray","defineLiveArray","opts","innerDef","defineLiveValue","valueInternalType","typeToString","formatName","unionType","parts","valStr","typeError","expectedType","isArray","typeMaskOf","draft","entity","deepClone","item","clonedMap","k","clonedSet","noopWarn","ParseContext","queryClient","preloadedEntities","warn","isPartialEvent","parseEntities","typeDef","parseData","parseEntity","obj","entityShape","parseEntityData","parseFormattedValue","e","canonical","propMask","liveConfig","parseUnionData","parseArrayData","parseRecordData","parseObjectData","unionDef","recordShape","matchingDef","array","itemShape","i","record","valueShape","objectShape","propShape","id","rawId","existingEntry","preloaded","parsedData","existingInStore","isPartial","entityDesc","fieldKey","entitySatisfiesShape","data","objectSatisfiesShape","ObjectProto","wrappingCache","wrapValue","arrayWrappingHandler","objectWrappingHandler","receiver","idx","EntityInstance","notifier","bindings","binding","refs","child","newRefs","persist","oldRefs","validatorDef","proxy","createProxy","filterEntityArray","entityKey","entityInstance","entityNotifier","shapeFields","entityClass","entityConfig","wrappedMethods","filterCache","toJSON","entityRelay","relay","state","onEvent","event","unsubscribe","baseOwnKeys","methodKey","cachedExtraMethods","ownKeysList","getOwnKeys","getters","getterKey","handler","extraGetters","extraMethods","bound","wrapped","reactiveMethod","filtered","setScopeOwner","EntityStore","persistEntity","refKeys","NetworkManager","initialStatus","initialOnlineStatus","signal","online","NoOpNetworkManager","_online","defaultNetworkManager","NetworkManagerContext","context","resolveRetryConfig","retryOption","isServer","retries","retryDelay","attempt","Query","queryDefCache","QueryDefinition","statics","createExecutionContextUtil","config","retryConfig","QueryClass","queryDefinition","resultDef","isEntityResult","rawFetchNext","controllerClass","hasSendNext","rootEntityShape","queryKeyForClass","params","queryDef","queryKeyFor","fetchQuery","args","getContext","QueryClientContext","sleep","ms","resolve","reject","timer","withRetry","fn","lastError","error","QueryInstance","queryKey","extractedParams","extractParamsForKey","deactivate","DEFAULT_GC_TIME","update","activating","wasPaused","isPaused","initialized","newExtractedParams","newStorageKey","paramsDidChange","appendMode","qc","subscribeFn","resolved","controller","freshData","debounce","staleTime","networkMode","isOnline","MutationResultImpl","task","request","response","parsedResponse","responseShape","parsedResult","effects","applyEffects","abortController","resolveTypename","entityRef","EVENT_SOURCE_FIELD","buildFieldPath","buildFieldPaths","resolveFieldPath","fp","computeConstraintHash","entityData","fieldPaths","resolveConstraintHashes","parentData","sorted","valid","getFieldNames","fieldRefs","ConstraintGroup","constraintHash","fieldSetKey","ConstraintMatcher","group","hash","eventType","onMatch","deleteData","buildKeySet","items","LiveCollectionBinding","parent","constraintHashes","parsed","collections","LiveArrayInstance","constraintFieldPaths","needsFilter","needsSort","reactiveSignal","_entityData","rawValue","oldItems","newItems","LiveValueInstance","initialValue","_value","createLiveCollection","parsedValue","inner","arrayConstraintFieldPaths","arrayConstraintHash","applyEntityRefs","rootData","seen","entityRefs","reifyAndApply","applyEntity","shouldReify","parentEntityRefs","rawKeys","existingData","isUpdate","childRefs","mergeFields","initFields","itemKey","existingValue","newVal","oldVal","isPlainObject","resolveBaseUrl","baseUrl","isSignal","isSignalCheck","extracted","QueryClient","store","SyncQueryStore","MemoryPersistentStore","log","evictionMultiplier","_c","_n","_g","rest","onlineSignal","networkWatcher","watcher","updatedAt","queryInstance","storageKey","mutationDef","mutationId","mutationInstance","parseResult","queryId","proxyKey","mergedDef","rawData","eventSource","parseCtx","created","wasNew","matched","targets","paramSubset","defId","paramsMatch","matcher","instanceParams","subset"],"mappings":"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"}