@adobe/data 0.2.3 → 0.2.4

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 (526) hide show
  1. package/dist/_/data.d.ts +11 -0
  2. package/dist/{schemas/index.js → _/data.js} +2 -2
  3. package/dist/_/data.js.map +1 -0
  4. package/dist/_/equals.d.ts +11 -0
  5. package/dist/_/equals.js +73 -0
  6. package/dist/_/equals.js.map +1 -0
  7. package/dist/_/equals.test.js +150 -0
  8. package/dist/_/equals.test.js.map +1 -0
  9. package/dist/_/index.d.ts +4 -0
  10. package/dist/{core/schema → _}/index.js +2 -4
  11. package/dist/_/index.js.map +1 -0
  12. package/dist/_/is-data.d.ts +11 -0
  13. package/dist/_/is-data.js +2 -0
  14. package/dist/_/is-data.js.map +1 -0
  15. package/dist/_/normalize.d.ts +1 -0
  16. package/dist/_/normalize.js +34 -0
  17. package/dist/_/normalize.js.map +1 -0
  18. package/dist/_/normalize.test.js +48 -0
  19. package/dist/_/normalize.test.js.map +1 -0
  20. package/dist/_/schema.test.js +16 -0
  21. package/dist/_/schema.test.js.map +1 -0
  22. package/dist/blob-store/blob-store.d.ts +94 -0
  23. package/dist/blob-store/blob-store.js +194 -0
  24. package/dist/blob-store/blob-store.js.map +1 -0
  25. package/dist/blob-store/blob-store.test.js +142 -0
  26. package/dist/blob-store/blob-store.test.js.map +1 -0
  27. package/dist/core/IsData.d.ts +6 -0
  28. package/dist/core/IsData.js +2 -0
  29. package/dist/core/IsData.js.map +1 -0
  30. package/dist/core/data.d.ts +1 -12
  31. package/dist/core/data.js +1 -30
  32. package/dist/core/data.js.map +1 -1
  33. package/dist/core/data.test.js +1 -1
  34. package/dist/core/data.test.js.map +1 -1
  35. package/dist/core/equals.d.ts +11 -0
  36. package/dist/core/equals.js +73 -0
  37. package/dist/core/equals.js.map +1 -0
  38. package/dist/core/equals.test.js +150 -0
  39. package/dist/core/equals.test.js.map +1 -0
  40. package/dist/core/functions/array-equals-shallow.d.ts +1 -0
  41. package/dist/core/functions/{array-equals.js → array-equals-shallow.js} +2 -2
  42. package/dist/core/functions/array-equals-shallow.js.map +1 -0
  43. package/dist/core/functions/deep-assign.d.ts +11 -0
  44. package/dist/core/functions/deep-assign.js +61 -0
  45. package/dist/core/functions/deep-assign.js.map +1 -0
  46. package/dist/core/functions/deep-assign.test.d.ts +1 -0
  47. package/dist/core/functions/deep-assign.test.js +180 -0
  48. package/dist/core/functions/deep-assign.test.js.map +1 -0
  49. package/dist/core/functions/index.d.ts +1 -3
  50. package/dist/core/functions/index.js +1 -3
  51. package/dist/core/functions/index.js.map +1 -1
  52. package/dist/core/functions/memoize-factory.d.ts +1 -0
  53. package/dist/core/functions/memoize-factory.js +12 -0
  54. package/dist/core/functions/memoize-factory.js.map +1 -0
  55. package/dist/core/index.d.ts +4 -3
  56. package/dist/core/index.js +2 -3
  57. package/dist/core/index.js.map +1 -1
  58. package/dist/core/is-data.d.ts +11 -0
  59. package/dist/core/is-data.js +2 -0
  60. package/dist/core/is-data.js.map +1 -0
  61. package/dist/core/normalize.d.ts +1 -0
  62. package/dist/core/normalize.js +34 -0
  63. package/dist/core/normalize.js.map +1 -0
  64. package/dist/core/normalize.test.d.ts +1 -0
  65. package/dist/core/normalize.test.js +48 -0
  66. package/dist/core/normalize.test.js.map +1 -0
  67. package/dist/ecs/action-ecs/action-ecs.js +1 -1
  68. package/dist/ecs/action-ecs/action-ecs.js.map +1 -1
  69. package/dist/ecs/action-ecs/action-ecs.test.js +4 -3
  70. package/dist/ecs/action-ecs/action-ecs.test.js.map +1 -1
  71. package/dist/ecs/action-ecs/action-types.d.ts +3 -3
  72. package/dist/ecs/action-ecs/index.d.ts +1 -0
  73. package/dist/ecs/action-ecs/index.js +1 -0
  74. package/dist/ecs/action-ecs/index.js.map +1 -1
  75. package/dist/ecs/action-ecs/sequential-action.d.ts +18 -0
  76. package/dist/{core/schema/validation/validate.js → ecs/action-ecs/sequential-action.js} +21 -14
  77. package/dist/ecs/action-ecs/sequential-action.js.map +1 -0
  78. package/dist/ecs/core-components.js +0 -21
  79. package/dist/ecs/core-components.js.map +1 -1
  80. package/dist/ecs/core-ecs/core-ecs-serialization.test.js +3 -2
  81. package/dist/ecs/core-ecs/core-ecs-serialization.test.js.map +1 -1
  82. package/dist/ecs/core-ecs/core-ecs-types.d.ts +2 -1
  83. package/dist/ecs/core-ecs/core-ecs.js +2 -2
  84. package/dist/ecs/core-ecs/core-ecs.js.map +1 -1
  85. package/dist/ecs/core-ecs/core-ecs.test.js +3 -2
  86. package/dist/ecs/core-ecs/core-ecs.test.js.map +1 -1
  87. package/dist/ecs/database/create-database.d.ts +3 -3
  88. package/dist/ecs/database/create-database.js +12 -11
  89. package/dist/ecs/database/create-database.js.map +1 -1
  90. package/dist/ecs/database/create-database.test.js +17 -13
  91. package/dist/ecs/database/create-database.test.js.map +1 -1
  92. package/dist/ecs/database/database-schema/create-database-from-schemas.d.ts +15 -0
  93. package/dist/ecs/database/database-schema/create-database-from-schemas.js +33 -0
  94. package/dist/ecs/database/database-schema/create-database-from-schemas.js.map +1 -0
  95. package/dist/ecs/database/database-schema/create-database-schema.d.ts +7 -0
  96. package/dist/ecs/database/database-schema/create-database-schema.js +5 -0
  97. package/dist/ecs/database/database-schema/create-database-schema.js.map +1 -0
  98. package/dist/ecs/database/database-schema/database-schema.d.ts +12 -0
  99. package/dist/ecs/database/database-schema/database-schema.js +2 -0
  100. package/dist/ecs/database/database-schema/database-schema.js.map +1 -0
  101. package/dist/ecs/database/database-schema/index.d.ts +3 -0
  102. package/dist/ecs/database/database-schema/index.js +3 -0
  103. package/dist/ecs/database/database-schema/index.js.map +1 -0
  104. package/dist/ecs/database/database.d.ts +7 -9
  105. package/dist/ecs/database/index.d.ts +1 -0
  106. package/dist/ecs/database/index.js +1 -0
  107. package/dist/ecs/database/index.js.map +1 -1
  108. package/dist/ecs/database/observe-dependent-value.js.map +1 -1
  109. package/dist/ecs/database/observe-dependent-value.test.js +21 -21
  110. package/dist/ecs/database/observe-dependent-value.test.js.map +1 -1
  111. package/dist/ecs/database/transactional-store/create-transactional-store.d.ts +2 -2
  112. package/dist/ecs/database/transactional-store/create-transactional-store.js +1 -0
  113. package/dist/ecs/database/transactional-store/create-transactional-store.js.map +1 -1
  114. package/dist/ecs/database/transactional-store/create-transactional-store.test.js +11 -9
  115. package/dist/ecs/database/transactional-store/create-transactional-store.test.js.map +1 -1
  116. package/dist/ecs/database/transactional-store/transactional-store.d.ts +3 -2
  117. package/dist/ecs/ecs/ecs-types.d.ts +14 -13
  118. package/dist/ecs/ecs/ecs.js.map +1 -1
  119. package/dist/ecs/ecs/ecs.test.js +1 -1
  120. package/dist/ecs/ecs/ecs.test.js.map +1 -1
  121. package/dist/ecs/ecs/index.d.ts +0 -1
  122. package/dist/ecs/ecs/index.js +21 -0
  123. package/dist/ecs/ecs/index.js.map +1 -1
  124. package/dist/ecs/index.d.ts +4 -0
  125. package/dist/ecs/index.js +4 -0
  126. package/dist/ecs/index.js.map +1 -1
  127. package/dist/ecs/resource-schemas.d.ts +6 -0
  128. package/dist/ecs/resource-schemas.js +2 -0
  129. package/dist/ecs/resource-schemas.js.map +1 -0
  130. package/dist/ecs/store/components.d.ts +1 -0
  131. package/dist/{core/schema.js → ecs/store/components.js} +1 -11
  132. package/dist/ecs/store/components.js.map +1 -0
  133. package/dist/ecs/store/core/core.d.ts +9 -8
  134. package/dist/ecs/store/core/core.js +21 -0
  135. package/dist/ecs/store/core/core.js.map +1 -1
  136. package/dist/ecs/store/create-store.d.ts +4 -6
  137. package/dist/ecs/store/create-store.js +5 -6
  138. package/dist/ecs/store/create-store.js.map +1 -1
  139. package/dist/ecs/store/create-store.test.js +21 -21
  140. package/dist/ecs/store/create-store.test.js.map +1 -1
  141. package/dist/ecs/store/resource-components copy.d.ts +1 -0
  142. package/dist/{core/schema/schema.js → ecs/store/resource-components copy.js } +1 -12
  143. package/dist/ecs/store/resource-components copy.js.map +1 -0
  144. package/dist/ecs/store/store.d.ts +5 -4
  145. package/dist/ecs/systems/index.d.ts +2 -0
  146. package/dist/ecs/systems/index.js +2 -0
  147. package/dist/ecs/systems/index.js.map +1 -0
  148. package/dist/ecs/systems/system-phase.d.ts +5 -0
  149. package/dist/ecs/systems/system-phase.js +16 -0
  150. package/dist/ecs/systems/system-phase.js.map +1 -0
  151. package/dist/ecs/systems/system.d.ts +7 -0
  152. package/dist/ecs/systems/system.js +2 -0
  153. package/dist/ecs/systems/system.js.map +1 -0
  154. package/dist/ecs/transaction-ecs/transaction-ecs.js +2 -2
  155. package/dist/ecs/transaction-ecs/transaction-ecs.js.map +1 -1
  156. package/dist/ecs/transaction-ecs/transaction-types.d.ts +7 -6
  157. package/dist/ecs/transaction-ecs/transactions.js.map +1 -1
  158. package/dist/equalsShallow.d.ts +1 -0
  159. package/dist/equalsShallow.js +37 -0
  160. package/dist/equalsShallow.js.map +1 -0
  161. package/dist/equalsShallow.test.d.ts +1 -0
  162. package/dist/equalsShallow.test.js +113 -0
  163. package/dist/equalsShallow.test.js.map +1 -0
  164. package/dist/functions/apply-args.d.ts +7 -0
  165. package/dist/functions/apply-args.js +19 -0
  166. package/dist/functions/apply-args.js.map +1 -0
  167. package/dist/functions/index.d.ts +1 -0
  168. package/dist/functions/index.js +2 -0
  169. package/dist/functions/index.js.map +1 -0
  170. package/dist/internal/object/mutable-clone.d.ts +5 -0
  171. package/dist/internal/object/mutable-clone.js +4 -0
  172. package/dist/internal/object/mutable-clone.js.map +1 -0
  173. package/dist/internal/typed-array/get-byte-size.d.ts +1 -1
  174. package/dist/lit/decorators/apply-service-decorators.js +1 -1
  175. package/dist/lit/decorators/apply-service-decorators.js.map +1 -1
  176. package/dist/lit/elements/service-application.d.ts +3 -2
  177. package/dist/lit/elements/service-application.js +10 -6
  178. package/dist/lit/elements/service-application.js.map +1 -1
  179. package/dist/lit/elements/service-element.d.ts +1 -1
  180. package/dist/lit/elements/service-element.js +2 -2
  181. package/dist/lit/elements/service-element.js.map +1 -1
  182. package/dist/old-ecs/ecs/ecs-where-cache.test.d.ts +1 -0
  183. package/dist/old-ecs/ecs/ecs-where-cache.test.js +164 -0
  184. package/dist/old-ecs/ecs/ecs-where-cache.test.js.map +1 -0
  185. package/dist/package.json +24 -24
  186. package/dist/schema/FromSchema.d.ts +25 -0
  187. package/dist/schema/FromSchema.js +2 -0
  188. package/dist/schema/FromSchema.js.map +1 -0
  189. package/dist/schema/index.d.ts +1 -1
  190. package/dist/schema/schema.d.ts +6 -0
  191. package/dist/schema/schema.js.map +1 -1
  192. package/dist/service/isService.d.ts +2 -0
  193. package/dist/service/isService.js +5 -0
  194. package/dist/service/isService.js.map +1 -0
  195. package/dist/table/copy-column-to-gpu-buffer.d.ts +5 -0
  196. package/dist/table/copy-column-to-gpu-buffer.js +26 -0
  197. package/dist/table/copy-column-to-gpu-buffer.js.map +1 -0
  198. package/dist/table/copy-to-gpu-buffer.d.ts +2 -0
  199. package/dist/table/copy-to-gpu-buffer.js +16 -0
  200. package/dist/table/copy-to-gpu-buffer.js.map +1 -0
  201. package/dist/table/create-composite-table.d.ts +5 -0
  202. package/dist/table/create-composite-table.js +20 -0
  203. package/dist/table/create-composite-table.js.map +1 -0
  204. package/dist/table/create-table.test.d.ts +1 -0
  205. package/dist/{core/schema/validation/is-valid.test.js → table/create-table.test.js} +17 -16
  206. package/dist/table/create-table.test.js.map +1 -0
  207. package/dist/table/index.d.ts +1 -0
  208. package/dist/table/index.js +1 -0
  209. package/dist/table/index.js.map +1 -1
  210. package/dist/tsconfig.tsbuildinfo +1 -1
  211. package/dist/typed-buffer/copy-to-gpu-buffer.js +1 -1
  212. package/dist/typed-buffer/copy-to-gpu-buffer.js.map +1 -1
  213. package/dist/typed-buffer/create-array-buffer.js +7 -2
  214. package/dist/typed-buffer/create-array-buffer.js.map +1 -1
  215. package/dist/typed-buffer/create-composite-buffer.d.ts +2 -0
  216. package/dist/typed-buffer/create-composite-buffer.js +85 -0
  217. package/dist/typed-buffer/create-composite-buffer.js.map +1 -0
  218. package/dist/typed-buffer/create-composite-buffer.test.d.ts +1 -0
  219. package/dist/typed-buffer/create-composite-buffer.test.js +291 -0
  220. package/dist/typed-buffer/create-composite-buffer.test.js.map +1 -0
  221. package/dist/typed-buffer/create-const-buffer.d.ts +2 -0
  222. package/dist/typed-buffer/create-const-buffer.js +30 -0
  223. package/dist/typed-buffer/create-const-buffer.js.map +1 -0
  224. package/dist/typed-buffer/create-const-buffer.test.d.ts +1 -0
  225. package/dist/typed-buffer/create-const-buffer.test.js +128 -0
  226. package/dist/typed-buffer/create-const-buffer.test.js.map +1 -0
  227. package/dist/typed-buffer/create-mapped-buffer.d.ts +6 -0
  228. package/dist/typed-buffer/create-mapped-buffer.js +32 -0
  229. package/dist/typed-buffer/create-mapped-buffer.js.map +1 -0
  230. package/dist/typed-buffer/create-mapped-buffer.test.d.ts +1 -0
  231. package/dist/typed-buffer/create-mapped-buffer.test.js +202 -0
  232. package/dist/typed-buffer/create-mapped-buffer.test.js.map +1 -0
  233. package/dist/typed-buffer/create-number-buffer.js +4 -2
  234. package/dist/typed-buffer/create-number-buffer.js.map +1 -1
  235. package/dist/typed-buffer/create-struct-buffer.js +8 -16
  236. package/dist/typed-buffer/create-struct-buffer.js.map +1 -1
  237. package/dist/typed-buffer/create-typed-buffer.js +4 -0
  238. package/dist/typed-buffer/create-typed-buffer.js.map +1 -1
  239. package/dist/typed-buffer/index.js.map +1 -1
  240. package/dist/typed-buffer/typed-buffer.d.ts +3 -1
  241. package/dist/typed-buffer/typed-buffer.test.js +103 -0
  242. package/dist/typed-buffer/typed-buffer.test.js.map +1 -1
  243. package/dist/types/array/equalsShallow.d.ts +1 -0
  244. package/dist/types/array/equalsShallow.js +37 -0
  245. package/dist/types/array/equalsShallow.js.map +1 -0
  246. package/dist/types/array/equalsShallow.test.d.ts +1 -0
  247. package/dist/types/array/equalsShallow.test.js +113 -0
  248. package/dist/types/array/equalsShallow.test.js.map +1 -0
  249. package/dist/types/array/index.d.ts +1 -0
  250. package/dist/types/array/index.js +2 -0
  251. package/dist/types/array/index.js.map +1 -0
  252. package/dist/types/array-buffer-like/copy.d.ts +1 -0
  253. package/dist/types/array-buffer-like/copy.js +469 -0
  254. package/dist/types/array-buffer-like/copy.js.map +1 -0
  255. package/dist/types/array-buffer-like/grow.d.ts +1 -0
  256. package/dist/types/array-buffer-like/grow.js +53 -0
  257. package/dist/types/array-buffer-like/grow.js.map +1 -0
  258. package/dist/types/array-buffer-like/index.d.ts +4 -0
  259. package/dist/types/array-buffer-like/index.js +26 -0
  260. package/dist/types/array-buffer-like/index.js.map +1 -0
  261. package/dist/types/array-buffer-like/is-array-buffer.d.ts +1 -0
  262. package/dist/types/array-buffer-like/is-array-buffer.js +445 -0
  263. package/dist/types/array-buffer-like/is-array-buffer.js.map +1 -0
  264. package/dist/types/array-buffer-like/is-shared-array-buffer.d.ts +1 -0
  265. package/dist/types/array-buffer-like/is-shared-array-buffer.js +445 -0
  266. package/dist/types/array-buffer-like/is-shared-array-buffer.js.map +1 -0
  267. package/dist/types/data-view-32/create-data-view-32.d.ts +2 -0
  268. package/dist/types/data-view-32/create-data-view-32.js +8 -0
  269. package/dist/types/data-view-32/create-data-view-32.js.map +1 -0
  270. package/dist/types/data-view-32/data-view-32.d.ts +5 -0
  271. package/dist/types/data-view-32/data-view-32.js +23 -0
  272. package/dist/types/data-view-32/data-view-32.js.map +1 -0
  273. package/dist/types/data-view-32/index.d.ts +2 -0
  274. package/dist/types/data-view-32/index.js +24 -0
  275. package/dist/types/data-view-32/index.js.map +1 -0
  276. package/dist/types/object/index.d.ts +2 -0
  277. package/dist/types/object/index.js +24 -0
  278. package/dist/types/object/index.js.map +1 -0
  279. package/dist/types/object/map-entries.d.ts +5 -0
  280. package/dist/types/object/map-entries.js +29 -0
  281. package/dist/types/object/map-entries.js.map +1 -0
  282. package/dist/types/object/mutable-clone.d.ts +5 -0
  283. package/dist/types/object/mutable-clone.js +4 -0
  284. package/dist/types/object/mutable-clone.js.map +1 -0
  285. package/dist/types/remove-readonly.d.ts +3 -0
  286. package/dist/types/remove-readonly.js +2 -0
  287. package/dist/types/remove-readonly.js.map +1 -0
  288. package/dist/types/table/add-row.d.ts +8 -0
  289. package/dist/types/table/add-row.js +40 -0
  290. package/dist/types/table/add-row.js.map +1 -0
  291. package/dist/types/table/create-table.d.ts +3 -0
  292. package/dist/types/table/create-table.js +33 -0
  293. package/dist/types/table/create-table.js.map +1 -0
  294. package/dist/types/table/delete-row.d.ts +9 -0
  295. package/dist/types/table/delete-row.js +18 -0
  296. package/dist/types/table/delete-row.js.map +1 -0
  297. package/dist/types/table/ensure-capacity.d.ts +2 -0
  298. package/dist/types/table/ensure-capacity.js +15 -0
  299. package/dist/types/table/ensure-capacity.js.map +1 -0
  300. package/dist/types/table/get-row-data.d.ts +3 -0
  301. package/dist/types/table/get-row-data.js +8 -0
  302. package/dist/types/table/get-row-data.js.map +1 -0
  303. package/dist/types/table/index.d.ts +8 -0
  304. package/dist/types/table/index.js +30 -0
  305. package/dist/types/table/index.js.map +1 -0
  306. package/dist/types/table/row-index.d.ts +8 -0
  307. package/dist/types/table/row-index.js +3 -0
  308. package/dist/types/table/row-index.js.map +1 -0
  309. package/dist/types/table/table.d.ts +13 -0
  310. package/dist/types/table/table.js +2 -0
  311. package/dist/types/table/table.js.map +1 -0
  312. package/dist/types/table/update-row.d.ts +8 -0
  313. package/dist/types/table/update-row.js +12 -0
  314. package/dist/types/table/update-row.js.map +1 -0
  315. package/dist/types/typed-array/copy-to-gpu-buffer.d.ts +2 -0
  316. package/dist/types/typed-array/copy-to-gpu-buffer.js +16 -0
  317. package/dist/types/typed-array/copy-to-gpu-buffer.js.map +1 -0
  318. package/dist/types/typed-array/get-byte-size.d.ts +2 -0
  319. package/dist/types/typed-array/get-byte-size.js +28 -0
  320. package/dist/types/typed-array/get-byte-size.js.map +1 -0
  321. package/dist/types/typed-array/index.d.ts +4 -0
  322. package/dist/types/typed-array/index.js +26 -0
  323. package/dist/types/typed-array/index.js.map +1 -0
  324. package/dist/types/typed-array/typed-array-constructer.d.ts +7 -0
  325. package/dist/types/typed-array/typed-array-constructer.js +2 -0
  326. package/dist/types/typed-array/typed-array-constructer.js.map +1 -0
  327. package/dist/types/typed-array/typed-array.d.ts +1 -0
  328. package/dist/types/typed-array/typed-array.js +23 -0
  329. package/dist/types/typed-array/typed-array.js.map +1 -0
  330. package/dist/types/typed-buffer/copy-to-gpu-buffer.d.ts +2 -0
  331. package/dist/types/typed-buffer/copy-to-gpu-buffer.js +16 -0
  332. package/dist/types/typed-buffer/copy-to-gpu-buffer.js.map +1 -0
  333. package/dist/types/typed-buffer/create-array-buffer.d.ts +4 -0
  334. package/dist/types/typed-buffer/create-array-buffer.js +29 -0
  335. package/dist/types/typed-buffer/create-array-buffer.js.map +1 -0
  336. package/dist/types/typed-buffer/create-number-buffer.d.ts +8 -0
  337. package/dist/types/typed-buffer/create-number-buffer.js +75 -0
  338. package/dist/types/typed-buffer/create-number-buffer.js.map +1 -0
  339. package/dist/types/typed-buffer/create-struct-buffer.d.ts +10 -0
  340. package/dist/types/typed-buffer/create-struct-buffer.js +78 -0
  341. package/dist/types/typed-buffer/create-struct-buffer.js.map +1 -0
  342. package/dist/types/typed-buffer/create-typed-buffer.d.ts +7 -0
  343. package/dist/types/typed-buffer/create-typed-buffer.js +17 -0
  344. package/dist/types/typed-buffer/create-typed-buffer.js.map +1 -0
  345. package/dist/types/typed-buffer/index.d.ts +6 -0
  346. package/dist/types/typed-buffer/index.js +28 -0
  347. package/dist/types/typed-buffer/index.js.map +1 -0
  348. package/dist/types/typed-buffer/structs/assert-struct.d.ts +8 -0
  349. package/dist/types/typed-buffer/structs/assert-struct.js +15 -0
  350. package/dist/types/typed-buffer/structs/assert-struct.js.map +1 -0
  351. package/dist/types/typed-buffer/structs/create-read-struct.d.ts +3 -0
  352. package/dist/types/typed-buffer/structs/create-read-struct.js +62 -0
  353. package/dist/types/typed-buffer/structs/create-read-struct.js.map +1 -0
  354. package/dist/types/typed-buffer/structs/create-read-struct.test.d.ts +1 -0
  355. package/dist/types/typed-buffer/structs/create-read-struct.test.js +189 -0
  356. package/dist/types/typed-buffer/structs/create-read-struct.test.js.map +1 -0
  357. package/dist/types/typed-buffer/structs/create-write-struct.d.ts +3 -0
  358. package/dist/types/typed-buffer/structs/create-write-struct.js +58 -0
  359. package/dist/types/typed-buffer/structs/create-write-struct.js.map +1 -0
  360. package/dist/types/typed-buffer/structs/get-field-offset.d.ts +2 -0
  361. package/dist/types/typed-buffer/structs/get-field-offset.js +14 -0
  362. package/dist/types/typed-buffer/structs/get-field-offset.js.map +1 -0
  363. package/dist/types/typed-buffer/structs/get-struct-layout.d.ts +5 -0
  364. package/dist/types/typed-buffer/structs/get-struct-layout.js +198 -0
  365. package/dist/types/typed-buffer/structs/get-struct-layout.js.map +1 -0
  366. package/dist/types/typed-buffer/structs/get-struct-layout.test.d.ts +1 -0
  367. package/dist/types/typed-buffer/structs/get-struct-layout.test.js +133 -0
  368. package/dist/types/typed-buffer/structs/get-struct-layout.test.js.map +1 -0
  369. package/dist/types/typed-buffer/structs/index.d.ts +1 -0
  370. package/dist/types/typed-buffer/structs/index.js +23 -0
  371. package/dist/types/typed-buffer/structs/index.js.map +1 -0
  372. package/dist/types/typed-buffer/structs/read-struct.d.ts +2 -0
  373. package/dist/types/typed-buffer/structs/read-struct.js +2 -0
  374. package/dist/types/typed-buffer/structs/read-struct.js.map +1 -0
  375. package/dist/types/typed-buffer/structs/struct-layout.d.ts +21 -0
  376. package/dist/types/typed-buffer/structs/struct-layout.js +23 -0
  377. package/dist/types/typed-buffer/structs/struct-layout.js.map +1 -0
  378. package/dist/types/typed-buffer/structs/write-struct.d.ts +2 -0
  379. package/dist/types/typed-buffer/structs/write-struct.js +2 -0
  380. package/dist/types/typed-buffer/structs/write-struct.js.map +1 -0
  381. package/dist/types/typed-buffer/structs/write-struct.test.d.ts +1 -0
  382. package/dist/types/typed-buffer/structs/write-struct.test.js +181 -0
  383. package/dist/types/typed-buffer/structs/write-struct.test.js.map +1 -0
  384. package/dist/types/typed-buffer/typed-buffer.d.ts +16 -0
  385. package/dist/types/typed-buffer/typed-buffer.js +2 -0
  386. package/dist/types/typed-buffer/typed-buffer.js.map +1 -0
  387. package/dist/types/typed-buffer/typed-buffer.test.d.ts +1 -0
  388. package/dist/types/typed-buffer/typed-buffer.test.js +223 -0
  389. package/dist/types/typed-buffer/typed-buffer.test.js.map +1 -0
  390. package/dist/types/types.d.ts +5 -2
  391. package/dist/types/types.js.map +1 -1
  392. package/dist/ui/decorators/apply-decorator.d.ts +1 -0
  393. package/dist/ui/decorators/apply-decorator.js +18 -0
  394. package/dist/ui/decorators/apply-decorator.js.map +1 -0
  395. package/dist/ui/decorators/apply-service-decorators.d.ts +1 -0
  396. package/dist/ui/decorators/apply-service-decorators.js +12 -0
  397. package/dist/ui/decorators/apply-service-decorators.js.map +1 -0
  398. package/dist/ui/decorators/require-service.d.ts +1 -0
  399. package/dist/ui/decorators/require-service.js +13 -0
  400. package/dist/ui/decorators/require-service.js.map +1 -0
  401. package/dist/ui/elements/index.d.ts +3 -0
  402. package/dist/ui/elements/index.js +4 -0
  403. package/dist/ui/elements/index.js.map +1 -0
  404. package/dist/ui/elements/service-application.d.ts +8 -0
  405. package/dist/ui/elements/service-application.js +27 -0
  406. package/dist/ui/elements/service-application.js.map +1 -0
  407. package/dist/ui/elements/service-context.d.ts +1 -0
  408. package/dist/ui/elements/service-context.js +3 -0
  409. package/dist/ui/elements/service-context.js.map +1 -0
  410. package/dist/ui/elements/service-element.d.ts +6 -0
  411. package/dist/ui/elements/service-element.js +22 -0
  412. package/dist/ui/elements/service-element.js.map +1 -0
  413. package/dist/ui/hooks/component/component.d.ts +9 -0
  414. package/dist/ui/hooks/component/component.js +2 -0
  415. package/dist/ui/hooks/component/component.js.map +1 -0
  416. package/dist/ui/hooks/component/stack.d.ts +6 -0
  417. package/dist/ui/hooks/component/stack.js +15 -0
  418. package/dist/ui/hooks/component/stack.js.map +1 -0
  419. package/dist/ui/hooks/index.d.ts +7 -0
  420. package/dist/ui/hooks/index.js +9 -0
  421. package/dist/ui/hooks/index.js.map +1 -0
  422. package/dist/ui/hooks/use-connected.d.ts +2 -0
  423. package/dist/ui/hooks/use-connected.js +31 -0
  424. package/dist/ui/hooks/use-connected.js.map +1 -0
  425. package/dist/ui/hooks/use-effect.d.ts +3 -0
  426. package/dist/ui/hooks/use-effect.js +13 -0
  427. package/dist/ui/hooks/use-effect.js.map +1 -0
  428. package/dist/ui/hooks/use-element.d.ts +4 -0
  429. package/dist/ui/hooks/use-element.js +8 -0
  430. package/dist/ui/hooks/use-element.js.map +1 -0
  431. package/dist/ui/hooks/use-memo.d.ts +1 -0
  432. package/dist/ui/hooks/use-memo.js +12 -0
  433. package/dist/ui/hooks/use-memo.js.map +1 -0
  434. package/dist/ui/hooks/use-observable-values.d.ts +5 -0
  435. package/dist/ui/hooks/use-observable-values.js +8 -0
  436. package/dist/ui/hooks/use-observable-values.js.map +1 -0
  437. package/dist/ui/hooks/use-observable.d.ts +2 -0
  438. package/dist/ui/hooks/use-observable.js +12 -0
  439. package/dist/ui/hooks/use-observable.js.map +1 -0
  440. package/dist/ui/hooks/use-ref.d.ts +3 -0
  441. package/dist/ui/hooks/use-ref.js +6 -0
  442. package/dist/ui/hooks/use-ref.js.map +1 -0
  443. package/dist/ui/hooks/use-resize-observer.d.ts +10 -0
  444. package/dist/ui/hooks/use-resize-observer.js +20 -0
  445. package/dist/ui/hooks/use-resize-observer.js.map +1 -0
  446. package/dist/ui/hooks/use-state.d.ts +2 -0
  447. package/dist/ui/hooks/use-state.js +14 -0
  448. package/dist/ui/hooks/use-state.js.map +1 -0
  449. package/dist/ui/hooks/use-window-event.d.ts +1 -0
  450. package/dist/ui/hooks/use-window-event.js +10 -0
  451. package/dist/ui/hooks/use-window-event.js.map +1 -0
  452. package/dist/ui/hooks/with-hooks.d.ts +2 -0
  453. package/dist/ui/hooks/with-hooks.js +15 -0
  454. package/dist/ui/hooks/with-hooks.js.map +1 -0
  455. package/dist/ui/index.d.ts +1 -0
  456. package/dist/ui/index.js +2 -0
  457. package/dist/ui/index.js.map +1 -0
  458. package/package.json +8 -1
  459. package/dist/core/functions/array-equals.d.ts +0 -1
  460. package/dist/core/functions/array-equals.js.map +0 -1
  461. package/dist/core/functions/with-validation.d.ts +0 -5
  462. package/dist/core/functions/with-validation.js +0 -38
  463. package/dist/core/functions/with-validation.js.map +0 -1
  464. package/dist/core/functions/with-validation.test.js +0 -96
  465. package/dist/core/functions/with-validation.test.js.map +0 -1
  466. package/dist/core/schema/dynamic/dynamic-schema.d.ts +0 -27
  467. package/dist/core/schema/dynamic/dynamic-schema.js +0 -2
  468. package/dist/core/schema/dynamic/dynamic-schema.js.map +0 -1
  469. package/dist/core/schema/dynamic/enumerate-patches.d.ts +0 -9
  470. package/dist/core/schema/dynamic/enumerate-patches.js +0 -50
  471. package/dist/core/schema/dynamic/enumerate-patches.js.map +0 -1
  472. package/dist/core/schema/dynamic/enumerate-patches.test.d.ts +0 -134
  473. package/dist/core/schema/dynamic/enumerate-patches.test.js +0 -209
  474. package/dist/core/schema/dynamic/enumerate-patches.test.js.map +0 -1
  475. package/dist/core/schema/dynamic/get-dynamic-schema.d.ts +0 -5
  476. package/dist/core/schema/dynamic/get-dynamic-schema.js +0 -26
  477. package/dist/core/schema/dynamic/get-dynamic-schema.js.map +0 -1
  478. package/dist/core/schema/dynamic/get-dynamic-schema.test.js +0 -94
  479. package/dist/core/schema/dynamic/get-dynamic-schema.test.js.map +0 -1
  480. package/dist/core/schema/dynamic/index.d.ts +0 -1
  481. package/dist/core/schema/dynamic/index.js +0 -2
  482. package/dist/core/schema/dynamic/index.js.map +0 -1
  483. package/dist/core/schema/dynamic/schema-path-value-path.d.ts +0 -5
  484. package/dist/core/schema/dynamic/schema-path-value-path.js +0 -12
  485. package/dist/core/schema/dynamic/schema-path-value-path.js.map +0 -1
  486. package/dist/core/schema/dynamic-schema.d.ts +0 -27
  487. package/dist/core/schema/dynamic-schema.js +0 -2
  488. package/dist/core/schema/dynamic-schema.js.map +0 -1
  489. package/dist/core/schema/index.d.ts +0 -4
  490. package/dist/core/schema/index.js.map +0 -1
  491. package/dist/core/schema/schema.d.ts +0 -122
  492. package/dist/core/schema/schema.js.map +0 -1
  493. package/dist/core/schema/schemas.d.ts +0 -45
  494. package/dist/core/schema/schemas.js +0 -39
  495. package/dist/core/schema/schemas.js.map +0 -1
  496. package/dist/core/schema/ui-schema.d.ts +0 -25
  497. package/dist/core/schema/ui-schema.js +0 -2
  498. package/dist/core/schema/ui-schema.js.map +0 -1
  499. package/dist/core/schema/validation/is-valid.d.ts +0 -2
  500. package/dist/core/schema/validation/is-valid.js +0 -14
  501. package/dist/core/schema/validation/is-valid.js.map +0 -1
  502. package/dist/core/schema/validation/is-valid.test.js.map +0 -1
  503. package/dist/core/schema/validation/validate.d.ts +0 -2
  504. package/dist/core/schema/validation/validate.js.map +0 -1
  505. package/dist/core/schema/validation/validate.test.js +0 -106
  506. package/dist/core/schema/validation/validate.test.js.map +0 -1
  507. package/dist/core/schema/validation/with-validation.d.ts +0 -5
  508. package/dist/core/schema/validation/with-validation.js +0 -16
  509. package/dist/core/schema/validation/with-validation.js.map +0 -1
  510. package/dist/core/schema/validation/with-validation.test.js +0 -96
  511. package/dist/core/schema/validation/with-validation.test.js.map +0 -1
  512. package/dist/core/schema.d.ts +0 -86
  513. package/dist/core/schema.js.map +0 -1
  514. package/dist/core/schemas.d.ts +0 -45
  515. package/dist/core/schemas.js +0 -39
  516. package/dist/core/schemas.js.map +0 -1
  517. package/dist/schemas/index.d.ts +0 -1
  518. package/dist/schemas/index.js.map +0 -1
  519. package/dist/schemas/schemas.d.ts +0 -45
  520. package/dist/schemas/schemas.js +0 -39
  521. package/dist/schemas/schemas.js.map +0 -1
  522. /package/dist/{core/functions/with-validation.test.d.ts → _/equals.test.d.ts} +0 -0
  523. /package/dist/{core/schema/dynamic/get-dynamic-schema.test.d.ts → _/normalize.test.d.ts} +0 -0
  524. /package/dist/{core/schema/validation/is-valid.test.d.ts → _/schema.test.d.ts} +0 -0
  525. /package/dist/{core/schema/validation/validate.test.d.ts → blob-store/blob-store.test.d.ts} +0 -0
  526. /package/dist/core/{schema/validation/with-validation.test.d.ts → equals.test.d.ts} +0 -0
@@ -0,0 +1,194 @@
1
+ /*MIT License
2
+
3
+ © Copyright 2025 Adobe. All rights reserved.
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.*/
22
+ import { getManagedPersistentCache } from "../cache/get-persistent-cache.js";
23
+ import { blobToHash } from "../cache/functions/hashing/blob-to-hash.js";
24
+ import { preventParallelExecution } from "../cache/functions/prevent-parallel-execution.js";
25
+ const remoteUrlPrefix = "http";
26
+ const RemoteUrlSchema = {
27
+ type: "string",
28
+ pattern: `${remoteUrlPrefix}.*`,
29
+ };
30
+ const RemoteBlobRefSchema = {
31
+ required: ["remoteBlobRef"],
32
+ properties: {
33
+ remoteBlobRef: RemoteUrlSchema,
34
+ },
35
+ additionalProperties: false,
36
+ };
37
+ const LocalBlobRefSchema = {
38
+ required: ["localBlobRef"],
39
+ properties: {
40
+ localBlobRef: { type: "string" },
41
+ },
42
+ additionalProperties: false,
43
+ };
44
+ export const BlobRefSchema = {
45
+ oneOf: [RemoteBlobRefSchema, LocalBlobRefSchema],
46
+ };
47
+ function isRemoteBlobRef(ref) {
48
+ const maybe = ref;
49
+ return typeof maybe?.remoteBlobRef === "string";
50
+ }
51
+ function isLocalBlobRef(ref) {
52
+ const maybe = ref;
53
+ return typeof maybe?.localBlobRef === "string";
54
+ }
55
+ export function isBlobRef(value) {
56
+ return isRemoteBlobRef(value) || isLocalBlobRef(value);
57
+ }
58
+ function isRemoteUrl(url) {
59
+ return url.startsWith(remoteUrlPrefix);
60
+ }
61
+ function toRequest(ref) {
62
+ return new Request(`${window.location.origin}/${ref.localBlobRef}`);
63
+ }
64
+ /**
65
+ * Defined as a symbol because we only want it used by internal code like DataCache.
66
+ */
67
+ export const hasBlobInternalDoNotUse = Symbol("hasBlob");
68
+ /**
69
+ * Creates a new blob store instance.
70
+ */
71
+ export function createBlobStore() {
72
+ const cachePromise = getManagedPersistentCache("blobstore", {
73
+ maximumMemoryEntries: 10,
74
+ maximumStorageEntries: 1000,
75
+ });
76
+ // Track borrowed URLs and their reference counts
77
+ const borrowedUrls = new Map();
78
+ // Reverse mapping for O(1) lookup
79
+ const urlToKey = new Map();
80
+ async function getRef(blob) {
81
+ const cache = await cachePromise;
82
+ if (typeof blob === "string") {
83
+ // if this is not a remote url, then we can assume it is a data url and fetch the blob from it.
84
+ blob = await (await fetch(blob)).blob();
85
+ }
86
+ const ref = {
87
+ localBlobRef: await blobToHash(blob),
88
+ };
89
+ const request = toRequest(ref);
90
+ const response = new Response(blob);
91
+ await cache.put(request, response);
92
+ return ref;
93
+ }
94
+ async function hasBlob(r) {
95
+ if (isRemoteBlobRef(r)) {
96
+ return true;
97
+ }
98
+ const cache = await cachePromise;
99
+ const response = await cache.match(toRequest(r));
100
+ return response !== undefined;
101
+ }
102
+ async function getBlob(r) {
103
+ if (!r) {
104
+ return null;
105
+ }
106
+ const response = await (isRemoteBlobRef(r)
107
+ ? fetch(r.remoteBlobRef)
108
+ : (await cachePromise).match(toRequest(r)));
109
+ if (!response) {
110
+ return null;
111
+ }
112
+ if (!response.ok) {
113
+ // this should only happen with remote urls. local blob responses are always ok.
114
+ throw new Error(response.statusText);
115
+ }
116
+ return response.blob();
117
+ }
118
+ async function releaseBlob(r) {
119
+ if (isLocalBlobRef(r)) {
120
+ const cache = await cachePromise;
121
+ cache.delete(toRequest(r));
122
+ }
123
+ }
124
+ /**
125
+ * prevent parallel execution to avoid race condition in borrowUrl while awaiting getBlob
126
+ */
127
+ const borrowUrlInternalNoIncrement = preventParallelExecution(async (key, r) => {
128
+ if (isRemoteBlobRef(r)) {
129
+ return { url: r.remoteBlobRef, count: 0 };
130
+ }
131
+ const blob = await getBlob(r);
132
+ if (!blob) {
133
+ return null;
134
+ }
135
+ const url = URL.createObjectURL(blob);
136
+ const existing = { url, count: 0 };
137
+ borrowedUrls.set(key, existing);
138
+ urlToKey.set(url, key);
139
+ return existing;
140
+ });
141
+ async function borrowUrl(r) {
142
+ const key = JSON.stringify(r);
143
+ const existing = borrowedUrls.get(key) ?? await borrowUrlInternalNoIncrement(key, r);
144
+ if (!existing) {
145
+ return null;
146
+ }
147
+ existing.count++;
148
+ return existing.url;
149
+ }
150
+ function returnUrl(url) {
151
+ if (!url) {
152
+ return;
153
+ }
154
+ const key = urlToKey.get(url);
155
+ if (key) {
156
+ const entry = borrowedUrls.get(key);
157
+ if (entry) {
158
+ entry.count--;
159
+ if (entry.count <= 0) {
160
+ borrowedUrls.delete(key);
161
+ urlToKey.delete(url);
162
+ if (!isRemoteUrl(url)) {
163
+ URL.revokeObjectURL(url);
164
+ }
165
+ }
166
+ }
167
+ }
168
+ }
169
+ function createRemoteBlobRef(url) {
170
+ if (!isRemoteUrl(url)) {
171
+ throw new Error(`Invalid url, expected to start with (${remoteUrlPrefix}): ${url}`);
172
+ }
173
+ return { remoteBlobRef: url };
174
+ }
175
+ function _testGetBorrowCount(r) {
176
+ const key = JSON.stringify(r);
177
+ return borrowedUrls.get(key)?.count ?? 0;
178
+ }
179
+ return {
180
+ getRef,
181
+ getBlob,
182
+ hasBlob,
183
+ borrowUrl,
184
+ returnUrl,
185
+ releaseBlob,
186
+ createRemoteBlobRef,
187
+ _testGetBorrowCount,
188
+ };
189
+ }
190
+ /**
191
+ * The global blob store that can be used to store and retrieve blobs.
192
+ */
193
+ export const blobStore = createBlobStore();
194
+ //# sourceMappingURL=blob-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blob-store.js","sourceRoot":"","sources":["../../src/blob-store/blob-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,142 @@
1
+ /*MIT License
2
+
3
+ © Copyright 2025 Adobe. All rights reserved.
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.*/
22
+ import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
23
+ import { createBlobStore } from "./blob-store.js";
24
+ describe("blobStore", () => {
25
+ // Mock URL.createObjectURL and URL.revokeObjectURL
26
+ const mockCreateObjectURL = vi.fn((blob) => `blob:${Math.random()}`);
27
+ const mockRevokeObjectURL = vi.fn();
28
+ let testBlobStore;
29
+ let createdUrl;
30
+ beforeEach(async () => {
31
+ // Setup URL mock functions
32
+ const originalCreateObjectURL = URL.createObjectURL;
33
+ const originalRevokeObjectURL = URL.revokeObjectURL;
34
+ // Ensure we create a non-http URL
35
+ mockCreateObjectURL.mockImplementation((blob) => {
36
+ createdUrl = `blob:${Math.random()}`;
37
+ return createdUrl;
38
+ });
39
+ URL.createObjectURL = mockCreateObjectURL;
40
+ URL.revokeObjectURL = mockRevokeObjectURL;
41
+ // Clear mock call history
42
+ mockCreateObjectURL.mockClear();
43
+ mockRevokeObjectURL.mockClear();
44
+ testBlobStore = await createBlobStore();
45
+ return () => {
46
+ URL.createObjectURL = originalCreateObjectURL;
47
+ URL.revokeObjectURL = originalRevokeObjectURL;
48
+ };
49
+ });
50
+ afterEach(() => {
51
+ // Clean up any remaining borrowed URLs
52
+ mockCreateObjectURL.mockReset();
53
+ mockRevokeObjectURL.mockReset();
54
+ });
55
+ describe("URL reference counting", () => {
56
+ it("should reuse the same URL for multiple borrows of the same blob", async () => {
57
+ // Create a test blob
58
+ const testBlob = new Blob(["test"], { type: "text/plain" });
59
+ const blobRef = await testBlobStore.getRef(testBlob);
60
+ // Borrow the URL multiple times
61
+ const url1 = await testBlobStore.borrowUrl(blobRef);
62
+ const url2 = await testBlobStore.borrowUrl(blobRef);
63
+ const url3 = await testBlobStore.borrowUrl(blobRef);
64
+ expect(url1).toBeTruthy();
65
+ expect(url1).toBe(url2);
66
+ expect(url2).toBe(url3);
67
+ expect(url1).toMatch(/^blob:/); // Verify it's a blob URL
68
+ // createObjectURL should only be called once
69
+ expect(mockCreateObjectURL).toHaveBeenCalledTimes(1);
70
+ // Clean up
71
+ testBlobStore.returnUrl(url1);
72
+ testBlobStore.returnUrl(url2);
73
+ testBlobStore.returnUrl(url3);
74
+ });
75
+ it("should only revoke URL when all references are returned", async () => {
76
+ const testBlob = new Blob(["test"], { type: "text/plain" });
77
+ const blobRef = await testBlobStore.getRef(testBlob);
78
+ // Borrow the URL three times
79
+ const url1 = await testBlobStore.borrowUrl(blobRef);
80
+ const url2 = await testBlobStore.borrowUrl(blobRef);
81
+ const url3 = await testBlobStore.borrowUrl(blobRef);
82
+ expect(url1).toMatch(/^blob:/); // Verify it's a blob URL
83
+ // Return URLs one by one
84
+ testBlobStore.returnUrl(url1);
85
+ expect(mockRevokeObjectURL).not.toHaveBeenCalled();
86
+ testBlobStore.returnUrl(url2);
87
+ expect(mockRevokeObjectURL).not.toHaveBeenCalled();
88
+ testBlobStore.returnUrl(url3);
89
+ expect(mockRevokeObjectURL).toHaveBeenCalledTimes(1);
90
+ expect(mockRevokeObjectURL).toHaveBeenCalledWith(createdUrl);
91
+ });
92
+ it("should handle remote URLs correctly", async () => {
93
+ const remoteRef = testBlobStore.createRemoteBlobRef("http://example.com/image.jpg");
94
+ // Borrow remote URL multiple times
95
+ const url1 = await testBlobStore.borrowUrl(remoteRef);
96
+ const url2 = await testBlobStore.borrowUrl(remoteRef);
97
+ expect(url1).toBe("http://example.com/image.jpg");
98
+ expect(url2).toBe("http://example.com/image.jpg");
99
+ expect(mockCreateObjectURL).not.toHaveBeenCalled();
100
+ // Return URLs
101
+ testBlobStore.returnUrl(url1);
102
+ testBlobStore.returnUrl(url2);
103
+ // Should not revoke remote URLs
104
+ expect(mockRevokeObjectURL).not.toHaveBeenCalled();
105
+ });
106
+ it("should handle null inputs gracefully", async () => {
107
+ const nullUrl = await testBlobStore.borrowUrl(null);
108
+ expect(nullUrl).toBeNull();
109
+ // Should not throw when returning null
110
+ expect(() => testBlobStore.returnUrl(null)).not.toThrow();
111
+ });
112
+ it('demonstrates race condition in borrowUrl', async () => {
113
+ const store = testBlobStore;
114
+ const testBlob = new Blob(['test data'], { type: 'text/plain' });
115
+ const blobRef = await store.getRef(testBlob);
116
+ // Create an artificially delayed getBlob to simulate network latency
117
+ const originalGetBlob = store.getBlob;
118
+ store.getBlob = async (ref) => {
119
+ await new Promise(resolve => setTimeout(resolve, 50)); // Add delay
120
+ return originalGetBlob(ref);
121
+ };
122
+ // Make two parallel borrowUrl calls
123
+ const [url1, url2] = await Promise.all([
124
+ store.borrowUrl(blobRef),
125
+ store.borrowUrl(blobRef)
126
+ ]);
127
+ expect(url1).toBe(url2); // Same URL should be returned
128
+ // Return one of the URLs
129
+ store.returnUrl(url1);
130
+ // Verify that the borrow count is still 1 since we borrowed twice and returned once
131
+ expect(store._testGetBorrowCount(blobRef)).toBe(1);
132
+ // Return the second URL
133
+ store.returnUrl(url2);
134
+ // Verify the borrow count is now 0
135
+ expect(store._testGetBorrowCount(blobRef)).toBe(0);
136
+ // Verify the URL was revoked
137
+ expect(mockRevokeObjectURL).toHaveBeenCalledTimes(1);
138
+ expect(mockRevokeObjectURL).toHaveBeenCalledWith(url1);
139
+ });
140
+ });
141
+ });
142
+ //# sourceMappingURL=blob-store.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blob-store.test.js","sourceRoot":"","sources":["../../src/blob-store/blob-store.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { Primitive, Equal, IsFullyReadonly } from "./data.js";
2
+ export type IsData<T> = [
3
+ T
4
+ ] extends [Primitive] ? true : T extends ReadonlyArray<infer U> ? Equal<T, ReadonlyArray<U>> extends true ? IsData<U> : false : T extends object ? IsFullyReadonly<T> extends true ? {
5
+ [K in keyof T]-?: IsData<T[K]>;
6
+ }[keyof T] extends false ? false : true : false : false;
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=IsData.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IsData.js","sourceRoot":"","sources":["../../src/core/IsData.ts"],"names":[],"mappings":""}
@@ -6,17 +6,6 @@
6
6
  * It also allows us to strongly define contracts between our application and external services.
7
7
  * Validation of input arguments and output results allows strict enforcement of agreed upon contracts.
8
8
  */
9
- export type Data = string | number | boolean | null | undefined | ReadonlyArray<Data> | {
9
+ export type Data = string | number | boolean | null | ReadonlyArray<Data> | {
10
10
  readonly [K in string]?: Data;
11
11
  };
12
- /**
13
- * Compares two Data objects for deep equality.
14
- * Ordering of keys matters.
15
- * If order is not important then use normalize first.
16
- */
17
- export declare function equals(a?: unknown, b?: unknown): boolean;
18
- /**
19
- * Returns a new normalized object of the same type by
20
- * recursively sorting any contained objects keys alphabetically.
21
- */
22
- export declare function normalize<D>(d: D): D;
package/dist/core/data.js CHANGED
@@ -19,34 +19,5 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
19
  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
20
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
21
  SOFTWARE.*/
22
- /**
23
- * Compares two Data objects for deep equality.
24
- * Ordering of keys matters.
25
- * If order is not important then use normalize first.
26
- */
27
- export function equals(a, b) {
28
- if (a === b) {
29
- return true;
30
- }
31
- if (!a || !b) {
32
- return false;
33
- }
34
- return JSON.stringify(a) === JSON.stringify(b);
35
- }
36
- /**
37
- * Returns a new normalized object of the same type by
38
- * recursively sorting any contained objects keys alphabetically.
39
- */
40
- export function normalize(d) {
41
- // we could structured clone but let's explicitly shed any keys with undefined values.
42
- return JSON.parse(JSON.stringify(d), (_key, value) => {
43
- if (value && !Array.isArray(value) && typeof value === "object") {
44
- return Object.fromEntries(Object.entries(value).sort(([a], [b]) =>
45
- // not using String.localeCompare
46
- // we want this consistent no matter locale
47
- a < b ? -1 : a > b ? 1 : 0));
48
- }
49
- return value;
50
- });
51
- }
22
+ export {};
52
23
  //# sourceMappingURL=data.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"data.js","sourceRoot":"","sources":["../../src/core/data.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;WAoBW;AAmBX;;;;GAIG;AACH,MAAM,UAAU,MAAM,CAAC,CAAW,EAAE,CAAW;IAC7C,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACZ,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;QACb,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;AACjD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAI,CAAI;IAC/B,uFAAuF;IACvF,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,IAAY,EAAE,KAAc,EAAE,EAAE;QACpE,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAChE,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE;YACtC,kCAAkC;YAClC,4CAA4C;YAC5C,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAC3B,CACF,CAAC;QACJ,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"data.js","sourceRoot":"","sources":["../../src/core/data.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;WAoBW"}
@@ -19,7 +19,7 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
19
  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
20
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
21
  SOFTWARE.*/
22
- import { normalize } from "./data.js";
22
+ import { normalize } from "./normalize.js";
23
23
  import { describe, expect, it } from "vitest";
24
24
  describe("Data.normalize", () => {
25
25
  it("should sort object keys alphabetically", () => {
@@ -1 +1 @@
1
- {"version":3,"file":"data.test.js","sourceRoot":"","sources":["../../src/core/data.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;WAoBW;AACX,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9C,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;YACjD,CAAC,EAAE,CAAC;YACJ,CAAC,EAAE,CAAC;YACJ,CAAC,EAAE,IAAI;SACR,CAAC,CAAC;QACH,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5E,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAClE,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;YAC1D,CAAC,EAAE,EAAE;YACL,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;SACtB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;YAC1D,CAAC,EAAE,CAAC;YACJ,CAAC,EAAE,CAAC;SACL,CAAC,CAAC;QACH,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;YAC5D,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;SACf,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"data.test.js","sourceRoot":"","sources":["../../src/core/data.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;WAoBW;AACX,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9C,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;YACjD,CAAC,EAAE,CAAC;YACJ,CAAC,EAAE,CAAC;YACJ,CAAC,EAAE,IAAI;SACR,CAAC,CAAC;QACH,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5E,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAClE,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;YAC1D,CAAC,EAAE,EAAE;YACL,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;SACtB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;YAC1D,CAAC,EAAE,CAAC;YACJ,CAAC,EAAE,CAAC;SACL,CAAC,CAAC;QACH,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;YAC5D,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;SACf,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Very-fast deep equality for JSON-style values.
3
+ *
4
+ * Assumptions
5
+ * ───────────
6
+ * • Only JSON primitives, plain objects, and arrays appear.
7
+ * • Objects have **no prototype chain** (so every enumerable key is "own,"
8
+ * letting us skip costly `hasOwnProperty` checks).
9
+ * • No cyclic references (add a WeakMap if you need that).
10
+ */
11
+ export declare function equals(a: unknown, b: unknown): boolean;
@@ -0,0 +1,73 @@
1
+ /*MIT License
2
+
3
+ © Copyright 2025 Adobe. All rights reserved.
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.*/
22
+ /**
23
+ * Very-fast deep equality for JSON-style values.
24
+ *
25
+ * Assumptions
26
+ * ───────────
27
+ * • Only JSON primitives, plain objects, and arrays appear.
28
+ * • Objects have **no prototype chain** (so every enumerable key is "own,"
29
+ * letting us skip costly `hasOwnProperty` checks).
30
+ * • No cyclic references (add a WeakMap if you need that).
31
+ */
32
+ export function equals(a, b) {
33
+ // 1 Primitives / identical reference
34
+ if (Object.is(a, b))
35
+ return true; // Handles NaN === NaN
36
+ if (a == null || b == null)
37
+ return false; // null / undefined mismatch
38
+ if (typeof a !== "object" || typeof b !== "object")
39
+ return false;
40
+ // 2 Arrays
41
+ const aIsArr = Array.isArray(a);
42
+ const bIsArr = Array.isArray(b);
43
+ if (aIsArr || bIsArr) {
44
+ if (aIsArr !== bIsArr)
45
+ return false; // one array, one object
46
+ const aa = a;
47
+ const bb = b;
48
+ if (aa.length !== bb.length)
49
+ return false;
50
+ for (let i = 0; i < aa.length; i++) {
51
+ if (!equals(aa[i], bb[i]))
52
+ return false;
53
+ }
54
+ return true;
55
+ }
56
+ // 3 Plain objects
57
+ const ao = a;
58
+ const bo = b;
59
+ let keyBalance = 0; // = keys(a) – keys(b)
60
+ // Pass 1: walk keys of a, compare values, and tally count.
61
+ for (const k in ao) {
62
+ keyBalance++; // saw a key from a
63
+ if (!(k in bo))
64
+ return false; // missing in b
65
+ if (!equals(ao[k], bo[k]))
66
+ return false; // value differs
67
+ }
68
+ // Pass 2: walk keys of b to detect extras.
69
+ for (const _ in bo)
70
+ keyBalance--;
71
+ return keyBalance === 0; // zero ⇒ same key set
72
+ }
73
+ //# sourceMappingURL=equals.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"equals.js","sourceRoot":"","sources":["../../src/core/equals.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;WAoBW;AAEX;;;;;;;;;GASG;AACH,MAAM,UAAU,MAAM,CAAC,CAAU,EAAE,CAAU;IAC3C,sCAAsC;IACtC,IAAI,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC,CAAC,sBAAsB;IACxD,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI;QAAE,OAAO,KAAK,CAAC,CAAU,4BAA4B;IAC/E,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAEjE,YAAY;IACZ,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAChC,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAChC,IAAI,MAAM,IAAI,MAAM,EAAE,CAAC;QACrB,IAAI,MAAM,KAAK,MAAM;YAAE,OAAO,KAAK,CAAC,CAAa,wBAAwB;QACzE,MAAM,EAAE,GAAG,CAAc,CAAC;QAC1B,MAAM,EAAE,GAAG,CAAc,CAAC;QAC1B,IAAI,EAAE,CAAC,MAAM,KAAK,EAAE,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACnC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;gBAAE,OAAO,KAAK,CAAC;QAC1C,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,mBAAmB;IACnB,MAAM,EAAE,GAAG,CAA4B,CAAC;IACxC,MAAM,EAAE,GAAG,CAA4B,CAAC;IAExC,IAAI,UAAU,GAAG,CAAC,CAAC,CAAgC,sBAAsB;IAEzE,2DAA2D;IAC3D,KAAK,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;QACnB,UAAU,EAAE,CAAC,CAAoC,mBAAmB;QACpE,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAAE,OAAO,KAAK,CAAC,CAAoB,eAAe;QAChE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC,CAAS,gBAAgB;IACnE,CAAC;IAED,2CAA2C;IAC3C,KAAK,MAAM,CAAC,IAAI,EAAE;QAAE,UAAU,EAAE,CAAC;IAEjC,OAAO,UAAU,KAAK,CAAC,CAAC,CAA2B,sBAAsB;AAC3E,CAAC"}