@tier0/sdk-v2 0.9.10 → 0.10.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 (237) hide show
  1. package/CHANGELOG.md +96 -0
  2. package/LICENSE +21 -21
  3. package/README.md +160 -24
  4. package/dist/cjs/client.d.ts +79 -3
  5. package/dist/cjs/client.js +4 -6
  6. package/dist/cjs/client.js.map +1 -1
  7. package/dist/cjs/cloud-server.d.ts +33 -26
  8. package/dist/cjs/cloud-server.js +102 -100
  9. package/dist/cjs/cloud-server.js.map +1 -1
  10. package/dist/cjs/cloud-transport.d.ts +15 -20
  11. package/dist/cjs/cloud-transport.js +87 -68
  12. package/dist/cjs/cloud-transport.js.map +1 -1
  13. package/dist/cjs/data/bootstrap.js +3 -4
  14. package/dist/cjs/data/bootstrap.js.map +1 -1
  15. package/dist/cjs/data/call.d.ts +1 -3
  16. package/dist/cjs/data/call.js +8 -12
  17. package/dist/cjs/data/call.js.map +1 -1
  18. package/dist/cjs/data/client.d.ts +8 -7
  19. package/dist/cjs/data/client.js +24 -11
  20. package/dist/cjs/data/client.js.map +1 -1
  21. package/dist/cjs/data/collection.d.ts +3 -5
  22. package/dist/cjs/data/collection.js +3 -4
  23. package/dist/cjs/data/collection.js.map +1 -1
  24. package/dist/cjs/data/context.d.ts +5 -11
  25. package/dist/cjs/data/context.js +21 -36
  26. package/dist/cjs/data/context.js.map +1 -1
  27. package/dist/cjs/data/error.js +1 -1
  28. package/dist/cjs/data/error.js.map +1 -1
  29. package/dist/cjs/data/index.d.ts +5 -3
  30. package/dist/cjs/data/index.js +5 -5
  31. package/dist/cjs/data/index.js.map +1 -1
  32. package/dist/cjs/data/relay.d.ts +51 -0
  33. package/dist/cjs/data/relay.js +371 -0
  34. package/dist/cjs/data/relay.js.map +1 -0
  35. package/dist/cjs/data/subscribe.d.ts +22 -38
  36. package/dist/cjs/data/subscribe.js +22 -28
  37. package/dist/cjs/data/subscribe.js.map +1 -1
  38. package/dist/cjs/event-stream.d.ts +28 -0
  39. package/dist/cjs/event-stream.js +222 -0
  40. package/dist/cjs/event-stream.js.map +1 -0
  41. package/dist/cjs/mq/client.d.ts +32 -1
  42. package/dist/cjs/mq/client.js +404 -69
  43. package/dist/cjs/mq/client.js.map +1 -1
  44. package/dist/cjs/mq/index.d.ts +1 -0
  45. package/dist/cjs/mq/index.js +3 -1
  46. package/dist/cjs/mq/index.js.map +1 -1
  47. package/dist/cjs/mq/topic.d.ts +29 -0
  48. package/dist/cjs/mq/topic.js +48 -0
  49. package/dist/cjs/mq/topic.js.map +1 -0
  50. package/dist/cjs/mq/types.d.ts +21 -1
  51. package/dist/cjs/mq/types.js.map +1 -1
  52. package/dist/cjs/openapi/api.generated.d.ts +20 -0
  53. package/dist/cjs/openapi/api.generated.js +11 -0
  54. package/dist/cjs/openapi/api.generated.js.map +1 -1
  55. package/dist/cjs/openapi/client.d.ts +46 -0
  56. package/dist/cjs/openapi/client.js +158 -10
  57. package/dist/cjs/openapi/client.js.map +1 -1
  58. package/dist/cjs/openapi/codecs.generated.d.ts +74 -0
  59. package/dist/cjs/openapi/codecs.generated.js +1 -1
  60. package/dist/cjs/openapi/codecs.generated.js.map +1 -1
  61. package/dist/cjs/openapi/types.generated.d.ts +205 -1
  62. package/dist/cjs/openapi/types.generated.js.map +1 -1
  63. package/dist/cjs/page-runtime.d.ts +48 -0
  64. package/dist/cjs/page-runtime.js +74 -0
  65. package/dist/cjs/page-runtime.js.map +1 -0
  66. package/dist/cjs/platform-proxy.d.ts +17 -0
  67. package/dist/cjs/platform-proxy.js +52 -0
  68. package/dist/cjs/platform-proxy.js.map +1 -0
  69. package/dist/cjs/runtime-context.d.ts +2 -1
  70. package/dist/cjs/runtime-context.js +6 -2
  71. package/dist/cjs/runtime-context.js.map +1 -1
  72. package/dist/cjs/runtime-env.js.map +1 -1
  73. package/dist/cjs/source.d.ts +19 -1
  74. package/dist/cjs/source.js +9 -3
  75. package/dist/cjs/source.js.map +1 -1
  76. package/dist/cjs/stream.js +3 -2
  77. package/dist/cjs/stream.js.map +1 -1
  78. package/dist/cjs/streams/contract.generated.d.ts +7 -1
  79. package/dist/cjs/streams/contract.generated.js.map +1 -1
  80. package/dist/cjs/streams/messages.js +1 -10
  81. package/dist/cjs/streams/messages.js.map +1 -1
  82. package/dist/cjs/streams/requests.d.ts +3 -0
  83. package/dist/cjs/streams/requests.js +5 -2
  84. package/dist/cjs/streams/requests.js.map +1 -1
  85. package/dist/cjs/streams/transport.d.ts +1 -13
  86. package/dist/cjs/streams/transport.js +2 -18
  87. package/dist/cjs/streams/transport.js.map +1 -1
  88. package/dist/cjs/uns-v2/client.d.ts +1 -6
  89. package/dist/cjs/uns-v2/client.js +30 -6
  90. package/dist/cjs/uns-v2/client.js.map +1 -1
  91. package/dist/cjs/uns-v2/data-client.d.ts +5 -2
  92. package/dist/cjs/uns-v2/data-client.js +7 -4
  93. package/dist/cjs/uns-v2/data-client.js.map +1 -1
  94. package/dist/cjs/uns-v2/generated.d.ts +6783 -4655
  95. package/dist/cjs/uns-v2/generated.js +221 -65
  96. package/dist/cjs/uns-v2/generated.js.map +1 -1
  97. package/dist/cjs/uns-v2/sse.d.ts +7 -1
  98. package/dist/cjs/uns-v2/sse.js +12 -2
  99. package/dist/cjs/uns-v2/sse.js.map +1 -1
  100. package/dist/esm/client.d.ts +79 -3
  101. package/dist/esm/client.js +5 -7
  102. package/dist/esm/client.js.map +1 -1
  103. package/dist/esm/cloud-server.d.ts +33 -26
  104. package/dist/esm/cloud-server.js +99 -97
  105. package/dist/esm/cloud-server.js.map +1 -1
  106. package/dist/esm/cloud-transport.d.ts +15 -20
  107. package/dist/esm/cloud-transport.js +86 -67
  108. package/dist/esm/cloud-transport.js.map +1 -1
  109. package/dist/esm/data/bootstrap.js +3 -4
  110. package/dist/esm/data/bootstrap.js.map +1 -1
  111. package/dist/esm/data/call.d.ts +1 -3
  112. package/dist/esm/data/call.js +9 -13
  113. package/dist/esm/data/call.js.map +1 -1
  114. package/dist/esm/data/client.d.ts +8 -7
  115. package/dist/esm/data/client.js +22 -9
  116. package/dist/esm/data/client.js.map +1 -1
  117. package/dist/esm/data/collection.d.ts +3 -5
  118. package/dist/esm/data/collection.js +3 -4
  119. package/dist/esm/data/collection.js.map +1 -1
  120. package/dist/esm/data/context.d.ts +5 -11
  121. package/dist/esm/data/context.js +19 -33
  122. package/dist/esm/data/context.js.map +1 -1
  123. package/dist/esm/data/error.js +1 -1
  124. package/dist/esm/data/error.js.map +1 -1
  125. package/dist/esm/data/index.d.ts +5 -3
  126. package/dist/esm/data/index.js +3 -2
  127. package/dist/esm/data/index.js.map +1 -1
  128. package/dist/esm/data/relay.d.ts +51 -0
  129. package/dist/esm/data/relay.js +368 -0
  130. package/dist/esm/data/relay.js.map +1 -0
  131. package/dist/esm/data/subscribe.d.ts +22 -38
  132. package/dist/esm/data/subscribe.js +22 -27
  133. package/dist/esm/data/subscribe.js.map +1 -1
  134. package/dist/esm/event-stream.d.ts +28 -0
  135. package/dist/esm/event-stream.js +217 -0
  136. package/dist/esm/event-stream.js.map +1 -0
  137. package/dist/esm/mq/client.d.ts +32 -1
  138. package/dist/esm/mq/client.js +404 -69
  139. package/dist/esm/mq/client.js.map +1 -1
  140. package/dist/esm/mq/index.d.ts +1 -0
  141. package/dist/esm/mq/index.js +1 -0
  142. package/dist/esm/mq/index.js.map +1 -1
  143. package/dist/esm/mq/topic.d.ts +29 -0
  144. package/dist/esm/mq/topic.js +44 -0
  145. package/dist/esm/mq/topic.js.map +1 -0
  146. package/dist/esm/mq/types.d.ts +21 -1
  147. package/dist/esm/mq/types.js.map +1 -1
  148. package/dist/esm/openapi/api.generated.d.ts +20 -0
  149. package/dist/esm/openapi/api.generated.js +11 -0
  150. package/dist/esm/openapi/api.generated.js.map +1 -1
  151. package/dist/esm/openapi/client.d.ts +46 -0
  152. package/dist/esm/openapi/client.js +157 -10
  153. package/dist/esm/openapi/client.js.map +1 -1
  154. package/dist/esm/openapi/codecs.generated.d.ts +74 -0
  155. package/dist/esm/openapi/codecs.generated.js +1 -1
  156. package/dist/esm/openapi/codecs.generated.js.map +1 -1
  157. package/dist/esm/openapi/types.generated.d.ts +205 -1
  158. package/dist/esm/openapi/types.generated.js.map +1 -1
  159. package/dist/esm/page-runtime.d.ts +48 -0
  160. package/dist/esm/page-runtime.js +65 -0
  161. package/dist/esm/page-runtime.js.map +1 -0
  162. package/dist/esm/platform-proxy.d.ts +17 -0
  163. package/dist/esm/platform-proxy.js +47 -0
  164. package/dist/esm/platform-proxy.js.map +1 -0
  165. package/dist/esm/runtime-context.d.ts +2 -1
  166. package/dist/esm/runtime-context.js +6 -2
  167. package/dist/esm/runtime-context.js.map +1 -1
  168. package/dist/esm/runtime-env.js.map +1 -1
  169. package/dist/esm/source.d.ts +19 -1
  170. package/dist/esm/source.js +10 -4
  171. package/dist/esm/source.js.map +1 -1
  172. package/dist/esm/stream.js +4 -3
  173. package/dist/esm/stream.js.map +1 -1
  174. package/dist/esm/streams/contract.generated.d.ts +7 -1
  175. package/dist/esm/streams/contract.generated.js.map +1 -1
  176. package/dist/esm/streams/messages.js +1 -10
  177. package/dist/esm/streams/messages.js.map +1 -1
  178. package/dist/esm/streams/requests.d.ts +3 -0
  179. package/dist/esm/streams/requests.js +5 -2
  180. package/dist/esm/streams/requests.js.map +1 -1
  181. package/dist/esm/streams/transport.d.ts +1 -13
  182. package/dist/esm/streams/transport.js +1 -17
  183. package/dist/esm/streams/transport.js.map +1 -1
  184. package/dist/esm/uns-v2/client.d.ts +1 -6
  185. package/dist/esm/uns-v2/client.js +30 -6
  186. package/dist/esm/uns-v2/client.js.map +1 -1
  187. package/dist/esm/uns-v2/data-client.d.ts +5 -2
  188. package/dist/esm/uns-v2/data-client.js +8 -5
  189. package/dist/esm/uns-v2/data-client.js.map +1 -1
  190. package/dist/esm/uns-v2/generated.d.ts +6783 -4655
  191. package/dist/esm/uns-v2/generated.js +221 -65
  192. package/dist/esm/uns-v2/generated.js.map +1 -1
  193. package/dist/esm/uns-v2/sse.d.ts +7 -1
  194. package/dist/esm/uns-v2/sse.js +12 -2
  195. package/dist/esm/uns-v2/sse.js.map +1 -1
  196. package/package.json +25 -12
  197. package/skills/tier0-sdk-v2/SKILL.md +11 -5
  198. package/skills/tier0-sdk-v2/references/integration.md +14 -24
  199. package/skills/tier0-sdk-v2/tier0-sdk-v2-data/SKILL.md +11 -5
  200. package/skills/tier0-sdk-v2/tier0-sdk-v2-data/references/consistency.md +6 -10
  201. package/skills/tier0-sdk-v2/tier0-sdk-v2-data/references/errors.md +20 -3
  202. package/skills/tier0-sdk-v2/tier0-sdk-v2-data/references/read-write.md +46 -13
  203. package/skills/tier0-sdk-v2/tier0-sdk-v2-members/SKILL.md +2 -2
  204. package/skills/tier0-sdk-v2/tier0-sdk-v2-members/references/app-members.md +5 -1
  205. package/skills/tier0-sdk-v2/tier0-sdk-v2-mq/SKILL.md +25 -0
  206. package/skills/tier0-sdk-v2/tier0-sdk-v2-mq/references/quickstart.md +1 -1
  207. package/skills/tier0-sdk-v2/tier0-sdk-v2-notifications/SKILL.md +3 -3
  208. package/skills/tier0-sdk-v2/tier0-sdk-v2-notifications/references/send.md +6 -6
  209. package/skills/tier0-sdk-v2/tier0-sdk-v2-source/SKILL.md +4 -4
  210. package/skills/tier0-sdk-v2/tier0-sdk-v2-source/references/changes.md +2 -2
  211. package/skills/tier0-sdk-v2/tier0-sdk-v2-source/references/create.md +26 -36
  212. package/skills/tier0-sdk-v2/tier0-sdk-v2-source/references/delete.md +9 -23
  213. package/skills/tier0-sdk-v2/tier0-sdk-v2-source/references/protocols.md +12 -29
  214. package/skills/tier0-sdk-v2/tier0-sdk-v2-source/references/read.md +4 -5
  215. package/skills/tier0-sdk-v2/tier0-sdk-v2-source/references/update.md +5 -5
  216. package/skills/tier0-sdk-v2/tier0-sdk-v2-stream/SKILL.md +3 -3
  217. package/skills/tier0-sdk-v2/tier0-sdk-v2-stream/references/create.md +23 -9
  218. package/skills/tier0-sdk-v2/tier0-sdk-v2-stream/references/deploy.md +14 -12
  219. package/skills/tier0-sdk-v2/tier0-sdk-v2-stream/references/http-server.md +4 -4
  220. package/skills/tier0-sdk-v2/tier0-sdk-v2-stream/references/read.md +4 -3
  221. package/skills/tier0-sdk-v2/tier0-sdk-v2-streams/SKILL.md +12 -12
  222. package/skills/tier0-sdk-v2/tier0-sdk-v2-uns/SKILL.md +2 -1
  223. package/skills/tier0-sdk-v2/tier0-sdk-v2-uns/references/create.md +2 -2
  224. package/skills/tier0-sdk-v2/tier0-sdk-v2-uns/references/delete.md +22 -1
  225. package/skills/tier0-sdk-v2/tier0-sdk-v2-uns/references/read.md +5 -6
  226. package/dist/cjs/app-identity-contract.generated.d.ts +0 -22
  227. package/dist/cjs/app-identity-contract.generated.js +0 -51
  228. package/dist/cjs/app-identity-contract.generated.js.map +0 -1
  229. package/dist/cjs/runtime.d.ts +0 -13
  230. package/dist/cjs/runtime.js +0 -51
  231. package/dist/cjs/runtime.js.map +0 -1
  232. package/dist/esm/app-identity-contract.generated.d.ts +0 -22
  233. package/dist/esm/app-identity-contract.generated.js +0 -48
  234. package/dist/esm/app-identity-contract.generated.js.map +0 -1
  235. package/dist/esm/runtime.d.ts +0 -13
  236. package/dist/esm/runtime.js +0 -46
  237. package/dist/esm/runtime.js.map +0 -1
@@ -210,7 +210,6 @@ class Collection {
210
210
  async send(operation, body, options = {}) {
211
211
  const collectionId = await this.runtime.resolve(this.definition);
212
212
  return this.runtime.call(operation, { collectionId, ...compact(body) }, {
213
- dataSubject: this.runtime.subject(),
214
213
  signal: this.runtime.signal(),
215
214
  ...options,
216
215
  });
@@ -237,9 +236,9 @@ class Collection {
237
236
  }
238
237
  /**
239
238
  * Records by ID, in the order asked for (each ID once, at its first
240
- * position); IDs that do not exist, are deleted or are hidden by employee
241
- * data rules are listed in `missing` alike. More than 100 IDs are read in
242
- * chunks of 100 (not one snapshot).
239
+ * position); IDs that do not exist or are deleted are listed in
240
+ * `missing`. More than 100 IDs are read in chunks of 100 (not one
241
+ * snapshot).
243
242
  */
244
243
  async get(ids, options = {}) {
245
244
  const unique = [...new Set(ids)];
@@ -1 +1 @@
1
- {"version":3,"file":"collection.js","sourceRoot":"","sources":["../../../src/data/collection.ts"],"names":[],"mappings":";;;AAwFA,8CAWC;AAED,sBAMC;AAqND,kDAeC;AApUD,2CAAsF;AACtF,yCAAuC;AACvC,2CAA+D;AAC/D,uCAAgF;AAEhF,sDAAsD;AACzC,QAAA,aAAa,GAAG,GAAG,CAAC;AAEjC;;;GAGG;AACU,QAAA,gBAAgB,GAAG,GAAG,CAAC;AAgEpC,iEAAiE;AACjE,SAAgB,iBAAiB,CAAC,SAAiB,EAAE,KAAa;IAChE,IAAI,KAAK,GAAG,wBAAgB,EAAE,CAAC;QAC7B,MAAM,IAAI,oBAAS,CAAC;YAClB,OAAO,EACL,GAAG,SAAS,oBAAoB,wBAAgB,0BAA0B,KAAK,IAAI;gBACnF,kCAAkC,wBAAgB,4DAA4D;gBAC9G,iGAAiG;YACnG,MAAM,EAAE,GAAG;YACX,IAAI,EAAE,sBAAsB;SAC7B,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,SAAgB,KAAK,CAAI,MAAiB;IACxC,OAAO;QACL,GAAI,MAAM,CAAC,IAAU;QACrB,GAAG,EAAE,MAAM,CAAC,EAAE;QACd,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE;KAC/F,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAa,MAAM;IAOE;IANX,QAAQ,CAAQ;IAChB,UAAU,CAAU;IACpB,UAAU,CAAc;IACxB,OAAO,GAAG,KAAK,CAAC;IAExB,YACmB,SAKK,EACtB,UAAoE,EAAE;QANrD,cAAS,GAAT,SAAS,CAKJ;QAGtB,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;QAC7B,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC;QAChC,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;IACvC,CAAC;IAEO,gBAAgB;QACtB,IAAI,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;IAC3F,CAAC;IAED,IAAI,CAAC,IAAU;QACb,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,8EAA8E;IAC9E,KAAK,CAAC,KAAa;QACjB,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QACxB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,CAAC,UAAsB;QAC5B,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC;QAC3B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,MAAM,IAAI,GAAG,IAAA,qBAAW,EAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxC,IAAI,SAAS,GAAG,IAAI,CAAC,UAAU,IAAI,MAAM,CAAC,iBAAiB,CAAC;QAC5D,6FAA6F;QAC7F,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,qBAAa,EAAE,SAAS,CAAC,CAAC;QAChD,IAAI,KAAK,GAAqB,IAAI,CAAC;QACnC,OAAO,SAAS,GAAG,CAAC,EAAE,CAAC;YACrB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;YACtF,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC;gBAAE,MAAM,IAAI,CAAC;YAC9D,SAAS,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;YAC/B,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO;YAC1D,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC;QACpB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO;QACX,MAAM,GAAG,GAAQ,EAAE,CAAC;QACpB,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,IAAI;YAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9C,OAAO,GAAG,CAAC;IACb,CAAC;CACF;AAhED,wBAgEC;AAED,gHAAgH;AAChH,SAAS,gBAAgB,CAAC,MAA0C;IAClE,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,OAAO,CAAC,CAAC,CAAC;AACzG,CAAC;AAyBD,uDAAuD;AAC1C,QAAA,WAAW,GAAG,GAAG,CAAC;AAsE/B,SAAS,OAAO,CAAoC,KAAQ;IAC1D,OAAO,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,SAAS,CAAC,CAAM,CAAC;AACnG,CAAC;AAED,SAAS,eAAe,CAAC,MAAc;IACrC,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;AAC7D,CAAC;AAED,iFAAiF;AACjF,SAAS,WAAW,CAAC,MAAc,EAAE,OAAwB;IAC3D,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;IACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,qBAAa,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC1F,MAAM,QAAQ,GAA8B,EAAE,CAAC;IAC/C,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC;QAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACtE,MAAM,IAAI,GAAG,IAAA,qBAAW,EAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,IAAI,IAAI;QAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,IAAI,OAAO,CAAC,UAAU;QAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IACxE,MAAM,IAAI,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;IAClJ,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;AAClC,CAAC;AAED,SAAS,eAAe,CAAC,KAAa,EAAE,MAAc;IACpD,MAAM,QAAQ,GAA8B,EAAE,CAAC;IAC/C,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC;QAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACtE,sFAAsF;IACtF,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,IAAI,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;IACtG,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,YAAY,GAAG,CAAC,GAAoC,EAAc,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,GAAG,IAAI,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;AAE1H,SAAS,UAAU,CAAC,GAAuC;IACzD,OAAO,MAAM,CAAC,OAAO,CAAC,GAAG,IAAI,EAAE,CAAC;SAC7B,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;SACzC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;AACzB,CAAC;AAED;;;;GAIG;AACH,SAAgB,mBAAmB,CAAC,MAAgB,EAAE,SAAiB,EAAE,SAAkC;IACzG,IAAI,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxD,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,IAAI,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrG,MAAM,OAAO,GAAG,SAAS,KAAK,SAAS,IAAI,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QAC/F,MAAM,IAAI,oBAAS,CAAC;YAClB,OAAO,EAAE,GAAG,SAAS,eAAe,MAAM,CAAC,WAAW,CAAC,MAAM,kBAAkB,MAAM,CAAC,CAAC,CAAC,wBAAwB,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG;YAChI,MAAM,EAAE,GAAG;YACX,IAAI,EAAE,cAAc;YACpB,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,YAAY;YAC/C,QAAQ,EAAE,CAAC;YACX,OAAO,EAAE,SAAS;gBAChB,CAAC,CAAC,EAAE,GAAG,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,IAAI,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE;gBACjL,CAAC,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE;SACxC,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,YAAY,CAAC,SAAiB,EAAE,MAA8B,EAAE,WAA+B,EAAE,KAAgB;IACxH,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,IAAI,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5F,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/G,OAAO,IAAI,oBAAS,CAAC;QACnB,OAAO,EACL,GAAG,SAAS,cAAc,MAAM,qBAAqB,KAAK,CAAC,OAAO,GAAG;YACrE,CAAC,WAAW;gBACV,CAAC,CAAC,qDAAqD,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,2DAA2D,CAAC,CAAC,CAAC,EAAE,iCAAiC;gBAC/K,CAAC,CAAC,4EAA4E,CAAC;QACnF,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,cAAc,EAAE,KAAK,CAAC,cAAc;QACpC,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,yFAAyF;QACzF,SAAS,EAAE,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW;QACzD,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;QACtB,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,OAAO,EAAE,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,oBAAoB,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,IAAI,IAAI,EAAE,GAAG,WAAW,EAAE;QACrH,KAAK;KACN,CAAC,CAAC;AACL,CAAC;AAED,MAAa,UAAU;IAEV;IACQ;IAFnB,YACW,UAA4B,EACpB,OAA0B;QADlC,eAAU,GAAV,UAAU,CAAkB;QACpB,YAAO,GAAP,OAAO,CAAmB;IAC1C,CAAC;IAEJ,IAAI,KAAK;QACP,OAAO,IAAA,2BAAe,EAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC1C,CAAC;IAED;;;;OAIG;IACK,IAAI,CAAI,SAA6B,EAAE,IAA6B,EAAE,UAAuB,EAAE;QACrG,MAAM,IAAI,GAAG,IAAI,CAAC,IAAwC,CAAC;QAC3D,MAAM,SAAS,GAAG,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,IAAI,OAAO,IAAI,CAAC,WAAW,KAAK,QAAQ,IAAI,OAAO,IAAI,EAAE,MAAM,KAAK,QAAQ,CAAC;QAC9H,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAI,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,EAAE,WAAW,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,CAAC,SAAS,EAAE,CAAC,CAAC;IACnI,CAAC;IAEO,KAAK,CAAC,IAAI,CAAI,SAA6B,EAAE,IAA6B,EAAE,UAAuB,EAAE;QAC3G,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACjE,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAI,SAAS,EAAE,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE;YACzE,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;YACnC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE;YAC7B,GAAG,OAAO;SACX,CAAC,CAAC;IACL,CAAC;IAED,gFAAgF;IAEhF,IAAI,CAAC,SAAiB,EAAE,EAAE,UAAuB,EAAE;QACjD,OAAO,IAAI,MAAM,CAAc,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE;YACzE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAA6C,YAAY,EAAE;gBACvF,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;gBAC3D,IAAI;gBACJ,UAAU;gBACV,KAAK,EAAE,IAAI;gBACX,MAAM,EAAE,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;aACtD,CAAC,CAAC;YACH,OAAO;gBACL,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,KAAK,CAAI,MAAM,CAAC,CAAC;gBACrD,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,OAAO,IAAI,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI;aAChG,CAAC;QACJ,CAAC,EAAE,OAAO,CAAC,CAAC;IACd,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,SAAiB,EAAE,EAAE,UAAsC,EAAE;QACzE,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;QAC5E,OAAO,KAAK,IAAI,IAAI,CAAC;IACvB,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,GAAG,CAAC,GAAsB,EAAE,UAAuC,EAAE;QACzE,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QACjC,MAAM,MAAM,GAAe,EAAE,CAAC;QAC9B,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,IAAI,mBAAW;YAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,mBAAW,CAAC,CAAC,CAAC;QACvH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACrD,IAAI,CAAC,IAAI,CAAkB,WAAW,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC;QAC5F,OAAO;YACL,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,KAAK,CAAI,MAAM,CAAC,CAAC,CAAC;YAClF,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC;SACrD,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,QAAQ,CAAC,SAAiB,EAAE,EAAE,UAA2B,EAAE;QAC/D,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC9D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAA+C,yBAAyB,EAAE,IAAI,CAAC,CAAC;QAC9G,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IACtE,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,cAAc,CAAC,SAAiB,EAAE,EAAE,UAAiC,EAAE;QAC3E,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAc,aAAa,EAAE,EAAE,MAAM,EAAE,eAAe,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC5H,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;IACxD,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,OAAO,CAAC,KAAa,EAAE,SAAiB,EAAE;QAC9C,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,SAAS,CAAkC,eAAe,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;QAC7G,OAAO,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAChC,CAAC;IAED;;;;;OAKG;IACH,IAAI,KAAK;QACP,MAAM,GAAG,GAAG,CAAI,EAAU,EAAE,KAA6C,EAAE,KAAyB,EAAiB,EAAE,CAAC,CAAC;YACvH,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,KAAK,EAAE,CAAC,EAAE,CAAC;YACxD,KAAK,EAAE,KAA6B;SACrC,CAAC,CAAC;QACH,OAAO;YACL,IAAI,EAAE,CAAC,MAAM,GAAG,EAAE,EAAE,OAAO,GAAG,EAAE,EAAE,EAAE,CAClC,GAAG,CAAC,MAAM,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;gBACvB,MAAM,EAAE,eAAe,CAAC,MAAM,CAAC;gBAC/B,IAAI,EAAE,IAAA,qBAAW,EAAC,OAAO,CAAC,IAAI,CAAC;gBAC/B,UAAU,EAAE,OAAO,CAAC,UAAU;gBAC9B,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,qBAAa,EAAE,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC;gBACnD,KAAK,EAAE,OAAO,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,QAAQ,EAAE;aAC9E,CAAC,EAAE,CAAC,IAAqE,EAAE,EAAE,CAAC,CAAC;gBAC9E,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,KAAK,CAAI,MAAM,CAAC,CAAC;gBACnD,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO;gBAC9B,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC7C,CAAC,CAAC;YACL,QAAQ,EAAE,CAAC,MAAM,GAAG,EAAE,EAAE,OAAO,GAAG,EAAE,EAAE,EAAE;gBACtC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;gBAC9D,OAAO,GAAG,CAAC,WAAW,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,IAAkD,EAAE,EAAE,CAAC,CAAC;oBACjG,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,QAAQ;iBACrD,CAAC,CAAC,CAAC;YACN,CAAC;YACD,KAAK,EAAE,CAAC,MAAM,GAAG,EAAE,EAAE,OAAO,GAAG,EAAE,EAAE,EAAE,CACnC,GAAG,CAAC,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,eAAe,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,EACxF,CAAC,IAAiB,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;YACxE,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,EAAE,EAAE,EAAE,CAC9B,GAAG,CAAC,WAAW,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;gBAC5B,QAAQ,EAAE,MAAM,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;gBAClE,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,qBAAa,EAAE;aACvD,CAAC,EAAE,CAAC,IAAkD,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;YAC3F,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,EAAE,EAAE,EAAE,CAC/B,GAAG,CAAC,UAAU,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,qBAAa,EAAE,EAAE,CAAC,EAC9H,CAAC,IAA2B,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC;YACjD,SAAS,EAAE,CAA8B,QAAmC,EAAE,EAAE,CAC9E,GAAG,CAAC,WAAW,EAAE,KAAK,IAAI,EAAE;gBAC1B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;gBAClD,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;gBACvC,+DAA+D;gBAC/D,OAAO,IAAI,KAAK,SAAS,IAAI,QAAQ,IAAI,IAAI;oBAC3C,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE;oBACtB,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,qBAAa,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,qBAAa,EAAE,EAAE,CAAC;YACxJ,CAAC,EAAE,CAAC,IAAoB,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC;YAC1C,GAAG,EAAE,CAAC,GAAG,EAAE,OAAO,GAAG,EAAE,EAAE,EAAE;gBACzB,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;gBACjC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,GAAG,mBAAW,EAAE,CAAC;oBACrD,MAAM,IAAI,SAAS,CAAC,qBAAqB,mBAAW,6CAA6C,CAAC,CAAC;gBACrG,CAAC;gBACD,OAAO,GAAG,CAAC,KAAK,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC,EAC7E,CAAC,IAAqB,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,KAAK,CAAI,MAAM,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YACjH,CAAC;SACF,CAAC;IACJ,CAAC;IAED,+CAA+C;IAC/C,KAAK,CAAC,QAAQ,CAAC,KAAa,EAAE,SAAiB,EAAE;QAC/C,MAAM,MAAM,GAAc,EAAE,CAAC;QAC7B,KAAK,IAAI,IAAI,GAAG,CAAC,GAAI,IAAI,IAAI,CAAC,EAAE,CAAC;YAC/B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAoD,yBAAyB,EAAE;gBAC3G,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,IAAI,KAAK,EAAE,EAAE,EAAE,CAAC;gBAChE,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,qBAAa,EAAE;aACpD,CAAC,CAAC;YACH,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YACnD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO;gBAAE,OAAO,MAAM,CAAC;QAC9C,CAAC;IACH,CAAC;IAED;;;;;;;;;;;OAWG;IACH,SAAS,CAA8B,QAAmC;QACxE,8EAA8E;QAC9E,OAAO,IAAI,MAAM,CAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,aAAa,CAAI,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE,WAAW,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC,CAAC,CAAC;IAC5L,CAAC;IAEO,KAAK,CAAC,aAAa,CACzB,QAAmC,EACnC,KAAuB,EACvB,IAAY;QAEZ,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QAClD,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACvC,IAAI,IAAI,KAAK,SAAS,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;YAC3C,+DAA+D;YAC/D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAiB,yBAAyB,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;YAChG,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QAC7C,CAAC;QACD,IAAI,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC;YAC7B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAqC,yBAAyB,EAAE;gBAC5F,QAAQ,EAAE,MAAM;gBAChB,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE;aACxF,CAAC,CAAC;YACH,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,OAAO,IAAI,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAClI,CAAC;QACD,MAAM,IAAI,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACnD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAqC,yBAAyB,EAAE;YAC5F,QAAQ,EAAE,MAAM;YAChB,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE;SACrC,CAAC,CAAC;QACH,OAAO;YACL,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;SAC9E,CAAC;IACJ,CAAC;IAED,qFAAqF;IAC7E,KAAK,CAAC,aAAa,CAAC,QAA4C;QACtE,OAAO,OAAO,CAAC,GAAG,CAChB,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;YAC3B,IAAI,OAAO,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;gBACpD,OAAO,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,IAAA,qBAAW,EAAC,KAAK,CAAC,KAAa,CAAC,EAAE,CAAC;YAC/D,CAAC;YACD,IAAI,SAAS,IAAI,KAAK,IAAI,KAAK,CAAC,OAAO,IAAI,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;gBAC7E,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,MAAM,EAAE,GAAG,KAAK,CAAC,OAAkC,CAAC;gBACtF,MAAM,QAAQ,GAA4B,EAAE,GAAG,MAAM,EAAE,CAAC;gBACxD,IAAI,IAAI,KAAK,SAAS;oBAAE,QAAQ,CAAC,YAAY,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAiC,CAAC,CAAC;gBAC9G,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;oBAAE,QAAQ,CAAC,QAAQ,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,KAAkC,CAAC,CAAC;gBAC3G,OAAO,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;YACzC,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC,CAAC,CACH,CAAC;IACJ,CAAC;IASD,KAAK,CAAC,SAAS,CAAC,QAAmC,EAAE,UAA4B,EAAE;QACjF,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,IAAA,4BAAgB,EAAC,IAAI,CAAC,UAAU,EAAE,QAAmC,CAAC,CAAC;QAC5F,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAA2C,iBAAiB,EAAE;YAC1F,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU;SACzH,CAAC,CAAC;QACH,IAAI,OAAO,CAAC,cAAc,KAAK,OAAO;YAAE,OAAO,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,KAAK,EAAE,KAAK,CAAI,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QAChH,OAAO,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC;IAC3C,CAAC;IAED,4DAA4D;IAC5D,KAAK,CAAC,UAAU,CACd,SAAiD,EACjD,UAAuC,EAAE;QAEzC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,aAAa,EAAE,CAAC,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC;QACzE,iBAAiB,CAAC,YAAY,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;QAClD,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAA,4BAAgB,EAAC,IAAI,CAAC,UAAU,EAAE,QAAmC,CAAC,CAAC,CAAC;QACrH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAc,iBAAiB,EAAE;YAC7D,UAAU,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;YAClF,OAAO,EAAE,IAAI;YACb,MAAM,EAAE,IAAI;YACZ,cAAc,EAAE,OAAO,CAAC,cAAc;SACvC,CAAC,CAAC;QACH,mBAAmB,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;QAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,CAAC,aAAa,IAAI,CAAC,EAAE,WAAW,EAAE,UAAU,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC;IACnG,CAAC;IAED,KAAK,CAAC,SAAS,CACb,MAAc,EACd,MAAc,EACd,UAAyB,EAAE;QAE3B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAc,iBAAiB,EAAE;YAC7D,MAAM;YACN,MAAM,EAAE,IAAA,0BAAc,EAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC;YAC/C,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;YAC1C,IAAI,EAAE,IAAA,qBAAW,EAAC,OAAO,CAAC,IAAI,CAAC;YAC/B,YAAY,EAAE,OAAO,CAAC,YAAY;YAClC,cAAc,EAAE,OAAO,CAAC,cAAc;SACvC,CAAC,CAAC;QACH,OAAO,EAAE,YAAY,EAAE,MAAM,CAAC,YAAY,IAAI,CAAC,EAAE,aAAa,EAAE,MAAM,CAAC,aAAa,IAAI,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,IAAI,EAAE,CAAC;IACrI,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,UAAU,CACd,MAAc,EACd,MAAc,EACd,UAA0E,EAAE;QAE5E,MAAM,SAAS,GAAG,IAAA,0BAAc,EAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QAC1D,IAAI,YAAY,GAAG,CAAC,CAAC;QACrB,IAAI,aAAa,GAAG,CAAC,CAAC;QACtB,MAAM,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,kBAAkB,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,OAAO,CAAC,YAAY,EAAE,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC,MAAM,EAAE,EAAE;YACxJ,YAAY,IAAI,MAAM,CAAC,YAAY,IAAI,CAAC,CAAC;YACzC,aAAa,IAAI,MAAM,CAAC,aAAa,IAAI,CAAC,CAAC;YAC3C,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,CAAC;QACzC,CAAC,CAAC,CAAC;QACH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,CAAC;IACzC,CAAC;IAED,8EAA8E;IACtE,KAAK,CAAC,SAAS,CACrB,IAAY,EACZ,SAA6B,EAC7B,IAA6B,EAC7B,IAAwB,EACxB,GAAoD;QAEpD,IAAI,WAAW,GAAG,IAAI,CAAC;QACvB,IAAI,SAA6C,CAAC;QAClD,GAAG,CAAC;YACF,IAAI,MAAgB,CAAC;YACrB,IAAI,CAAC;gBACH,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAW,SAAS,EAAE,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;YACzF,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,CAAC,KAAK,YAAY,oBAAS,CAAC;oBAAE,MAAM,KAAK,CAAC;gBAC/C,6EAA6E;gBAC7E,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,KAAK,WAAW,CAAC,CAAC,CAAE,KAAK,CAAC,OAAoB,CAAC,CAAC,CAAC,SAAS,CAAC;gBACvF,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;gBAC5C,0EAA0E;gBAC1E,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,GAAG,CAAC,CAAC;oBAAE,MAAM,KAAK,CAAC;gBAC9E,MAAM,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;YAChG,CAAC;YACD,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC;YACxB,mBAAmB,CAAC,MAAM,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;YAC7C,WAAW,GAAG,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC;QACtF,CAAC,QAAQ,WAAW,EAAE;IACxB,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,UAAU,CACd,MAAc,EACd,WAAmB,EACnB,UAA+C,EAAE;QAEjD,MAAM,EAAE,IAAI,EAAE,GAAG,IAAA,4BAAgB,EAAC,IAAI,CAAC,UAAU,EAAE,WAAsC,CAAC,CAAC;QAC3F,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAc,kBAAkB,EAAE;YAC9D,MAAM;YACN,WAAW,EAAE,IAAI;YACjB,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;YAC1C,IAAI,EAAE,IAAA,qBAAW,EAAC,OAAO,CAAC,IAAI,CAAC;YAC/B,cAAc,EAAE,OAAO,CAAC,cAAc;SACvC,CAAC,CAAC;QACH,OAAO,EAAE,YAAY,EAAE,MAAM,CAAC,YAAY,IAAI,CAAC,EAAE,aAAa,EAAE,MAAM,CAAC,aAAa,IAAI,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,IAAI,EAAE,CAAC;IACrI,CAAC;IAED,qEAAqE;IACrE,KAAK,CAAC,SAAS,CAAC,MAAc,EAAE,UAA+E,EAAE;QAC/G,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAC5B,iBAAiB,EACjB,EAAE,MAAM,EAAE,gBAAgB,EAAE,OAAO,CAAC,gBAAgB,EAAE,IAAI,EAAE,IAAA,qBAAW,EAAC,OAAO,CAAC,IAAI,CAAC,EAAE,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,CAChI,CAAC;QACF,OAAO,EAAE,YAAY,EAAE,MAAM,CAAC,YAAY,IAAI,CAAC,EAAE,CAAC;IACpD,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,UAAU,CAAC,MAAc,EAAE,UAAoC,EAAE;QACrE,IAAI,YAAY,GAAG,CAAC,CAAC;QACrB,MAAM,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,kBAAkB,EAAE,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC,MAAM,EAAE,EAAE;YACjG,YAAY,IAAI,MAAM,CAAC,YAAY,IAAI,CAAC,CAAC;YACzC,OAAO,EAAE,YAAY,EAAE,CAAC;QAC1B,CAAC,CAAC,CAAC;QACH,OAAO,EAAE,YAAY,EAAE,CAAC;IAC1B,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,gBAAgB,CAAC,MAAc,EAAE,MAAc,EAAE,UAA6B,EAAE;QACpF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAA8B,iBAAiB,EAAE;YAC7E,MAAM;YACN,MAAM,EAAE,IAAA,0BAAc,EAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC;YAC/C,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;YAC1C,IAAI,EAAE,IAAA,qBAAW,EAAC,OAAO,CAAC,IAAI,CAAC;YAC/B,YAAY,EAAE,OAAO,CAAC,YAAY;YAClC,cAAc,EAAE,OAAO,CAAC,cAAc,IAAI,OAAO;YACjD,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,cAAc,EAAE,OAAO,CAAC,cAAc;SACvC,CAAC,CAAC;QACH,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACtD,CAAC;IAED,KAAK,CAAC,iBAAiB,CACrB,MAAc,EACd,WAAmB,EACnB,UAAmD,EAAE;QAErD,MAAM,EAAE,IAAI,EAAE,GAAG,IAAA,4BAAgB,EAAC,IAAI,CAAC,UAAU,EAAE,WAAsC,CAAC,CAAC;QAC3F,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAA8B,kBAAkB,EAAE;YAC9E,MAAM;YACN,WAAW,EAAE,IAAI;YACjB,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;YAC1C,IAAI,EAAE,IAAA,qBAAW,EAAC,OAAO,CAAC,IAAI,CAAC;YAC/B,cAAc,EAAE,OAAO,CAAC,cAAc,IAAI,OAAO;YACjD,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,cAAc,EAAE,OAAO,CAAC,cAAc;SACvC,CAAC,CAAC;QACH,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACtD,CAAC;IAED,KAAK,CAAC,gBAAgB,CACpB,MAAc,EACd,UAAkG,EAAE;QAEpG,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAC5B,iBAAiB,EACjB;YACE,MAAM;YACN,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;YAC1C,IAAI,EAAE,IAAA,qBAAW,EAAC,OAAO,CAAC,IAAI,CAAC;YAC/B,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,cAAc,EAAE,OAAO,CAAC,cAAc;YACtC,cAAc,EAAE,QAAQ;SACzB,CACF,CAAC;QACF,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACtD,CAAC;IAED,gHAAgH;IAChH,KAAK,CAAC,SAAS,CACb,UAAoC,EACpC,UAAuC,EAAE;QAUzC,iBAAiB,CAAC,WAAW,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE;YAC1C,IAAI,WAAW,IAAI,SAAS,EAAE,CAAC;gBAC7B,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,IAAA,4BAAgB,EAAC,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;gBACrF,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;YAC9C,CAAC;YACD,IAAI,WAAW,IAAI,SAAS,EAAE,CAAC;gBAC7B,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,SAAS,CAAC,SAAS,CAAC;gBAC7D,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAA,0BAAc,EAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,IAAA,qBAAW,EAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;YAC9H,CAAC;YACD,IAAI,YAAY,IAAI,SAAS,EAAE,CAAC;gBAC9B,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,SAAS,CAAC,UAAU,CAAC;gBACnE,MAAM,EAAE,IAAI,EAAE,GAAG,IAAA,4BAAgB,EAAC,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;gBAChE,OAAO,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAA,qBAAW,EAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;YACjG,CAAC;YACD,IAAI,WAAW,IAAI,SAAS,EAAE,CAAC;gBAC7B,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,IAAA,qBAAW,EAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;YACrH,CAAC;YACD,MAAM,IAAI,KAAK,CACb,mCAAmC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,uDAAuD,CAC5H,CAAC;QACJ,CAAC,CAAC,CAAC;QACH,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO,EAAE,aAAa,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,WAAW,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC;QACtI,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAC5B,iBAAiB,EACjB,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,CAC5F,CAAC;QACF,mBAAmB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QACzC,MAAM,WAAW,GAAG,CAAC,GAAuC,EAAE,EAAE,CAC9D,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;QAC1F,OAAO;YACL,aAAa,EAAE,MAAM,CAAC,aAAa,IAAI,CAAC;YACxC,YAAY,EAAE,MAAM,CAAC,YAAY,IAAI,CAAC;YACtC,aAAa,EAAE,MAAM,CAAC,aAAa,IAAI,CAAC;YACxC,YAAY,EAAE,MAAM,CAAC,YAAY,IAAI,CAAC;YACtC,aAAa,EAAE,MAAM,CAAC,aAAa,IAAI,CAAC;YACxC,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,WAAW,CAAC;YAC5C,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,WAAW,CAAC;SAC7C,CAAC;IACJ,CAAC;CACF;AAvfD,gCAufC","sourcesContent":["/**\n * Mongo-driver-style collection handle over the UNS record operations\n * (`recordFind`, `recordBulkWrite`, ...).\n *\n * Stored records `{ id, data, revision, createdAt, updatedAt }` are exposed as\n * flat documents `{ _id, ...data, _meta: { revision, createdAt, updatedAt } }`;\n * filters, sorts and projections use the same paths (`status`,\n * `customer.id`, `_id`, `_meta.updatedAt`).\n */\nimport type { UnsV2OperationName } from '../uns-v2/generated.js';\nimport type { CallOptions, DataCall } from './call.js';\nimport { collectionLabel, type CollectionTarget, type RecordMeta } from './define.js';\nimport { DataError } from './error.js';\nimport { validateDocument, validateUpdate } from './schema.js';\nimport { toSortPairs, type Filter, type Sort, type SortPairs } from './sort.js';\n\n/** UNS page limit for find / aggregate / distinct. */\nexport const MAX_PAGE_SIZE = 200;\n\n/**\n * UNS commits at most 200 items in one synchronous atomic batch\n * (insertMany, bulkWrite, data.transact).\n */\nexport const MAX_ATOMIC_ITEMS = 200;\n\nexport type WithMeta<T> = T & { _id: string; _meta: RecordMeta };\n/** A projection may omit business fields at any depth; array and tuple containers retain their shape. */\nexport type DeepPartial<T> = T extends readonly unknown[]\n ? { [K in keyof T]: DeepPartial<T[K]> }\n : T extends object ? { [K in keyof T]?: DeepPartial<T[K]> } : T;\nexport type Projection = Record<string, 0 | 1 | boolean>;\nexport type Update = Record<string, unknown>;\n\nexport interface UnsRecord {\n id: string;\n data: Record<string, unknown>;\n revision: number;\n createdAt: number;\n updatedAt: number;\n}\n\ninterface PageInfo {\n hasMore: boolean;\n nextCursor?: string | null;\n nextPage?: number | null;\n}\n\n/** Position of the next page: an opaque cursor or a 1-based offset page number. */\ntype PageToken = string | number;\n\ninterface Page<T> {\n items: T[];\n /** Token of the following page; null when this was the last one. */\n next: PageToken | null;\n}\n\ninterface WriteResult {\n matchedCount?: number;\n modifiedCount?: number;\n deletedCount?: number;\n insertedCount?: number;\n upsertedId?: string | null;\n insertedIds?: Record<string, string>;\n upsertedIds?: Record<string, string>;\n upsertedCount?: number;\n writeErrors?: unknown[];\n hasMore?: boolean;\n}\n\n/** A page of `updateMany` / `deleteMany`, the only writes that continue with `resumeAfter`. */\ninterface ManyPage extends WriteResult {\n resumeAfter?: string | null;\n}\n\n/** Runtime services a collection handle needs from its client. */\nexport interface CollectionRuntime {\n call: DataCall;\n /** Resolve an existing ID directly, or ensure a declared collection. */\n resolve(target: CollectionTarget | string): Promise<string>;\n /** Runs a call, re-ensuring and retrying once when its collection ID went stale (see bootstrap). */\n recover<R>(fn: () => Promise<R>, options: { collections: readonly CollectionTarget[]; retry?: boolean }): Promise<R>;\n /** Data subject of the request being served. */\n subject(): string | undefined;\n /** Abort signal of the request being served. */\n signal(): AbortSignal | undefined;\n}\n\n/** Rejects batches UNS would refuse, before anything is sent. */\nexport function assertAtomicBatch(operation: string, count: number) {\n if (count > MAX_ATOMIC_ITEMS) {\n throw new DataError({\n message:\n `${operation} commits at most ${MAX_ATOMIC_ITEMS} items atomically; got ${count}. ` +\n `Split the input into chunks of ${MAX_ATOMIC_ITEMS} (each chunk commits on its own; give each chunk a stable ` +\n 'idempotencyKey or fixed _ids so a retry is safe), or keep all-or-nothing work within one batch.',\n status: 400,\n code: 'BATCH_LIMIT_EXCEEDED',\n });\n }\n}\n\nexport function toDoc<T>(record: UnsRecord): WithMeta<T> {\n return {\n ...(record.data as T),\n _id: record.id,\n _meta: { revision: record.revision, createdAt: record.createdAt, updatedAt: record.updatedAt },\n };\n}\n\n/**\n * Async-iterable result set. Pages hold at most 200 items; the page source\n * decides whether the next page is reached by cursor or by offset page number.\n */\nexport class Cursor<T> implements AsyncIterable<T> {\n private sortSpec?: Sort;\n private limitCount?: number;\n private projection?: Projection;\n private started = false;\n\n constructor(\n private readonly fetchPage: (state: {\n token: PageToken | null;\n size: number;\n sort?: SortPairs;\n projection?: Projection;\n }) => Promise<Page<T>>,\n options: { sort?: Sort; limit?: number; projection?: Projection } = {},\n ) {\n this.sortSpec = options.sort;\n this.limitCount = options.limit;\n this.projection = options.projection;\n }\n\n private assertNotStarted() {\n if (this.started) throw new Error('Cursor options must be set before iteration starts.');\n }\n\n sort(sort: Sort): this {\n this.assertNotStarted();\n this.sortSpec = sort;\n return this;\n }\n\n /** Total number of documents to return (pages are fetched ≤200 at a time). */\n limit(count: number): this {\n this.assertNotStarted();\n this.limitCount = count;\n return this;\n }\n\n project(projection: Projection): this {\n this.assertNotStarted();\n this.projection = projection;\n return this;\n }\n\n async *[Symbol.asyncIterator](): AsyncIterator<T> {\n this.started = true;\n const sort = toSortPairs(this.sortSpec);\n let remaining = this.limitCount ?? Number.POSITIVE_INFINITY;\n // One page size for the whole iteration: offset pages are only stable when it never changes.\n const size = Math.min(MAX_PAGE_SIZE, remaining);\n let token: PageToken | null = null;\n while (remaining > 0) {\n const page = await this.fetchPage({ token, size, sort, projection: this.projection });\n for (const item of page.items.slice(0, remaining)) yield item;\n remaining -= page.items.length;\n if (page.next === null || page.items.length === 0) return;\n token = page.next;\n }\n }\n\n async toArray(): Promise<T[]> {\n const out: T[] = [];\n for await (const item of this) out.push(item);\n return out;\n }\n}\n\n/** Pipelines made only of `$match` / `$sort` page by cursor; UNS requires offset paging for any other stage. */\nfunction isDirectPipeline(stages: readonly Record<string, unknown>[]): boolean {\n return stages.every((stage) => Object.keys(stage).every((key) => key === '$match' || key === '$sort'));\n}\n\nexport interface FindOptions {\n sort?: Sort;\n limit?: number;\n projection?: Projection;\n}\n\nexport interface FindPageOptions {\n sort?: Sort;\n /** 1-based page number. */\n page?: number;\n /** At most 200. */\n pageSize?: number;\n projection?: Projection;\n /** Count matches up to this many (1–100000); UNS defaults to 10000. */\n maxCount?: number;\n}\n\n/** A match count UNS stopped at its limit: `capped` means \"at least `count`\". */\nexport interface CappedCount {\n count: number;\n capped: boolean;\n}\n\n/** UNS reads at most 100 records by ID per request. */\nexport const MAX_GET_IDS = 100;\n\nexport interface FoundPage<T> {\n items: WithMeta<T>[];\n total: CappedCount;\n page: number;\n pageSize: number;\n}\n\nexport interface ValueCount {\n value: unknown;\n count: number;\n}\n\ninterface RecordGetResult {\n items: UnsRecord[];\n missing: string[];\n}\n\n/** One read of `data.queryBatch`, built by `collection.query.*`. */\nexport interface BatchQuery<R> {\n readonly collection: CollectionTarget;\n /** The batch item without `id` and `collectionId`; resolves `$lookup` targets. */\n prepare(): Promise<Record<string, unknown>>;\n /** The item's result as the builder's caller sees it. */\n parse(data: unknown): R;\n}\n\nexport interface CollectionQueries<T> {\n /** First page (≤200, default 20); `maxCount` adds the capped total of all matches. */\n find(filter?: Filter, options?: { sort?: Sort; limit?: number; projection?: Projection; maxCount?: number }):\n BatchQuery<{ items: WithMeta<T>[]; hasMore: boolean; total?: CappedCount }>;\n /** Like `collection.findPage`. */\n findPage(filter?: Filter, options?: FindPageOptions): BatchQuery<FoundPage<T>>;\n count(filter?: Filter, options?: { maxCount?: number }): BatchQuery<CappedCount>;\n /** The 200 most frequent values. */\n countBy(field: string, filter?: Filter): BatchQuery<ValueCount[]>;\n /** The first 200 distinct values. */\n distinct(field: string, filter?: Filter): BatchQuery<unknown[]>;\n /** The first 200 output rows. */\n aggregate<R = Record<string, unknown>>(pipeline: Record<string, unknown>[]): BatchQuery<R[]>;\n /** 1–100 distinct records by ID, as `collection.get`. */\n get(ids: readonly string[], options?: { projection?: Projection }): BatchQuery<{ items: WithMeta<T>[]; missing: string[] }>;\n}\n\nexport interface UpdateOptions {\n upsert?: boolean;\n /** Reject the write with VERSION_CONFLICT unless the record is at this revision. */\n expectedRevision?: number;\n sort?: Sort;\n arrayFilters?: Record<string, unknown>[];\n idempotencyKey?: string;\n}\n\nexport interface FindOneAndOptions extends UpdateOptions {\n returnDocument?: 'before' | 'after';\n projection?: Projection;\n}\n\nexport type InsertOneOptions = { idempotencyKey?: string } & (\n | { returnDocument?: 'none'; projection?: never }\n | { returnDocument: 'after'; projection?: Projection }\n);\n\nexport type BulkOperation =\n | { insertOne: { document: Record<string, unknown> } }\n | { updateOne: { filter: Filter; update: Update; upsert?: boolean; sort?: Sort } }\n | { replaceOne: { filter: Filter; replacement: Record<string, unknown>; upsert?: boolean; sort?: Sort } }\n | { deleteOne: { filter: Filter; sort?: Sort } };\n\nfunction compact<T extends Record<string, unknown>>(value: T): T {\n return Object.fromEntries(Object.entries(value).filter(([, entry]) => entry !== undefined)) as T;\n}\n\nfunction filterOrNothing(filter: Filter): Filter | undefined {\n return Object.keys(filter).length > 0 ? filter : undefined;\n}\n\n/** `recordAggregatePipeline` body of one numbered page with its capped total. */\nfunction pageRequest(filter: Filter, options: FindPageOptions) {\n const page = Math.max(1, Math.trunc(options.page ?? 1));\n const pageSize = Math.min(MAX_PAGE_SIZE, Math.max(1, Math.trunc(options.pageSize ?? 20)));\n const pipeline: Record<string, unknown>[] = [];\n if (Object.keys(filter).length > 0) pipeline.push({ $match: filter });\n const sort = toSortPairs(options.sort);\n if (sort) pipeline.push({ $sort: sort });\n if (options.projection) pipeline.push({ $project: options.projection });\n const body = { pipeline, page: { mode: 'offset', page, size: pageSize }, count: options.maxCount === undefined ? {} : { max: options.maxCount } };\n return { body, page, pageSize };\n}\n\nfunction countByPipeline(field: string, filter: Filter): Record<string, unknown>[] {\n const pipeline: Record<string, unknown>[] = [];\n if (Object.keys(filter).length > 0) pipeline.push({ $match: filter });\n // `_id` breaks ties, so offset pages of equal counts neither repeat nor skip a group.\n pipeline.push({ $group: { _id: `$${field}`, count: { $sum: 1 } } }, { $sort: { count: -1, _id: 1 } });\n return pipeline;\n}\n\nconst toValueCount = (row: { _id: unknown; count: number }): ValueCount => ({ value: row._id ?? null, count: row.count });\n\nfunction idsInOrder(ids: Record<string, string> | undefined): string[] {\n return Object.entries(ids ?? {})\n .sort(([a], [b]) => Number(a) - Number(b))\n .map(([, id]) => id);\n}\n\n/**\n * Atomic batches pass no `committed` counts: their write errors rolled the\n * whole batch back. Non-atomic runs pass their cumulative counts; `details`\n * then has the shape `partialWrite` uses.\n */\nexport function assertNoWriteErrors(result: ManyPage, operation: string, committed?: Record<string, number>) {\n if (result.writeErrors && result.writeErrors.length > 0) {\n const counts = Object.entries(committed ?? {}).map(([name, value]) => `${name}=${value}`).join(', ');\n const changed = committed !== undefined && Object.values(committed).some((value) => value > 0);\n throw new DataError({\n message: `${operation} stopped on ${result.writeErrors.length} write error(s)${counts ? `; already committed: ${counts}` : ''}.`,\n status: 409,\n code: 'WRITE_ERRORS',\n execution: changed ? 'committed' : 'rolledBack',\n attempts: 1,\n details: committed\n ? { ...committed, status: changed ? 'partiallyCommitted' : 'failed', hasMore: Boolean(result.hasMore), resumeAfter: result.resumeAfter ?? null, writeErrors: result.writeErrors }\n : { writeErrors: result.writeErrors },\n });\n }\n}\n\n/**\n * A non-atomic run failed after some writes committed: on an earlier page, or\n * within the failed page (UNS then answers `execution: \"committed\"` with the\n * page's partial result as `data`). Like UNS, the error keeps its code and is\n * `committed` with `retry.safe: false`; `details` is the cumulative result\n * of the whole call in the shape of a success (`matchedCount` …, `status:\n * \"partiallyCommitted\"`, `hasMore`, `resumeAfter`). Continue by passing\n * `resumeAfter` back; repeating the call would apply `$inc` / `$push` twice.\n */\nfunction partialWrite(operation: string, totals: Record<string, number>, resumeAfter: string | undefined, cause: DataError): DataError {\n const counts = Object.entries(totals).map(([name, value]) => `${name}=${value}`).join(', ');\n const writeErrors = Array.isArray(cause.details.writeErrors) ? { writeErrors: cause.details.writeErrors } : {};\n return new DataError({\n message:\n `${operation} committed ${counts} and then failed: ${cause.message} ` +\n (resumeAfter\n ? `Continue with { resumeAfter: details.resumeAfter }${cause.outcomeUnknown ? ' after checking the failed page, whose outcome is unknown' : ''}; do not repeat the whole call.`\n : 'Read back what changed before writing again; do not repeat the whole call.'),\n status: cause.status,\n code: cause.code,\n reason: cause.reason,\n upstreamStatus: cause.upstreamStatus,\n requestId: cause.requestId,\n // Earlier writes took effect; the failed page too, perhaps, when its outcome is unknown.\n execution: cause.outcomeUnknown ? 'unknown' : 'committed',\n retry: { safe: false },\n attempts: cause.attempts,\n details: { ...totals, status: 'partiallyCommitted', hasMore: true, resumeAfter: resumeAfter ?? null, ...writeErrors },\n cause,\n });\n}\n\nexport class Collection<T extends object = Record<string, unknown>, TInput extends object = T> {\n constructor(\n readonly definition: CollectionTarget,\n private readonly runtime: CollectionRuntime,\n ) {}\n\n get alias(): string {\n return collectionLabel(this.definition);\n }\n\n /**\n * One call with stale-ID recovery. A call continuing a cursor or\n * resumeAfter token of the old collection is not retried: the token means\n * nothing to a recreated collection.\n */\n private post<R>(operation: UnsV2OperationName, body: Record<string, unknown>, options: CallOptions = {}): Promise<R> {\n const page = body.page as { cursor?: unknown } | undefined;\n const continues = typeof body.cursor === 'string' || typeof body.resumeAfter === 'string' || typeof page?.cursor === 'string';\n return this.runtime.recover(() => this.send<R>(operation, body, options), { collections: [this.definition], retry: !continues });\n }\n\n private async send<R>(operation: UnsV2OperationName, body: Record<string, unknown>, options: CallOptions = {}): Promise<R> {\n const collectionId = await this.runtime.resolve(this.definition);\n return this.runtime.call<R>(operation, { collectionId, ...compact(body) }, {\n dataSubject: this.runtime.subject(),\n signal: this.runtime.signal(),\n ...options,\n });\n }\n\n /* ---------------------------------- reads --------------------------------- */\n\n find(filter: Filter = {}, options: FindOptions = {}): Cursor<WithMeta<T>> {\n return new Cursor<WithMeta<T>>(async ({ token, size, sort, projection }) => {\n const result = await this.post<{ items: UnsRecord[]; pageInfo: PageInfo }>('recordFind', {\n filter: Object.keys(filter).length > 0 ? filter : undefined,\n sort,\n projection,\n limit: size,\n cursor: typeof token === 'string' ? token : undefined,\n });\n return {\n items: result.items.map((record) => toDoc<T>(record)),\n next: result.pageInfo.hasMore && result.pageInfo.nextCursor ? result.pageInfo.nextCursor : null,\n };\n }, options);\n }\n\n async findOne(filter: Filter = {}, options: Omit<FindOptions, 'limit'> = {}): Promise<WithMeta<T> | null> {\n const [first] = await this.find(filter, { ...options, limit: 1 }).toArray();\n return first ?? null;\n }\n\n /**\n * Records by ID, in the order asked for (each ID once, at its first\n * position); IDs that do not exist, are deleted or are hidden by employee\n * data rules are listed in `missing` alike. More than 100 IDs are read in\n * chunks of 100 (not one snapshot).\n */\n async get(ids: readonly string[], options: { projection?: Projection } = {}): Promise<{ items: WithMeta<T>[]; missing: string[] }> {\n const unique = [...new Set(ids)];\n const chunks: string[][] = [];\n for (let start = 0; start < unique.length; start += MAX_GET_IDS) chunks.push(unique.slice(start, start + MAX_GET_IDS));\n const results = await Promise.all(chunks.map((chunk) =>\n this.post<RecordGetResult>('recordGet', { ids: chunk, projection: options.projection })));\n return {\n items: results.flatMap((result) => result.items.map((record) => toDoc<T>(record))),\n missing: results.flatMap((result) => result.missing),\n };\n }\n\n /**\n * One numbered page plus the total match count, for paged list screens:\n * one `recordAggregatePipeline` offset page whose `count` runs in the same\n * snapshot. Show a capped total as \"10000+\".\n */\n async findPage(filter: Filter = {}, options: FindPageOptions = {}): Promise<FoundPage<T>> {\n const { body, page, pageSize } = pageRequest(filter, options);\n const result = await this.post<{ items: WithMeta<T>[]; total: CappedCount }>('recordAggregatePipeline', body);\n return { items: result.items, total: result.total, page, pageSize };\n }\n\n /**\n * Counts matches up to `maxCount` (1–100000, UNS default 100000). A\n * `capped` result means \"at least `count`\".\n */\n async countDocuments(filter: Filter = {}, options: { maxCount?: number } = {}): Promise<CappedCount> {\n const result = await this.post<CappedCount>('recordCount', { filter: filterOrNothing(filter), maxCount: options.maxCount });\n return { count: result.count, capped: result.capped };\n }\n\n /**\n * Match counts per value of `field`, largest first: one `$group` pipeline\n * instead of a count per value. Records without the field count under\n * `value: null`.\n */\n async countBy(field: string, filter: Filter = {}): Promise<ValueCount[]> {\n const rows = await this.aggregate<{ _id: unknown; count: number }>(countByPipeline(field, filter)).toArray();\n return rows.map(toValueCount);\n }\n\n /**\n * Builders for `data.queryBatch`: each describes one read of this\n * collection, run together with the others in one request and one\n * snapshot. Each returns one page (at most 200 rows), unlike the cursor\n * methods; `get` takes at most 100 IDs.\n */\n get query(): CollectionQueries<T> {\n const one = <R>(op: string, build: () => Promise<Record<string, unknown>>, parse: (data: never) => R): BatchQuery<R> => ({\n collection: this.definition,\n prepare: async () => ({ op, ...compact(await build()) }),\n parse: parse as (data: unknown) => R,\n });\n return {\n find: (filter = {}, options = {}) =>\n one('find', async () => ({\n filter: filterOrNothing(filter),\n sort: toSortPairs(options.sort),\n projection: options.projection,\n limit: Math.min(MAX_PAGE_SIZE, options.limit ?? 20),\n count: options.maxCount === undefined ? undefined : { max: options.maxCount },\n }), (data: { items: UnsRecord[]; pageInfo: PageInfo; total?: CappedCount }) => ({\n items: data.items.map((record) => toDoc<T>(record)),\n hasMore: data.pageInfo.hasMore,\n ...(data.total ? { total: data.total } : {}),\n })),\n findPage: (filter = {}, options = {}) => {\n const { body, page, pageSize } = pageRequest(filter, options);\n return one('aggregate', async () => body, (data: { items: WithMeta<T>[]; total: CappedCount }) => ({\n items: data.items, total: data.total, page, pageSize,\n }));\n },\n count: (filter = {}, options = {}) =>\n one('count', async () => ({ filter: filterOrNothing(filter), maxCount: options.maxCount }),\n (data: CappedCount) => ({ count: data.count, capped: data.capped })),\n countBy: (field, filter = {}) =>\n one('aggregate', async () => ({\n pipeline: await this.prepareStages(countByPipeline(field, filter)),\n page: { mode: 'offset', page: 1, size: MAX_PAGE_SIZE },\n }), (data: { items: { _id: unknown; count: number }[] }) => data.items.map(toValueCount)),\n distinct: (field, filter = {}) =>\n one('distinct', async () => ({ field, filter: filterOrNothing(filter), page: { mode: 'offset', page: 1, size: MAX_PAGE_SIZE } }),\n (data: { values: unknown[] }) => data.values),\n aggregate: <R = Record<string, unknown>>(pipeline: Record<string, unknown>[]) =>\n one('aggregate', async () => {\n const stages = await this.prepareStages(pipeline);\n const last = stages[stages.length - 1];\n // A final $count returns one row and forbids an explicit page.\n return last !== undefined && '$count' in last\n ? { pipeline: stages }\n : { pipeline: stages, page: isDirectPipeline(stages) ? { mode: 'cursor', size: MAX_PAGE_SIZE } : { mode: 'offset', page: 1, size: MAX_PAGE_SIZE } };\n }, (data: { items: R[] }) => data.items),\n get: (ids, options = {}) => {\n const unique = [...new Set(ids)];\n if (unique.length < 1 || unique.length > MAX_GET_IDS) {\n throw new TypeError(`query.get takes 1–${MAX_GET_IDS} distinct IDs; use collection.get for more.`);\n }\n return one('get', async () => ({ ids: unique, projection: options.projection }),\n (data: RecordGetResult) => ({ items: data.items.map((record) => toDoc<T>(record)), missing: data.missing }));\n },\n };\n }\n\n /** Distinct values of a field (every page). */\n async distinct(field: string, filter: Filter = {}): Promise<unknown[]> {\n const values: unknown[] = [];\n for (let page = 1; ; page += 1) {\n const result = await this.post<{ items: { _id: unknown }[]; pageInfo: PageInfo }>('recordAggregatePipeline', {\n pipeline: [{ $match: filter }, { $group: { _id: `$${field}` } }],\n page: { mode: 'offset', page, size: MAX_PAGE_SIZE },\n });\n values.push(...result.items.map(item => item._id));\n if (!result.pageInfo.hasMore) return values;\n }\n }\n\n /**\n * Runs a pipeline (`$match`, `$sort`, `$group`, `$project`, `$set`,\n * `$lookup`, `$unwind`, `$skip`, `$limit`, `$count`). `$sort` accepts\n * `{ field: 1 | -1 }`; `$lookup` takes `from` (a declared collection or\n * alias of this App) instead of a collection ID. Rows are whatever the\n * pipeline outputs, not wrapped records.\n *\n * Pipelines of only `$match` / `$sort` page by cursor; any other stage pages\n * by offset (UNS rejects cursors for transformed results). The `$exists`,\n * `$distinct` and `$frequencies` stages are listed in the UNS schema but not\n * executed by the record pipeline; use `countDocuments`, `distinct` or `$group`.\n */\n aggregate<R = Record<string, unknown>>(pipeline: Record<string, unknown>[]): Cursor<R> {\n // Recovery wraps stage preparation too, so a retry re-resolves `$lookup` IDs.\n return new Cursor<R>(({ token, size }) => this.runtime.recover(() => this.aggregatePage<R>(pipeline, token, size), { collections: [this.definition], retry: typeof token !== 'string' }));\n }\n\n private async aggregatePage<R>(\n pipeline: Record<string, unknown>[],\n token: PageToken | null,\n size: number,\n ): Promise<Page<R>> {\n const stages = await this.prepareStages(pipeline);\n const last = stages[stages.length - 1];\n if (last !== undefined && '$count' in last) {\n // A final $count returns one row and forbids an explicit page.\n const result = await this.send<{ items: R[] }>('recordAggregatePipeline', { pipeline: stages });\n return { items: result.items, next: null };\n }\n if (isDirectPipeline(stages)) {\n const result = await this.send<{ items: R[]; pageInfo: PageInfo }>('recordAggregatePipeline', {\n pipeline: stages,\n page: { mode: 'cursor', size, ...(typeof token === 'string' ? { cursor: token } : {}) },\n });\n return { items: result.items, next: result.pageInfo.hasMore && result.pageInfo.nextCursor ? result.pageInfo.nextCursor : null };\n }\n const page = typeof token === 'number' ? token : 1;\n const result = await this.send<{ items: R[]; pageInfo: PageInfo }>('recordAggregatePipeline', {\n pipeline: stages,\n page: { mode: 'offset', page, size },\n });\n return {\n items: result.items,\n next: result.pageInfo.hasMore ? (result.pageInfo.nextPage ?? page + 1) : null,\n };\n }\n\n /** Converts Mongo-style `$sort` objects and resolves `$lookup.from`, recursively. */\n private async prepareStages(pipeline: readonly Record<string, unknown>[]): Promise<Record<string, unknown>[]> {\n return Promise.all(\n pipeline.map(async (stage) => {\n if ('$sort' in stage && !Array.isArray(stage.$sort)) {\n return { ...stage, $sort: toSortPairs(stage.$sort as Sort) };\n }\n if ('$lookup' in stage && stage.$lookup && typeof stage.$lookup === 'object') {\n const { from, pipeline: inner, ...lookup } = stage.$lookup as Record<string, unknown>;\n const resolved: Record<string, unknown> = { ...lookup };\n if (from !== undefined) resolved.collectionId = await this.runtime.resolve(from as CollectionTarget | string);\n if (Array.isArray(inner)) resolved.pipeline = await this.prepareStages(inner as Record<string, unknown>[]);\n return { ...stage, $lookup: resolved };\n }\n return stage;\n }),\n );\n }\n\n /* --------------------------------- writes --------------------------------- */\n\n /** Returns the creation snapshot in the same write; replay preserves that snapshot and requires current read access. */\n async insertOne(document: TInput & { _id?: string }, options: Extract<InsertOneOptions, { returnDocument: 'after' }> & { projection?: never }): Promise<{ insertedId: string; value: WithMeta<T> }>;\n async insertOne(document: TInput & { _id?: string }, options: Extract<InsertOneOptions, { returnDocument: 'after' }>): Promise<{ insertedId: string; value: WithMeta<DeepPartial<T>> }>;\n async insertOne(document: TInput & { _id?: string }, options?: Extract<InsertOneOptions, { returnDocument?: 'none' }>): Promise<{ insertedId: string }>;\n async insertOne(document: TInput & { _id?: string }, options: InsertOneOptions): Promise<{ insertedId: string; value?: WithMeta<DeepPartial<T>> }>;\n async insertOne(document: TInput & { _id?: string }, options: InsertOneOptions = {}): Promise<{ insertedId: string; value?: WithMeta<T> | WithMeta<DeepPartial<T>> }> {\n const { id, data } = validateDocument(this.definition, document as Record<string, unknown>);\n const result = await this.post<{ insertedId: string; value: UnsRecord }>('recordInsertOne', {\n id, data, idempotencyKey: options.idempotencyKey, returnDocument: options.returnDocument, projection: options.projection,\n });\n if (options.returnDocument === 'after') return { insertedId: result.insertedId, value: toDoc<T>(result.value) };\n return { insertedId: result.insertedId };\n }\n\n /** Inserts up to 200 documents atomically (all or none). */\n async insertMany(\n documents: readonly (TInput & { _id?: string })[],\n options: { idempotencyKey?: string } = {},\n ): Promise<{ insertedCount: number; insertedIds: string[] }> {\n if (documents.length === 0) return { insertedCount: 0, insertedIds: [] };\n assertAtomicBatch('insertMany', documents.length);\n const prepared = documents.map((document) => validateDocument(this.definition, document as Record<string, unknown>));\n const result = await this.post<WriteResult>('recordBulkWrite', {\n operations: prepared.map(({ id, data }) => ({ insertOne: compact({ id, data }) })),\n ordered: true,\n atomic: true,\n idempotencyKey: options.idempotencyKey,\n });\n assertNoWriteErrors(result, 'insertMany');\n return { insertedCount: result.insertedCount ?? 0, insertedIds: idsInOrder(result.insertedIds) };\n }\n\n async updateOne(\n filter: Filter,\n update: Update,\n options: UpdateOptions = {},\n ): Promise<{ matchedCount: number; modifiedCount: number; upsertedId: string | null }> {\n const result = await this.post<WriteResult>('recordUpdateOne', {\n filter,\n update: validateUpdate(this.definition, update),\n upsert: options.upsert,\n expectedRevision: options.expectedRevision,\n sort: toSortPairs(options.sort),\n arrayFilters: options.arrayFilters,\n idempotencyKey: options.idempotencyKey,\n });\n return { matchedCount: result.matchedCount ?? 0, modifiedCount: result.modifiedCount ?? 0, upsertedId: result.upsertedId ?? null };\n }\n\n /**\n * Updates every match like Mongo's updateMany: documents commit one by one\n * (not atomically), following `resumeAfter` until every match is processed.\n * A failure after some documents committed keeps its code but is\n * `execution: \"committed\"`, with the cumulative counts and\n * `details.resumeAfter`; pass that back as `resumeAfter` to continue\n * instead of repeating the call. For all-or-nothing multi-document changes\n * use `data.transact` (≤200 items).\n */\n async updateMany(\n filter: Filter,\n update: Update,\n options: Pick<UpdateOptions, 'arrayFilters'> & { resumeAfter?: string } = {},\n ): Promise<{ matchedCount: number; modifiedCount: number }> {\n const validated = validateUpdate(this.definition, update);\n let matchedCount = 0;\n let modifiedCount = 0;\n await this.writeEach('updateMany', 'recordUpdateMany', { filter, update: validated, arrayFilters: options.arrayFilters }, options.resumeAfter, (result) => {\n matchedCount += result.matchedCount ?? 0;\n modifiedCount += result.modifiedCount ?? 0;\n return { matchedCount, modifiedCount };\n });\n return { matchedCount, modifiedCount };\n }\n\n /** Runs a non-atomic many-write page by page; see updateMany for failures. */\n private async writeEach(\n name: string,\n operation: UnsV2OperationName,\n body: Record<string, unknown>,\n from: string | undefined,\n add: (result: WriteResult) => Record<string, number>,\n ): Promise<void> {\n let resumeAfter = from;\n let committed: Record<string, number> | undefined;\n do {\n let result: ManyPage;\n try {\n result = await this.post<ManyPage>(operation, { ...body, atomic: false, resumeAfter });\n } catch (error) {\n if (!(error instanceof DataError)) throw error;\n // UNS reports what the failed page itself committed, with where to continue.\n const page = error.execution === 'committed' ? (error.details as ManyPage) : undefined;\n const totals = page ? add(page) : committed;\n // Nothing of this call took effect: the page's own error tells the truth.\n if (!totals || !Object.values(totals).some((value) => value > 0)) throw error;\n throw partialWrite(name, totals, page ? (page.resumeAfter ?? undefined) : resumeAfter, error);\n }\n committed = add(result);\n assertNoWriteErrors(result, name, committed);\n resumeAfter = result.hasMore && result.resumeAfter ? result.resumeAfter : undefined;\n } while (resumeAfter);\n }\n\n /**\n * Replaces the whole body. Fields written by another App version and not in\n * this declaration are lost — prefer `updateOne` with `$set`.\n */\n async replaceOne(\n filter: Filter,\n replacement: TInput,\n options: Omit<UpdateOptions, 'arrayFilters'> = {},\n ): Promise<{ matchedCount: number; modifiedCount: number; upsertedId: string | null }> {\n const { data } = validateDocument(this.definition, replacement as Record<string, unknown>);\n const result = await this.post<WriteResult>('recordReplaceOne', {\n filter,\n replacement: data,\n upsert: options.upsert,\n expectedRevision: options.expectedRevision,\n sort: toSortPairs(options.sort),\n idempotencyKey: options.idempotencyKey,\n });\n return { matchedCount: result.matchedCount ?? 0, modifiedCount: result.modifiedCount ?? 0, upsertedId: result.upsertedId ?? null };\n }\n\n /** Soft-deletes one record; requires `uns.delete` on the App key. */\n async deleteOne(filter: Filter, options: Pick<UpdateOptions, 'expectedRevision' | 'sort' | 'idempotencyKey'> = {}): Promise<{ deletedCount: number }> {\n const result = await this.post<WriteResult>(\n 'recordDeleteOne',\n { filter, expectedRevision: options.expectedRevision, sort: toSortPairs(options.sort), idempotencyKey: options.idempotencyKey },\n );\n return { deletedCount: result.deletedCount ?? 0 };\n }\n\n /**\n * Soft-deletes every match, one document at a time like Mongo's deleteMany\n * (not atomic), following `resumeAfter`; requires `uns.delete` on the App\n * key. Failures after committed deletes report them as updateMany does.\n */\n async deleteMany(filter: Filter, options: { resumeAfter?: string } = {}): Promise<{ deletedCount: number }> {\n let deletedCount = 0;\n await this.writeEach('deleteMany', 'recordDeleteMany', { filter }, options.resumeAfter, (result) => {\n deletedCount += result.deletedCount ?? 0;\n return { deletedCount };\n });\n return { deletedCount };\n }\n\n /**\n * Atomic read-modify-write. A state transition puts the expected state in\n * the filter: `findOneAndUpdate({ _id, status: \"DRAFT\" }, { $set: { status: \"SUBMITTED\" } })`\n * returns null when another request moved the record first.\n */\n async findOneAndUpdate(filter: Filter, update: Update, options: FindOneAndOptions = {}): Promise<WithMeta<T> | null> {\n const result = await this.post<{ value: UnsRecord | null }>('recordUpdateOne', {\n filter,\n update: validateUpdate(this.definition, update),\n upsert: options.upsert,\n expectedRevision: options.expectedRevision,\n sort: toSortPairs(options.sort),\n arrayFilters: options.arrayFilters,\n returnDocument: options.returnDocument ?? 'after',\n projection: options.projection,\n idempotencyKey: options.idempotencyKey,\n });\n return result.value ? toDoc<T>(result.value) : null;\n }\n\n async findOneAndReplace(\n filter: Filter,\n replacement: TInput,\n options: Omit<FindOneAndOptions, 'arrayFilters'> = {},\n ): Promise<WithMeta<T> | null> {\n const { data } = validateDocument(this.definition, replacement as Record<string, unknown>);\n const result = await this.post<{ value: UnsRecord | null }>('recordReplaceOne', {\n filter,\n replacement: data,\n upsert: options.upsert,\n expectedRevision: options.expectedRevision,\n sort: toSortPairs(options.sort),\n returnDocument: options.returnDocument ?? 'after',\n projection: options.projection,\n idempotencyKey: options.idempotencyKey,\n });\n return result.value ? toDoc<T>(result.value) : null;\n }\n\n async findOneAndDelete(\n filter: Filter,\n options: Pick<FindOneAndOptions, 'expectedRevision' | 'sort' | 'projection' | 'idempotencyKey'> = {},\n ): Promise<WithMeta<T> | null> {\n const result = await this.post<{ value: UnsRecord | null }>(\n 'recordDeleteOne',\n {\n filter,\n expectedRevision: options.expectedRevision,\n sort: toSortPairs(options.sort),\n projection: options.projection,\n idempotencyKey: options.idempotencyKey,\n returnDocument: 'before',\n },\n );\n return result.value ? toDoc<T>(result.value) : null;\n }\n\n /** Up to 200 mixed single-record writes in one atomic call (insertOne / updateOne / replaceOne / deleteOne). */\n async bulkWrite(\n operations: readonly BulkOperation[],\n options: { idempotencyKey?: string } = {},\n ): Promise<{\n insertedCount: number;\n matchedCount: number;\n modifiedCount: number;\n deletedCount: number;\n upsertedCount: number;\n insertedIds: Record<number, string>;\n upsertedIds: Record<number, string>;\n }> {\n assertAtomicBatch('bulkWrite', operations.length);\n const mapped = operations.map((operation) => {\n if ('insertOne' in operation) {\n const { id, data } = validateDocument(this.definition, operation.insertOne.document);\n return { insertOne: compact({ id, data }) };\n }\n if ('updateOne' in operation) {\n const { filter, update, upsert, sort } = operation.updateOne;\n return { updateOne: compact({ filter, update: validateUpdate(this.definition, update), upsert, sort: toSortPairs(sort) }) };\n }\n if ('replaceOne' in operation) {\n const { filter, replacement, upsert, sort } = operation.replaceOne;\n const { data } = validateDocument(this.definition, replacement);\n return { replaceOne: compact({ filter, replacement: data, upsert, sort: toSortPairs(sort) }) };\n }\n if ('deleteOne' in operation) {\n return { deleteOne: compact({ filter: operation.deleteOne.filter, sort: toSortPairs(operation.deleteOne.sort) }) };\n }\n throw new Error(\n `Unsupported bulkWrite operation ${Object.keys(operation).join(', ')}; use updateMany() / deleteMany() or data.transact().`,\n );\n });\n if (mapped.length === 0) {\n return { insertedCount: 0, matchedCount: 0, modifiedCount: 0, deletedCount: 0, upsertedCount: 0, insertedIds: {}, upsertedIds: {} };\n }\n const result = await this.post<WriteResult>(\n 'recordBulkWrite',\n { operations: mapped, ordered: true, atomic: true, idempotencyKey: options.idempotencyKey },\n );\n assertNoWriteErrors(result, 'bulkWrite');\n const numericKeys = (ids: Record<string, string> | undefined) =>\n Object.fromEntries(Object.entries(ids ?? {}).map(([index, id]) => [Number(index), id]));\n return {\n insertedCount: result.insertedCount ?? 0,\n matchedCount: result.matchedCount ?? 0,\n modifiedCount: result.modifiedCount ?? 0,\n deletedCount: result.deletedCount ?? 0,\n upsertedCount: result.upsertedCount ?? 0,\n insertedIds: numericKeys(result.insertedIds),\n upsertedIds: numericKeys(result.upsertedIds),\n };\n }\n}\n"]}
1
+ {"version":3,"file":"collection.js","sourceRoot":"","sources":["../../../src/data/collection.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Mongo-driver-style collection handle over the UNS record operations\n * (`recordFind`, `recordBulkWrite`, ...).\n *\n * Stored records `{ id, data, revision, createdAt, updatedAt }` are exposed as\n * flat documents `{ _id, ...data, _meta: { revision, createdAt, updatedAt } }`;\n * filters, sorts and projections use the same paths (`status`,\n * `customer.id`, `_id`, `_meta.updatedAt`).\n */\nimport type { UnsV2OperationName } from '../uns-v2/generated.js';\nimport type { CallOptions, DataCall } from './call.js';\nimport { collectionLabel, type CollectionTarget, type RecordMeta } from './define.js';\nimport { DataError } from './error.js';\nimport { validateDocument, validateUpdate } from './schema.js';\nimport { toSortPairs, type Filter, type Sort, type SortPairs } from './sort.js';\n\n/** UNS page limit for find / aggregate / distinct. */\nexport const MAX_PAGE_SIZE = 200;\n\n/**\n * UNS commits at most 200 items in one synchronous atomic batch\n * (insertMany, bulkWrite, data.transact).\n */\nexport const MAX_ATOMIC_ITEMS = 200;\n\nexport type WithMeta<T> = T & { _id: string; _meta: RecordMeta };\n/** A projection may omit business fields at any depth; array and tuple containers retain their shape. */\nexport type DeepPartial<T> = T extends readonly unknown[]\n ? { [K in keyof T]: DeepPartial<T[K]> }\n : T extends object ? { [K in keyof T]?: DeepPartial<T[K]> } : T;\nexport type Projection = Record<string, 0 | 1 | boolean>;\nexport type Update = Record<string, unknown>;\n\nexport interface UnsRecord {\n id: string;\n data: Record<string, unknown>;\n revision: number;\n createdAt: number;\n updatedAt: number;\n}\n\ninterface PageInfo {\n hasMore: boolean;\n nextCursor?: string | null;\n nextPage?: number | null;\n}\n\n/** Position of the next page: an opaque cursor or a 1-based offset page number. */\ntype PageToken = string | number;\n\ninterface Page<T> {\n items: T[];\n /** Token of the following page; null when this was the last one. */\n next: PageToken | null;\n}\n\ninterface WriteResult {\n matchedCount?: number;\n modifiedCount?: number;\n deletedCount?: number;\n insertedCount?: number;\n upsertedId?: string | null;\n insertedIds?: Record<string, string>;\n upsertedIds?: Record<string, string>;\n upsertedCount?: number;\n writeErrors?: unknown[];\n hasMore?: boolean;\n}\n\n/** A page of `updateMany` / `deleteMany`, the only writes that continue with `resumeAfter`. */\ninterface ManyPage extends WriteResult {\n resumeAfter?: string | null;\n}\n\n/** Runtime services a collection handle needs from its client. */\nexport interface CollectionRuntime {\n call: DataCall;\n /** Resolve an existing ID directly, or ensure a declared collection. */\n resolve(target: CollectionTarget | string): Promise<string>;\n /** Runs a call, re-ensuring and retrying once when its collection ID went stale (see bootstrap). */\n recover<R>(fn: () => Promise<R>, options: { collections: readonly CollectionTarget[]; retry?: boolean }): Promise<R>;\n /** Abort signal of the request being served. */\n signal(): AbortSignal | undefined;\n}\n\n/** Rejects batches UNS would refuse, before anything is sent. */\nexport function assertAtomicBatch(operation: string, count: number) {\n if (count > MAX_ATOMIC_ITEMS) {\n throw new DataError({\n message:\n `${operation} commits at most ${MAX_ATOMIC_ITEMS} items atomically; got ${count}. ` +\n `Split the input into chunks of ${MAX_ATOMIC_ITEMS} (each chunk commits on its own; give each chunk a stable ` +\n 'idempotencyKey or fixed _ids so a retry is safe), or keep all-or-nothing work within one batch.',\n status: 400,\n code: 'BATCH_LIMIT_EXCEEDED',\n });\n }\n}\n\nexport function toDoc<T>(record: UnsRecord): WithMeta<T> {\n return {\n ...(record.data as T),\n _id: record.id,\n _meta: { revision: record.revision, createdAt: record.createdAt, updatedAt: record.updatedAt },\n };\n}\n\n/**\n * Async-iterable result set. Pages hold at most 200 items; the page source\n * decides whether the next page is reached by cursor or by offset page number.\n */\nexport class Cursor<T> implements AsyncIterable<T> {\n private sortSpec?: Sort;\n private limitCount?: number;\n private projection?: Projection;\n private started = false;\n\n constructor(\n private readonly fetchPage: (state: {\n token: PageToken | null;\n size: number;\n sort?: SortPairs;\n projection?: Projection;\n }) => Promise<Page<T>>,\n options: { sort?: Sort; limit?: number; projection?: Projection } = {},\n ) {\n this.sortSpec = options.sort;\n this.limitCount = options.limit;\n this.projection = options.projection;\n }\n\n private assertNotStarted() {\n if (this.started) throw new Error('Cursor options must be set before iteration starts.');\n }\n\n sort(sort: Sort): this {\n this.assertNotStarted();\n this.sortSpec = sort;\n return this;\n }\n\n /** Total number of documents to return (pages are fetched ≤200 at a time). */\n limit(count: number): this {\n this.assertNotStarted();\n this.limitCount = count;\n return this;\n }\n\n project(projection: Projection): this {\n this.assertNotStarted();\n this.projection = projection;\n return this;\n }\n\n async *[Symbol.asyncIterator](): AsyncIterator<T> {\n this.started = true;\n const sort = toSortPairs(this.sortSpec);\n let remaining = this.limitCount ?? Number.POSITIVE_INFINITY;\n // One page size for the whole iteration: offset pages are only stable when it never changes.\n const size = Math.min(MAX_PAGE_SIZE, remaining);\n let token: PageToken | null = null;\n while (remaining > 0) {\n const page = await this.fetchPage({ token, size, sort, projection: this.projection });\n for (const item of page.items.slice(0, remaining)) yield item;\n remaining -= page.items.length;\n if (page.next === null || page.items.length === 0) return;\n token = page.next;\n }\n }\n\n async toArray(): Promise<T[]> {\n const out: T[] = [];\n for await (const item of this) out.push(item);\n return out;\n }\n}\n\n/** Pipelines made only of `$match` / `$sort` page by cursor; UNS requires offset paging for any other stage. */\nfunction isDirectPipeline(stages: readonly Record<string, unknown>[]): boolean {\n return stages.every((stage) => Object.keys(stage).every((key) => key === '$match' || key === '$sort'));\n}\n\nexport interface FindOptions {\n sort?: Sort;\n limit?: number;\n projection?: Projection;\n}\n\nexport interface FindPageOptions {\n sort?: Sort;\n /** 1-based page number. */\n page?: number;\n /** At most 200. */\n pageSize?: number;\n projection?: Projection;\n /** Count matches up to this many (1–100000); UNS defaults to 10000. */\n maxCount?: number;\n}\n\n/** A match count UNS stopped at its limit: `capped` means \"at least `count`\". */\nexport interface CappedCount {\n count: number;\n capped: boolean;\n}\n\n/** UNS reads at most 100 records by ID per request. */\nexport const MAX_GET_IDS = 100;\n\nexport interface FoundPage<T> {\n items: WithMeta<T>[];\n total: CappedCount;\n page: number;\n pageSize: number;\n}\n\nexport interface ValueCount {\n value: unknown;\n count: number;\n}\n\ninterface RecordGetResult {\n items: UnsRecord[];\n missing: string[];\n}\n\n/** One read of `data.queryBatch`, built by `collection.query.*`. */\nexport interface BatchQuery<R> {\n readonly collection: CollectionTarget;\n /** The batch item without `id` and `collectionId`; resolves `$lookup` targets. */\n prepare(): Promise<Record<string, unknown>>;\n /** The item's result as the builder's caller sees it. */\n parse(data: unknown): R;\n}\n\nexport interface CollectionQueries<T> {\n /** First page (≤200, default 20); `maxCount` adds the capped total of all matches. */\n find(filter?: Filter, options?: { sort?: Sort; limit?: number; projection?: Projection; maxCount?: number }):\n BatchQuery<{ items: WithMeta<T>[]; hasMore: boolean; total?: CappedCount }>;\n /** Like `collection.findPage`. */\n findPage(filter?: Filter, options?: FindPageOptions): BatchQuery<FoundPage<T>>;\n count(filter?: Filter, options?: { maxCount?: number }): BatchQuery<CappedCount>;\n /** The 200 most frequent values. */\n countBy(field: string, filter?: Filter): BatchQuery<ValueCount[]>;\n /** The first 200 distinct values. */\n distinct(field: string, filter?: Filter): BatchQuery<unknown[]>;\n /** The first 200 output rows. */\n aggregate<R = Record<string, unknown>>(pipeline: Record<string, unknown>[]): BatchQuery<R[]>;\n /** 1–100 distinct records by ID, as `collection.get`. */\n get(ids: readonly string[], options?: { projection?: Projection }): BatchQuery<{ items: WithMeta<T>[]; missing: string[] }>;\n}\n\nexport interface UpdateOptions {\n upsert?: boolean;\n /** Reject the write with VERSION_CONFLICT unless the record is at this revision. */\n expectedRevision?: number;\n sort?: Sort;\n arrayFilters?: Record<string, unknown>[];\n idempotencyKey?: string;\n}\n\nexport interface FindOneAndOptions extends UpdateOptions {\n returnDocument?: 'before' | 'after';\n projection?: Projection;\n}\n\nexport type InsertOneOptions = { idempotencyKey?: string } & (\n | { returnDocument?: 'none'; projection?: never }\n | { returnDocument: 'after'; projection?: Projection }\n);\n\nexport type BulkOperation =\n | { insertOne: { document: Record<string, unknown> } }\n | { updateOne: { filter: Filter; update: Update; upsert?: boolean; sort?: Sort } }\n | { replaceOne: { filter: Filter; replacement: Record<string, unknown>; upsert?: boolean; sort?: Sort } }\n | { deleteOne: { filter: Filter; sort?: Sort } };\n\nfunction compact<T extends Record<string, unknown>>(value: T): T {\n return Object.fromEntries(Object.entries(value).filter(([, entry]) => entry !== undefined)) as T;\n}\n\nfunction filterOrNothing(filter: Filter): Filter | undefined {\n return Object.keys(filter).length > 0 ? filter : undefined;\n}\n\n/** `recordAggregatePipeline` body of one numbered page with its capped total. */\nfunction pageRequest(filter: Filter, options: FindPageOptions) {\n const page = Math.max(1, Math.trunc(options.page ?? 1));\n const pageSize = Math.min(MAX_PAGE_SIZE, Math.max(1, Math.trunc(options.pageSize ?? 20)));\n const pipeline: Record<string, unknown>[] = [];\n if (Object.keys(filter).length > 0) pipeline.push({ $match: filter });\n const sort = toSortPairs(options.sort);\n if (sort) pipeline.push({ $sort: sort });\n if (options.projection) pipeline.push({ $project: options.projection });\n const body = { pipeline, page: { mode: 'offset', page, size: pageSize }, count: options.maxCount === undefined ? {} : { max: options.maxCount } };\n return { body, page, pageSize };\n}\n\nfunction countByPipeline(field: string, filter: Filter): Record<string, unknown>[] {\n const pipeline: Record<string, unknown>[] = [];\n if (Object.keys(filter).length > 0) pipeline.push({ $match: filter });\n // `_id` breaks ties, so offset pages of equal counts neither repeat nor skip a group.\n pipeline.push({ $group: { _id: `$${field}`, count: { $sum: 1 } } }, { $sort: { count: -1, _id: 1 } });\n return pipeline;\n}\n\nconst toValueCount = (row: { _id: unknown; count: number }): ValueCount => ({ value: row._id ?? null, count: row.count });\n\nfunction idsInOrder(ids: Record<string, string> | undefined): string[] {\n return Object.entries(ids ?? {})\n .sort(([a], [b]) => Number(a) - Number(b))\n .map(([, id]) => id);\n}\n\n/**\n * Atomic batches pass no `committed` counts: their write errors rolled the\n * whole batch back. Non-atomic runs pass their cumulative counts; `details`\n * then has the shape `partialWrite` uses.\n */\nexport function assertNoWriteErrors(result: ManyPage, operation: string, committed?: Record<string, number>) {\n if (result.writeErrors && result.writeErrors.length > 0) {\n const counts = Object.entries(committed ?? {}).map(([name, value]) => `${name}=${value}`).join(', ');\n const changed = committed !== undefined && Object.values(committed).some((value) => value > 0);\n throw new DataError({\n message: `${operation} stopped on ${result.writeErrors.length} write error(s)${counts ? `; already committed: ${counts}` : ''}.`,\n status: 409,\n code: 'WRITE_ERRORS',\n execution: changed ? 'committed' : 'rolledBack',\n attempts: 1,\n details: committed\n ? { ...committed, status: changed ? 'partiallyCommitted' : 'failed', hasMore: Boolean(result.hasMore), resumeAfter: result.resumeAfter ?? null, writeErrors: result.writeErrors }\n : { writeErrors: result.writeErrors },\n });\n }\n}\n\n/**\n * A non-atomic run failed after some writes committed: on an earlier page, or\n * within the failed page (UNS then answers `execution: \"committed\"` with the\n * page's partial result as `data`). Like UNS, the error keeps its code and is\n * `committed` with `retry.safe: false`; `details` is the cumulative result\n * of the whole call in the shape of a success (`matchedCount` …, `status:\n * \"partiallyCommitted\"`, `hasMore`, `resumeAfter`). Continue by passing\n * `resumeAfter` back; repeating the call would apply `$inc` / `$push` twice.\n */\nfunction partialWrite(operation: string, totals: Record<string, number>, resumeAfter: string | undefined, cause: DataError): DataError {\n const counts = Object.entries(totals).map(([name, value]) => `${name}=${value}`).join(', ');\n const writeErrors = Array.isArray(cause.details.writeErrors) ? { writeErrors: cause.details.writeErrors } : {};\n return new DataError({\n message:\n `${operation} committed ${counts} and then failed: ${cause.message} ` +\n (resumeAfter\n ? `Continue with { resumeAfter: details.resumeAfter }${cause.outcomeUnknown ? ' after checking the failed page, whose outcome is unknown' : ''}; do not repeat the whole call.`\n : 'Read back what changed before writing again; do not repeat the whole call.'),\n status: cause.status,\n code: cause.code,\n reason: cause.reason,\n upstreamStatus: cause.upstreamStatus,\n requestId: cause.requestId,\n // Earlier writes took effect; the failed page too, perhaps, when its outcome is unknown.\n execution: cause.outcomeUnknown ? 'unknown' : 'committed',\n retry: { safe: false },\n attempts: cause.attempts,\n details: { ...totals, status: 'partiallyCommitted', hasMore: true, resumeAfter: resumeAfter ?? null, ...writeErrors },\n cause,\n });\n}\n\nexport class Collection<T extends object = Record<string, unknown>, TInput extends object = T> {\n constructor(\n readonly definition: CollectionTarget,\n private readonly runtime: CollectionRuntime,\n ) {}\n\n get alias(): string {\n return collectionLabel(this.definition);\n }\n\n /**\n * One call with stale-ID recovery. A call continuing a cursor or\n * resumeAfter token of the old collection is not retried: the token means\n * nothing to a recreated collection.\n */\n private post<R>(operation: UnsV2OperationName, body: Record<string, unknown>, options: CallOptions = {}): Promise<R> {\n const page = body.page as { cursor?: unknown } | undefined;\n const continues = typeof body.cursor === 'string' || typeof body.resumeAfter === 'string' || typeof page?.cursor === 'string';\n return this.runtime.recover(() => this.send<R>(operation, body, options), { collections: [this.definition], retry: !continues });\n }\n\n private async send<R>(operation: UnsV2OperationName, body: Record<string, unknown>, options: CallOptions = {}): Promise<R> {\n const collectionId = await this.runtime.resolve(this.definition);\n return this.runtime.call<R>(operation, { collectionId, ...compact(body) }, {\n signal: this.runtime.signal(),\n ...options,\n });\n }\n\n /* ---------------------------------- reads --------------------------------- */\n\n find(filter: Filter = {}, options: FindOptions = {}): Cursor<WithMeta<T>> {\n return new Cursor<WithMeta<T>>(async ({ token, size, sort, projection }) => {\n const result = await this.post<{ items: UnsRecord[]; pageInfo: PageInfo }>('recordFind', {\n filter: Object.keys(filter).length > 0 ? filter : undefined,\n sort,\n projection,\n limit: size,\n cursor: typeof token === 'string' ? token : undefined,\n });\n return {\n items: result.items.map((record) => toDoc<T>(record)),\n next: result.pageInfo.hasMore && result.pageInfo.nextCursor ? result.pageInfo.nextCursor : null,\n };\n }, options);\n }\n\n async findOne(filter: Filter = {}, options: Omit<FindOptions, 'limit'> = {}): Promise<WithMeta<T> | null> {\n const [first] = await this.find(filter, { ...options, limit: 1 }).toArray();\n return first ?? null;\n }\n\n /**\n * Records by ID, in the order asked for (each ID once, at its first\n * position); IDs that do not exist or are deleted are listed in\n * `missing`. More than 100 IDs are read in chunks of 100 (not one\n * snapshot).\n */\n async get(ids: readonly string[], options: { projection?: Projection } = {}): Promise<{ items: WithMeta<T>[]; missing: string[] }> {\n const unique = [...new Set(ids)];\n const chunks: string[][] = [];\n for (let start = 0; start < unique.length; start += MAX_GET_IDS) chunks.push(unique.slice(start, start + MAX_GET_IDS));\n const results = await Promise.all(chunks.map((chunk) =>\n this.post<RecordGetResult>('recordGet', { ids: chunk, projection: options.projection })));\n return {\n items: results.flatMap((result) => result.items.map((record) => toDoc<T>(record))),\n missing: results.flatMap((result) => result.missing),\n };\n }\n\n /**\n * One numbered page plus the total match count, for paged list screens:\n * one `recordAggregatePipeline` offset page whose `count` runs in the same\n * snapshot. Show a capped total as \"10000+\".\n */\n async findPage(filter: Filter = {}, options: FindPageOptions = {}): Promise<FoundPage<T>> {\n const { body, page, pageSize } = pageRequest(filter, options);\n const result = await this.post<{ items: WithMeta<T>[]; total: CappedCount }>('recordAggregatePipeline', body);\n return { items: result.items, total: result.total, page, pageSize };\n }\n\n /**\n * Counts matches up to `maxCount` (1–100000, UNS default 100000). A\n * `capped` result means \"at least `count`\".\n */\n async countDocuments(filter: Filter = {}, options: { maxCount?: number } = {}): Promise<CappedCount> {\n const result = await this.post<CappedCount>('recordCount', { filter: filterOrNothing(filter), maxCount: options.maxCount });\n return { count: result.count, capped: result.capped };\n }\n\n /**\n * Match counts per value of `field`, largest first: one `$group` pipeline\n * instead of a count per value. Records without the field count under\n * `value: null`.\n */\n async countBy(field: string, filter: Filter = {}): Promise<ValueCount[]> {\n const rows = await this.aggregate<{ _id: unknown; count: number }>(countByPipeline(field, filter)).toArray();\n return rows.map(toValueCount);\n }\n\n /**\n * Builders for `data.queryBatch`: each describes one read of this\n * collection, run together with the others in one request and one\n * snapshot. Each returns one page (at most 200 rows), unlike the cursor\n * methods; `get` takes at most 100 IDs.\n */\n get query(): CollectionQueries<T> {\n const one = <R>(op: string, build: () => Promise<Record<string, unknown>>, parse: (data: never) => R): BatchQuery<R> => ({\n collection: this.definition,\n prepare: async () => ({ op, ...compact(await build()) }),\n parse: parse as (data: unknown) => R,\n });\n return {\n find: (filter = {}, options = {}) =>\n one('find', async () => ({\n filter: filterOrNothing(filter),\n sort: toSortPairs(options.sort),\n projection: options.projection,\n limit: Math.min(MAX_PAGE_SIZE, options.limit ?? 20),\n count: options.maxCount === undefined ? undefined : { max: options.maxCount },\n }), (data: { items: UnsRecord[]; pageInfo: PageInfo; total?: CappedCount }) => ({\n items: data.items.map((record) => toDoc<T>(record)),\n hasMore: data.pageInfo.hasMore,\n ...(data.total ? { total: data.total } : {}),\n })),\n findPage: (filter = {}, options = {}) => {\n const { body, page, pageSize } = pageRequest(filter, options);\n return one('aggregate', async () => body, (data: { items: WithMeta<T>[]; total: CappedCount }) => ({\n items: data.items, total: data.total, page, pageSize,\n }));\n },\n count: (filter = {}, options = {}) =>\n one('count', async () => ({ filter: filterOrNothing(filter), maxCount: options.maxCount }),\n (data: CappedCount) => ({ count: data.count, capped: data.capped })),\n countBy: (field, filter = {}) =>\n one('aggregate', async () => ({\n pipeline: await this.prepareStages(countByPipeline(field, filter)),\n page: { mode: 'offset', page: 1, size: MAX_PAGE_SIZE },\n }), (data: { items: { _id: unknown; count: number }[] }) => data.items.map(toValueCount)),\n distinct: (field, filter = {}) =>\n one('distinct', async () => ({ field, filter: filterOrNothing(filter), page: { mode: 'offset', page: 1, size: MAX_PAGE_SIZE } }),\n (data: { values: unknown[] }) => data.values),\n aggregate: <R = Record<string, unknown>>(pipeline: Record<string, unknown>[]) =>\n one('aggregate', async () => {\n const stages = await this.prepareStages(pipeline);\n const last = stages[stages.length - 1];\n // A final $count returns one row and forbids an explicit page.\n return last !== undefined && '$count' in last\n ? { pipeline: stages }\n : { pipeline: stages, page: isDirectPipeline(stages) ? { mode: 'cursor', size: MAX_PAGE_SIZE } : { mode: 'offset', page: 1, size: MAX_PAGE_SIZE } };\n }, (data: { items: R[] }) => data.items),\n get: (ids, options = {}) => {\n const unique = [...new Set(ids)];\n if (unique.length < 1 || unique.length > MAX_GET_IDS) {\n throw new TypeError(`query.get takes 1–${MAX_GET_IDS} distinct IDs; use collection.get for more.`);\n }\n return one('get', async () => ({ ids: unique, projection: options.projection }),\n (data: RecordGetResult) => ({ items: data.items.map((record) => toDoc<T>(record)), missing: data.missing }));\n },\n };\n }\n\n /** Distinct values of a field (every page). */\n async distinct(field: string, filter: Filter = {}): Promise<unknown[]> {\n const values: unknown[] = [];\n for (let page = 1; ; page += 1) {\n const result = await this.post<{ items: { _id: unknown }[]; pageInfo: PageInfo }>('recordAggregatePipeline', {\n pipeline: [{ $match: filter }, { $group: { _id: `$${field}` } }],\n page: { mode: 'offset', page, size: MAX_PAGE_SIZE },\n });\n values.push(...result.items.map(item => item._id));\n if (!result.pageInfo.hasMore) return values;\n }\n }\n\n /**\n * Runs a pipeline (`$match`, `$sort`, `$group`, `$project`, `$set`,\n * `$lookup`, `$unwind`, `$skip`, `$limit`, `$count`). `$sort` accepts\n * `{ field: 1 | -1 }`; `$lookup` takes `from` (a declared collection or\n * alias of this App) instead of a collection ID. Rows are whatever the\n * pipeline outputs, not wrapped records.\n *\n * Pipelines of only `$match` / `$sort` page by cursor; any other stage pages\n * by offset (UNS rejects cursors for transformed results). The `$exists`,\n * `$distinct` and `$frequencies` stages are listed in the UNS schema but not\n * executed by the record pipeline; use `countDocuments`, `distinct` or `$group`.\n */\n aggregate<R = Record<string, unknown>>(pipeline: Record<string, unknown>[]): Cursor<R> {\n // Recovery wraps stage preparation too, so a retry re-resolves `$lookup` IDs.\n return new Cursor<R>(({ token, size }) => this.runtime.recover(() => this.aggregatePage<R>(pipeline, token, size), { collections: [this.definition], retry: typeof token !== 'string' }));\n }\n\n private async aggregatePage<R>(\n pipeline: Record<string, unknown>[],\n token: PageToken | null,\n size: number,\n ): Promise<Page<R>> {\n const stages = await this.prepareStages(pipeline);\n const last = stages[stages.length - 1];\n if (last !== undefined && '$count' in last) {\n // A final $count returns one row and forbids an explicit page.\n const result = await this.send<{ items: R[] }>('recordAggregatePipeline', { pipeline: stages });\n return { items: result.items, next: null };\n }\n if (isDirectPipeline(stages)) {\n const result = await this.send<{ items: R[]; pageInfo: PageInfo }>('recordAggregatePipeline', {\n pipeline: stages,\n page: { mode: 'cursor', size, ...(typeof token === 'string' ? { cursor: token } : {}) },\n });\n return { items: result.items, next: result.pageInfo.hasMore && result.pageInfo.nextCursor ? result.pageInfo.nextCursor : null };\n }\n const page = typeof token === 'number' ? token : 1;\n const result = await this.send<{ items: R[]; pageInfo: PageInfo }>('recordAggregatePipeline', {\n pipeline: stages,\n page: { mode: 'offset', page, size },\n });\n return {\n items: result.items,\n next: result.pageInfo.hasMore ? (result.pageInfo.nextPage ?? page + 1) : null,\n };\n }\n\n /** Converts Mongo-style `$sort` objects and resolves `$lookup.from`, recursively. */\n private async prepareStages(pipeline: readonly Record<string, unknown>[]): Promise<Record<string, unknown>[]> {\n return Promise.all(\n pipeline.map(async (stage) => {\n if ('$sort' in stage && !Array.isArray(stage.$sort)) {\n return { ...stage, $sort: toSortPairs(stage.$sort as Sort) };\n }\n if ('$lookup' in stage && stage.$lookup && typeof stage.$lookup === 'object') {\n const { from, pipeline: inner, ...lookup } = stage.$lookup as Record<string, unknown>;\n const resolved: Record<string, unknown> = { ...lookup };\n if (from !== undefined) resolved.collectionId = await this.runtime.resolve(from as CollectionTarget | string);\n if (Array.isArray(inner)) resolved.pipeline = await this.prepareStages(inner as Record<string, unknown>[]);\n return { ...stage, $lookup: resolved };\n }\n return stage;\n }),\n );\n }\n\n /* --------------------------------- writes --------------------------------- */\n\n /** Returns the creation snapshot in the same write; replay preserves that snapshot and requires current read access. */\n async insertOne(document: TInput & { _id?: string }, options: Extract<InsertOneOptions, { returnDocument: 'after' }> & { projection?: never }): Promise<{ insertedId: string; value: WithMeta<T> }>;\n async insertOne(document: TInput & { _id?: string }, options: Extract<InsertOneOptions, { returnDocument: 'after' }>): Promise<{ insertedId: string; value: WithMeta<DeepPartial<T>> }>;\n async insertOne(document: TInput & { _id?: string }, options?: Extract<InsertOneOptions, { returnDocument?: 'none' }>): Promise<{ insertedId: string }>;\n async insertOne(document: TInput & { _id?: string }, options: InsertOneOptions): Promise<{ insertedId: string; value?: WithMeta<DeepPartial<T>> }>;\n async insertOne(document: TInput & { _id?: string }, options: InsertOneOptions = {}): Promise<{ insertedId: string; value?: WithMeta<T> | WithMeta<DeepPartial<T>> }> {\n const { id, data } = validateDocument(this.definition, document as Record<string, unknown>);\n const result = await this.post<{ insertedId: string; value: UnsRecord }>('recordInsertOne', {\n id, data, idempotencyKey: options.idempotencyKey, returnDocument: options.returnDocument, projection: options.projection,\n });\n if (options.returnDocument === 'after') return { insertedId: result.insertedId, value: toDoc<T>(result.value) };\n return { insertedId: result.insertedId };\n }\n\n /** Inserts up to 200 documents atomically (all or none). */\n async insertMany(\n documents: readonly (TInput & { _id?: string })[],\n options: { idempotencyKey?: string } = {},\n ): Promise<{ insertedCount: number; insertedIds: string[] }> {\n if (documents.length === 0) return { insertedCount: 0, insertedIds: [] };\n assertAtomicBatch('insertMany', documents.length);\n const prepared = documents.map((document) => validateDocument(this.definition, document as Record<string, unknown>));\n const result = await this.post<WriteResult>('recordBulkWrite', {\n operations: prepared.map(({ id, data }) => ({ insertOne: compact({ id, data }) })),\n ordered: true,\n atomic: true,\n idempotencyKey: options.idempotencyKey,\n });\n assertNoWriteErrors(result, 'insertMany');\n return { insertedCount: result.insertedCount ?? 0, insertedIds: idsInOrder(result.insertedIds) };\n }\n\n async updateOne(\n filter: Filter,\n update: Update,\n options: UpdateOptions = {},\n ): Promise<{ matchedCount: number; modifiedCount: number; upsertedId: string | null }> {\n const result = await this.post<WriteResult>('recordUpdateOne', {\n filter,\n update: validateUpdate(this.definition, update),\n upsert: options.upsert,\n expectedRevision: options.expectedRevision,\n sort: toSortPairs(options.sort),\n arrayFilters: options.arrayFilters,\n idempotencyKey: options.idempotencyKey,\n });\n return { matchedCount: result.matchedCount ?? 0, modifiedCount: result.modifiedCount ?? 0, upsertedId: result.upsertedId ?? null };\n }\n\n /**\n * Updates every match like Mongo's updateMany: documents commit one by one\n * (not atomically), following `resumeAfter` until every match is processed.\n * A failure after some documents committed keeps its code but is\n * `execution: \"committed\"`, with the cumulative counts and\n * `details.resumeAfter`; pass that back as `resumeAfter` to continue\n * instead of repeating the call. For all-or-nothing multi-document changes\n * use `data.transact` (≤200 items).\n */\n async updateMany(\n filter: Filter,\n update: Update,\n options: Pick<UpdateOptions, 'arrayFilters'> & { resumeAfter?: string } = {},\n ): Promise<{ matchedCount: number; modifiedCount: number }> {\n const validated = validateUpdate(this.definition, update);\n let matchedCount = 0;\n let modifiedCount = 0;\n await this.writeEach('updateMany', 'recordUpdateMany', { filter, update: validated, arrayFilters: options.arrayFilters }, options.resumeAfter, (result) => {\n matchedCount += result.matchedCount ?? 0;\n modifiedCount += result.modifiedCount ?? 0;\n return { matchedCount, modifiedCount };\n });\n return { matchedCount, modifiedCount };\n }\n\n /** Runs a non-atomic many-write page by page; see updateMany for failures. */\n private async writeEach(\n name: string,\n operation: UnsV2OperationName,\n body: Record<string, unknown>,\n from: string | undefined,\n add: (result: WriteResult) => Record<string, number>,\n ): Promise<void> {\n let resumeAfter = from;\n let committed: Record<string, number> | undefined;\n do {\n let result: ManyPage;\n try {\n result = await this.post<ManyPage>(operation, { ...body, atomic: false, resumeAfter });\n } catch (error) {\n if (!(error instanceof DataError)) throw error;\n // UNS reports what the failed page itself committed, with where to continue.\n const page = error.execution === 'committed' ? (error.details as ManyPage) : undefined;\n const totals = page ? add(page) : committed;\n // Nothing of this call took effect: the page's own error tells the truth.\n if (!totals || !Object.values(totals).some((value) => value > 0)) throw error;\n throw partialWrite(name, totals, page ? (page.resumeAfter ?? undefined) : resumeAfter, error);\n }\n committed = add(result);\n assertNoWriteErrors(result, name, committed);\n resumeAfter = result.hasMore && result.resumeAfter ? result.resumeAfter : undefined;\n } while (resumeAfter);\n }\n\n /**\n * Replaces the whole body. Fields written by another App version and not in\n * this declaration are lost — prefer `updateOne` with `$set`.\n */\n async replaceOne(\n filter: Filter,\n replacement: TInput,\n options: Omit<UpdateOptions, 'arrayFilters'> = {},\n ): Promise<{ matchedCount: number; modifiedCount: number; upsertedId: string | null }> {\n const { data } = validateDocument(this.definition, replacement as Record<string, unknown>);\n const result = await this.post<WriteResult>('recordReplaceOne', {\n filter,\n replacement: data,\n upsert: options.upsert,\n expectedRevision: options.expectedRevision,\n sort: toSortPairs(options.sort),\n idempotencyKey: options.idempotencyKey,\n });\n return { matchedCount: result.matchedCount ?? 0, modifiedCount: result.modifiedCount ?? 0, upsertedId: result.upsertedId ?? null };\n }\n\n /** Soft-deletes one record; requires `uns.delete` on the App key. */\n async deleteOne(filter: Filter, options: Pick<UpdateOptions, 'expectedRevision' | 'sort' | 'idempotencyKey'> = {}): Promise<{ deletedCount: number }> {\n const result = await this.post<WriteResult>(\n 'recordDeleteOne',\n { filter, expectedRevision: options.expectedRevision, sort: toSortPairs(options.sort), idempotencyKey: options.idempotencyKey },\n );\n return { deletedCount: result.deletedCount ?? 0 };\n }\n\n /**\n * Soft-deletes every match, one document at a time like Mongo's deleteMany\n * (not atomic), following `resumeAfter`; requires `uns.delete` on the App\n * key. Failures after committed deletes report them as updateMany does.\n */\n async deleteMany(filter: Filter, options: { resumeAfter?: string } = {}): Promise<{ deletedCount: number }> {\n let deletedCount = 0;\n await this.writeEach('deleteMany', 'recordDeleteMany', { filter }, options.resumeAfter, (result) => {\n deletedCount += result.deletedCount ?? 0;\n return { deletedCount };\n });\n return { deletedCount };\n }\n\n /**\n * Atomic read-modify-write. A state transition puts the expected state in\n * the filter: `findOneAndUpdate({ _id, status: \"DRAFT\" }, { $set: { status: \"SUBMITTED\" } })`\n * returns null when another request moved the record first.\n */\n async findOneAndUpdate(filter: Filter, update: Update, options: FindOneAndOptions = {}): Promise<WithMeta<T> | null> {\n const result = await this.post<{ value: UnsRecord | null }>('recordUpdateOne', {\n filter,\n update: validateUpdate(this.definition, update),\n upsert: options.upsert,\n expectedRevision: options.expectedRevision,\n sort: toSortPairs(options.sort),\n arrayFilters: options.arrayFilters,\n returnDocument: options.returnDocument ?? 'after',\n projection: options.projection,\n idempotencyKey: options.idempotencyKey,\n });\n return result.value ? toDoc<T>(result.value) : null;\n }\n\n async findOneAndReplace(\n filter: Filter,\n replacement: TInput,\n options: Omit<FindOneAndOptions, 'arrayFilters'> = {},\n ): Promise<WithMeta<T> | null> {\n const { data } = validateDocument(this.definition, replacement as Record<string, unknown>);\n const result = await this.post<{ value: UnsRecord | null }>('recordReplaceOne', {\n filter,\n replacement: data,\n upsert: options.upsert,\n expectedRevision: options.expectedRevision,\n sort: toSortPairs(options.sort),\n returnDocument: options.returnDocument ?? 'after',\n projection: options.projection,\n idempotencyKey: options.idempotencyKey,\n });\n return result.value ? toDoc<T>(result.value) : null;\n }\n\n async findOneAndDelete(\n filter: Filter,\n options: Pick<FindOneAndOptions, 'expectedRevision' | 'sort' | 'projection' | 'idempotencyKey'> = {},\n ): Promise<WithMeta<T> | null> {\n const result = await this.post<{ value: UnsRecord | null }>(\n 'recordDeleteOne',\n {\n filter,\n expectedRevision: options.expectedRevision,\n sort: toSortPairs(options.sort),\n projection: options.projection,\n idempotencyKey: options.idempotencyKey,\n returnDocument: 'before',\n },\n );\n return result.value ? toDoc<T>(result.value) : null;\n }\n\n /** Up to 200 mixed single-record writes in one atomic call (insertOne / updateOne / replaceOne / deleteOne). */\n async bulkWrite(\n operations: readonly BulkOperation[],\n options: { idempotencyKey?: string } = {},\n ): Promise<{\n insertedCount: number;\n matchedCount: number;\n modifiedCount: number;\n deletedCount: number;\n upsertedCount: number;\n insertedIds: Record<number, string>;\n upsertedIds: Record<number, string>;\n }> {\n assertAtomicBatch('bulkWrite', operations.length);\n const mapped = operations.map((operation) => {\n if ('insertOne' in operation) {\n const { id, data } = validateDocument(this.definition, operation.insertOne.document);\n return { insertOne: compact({ id, data }) };\n }\n if ('updateOne' in operation) {\n const { filter, update, upsert, sort } = operation.updateOne;\n return { updateOne: compact({ filter, update: validateUpdate(this.definition, update), upsert, sort: toSortPairs(sort) }) };\n }\n if ('replaceOne' in operation) {\n const { filter, replacement, upsert, sort } = operation.replaceOne;\n const { data } = validateDocument(this.definition, replacement);\n return { replaceOne: compact({ filter, replacement: data, upsert, sort: toSortPairs(sort) }) };\n }\n if ('deleteOne' in operation) {\n return { deleteOne: compact({ filter: operation.deleteOne.filter, sort: toSortPairs(operation.deleteOne.sort) }) };\n }\n throw new Error(\n `Unsupported bulkWrite operation ${Object.keys(operation).join(', ')}; use updateMany() / deleteMany() or data.transact().`,\n );\n });\n if (mapped.length === 0) {\n return { insertedCount: 0, matchedCount: 0, modifiedCount: 0, deletedCount: 0, upsertedCount: 0, insertedIds: {}, upsertedIds: {} };\n }\n const result = await this.post<WriteResult>(\n 'recordBulkWrite',\n { operations: mapped, ordered: true, atomic: true, idempotencyKey: options.idempotencyKey },\n );\n assertNoWriteErrors(result, 'bulkWrite');\n const numericKeys = (ids: Record<string, string> | undefined) =>\n Object.fromEntries(Object.entries(ids ?? {}).map(([index, id]) => [Number(index), id]));\n return {\n insertedCount: result.insertedCount ?? 0,\n matchedCount: result.matchedCount ?? 0,\n modifiedCount: result.modifiedCount ?? 0,\n deletedCount: result.deletedCount ?? 0,\n upsertedCount: result.upsertedCount ?? 0,\n insertedIds: numericKeys(result.insertedIds),\n upsertedIds: numericKeys(result.upsertedIds),\n };\n }\n}\n"]}
@@ -1,12 +1,6 @@
1
- /** Runs `fn` as part of the business request given (or only its headers, without abort). */
2
- export declare function runWithRequestContext<T>(request: Request | Headers, fn: () => T): T;
3
- /**
4
- * Runs `fn` as the App itself, outside any employee's request: use it for
5
- * work that outlives or is detached from the request (timers, queues, fire-
6
- * and-forget follow-ups). Its data calls carry no data subject.
7
- */
8
- export declare function runAsApp<T>(fn: () => T): T;
9
- /** The data subject of the request being served, if any. */
10
- export declare function currentDataSubject(): string | undefined;
11
- /** The abort signal of the request being served, if it was given. */
1
+ /** Runs `fn` with `signal` as the abort signal of the data calls it makes. */
2
+ export declare function runWithAbortSignal<T>(signal: AbortSignal | undefined, fn: () => T): T;
3
+ /** Runs `fn` outside the current request's abort signal: its data calls are not cancelled when that request is. */
4
+ export declare function runDetached<T>(fn: () => T): T;
5
+ /** The abort signal of the request being served, if one was given. */
12
6
  export declare function currentSignal(): AbortSignal | undefined;
@@ -1,50 +1,35 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.runWithRequestContext = runWithRequestContext;
4
- exports.runAsApp = runAsApp;
5
- exports.currentDataSubject = currentDataSubject;
3
+ exports.runWithAbortSignal = runWithAbortSignal;
4
+ exports.runDetached = runDetached;
6
5
  exports.currentSignal = currentSignal;
7
6
  /**
8
- * Request context for the data layer.
7
+ * The abort signal of the request being served, for the data layer.
9
8
  *
10
- * The Tier0 App Gateway signs the current employee into
11
- * `X-Tier0-App-Data-Subject` on each business request. UNS uses it to narrow
12
- * App-key access to that employee (data rules, record leases). The data layer
13
- * forwards it only while serving that request: the App's request entry point
14
- * opens the context with `runWithRequestContext`, and ensure, seed writes and
15
- * `runAsApp(...)` background work never carry it.
16
- *
17
- * Given the `Request` itself, the context also carries its abort signal: when
18
- * the caller goes away, data calls still waiting for a request slot are
19
- * dropped unsent and those in flight are cancelled.
9
+ * Every data call is made as the App, with the App's key. The App's request
10
+ * entry point may hand the data layer the request's abort signal with
11
+ * `runWithAbortSignal(request.signal, next)`: when the caller goes away, data
12
+ * calls of that request still waiting for one of the process's request slots
13
+ * are dropped unsent (`DATA_ABORTED`, `notStarted`) and those in flight are
14
+ * cancelled. Work that must outlive the request (timers, queues, fire-and-
15
+ * forget follow-ups) runs in `runDetached`, which drops the signal. Ensure,
16
+ * seed writes and `data.subscribe` never take a request's signal.
20
17
  */
21
18
  const node_async_hooks_1 = require("node:async_hooks");
22
- const cloud_transport_js_1 = require("../cloud-transport.js");
19
+ const SIGNAL_KEY = Symbol.for('tier0.sdk-v2.data.abort-signal');
23
20
  // One store per process, shared across dev-server module reloads.
24
- const STORAGE_KEY = Symbol.for('tier0.sdk-v2.data.request-context');
25
21
  const globalStore = globalThis;
26
- const storage = (globalStore[STORAGE_KEY] ??= new node_async_hooks_1.AsyncLocalStorage());
27
- /** Runs `fn` as part of the business request given (or only its headers, without abort). */
28
- function runWithRequestContext(request, fn) {
29
- const headers = request instanceof Headers ? request : request.headers;
30
- const signal = request instanceof Headers ? undefined : request.signal;
31
- const dataSubject = headers.get(cloud_transport_js_1.UNS_V2_APP_DATA_SUBJECT_HEADER)?.trim() || undefined;
32
- return storage.run({ ...(dataSubject ? { dataSubject } : {}), ...(signal ? { signal } : {}) }, fn);
33
- }
34
- /**
35
- * Runs `fn` as the App itself, outside any employee's request: use it for
36
- * work that outlives or is detached from the request (timers, queues, fire-
37
- * and-forget follow-ups). Its data calls carry no data subject.
38
- */
39
- function runAsApp(fn) {
40
- return storage.run(null, fn);
22
+ const storage = (globalStore[SIGNAL_KEY] ??= new node_async_hooks_1.AsyncLocalStorage());
23
+ /** Runs `fn` with `signal` as the abort signal of the data calls it makes. */
24
+ function runWithAbortSignal(signal, fn) {
25
+ return storage.run(signal, fn);
41
26
  }
42
- /** The data subject of the request being served, if any. */
43
- function currentDataSubject() {
44
- return storage.getStore()?.dataSubject;
27
+ /** Runs `fn` outside the current request's abort signal: its data calls are not cancelled when that request is. */
28
+ function runDetached(fn) {
29
+ return storage.run(undefined, fn);
45
30
  }
46
- /** The abort signal of the request being served, if it was given. */
31
+ /** The abort signal of the request being served, if one was given. */
47
32
  function currentSignal() {
48
- return storage.getStore()?.signal;
33
+ return storage.getStore();
49
34
  }
50
35
  //# sourceMappingURL=context.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/data/context.ts"],"names":[],"mappings":";;AA8BA,sDAKC;AAOD,4BAEC;AAGD,gDAEC;AAGD,sCAEC;AAtDD;;;;;;;;;;;;;GAaG;AACH,uDAAqD;AACrD,8DAAuE;AAOvE,kEAAkE;AAClE,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;AACpE,MAAM,WAAW,GAAG,UAEnB,CAAC;AACF,MAAM,OAAO,GAAG,CAAC,WAAW,CAAC,WAAW,CAAC,KAAK,IAAI,oCAAiB,EAAyB,CAAC,CAAC;AAE9F,4FAA4F;AAC5F,SAAgB,qBAAqB,CAAI,OAA0B,EAAE,EAAW;IAC9E,MAAM,OAAO,GAAG,OAAO,YAAY,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;IACvE,MAAM,MAAM,GAAG,OAAO,YAAY,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;IACvE,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,mDAA8B,CAAC,EAAE,IAAI,EAAE,IAAI,SAAS,CAAC;IACrF,OAAO,OAAO,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;AACrG,CAAC;AAED;;;;GAIG;AACH,SAAgB,QAAQ,CAAI,EAAW;IACrC,OAAO,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;AAC/B,CAAC;AAED,4DAA4D;AAC5D,SAAgB,kBAAkB;IAChC,OAAO,OAAO,CAAC,QAAQ,EAAE,EAAE,WAAW,CAAC;AACzC,CAAC;AAED,qEAAqE;AACrE,SAAgB,aAAa;IAC3B,OAAO,OAAO,CAAC,QAAQ,EAAE,EAAE,MAAM,CAAC;AACpC,CAAC","sourcesContent":["/**\n * Request context for the data layer.\n *\n * The Tier0 App Gateway signs the current employee into\n * `X-Tier0-App-Data-Subject` on each business request. UNS uses it to narrow\n * App-key access to that employee (data rules, record leases). The data layer\n * forwards it only while serving that request: the App's request entry point\n * opens the context with `runWithRequestContext`, and ensure, seed writes and\n * `runAsApp(...)` background work never carry it.\n *\n * Given the `Request` itself, the context also carries its abort signal: when\n * the caller goes away, data calls still waiting for a request slot are\n * dropped unsent and those in flight are cancelled.\n */\nimport { AsyncLocalStorage } from 'node:async_hooks';\nimport { UNS_V2_APP_DATA_SUBJECT_HEADER } from '../cloud-transport.js';\n\ninterface RequestContext {\n dataSubject?: string;\n signal?: AbortSignal;\n}\n\n// One store per process, shared across dev-server module reloads.\nconst STORAGE_KEY = Symbol.for('tier0.sdk-v2.data.request-context');\nconst globalStore = globalThis as typeof globalThis & {\n [STORAGE_KEY]?: AsyncLocalStorage<RequestContext | null>;\n};\nconst storage = (globalStore[STORAGE_KEY] ??= new AsyncLocalStorage<RequestContext | null>());\n\n/** Runs `fn` as part of the business request given (or only its headers, without abort). */\nexport function runWithRequestContext<T>(request: Request | Headers, fn: () => T): T {\n const headers = request instanceof Headers ? request : request.headers;\n const signal = request instanceof Headers ? undefined : request.signal;\n const dataSubject = headers.get(UNS_V2_APP_DATA_SUBJECT_HEADER)?.trim() || undefined;\n return storage.run({ ...(dataSubject ? { dataSubject } : {}), ...(signal ? { signal } : {}) }, fn);\n}\n\n/**\n * Runs `fn` as the App itself, outside any employee's request: use it for\n * work that outlives or is detached from the request (timers, queues, fire-\n * and-forget follow-ups). Its data calls carry no data subject.\n */\nexport function runAsApp<T>(fn: () => T): T {\n return storage.run(null, fn);\n}\n\n/** The data subject of the request being served, if any. */\nexport function currentDataSubject(): string | undefined {\n return storage.getStore()?.dataSubject;\n}\n\n/** The abort signal of the request being served, if it was given. */\nexport function currentSignal(): AbortSignal | undefined {\n return storage.getStore()?.signal;\n}\n"]}
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/data/context.ts"],"names":[],"mappings":";;AAuBA,gDAEC;AAGD,kCAEC;AAGD,sCAEC;AAnCD;;;;;;;;;;;GAWG;AACH,uDAAqD;AAErD,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;AAEhE,kEAAkE;AAClE,MAAM,WAAW,GAAG,UAEnB,CAAC;AACF,MAAM,OAAO,GAAG,CAAC,WAAW,CAAC,UAAU,CAAC,KAAK,IAAI,oCAAiB,EAA2B,CAAC,CAAC;AAE/F,8EAA8E;AAC9E,SAAgB,kBAAkB,CAAI,MAA+B,EAAE,EAAW;IAChF,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AACjC,CAAC;AAED,mHAAmH;AACnH,SAAgB,WAAW,CAAI,EAAW;IACxC,OAAO,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;AACpC,CAAC;AAED,sEAAsE;AACtE,SAAgB,aAAa;IAC3B,OAAO,OAAO,CAAC,QAAQ,EAAE,CAAC;AAC5B,CAAC","sourcesContent":["/**\n * The abort signal of the request being served, for the data layer.\n *\n * Every data call is made as the App, with the App's key. The App's request\n * entry point may hand the data layer the request's abort signal with\n * `runWithAbortSignal(request.signal, next)`: when the caller goes away, data\n * calls of that request still waiting for one of the process's request slots\n * are dropped unsent (`DATA_ABORTED`, `notStarted`) and those in flight are\n * cancelled. Work that must outlive the request (timers, queues, fire-and-\n * forget follow-ups) runs in `runDetached`, which drops the signal. Ensure,\n * seed writes and `data.subscribe` never take a request's signal.\n */\nimport { AsyncLocalStorage } from 'node:async_hooks';\n\nconst SIGNAL_KEY = Symbol.for('tier0.sdk-v2.data.abort-signal');\n\n// One store per process, shared across dev-server module reloads.\nconst globalStore = globalThis as typeof globalThis & {\n [SIGNAL_KEY]?: AsyncLocalStorage<AbortSignal | undefined>;\n};\nconst storage = (globalStore[SIGNAL_KEY] ??= new AsyncLocalStorage<AbortSignal | undefined>());\n\n/** Runs `fn` with `signal` as the abort signal of the data calls it makes. */\nexport function runWithAbortSignal<T>(signal: AbortSignal | undefined, fn: () => T): T {\n return storage.run(signal, fn);\n}\n\n/** Runs `fn` outside the current request's abort signal: its data calls are not cancelled when that request is. */\nexport function runDetached<T>(fn: () => T): T {\n return storage.run(undefined, fn);\n}\n\n/** The abort signal of the request being served, if one was given. */\nexport function currentSignal(): AbortSignal | undefined {\n return storage.getStore();\n}\n"]}
@@ -172,7 +172,7 @@ function toDataError(error, attempts = 1, idempotencyKey) {
172
172
  message = `${message} The collection was archived or deleted; the data layer ensures the declared collections again.`;
173
173
  }
174
174
  else if (httpStatus === 401) {
175
- message = `Tier0 rejected the App credential for ${error.operation} (${code}). The platform injects TIER0_API_KEY; do not replace it.`;
175
+ message = `Tier0 rejected the App's key for ${error.operation} (${code}). The platform provides this key to the App's process; do not supply or replace it.`;
176
176
  }
177
177
  else if (hint) {
178
178
  message = `${message} ${hint}`;
@@ -1 +1 @@
1
- {"version":3,"file":"error.js","sourceRoot":"","sources":["../../../src/data/error.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Runtime failures of a data call, missing credentials included, are a\n * `DataError`. The SDK's UNS client does the HTTP exchange; its `UnsV2Error`\n * (kept as `cause`) is translated here, and the data layer raises its own codes\n * (BATCH_LIMIT_EXCEEDED, WRITE_ERRORS, ...). `status` is the HTTP status the App\n * should answer its own caller with. Writes that fail validation throw\n * `ZodError`; programming or platform errors, such as invalid client options or\n * a malformed data subject from the gateway, throw `TypeError`.\n */\nimport type { UnsV2Error, UnsV2Execution, UnsV2Retry } from '../uns-v2/client.js';\n\n/**\n * Stable `data.reason` codes UNS adds when it refuses App data access; the\n * top-level code stays FORBIDDEN / NOT_FOUND. Only whole-request errors carry\n * them, never per-item results of a batch or transaction.\n */\nexport const ACCESS_REASONS = {\n /** 403: the collection exists, but this App's grant does not cover it or the operation. */\n notGranted: 'COLLECTION_NOT_GRANTED',\n /** 403 or 404: the collection is missing, or the write target is archived. */\n notFound: 'COLLECTION_NOT_FOUND',\n /** 403: the grant covers the operation, the App key lacks `data.missingPermission`. */\n permissionMissing: 'APP_PERMISSION_MISSING',\n} as const;\n\nexport class DataError extends Error {\n /** HTTP status the App should answer with (see `appStatus`). */\n readonly status: number;\n /** UNS error code, e.g. `DUPLICATE_KEY`, or a data-layer code. */\n readonly code: string;\n /** Stable `data.reason` code, e.g. `COLLECTION_NOT_FOUND` (see ACCESS_REASONS). */\n readonly reason?: string;\n /** HTTP status UNS answered with; 0 when no response arrived. */\n readonly upstreamStatus: number;\n readonly requestId?: string;\n /**\n * How far the failed request got: `notStarted` / `rolledBack` changed\n * nothing, `committed` took effect, `unknown` (writes only) may have.\n * Data-layer refusals raised before sending are `notStarted`.\n */\n readonly execution: UnsV2Execution;\n /** Whether the same call may be repeated later, and after how long. The data layer already retried it. */\n readonly retry: UnsV2Retry;\n /** `execution === \"unknown\"`: a write may have landed. Read back before writing again. */\n readonly outcomeUnknown: boolean;\n /** Requests sent for this call, retries included; 0 when nothing was sent. */\n readonly attempts: number;\n /**\n * The idempotency key the write was sent with (generated unless the caller\n * gave one). After `outcomeUnknown`, sending the same write with this key\n * again cannot apply it twice.\n */\n readonly idempotencyKey?: string;\n /** The `data` object of the UNS error envelope, or data-layer details. */\n readonly details: Record<string, unknown>;\n\n constructor(init: {\n message: string;\n status: number;\n code: string;\n reason?: string;\n upstreamStatus?: number;\n requestId?: string;\n execution?: UnsV2Execution;\n retry?: UnsV2Retry;\n attempts?: number;\n idempotencyKey?: string;\n details?: Record<string, unknown>;\n cause?: unknown;\n }) {\n super(init.message, init.cause === undefined ? undefined : { cause: init.cause });\n this.name = 'DataError';\n this.status = init.status;\n this.code = init.code;\n this.reason = init.reason;\n this.upstreamStatus = init.upstreamStatus ?? 0;\n this.requestId = init.requestId;\n this.execution = init.execution ?? 'notStarted';\n this.retry = init.retry ?? { safe: false };\n this.outcomeUnknown = this.execution === 'unknown';\n this.attempts = init.attempts ?? 0;\n this.idempotencyKey = init.idempotencyKey;\n this.details = init.details ?? {};\n }\n}\n\n/** Platform states the App's caller cannot fix: they answer 503 whatever UNS answered. */\nconst PLATFORM_CODES = new Set(['APP_NOT_READY', 'DEPENDENCY_UNAVAILABLE', 'CREDENTIAL_CHANGED', 'OUTCOME_UNKNOWN', 'TEMPORARILY_UNAVAILABLE']);\n\n/**\n * Maps an upstream UNS status and code to the status the App answers its own\n * caller with. Credential failures are the platform's problem, not the user's\n * session, so a 401 from UNS becomes 502 instead of looking like a logout;\n * platform states (App not ready yet, a dependency down, the App key changed\n * mid-request) become 503 instead of looking like a denied action or a conflict.\n */\nexport function appStatus(upstream: number, code = ''): number {\n if (upstream === 401) return 502;\n if (PLATFORM_CODES.has(code)) return 503;\n if (upstream === 400 || upstream === 403 || upstream === 404 || upstream === 409 || upstream === 413 || upstream === 422 || upstream === 429) {\n return upstream;\n }\n if (upstream === 502 || upstream === 503 || upstream === 504) return 503;\n if (upstream >= 500) return 502;\n return upstream >= 400 ? 400 : 502;\n}\n\nconst CODE_HINTS: Record<string, string> = {\n UPSERT_REQUIRES_UNIQUE_INDEX:\n 'An upsert filter must contain `_id` or every field of a unique index that is already ready; a newly declared unique index may still be building.',\n DUPLICATE_KEY:\n 'A unique index already holds this value. (From restore: an active record took the value meanwhile; nothing was restored.)',\n VERSION_CONFLICT: 'The record changed since it was read; reload it and retry with the new revision.',\n APP_GRANT_REVOKED:\n \"A workspace admin revoked this App's access to the collection; it is not re-granted automatically. Ask the admin to restore the grant.\",\n INDEX_QUOTA_EXCEEDED:\n 'The workspace index quota (200, counting every index that physically exists) is exhausted. Remove unused indexes through the tier0 MCP.',\n COLLECTION_TOO_LARGE:\n 'Legacy recordsArchivedAt restoration handles at most 2000 records; current collection archive / restore retains records without that limit.',\n OVERLOADED:\n \"This workspace's data requests are over their concurrency share; the data layer already waited and retried. Batch page reads with data.queryBatch and avoid per-record loops.\",\n APP_NOT_READY: 'The platform is still preparing this App (e.g. right after an import); retry shortly.',\n QUERY_TIMEOUT: 'Narrow the query: add an indexed condition, a smaller limit or maxCount.',\n OUTCOME_UNKNOWN: 'The write may have committed; read the record back before writing again.',\n};\n\n/** `APP_QUOTA_EXCEEDED` per `data.resource`; each per-App limit is 64. */\nconst QUOTA_HINTS: Record<string, string> = {\n collections: 'This App owns 64 active collections. Archive unused ones through the tier0 MCP.',\n indexes: \"This App's collections hold 64 indexes. Drop unused indexes from the declarations, then apply that with schema:replace through the tier0 MCP.\",\n archivedCollections:\n 'This App keeps 64 archived collections. Restore one, or ask a workspace admin to clean up archived collections.',\n};\n\n/** SDK transport failures: no UNS answer to map, so the data layer names them. */\nconst TRANSPORT_FAILURES: Record<string, { code: string; status: number; message: string }> = {\n UNS_V2_TRANSPORT_TIMEOUT: { code: 'DATA_TIMEOUT', status: 503, message: 'UNS did not answer in time' },\n UNS_V2_TRANSPORT_ERROR: { code: 'DATA_UNREACHABLE', status: 503, message: 'Cannot reach the Tier0 data service' },\n // The business request was aborted while the call was in flight (499: client closed request).\n UNS_V2_TRANSPORT_ABORTED: { code: 'DATA_ABORTED', status: 499, message: 'The data call was aborted' },\n UNS_V2_PROTOCOL_ERROR: { code: 'DATA_BAD_RESPONSE', status: 502, message: 'UNS answered with an invalid response' },\n};\n\nfunction codeHint(code: string, details: Record<string, unknown>): string | undefined {\n if (code === 'APP_QUOTA_EXCEEDED') {\n const resource = typeof details.resource === 'string' ? details.resource : '';\n return QUOTA_HINTS[resource] ?? 'This App reached a collection/index quota. Remove unused collections or indexes through the tier0 MCP.';\n }\n return CODE_HINTS[code];\n}\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/** Translates a failed UNS call of the SDK client after `attempts` requests, sent with `idempotencyKey`. */\nexport function toDataError(error: UnsV2Error, attempts = 1, idempotencyKey?: string): DataError {\n const common = {\n upstreamStatus: error.status,\n requestId: error.requestId,\n execution: error.execution,\n retry: error.retry,\n attempts,\n idempotencyKey,\n cause: error,\n };\n const unknown = error.outcomeUnknown ? '; the write outcome is unknown' : '';\n // An ingress or load balancer answers 502/503/504 without the UNS envelope during\n // rolling releases and pod restarts, like any unavailable upstream. UNS v2 routes\n // answer every other error with the envelope (401/403/429 included), so other\n // unenveloped responses stay DATA_BAD_RESPONSE.\n if (error.code === 'UNS_V2_PROTOCOL_ERROR' && (error.status === 502 || error.status === 503 || error.status === 504)) {\n return new DataError({\n ...common,\n message: `The Tier0 data gateway answered ${error.operation} with HTTP ${error.status}${unknown}.`,\n status: 503,\n code: `HTTP_${error.status}`,\n });\n }\n const transport = TRANSPORT_FAILURES[error.code];\n if (transport) {\n return new DataError({ ...common, message: `${transport.message} (${error.operation})${unknown}.`, status: transport.status, code: transport.code });\n }\n\n const httpStatus = error.status ?? 0;\n const data = isObject(error.data) ? error.data : {};\n // Only `data.reason` is a code; `error.reason` repeats the message text.\n const reason = typeof data.reason === 'string' ? data.reason : undefined;\n const code = error.code;\n const msg = error.message;\n const hint = codeHint(code, data) ?? error.repair;\n let message = `${msg} (${code})`;\n if (reason === ACCESS_REASONS.permissionMissing) {\n message =\n data.missingPermission === 'uns.delete'\n ? `Deleting records requires the App key to hold uns.delete, and this App's key does not (${code}). ` +\n 'Model removal as a status change such as `archived`, or ask a workspace admin to grant uns.delete.'\n : `The App key lacks ${typeof data.missingPermission === 'string' ? data.missingPermission : 'a permission'} for this operation (${code}); ask a workspace admin.`;\n } else if (reason === ACCESS_REASONS.notGranted) {\n message = `${message} This App's grant does not cover the collection or operation; ask a workspace admin to restore the grant.`;\n } else if (reason === ACCESS_REASONS.notFound) {\n message = `${message} The collection was archived or deleted; the data layer ensures the declared collections again.`;\n } else if (httpStatus === 401) {\n message = `Tier0 rejected the App credential for ${error.operation} (${code}). The platform injects TIER0_API_KEY; do not replace it.`;\n } else if (hint) {\n message = `${message} ${hint}`;\n }\n\n return new DataError({ ...common, message, status: appStatus(httpStatus, code), code, reason, upstreamStatus: httpStatus, details: data });\n}\n"]}
1
+ {"version":3,"file":"error.js","sourceRoot":"","sources":["../../../src/data/error.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Runtime failures of a data call, missing credentials included, are a\n * `DataError`. The SDK's UNS client does the HTTP exchange; its `UnsV2Error`\n * (kept as `cause`) is translated here, and the data layer raises its own codes\n * (BATCH_LIMIT_EXCEEDED, WRITE_ERRORS, ...). `status` is the HTTP status the App\n * should answer its own caller with. Writes that fail validation throw\n * `ZodError`; programming or platform errors, such as invalid client options or\n * a malformed data subject from the gateway, throw `TypeError`.\n */\nimport type { UnsV2Error, UnsV2Execution, UnsV2Retry } from '../uns-v2/client.js';\n\n/**\n * Stable `data.reason` codes UNS adds when it refuses App data access; the\n * top-level code stays FORBIDDEN / NOT_FOUND. Only whole-request errors carry\n * them, never per-item results of a batch or transaction.\n */\nexport const ACCESS_REASONS = {\n /** 403: the collection exists, but this App's grant does not cover it or the operation. */\n notGranted: 'COLLECTION_NOT_GRANTED',\n /** 403 or 404: the collection is missing, or the write target is archived. */\n notFound: 'COLLECTION_NOT_FOUND',\n /** 403: the grant covers the operation, the App key lacks `data.missingPermission`. */\n permissionMissing: 'APP_PERMISSION_MISSING',\n} as const;\n\nexport class DataError extends Error {\n /** HTTP status the App should answer with (see `appStatus`). */\n readonly status: number;\n /** UNS error code, e.g. `DUPLICATE_KEY`, or a data-layer code. */\n readonly code: string;\n /** Stable `data.reason` code, e.g. `COLLECTION_NOT_FOUND` (see ACCESS_REASONS). */\n readonly reason?: string;\n /** HTTP status UNS answered with; 0 when no response arrived. */\n readonly upstreamStatus: number;\n readonly requestId?: string;\n /**\n * How far the failed request got: `notStarted` / `rolledBack` changed\n * nothing, `committed` took effect, `unknown` (writes only) may have.\n * Data-layer refusals raised before sending are `notStarted`.\n */\n readonly execution: UnsV2Execution;\n /** Whether the same call may be repeated later, and after how long. The data layer already retried it. */\n readonly retry: UnsV2Retry;\n /** `execution === \"unknown\"`: a write may have landed. Read back before writing again. */\n readonly outcomeUnknown: boolean;\n /** Requests sent for this call, retries included; 0 when nothing was sent. */\n readonly attempts: number;\n /**\n * The idempotency key the write was sent with (generated unless the caller\n * gave one). After `outcomeUnknown`, sending the same write with this key\n * again cannot apply it twice.\n */\n readonly idempotencyKey?: string;\n /** The `data` object of the UNS error envelope, or data-layer details. */\n readonly details: Record<string, unknown>;\n\n constructor(init: {\n message: string;\n status: number;\n code: string;\n reason?: string;\n upstreamStatus?: number;\n requestId?: string;\n execution?: UnsV2Execution;\n retry?: UnsV2Retry;\n attempts?: number;\n idempotencyKey?: string;\n details?: Record<string, unknown>;\n cause?: unknown;\n }) {\n super(init.message, init.cause === undefined ? undefined : { cause: init.cause });\n this.name = 'DataError';\n this.status = init.status;\n this.code = init.code;\n this.reason = init.reason;\n this.upstreamStatus = init.upstreamStatus ?? 0;\n this.requestId = init.requestId;\n this.execution = init.execution ?? 'notStarted';\n this.retry = init.retry ?? { safe: false };\n this.outcomeUnknown = this.execution === 'unknown';\n this.attempts = init.attempts ?? 0;\n this.idempotencyKey = init.idempotencyKey;\n this.details = init.details ?? {};\n }\n}\n\n/** Platform states the App's caller cannot fix: they answer 503 whatever UNS answered. */\nconst PLATFORM_CODES = new Set(['APP_NOT_READY', 'DEPENDENCY_UNAVAILABLE', 'CREDENTIAL_CHANGED', 'OUTCOME_UNKNOWN', 'TEMPORARILY_UNAVAILABLE']);\n\n/**\n * Maps an upstream UNS status and code to the status the App answers its own\n * caller with. Credential failures are the platform's problem, not the user's\n * session, so a 401 from UNS becomes 502 instead of looking like a logout;\n * platform states (App not ready yet, a dependency down, the App key changed\n * mid-request) become 503 instead of looking like a denied action or a conflict.\n */\nexport function appStatus(upstream: number, code = ''): number {\n if (upstream === 401) return 502;\n if (PLATFORM_CODES.has(code)) return 503;\n if (upstream === 400 || upstream === 403 || upstream === 404 || upstream === 409 || upstream === 413 || upstream === 422 || upstream === 429) {\n return upstream;\n }\n if (upstream === 502 || upstream === 503 || upstream === 504) return 503;\n if (upstream >= 500) return 502;\n return upstream >= 400 ? 400 : 502;\n}\n\nconst CODE_HINTS: Record<string, string> = {\n UPSERT_REQUIRES_UNIQUE_INDEX:\n 'An upsert filter must contain `_id` or every field of a unique index that is already ready; a newly declared unique index may still be building.',\n DUPLICATE_KEY:\n 'A unique index already holds this value. (From restore: an active record took the value meanwhile; nothing was restored.)',\n VERSION_CONFLICT: 'The record changed since it was read; reload it and retry with the new revision.',\n APP_GRANT_REVOKED:\n \"A workspace admin revoked this App's access to the collection; it is not re-granted automatically. Ask the admin to restore the grant.\",\n INDEX_QUOTA_EXCEEDED:\n 'The workspace index quota (200, counting every index that physically exists) is exhausted. Remove unused indexes through the tier0 MCP.',\n COLLECTION_TOO_LARGE:\n 'Legacy recordsArchivedAt restoration handles at most 2000 records; current collection archive / restore retains records without that limit.',\n OVERLOADED:\n \"This workspace's data requests are over their concurrency share; the data layer already waited and retried. Batch page reads with data.queryBatch and avoid per-record loops.\",\n APP_NOT_READY: 'The platform is still preparing this App (e.g. right after an import); retry shortly.',\n QUERY_TIMEOUT: 'Narrow the query: add an indexed condition, a smaller limit or maxCount.',\n OUTCOME_UNKNOWN: 'The write may have committed; read the record back before writing again.',\n};\n\n/** `APP_QUOTA_EXCEEDED` per `data.resource`; each per-App limit is 64. */\nconst QUOTA_HINTS: Record<string, string> = {\n collections: 'This App owns 64 active collections. Archive unused ones through the tier0 MCP.',\n indexes: \"This App's collections hold 64 indexes. Drop unused indexes from the declarations, then apply that with schema:replace through the tier0 MCP.\",\n archivedCollections:\n 'This App keeps 64 archived collections. Restore one, or ask a workspace admin to clean up archived collections.',\n};\n\n/** SDK transport failures: no UNS answer to map, so the data layer names them. */\nconst TRANSPORT_FAILURES: Record<string, { code: string; status: number; message: string }> = {\n UNS_V2_TRANSPORT_TIMEOUT: { code: 'DATA_TIMEOUT', status: 503, message: 'UNS did not answer in time' },\n UNS_V2_TRANSPORT_ERROR: { code: 'DATA_UNREACHABLE', status: 503, message: 'Cannot reach the Tier0 data service' },\n // The business request was aborted while the call was in flight (499: client closed request).\n UNS_V2_TRANSPORT_ABORTED: { code: 'DATA_ABORTED', status: 499, message: 'The data call was aborted' },\n UNS_V2_PROTOCOL_ERROR: { code: 'DATA_BAD_RESPONSE', status: 502, message: 'UNS answered with an invalid response' },\n};\n\nfunction codeHint(code: string, details: Record<string, unknown>): string | undefined {\n if (code === 'APP_QUOTA_EXCEEDED') {\n const resource = typeof details.resource === 'string' ? details.resource : '';\n return QUOTA_HINTS[resource] ?? 'This App reached a collection/index quota. Remove unused collections or indexes through the tier0 MCP.';\n }\n return CODE_HINTS[code];\n}\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/** Translates a failed UNS call of the SDK client after `attempts` requests, sent with `idempotencyKey`. */\nexport function toDataError(error: UnsV2Error, attempts = 1, idempotencyKey?: string): DataError {\n const common = {\n upstreamStatus: error.status,\n requestId: error.requestId,\n execution: error.execution,\n retry: error.retry,\n attempts,\n idempotencyKey,\n cause: error,\n };\n const unknown = error.outcomeUnknown ? '; the write outcome is unknown' : '';\n // An ingress or load balancer answers 502/503/504 without the UNS envelope during\n // rolling releases and pod restarts, like any unavailable upstream. UNS v2 routes\n // answer every other error with the envelope (401/403/429 included), so other\n // unenveloped responses stay DATA_BAD_RESPONSE.\n if (error.code === 'UNS_V2_PROTOCOL_ERROR' && (error.status === 502 || error.status === 503 || error.status === 504)) {\n return new DataError({\n ...common,\n message: `The Tier0 data gateway answered ${error.operation} with HTTP ${error.status}${unknown}.`,\n status: 503,\n code: `HTTP_${error.status}`,\n });\n }\n const transport = TRANSPORT_FAILURES[error.code];\n if (transport) {\n return new DataError({ ...common, message: `${transport.message} (${error.operation})${unknown}.`, status: transport.status, code: transport.code });\n }\n\n const httpStatus = error.status ?? 0;\n const data = isObject(error.data) ? error.data : {};\n // Only `data.reason` is a code; `error.reason` repeats the message text.\n const reason = typeof data.reason === 'string' ? data.reason : undefined;\n const code = error.code;\n const msg = error.message;\n const hint = codeHint(code, data) ?? error.repair;\n let message = `${msg} (${code})`;\n if (reason === ACCESS_REASONS.permissionMissing) {\n message =\n data.missingPermission === 'uns.delete'\n ? `Deleting records requires the App key to hold uns.delete, and this App's key does not (${code}). ` +\n 'Model removal as a status change such as `archived`, or ask a workspace admin to grant uns.delete.'\n : `The App key lacks ${typeof data.missingPermission === 'string' ? data.missingPermission : 'a permission'} for this operation (${code}); ask a workspace admin.`;\n } else if (reason === ACCESS_REASONS.notGranted) {\n message = `${message} This App's grant does not cover the collection or operation; ask a workspace admin to restore the grant.`;\n } else if (reason === ACCESS_REASONS.notFound) {\n message = `${message} The collection was archived or deleted; the data layer ensures the declared collections again.`;\n } else if (httpStatus === 401) {\n message = `Tier0 rejected the App's key for ${error.operation} (${code}). The platform provides this key to the App's process; do not supply or replace it.`;\n } else if (hint) {\n message = `${message} ${hint}`;\n }\n\n return new DataError({ ...common, message, status: appStatus(httpStatus, code), code, reason, upstreamStatus: httpStatus, details: data });\n}\n"]}
@@ -15,9 +15,11 @@ export type { BatchQueries, BatchResults, DataClient, DataClientConfig, SettledB
15
15
  export type { DataEnvironment, EnsureConflict, EnsureNote, EnsureResult, EnsureState, EnsureWarning, Logger } from './bootstrap.js';
16
16
  export { MAX_ATOMIC_ITEMS, MAX_GET_IDS } from './collection.js';
17
17
  export type { BatchQuery, BulkOperation, CappedCount, Collection, CollectionQueries, Cursor, DeepPartial, FoundPage, ValueCount, FindOneAndOptions, FindOptions, FindPageOptions, InsertOneOptions, Projection, Update, UpdateOptions, WithMeta } from './collection.js';
18
- export { currentDataSubject, runAsApp, runWithRequestContext } from './context.js';
19
- export { redactRestricted, SUBSCRIBE_IDLE_TIMEOUT_MS } from './subscribe.js';
20
- export type { ChangeEvent, CollectionChange, RecordChange, SubscribeOptions, SubscriptionEvent } from './subscribe.js';
18
+ export { runDetached, runWithAbortSignal } from './context.js';
19
+ export { SUBSCRIBE_IDLE_TIMEOUT_MS } from './subscribe.js';
20
+ export type { RecordChange, SubscribeOptions, SubscriptionEvent } from './subscribe.js';
21
+ export { createChangeRelay } from './relay.js';
22
+ export type { ChangeRelay, ChangeRelayOptions, ChangeRelaySource, ChangeRelayStatus, ChangeRelayStreamOptions, RelayedChange } from './relay.js';
21
23
  export { ACCESS_REASONS, DataError } from './error.js';
22
24
  export * from './declarations.js';
23
25
  export { toSortPairs } from './sort.js';