@dxos/echo 0.10.0 → 0.11.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 (274) hide show
  1. package/dist/lib/Annotation.mjs +3 -0
  2. package/dist/lib/Blob.mjs +160 -0
  3. package/dist/lib/Blob.mjs.map +1 -0
  4. package/dist/lib/Database.mjs +2 -0
  5. package/dist/lib/Entity.mjs +231 -0
  6. package/dist/lib/Entity.mjs.map +1 -0
  7. package/dist/lib/Err.mjs +105 -0
  8. package/dist/lib/Err.mjs.map +1 -0
  9. package/dist/lib/Feed.mjs +338 -0
  10. package/dist/lib/Feed.mjs.map +1 -0
  11. package/dist/lib/Filter.mjs +380 -0
  12. package/dist/lib/Filter.mjs.map +1 -0
  13. package/dist/lib/Format.mjs +47 -0
  14. package/dist/lib/Format.mjs.map +1 -0
  15. package/dist/lib/JsonSchema.mjs +21 -0
  16. package/dist/lib/JsonSchema.mjs.map +1 -0
  17. package/dist/lib/Key.mjs +15 -0
  18. package/dist/lib/Key.mjs.map +1 -0
  19. package/dist/lib/Migration.mjs +38 -0
  20. package/dist/lib/Migration.mjs.map +1 -0
  21. package/dist/lib/Obj.mjs +660 -0
  22. package/dist/lib/Obj.mjs.map +1 -0
  23. package/dist/lib/Order.mjs +65 -0
  24. package/dist/lib/Order.mjs.map +1 -0
  25. package/dist/lib/Query.mjs +336 -0
  26. package/dist/lib/Query.mjs.map +1 -0
  27. package/dist/lib/QueryResult.mjs +7 -0
  28. package/dist/lib/QueryResult.mjs.map +1 -0
  29. package/dist/lib/Ref.mjs +44 -0
  30. package/dist/lib/Ref.mjs.map +1 -0
  31. package/dist/lib/Registry.mjs +35 -0
  32. package/dist/lib/Registry.mjs.map +1 -0
  33. package/dist/lib/Relation.mjs +397 -0
  34. package/dist/lib/Relation.mjs.map +1 -0
  35. package/dist/lib/Scope.mjs +51 -0
  36. package/dist/lib/Scope.mjs.map +1 -0
  37. package/dist/lib/Tag.mjs +70 -0
  38. package/dist/lib/Tag.mjs.map +1 -0
  39. package/dist/lib/Text.mjs +82 -0
  40. package/dist/lib/Text.mjs.map +1 -0
  41. package/dist/lib/Type.mjs +371 -0
  42. package/dist/lib/Type.mjs.map +1 -0
  43. package/dist/lib/chunk-Annotation.mjs +221 -0
  44. package/dist/lib/chunk-Annotation.mjs.map +1 -0
  45. package/dist/lib/chunk-Database.mjs +918 -0
  46. package/dist/lib/chunk-Database.mjs.map +1 -0
  47. package/dist/lib/chunk-atom-snapshot.mjs +249 -0
  48. package/dist/lib/chunk-atom-snapshot.mjs.map +1 -0
  49. package/dist/lib/chunk-internal.mjs +2775 -0
  50. package/dist/lib/chunk-internal.mjs.map +1 -0
  51. package/dist/lib/chunk-json-schema.mjs +660 -0
  52. package/dist/lib/chunk-json-schema.mjs.map +1 -0
  53. package/dist/lib/chunk-number.mjs +164 -0
  54. package/dist/lib/chunk-number.mjs.map +1 -0
  55. package/dist/lib/chunk-ref-array.mjs +31 -0
  56. package/dist/lib/chunk-ref-array.mjs.map +1 -0
  57. package/dist/lib/chunk-ref.mjs +590 -0
  58. package/dist/lib/chunk-ref.mjs.map +1 -0
  59. package/dist/lib/chunk-rolldown-runtime.mjs +13 -0
  60. package/dist/lib/chunk-select.mjs +186 -0
  61. package/dist/lib/chunk-select.mjs.map +1 -0
  62. package/dist/lib/chunk-src.mjs +234 -0
  63. package/dist/lib/chunk-src.mjs.map +1 -0
  64. package/dist/lib/chunk-util.mjs +140 -0
  65. package/dist/lib/chunk-util.mjs.map +1 -0
  66. package/dist/lib/index.mjs +24 -0
  67. package/dist/lib/internal.mjs +10 -0
  68. package/dist/lib/testing.mjs +346 -0
  69. package/dist/lib/testing.mjs.map +1 -0
  70. package/dist/types/src/Aggregate.d.ts +86 -0
  71. package/dist/types/src/Aggregate.d.ts.map +1 -0
  72. package/dist/types/src/Blob.d.ts +153 -0
  73. package/dist/types/src/Blob.d.ts.map +1 -0
  74. package/dist/types/src/Blob.test.d.ts +2 -0
  75. package/dist/types/src/Blob.test.d.ts.map +1 -0
  76. package/dist/types/src/Database.d.ts +153 -4
  77. package/dist/types/src/Database.d.ts.map +1 -1
  78. package/dist/types/src/Err.d.ts +116 -0
  79. package/dist/types/src/Err.d.ts.map +1 -1
  80. package/dist/types/src/Feed.d.ts +116 -28
  81. package/dist/types/src/Feed.d.ts.map +1 -1
  82. package/dist/types/src/Feed.test.d.ts +2 -0
  83. package/dist/types/src/Feed.test.d.ts.map +1 -0
  84. package/dist/types/src/Filter.d.ts +14 -6
  85. package/dist/types/src/Filter.d.ts.map +1 -1
  86. package/dist/types/src/Hypergraph.d.ts +18 -0
  87. package/dist/types/src/Hypergraph.d.ts.map +1 -1
  88. package/dist/types/src/Json.d.ts.map +1 -1
  89. package/dist/types/src/Obj.d.ts +14 -1
  90. package/dist/types/src/Obj.d.ts.map +1 -1
  91. package/dist/types/src/Order.d.ts +9 -3
  92. package/dist/types/src/Order.d.ts.map +1 -1
  93. package/dist/types/src/Query.d.ts +107 -26
  94. package/dist/types/src/Query.d.ts.map +1 -1
  95. package/dist/types/src/Relation.d.ts +6 -0
  96. package/dist/types/src/Relation.d.ts.map +1 -1
  97. package/dist/types/src/Type.d.ts.map +1 -1
  98. package/dist/types/src/View.d.ts +1 -1
  99. package/dist/types/src/index.d.ts +2 -0
  100. package/dist/types/src/index.d.ts.map +1 -1
  101. package/dist/types/src/internal/Entity/api.d.ts +6 -0
  102. package/dist/types/src/internal/Entity/api.d.ts.map +1 -1
  103. package/dist/types/src/internal/Entity/model.d.ts +3 -2
  104. package/dist/types/src/internal/Entity/model.d.ts.map +1 -1
  105. package/dist/types/src/internal/Filter/match.d.ts.map +1 -1
  106. package/dist/types/src/internal/JsonSchema/json-schema-type.d.ts +34 -8
  107. package/dist/types/src/internal/JsonSchema/json-schema-type.d.ts.map +1 -1
  108. package/dist/types/src/internal/JsonSchema/json-schema.d.ts.map +1 -1
  109. package/dist/types/src/internal/Obj/atoms.d.ts.map +1 -1
  110. package/dist/types/src/internal/Obj/json-serializer.d.ts.map +1 -1
  111. package/dist/types/src/internal/Query/pretty.d.ts.map +1 -1
  112. package/dist/types/src/internal/Query/query-result-effect.d.ts.map +1 -1
  113. package/dist/types/src/internal/common/proxy/make-object.d.ts +13 -0
  114. package/dist/types/src/internal/common/proxy/make-object.d.ts.map +1 -1
  115. package/dist/types/src/internal/common/proxy/reactive.d.ts.map +1 -1
  116. package/dist/types/src/internal/common/proxy/symbols.d.ts.map +1 -1
  117. package/dist/types/src/internal/common/proxy/typed-handler.d.ts +12 -0
  118. package/dist/types/src/internal/common/proxy/typed-handler.d.ts.map +1 -1
  119. package/dist/types/src/internal/common/types/index.d.ts +1 -0
  120. package/dist/types/src/internal/common/types/index.d.ts.map +1 -1
  121. package/dist/types/src/internal/common/types/model-symbols.d.ts +5 -0
  122. package/dist/types/src/internal/common/types/model-symbols.d.ts.map +1 -1
  123. package/dist/types/src/internal/common/types/projection.d.ts +32 -0
  124. package/dist/types/src/internal/common/types/projection.d.ts.map +1 -0
  125. package/dist/types/tsconfig.tsbuildinfo +1 -1
  126. package/package.json +40 -35
  127. package/src/Aggregate.ts +105 -0
  128. package/src/Blob.test.ts +45 -0
  129. package/src/Blob.ts +205 -0
  130. package/src/Database.ts +207 -17
  131. package/src/Err.ts +36 -0
  132. package/src/Feed.test.ts +188 -0
  133. package/src/Feed.ts +238 -62
  134. package/src/Filter.ts +28 -10
  135. package/src/Hypergraph.ts +18 -0
  136. package/src/Json.ts +1 -0
  137. package/src/Obj.test.ts +2 -2
  138. package/src/Obj.ts +21 -1
  139. package/src/Order.ts +16 -9
  140. package/src/Query.test.ts +319 -2
  141. package/src/Query.ts +165 -51
  142. package/src/Relation.ts +14 -0
  143. package/src/Type.ts +5 -6
  144. package/src/index.ts +2 -0
  145. package/src/internal/Entity/api.ts +11 -1
  146. package/src/internal/Entity/model.ts +3 -0
  147. package/src/internal/Filter/match.ts +30 -1
  148. package/src/internal/JsonSchema/json-schema-type.ts +14 -2
  149. package/src/internal/JsonSchema/json-schema.test.ts +28 -1
  150. package/src/internal/JsonSchema/json-schema.ts +33 -6
  151. package/src/internal/Obj/atoms.ts +4 -2
  152. package/src/internal/Obj/json-serializer.test.ts +162 -2
  153. package/src/internal/Obj/json-serializer.ts +6 -0
  154. package/src/internal/Query/pretty.ts +19 -1
  155. package/src/internal/Query/query-result-effect.ts +2 -4
  156. package/src/internal/Ref/atoms.ts +1 -1
  157. package/src/internal/common/proxy/change-context.ts +1 -1
  158. package/src/internal/common/proxy/make-object.ts +42 -3
  159. package/src/internal/common/proxy/reactive.ts +5 -0
  160. package/src/internal/common/proxy/symbols.ts +1 -0
  161. package/src/internal/common/proxy/typed-handler.ts +71 -29
  162. package/src/internal/common/types/index.ts +1 -0
  163. package/src/internal/common/types/model-symbols.ts +6 -0
  164. package/src/internal/common/types/projection.ts +45 -0
  165. package/src/testing/test-data.ts +14 -14
  166. package/dist/lib/neutral/Annotation.mjs +0 -90
  167. package/dist/lib/neutral/Annotation.mjs.map +0 -7
  168. package/dist/lib/neutral/Database.mjs +0 -42
  169. package/dist/lib/neutral/Database.mjs.map +0 -7
  170. package/dist/lib/neutral/Entity.mjs +0 -76
  171. package/dist/lib/neutral/Entity.mjs.map +0 -7
  172. package/dist/lib/neutral/Err.mjs +0 -16
  173. package/dist/lib/neutral/Err.mjs.map +0 -7
  174. package/dist/lib/neutral/Feed.mjs +0 -50
  175. package/dist/lib/neutral/Feed.mjs.map +0 -7
  176. package/dist/lib/neutral/Filter.mjs +0 -72
  177. package/dist/lib/neutral/Filter.mjs.map +0 -7
  178. package/dist/lib/neutral/Format.mjs +0 -82
  179. package/dist/lib/neutral/Format.mjs.map +0 -7
  180. package/dist/lib/neutral/JsonSchema.mjs +0 -18
  181. package/dist/lib/neutral/JsonSchema.mjs.map +0 -7
  182. package/dist/lib/neutral/Key.mjs +0 -16
  183. package/dist/lib/neutral/Key.mjs.map +0 -7
  184. package/dist/lib/neutral/Migration.mjs +0 -18
  185. package/dist/lib/neutral/Migration.mjs.map +0 -7
  186. package/dist/lib/neutral/Obj.mjs +0 -128
  187. package/dist/lib/neutral/Obj.mjs.map +0 -7
  188. package/dist/lib/neutral/Order.mjs +0 -16
  189. package/dist/lib/neutral/Order.mjs.map +0 -7
  190. package/dist/lib/neutral/Query.mjs +0 -38
  191. package/dist/lib/neutral/Query.mjs.map +0 -7
  192. package/dist/lib/neutral/QueryResult.mjs +0 -2
  193. package/dist/lib/neutral/QueryResult.mjs.map +0 -7
  194. package/dist/lib/neutral/Ref.mjs +0 -25
  195. package/dist/lib/neutral/Ref.mjs.map +0 -7
  196. package/dist/lib/neutral/Registry.mjs +0 -14
  197. package/dist/lib/neutral/Registry.mjs.map +0 -7
  198. package/dist/lib/neutral/Relation.mjs +0 -97
  199. package/dist/lib/neutral/Relation.mjs.map +0 -7
  200. package/dist/lib/neutral/Scope.mjs +0 -12
  201. package/dist/lib/neutral/Scope.mjs.map +0 -7
  202. package/dist/lib/neutral/Tag.mjs +0 -32
  203. package/dist/lib/neutral/Tag.mjs.map +0 -7
  204. package/dist/lib/neutral/Text.mjs +0 -25
  205. package/dist/lib/neutral/Text.mjs.map +0 -7
  206. package/dist/lib/neutral/Type.mjs +0 -65
  207. package/dist/lib/neutral/Type.mjs.map +0 -7
  208. package/dist/lib/neutral/chunk-2HKGAQM4.mjs +0 -1394
  209. package/dist/lib/neutral/chunk-2HKGAQM4.mjs.map +0 -7
  210. package/dist/lib/neutral/chunk-2ZHECXUR.mjs +0 -95
  211. package/dist/lib/neutral/chunk-2ZHECXUR.mjs.map +0 -7
  212. package/dist/lib/neutral/chunk-3KTE2Y7Q.mjs +0 -336
  213. package/dist/lib/neutral/chunk-3KTE2Y7Q.mjs.map +0 -7
  214. package/dist/lib/neutral/chunk-3TN2VMI4.mjs +0 -714
  215. package/dist/lib/neutral/chunk-3TN2VMI4.mjs.map +0 -7
  216. package/dist/lib/neutral/chunk-42L4HJ3Z.mjs +0 -104
  217. package/dist/lib/neutral/chunk-42L4HJ3Z.mjs.map +0 -7
  218. package/dist/lib/neutral/chunk-4A2NWKRJ.mjs +0 -747
  219. package/dist/lib/neutral/chunk-4A2NWKRJ.mjs.map +0 -7
  220. package/dist/lib/neutral/chunk-7LOUAPYZ.mjs +0 -25
  221. package/dist/lib/neutral/chunk-7LOUAPYZ.mjs.map +0 -7
  222. package/dist/lib/neutral/chunk-ACFAOTKJ.mjs +0 -1531
  223. package/dist/lib/neutral/chunk-ACFAOTKJ.mjs.map +0 -7
  224. package/dist/lib/neutral/chunk-BEFR7LEA.mjs +0 -170
  225. package/dist/lib/neutral/chunk-BEFR7LEA.mjs.map +0 -7
  226. package/dist/lib/neutral/chunk-BXIKXT7Q.mjs +0 -89
  227. package/dist/lib/neutral/chunk-BXIKXT7Q.mjs.map +0 -7
  228. package/dist/lib/neutral/chunk-C57XMMBY.mjs +0 -206
  229. package/dist/lib/neutral/chunk-C57XMMBY.mjs.map +0 -7
  230. package/dist/lib/neutral/chunk-C62JYFAD.mjs +0 -183
  231. package/dist/lib/neutral/chunk-C62JYFAD.mjs.map +0 -7
  232. package/dist/lib/neutral/chunk-FSGX2R62.mjs +0 -48
  233. package/dist/lib/neutral/chunk-FSGX2R62.mjs.map +0 -7
  234. package/dist/lib/neutral/chunk-HBXT3GSB.mjs +0 -459
  235. package/dist/lib/neutral/chunk-HBXT3GSB.mjs.map +0 -7
  236. package/dist/lib/neutral/chunk-IQR45HAD.mjs +0 -31
  237. package/dist/lib/neutral/chunk-IQR45HAD.mjs.map +0 -7
  238. package/dist/lib/neutral/chunk-J5LGTIGS.mjs +0 -10
  239. package/dist/lib/neutral/chunk-J5LGTIGS.mjs.map +0 -7
  240. package/dist/lib/neutral/chunk-KCBW4BR6.mjs +0 -424
  241. package/dist/lib/neutral/chunk-KCBW4BR6.mjs.map +0 -7
  242. package/dist/lib/neutral/chunk-L3E5IXAE.mjs +0 -575
  243. package/dist/lib/neutral/chunk-L3E5IXAE.mjs.map +0 -7
  244. package/dist/lib/neutral/chunk-PRC4FEKJ.mjs +0 -56
  245. package/dist/lib/neutral/chunk-PRC4FEKJ.mjs.map +0 -7
  246. package/dist/lib/neutral/chunk-SCT6FFCR.mjs +0 -351
  247. package/dist/lib/neutral/chunk-SCT6FFCR.mjs.map +0 -7
  248. package/dist/lib/neutral/chunk-TOCVVFK2.mjs +0 -75
  249. package/dist/lib/neutral/chunk-TOCVVFK2.mjs.map +0 -7
  250. package/dist/lib/neutral/chunk-U53LSQQA.mjs +0 -41
  251. package/dist/lib/neutral/chunk-U53LSQQA.mjs.map +0 -7
  252. package/dist/lib/neutral/chunk-UGFFV2FR.mjs +0 -27
  253. package/dist/lib/neutral/chunk-UGFFV2FR.mjs.map +0 -7
  254. package/dist/lib/neutral/chunk-UWLP4RFM.mjs +0 -7
  255. package/dist/lib/neutral/chunk-UWLP4RFM.mjs.map +0 -7
  256. package/dist/lib/neutral/chunk-UZHCQ6NI.mjs +0 -283
  257. package/dist/lib/neutral/chunk-UZHCQ6NI.mjs.map +0 -7
  258. package/dist/lib/neutral/chunk-WISOH2XH.mjs +0 -36
  259. package/dist/lib/neutral/chunk-WISOH2XH.mjs.map +0 -7
  260. package/dist/lib/neutral/chunk-WKIT2YY5.mjs +0 -34
  261. package/dist/lib/neutral/chunk-WKIT2YY5.mjs.map +0 -7
  262. package/dist/lib/neutral/chunk-XB6ISRAO.mjs +0 -271
  263. package/dist/lib/neutral/chunk-XB6ISRAO.mjs.map +0 -7
  264. package/dist/lib/neutral/chunk-XXL42WCB.mjs +0 -84
  265. package/dist/lib/neutral/chunk-XXL42WCB.mjs.map +0 -7
  266. package/dist/lib/neutral/chunk-XXWK4J53.mjs +0 -117
  267. package/dist/lib/neutral/chunk-XXWK4J53.mjs.map +0 -7
  268. package/dist/lib/neutral/index.mjs +0 -115
  269. package/dist/lib/neutral/index.mjs.map +0 -7
  270. package/dist/lib/neutral/internal/index.mjs +0 -581
  271. package/dist/lib/neutral/internal/index.mjs.map +0 -7
  272. package/dist/lib/neutral/meta.json +0 -1
  273. package/dist/lib/neutral/testing/index.mjs +0 -477
  274. package/dist/lib/neutral/testing/index.mjs.map +0 -7
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/internal/common/proxy/proxy-utils.ts", "../../../src/internal/common/proxy/symbols.ts", "../../../src/internal/common/proxy/reactive.ts", "../../../src/internal/Ref/ref.ts", "../../../src/internal/Ref/atoms.ts", "../../../src/internal/Ref/utils.ts"],
4
- "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { invariant } from '@dxos/invariant';\n\nimport { type ReactiveHandler } from './proxy-types';\n\nexport const symbolIsProxy = Symbol.for('@dxos/schema/Proxy');\n\n/**\n * Marker placed on a reactive-object behaviour prototype (e.g. the typed handler's\n * `TypedObject` prototype). A record target whose prototype chain carries this marker\n * is a reactive data record — equivalent, for the purposes of the \"plain object\" gates\n * below, to one rooted directly at `Object.prototype`. This lets a handler move its\n * per-object metadata onto an intermediate prototype without those gates mistaking the\n * record for a foreign class instance.\n */\nexport const symbolReactivePrototype = Symbol.for('@dxos/echo/ReactivePrototype');\n\n/**\n * Internal api.\n */\nexport const isProxy = (value: unknown) => !!(value as any)?.[symbolIsProxy];\n\n/**\n * True if `value` is a plain data record — either rooted at `Object.prototype` or carrying\n * a reactive behaviour prototype (see {@link symbolReactivePrototype}).\n */\nexport const isReactiveRecord = (value: any): boolean => {\n const proto = Object.getPrototypeOf(value);\n return proto === Object.prototype || (proto != null && !!proto[symbolReactivePrototype]);\n};\n\nexport const isValidProxyTarget = (value: any): value is object => {\n if (value == null || value[symbolIsProxy]) {\n return false;\n }\n if (Array.isArray(value)) {\n return true;\n }\n\n return typeof value === 'object' && isReactiveRecord(value);\n};\n\n/**\n * @deprecated\n */\nexport const getProxySlot = <T extends object>(proxy: any): ProxyHandlerSlot<T> => {\n const value = (proxy as any)[symbolIsProxy];\n invariant(value instanceof ProxyHandlerSlot);\n return value;\n};\n\nexport const getProxyTarget = <T extends object>(proxy: any): T => {\n return getProxySlot<T>(proxy).target;\n};\n\nexport const getProxyHandler = <T extends object>(proxy: any): ReactiveHandler<T> => {\n return getProxySlot<T>(proxy).handler;\n};\n\n/**\n * Clamp a splice range to `Array.prototype.splice` semantics for a string of the given `length`:\n * a negative `start` counts from the end, a `start` past the end appends, and `deleteCount` is bounded\n * to the remaining characters. Shared by both reactive handlers so the string CRDT API behaves\n * identically across the in-memory and Automerge backends (Automerge's `splice` otherwise throws on\n * out-of-range indices).\n */\nexport const normalizeSpliceRange = (\n length: number,\n start: number,\n deleteCount: number,\n): { start: number; deleteCount: number } => {\n const safeStart = start < 0 ? Math.max(length + start, 0) : Math.min(start, length);\n const safeDeleteCount = Math.max(0, Math.min(deleteCount, length - safeStart));\n return { start: safeStart, deleteCount: safeDeleteCount };\n};\n\n/**\n * Unsafe method to override id for debugging/testing and migration purposes.\n * @deprecated\n */\nexport const dangerouslySetProxyId = <T>(obj: T, id: string) => {\n (getProxySlot(obj).target as any).id = id;\n};\n\n/**\n * Create a reactive proxy object.\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy\n *\n * @param target Object or array. Passing in array will enable array methods.\n * @param handler ReactiveHandler instance.\n */\n// TODO(burdon): Document.\n// TODO(burdon): Tests for low-level functions.\nexport const createProxy = <T extends object>(target: T, handler: ReactiveHandler<T>): T => {\n const existingProxy = handler._proxyMap.get(target);\n if (existingProxy) {\n return existingProxy;\n }\n\n // TODO(dmaretskyi): In the future this should be mutable to allow replacing the handler on-the-fly while maintaining the proxy identity.\n const proxy = new Proxy(target, new ProxyHandlerSlot<T>(target, handler));\n handler.init(target);\n\n // TODO(dmaretskyi): Check if this will actually work; maybe a global WeakMap is better?\n handler._proxyMap.set(target, proxy);\n return proxy;\n};\n\n/**\n * Passed as the handler to the Proxy constructor.\n * Maintains a mutable slot for the actual handler.\n */\nclass ProxyHandlerSlot<T extends object> implements ProxyHandler<T> {\n /**\n * @param target Original object.\n * @param _handler Handles intercepted operations.\n */\n constructor(\n readonly target: T,\n private _handler: ReactiveHandler<T>,\n ) {}\n\n get handler() {\n invariant(this._handler);\n return this._handler;\n }\n\n // TODO(burdon): Requires comment.\n setHandler(handler: ReactiveHandler<T>): void {\n this._handler = handler;\n }\n\n /**\n * Get value.\n */\n get(target: T, prop: string | symbol, receiver: any): any {\n if (prop === symbolIsProxy) {\n return this;\n }\n\n if (!this._handler || !this._handler.get) {\n return Reflect.get(target, prop, receiver);\n }\n\n return this._handler.get(target, prop, receiver);\n }\n\n static {\n const TRAPS: (keyof ProxyHandler<any>)[] = [\n 'apply',\n 'construct',\n 'defineProperty',\n 'deleteProperty',\n 'get',\n 'getOwnPropertyDescriptor',\n 'getPrototypeOf',\n 'has',\n 'isExtensible',\n 'ownKeys',\n 'preventExtensions',\n 'set',\n 'setPrototypeOf',\n ];\n\n for (const trap of TRAPS) {\n if (trap === 'get') {\n continue;\n }\n\n Object.defineProperty(this.prototype, trap, {\n enumerable: false,\n value: function (this: ProxyHandlerSlot<any>, ...args: any[]) {\n // log.info('trap', { trap, args });\n if (!this._handler || !this._handler[trap]) {\n return (Reflect[trap] as Function)(...args);\n }\n\n return (this._handler[trap] as Function).apply(this._handler, args);\n },\n });\n }\n }\n}\n", "//\n// Copyright 2024 DXOS.org\n//\n\n// TODO(dmaretskyi): Rename all symbols that are props to end with *Key.\nexport const EventId = Symbol.for('@dxos/live-object/EventId');\nexport const ChangeId = Symbol.for('@dxos/live-object/ChangeId');\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type RefTypeId } from '../../Ref/ref';\nimport { getProxyTarget, isProxy } from './proxy-utils';\nimport { ChangeId, EventId } from './symbols';\n\n/**\n * Subscribe to changes on a reactive object.\n * @param obj - The reactive object to subscribe to.\n * @param callback - Called when the object changes.\n * @returns Unsubscribe function.\n */\n// TODO(wittjosiah): Consider throwing if obj doesn't have EventId instead of returning no-op.\nexport const subscribe = (obj: unknown, callback: () => void): (() => void) => {\n // Guard against non-reactive inputs (queue-stored typed objects, snapshots, plain shapes\n // with branded symbols) before `getProxyTarget`'s `ProxyHandlerSlot` invariant kicks in.\n // `Obj.isObject` (KindId-based) is satisfied by these inputs, so callers like\n // `Atom.family((obj) => Atom.make((get) => Obj.subscribe(obj, ...)))` legitimately reach\n // here with a non-proxy. Falling back to a no-op preserves the documented contract that\n // values without subscription support get a no-op unsubscribe.\n if (!isProxy(obj)) {\n return () => {};\n }\n const target = getProxyTarget(obj as any);\n if (target && EventId in target) {\n return (target as any)[EventId].on(callback);\n }\n return () => {};\n};\n\n/**\n * Deeply removes readonly modifiers from all properties of T.\n * Inside Obj.update, all properties are fully mutable regardless of schema definition.\n * Ref types are preserved as-is since they are value-like objects that are replaced, not mutated.\n * Primitive types (including branded primitives) are preserved as-is.\n */\nexport type Mutable<T> = T extends string | number | boolean | bigint | symbol | null | undefined\n ? T // Primitives (including branded primitives like JsonPath) stay as-is.\n : T extends { [RefTypeId]: any }\n ? T // Keep Ref types as-is (they're value-like, not mutated in place).\n : T extends object\n ? T extends readonly (infer U)[]\n ? Mutable<U>[]\n : { -readonly [K in keyof T]: Mutable<T[K]> }\n : T;\n\n/**\n * Callback type for the change function.\n */\nexport type ChangeCallback<T> = (mutableObj: Mutable<T>) => void;\n\n/**\n * Perform mutations on a reactive object within a change context.\n *\n * If the object has a change handler (via ChangeId), it will be called with the callback.\n * This allows handlers to implement features like:\n * - Readonly enforcement (mutations only allowed within change context)\n * - Batched notifications (single notification for all mutations in the callback)\n * - Transaction semantics\n *\n * If the object doesn't have a change handler, the callback is called directly.\n *\n * @param obj - The reactive object to mutate.\n * @param callback - Callback that receives a mutable view of the object.\n */\nexport const change = <T>(obj: T, callback: ChangeCallback<T>): void => {\n // Check proxy first (allows handler to intercept), then fall back to target.\n // This order is important for EchoReactiveHandler which handles ChangeId in the proxy trap.\n const changeFn = (obj as any)[ChangeId];\n if (changeFn) {\n changeFn(callback);\n } else {\n callback(obj as Mutable<T>);\n }\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport type * as Atom from '@effect-atom/atom/Atom';\nimport * as Effect from 'effect/Effect';\nimport * as Equal from 'effect/Equal';\nimport * as Hash from 'effect/Hash';\nimport * as Option from 'effect/Option';\nimport * as ParseResult from 'effect/ParseResult';\nimport * as Pipeable from 'effect/Pipeable';\nimport * as Schema from 'effect/Schema';\nimport * as SchemaAST from 'effect/SchemaAST';\nimport type * as Types from 'effect/Types';\n\nimport { Event } from '@dxos/async';\nimport { type CustomInspectFunction, inspectCustom } from '@dxos/debug';\nimport { EncodedReference } from '@dxos/echo-protocol';\nimport { assertArgument, invariant } from '@dxos/invariant';\nimport { DXN, EID, EntityId, type URI } from '@dxos/keys';\n\nimport * as Database from '../../Database';\nimport type * as Type from '../../Type';\nimport {\n ReferenceAnnotationId,\n getSchemaURI,\n getTypeAnnotation,\n getTypeIdentifierAnnotation,\n} from '../Annotation/annotations';\nimport { type AnyEntity, type AnyProperties, type UnknownTypeSchema, getStaticTypeSchema } from '../common/types';\nimport { type JsonSchemaType } from '../JsonSchema';\nimport * as RefAtoms from './atoms';\n\n/**\n * The `$id` and `$ref` fields for an ECHO reference schema.\n */\nexport const JSON_SCHEMA_ECHO_REF_ID = '/schemas/echo/ref';\n\nexport const getSchemaReference = (property: JsonSchemaType): { typename: string } | undefined => {\n const { $id, reference: { schema: { $ref } = {} } = {} } = property;\n if ($id === JSON_SCHEMA_ECHO_REF_ID && $ref) {\n const parsed = DXN.tryMake($ref);\n const typename = parsed ? DXN.getName(parsed) : undefined;\n return typename ? { typename } : undefined;\n }\n};\n\nexport const createSchemaReference = (typename: string): Types.DeepMutable<JsonSchemaType> => {\n return {\n $id: JSON_SCHEMA_ECHO_REF_ID,\n reference: {\n schema: {\n $ref: DXN.make(typename),\n },\n },\n };\n};\n\n/**\n * Runtime type-info for a reference extracted from effect AST.\n */\nexport type RefereneAST = {\n /**\n * Typename of linked schema.\n */\n typename: string;\n\n /**\n * Version of linked schema.\n */\n version: string;\n};\n\nexport const getReferenceAst = (ast: SchemaAST.AST): RefereneAST | undefined => {\n if (ast._tag !== 'Declaration' || !ast.annotations[ReferenceAnnotationId]) {\n return undefined;\n }\n return {\n typename: (ast.annotations[ReferenceAnnotationId] as any).typename,\n version: (ast.annotations[ReferenceAnnotationId] as any).version,\n };\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport const RefTypeId: unique symbol = Symbol.for('@dxos/echo/internal/Ref') as any;\n\n/**\n * Reference Schema.\n */\nexport interface RefSchema<T extends AnyEntity> extends Schema.SchemaClass<Ref<T>, EncodedReference> {}\n\n/**\n * Type of the `Ref` function and extra methods attached to it.\n */\nexport interface RefFn {\n // A reference target is a `Type.AnyEntity` entity (the canonical Option B\n // input) or one of the well-known \"any object\" / \"any relation\" branded\n // schemas (`Obj.Unknown` / `Relation.Unknown`). Arbitrary raw schemas are\n // rejected.\n //\n // Referencing a type-kind entity (a meta-schema, e.g. `Type.Type`) yields a\n // reference to a stored schema record; its loaded target is any registered\n // entity (`Type.AnyEntity`), since a stored object/relation schema is itself a\n // `Type.Type` record. Referencing an object/relation type yields a reference\n // to an instance of that type.\n <S extends Type.AnyEntity | UnknownTypeSchema<any, any> = Type.AnyEntity>(\n schema: S,\n ): RefSchema<\n S extends Type.AnyType\n ? Type.AnyEntity\n : S extends Type.AnyObj | Type.AnyRelation\n ? Type.InstanceType<S>\n : S extends UnknownTypeSchema<infer A, any>\n ? A\n : never\n >;\n\n /**\n * @returns True if the object is a reference.\n */\n isRef: (obj: unknown) => obj is Ref<any>;\n\n /**\n * @returns True if the reference points to the given object id.\n */\n hasEntityId: (id: EntityId) => (ref: Ref<any>) => boolean;\n\n /**\n * @returns True if the schema is a reference schema.\n */\n isRefSchema: (schema: Schema.Schema<any, any>) => schema is RefSchema<any>;\n\n /**\n * @returns True if the schema AST is a reference schema.\n */\n isRefSchemaAST: (ast: SchemaAST.AST) => boolean;\n\n /**\n * Constructs a reference that points to the given object.\n */\n // TODO(burdon): Narrow to Obj.Unknown?\n make: <T extends AnyEntity>(object: T) => Ref<T>;\n\n /**\n * Constructs a reference that points to the object specified by the provided URI\n * (either an `echo:` EID for an object reference or a `dxn:` DXN for a type reference).\n */\n fromURI: (uri: URI.URI) => Ref<any>;\n}\n\n/**\n * Schema builder for references.\n */\nexport const Ref: RefFn = (input: any): RefSchema<any> => {\n // `Type.Type` entities carry their source schema on the hidden slot; the\n // branded `Obj.Unknown` / `Relation.Unknown` schemas are used directly.\n const schema = getStaticTypeSchema(input) ?? input;\n assertArgument(Schema.isSchema(schema), 'schema', 'Must call with an instance of effect-schema');\n const annotation = getTypeAnnotation(schema);\n if (annotation == null) {\n throw new Error('Reference target must be an ECHO schema.');\n }\n\n return createEchoReferenceSchema(getTypeIdentifierAnnotation(schema), annotation.typename, annotation.version);\n};\n\n/**\n * Represents materialized reference to a target.\n * This is the data type for the fields marked as ref.\n */\nexport interface Ref<T> extends Pipeable.Pipeable {\n /**\n * Target URI (either an `echo:` EID for an object reference or a `dxn:` DXN for a type reference).\n */\n get uri(): URI.URI;\n\n /**\n * Returns true if the reference has a target available (inlined or resolver set).\n */\n get isAvailable(): boolean;\n\n /**\n * @returns The reference target.\n * May return `undefined` if the object is not loaded in the working set.\n * Accessing this property, even if it returns `undefined` will trigger the object to be loaded to the working set.\n */\n get target(): T | undefined;\n\n /**\n * @returns Promise that will resolves with the target object.\n * Will load the object from disk if it is not present in the working set.\n * Short-circuits immediately when the target is already loaded.\n * @throws If the object is not available locally.\n *\n * @idiom org.dxos.echo.refLoad\n * applies: Resolving a ref inside an async function or Effect handler — guarantees the object is available before proceeding\n * instead-of: `ref.target` — not guaranteed to be defined in async contexts; use `await ref.load()` (or `yield* Database.load(ref)` in Effect) to ensure the target is present\n * uses: {@link load}\n * related: org.dxos.echo-react.useObjectReactive\n */\n load(): Promise<T>;\n\n /**\n * @returns Promise that will resolves with the target object or undefined if the object is not loaded locally.\n */\n\n tryLoad(): Promise<T | undefined>;\n\n /**\n * Subscribe to the ref's resolution event.\n * The callback fires when the target object becomes available in the working set\n * (e.g. when its document is loaded after sibling-client mutation).\n * Note: the resolver only schedules a notification when the target is requested\n * via {@link target} while it is not yet loaded.\n * @returns Function that unsubscribes the callback.\n */\n onResolved(callback: () => void): () => void;\n\n /**\n * Do not inline the target object in the reference.\n * Makes .target unavailable unless the reference is connected to a database context.\n *\n * When serialized with toJSON, the difference is between:\n * `{ \"/\": \"dxn:...\" }`\n * and\n * `{ \"/\": \"dxn:...\", \"target\": { ... } }`\n *\n * Clones the reference object.\n */\n noInline(): Ref<T>;\n\n /**\n * Read-only atom for the ref target.\n * Resolves once when the target loads; does NOT subscribe to target object mutations.\n * Use `Obj.atom(ref)` if you need reactive snapshots that update on every object mutation.\n */\n get atom(): Atom.Atom<T | undefined>;\n\n /**\n * Serializes the reference to a JSON object.\n * The serialization format is compatible with the IPLD-style encoded references.\n * When a reference has a saved target (i.e. the target or object holding the reference is not in the database),\n * the target is included in the serialized object.\n *\n * Examples:\n * `{ \"/\": \"dxn:...\" }`\n * `{ \"/\": \"dxn:...\", \"target\": { ... } }`\n */\n encode(): EncodedReference;\n\n [RefTypeId]: {\n _T: T;\n };\n}\n\nexport declare namespace Ref {\n /**\n * Target of the reference.\n */\n export type Target<R> = R extends Ref<infer U> ? U : never;\n}\n\nRef.isRef = (obj: any): obj is Ref<any> => {\n return obj != null && typeof obj === 'object' && RefTypeId in obj;\n};\n\nRef.hasEntityId = (id: EntityId) => (ref: Ref<any>) => {\n const uri = EID.tryParse(ref.uri);\n return uri !== undefined && EID.isLocal(uri) && EID.getEntityId(uri) === id;\n};\n\nRef.isRefSchema = (schema: Schema.Schema<any, any>): schema is RefSchema<any> => {\n return Ref.isRefSchemaAST(schema.ast);\n};\n\nRef.isRefSchemaAST = (ast: SchemaAST.AST): boolean => {\n return SchemaAST.getAnnotation(ast, ReferenceAnnotationId).pipe(Option.isSome);\n};\n\nRef.make = <T extends AnyProperties>(obj: T): Ref<T> => {\n if (typeof obj !== 'object' || obj === null) {\n throw new TypeError('Expected: ECHO object.');\n }\n\n // TODO(dmaretskyi): Extract to `getObjectEchoUri` function.\n const id = obj.id;\n invariant(EntityId.isValid(id), 'Invalid object ID');\n const uri = EID.make({ entityId: id });\n const ref = new RefImpl(uri, obj);\n return ref;\n};\n\nRef.fromURI = (uri: URI.URI): Ref<any> => {\n assertArgument(typeof uri === 'string', 'uri', 'Expected URI string');\n return new RefImpl(uri);\n};\n\n/**\n * `reference` field on the schema object.\n */\nexport type JsonSchemaReferenceInfo = {\n schema: { $ref: string };\n schemaVersion?: string;\n};\n\n/**\n * @internal\n */\n// TODO(burdon): Move to json schema and make private?\nexport const createEchoReferenceSchema = (\n echoUri: string | undefined,\n typename: string | undefined,\n version: string | undefined,\n): Schema.SchemaClass<Ref<any>, EncodedReference> => {\n if (!echoUri && !typename) {\n throw new TypeError('Either echoUri or typename must be provided.');\n }\n\n const referenceInfo: JsonSchemaReferenceInfo = {\n schema: {\n // TODO(dmaretskyi): Include version?\n $ref: echoUri ?? DXN.make(typename!),\n },\n schemaVersion: version,\n };\n\n // TODO(dmaretskyi): Add name and description.\n const refSchema = Schema.declare<Ref<any>, EncodedReference, []>(\n [],\n {\n encode: () => {\n return (value) =>\n Effect.gen(function* () {\n if (Ref.isRef(value)) {\n return EncodedReference.fromURI((value as Ref<any>).uri);\n } else if (EncodedReference.isEncodedReference(value)) {\n return value;\n }\n throw new Error('Invalid reference');\n });\n },\n decode: () => {\n return (value) =>\n Effect.gen(function* () {\n const dbService = yield* Effect.serviceOption(Database.Service);\n\n // TODO(dmaretskyi): This branch seems to be taken by Schema.is\n if (Ref.isRef(value)) {\n if (Option.isSome(dbService)) {\n return dbService.value.db.makeRef(value.uri);\n } else {\n return value;\n }\n }\n\n if (!EncodedReference.isEncodedReference(value)) {\n return yield* Effect.fail(new ParseResult.Unexpected(value, 'reference'));\n }\n if (Option.isSome(dbService)) {\n return dbService.value.db.makeRef(EncodedReference.toURI(value));\n } else {\n return Ref.fromURI(EncodedReference.toURI(value));\n }\n });\n },\n },\n {\n jsonSchema: {\n // TODO(dmaretskyi): We should remove `$id` and keep `$ref` with a fully qualified name.\n $id: JSON_SCHEMA_ECHO_REF_ID,\n $ref: JSON_SCHEMA_ECHO_REF_ID,\n reference: referenceInfo,\n },\n [ReferenceAnnotationId]: {\n typename: typename ?? '',\n version,\n },\n },\n );\n\n return refSchema;\n};\n\nconst getSchemaExpectedName = (ast: SchemaAST.Annotated): string | undefined => {\n return SchemaAST.getIdentifierAnnotation(ast).pipe(\n Option.orElse(() => SchemaAST.getTitleAnnotation(ast)),\n Option.orElse(() => SchemaAST.getDescriptionAnnotation(ast)),\n Option.getOrElse(() => undefined),\n );\n};\n\n/**\n * Load-source ceiling for a resolution request. Cheaper tiers are always probed first; the\n * ceiling caps how far a request is allowed to reach:\n * - `working-set`: synchronous, in-memory only. A miss settles `unavailable` immediately.\n * - `disk`: probe the working set, then local storage; never the network.\n * - `network`: probe the working set, disk, then fetch from peers.\n *\n * `unavailable` is always relative to the requested ceiling (disk-unavailable ≠ network-unavailable).\n */\nexport type RefSource = 'working-set' | 'disk' | 'network';\n\n/**\n * A stateful, closure-aware handle to an in-flight (or settled) reference resolution.\n *\n * `ready` means the entity is FULLY USABLE: its own body and its strong-dependency closure are all\n * materialized. The body-vs-closure split is internal; `requesting` transparently covers \"a\n * dependency is still loading\".\n */\nexport interface RefResolverRequest {\n /**\n * `pending` is a one-way entry state (never re-entered). `requesting` means the body and/or\n * closure is still loading. `ready` means fully usable. `unavailable` means unreachable at the\n * requested ceiling.\n */\n readonly state: 'pending' | 'requesting' | 'ready' | 'unavailable';\n\n /**\n * Fires (deferred to a microtask) whenever {@link state} changes.\n */\n readonly stateChanged: Event<void>;\n\n /**\n * Synchronous snapshot of the resolved entity; defined iff `state === 'ready'`.\n */\n getResult(): AnyProperties | undefined;\n\n /**\n * Settles when `state ∈ {ready, unavailable}`.\n */\n wait(): Promise<AnyProperties | undefined>;\n\n /**\n * Decrements the refcount on the shared load op(s); cancels the underlying IO at zero.\n */\n abort(): void;\n}\n\nexport interface RefResolver {\n /**\n * Resolve a reference, returning a stateful handle. `source` is a required ceiling; cheaper\n * tiers are always probed first.\n */\n resolve(uri: URI.URI, options: { source: RefSource }): RefResolverRequest;\n\n /**\n * Resolve ref synchronously from the objects in the working set.\n *\n * @param uri\n * @param load If true the resolver should attempt to load the object from disk.\n * @param onLoad Callback to call when the object is loaded.\n * @deprecated Use {@link resolve} with `{ source: 'working-set' }`. Removed in Task 11.\n */\n resolveSync(uri: URI.URI, load: boolean, onLoad?: () => void): AnyProperties | undefined;\n\n /**\n * Resolver ref asynchronously.\n * @deprecated Use {@link resolve} with `{ source: 'network' }`. Removed in Task 11.\n */\n resolveLegacy(uri: URI.URI): Promise<AnyProperties | undefined>;\n\n /**\n * @deprecated Use {@link resolve} + `Type.getSchema`. Removed in Task 11.\n */\n resolveSchema(uri: URI.URI): Promise<Schema.Schema.AnyNoContext | undefined>;\n\n /**\n * Resolve the source `Type.AnyEntity` entity for a type URI. Used by\n * deserialization paths (`Obj.fromJSON`) to set the back-reference accessed\n * via `Obj.getType` / `Entity.getType`. Optional — resolvers that only\n * carry raw schemas may leave this unimplemented; the deserializer falls\n * back to leaving the type entity unset.\n * @deprecated Use {@link resolve}. Removed in Task 11.\n */\n resolveType?(uri: URI.URI): Promise<unknown | undefined>;\n}\n\n/**\n * A settled {@link RefResolverRequest} with a fixed `state` and `result`, used by resolvers\n * whose backends are fully synchronous (e.g. {@link StaticRefResolver}).\n */\nexport const makeSettledRequest = (\n state: RefResolverRequest['state'],\n result: AnyProperties | undefined,\n): RefResolverRequest => ({\n state,\n stateChanged: new Event<void>(),\n getResult: () => (state === 'ready' ? result : undefined),\n wait: async () => (state === 'ready' ? result : undefined),\n abort: () => {},\n});\n\nexport class RefImpl<T> implements Ref<T> {\n [RefTypeId] = refVariance;\n\n #uri: URI.URI;\n\n /**\n * Target is set when the reference is created from a specific object.\n * In this case, the target might not be in the database.\n */\n #target: T | undefined = undefined;\n\n #resolver?: RefResolver = undefined;\n #resolved = new Event<void>();\n\n /**\n * Callback to issue a reactive notification when object is resolved.\n */\n #resolverCallback = () => {\n this.#resolved.emit();\n };\n\n constructor(uri: URI.URI, target?: T) {\n this.#uri = uri;\n this.#target = target;\n }\n\n /**\n * @inheritdoc\n */\n get uri(): URI.URI {\n return this.#uri;\n }\n\n /**\n * @inheritdoc\n */\n get target(): T | undefined {\n if (this.#target) {\n return this.#target;\n }\n\n invariant(this.#resolver, 'Resolver is not set');\n return this.#resolver.resolveSync(this.#uri, true, this.#resolverCallback) as T | undefined;\n }\n\n /**\n * @inheritdoc\n */\n get isAvailable(): boolean {\n return this.#target !== undefined || this.#resolver !== undefined;\n }\n\n get atom(): Atom.Atom<T | undefined> {\n return RefAtoms.refSimpleFamily(this);\n }\n\n /**\n * @inheritdoc\n */\n async load(): Promise<T> {\n if (this.#target) {\n return this.#target;\n }\n invariant(this.#resolver, 'Resolver is not set');\n const obj = await this.#resolver.resolveLegacy(this.#uri);\n if (obj == null) {\n throw new Error('Object not found');\n }\n return obj as T;\n }\n\n /**\n * @inheritdoc\n */\n async tryLoad(): Promise<T | undefined> {\n if (this.#target) {\n return this.#target;\n }\n invariant(this.#resolver, 'Resolver is not set');\n return (await this.#resolver.resolveLegacy(this.#uri)) as T | undefined;\n }\n\n /**\n * @inheritdoc\n */\n onResolved(callback: () => void): () => void {\n return this.#resolved.on(callback);\n }\n\n /**\n * Do not inline the target object in the reference.\n * Makes .target unavailable unless the reference is connected to a database context.\n * Clones the reference object.\n */\n noInline(): RefImpl<T> {\n const ref = new RefImpl<T>(this.#uri, undefined);\n ref.#resolver = this.#resolver;\n return ref;\n }\n\n encode(): EncodedReference {\n return {\n '/': this.#uri,\n ...(this.#target ? { target: this.#target } : {}),\n };\n }\n\n /**\n * Serializes the reference to a JSON object.\n * The serialization format is compatible with the IPLD-style encoded references.\n * When a reference has a saved target (i.e. the target or object holding the reference is not in the database),\n * the target is included in the serialized object.\n */\n toJSON(): EncodedReference {\n return this.encode();\n }\n\n toString(): string {\n if (this.#target) {\n return `Ref(${this.#target.toString()})`;\n }\n\n return `Ref(${this.#uri.toString()})`;\n }\n\n [inspectCustom]: CustomInspectFunction = (depth, options, inspect) => {\n return this.toString();\n };\n\n /**\n * Effect Hash trait. Required for MutableHashMap-based caches (e.g., Atom.family)\n * to deduplicate Ref instances that point to the same object.\n * ECHO proxies return new RefImpl instances on every property access,\n * so without this, each access would create a separate cache entry.\n */\n [Hash.symbol](): number {\n return Hash.hash(this.#uri.toString());\n }\n\n /** Effect Equal trait. See {@link Hash.symbol} for rationale. */\n [Equal.symbol](that: Equal.Equal): boolean {\n return that instanceof RefImpl && this.#uri === that.uri;\n }\n\n pipe() {\n // eslint-disable-next-line prefer-rest-params\n return Pipeable.pipeArguments(this, arguments);\n }\n\n /**\n * @internal\n */\n _setResolver(resolver: RefResolver): void {\n this.#resolver = resolver;\n }\n\n /**\n * @internal\n */\n _getSavedTarget(): T | undefined {\n return this.#target;\n }\n}\n\n/**\n * Internal API for setting the reference resolver.\n */\nexport const setRefResolver = (ref: Ref<any>, resolver: RefResolver) => {\n invariant(ref instanceof RefImpl, 'Ref is not an instance of RefImpl');\n ref._setResolver(resolver);\n};\n\n/**\n * Internal API for getting the saved target on a reference.\n */\nexport const getRefSavedTarget = (ref: Ref<any>): AnyProperties | undefined => {\n invariant(ref instanceof RefImpl, 'Ref is not an instance of RefImpl');\n return ref._getSavedTarget();\n};\n\n// Used to validate reference target type.\nconst refVariance: Ref<any>[typeof RefTypeId] = {\n _T: null as any,\n};\n\nexport const refFromEncodedReference = (encodedReference: EncodedReference, resolver?: RefResolver): Ref<any> => {\n const uri = EncodedReference.toURI(encodedReference);\n const ref = new RefImpl(uri);\n\n // TODO(dmaretskyi): Handle inline target in the encoded reference.\n\n if (resolver) {\n setRefResolver(ref, resolver);\n }\n return ref;\n};\n\nexport class StaticRefResolver implements RefResolver {\n public objects = new Map<EntityId, AnyProperties>();\n public schemas = new Map<URI.URI, Schema.Schema.AnyNoContext>();\n\n addObject(obj: AnyProperties): this {\n this.objects.set(obj.id, obj);\n return this;\n }\n\n addSchema(input: Type.AnyEntity): this {\n const schema = getStaticTypeSchema(input);\n invariant(schema, 'Type entity is missing its source schema');\n const uri = getSchemaURI(schema);\n invariant(uri, 'Schema has no URI');\n this.schemas.set(uri, schema);\n return this;\n }\n\n resolve(uri: URI.URI, _options: { source: RefSource }): RefResolverRequest {\n const obj = this.#lookup(uri);\n return makeSettledRequest(obj ? 'ready' : 'unavailable', obj);\n }\n\n resolveSync(uri: URI.URI, _load: boolean, _onLoad?: () => void): AnyProperties | undefined {\n return this.#lookup(uri);\n }\n\n async resolveLegacy(uri: URI.URI): Promise<AnyProperties | undefined> {\n return this.#lookup(uri);\n }\n\n async resolveSchema(uri: URI.URI): Promise<Schema.Schema.AnyNoContext | undefined> {\n return this.schemas.get(uri);\n }\n\n #lookup(uri: URI.URI): AnyProperties | undefined {\n const echoUri = EID.tryParse(uri);\n const id = echoUri ? EID.getEntityId(echoUri) : undefined;\n if (id == null) {\n return undefined;\n }\n return this.objects.get(id);\n }\n}\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Atom from '@effect-atom/atom/Atom';\n\nimport { subscribe } from '../common/proxy/reactive';\nimport { ObjectDeletedId } from '../common/types/model-symbols';\nimport type { Ref } from './ref';\nimport { loadRefTarget } from './utils';\n\n/**\n * Atom family for ECHO refs.\n * Uses ref reference as key — same ref returns same atom.\n * Subscribes to target object changes and resolves to undefined when the target is deleted.\n */\nexport const refSimpleFamily = Atom.family(<T>(ref: Ref<T>): Atom.Atom<T | undefined> => {\n return Atom.make<T | undefined>((get) => {\n let unsubscribeTarget: (() => void) | undefined;\n\n const setupSubscription = (target: T): T | undefined => {\n // Release any previous subscription before re-subscribing (loadRefTarget may call this more than once).\n // T has no ECHO-proxy constraint at this generic level; `subscribe` and ObjectDeletedId\n // both require the internal proxy shape that cannot be expressed statically here.\n unsubscribeTarget?.();\n unsubscribeTarget = subscribe(target as any, () => {\n const deleted = !!(target as any)[ObjectDeletedId];\n get.setSelf(deleted ? undefined : target);\n });\n const deleted = !!(target as any)[ObjectDeletedId];\n return deleted ? undefined : target;\n };\n\n get.addFinalizer(() => {\n unsubscribeTarget?.();\n });\n\n return loadRefTarget(ref, get, setupSubscription);\n });\n});\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport type * as Atom from '@effect-atom/atom/Atom';\n\nimport type { Ref } from './ref';\n\n/**\n * Internal helper for loading ref targets in atoms.\n * Handles the common pattern of checking for loaded target and triggering async load.\n */\nexport const loadRefTarget = <T, R>(\n ref: Ref<T>,\n get: Atom.Context,\n onTargetAvailable: (target: T) => R,\n): R | undefined => {\n // Accessing `ref.target` registers a resolution callback when the target is\n // not yet loaded, so resolution can be observed via `ref.onResolved` below.\n const currentTarget = ref.target;\n if (currentTarget) {\n return onTargetAvailable(currentTarget);\n }\n\n // Subscribe to the ref's resolution event in case the target loads later.\n const unsubscribe = ref.onResolved(() => {\n const target = ref.target;\n if (target) {\n get.setSelf(onTargetAvailable(target));\n }\n });\n get.addFinalizer(unsubscribe);\n\n // Also try async load (e.g. for objects that need disk loading).\n void ref\n .load()\n .then((loadedTarget) => {\n get.setSelf(onTargetAvailable(loadedTarget));\n })\n .catch(() => {\n // Loading failed; the resolution subscription above will pick up cross-client updates.\n });\n\n return undefined;\n};\n"],
5
- "mappings": "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",
6
- "names": ["invariant", "symbolIsProxy", "proto", "prototype", "isValidProxyTarget", "value", "Array", "isArray", "ProxyHandlerSlot", "getProxyHandler", "safeDeleteCount", "Math", "deleteCount", "length", "start", "safeStart", "existingProxy", "handler", "_proxyMap", "set", "_handler", "setHandler", "get", "target", "prop", "receiver", "Object", "trap", "apply", "EventId", "Symbol", "for", "ChangeId", "subscribe", "obj", "callback", "isProxy", "target", "getProxyTarget", "EventId", "on", "change", "changeFn", "ChangeId", "Effect", "Equal", "Hash", "Option", "ParseResult", "Pipeable", "Schema", "SchemaAST", "Event", "inspectCustom", "EncodedReference", "assertArgument", "invariant", "DXN", "EID", "EntityId", "Atom", "loadRefTarget", "ref", "get", "onTargetAvailable", "currentTarget", "target", "unsubscribe", "onResolved", "setSelf", "addFinalizer", "load", "then", "loadedTarget", "catch", "undefined", "refSimpleFamily", "family", "ref", "make", "get", "unsubscribeTarget", "setupSubscription", "target", "subscribe", "deleted", "ObjectDeletedId", "setSelf", "undefined", "addFinalizer", "loadRefTarget", "__dxlog_file", "reference", "$ref", "$id", "JSON_SCHEMA_ECHO_REF_ID", "parsed", "tryMake", "typename", "getName", "undefined", "schema", "version", "annotation", "getTypeAnnotation", "Error", "createEchoReferenceSchema", "isRef", "obj", "hasEntityId", "ref", "uri", "isRefSchema", "isRefSchemaAST", "ast", "make", "TypeError", "EID", "entityId", "id", "fromURI", "RefImpl", "referenceInfo", "schemaVersion", "Effect", "gen", "EncodedReference", "value", "Ref", "dbService", "Option", "isSome", "jsonSchema", "ReferenceAnnotationId", "getSchemaExpectedName", "stateChanged", "Event", "getResult", "wait", "state", "abort", "RefImpl", "target", "invariant", "__dxlog_file", "atom", "obj", "Error", "ref", "encode", "toString", "inspectCustom", "depth", "options", "inspect", "pipe", "_setResolver", "resolver", "_getSavedTarget", "uri", "schemas", "addObject", "objects", "set", "addSchema", "input", "schema", "getSchemaURI", "resolve", "makeSettledRequest", "resolveSync", "_onLoad", "resolveLegacy", "resolveSchema", "id", "undefined"]
7
- }
@@ -1,56 +0,0 @@
1
- import {
2
- __export
3
- } from "./chunk-J5LGTIGS.mjs";
4
-
5
- // src/Order.ts
6
- var Order_exports = {};
7
- __export(Order_exports, {
8
- created: () => created,
9
- natural: () => natural,
10
- property: () => property,
11
- rank: () => rank,
12
- updated: () => updated
13
- });
14
- var OrderClass = class _OrderClass {
15
- ast;
16
- static "variance" = {};
17
- static "is"(value) {
18
- return typeof value === "object" && value !== null && "~Order" in value;
19
- }
20
- constructor(ast) {
21
- this.ast = ast;
22
- }
23
- "~Order" = _OrderClass.variance;
24
- };
25
- var natural = new OrderClass({
26
- kind: "natural"
27
- });
28
- var property = (property2, direction) => new OrderClass({
29
- kind: "property",
30
- property: property2,
31
- direction
32
- });
33
- var rank = (direction = "desc") => new OrderClass({
34
- kind: "rank",
35
- direction
36
- });
37
- var updated = (direction = "desc") => new OrderClass({
38
- kind: "timestamp",
39
- field: "updatedAt",
40
- direction
41
- });
42
- var created = (direction = "desc") => new OrderClass({
43
- kind: "timestamp",
44
- field: "createdAt",
45
- direction
46
- });
47
-
48
- export {
49
- natural,
50
- property,
51
- rank,
52
- updated,
53
- created,
54
- Order_exports
55
- };
56
- //# sourceMappingURL=chunk-PRC4FEKJ.mjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/Order.ts"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\n// @import-as-namespace\n\nimport { type QueryAST } from '@dxos/echo-protocol';\n\nexport interface Order<T> {\n // TODO(dmaretskyi): See new effect-schema approach to variance.\n '~Order': { value: T };\n\n 'ast': QueryAST.Order;\n}\n\nexport type Any = Order<any>;\n\nclass OrderClass implements Order<any> {\n private static 'variance': Order<any>['~Order'] = {} as Order<any>['~Order'];\n\n static 'is'(value: unknown): value is Order<any> {\n return typeof value === 'object' && value !== null && '~Order' in value;\n }\n\n 'constructor'(public readonly ast: QueryAST.Order) {}\n\n '~Order' = OrderClass.variance;\n}\n\nexport const natural: Order<any> = new OrderClass({ kind: 'natural' });\nexport const property = <T>(property: keyof T & string, direction: QueryAST.OrderDirection): Order<T> =>\n new OrderClass({\n kind: 'property',\n property,\n direction,\n });\n\n/**\n * Order by relevance rank (for FTS/vector search results).\n * Higher rank = better match. Default direction is 'desc' (best matches first).\n */\nexport const rank = <T>(direction: QueryAST.OrderDirection = 'desc'): Order<T> =>\n new OrderClass({\n kind: 'rank',\n direction,\n });\n\n/**\n * Order by the system `updatedAt` timestamp (last re-indexed). Default direction is 'desc'\n * (most-recently-updated first). Mirrors {@link Filter.updated}.\n */\nexport const updated = <T>(direction: QueryAST.OrderDirection = 'desc'): Order<T> =>\n new OrderClass({\n kind: 'timestamp',\n field: 'updatedAt',\n direction,\n });\n\n/**\n * Order by the system `createdAt` timestamp (first indexed). Default direction is 'desc'\n * (most-recently-created first). Mirrors {@link Filter.created}.\n */\nexport const created = <T>(direction: QueryAST.OrderDirection = 'desc'): Order<T> =>\n new OrderClass({\n kind: 'timestamp',\n field: 'createdAt',\n direction,\n });\n"],
5
- "mappings": ";;;;;AAAA;;;;;;;;AAiBA,IAAMA,aAAN,MAAMA,YAAAA;;EACJ,OAAe,aAAmC,CAAC;EAEnD,OAAO,KAAKC,OAAqC;AAC/C,WAAO,OAAOA,UAAU,YAAYA,UAAU,QAAQ,YAAYA;EACpE;EAEA,YAA8BC,KAAqB;SAArBA,MAAAA;EAAsB;EAEpD,WAAWF,YAAWG;AACxB;AAEO,IAAMC,UAAsB,IAAIJ,WAAW;EAAEK,MAAM;AAAU,CAAA;AAC7D,IAAMC,WAAW,CAAIA,WAA4BC,cACtD,IAAIP,WAAW;EACbK,MAAM;EACNC,UAAAA;EACAC;AACF,CAAA;AAMK,IAAMC,OAAO,CAAID,YAAqC,WAC3D,IAAIP,WAAW;EACbK,MAAM;EACNE;AACF,CAAA;AAMK,IAAME,UAAU,CAAIF,YAAqC,WAC9D,IAAIP,WAAW;EACbK,MAAM;EACNK,OAAO;EACPH;AACF,CAAA;AAMK,IAAMI,UAAU,CAAIJ,YAAqC,WAC9D,IAAIP,WAAW;EACbK,MAAM;EACNK,OAAO;EACPH;AACF,CAAA;",
6
- "names": ["OrderClass", "value", "ast", "variance", "natural", "kind", "property", "direction", "rank", "updated", "field", "created"]
7
- }
@@ -1,351 +0,0 @@
1
- import {
2
- isRef
3
- } from "./chunk-FSGX2R62.mjs";
4
- import {
5
- filterMatchEntity,
6
- prettyFilter
7
- } from "./chunk-ACFAOTKJ.mjs";
8
- import {
9
- getTypeURIFromSpecifier,
10
- getUri
11
- } from "./chunk-3TN2VMI4.mjs";
12
- import {
13
- __export
14
- } from "./chunk-J5LGTIGS.mjs";
15
-
16
- // src/Filter.ts
17
- var Filter_exports = {};
18
- __export(Filter_exports, {
19
- and: () => and,
20
- between: () => between,
21
- childOf: () => childOf,
22
- contains: () => contains,
23
- created: () => created,
24
- eq: () => eq,
25
- everything: () => everything,
26
- foreignKeys: () => foreignKeys,
27
- fromAst: () => fromAst,
28
- gt: () => gt,
29
- gte: () => gte,
30
- id: () => id,
31
- in: () => in$,
32
- is: () => is,
33
- key: () => key,
34
- lt: () => lt,
35
- lte: () => lte,
36
- neq: () => neq,
37
- not: () => not,
38
- nothing: () => nothing,
39
- or: () => or,
40
- pretty: () => pretty,
41
- props: () => props,
42
- tag: () => tag,
43
- text: () => text,
44
- toPredicate: () => toPredicate,
45
- type: () => type,
46
- updated: () => updated
47
- });
48
- import * as Function from "effect/Function";
49
- import * as Match from "effect/Match";
50
- import * as Schema from "effect/Schema";
51
- import * as SchemaAST from "effect/SchemaAST";
52
- import { assertArgument } from "@dxos/invariant";
53
- import { EID, EntityId } from "@dxos/keys";
54
- var FilterClass = class _FilterClass {
55
- ast;
56
- static "variance" = {};
57
- constructor(ast) {
58
- this.ast = ast;
59
- }
60
- "~Filter" = _FilterClass.variance;
61
- };
62
- var is = (value2) => {
63
- return typeof value2 === "object" && value2 !== null && "~Filter" in value2;
64
- };
65
- var fromAst = (ast) => {
66
- return new FilterClass(ast);
67
- };
68
- var everything = () => {
69
- return new FilterClass({
70
- type: "object",
71
- typename: null,
72
- props: {}
73
- });
74
- };
75
- var nothing = () => {
76
- return new FilterClass({
77
- type: "not",
78
- filter: {
79
- type: "object",
80
- typename: null,
81
- props: {}
82
- }
83
- });
84
- };
85
- var id = (...ids) => {
86
- assertArgument(ids.every((id2) => EntityId.isValid(id2)), "ids", "ids must be valid");
87
- if (ids.length === 0) {
88
- return nothing();
89
- }
90
- return new FilterClass({
91
- type: "object",
92
- typename: null,
93
- id: ids,
94
- props: {}
95
- });
96
- };
97
- var type = (input, props2) => {
98
- if (Schema.isSchema(input) && SchemaAST.isUnion(input.ast)) {
99
- const typenames = input.ast.types.map((t) => getTypeURIFromSpecifier(Schema.make(t)));
100
- return new FilterClass({
101
- type: "or",
102
- filters: typenames.map((typename) => ({
103
- type: "object",
104
- typename,
105
- props: {}
106
- }))
107
- });
108
- }
109
- const uri = getTypeURIFromSpecifier(input);
110
- return new FilterClass({
111
- type: "object",
112
- typename: uri,
113
- ...propsFilterToAst(props2 ?? {})
114
- });
115
- };
116
- var tag = (tag2) => {
117
- return new FilterClass({
118
- type: "tag",
119
- tag: tag2
120
- });
121
- };
122
- var key = (key2, options) => {
123
- return new FilterClass({
124
- type: "object",
125
- typename: null,
126
- props: {},
127
- metaKey: key2,
128
- metaVersion: options?.version
129
- });
130
- };
131
- var props = (props2) => {
132
- return new FilterClass({
133
- type: "object",
134
- typename: null,
135
- ...propsFilterToAst(props2)
136
- });
137
- };
138
- var text = (text2, options) => {
139
- return new FilterClass({
140
- type: "text-search",
141
- text: text2,
142
- searchKind: options?.type
143
- });
144
- };
145
- var foreignKeys = (schema, keys) => {
146
- const uri = getTypeURIFromSpecifier(schema);
147
- return new FilterClass({
148
- type: "object",
149
- typename: uri,
150
- props: {},
151
- foreignKeys: keys
152
- });
153
- };
154
- var eq = (value2) => {
155
- if (!isRef(value2) && typeof value2 === "object" && value2 !== null) {
156
- throw new TypeError("Cannot use object as a value for eq filter");
157
- }
158
- return new FilterClass({
159
- type: "compare",
160
- operator: "eq",
161
- value: isRef(value2) ? value2.noInline().encode() : value2
162
- });
163
- };
164
- var neq = (value2) => {
165
- return new FilterClass({
166
- type: "compare",
167
- operator: "neq",
168
- value: value2
169
- });
170
- };
171
- var gt = (value2) => {
172
- return new FilterClass({
173
- type: "compare",
174
- operator: "gt",
175
- value: value2
176
- });
177
- };
178
- var gte = (value2) => {
179
- return new FilterClass({
180
- type: "compare",
181
- operator: "gte",
182
- value: value2
183
- });
184
- };
185
- var lt = (value2) => {
186
- return new FilterClass({
187
- type: "compare",
188
- operator: "lt",
189
- value: value2
190
- });
191
- };
192
- var lte = (value2) => {
193
- return new FilterClass({
194
- type: "compare",
195
- operator: "lte",
196
- value: value2
197
- });
198
- };
199
- var in$ = (...values) => {
200
- return new FilterClass({
201
- type: "in",
202
- values
203
- });
204
- };
205
- var contains = (value2) => {
206
- return new FilterClass({
207
- type: "contains",
208
- value: value2
209
- });
210
- };
211
- var between = (from, to) => {
212
- return new FilterClass({
213
- type: "range",
214
- from,
215
- to
216
- });
217
- };
218
- var _toUnixMs = (date) => typeof date === "number" ? date : date.getTime();
219
- var _timeRangeFilter = (field, range) => {
220
- const filters = [];
221
- if (range.after != null) {
222
- filters.push(new FilterClass({
223
- type: "timestamp",
224
- field,
225
- operator: "gte",
226
- value: _toUnixMs(range.after)
227
- }));
228
- }
229
- if (range.before != null) {
230
- filters.push(new FilterClass({
231
- type: "timestamp",
232
- field,
233
- operator: "lte",
234
- value: _toUnixMs(range.before)
235
- }));
236
- }
237
- if (filters.length === 0) {
238
- return everything();
239
- }
240
- return filters.length === 1 ? filters[0] : and(...filters);
241
- };
242
- var updated = (range) => _timeRangeFilter("updatedAt", range);
243
- var created = (range) => _timeRangeFilter("createdAt", range);
244
- var childOf = (parents, options) => {
245
- const items = Array.isArray(parents) ? parents : [
246
- parents
247
- ];
248
- const dxns = items.map((item) => {
249
- if (isRef(item)) {
250
- return EID.parse(item.uri);
251
- }
252
- return EID.parse(getUri(item));
253
- });
254
- return new FilterClass({
255
- type: "child-of",
256
- parents: dxns,
257
- transitive: options?.transitive ?? true
258
- });
259
- };
260
- var not = (filter) => {
261
- return new FilterClass({
262
- type: "not",
263
- filter: filter.ast
264
- });
265
- };
266
- var and = (...filters) => {
267
- return new FilterClass({
268
- type: "and",
269
- filters: filters.map((f) => f.ast)
270
- });
271
- };
272
- var or = (...filters) => {
273
- return new FilterClass({
274
- type: "or",
275
- filters: filters.map((f) => f.ast)
276
- });
277
- };
278
- var propsFilterToAst = (predicates) => {
279
- let idFilter;
280
- if ("id" in predicates) {
281
- assertArgument(typeof predicates.id === "string" || Array.isArray(predicates.id), "predicates.id", "invalid id filter");
282
- idFilter = typeof predicates.id === "string" ? [
283
- predicates.id
284
- ] : predicates.id;
285
- Schema.Array(EntityId).pipe(Schema.validateSync)(idFilter);
286
- }
287
- return {
288
- id: idFilter,
289
- props: Object.fromEntries(Object.entries(predicates).filter(([prop, _value]) => prop !== "id").map(([prop, predicate]) => [
290
- prop,
291
- processPredicate(predicate)
292
- ]))
293
- };
294
- };
295
- var processPredicate = (predicate) => {
296
- return Match.value(predicate).pipe(
297
- Match.withReturnType(),
298
- Match.when(is, (predicate2) => predicate2.ast),
299
- // TODO(wittjosiah): Add support for array predicates.
300
- Match.when(Array.isArray, (_predicate) => {
301
- throw new Error("Array predicates are not yet supported.");
302
- }),
303
- Match.when((predicate2) => !isRef(predicate2) && typeof predicate2 === "object" && predicate2 !== null, (predicate2) => {
304
- const nestedProps = Object.fromEntries(Object.entries(predicate2).map(([key2, value2]) => [
305
- key2,
306
- processPredicate(value2)
307
- ]));
308
- return {
309
- type: "object",
310
- typename: null,
311
- props: nestedProps
312
- };
313
- }),
314
- Match.orElse((value2) => eq(value2).ast)
315
- );
316
- };
317
- var pretty = (filter) => prettyFilter(filter.ast);
318
- var toPredicate = Function.dual(2, (entity, filter) => filterMatchEntity(filter.ast, entity));
319
-
320
- export {
321
- is,
322
- fromAst,
323
- everything,
324
- nothing,
325
- id,
326
- type,
327
- tag,
328
- key,
329
- props,
330
- text,
331
- foreignKeys,
332
- eq,
333
- neq,
334
- gt,
335
- gte,
336
- lt,
337
- lte,
338
- in$,
339
- contains,
340
- between,
341
- updated,
342
- created,
343
- childOf,
344
- not,
345
- and,
346
- or,
347
- pretty,
348
- toPredicate,
349
- Filter_exports
350
- };
351
- //# sourceMappingURL=chunk-SCT6FFCR.mjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/Filter.ts"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\n// @import-as-namespace\n\nimport * as Function from 'effect/Function';\nimport * as Match from 'effect/Match';\nimport * as Schema from 'effect/Schema';\nimport * as SchemaAST from 'effect/SchemaAST';\nimport type * as Types from 'effect/Types';\n\nimport { type ForeignKey, type QueryAST } from '@dxos/echo-protocol';\nimport { assertArgument } from '@dxos/invariant';\nimport { EID, EntityId, type URI } from '@dxos/keys';\n\nimport type * as Entity from './Entity';\nimport * as internal from './internal';\nimport type * as Obj from './Obj';\nimport * as Ref from './Ref';\n// eslint-disable-next-line @dxos/rules/import-as-namespace\nimport type * as Type$ from './Type';\nexport interface Filter<T> {\n // TODO(dmaretskyi): See new effect-schema approach to variance.\n '~Filter': { value: Types.Covariant<T> };\n\n 'ast': QueryAST.Filter;\n}\n\nexport type Props<T> = {\n // Predicate or a value as a shorthand for `eq`.\n [K in keyof T & string]?: Filter<T[K]> | T[K];\n};\n\nexport type Any = Filter<any>;\n\nexport type Type<F extends Any> = F extends Filter<infer T> ? T : never;\n\nclass FilterClass implements Any {\n private static 'variance': Any['~Filter'] = {} as Any['~Filter'];\n\n 'constructor'(public readonly ast: QueryAST.Filter) {}\n\n '~Filter' = FilterClass.variance;\n}\n\nexport const is = (value: unknown): value is Any => {\n return typeof value === 'object' && value !== null && '~Filter' in value;\n};\n\n/** Construct a filter from an ast. */\nexport const fromAst = (ast: QueryAST.Filter): Any => {\n return new FilterClass(ast);\n};\n\n/**\n * Filter that matches all objects.\n */\n// TODO(dmaretskyi): `Entity.Any` would be more type-safe, but causes annoying errors in existing code\nexport const everything = (): FilterClass => {\n return new FilterClass({\n type: 'object',\n typename: null,\n props: {},\n });\n};\n\n/**\n * Filter that matches no objects.\n */\nexport const nothing = (): FilterClass => {\n return new FilterClass({\n type: 'not',\n filter: {\n type: 'object',\n typename: null,\n props: {},\n },\n });\n};\n\n/*\n * Filter by EntityId.\n */\nexport const id = (...ids: EntityId[]): Any => {\n assertArgument(\n ids.every((id) => EntityId.isValid(id)),\n 'ids',\n 'ids must be valid',\n );\n\n if (ids.length === 0) {\n return nothing();\n }\n\n return new FilterClass({\n type: 'object',\n typename: null,\n id: ids,\n props: {},\n });\n};\n\n/**\n * Filter by type.\n *\n * Accepts a `Type.Type` entity (the value produced by `Type.makeObject` /\n * `Type.makeRelation`), a `Schema.Union` of such entities (for filtering across a\n * union of ECHO types), or a fully-qualified type URI — an `echo:` EID (stored schema)\n * or a `dxn:` DXN (static schema). To filter by a bare typename, wrap it: `DXN.make(typename)`.\n */\nexport const type: {\n <T extends Type$.AnyEntity>(type: T, props?: Props<Type$.InstanceType<T>>): Filter<Type$.InstanceType<T>>;\n // Schema-side overload restricted to the well-known unknown schemas and to\n // `Schema.Union(...)` of `Type.Type` entities (for filtering across a union\n // of ECHO types). Other raw schemas are rejected.\n <S extends internal.UnknownTypeSchema<any, any>>(\n schema: S,\n props?: Props<Schema.Schema.Type<S>>,\n ): Filter<Schema.Schema.Type<S>>;\n <S extends Schema.Union<readonly Schema.Schema.AnyNoContext[]>>(\n union: S,\n props?: Props<Schema.Schema.Type<S>>,\n ): Filter<Schema.Schema.Type<S>>;\n (uri: URI.URI, props?: Props<unknown>): Filter<any>;\n // Passthrough overload for callers that hold a `Type.AnyEntity | URI.URI` union\n // (e.g. Query.type / Query.sourceOf / Query.targetOf impls). Listed last so the\n // typed overloads above still win for monomorphic inputs.\n (input: Type$.AnyEntity | URI.URI, props?: Props<unknown>): Filter<unknown>;\n} = (input: Type$.AnyEntity | Schema.Schema.AnyNoContext | URI.URI, props?: Props<unknown>): any => {\n if (Schema.isSchema(input) && SchemaAST.isUnion(input.ast)) {\n const typenames = input.ast.types.map((t) => internal.getTypeURIFromSpecifier(Schema.make(t)));\n return new FilterClass({\n type: 'or',\n filters: typenames.map((typename) => ({\n type: 'object',\n typename,\n props: {},\n })),\n });\n }\n\n const uri = internal.getTypeURIFromSpecifier(input);\n return new FilterClass({\n type: 'object',\n typename: uri,\n ...propsFilterToAst(props ?? {}),\n });\n};\n\n/**\n * Filter by tag.\n */\nexport const tag = (tag: string): Any => {\n return new FilterClass({\n type: 'tag',\n tag,\n });\n};\n\n/**\n * Options for {@link key} filter.\n */\nexport type KeyFilterOptions = {\n /**\n * Optional semver range expression (e.g. `^1.2.3`, `~2.0.0`, `>=1.0.0 <2.0.0`).\n * Matches the object's meta `version` field against the range.\n * If omitted, matches any version (including objects with no version).\n */\n version?: string;\n};\n\n/**\n * Filter by registry key stored in object meta.\n *\n * @example\n * ```ts\n * Filter.key('org.example.type.foo');\n * Filter.key('org.example.type.foo', { version: '^1.2.3' });\n * ```\n */\nexport const key = (key: string, options?: KeyFilterOptions): Any => {\n return new FilterClass({\n type: 'object',\n typename: null,\n props: {},\n metaKey: key,\n metaVersion: options?.version,\n });\n};\n\n/**\n * Filter by properties.\n */\nexport const props = <T>(props: Props<T>): Filter<T> => {\n return new FilterClass({\n type: 'object',\n typename: null,\n ...propsFilterToAst(props),\n });\n};\n\nexport type TextSearchOptions = {\n // TODO(dmaretskyi): Hybrid search.\n type?: 'full-text' | 'vector';\n};\n\n/**\n * Full-text or vector search.\n */\nexport const text = (\n // TODO(dmaretskyi): Consider passing a vector here, but really the embedding should be done on the query-executor side.\n text: string,\n options?: TextSearchOptions,\n): Any => {\n return new FilterClass({\n type: 'text-search',\n text,\n searchKind: options?.type,\n });\n};\n\n/**\n * Filter by foreign keys.\n */\nexport const foreignKeys = <S extends Type$.AnyEntity | URI.URI>(\n schema: S,\n keys: ForeignKey[],\n): Filter<S extends Type$.AnyEntity ? Type$.InstanceType<S> : unknown> => {\n const uri = internal.getTypeURIFromSpecifier(schema);\n return new FilterClass({\n type: 'object',\n typename: uri,\n props: {},\n foreignKeys: keys,\n });\n};\n\n/**\n * Predicate for property to be equal to the provided value.\n */\nexport const eq = <T>(value: T): Filter<T | undefined> => {\n if (!Ref.isRef(value) && typeof value === 'object' && value !== null) {\n throw new TypeError('Cannot use object as a value for eq filter');\n }\n\n return new FilterClass({\n type: 'compare',\n operator: 'eq',\n value: Ref.isRef(value) ? value.noInline().encode() : value,\n });\n};\n\n/**\n * Predicate for property to be not equal to the provided value.\n */\nexport const neq = <T>(value: T): Filter<T | undefined> => {\n return new FilterClass({\n type: 'compare',\n operator: 'neq',\n value,\n });\n};\n\n/**\n * Predicate for property to be greater than the provided value.\n */\nexport const gt = <T>(value: T): Filter<T | undefined> => {\n return new FilterClass({\n type: 'compare',\n operator: 'gt',\n value,\n });\n};\n\n/**\n * Predicate for property to be greater than or equal to the provided value.\n */\nexport const gte = <T>(value: T): Filter<T | undefined> => {\n return new FilterClass({\n type: 'compare',\n operator: 'gte',\n value,\n });\n};\n\n/**\n * Predicate for property to be less than the provided value.\n */\nexport const lt = <T>(value: T): Filter<T | undefined> => {\n return new FilterClass({\n type: 'compare',\n operator: 'lt',\n value,\n });\n};\n\n/**\n * Predicate for property to be less than or equal to the provided value.\n */\nexport const lte = <T>(value: T): Filter<T | undefined> => {\n return new FilterClass({\n type: 'compare',\n operator: 'lte',\n value,\n });\n};\n\n/**\n * Predicate for property to be in the provided array.\n * @param values - Values to check against.\n */\nconst in$ = <T>(...values: T[]): Filter<T> => {\n return new FilterClass({\n type: 'in',\n values,\n });\n};\nexport { in$ as in };\n\n/**\n * Predicate for an array property to contain the provided value.\n * @param value - Value to check against.\n */\nexport const contains = <T>(value: T): Filter<readonly T[] | undefined> => {\n return new FilterClass({\n type: 'contains',\n value,\n });\n};\n\n/**\n * Predicate for property to be in the provided range.\n * @param from - Start of the range (inclusive).\n * @param to - End of the range (exclusive).\n */\nexport const between = <T>(from: T, to: T): Filter<T> => {\n return new FilterClass({\n type: 'range',\n from,\n to,\n });\n};\n\ntype TimeRange = { after?: Date | number; before?: Date | number };\n\nconst _toUnixMs = (date: Date | number): number => (typeof date === 'number' ? date : date.getTime());\n\nconst _timeRangeFilter = (field: 'updatedAt' | 'createdAt', range: TimeRange): Any => {\n const filters: Any[] = [];\n if (range.after != null) {\n filters.push(new FilterClass({ type: 'timestamp', field, operator: 'gte', value: _toUnixMs(range.after) }));\n }\n if (range.before != null) {\n filters.push(new FilterClass({ type: 'timestamp', field, operator: 'lte', value: _toUnixMs(range.before) }));\n }\n if (filters.length === 0) {\n return everything();\n }\n return filters.length === 1 ? filters[0] : and(...filters);\n};\n\n/**\n * Filter objects by updatedAt timestamp.\n */\nexport const updated = (range: TimeRange): Any => _timeRangeFilter('updatedAt', range);\n\n/**\n * Filter objects by createdAt timestamp.\n */\nexport const created = (range: TimeRange): Any => _timeRangeFilter('createdAt', range);\n\nexport type ChildOfOptions = {\n /** Whether to match transitively (grandchildren, etc.). Defaults to true. */\n transitive?: boolean;\n};\n\n/**\n * Filter objects that are children of the specified parent(s).\n * Accepts ECHO objects, Refs, or arrays of either.\n * Refs are resolved to DXNs without loading; objects use {@link Obj.getURI}.\n * With transitive=true (default), also matches grandchildren and beyond.\n */\nexport const childOf = (\n parents: Obj.Unknown | Ref.Unknown | readonly (Obj.Unknown | Ref.Unknown)[],\n options?: ChildOfOptions,\n): Any => {\n const items = Array.isArray(parents) ? parents : [parents];\n const dxns = items.map((item) => {\n if (Ref.isRef(item)) {\n return EID.parse(item.uri);\n }\n return EID.parse(internal.getUri(item));\n });\n return new FilterClass({\n type: 'child-of',\n parents: dxns,\n transitive: options?.transitive ?? true,\n });\n};\n\n/**\n * Negate the filter.\n */\nexport const not = <F extends Any>(filter: F): Filter<Type<F>> => {\n return new FilterClass({\n type: 'not',\n filter: filter.ast,\n });\n};\n\n/**\n * Combine filters with a logical AND.\n */\nexport const and = <Filters extends readonly Any[]>(...filters: Filters): Filter<Type<Filters[number]>> => {\n return new FilterClass({\n type: 'and',\n filters: filters.map((f) => f.ast),\n });\n};\n\n/**\n * Combine filters with a logical OR.\n */\nexport const or = <Filters extends readonly Any[]>(...filters: Filters): Filter<Type<Filters[number]>> => {\n return new FilterClass({\n type: 'or',\n filters: filters.map((f) => f.ast),\n });\n};\n\n// TODO(dmaretskyi): Add `Filter.match` to support pattern matching on string props.\n\nconst propsFilterToAst = (predicates: Props<any>): Pick<QueryAST.FilterObject, 'id' | 'props'> => {\n let idFilter: readonly EntityId[] | undefined;\n if ('id' in predicates) {\n assertArgument(\n typeof predicates.id === 'string' || Array.isArray(predicates.id),\n 'predicates.id',\n 'invalid id filter',\n );\n idFilter = typeof predicates.id === 'string' ? [predicates.id] : predicates.id;\n Schema.Array(EntityId).pipe(Schema.validateSync)(idFilter);\n }\n\n return {\n id: idFilter,\n props: Object.fromEntries(\n Object.entries(predicates)\n .filter(([prop, _value]) => prop !== 'id')\n .map(([prop, predicate]) => [prop, processPredicate(predicate)]),\n ) as Record<string, QueryAST.Filter>,\n };\n};\n\nconst processPredicate = (predicate: any): QueryAST.Filter => {\n return Match.value(predicate).pipe(\n Match.withReturnType<QueryAST.Filter>(),\n Match.when(is, (predicate) => predicate.ast),\n // TODO(wittjosiah): Add support for array predicates.\n Match.when(Array.isArray, (_predicate) => {\n throw new Error('Array predicates are not yet supported.');\n }),\n Match.when(\n (predicate: any) => !Ref.isRef(predicate) && typeof predicate === 'object' && predicate !== null,\n (predicate) => {\n const nestedProps = Object.fromEntries(\n Object.entries(predicate).map(([key, value]) => [key, processPredicate(value)]),\n );\n\n return {\n type: 'object',\n typename: null,\n props: nestedProps,\n };\n },\n ),\n Match.orElse((value) => eq(value).ast),\n );\n};\n\n/**\n * Returns a human-readable string representation of a Filter AST.\n */\nexport const pretty = (filter: Any): string => internal.prettyFilter(filter.ast);\n\n/**\n * Create a predicate from a filter.\n */\nexport const toPredicate: {\n <T extends Entity.Unknown>(filter: Filter<T>): (entity: Entity.Unknown) => entity is T;\n <T extends Entity.Unknown>(entity: Entity.Unknown, filter: Filter<T>): entity is T;\n} = Function.dual<\n <T extends Entity.Unknown>(filter: Filter<T>) => (entity: Entity.Unknown) => entity is T,\n <T extends Entity.Unknown>(entity: Entity.Unknown, filter: Filter<T>) => entity is T\n>(2, <T extends Entity.Unknown>(entity: Entity.Unknown, filter: Filter<T>): entity is T =>\n internal.filterMatchEntity(filter.ast, entity),\n);\n"],
5
- "mappings": "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",
6
- "names": ["Function", "Match", "Schema", "SchemaAST", "assertArgument", "EID", "EntityId", "FilterClass", "ast", "variance", "is", "value", "fromAst", "everything", "type", "typename", "props", "nothing", "filter", "id", "ids", "assertArgument", "every", "EntityId", "isValid", "length", "input", "isSchema", "isUnion", "typenames", "types", "map", "t", "getTypeURIFromSpecifier", "make", "filters", "uri", "propsFilterToAst", "tag", "key", "options", "metaKey", "metaVersion", "version", "text", "searchKind", "foreignKeys", "schema", "keys", "eq", "isRef", "TypeError", "operator", "noInline", "encode", "neq", "gt", "gte", "lt", "lte", "in$", "values", "contains", "value", "FilterClass", "type", "between", "from", "to", "_toUnixMs", "date", "getTime", "_timeRangeFilter", "field", "range", "filters", "after", "push", "operator", "before", "length", "everything", "and", "updated", "created", "childOf", "parents", "options", "items", "Array", "isArray", "dxns", "map", "item", "isRef", "EID", "parse", "uri", "getUri", "transitive", "not", "filter", "ast", "f", "or", "propsFilterToAst", "predicates", "idFilter", "assertArgument", "id", "Schema", "EntityId", "pipe", "validateSync", "props", "Object", "fromEntries", "entries", "prop", "_value", "predicate", "processPredicate", "withReturnType", "when", "is", "_predicate", "Error", "nestedProps", "key", "typename", "orElse", "eq", "pretty", "prettyFilter", "toPredicate", "dual", "entity", "filterMatchEntity"]
7
- }