@dxos/echo 0.10.0 → 0.11.0

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
@@ -0,0 +1,590 @@
1
+ import { g as getStaticTypeSchema } from "./chunk-util.mjs";
2
+ import { Jt as ObjectDeletedId, bt as getTypeAnnotation, et as ReferenceAnnotationId, r as Service, vt as getSchemaURI, xt as getTypeIdentifierAnnotation } from "./chunk-Database.mjs";
3
+ import { EncodedReference } from "@dxos/echo-protocol";
4
+ import { DXN, EID, EntityId } from "@dxos/keys";
5
+ import * as Option from "effect/Option";
6
+ import * as Schema from "effect/Schema";
7
+ import * as SchemaAST from "effect/SchemaAST";
8
+ import { assertArgument, invariant } from "@dxos/invariant";
9
+ import * as Effect from "effect/Effect";
10
+ import * as Equal from "effect/Equal";
11
+ import * as Hash from "effect/Hash";
12
+ import * as ParseResult from "effect/ParseResult";
13
+ import * as Pipeable from "effect/Pipeable";
14
+ import { Event } from "@dxos/async";
15
+ import { inspectCustom } from "@dxos/debug";
16
+ import * as Atom from "@effect-atom/atom/Atom";
17
+ //#region src/internal/common/proxy/proxy-utils.ts
18
+ var __dxlog_file$1 = "/__w/dxos/dxos/packages/core/echo/echo/src/internal/common/proxy/proxy-utils.ts";
19
+ var symbolIsProxy = Symbol.for("@dxos/schema/Proxy");
20
+ /**
21
+ * Marker placed on a reactive-object behaviour prototype (e.g. the typed handler's
22
+ * `TypedObject` prototype). A record target whose prototype chain carries this marker
23
+ * is a reactive data record — equivalent, for the purposes of the "plain object" gates
24
+ * below, to one rooted directly at `Object.prototype`. This lets a handler move its
25
+ * per-object metadata onto an intermediate prototype without those gates mistaking the
26
+ * record for a foreign class instance.
27
+ */
28
+ var symbolReactivePrototype = Symbol.for("@dxos/echo/ReactivePrototype");
29
+ /**
30
+ * Internal api.
31
+ */
32
+ var isProxy = (value) => !!value?.[symbolIsProxy];
33
+ /**
34
+ * True if `value` is a plain data record — either rooted at `Object.prototype` or carrying
35
+ * a reactive behaviour prototype (see {@link symbolReactivePrototype}).
36
+ */
37
+ var isReactiveRecord = (value) => {
38
+ const proto = Object.getPrototypeOf(value);
39
+ return proto === Object.prototype || proto != null && !!proto[symbolReactivePrototype];
40
+ };
41
+ var isValidProxyTarget = (value) => {
42
+ if (value == null || value[symbolIsProxy]) return false;
43
+ if (Array.isArray(value)) return true;
44
+ return typeof value === "object" && isReactiveRecord(value);
45
+ };
46
+ /**
47
+ * @deprecated
48
+ */
49
+ var getProxySlot = (proxy) => {
50
+ const value = proxy[symbolIsProxy];
51
+ invariant(value instanceof ProxyHandlerSlot, void 0, {
52
+ "~LogMeta": "~LogMeta",
53
+ F: __dxlog_file$1,
54
+ L: 51,
55
+ S: void 0,
56
+ A: ["value instanceof ProxyHandlerSlot", ""]
57
+ });
58
+ return value;
59
+ };
60
+ var getProxyTarget = (proxy) => {
61
+ return getProxySlot(proxy).target;
62
+ };
63
+ var getProxyHandler = (proxy) => {
64
+ return getProxySlot(proxy).handler;
65
+ };
66
+ /**
67
+ * Clamp a splice range to `Array.prototype.splice` semantics for a string of the given `length`:
68
+ * a negative `start` counts from the end, a `start` past the end appends, and `deleteCount` is bounded
69
+ * to the remaining characters. Shared by both reactive handlers so the string CRDT API behaves
70
+ * identically across the in-memory and Automerge backends (Automerge's `splice` otherwise throws on
71
+ * out-of-range indices).
72
+ */
73
+ var normalizeSpliceRange = (length, start, deleteCount) => {
74
+ const safeStart = start < 0 ? Math.max(length + start, 0) : Math.min(start, length);
75
+ return {
76
+ start: safeStart,
77
+ deleteCount: Math.max(0, Math.min(deleteCount, length - safeStart))
78
+ };
79
+ };
80
+ /**
81
+ * Unsafe method to override id for debugging/testing and migration purposes.
82
+ * @deprecated
83
+ */
84
+ var dangerouslySetProxyId = (obj, id) => {
85
+ getProxySlot(obj).target.id = id;
86
+ };
87
+ /**
88
+ * Create a reactive proxy object.
89
+ * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy
90
+ *
91
+ * @param target Object or array. Passing in array will enable array methods.
92
+ * @param handler ReactiveHandler instance.
93
+ */
94
+ var createProxy = (target, handler) => {
95
+ const existingProxy = handler._proxyMap.get(target);
96
+ if (existingProxy) return existingProxy;
97
+ const proxy = new Proxy(target, new ProxyHandlerSlot(target, handler));
98
+ handler.init(target);
99
+ handler._proxyMap.set(target, proxy);
100
+ return proxy;
101
+ };
102
+ /**
103
+ * Passed as the handler to the Proxy constructor.
104
+ * Maintains a mutable slot for the actual handler.
105
+ */
106
+ var ProxyHandlerSlot = class {
107
+ target;
108
+ _handler;
109
+ /**
110
+ * @param target Original object.
111
+ * @param _handler Handles intercepted operations.
112
+ */
113
+ constructor(target, _handler) {
114
+ this.target = target;
115
+ this._handler = _handler;
116
+ }
117
+ get handler() {
118
+ invariant(this._handler, void 0, {
119
+ "~LogMeta": "~LogMeta",
120
+ F: __dxlog_file$1,
121
+ L: 127,
122
+ S: this,
123
+ A: ["this._handler", ""]
124
+ });
125
+ return this._handler;
126
+ }
127
+ setHandler(handler) {
128
+ this._handler = handler;
129
+ }
130
+ /**
131
+ * Get value.
132
+ */
133
+ get(target, prop, receiver) {
134
+ if (prop === symbolIsProxy) return this;
135
+ if (!this._handler || !this._handler.get) return Reflect.get(target, prop, receiver);
136
+ return this._handler.get(target, prop, receiver);
137
+ }
138
+ static {
139
+ for (const trap of [
140
+ "apply",
141
+ "construct",
142
+ "defineProperty",
143
+ "deleteProperty",
144
+ "get",
145
+ "getOwnPropertyDescriptor",
146
+ "getPrototypeOf",
147
+ "has",
148
+ "isExtensible",
149
+ "ownKeys",
150
+ "preventExtensions",
151
+ "set",
152
+ "setPrototypeOf"
153
+ ]) {
154
+ if (trap === "get") continue;
155
+ Object.defineProperty(this.prototype, trap, {
156
+ enumerable: false,
157
+ value: function(...args) {
158
+ if (!this._handler || !this._handler[trap]) return Reflect[trap](...args);
159
+ return this._handler[trap].apply(this._handler, args);
160
+ }
161
+ });
162
+ }
163
+ }
164
+ };
165
+ //#endregion
166
+ //#region src/internal/common/proxy/symbols.ts
167
+ var EventId = Symbol.for("@dxos/live-object/EventId");
168
+ var ChangeId = Symbol.for("@dxos/live-object/ChangeId");
169
+ //#endregion
170
+ //#region src/internal/common/proxy/reactive.ts
171
+ /**
172
+ * Subscribe to changes on a reactive object.
173
+ * @param obj - The reactive object to subscribe to.
174
+ * @param callback - Called when the object changes.
175
+ * @returns Unsubscribe function.
176
+ */
177
+ var subscribe = (obj, callback) => {
178
+ if (!isProxy(obj)) return () => {};
179
+ const target = getProxyTarget(obj);
180
+ if (target && EventId in target) return target[EventId].on(callback);
181
+ return () => {};
182
+ };
183
+ /**
184
+ * Perform mutations on a reactive object within a change context.
185
+ *
186
+ * If the object has a change handler (via ChangeId), it will be called with the callback.
187
+ * This allows handlers to implement features like:
188
+ * - Readonly enforcement (mutations only allowed within change context)
189
+ * - Batched notifications (single notification for all mutations in the callback)
190
+ * - Transaction semantics
191
+ *
192
+ * If the object doesn't have a change handler, the callback is called directly.
193
+ *
194
+ * @param obj - The reactive object to mutate.
195
+ * @param callback - Callback that receives a mutable view of the object.
196
+ */
197
+ var change = (obj, callback) => {
198
+ const changeFn = obj[ChangeId];
199
+ if (changeFn) changeFn(callback);
200
+ else callback(obj);
201
+ };
202
+ //#endregion
203
+ //#region src/internal/Ref/utils.ts
204
+ /**
205
+ * Internal helper for loading ref targets in atoms.
206
+ * Handles the common pattern of checking for loaded target and triggering async load.
207
+ */
208
+ var loadRefTarget = (ref, get, onTargetAvailable) => {
209
+ const currentTarget = ref.target;
210
+ if (currentTarget) return onTargetAvailable(currentTarget);
211
+ const unsubscribe = ref.onResolved(() => {
212
+ const target = ref.target;
213
+ if (target) get.setSelf(onTargetAvailable(target));
214
+ });
215
+ get.addFinalizer(unsubscribe);
216
+ ref.load().then((loadedTarget) => {
217
+ get.setSelf(onTargetAvailable(loadedTarget));
218
+ }).catch(() => {});
219
+ };
220
+ //#endregion
221
+ //#region src/internal/Ref/atoms.ts
222
+ /**
223
+ * Atom family for ECHO refs.
224
+ * Uses ref reference as key — same ref returns same atom.
225
+ * Subscribes to target object changes and resolves to undefined when the target is deleted.
226
+ */
227
+ var refSimpleFamily = Atom.family((ref) => {
228
+ return Atom.make((get) => {
229
+ let unsubscribeTarget;
230
+ const setupSubscription = (target) => {
231
+ unsubscribeTarget?.();
232
+ unsubscribeTarget = subscribe(target, () => {
233
+ const deleted = !!target[ObjectDeletedId];
234
+ get.setSelf(deleted ? void 0 : target);
235
+ });
236
+ return !!target[ObjectDeletedId] ? void 0 : target;
237
+ };
238
+ get.addFinalizer(() => {
239
+ unsubscribeTarget?.();
240
+ });
241
+ return loadRefTarget(ref, get, setupSubscription);
242
+ }).pipe(Atom.keepAlive);
243
+ });
244
+ //#endregion
245
+ //#region src/internal/Ref/ref.ts
246
+ var __dxlog_file = "/__w/dxos/dxos/packages/core/echo/echo/src/internal/Ref/ref.ts";
247
+ /**
248
+ * The `$id` and `$ref` fields for an ECHO reference schema.
249
+ */
250
+ var JSON_SCHEMA_ECHO_REF_ID = "/schemas/echo/ref";
251
+ var getSchemaReference = (property) => {
252
+ const { $id, reference: { schema: { $ref } = {} } = {} } = property;
253
+ if ($id === "/schemas/echo/ref" && $ref) {
254
+ const parsed = DXN.tryMake($ref);
255
+ const typename = parsed ? DXN.getName(parsed) : void 0;
256
+ return typename ? { typename } : void 0;
257
+ }
258
+ };
259
+ var createSchemaReference = (typename) => {
260
+ return {
261
+ $id: JSON_SCHEMA_ECHO_REF_ID,
262
+ reference: { schema: { $ref: DXN.make(typename) } }
263
+ };
264
+ };
265
+ var getReferenceAst = (ast) => {
266
+ if (ast._tag !== "Declaration" || !ast.annotations[ReferenceAnnotationId]) return;
267
+ return {
268
+ typename: ast.annotations[ReferenceAnnotationId].typename,
269
+ version: ast.annotations[ReferenceAnnotationId].version
270
+ };
271
+ };
272
+ var RefTypeId = Symbol.for("@dxos/echo/internal/Ref");
273
+ /**
274
+ * Schema builder for references.
275
+ */
276
+ var Ref = (input) => {
277
+ const schema = getStaticTypeSchema(input) ?? input;
278
+ assertArgument(Schema.isSchema(schema), "schema", "Must call with an instance of effect-schema");
279
+ const annotation = getTypeAnnotation(schema);
280
+ if (annotation == null) throw new Error("Reference target must be an ECHO schema.");
281
+ return createEchoReferenceSchema(getTypeIdentifierAnnotation(schema), annotation.typename, annotation.version);
282
+ };
283
+ Ref.isRef = (obj) => {
284
+ return obj != null && typeof obj === "object" && RefTypeId in obj;
285
+ };
286
+ Ref.hasEntityId = (id) => (ref) => {
287
+ const uri = EID.tryParse(ref.uri);
288
+ return uri !== void 0 && EID.isLocal(uri) && EID.getEntityId(uri) === id;
289
+ };
290
+ Ref.isRefSchema = (schema) => {
291
+ return Ref.isRefSchemaAST(schema.ast);
292
+ };
293
+ Ref.isRefSchemaAST = (ast) => {
294
+ return SchemaAST.getAnnotation(ast, ReferenceAnnotationId).pipe(Option.isSome);
295
+ };
296
+ Ref.make = (obj) => {
297
+ if (typeof obj !== "object" || obj === null) throw new TypeError("Expected: ECHO object.");
298
+ const id = obj.id;
299
+ invariant(EntityId.isValid(id), "Invalid object ID", {
300
+ "~LogMeta": "~LogMeta",
301
+ F: __dxlog_file,
302
+ L: 287,
303
+ S: void 0,
304
+ A: ["EntityId.isValid(id)", "'Invalid object ID'"]
305
+ });
306
+ return new RefImpl(EID.make({ entityId: id }), obj);
307
+ };
308
+ Ref.fromURI = (uri) => {
309
+ assertArgument(typeof uri === "string", "uri", "Expected URI string");
310
+ return new RefImpl(uri);
311
+ };
312
+ /**
313
+ * @internal
314
+ */
315
+ var createEchoReferenceSchema = (echoUri, typename, version) => {
316
+ if (!echoUri && !typename) throw new TypeError("Either echoUri or typename must be provided.");
317
+ const referenceInfo = {
318
+ schema: { $ref: echoUri ?? DXN.make(typename) },
319
+ schemaVersion: version
320
+ };
321
+ return Schema.declare([], {
322
+ encode: () => {
323
+ return (value) => Effect.gen(function* () {
324
+ if (Ref.isRef(value)) return EncodedReference.fromURI(value.uri);
325
+ else if (EncodedReference.isEncodedReference(value)) return value;
326
+ throw new Error("Invalid reference");
327
+ });
328
+ },
329
+ decode: () => {
330
+ return (value) => Effect.gen(function* () {
331
+ const dbService = yield* Effect.serviceOption(Service);
332
+ if (Ref.isRef(value)) if (Option.isSome(dbService)) return dbService.value.db.makeRef(value.uri);
333
+ else return value;
334
+ if (!EncodedReference.isEncodedReference(value)) return yield* Effect.fail(new ParseResult.Unexpected(value, "reference"));
335
+ if (Option.isSome(dbService)) return dbService.value.db.makeRef(EncodedReference.toURI(value));
336
+ else return Ref.fromURI(EncodedReference.toURI(value));
337
+ });
338
+ }
339
+ }, {
340
+ jsonSchema: {
341
+ $id: JSON_SCHEMA_ECHO_REF_ID,
342
+ $ref: JSON_SCHEMA_ECHO_REF_ID,
343
+ reference: referenceInfo
344
+ },
345
+ [ReferenceAnnotationId]: {
346
+ typename: typename ?? "",
347
+ version
348
+ }
349
+ });
350
+ };
351
+ /**
352
+ * A settled {@link RefResolverRequest} with a fixed `state` and `result`, used by resolvers
353
+ * whose backends are fully synchronous (e.g. {@link StaticRefResolver}).
354
+ */
355
+ var makeSettledRequest = (state, result) => ({
356
+ state,
357
+ stateChanged: new Event(),
358
+ getResult: () => state === "ready" ? result : void 0,
359
+ wait: async () => state === "ready" ? result : void 0,
360
+ abort: () => {}
361
+ });
362
+ var RefImpl = class RefImpl {
363
+ [RefTypeId] = refVariance;
364
+ #uri;
365
+ /**
366
+ * Target is set when the reference is created from a specific object.
367
+ * In this case, the target might not be in the database.
368
+ */
369
+ #target = void 0;
370
+ #resolver = void 0;
371
+ #resolved = new Event();
372
+ /**
373
+ * Callback to issue a reactive notification when object is resolved.
374
+ */
375
+ #resolverCallback = () => {
376
+ this.#resolved.emit();
377
+ };
378
+ constructor(uri, target) {
379
+ this.#uri = uri;
380
+ this.#target = target;
381
+ }
382
+ /**
383
+ * @inheritdoc
384
+ */
385
+ get uri() {
386
+ return this.#uri;
387
+ }
388
+ /**
389
+ * @inheritdoc
390
+ */
391
+ get target() {
392
+ if (this.#target) return this.#target;
393
+ invariant(this.#resolver, "Resolver is not set", {
394
+ "~LogMeta": "~LogMeta",
395
+ F: __dxlog_file,
396
+ L: 534,
397
+ S: this,
398
+ A: ["this.#resolver", "'Resolver is not set'"]
399
+ });
400
+ return this.#resolver.resolveSync(this.#uri, true, this.#resolverCallback);
401
+ }
402
+ /**
403
+ * @inheritdoc
404
+ */
405
+ get isAvailable() {
406
+ return this.#target !== void 0 || this.#resolver !== void 0;
407
+ }
408
+ get atom() {
409
+ return refSimpleFamily(this);
410
+ }
411
+ /**
412
+ * @inheritdoc
413
+ */
414
+ async load() {
415
+ if (this.#target) return this.#target;
416
+ invariant(this.#resolver, "Resolver is not set", {
417
+ "~LogMeta": "~LogMeta",
418
+ F: __dxlog_file,
419
+ L: 556,
420
+ S: this,
421
+ A: ["this.#resolver", "'Resolver is not set'"]
422
+ });
423
+ const obj = await this.#resolver.resolveLegacy(this.#uri);
424
+ if (obj == null) throw new Error("Object not found");
425
+ return obj;
426
+ }
427
+ /**
428
+ * @inheritdoc
429
+ */
430
+ async tryLoad() {
431
+ if (this.#target) return this.#target;
432
+ invariant(this.#resolver, "Resolver is not set", {
433
+ "~LogMeta": "~LogMeta",
434
+ F: __dxlog_file,
435
+ L: 571,
436
+ S: this,
437
+ A: ["this.#resolver", "'Resolver is not set'"]
438
+ });
439
+ return await this.#resolver.resolveLegacy(this.#uri);
440
+ }
441
+ /**
442
+ * @inheritdoc
443
+ */
444
+ onResolved(callback) {
445
+ return this.#resolved.on(callback);
446
+ }
447
+ /**
448
+ * Do not inline the target object in the reference.
449
+ * Makes .target unavailable unless the reference is connected to a database context.
450
+ * Clones the reference object.
451
+ */
452
+ noInline() {
453
+ const ref = new RefImpl(this.#uri, void 0);
454
+ ref.#resolver = this.#resolver;
455
+ return ref;
456
+ }
457
+ encode() {
458
+ return {
459
+ "/": this.#uri,
460
+ ...this.#target ? { target: this.#target } : {}
461
+ };
462
+ }
463
+ /**
464
+ * Serializes the reference to a JSON object.
465
+ * The serialization format is compatible with the IPLD-style encoded references.
466
+ * When a reference has a saved target (i.e. the target or object holding the reference is not in the database),
467
+ * the target is included in the serialized object.
468
+ */
469
+ toJSON() {
470
+ return this.encode();
471
+ }
472
+ toString() {
473
+ if (this.#target) return `Ref(${this.#target.toString()})`;
474
+ return `Ref(${this.#uri.toString()})`;
475
+ }
476
+ [inspectCustom] = (depth, options, inspect) => {
477
+ return this.toString();
478
+ };
479
+ /**
480
+ * Effect Hash trait. Required for MutableHashMap-based caches (e.g., Atom.family)
481
+ * to deduplicate Ref instances that point to the same object.
482
+ * ECHO proxies return new RefImpl instances on every property access,
483
+ * so without this, each access would create a separate cache entry.
484
+ */
485
+ [Hash.symbol]() {
486
+ return Hash.hash(this.#uri.toString());
487
+ }
488
+ /** Effect Equal trait. See {@link Hash.symbol} for rationale. */
489
+ [Equal.symbol](that) {
490
+ return that instanceof RefImpl && this.#uri === that.uri;
491
+ }
492
+ pipe() {
493
+ return Pipeable.pipeArguments(this, arguments);
494
+ }
495
+ /**
496
+ * @internal
497
+ */
498
+ _setResolver(resolver) {
499
+ this.#resolver = resolver;
500
+ }
501
+ /**
502
+ * @internal
503
+ */
504
+ _getSavedTarget() {
505
+ return this.#target;
506
+ }
507
+ };
508
+ /**
509
+ * Internal API for setting the reference resolver.
510
+ */
511
+ var setRefResolver = (ref, resolver) => {
512
+ invariant(ref instanceof RefImpl, "Ref is not an instance of RefImpl", {
513
+ "~LogMeta": "~LogMeta",
514
+ F: __dxlog_file,
515
+ L: 661,
516
+ S: void 0,
517
+ A: ["ref instanceof RefImpl", "'Ref is not an instance of RefImpl'"]
518
+ });
519
+ ref._setResolver(resolver);
520
+ };
521
+ /**
522
+ * Internal API for getting the saved target on a reference.
523
+ */
524
+ var getRefSavedTarget = (ref) => {
525
+ invariant(ref instanceof RefImpl, "Ref is not an instance of RefImpl", {
526
+ "~LogMeta": "~LogMeta",
527
+ F: __dxlog_file,
528
+ L: 669,
529
+ S: void 0,
530
+ A: ["ref instanceof RefImpl", "'Ref is not an instance of RefImpl'"]
531
+ });
532
+ return ref._getSavedTarget();
533
+ };
534
+ var refVariance = { _T: null };
535
+ var refFromEncodedReference = (encodedReference, resolver) => {
536
+ const ref = new RefImpl(EncodedReference.toURI(encodedReference));
537
+ if (resolver) setRefResolver(ref, resolver);
538
+ return ref;
539
+ };
540
+ var StaticRefResolver = class {
541
+ objects = /* @__PURE__ */ new Map();
542
+ schemas = /* @__PURE__ */ new Map();
543
+ addObject(obj) {
544
+ this.objects.set(obj.id, obj);
545
+ return this;
546
+ }
547
+ addSchema(input) {
548
+ const schema = getStaticTypeSchema(input);
549
+ invariant(schema, "Type entity is missing its source schema", {
550
+ "~LogMeta": "~LogMeta",
551
+ F: __dxlog_file,
552
+ L: 701,
553
+ S: this,
554
+ A: ["schema", "'Type entity is missing its source schema'"]
555
+ });
556
+ const uri = getSchemaURI(schema);
557
+ invariant(uri, "Schema has no URI", {
558
+ "~LogMeta": "~LogMeta",
559
+ F: __dxlog_file,
560
+ L: 703,
561
+ S: this,
562
+ A: ["uri", "'Schema has no URI'"]
563
+ });
564
+ this.schemas.set(uri, schema);
565
+ return this;
566
+ }
567
+ resolve(uri, _options) {
568
+ const obj = this.#lookup(uri);
569
+ return makeSettledRequest(obj ? "ready" : "unavailable", obj);
570
+ }
571
+ resolveSync(uri, _load, _onLoad) {
572
+ return this.#lookup(uri);
573
+ }
574
+ async resolveLegacy(uri) {
575
+ return this.#lookup(uri);
576
+ }
577
+ async resolveSchema(uri) {
578
+ return this.schemas.get(uri);
579
+ }
580
+ #lookup(uri) {
581
+ const echoUri = EID.tryParse(uri);
582
+ const id = echoUri ? EID.getEntityId(echoUri) : void 0;
583
+ if (id == null) return;
584
+ return this.objects.get(id);
585
+ }
586
+ };
587
+ //#endregion
588
+ export { getProxyTarget as C, normalizeSpliceRange as D, isValidProxyTarget as E, symbolIsProxy as O, getProxySlot as S, isReactiveRecord as T, ChangeId as _, StaticRefResolver as a, dangerouslySetProxyId as b, getRefSavedTarget as c, makeSettledRequest as d, refFromEncodedReference as f, subscribe as g, change as h, RefTypeId as i, symbolReactivePrototype as k, getReferenceAst as l, loadRefTarget as m, Ref as n, createEchoReferenceSchema as o, setRefResolver as p, RefImpl as r, createSchemaReference as s, JSON_SCHEMA_ECHO_REF_ID as t, getSchemaReference as u, EventId as v, isProxy as w, getProxyHandler as x, createProxy as y };
589
+
590
+ //# sourceMappingURL=chunk-ref.mjs.map