@adobe/data 0.1.3 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (591) hide show
  1. package/.cursorrules +28 -0
  2. package/.eslintrc.cjs +48 -0
  3. package/.github/CONTRIBUTING.md +47 -0
  4. package/CODE_OF_CONDUCT.md +79 -0
  5. package/LICENSE +21 -0
  6. package/README.md +2 -2
  7. package/asconfig.json +22 -0
  8. package/assembly/index.ts +85 -0
  9. package/assembly/tsconfig.json +17 -0
  10. package/c/build_run.sh +2 -0
  11. package/c/vector_addition +0 -0
  12. package/c/vector_addition.c +125 -0
  13. package/{cache/functions/types.js → config/license.js} +0 -2
  14. package/docs/perftest.html +28 -0
  15. package/index.html +10 -0
  16. package/package.json +50 -28
  17. package/scripts/deploy-docs.sh +41 -0
  18. package/{assembly-test/assembly.test.js → src/assembly-test/assembly.test.ts} +4 -4
  19. package/src/cache/async-cache.ts +38 -0
  20. package/{cache/blob-store.test.js → src/cache/blob-store.test.ts} +41 -7
  21. package/src/cache/blob-store.ts +278 -0
  22. package/src/cache/data-cache.test.ts +61 -0
  23. package/src/cache/data-cache.ts +183 -0
  24. package/src/cache/expiring-data-cache.test.ts +81 -0
  25. package/src/cache/expiring-data-cache.ts +61 -0
  26. package/src/cache/fallback-async-cache.ts +49 -0
  27. package/src/cache/functions/async-data-function.ts +25 -0
  28. package/src/cache/functions/functions.test.ts +84 -0
  29. package/{cache/functions/get-cached.test.js → src/cache/functions/get-cached.test.ts} +24 -7
  30. package/{cache/functions/get-cached.js → src/cache/functions/get-cached.ts} +12 -6
  31. package/{cache/functions/hashing/blob-to-hash.js → src/cache/functions/hashing/blob-to-hash.ts} +20 -18
  32. package/{cache/functions/hashing/buffer-to-hash.js → src/cache/functions/hashing/buffer-to-hash.ts} +7 -7
  33. package/src/cache/functions/hashing/hashing.test.ts +95 -0
  34. package/{cache/functions/hashing/index.js → src/cache/functions/hashing/index.ts} +1 -1
  35. package/{cache/functions/hashing/json-to-hash.js → src/cache/functions/hashing/json-to-hash.ts} +3 -3
  36. package/{cache/functions/hashing/string-to-hash.js → src/cache/functions/hashing/string-to-hash.ts} +11 -10
  37. package/{cache/functions/index.js → src/cache/functions/index.ts} +2 -4
  38. package/{cache/functions/memoize.js → src/cache/functions/memoize.ts} +22 -15
  39. package/src/cache/functions/prevent-parallel-execution.ts +50 -0
  40. package/src/cache/get-persistent-cache.ts +62 -0
  41. package/{cache/index.js → src/cache/index.ts} +9 -3
  42. package/src/cache/managed-array.ts +243 -0
  43. package/{cache/managed-async-cache.browser.test.js → src/cache/managed-async-cache.browser.test.ts} +27 -24
  44. package/src/cache/managed-async-cache.ts +78 -0
  45. package/src/cache/memory-allocator.ts +176 -0
  46. package/src/cache/memory-async-cache.ts +51 -0
  47. package/src/data.ts +38 -0
  48. package/src/ecs/README.md +21 -0
  49. package/src/ecs/archetype/archetype.ts +39 -0
  50. package/src/ecs/archetype/create-archetype.test.ts +115 -0
  51. package/src/ecs/archetype/create-archetype.ts +52 -0
  52. package/src/ecs/archetype/delete-row.test.ts +110 -0
  53. package/src/ecs/archetype/delete-row.ts +37 -0
  54. package/src/ecs/archetype/index.ts +24 -0
  55. package/src/ecs/component-schemas.ts +24 -0
  56. package/src/ecs/core-components.ts +443 -0
  57. package/src/ecs/database/create-database.test.ts +745 -0
  58. package/src/ecs/database/create-database.ts +205 -0
  59. package/src/ecs/database/database.ts +81 -0
  60. package/src/ecs/database/index.ts +24 -0
  61. package/src/ecs/database/observe-dependent-value.test.ts +198 -0
  62. package/src/ecs/database/observe-dependent-value.ts +78 -0
  63. package/src/ecs/database/transactional-store/create-transactional-store.test.ts +250 -0
  64. package/src/ecs/database/transactional-store/create-transactional-store.ts +281 -0
  65. package/{ecs/ecs/ecs-types.js → src/ecs/database/transactional-store/index.ts} +1 -2
  66. package/src/ecs/database/transactional-store/transactional-store.ts +80 -0
  67. package/src/ecs/entity-location-table/create-entity-location-table.test.ts +170 -0
  68. package/src/ecs/entity-location-table/create-entity-location-table.ts +96 -0
  69. package/src/ecs/entity-location-table/entity-location-table.ts +30 -0
  70. package/{core/schema/schema.js → src/ecs/entity-location-table/entity-location.ts} +11 -11
  71. package/src/ecs/entity-location-table/index.ts +23 -0
  72. package/src/ecs/entity.ts +26 -0
  73. package/src/ecs/index.ts +26 -0
  74. package/src/ecs/store/core/core.ts +71 -0
  75. package/src/ecs/store/core/create-core.test.ts +440 -0
  76. package/src/ecs/store/core/create-core.ts +168 -0
  77. package/{cache/async-cache.js → src/ecs/store/core/index.ts} +1 -2
  78. package/src/ecs/store/create-store.test.ts +562 -0
  79. package/src/ecs/store/create-store.ts +97 -0
  80. package/src/ecs/store/index.ts +23 -0
  81. package/{types/types.js → src/ecs/store/resource-components.ts} +2 -6
  82. package/src/ecs/store/store.ts +55 -0
  83. package/src/equals-shallow.test.ts +133 -0
  84. package/src/equals-shallow.ts +37 -0
  85. package/src/equals.test.ts +175 -0
  86. package/src/equals.ts +70 -0
  87. package/src/index.ts +27 -0
  88. package/src/internal/array-buffer-like/copy.ts +469 -0
  89. package/src/internal/array-buffer-like/grow.ts +53 -0
  90. package/{core/index.js → src/internal/array-buffer-like/index.ts} +4 -4
  91. package/src/internal/array-buffer-like/is-array-buffer.ts +445 -0
  92. package/src/internal/array-buffer-like/is-shared-array-buffer.ts +445 -0
  93. package/{core/functions/is-async-generator.js → src/internal/async-generator/is-async-generator.ts} +2 -2
  94. package/{core/schema.js → src/internal/data-view-32/create-data-view-32.ts} +8 -11
  95. package/src/internal/data-view-32/data-view-32.ts +447 -0
  96. package/{ecs/action-ecs/index.js → src/internal/data-view-32/index.ts} +2 -2
  97. package/src/internal/function/memoize-factory.ts +12 -0
  98. package/src/internal/object/index.ts +23 -0
  99. package/{cache/functions/bind-functions.js → src/internal/object/map-entries.ts} +6 -11
  100. package/src/internal/promise/is-promise.ts +28 -0
  101. package/src/internal/typed-array/get-byte-size.ts +50 -0
  102. package/src/internal/typed-array/index.ts +24 -0
  103. package/src/internal/typed-array/typed-array-constructer.ts +32 -0
  104. package/src/internal/typed-array/typed-array.ts +25 -0
  105. package/src/is-data.ts +47 -0
  106. package/src/lit/decorators/apply-decorator.ts +24 -0
  107. package/src/lit/decorators/apply-service-decorators.ts +13 -0
  108. package/src/lit/decorators/index.ts +24 -0
  109. package/src/lit/decorators/require-service.ts +19 -0
  110. package/src/lit/elements/index.ts +3 -0
  111. package/src/lit/elements/service-application.ts +26 -0
  112. package/src/lit/elements/service-context.ts +3 -0
  113. package/src/lit/elements/service-element.ts +18 -0
  114. package/src/lit/hooks/component/component.ts +10 -0
  115. package/src/lit/hooks/component/stack.ts +17 -0
  116. package/src/lit/hooks/index.ts +13 -0
  117. package/src/lit/hooks/use-connected.ts +39 -0
  118. package/src/lit/hooks/use-effect.ts +17 -0
  119. package/src/lit/hooks/use-element.ts +8 -0
  120. package/src/lit/hooks/use-memo.ts +14 -0
  121. package/src/lit/hooks/use-observable-values.ts +9 -0
  122. package/src/lit/hooks/use-observable.ts +13 -0
  123. package/src/lit/hooks/use-ref.ts +6 -0
  124. package/src/lit/hooks/use-resize-observer.ts +27 -0
  125. package/src/lit/hooks/use-state.ts +17 -0
  126. package/src/lit/hooks/use-window-event.ts +14 -0
  127. package/src/lit/hooks/with-hooks.ts +20 -0
  128. package/src/lit/index.ts +3 -0
  129. package/src/mutable-clone.ts +29 -0
  130. package/{core/data.test.js → src/normalize.test.ts} +22 -22
  131. package/src/normalize.ts +37 -0
  132. package/src/observe/create-observable-event.ts +47 -0
  133. package/src/observe/create-observable-state.ts +51 -0
  134. package/src/observe/create-persisted-state.test.ts +143 -0
  135. package/src/observe/create-persisted-state.ts +60 -0
  136. package/src/observe/create-query-state.ts +70 -0
  137. package/{observe/from-array.js → src/observe/from-array.ts} +14 -3
  138. package/{service/service.js → src/observe/from-constant.ts} +13 -4
  139. package/{observe/from-element-id.js → src/observe/from-element-id.ts} +44 -39
  140. package/src/observe/from-element-properties-and-events.ts +47 -0
  141. package/{observe/from-element-property.js → src/observe/from-element-property.ts} +33 -25
  142. package/src/observe/from-promise-with-error.ts +51 -0
  143. package/src/observe/from-promise.ts +49 -0
  144. package/src/observe/from-properties.ts +67 -0
  145. package/{observe/index.js → src/observe/index.ts} +4 -1
  146. package/src/observe/observe.test.ts +467 -0
  147. package/src/observe/to-promise.ts +40 -0
  148. package/src/observe/to-properties.ts +41 -0
  149. package/src/observe/types.ts +40 -0
  150. package/src/observe/with-async-map.ts +37 -0
  151. package/src/observe/with-batch.test.ts +141 -0
  152. package/src/observe/with-batch.ts +67 -0
  153. package/{core/data.js → src/observe/with-cache.ts} +32 -26
  154. package/src/observe/with-copy.ts +32 -0
  155. package/src/observe/with-deduplicate-data.ts +43 -0
  156. package/src/observe/with-deduplicate.ts +41 -0
  157. package/src/observe/with-default.ts +48 -0
  158. package/src/observe/with-lazy.test.ts +68 -0
  159. package/{core/functions/is-promise.js → src/observe/with-lazy.ts} +17 -5
  160. package/{observe/with-map-data.js → src/observe/with-map-data.ts} +9 -3
  161. package/src/observe/with-map.ts +36 -0
  162. package/src/observe/with-optional.ts +47 -0
  163. package/src/observe/with-unwrap.ts +54 -0
  164. package/src/old-ecs/action-ecs/action-ecs.test.ts +420 -0
  165. package/src/old-ecs/action-ecs/action-ecs.ts +274 -0
  166. package/src/old-ecs/action-ecs/action-types.ts +178 -0
  167. package/src/old-ecs/action-ecs/index.ts +29 -0
  168. package/{service/sequential-action.js → src/old-ecs/action-ecs/sequential-action.ts} +19 -4
  169. package/src/old-ecs/core-ecs/core-ecs-serialization.test.ts +244 -0
  170. package/src/old-ecs/core-ecs/core-ecs-types.ts +183 -0
  171. package/src/old-ecs/core-ecs/core-ecs.test.ts +474 -0
  172. package/src/old-ecs/core-ecs/core-ecs.ts +640 -0
  173. package/{core/functions/index.js → src/old-ecs/core-ecs/index.ts} +9 -4
  174. package/src/old-ecs/ecs/ecs-types.ts +189 -0
  175. package/src/old-ecs/ecs/ecs-where-functions.ts +95 -0
  176. package/src/old-ecs/ecs/ecs.test.ts +461 -0
  177. package/src/old-ecs/ecs/ecs.ts +279 -0
  178. package/{ecs/core-ecs/core-ecs-types.js → src/old-ecs/ecs/index.ts} +2 -2
  179. package/src/old-ecs/entity.ts +26 -0
  180. package/{ecs/index.js → src/old-ecs/index.ts} +1 -1
  181. package/{ecs/transaction-ecs/index.js → src/old-ecs/transaction-ecs/index.ts} +0 -1
  182. package/src/old-ecs/transaction-ecs/transaction-ecs.test.ts +725 -0
  183. package/src/old-ecs/transaction-ecs/transaction-ecs.ts +283 -0
  184. package/src/old-ecs/transaction-ecs/transaction-types.ts +248 -0
  185. package/src/old-ecs/transaction-ecs/transactions.ts +243 -0
  186. package/src/perftest/ecs-perf.ts +255 -0
  187. package/src/perftest/helper-functions.ts +31 -0
  188. package/src/perftest/horizon-perf.ts +132 -0
  189. package/{perftest/index.js → src/perftest/index.ts} +9 -7
  190. package/src/perftest/perf-test.ts +193 -0
  191. package/src/perftest/perf.md +90 -0
  192. package/src/perftest/vanilla-perf.ts +136 -0
  193. package/src/schema/boolean.ts +5 -0
  194. package/src/schema/dynamic/deep-merge.test.ts +100 -0
  195. package/src/schema/dynamic/deep-merge.ts +67 -0
  196. package/{core/schema/dynamic/enumerate-patches.test.js → src/schema/dynamic/enumerate-patches.test.ts} +49 -23
  197. package/{core/schema/dynamic/enumerate-patches.js → src/schema/dynamic/enumerate-patches.ts} +44 -4
  198. package/{core/schema/dynamic/get-dynamic-schema.test.js → src/schema/dynamic/get-dynamic-schema.test.ts} +41 -6
  199. package/src/schema/dynamic/get-dynamic-schema.ts +48 -0
  200. package/src/schema/dynamic/index.ts +22 -0
  201. package/src/schema/f32.ts +30 -0
  202. package/src/schema/i32.ts +31 -0
  203. package/src/schema/index.ts +32 -0
  204. package/{cache/functions/omit.js → src/schema/nullable.ts} +10 -7
  205. package/src/schema/schema.ts +229 -0
  206. package/src/schema/time.ts +5 -0
  207. package/src/schema/true.ts +26 -0
  208. package/src/schema/tuple.ts +5 -0
  209. package/src/schema/u32.ts +31 -0
  210. package/{core/schema/validation/is-valid.test.js → src/schema/validation/is-valid.test.ts} +6 -3
  211. package/{core/functions/array-equals.js → src/schema/validation/is-valid.ts} +8 -10
  212. package/{core/schema/validation/validate.test.js → src/schema/validation/validate.test.ts} +18 -4
  213. package/{core/schema/validation/validate.js → src/schema/validation/validate.ts} +9 -6
  214. package/{core/functions/with-validation.test.js → src/schema/validation/with-validation.test.ts} +28 -12
  215. package/{core/functions/with-validation.js → src/schema/validation/with-validation.ts} +14 -10
  216. package/src/schema.test.ts +55 -0
  217. package/src/service/add-observable-actions.ts +207 -0
  218. package/{service/index.js → src/service/index.ts} +4 -4
  219. package/src/service/is-service.ts +7 -0
  220. package/src/service/progressive-result.ts +141 -0
  221. package/src/service/service.ts +27 -0
  222. package/src/table/add-row.ts +42 -0
  223. package/src/table/create-table.ts +36 -0
  224. package/src/table/delete-row.ts +42 -0
  225. package/src/table/ensure-capacity.ts +37 -0
  226. package/src/table/get-row-data.ts +31 -0
  227. package/src/table/index.ts +29 -0
  228. package/src/table/row-index.ts +26 -0
  229. package/src/table/table.ts +32 -0
  230. package/src/table/update-row.ts +35 -0
  231. package/src/tsconfig.json +6 -0
  232. package/src/typed-buffer/copy-to-gpu-buffer.ts +23 -0
  233. package/{cache/expiring-data-cache.js → src/typed-buffer/create-array-buffer.ts} +31 -25
  234. package/src/typed-buffer/create-number-buffer.ts +90 -0
  235. package/src/typed-buffer/create-struct-buffer.ts +93 -0
  236. package/src/typed-buffer/create-typed-buffer.ts +49 -0
  237. package/src/typed-buffer/index.ts +26 -0
  238. package/src/typed-buffer/structs/assert-struct.ts +37 -0
  239. package/src/typed-buffer/structs/create-read-struct.test.ts +202 -0
  240. package/src/typed-buffer/structs/create-read-struct.ts +77 -0
  241. package/src/typed-buffer/structs/create-write-struct.ts +73 -0
  242. package/src/typed-buffer/structs/get-field-offset.ts +36 -0
  243. package/src/typed-buffer/structs/get-struct-layout.test.ts +146 -0
  244. package/src/typed-buffer/structs/get-struct-layout.ts +222 -0
  245. package/src/typed-buffer/structs/index.ts +22 -0
  246. package/src/typed-buffer/structs/read-struct.ts +25 -0
  247. package/src/typed-buffer/structs/struct-layout.ts +465 -0
  248. package/src/typed-buffer/structs/write-struct.test.ts +195 -0
  249. package/src/typed-buffer/structs/write-struct.ts +25 -0
  250. package/src/typed-buffer/typed-buffer.test.ts +253 -0
  251. package/src/typed-buffer/typed-buffer.ts +41 -0
  252. package/src/types/assert.ts +22 -0
  253. package/src/types/equal.ts +24 -0
  254. package/{types/index.js → src/types/index.ts} +3 -1
  255. package/src/types/types.ts +166 -0
  256. package/tsconfig-base.json +25 -0
  257. package/tsconfig.json +8 -0
  258. package/typedoc.json +22 -0
  259. package/vite.config.js +16 -0
  260. package/assembly/index.d.ts +0 -30
  261. package/assembly/index.js +0 -18
  262. package/assembly/index.wasm +0 -0
  263. package/assembly/index.wasm.map +0 -1
  264. package/assembly-test/assembly.test.d.ts +0 -1
  265. package/assembly-test/assembly.test.js.map +0 -1
  266. package/cache/async-cache.d.ts +0 -15
  267. package/cache/async-cache.js.map +0 -1
  268. package/cache/blob-store.d.ts +0 -94
  269. package/cache/blob-store.js +0 -191
  270. package/cache/blob-store.js.map +0 -1
  271. package/cache/blob-store.test.d.ts +0 -1
  272. package/cache/blob-store.test.js.map +0 -1
  273. package/cache/data-cache.d.ts +0 -38
  274. package/cache/data-cache.js +0 -96
  275. package/cache/data-cache.js.map +0 -1
  276. package/cache/data-cache.test.d.ts +0 -1
  277. package/cache/data-cache.test.js +0 -50
  278. package/cache/data-cache.test.js.map +0 -1
  279. package/cache/expiring-data-cache.d.ts +0 -6
  280. package/cache/expiring-data-cache.js.map +0 -1
  281. package/cache/expiring-data-cache.test.d.ts +0 -1
  282. package/cache/expiring-data-cache.test.js +0 -62
  283. package/cache/expiring-data-cache.test.js.map +0 -1
  284. package/cache/fallback-async-cache.d.ts +0 -7
  285. package/cache/fallback-async-cache.js +0 -22
  286. package/cache/fallback-async-cache.js.map +0 -1
  287. package/cache/functions/bind-functions.d.ts +0 -6
  288. package/cache/functions/bind-functions.js.map +0 -1
  289. package/cache/functions/functions.test.d.ts +0 -1
  290. package/cache/functions/functions.test.js +0 -79
  291. package/cache/functions/functions.test.js.map +0 -1
  292. package/cache/functions/get-cached.d.ts +0 -11
  293. package/cache/functions/get-cached.js.map +0 -1
  294. package/cache/functions/get-cached.test.d.ts +0 -1
  295. package/cache/functions/get-cached.test.js.map +0 -1
  296. package/cache/functions/hashing/blob-to-hash.d.ts +0 -4
  297. package/cache/functions/hashing/blob-to-hash.js.map +0 -1
  298. package/cache/functions/hashing/buffer-to-hash.d.ts +0 -4
  299. package/cache/functions/hashing/buffer-to-hash.js.map +0 -1
  300. package/cache/functions/hashing/hashing.test.d.ts +0 -1
  301. package/cache/functions/hashing/hashing.test.js +0 -95
  302. package/cache/functions/hashing/hashing.test.js.map +0 -1
  303. package/cache/functions/hashing/index.d.ts +0 -4
  304. package/cache/functions/hashing/index.js.map +0 -1
  305. package/cache/functions/hashing/json-to-hash.d.ts +0 -4
  306. package/cache/functions/hashing/json-to-hash.js.map +0 -1
  307. package/cache/functions/hashing/string-to-hash.d.ts +0 -4
  308. package/cache/functions/hashing/string-to-hash.js.map +0 -1
  309. package/cache/functions/index.d.ts +0 -5
  310. package/cache/functions/index.js.map +0 -1
  311. package/cache/functions/memoize.d.ts +0 -12
  312. package/cache/functions/memoize.js.map +0 -1
  313. package/cache/functions/omit.d.ts +0 -1
  314. package/cache/functions/omit.js.map +0 -1
  315. package/cache/functions/prevent-parallel-execution.d.ts +0 -7
  316. package/cache/functions/prevent-parallel-execution.js +0 -25
  317. package/cache/functions/prevent-parallel-execution.js.map +0 -1
  318. package/cache/functions/types.d.ts +0 -1
  319. package/cache/functions/types.js.map +0 -1
  320. package/cache/get-persistent-cache.d.ts +0 -12
  321. package/cache/get-persistent-cache.js +0 -23
  322. package/cache/get-persistent-cache.js.map +0 -1
  323. package/cache/index.d.ts +0 -3
  324. package/cache/index.js.map +0 -1
  325. package/cache/managed-array.d.ts +0 -23
  326. package/cache/managed-array.js +0 -160
  327. package/cache/managed-array.js.map +0 -1
  328. package/cache/managed-async-cache.browser.test.d.ts +0 -1
  329. package/cache/managed-async-cache.browser.test.js.map +0 -1
  330. package/cache/managed-async-cache.d.ts +0 -4
  331. package/cache/managed-async-cache.js +0 -45
  332. package/cache/managed-async-cache.js.map +0 -1
  333. package/cache/memory-allocator.d.ts +0 -23
  334. package/cache/memory-allocator.js +0 -94
  335. package/cache/memory-allocator.js.map +0 -1
  336. package/cache/memory-async-cache.d.ts +0 -6
  337. package/cache/memory-async-cache.js +0 -23
  338. package/cache/memory-async-cache.js.map +0 -1
  339. package/core/data.d.ts +0 -22
  340. package/core/data.js.map +0 -1
  341. package/core/data.test.d.ts +0 -1
  342. package/core/data.test.js.map +0 -1
  343. package/core/functions/array-equals.d.ts +0 -1
  344. package/core/functions/array-equals.js.map +0 -1
  345. package/core/functions/deep-merge.d.ts +0 -32
  346. package/core/functions/deep-merge.js +0 -54
  347. package/core/functions/deep-merge.js.map +0 -1
  348. package/core/functions/deep-merge.test.d.ts +0 -1
  349. package/core/functions/deep-merge.test.js +0 -94
  350. package/core/functions/deep-merge.test.js.map +0 -1
  351. package/core/functions/index.d.ts +0 -3
  352. package/core/functions/index.js.map +0 -1
  353. package/core/functions/is-async-generator.d.ts +0 -1
  354. package/core/functions/is-async-generator.js.map +0 -1
  355. package/core/functions/is-promise.d.ts +0 -1
  356. package/core/functions/is-promise.js.map +0 -1
  357. package/core/functions/with-validation.d.ts +0 -5
  358. package/core/functions/with-validation.js.map +0 -1
  359. package/core/functions/with-validation.test.d.ts +0 -1
  360. package/core/functions/with-validation.test.js.map +0 -1
  361. package/core/index.d.ts +0 -3
  362. package/core/index.js.map +0 -1
  363. package/core/schema/dynamic/dynamic-schema.d.ts +0 -27
  364. package/core/schema/dynamic/dynamic-schema.js +0 -2
  365. package/core/schema/dynamic/dynamic-schema.js.map +0 -1
  366. package/core/schema/dynamic/enumerate-patches.d.ts +0 -9
  367. package/core/schema/dynamic/enumerate-patches.js.map +0 -1
  368. package/core/schema/dynamic/enumerate-patches.test.d.ts +0 -134
  369. package/core/schema/dynamic/enumerate-patches.test.js.map +0 -1
  370. package/core/schema/dynamic/get-dynamic-schema.d.ts +0 -5
  371. package/core/schema/dynamic/get-dynamic-schema.js +0 -26
  372. package/core/schema/dynamic/get-dynamic-schema.js.map +0 -1
  373. package/core/schema/dynamic/get-dynamic-schema.test.d.ts +0 -1
  374. package/core/schema/dynamic/get-dynamic-schema.test.js.map +0 -1
  375. package/core/schema/dynamic/index.d.ts +0 -1
  376. package/core/schema/dynamic/index.js +0 -2
  377. package/core/schema/dynamic/index.js.map +0 -1
  378. package/core/schema/dynamic/schema-path-value-path.d.ts +0 -5
  379. package/core/schema/dynamic/schema-path-value-path.js +0 -12
  380. package/core/schema/dynamic/schema-path-value-path.js.map +0 -1
  381. package/core/schema/dynamic-schema.d.ts +0 -27
  382. package/core/schema/dynamic-schema.js +0 -2
  383. package/core/schema/dynamic-schema.js.map +0 -1
  384. package/core/schema/index.d.ts +0 -4
  385. package/core/schema/index.js +0 -26
  386. package/core/schema/index.js.map +0 -1
  387. package/core/schema/schema.d.ts +0 -122
  388. package/core/schema/schema.js.map +0 -1
  389. package/core/schema/schemas.d.ts +0 -45
  390. package/core/schema/schemas.js +0 -39
  391. package/core/schema/schemas.js.map +0 -1
  392. package/core/schema/ui-schema.d.ts +0 -25
  393. package/core/schema/ui-schema.js +0 -2
  394. package/core/schema/ui-schema.js.map +0 -1
  395. package/core/schema/validation/is-valid.d.ts +0 -2
  396. package/core/schema/validation/is-valid.js +0 -14
  397. package/core/schema/validation/is-valid.js.map +0 -1
  398. package/core/schema/validation/is-valid.test.d.ts +0 -1
  399. package/core/schema/validation/is-valid.test.js.map +0 -1
  400. package/core/schema/validation/validate.d.ts +0 -2
  401. package/core/schema/validation/validate.js.map +0 -1
  402. package/core/schema/validation/validate.test.d.ts +0 -1
  403. package/core/schema/validation/validate.test.js.map +0 -1
  404. package/core/schema/validation/with-validation.d.ts +0 -5
  405. package/core/schema/validation/with-validation.js +0 -16
  406. package/core/schema/validation/with-validation.js.map +0 -1
  407. package/core/schema/validation/with-validation.test.d.ts +0 -1
  408. package/core/schema/validation/with-validation.test.js +0 -96
  409. package/core/schema/validation/with-validation.test.js.map +0 -1
  410. package/core/schema.d.ts +0 -86
  411. package/core/schema.js.map +0 -1
  412. package/core/schema.test.d.ts +0 -1
  413. package/core/schema.test.js +0 -16
  414. package/core/schema.test.js.map +0 -1
  415. package/core/schemas.d.ts +0 -45
  416. package/core/schemas.js +0 -39
  417. package/core/schemas.js.map +0 -1
  418. package/ecs/action-ecs/action-ecs.d.ts +0 -19
  419. package/ecs/action-ecs/action-ecs.js +0 -203
  420. package/ecs/action-ecs/action-ecs.js.map +0 -1
  421. package/ecs/action-ecs/action-ecs.test.d.ts +0 -1
  422. package/ecs/action-ecs/action-ecs.test.js +0 -362
  423. package/ecs/action-ecs/action-ecs.test.js.map +0 -1
  424. package/ecs/action-ecs/action-types.d.ts +0 -106
  425. package/ecs/action-ecs/action-types.js +0 -19
  426. package/ecs/action-ecs/action-types.js.map +0 -1
  427. package/ecs/action-ecs/index.d.ts +0 -2
  428. package/ecs/action-ecs/index.js.map +0 -1
  429. package/ecs/core-ecs/core-ecs-serialization.test.d.ts +0 -1
  430. package/ecs/core-ecs/core-ecs-serialization.test.js +0 -230
  431. package/ecs/core-ecs/core-ecs-serialization.test.js.map +0 -1
  432. package/ecs/core-ecs/core-ecs-types.d.ts +0 -141
  433. package/ecs/core-ecs/core-ecs-types.js.map +0 -1
  434. package/ecs/core-ecs/core-ecs.d.ts +0 -7
  435. package/ecs/core-ecs/core-ecs.js +0 -492
  436. package/ecs/core-ecs/core-ecs.js.map +0 -1
  437. package/ecs/core-ecs/core-ecs.test.d.ts +0 -1
  438. package/ecs/core-ecs/core-ecs.test.js +0 -425
  439. package/ecs/core-ecs/core-ecs.test.js.map +0 -1
  440. package/ecs/core-ecs/index.d.ts +0 -1
  441. package/ecs/core-ecs/index.js +0 -2
  442. package/ecs/core-ecs/index.js.map +0 -1
  443. package/ecs/ecs/ecs-types.d.ts +0 -132
  444. package/ecs/ecs/ecs-types.js.map +0 -1
  445. package/ecs/ecs/ecs-where-functions.d.ts +0 -6
  446. package/ecs/ecs/ecs-where-functions.js +0 -91
  447. package/ecs/ecs/ecs-where-functions.js.map +0 -1
  448. package/ecs/ecs/ecs.d.ts +0 -13
  449. package/ecs/ecs/ecs.js +0 -177
  450. package/ecs/ecs/ecs.js.map +0 -1
  451. package/ecs/ecs/ecs.test.d.ts +0 -1
  452. package/ecs/ecs/ecs.test.js +0 -399
  453. package/ecs/ecs/ecs.test.js.map +0 -1
  454. package/ecs/ecs/index.d.ts +0 -3
  455. package/ecs/ecs/index.js +0 -3
  456. package/ecs/ecs/index.js.map +0 -1
  457. package/ecs/index.d.ts +0 -4
  458. package/ecs/index.js.map +0 -1
  459. package/ecs/transaction-ecs/index.d.ts +0 -2
  460. package/ecs/transaction-ecs/index.js.map +0 -1
  461. package/ecs/transaction-ecs/transaction-ecs.d.ts +0 -11
  462. package/ecs/transaction-ecs/transaction-ecs.js +0 -184
  463. package/ecs/transaction-ecs/transaction-ecs.js.map +0 -1
  464. package/ecs/transaction-ecs/transaction-ecs.test.d.ts +0 -1
  465. package/ecs/transaction-ecs/transaction-ecs.test.js +0 -599
  466. package/ecs/transaction-ecs/transaction-ecs.test.js.map +0 -1
  467. package/ecs/transaction-ecs/transaction-types.d.ts +0 -135
  468. package/ecs/transaction-ecs/transaction-types.js +0 -2
  469. package/ecs/transaction-ecs/transaction-types.js.map +0 -1
  470. package/ecs/transaction-ecs/transactions.d.ts +0 -5
  471. package/ecs/transaction-ecs/transactions.js +0 -158
  472. package/ecs/transaction-ecs/transactions.js.map +0 -1
  473. package/index.d.ts +0 -1
  474. package/index.js +0 -23
  475. package/index.js.map +0 -1
  476. package/observe/create-observable-event.d.ts +0 -10
  477. package/observe/create-observable-event.js +0 -22
  478. package/observe/create-observable-event.js.map +0 -1
  479. package/observe/create-observable-state.d.ts +0 -7
  480. package/observe/create-observable-state.js +0 -27
  481. package/observe/create-observable-state.js.map +0 -1
  482. package/observe/create-persisted-state.d.ts +0 -11
  483. package/observe/create-persisted-state.js +0 -31
  484. package/observe/create-persisted-state.js.map +0 -1
  485. package/observe/create-persisted-state.test.d.ts +0 -1
  486. package/observe/create-persisted-state.test.js +0 -124
  487. package/observe/create-persisted-state.test.js.map +0 -1
  488. package/observe/from-array.d.ts +0 -5
  489. package/observe/from-array.js.map +0 -1
  490. package/observe/from-constant.d.ts +0 -5
  491. package/observe/from-constant.js +0 -12
  492. package/observe/from-constant.js.map +0 -1
  493. package/observe/from-element-id.d.ts +0 -7
  494. package/observe/from-element-id.js.map +0 -1
  495. package/observe/from-element-properties-and-events.d.ts +0 -2
  496. package/observe/from-element-properties-and-events.js +0 -18
  497. package/observe/from-element-properties-and-events.js.map +0 -1
  498. package/observe/from-element-property.d.ts +0 -11
  499. package/observe/from-element-property.js.map +0 -1
  500. package/observe/from-promise-with-error.d.ts +0 -7
  501. package/observe/from-promise-with-error.js +0 -27
  502. package/observe/from-promise-with-error.js.map +0 -1
  503. package/observe/from-promise.d.ts +0 -6
  504. package/observe/from-promise.js +0 -22
  505. package/observe/from-promise.js.map +0 -1
  506. package/observe/from-properties.d.ts +0 -10
  507. package/observe/from-properties.js +0 -33
  508. package/observe/from-properties.js.map +0 -1
  509. package/observe/index.d.ts +0 -27
  510. package/observe/index.js.map +0 -1
  511. package/observe/observe.test.d.ts +0 -7
  512. package/observe/observe.test.js +0 -417
  513. package/observe/observe.test.js.map +0 -1
  514. package/observe/to-promise.d.ts +0 -8
  515. package/observe/to-promise.js +0 -18
  516. package/observe/to-promise.js.map +0 -1
  517. package/observe/to-properties.d.ts +0 -11
  518. package/observe/to-properties.js +0 -9
  519. package/observe/to-properties.js.map +0 -1
  520. package/observe/types.d.ts +0 -17
  521. package/observe/types.js +0 -2
  522. package/observe/types.js.map +0 -1
  523. package/observe/with-async-map.d.ts +0 -6
  524. package/observe/with-async-map.js +0 -12
  525. package/observe/with-async-map.js.map +0 -1
  526. package/observe/with-cache.d.ts +0 -6
  527. package/observe/with-cache.js +0 -33
  528. package/observe/with-cache.js.map +0 -1
  529. package/observe/with-copy.d.ts +0 -5
  530. package/observe/with-copy.js +0 -10
  531. package/observe/with-copy.js.map +0 -1
  532. package/observe/with-deduplicate-data.d.ts +0 -7
  533. package/observe/with-deduplicate-data.js +0 -18
  534. package/observe/with-deduplicate-data.js.map +0 -1
  535. package/observe/with-deduplicate.d.ts +0 -6
  536. package/observe/with-deduplicate.js +0 -19
  537. package/observe/with-deduplicate.js.map +0 -1
  538. package/observe/with-default.d.ts +0 -6
  539. package/observe/with-default.js +0 -21
  540. package/observe/with-default.js.map +0 -1
  541. package/observe/with-map-data.d.ts +0 -7
  542. package/observe/with-map-data.js.map +0 -1
  543. package/observe/with-map.d.ts +0 -5
  544. package/observe/with-map.js +0 -11
  545. package/observe/with-map.js.map +0 -1
  546. package/observe/with-optional.d.ts +0 -5
  547. package/observe/with-optional.js +0 -20
  548. package/observe/with-optional.js.map +0 -1
  549. package/observe/with-unwrap.d.ts +0 -5
  550. package/observe/with-unwrap.js +0 -26
  551. package/observe/with-unwrap.js.map +0 -1
  552. package/perftest/ecs-perf.d.ts +0 -49
  553. package/perftest/ecs-perf.js +0 -230
  554. package/perftest/ecs-perf.js.map +0 -1
  555. package/perftest/helper-functions.d.ts +0 -1
  556. package/perftest/helper-functions.js +0 -31
  557. package/perftest/helper-functions.js.map +0 -1
  558. package/perftest/horizon-perf.d.ts +0 -22
  559. package/perftest/horizon-perf.js +0 -126
  560. package/perftest/horizon-perf.js.map +0 -1
  561. package/perftest/index.d.ts +0 -1
  562. package/perftest/index.js.map +0 -1
  563. package/perftest/perf-test.d.ts +0 -18
  564. package/perftest/perf-test.js +0 -124
  565. package/perftest/perf-test.js.map +0 -1
  566. package/perftest/vanilla-perf.d.ts +0 -38
  567. package/perftest/vanilla-perf.js +0 -128
  568. package/perftest/vanilla-perf.js.map +0 -1
  569. package/schemas/index.d.ts +0 -1
  570. package/schemas/index.js +0 -23
  571. package/schemas/index.js.map +0 -1
  572. package/schemas/schemas.d.ts +0 -45
  573. package/schemas/schemas.js +0 -39
  574. package/schemas/schemas.js.map +0 -1
  575. package/service/add-observable-actions.d.ts +0 -29
  576. package/service/add-observable-actions.js +0 -108
  577. package/service/add-observable-actions.js.map +0 -1
  578. package/service/index.d.ts +0 -4
  579. package/service/index.js.map +0 -1
  580. package/service/progressive-result.d.ts +0 -96
  581. package/service/progressive-result.js +0 -99
  582. package/service/progressive-result.js.map +0 -1
  583. package/service/sequential-action.d.ts +0 -18
  584. package/service/sequential-action.js.map +0 -1
  585. package/service/service.d.ts +0 -4
  586. package/service/service.js.map +0 -1
  587. package/tsconfig.tsbuildinfo +0 -1
  588. package/types/index.d.ts +0 -1
  589. package/types/index.js.map +0 -1
  590. package/types/types.d.ts +0 -61
  591. package/types/types.js.map +0 -1
@@ -0,0 +1,229 @@
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
+ import { DeepReadonly, EquivalentTypes, True } from "../types/types.js";
24
+
25
+ type JSONPath = string;
26
+ type JSONMergePatch = unknown;
27
+
28
+ /**
29
+ * Conditional patch applied to the path when the enclosing schema branch is active
30
+ * and `match` is not present or validates against the root.
31
+ * This is used for dynamic schemas which change in response to the value of the data.
32
+ */
33
+ export type Conditional = {
34
+ match?: Schema;
35
+ // // root-anchored JSONPath
36
+ path: JSONPath;
37
+ // // JSON-Merge-Patch fragment
38
+ value: JSONMergePatch;
39
+ }
40
+
41
+ export interface UIProperties {
42
+ name?: string;
43
+ icon?: string; // url? or icon name?
44
+ summary?: string;
45
+ premium?: boolean;
46
+ placeholder?: string;
47
+ details?: string;
48
+ visible?: boolean;
49
+ enabled?: boolean;
50
+ infoUrl?: string;
51
+ group?: string;
52
+ order?: number;
53
+ groups?: {
54
+ readonly [key: string]: UIProperties;
55
+ };
56
+ }
57
+
58
+ export interface Schema {
59
+ type?: 'number' | 'integer' | 'string' | 'boolean' | 'null' | 'array' | 'object';
60
+ conditionals?: readonly Conditional[];
61
+ ui?: UIProperties;
62
+ default?: any;
63
+ precision?: 1 | 2;
64
+ multipleOf?: number;
65
+ mediaType?: string; // media type such as image/jpeg, image/png, video/* etc.
66
+ minimum?: number;
67
+ maximum?: number;
68
+ minLength?: number;
69
+ maxLength?: number;
70
+ exclusiveMinimum?: number;
71
+ exclusiveMaximum?: number;
72
+ pattern?: string;
73
+ minItems?: number;
74
+ maxItems?: number;
75
+ items?: Schema;
76
+ properties?: { readonly [key: string]: Schema };
77
+ required?: readonly string[];
78
+ additionalProperties?: boolean | Schema;
79
+ oneOf?: readonly Schema[];
80
+ const?: any;
81
+ enum?: readonly any[];
82
+ }
83
+
84
+ export type FromSchema<T, Depth extends number = 5> = DeepReadonly<Depth extends 0
85
+ ? any
86
+ : T extends { const: infer Const }
87
+ ? Const
88
+ : T extends { enum: infer Enum }
89
+ ? Enum extends ReadonlyArray<any> ? Enum[number] : never
90
+ : T extends { oneOf: infer Schemas }
91
+ ? Schemas extends ReadonlyArray<Schema> ? FromOneOfSchema<Schemas, Decrement<Depth>> : never
92
+ : T extends { type: 'number' | 'integer' }
93
+ ? number
94
+ : T extends { type: 'string' }
95
+ ? string
96
+ : T extends { type: 'boolean' }
97
+ ? boolean
98
+ : T extends { type: 'null' }
99
+ ? null
100
+ : T extends { type: 'array' } | { items: any }
101
+ ? FromSchemaArray<T, Decrement<Depth>>
102
+ : T extends { type: 'object' } | { properties: any }
103
+ ? FromSchemaObject<T, Decrement<Depth>>
104
+ : any
105
+ >;
106
+
107
+ type Decrement<N extends number> = ((...x: any[]) => void) extends (
108
+ arg: any,
109
+ ...rest: infer R
110
+ ) => void
111
+ ? R['length']
112
+ : never;
113
+
114
+ type FromSchemaArray<T, Depth extends number> = T extends {
115
+ items: infer Items;
116
+ }
117
+ ? T extends { minItems: infer Min; maxItems: infer Max }
118
+ ? Equal<Min, Max> extends true
119
+ ? BuildTuple<FromSchema<Items, Depth>, Min>
120
+ : FromSchema<Items, Depth>[]
121
+ : FromSchema<Items, Depth>[]
122
+ : any[];
123
+
124
+ type BuildTuple<T, N, R extends unknown[] = []> = R['length'] extends N
125
+ ? R
126
+ : BuildTuple<T, N, [...R, T]>;
127
+
128
+ // Handle up to 16 elements
129
+ type BuildTupleHelper<T, N> = N extends number ? BuildTuple<T, N> : T[];
130
+
131
+ type FromSchemaObject<T extends Schema, Depth extends number> = T extends {
132
+ properties: infer P;
133
+ }
134
+ ? Simplify<
135
+ {
136
+ [K in RequiredKeys<T>]: FromSchema<P[K], Depth>;
137
+ } & {
138
+ [K in OptionalKeys<T>]?: FromSchema<P[K], Depth>;
139
+ } & (T extends { additionalProperties: infer AP }
140
+ ? AP extends false
141
+ ? {}
142
+ : AP extends Schema
143
+ ? { [key: string]: FromSchema<AP, Depth> }
144
+ : { [key: string]: any }
145
+ : { [key: string]: any })
146
+ >
147
+ : T extends { additionalProperties: infer AP }
148
+ ? AP extends Schema
149
+ ? { [key: string]: FromSchema<AP, Depth> }
150
+ : { [key: string]: any }
151
+ : { [key: string]: any };
152
+
153
+ type RequiredKeys<T> = T extends { required: infer R }
154
+ ? R extends readonly (infer K)[]
155
+ ? K extends string
156
+ ? K
157
+ : never
158
+ : never
159
+ : never;
160
+
161
+ type OptionalKeys<T> = T extends { properties: infer P }
162
+ ? Exclude<keyof P, RequiredKeys<T>>
163
+ : never;
164
+
165
+ type Equal<A, B> = (<T>() => T extends A ? 1 : 2) extends <
166
+ T
167
+ >() => T extends B ? 1 : 2
168
+ ? true
169
+ : false;
170
+
171
+ type Simplify<T> = T extends infer O ? { [K in keyof O]: O[K] } : never;
172
+
173
+ type FromOneOfSchema<Schemas extends ReadonlyArray<Schema>, Depth extends number> = Schemas[number] extends infer S
174
+ ? S extends Schema
175
+ ? FromSchema<S, Depth>
176
+ : never
177
+ : never;
178
+
179
+ // type check tests
180
+
181
+ type Test1 = FromSchema<{ type: 'number' }>; // number
182
+ type CheckNumber = True<EquivalentTypes<Test1, number>>;
183
+
184
+ type Test2 = FromSchema<{
185
+ properties: {
186
+ a: { type: 'number' };
187
+ b: { type: 'string' };
188
+ };
189
+ required: ['a'];
190
+ additionalProperties: false;
191
+ }>; // { a: number; b?: string }
192
+ type CheckObject = True<EquivalentTypes<Test2, { a: number; b?: string }>>;
193
+
194
+ type Test3 = FromSchema<{
195
+ type: 'array';
196
+ items: { type: 'number' };
197
+ minItems: 3;
198
+ maxItems: 3;
199
+ }>; // [number, number, number]
200
+ type CheckTuple = True<EquivalentTypes<Test3, readonly [number, number, number]>>;
201
+
202
+ type TestConst = FromSchema<{ const: 42 }>; // 42
203
+ type CheckConst = True<EquivalentTypes<TestConst, 42>>;
204
+
205
+ type TestEnum = FromSchema<{ enum: [1, 2, 3] }>; // 1 | 2 | 3
206
+ type CheckEnum = True<EquivalentTypes<TestEnum, 1 | 2 | 3>>;
207
+
208
+ type TestStringEnum = FromSchema<{ enum: ['a', 'b', 'c'] }>; // 'a' | 'b' | 'c'
209
+ type CheckStringEnum = True<EquivalentTypes<TestStringEnum, 'a' | 'b' | 'c'>>;
210
+
211
+ const mySchema = {
212
+ type: 'object',
213
+ properties: {
214
+ a: { type: 'number' },
215
+ b: { type: 'string' },
216
+ c: { enum: [1, 2, 3] }
217
+ },
218
+ required: ['a', 'c'],
219
+ additionalProperties: false,
220
+ } as const satisfies Schema;
221
+
222
+ type MyType = FromSchema<typeof mySchema>;
223
+ type CheckMyType = True<EquivalentTypes<MyType, { a: number; b?: string; c: 1 | 2 | 3 }>>;
224
+
225
+ type TestAdditionalProps = FromSchema<{
226
+ type: 'object';
227
+ additionalProperties: { type: 'number' }
228
+ }>; // { [key: string]: number }
229
+ type CheckTestAdditionalProps = True<EquivalentTypes<TestAdditionalProps, { readonly [x: string]: number; }>>;
@@ -0,0 +1,5 @@
1
+ import { F32Schema } from "./f32.js";
2
+ import { FromSchema } from "./schema.js";
3
+
4
+ export const TimeSchema = F32Schema;
5
+ export type Time = FromSchema<typeof TimeSchema>;
@@ -0,0 +1,26 @@
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 { Schema } from "./schema.js";
23
+
24
+ export const TrueSchema = { type: "boolean", const: true, default: true } as const satisfies Schema;
25
+
26
+ export type True = true;
@@ -0,0 +1,5 @@
1
+ import { Schema } from "./schema.js";
2
+
3
+ export function Tuple<T extends Schema, N extends number>(items: T, length: N) {
4
+ return { type: "array", items, minItems: length, maxItems: length } as const satisfies Schema;
5
+ }
@@ -0,0 +1,31 @@
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 type { Schema } from "./schema.js";
23
+
24
+ export const U32Schema = {
25
+ type: 'integer',
26
+ minimum: 0,
27
+ maximum: 4294967295,
28
+ default: 0 as number,
29
+ } as const satisfies Schema;
30
+
31
+ export type U32 = number;
@@ -21,20 +21,23 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
21
  SOFTWARE.*/
22
22
  import { describe, it, expect } from 'vitest';
23
23
  import { isValid } from './is-valid.js';
24
+ import { Schema } from '../schema.js';
25
+
24
26
  describe('isValid', () => {
25
- const schema = {
27
+ const schema: Schema = {
26
28
  type: 'object',
27
29
  properties: {
28
30
  foo: { type: 'string' }
29
31
  },
30
32
  required: ['foo']
31
33
  };
34
+
32
35
  it('returns true for valid data', () => {
33
36
  expect(isValid(schema, { foo: 'bar' })).toBe(true);
34
37
  });
38
+
35
39
  it('returns false for invalid data', () => {
36
40
  expect(isValid(schema, { foo: 123 })).toBe(false);
37
41
  expect(isValid(schema, {})).toBe(false);
38
42
  });
39
- });
40
- //# sourceMappingURL=is-valid.test.js.map
43
+ });
@@ -19,16 +19,14 @@ 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
- export function arrayEquals(a, b) {
23
- const length = a.length;
24
- if (length !== b.length) {
22
+ import { Schema } from "../schema.js";
23
+ import { validate } from "./validate.js";
24
+
25
+ export function isValid(schema: Schema, data: any) {
26
+ try {
27
+ return validate(schema, data ?? null).length === 0;
28
+ } catch (error) {
29
+ console.error(`Error during validation:`, error);
25
30
  return false;
26
31
  }
27
- for (let i = 0; i < length; i++) {
28
- if (a[i] !== b[i]) {
29
- return false;
30
- }
31
- }
32
- return true;
33
32
  }
34
- //# sourceMappingURL=array-equals.js.map
@@ -21,8 +21,10 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
21
  SOFTWARE.*/
22
22
  import { describe, it, expect } from 'vitest';
23
23
  import { validate } from './validate.js';
24
+ import { Schema } from '../schema.js';
25
+
24
26
  describe('validate', () => {
25
- const userSchema = {
27
+ const userSchema: Schema = {
26
28
  type: 'object',
27
29
  properties: {
28
30
  name: { type: 'string' },
@@ -31,51 +33,62 @@ describe('validate', () => {
31
33
  },
32
34
  required: ['name', 'age', 'email']
33
35
  };
36
+
34
37
  it('should return empty array for valid data', () => {
35
38
  const validData = {
36
39
  name: 'John Doe',
37
40
  age: 30,
38
41
  email: 'john@example.com'
39
42
  };
43
+
40
44
  const errors = validate(userSchema, validData);
41
45
  expect(errors).toEqual([]);
42
46
  });
47
+
43
48
  it('should return validation errors for invalid data', () => {
44
49
  const invalidData = {
45
50
  name: 'John Doe',
46
51
  age: '30', // Should be a number
47
52
  email: 'not-an-email'
48
53
  };
54
+
49
55
  const errors = validate(userSchema, invalidData);
50
56
  expect(errors.length).toBeGreaterThan(0);
51
57
  expect(errors).toContain('Property "age" does not match schema.');
52
58
  expect(errors).toContain('Instance type "string" is invalid. Expected "number".');
53
59
  });
60
+
54
61
  it('should return errors for missing required fields', () => {
55
62
  const incompleteData = {
56
63
  name: 'John Doe'
57
64
  // Missing age and email
58
65
  };
66
+
59
67
  const errors = validate(userSchema, incompleteData);
60
68
  expect(errors.length).toBeGreaterThan(0);
61
69
  expect(errors).toContain('Instance does not have required property "age".');
62
70
  expect(errors).toContain('Instance does not have required property "email".');
63
71
  });
72
+
64
73
  it('should reuse validator instance for the same schema', () => {
65
74
  const data1 = { name: 'John', age: 30, email: 'john@example.com' };
66
75
  const data2 = { name: 'Jane', age: 25, email: 'jane@example.com' };
76
+
67
77
  // First validation
68
78
  const errors1 = validate(userSchema, data1);
69
79
  expect(errors1).toEqual([]);
80
+
70
81
  // Second validation with same schema
71
82
  const errors2 = validate(userSchema, data2);
72
83
  expect(errors2).toEqual([]);
84
+
73
85
  // The validator should be reused from the WeakMap cache
74
86
  // We can verify this by checking that the schema object is still the same reference
75
87
  expect(userSchema).toBe(userSchema);
76
88
  });
89
+
77
90
  it('should handle nested schema validation', () => {
78
- const nestedSchema = {
91
+ const nestedSchema: Schema = {
79
92
  type: 'object',
80
93
  properties: {
81
94
  user: userSchema,
@@ -89,6 +102,7 @@ describe('validate', () => {
89
102
  },
90
103
  required: ['user', 'metadata']
91
104
  };
105
+
92
106
  const validNestedData = {
93
107
  user: {
94
108
  name: 'John Doe',
@@ -99,8 +113,8 @@ describe('validate', () => {
99
113
  createdAt: '2024-03-20T12:00:00Z'
100
114
  }
101
115
  };
116
+
102
117
  const errors = validate(nestedSchema, validNestedData);
103
118
  expect(errors).toEqual([]);
104
119
  });
105
- });
106
- //# sourceMappingURL=validate.test.js.map
120
+ });
@@ -19,20 +19,23 @@ 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 { Validator } from '@cfworker/json-schema';
22
+ import { Validator, Schema as JsonSchema } from '@cfworker/json-schema';
23
+ import { Schema } from "../schema.js";
24
+
23
25
  // Cache of validators using WeakMap to avoid memory leaks
24
- const validatorCache = new WeakMap();
25
- export function validate(schema, data) {
26
+ const validatorCache = new WeakMap<Schema, Validator>();
27
+
28
+ export function validate(schema: Schema, data: any): string[] {
26
29
  // Get or create validator from cache
27
30
  let validator = validatorCache.get(schema);
28
31
  if (!validator) {
29
- validator = new Validator(schema);
32
+ validator = new Validator(schema as JsonSchema);
30
33
  validatorCache.set(schema, validator);
31
34
  }
35
+
32
36
  const result = validator.validate(data);
33
37
  if (result.valid) {
34
38
  return [];
35
39
  }
36
40
  return result.errors.map((error) => error.error);
37
- }
38
- //# sourceMappingURL=validate.js.map
41
+ }
@@ -21,6 +21,8 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
21
  SOFTWARE.*/
22
22
  import { describe, it, expect } from 'vitest';
23
23
  import { withValidation } from './with-validation.js';
24
+ import { FromSchema } from '../index.js';
25
+
24
26
  // Define a test schema
25
27
  const userSchema = {
26
28
  type: 'object',
@@ -31,45 +33,59 @@ const userSchema = {
31
33
  email: { type: 'string', format: 'email' }
32
34
  },
33
35
  required: ['name', 'age', 'email']
34
- };
36
+ } as const;
37
+
35
38
  describe('withValidation', () => {
36
39
  it('should pass validation for valid input', () => {
37
- const createUser = withValidation(userSchema)((user) => user);
40
+ const createUser = withValidation(userSchema)((user: FromSchema<typeof userSchema>) => user);
41
+
38
42
  const validUser = {
39
43
  name: 'John Doe',
40
44
  age: 30,
41
45
  email: 'john@example.com'
42
46
  };
47
+
43
48
  expect(() => createUser(validUser)).not.toThrow();
44
49
  expect(createUser(validUser)).toEqual(validUser);
45
50
  });
51
+
46
52
  it('should throw error for invalid input', () => {
47
- const createUser = withValidation(userSchema)((user) => user);
53
+ const createUser = withValidation(userSchema)((user: FromSchema<typeof userSchema>) => user);
54
+
48
55
  const invalidUser = {
49
56
  name: 'John Doe',
50
57
  age: '30', // Should be a number
51
58
  email: 'not-an-email'
52
59
  };
53
- expect(() => createUser(invalidUser)).toThrow(/Validation failed/);
60
+
61
+ expect(() => createUser(invalidUser as any)).toThrow(/Validation failed/);
54
62
  });
63
+
55
64
  it('should throw error for missing required fields', () => {
56
- const createUser = withValidation(userSchema)((user) => user);
65
+ const createUser = withValidation(userSchema)((user: FromSchema<typeof userSchema>) => user);
66
+
57
67
  const incompleteUser = {
58
68
  name: 'John Doe',
59
69
  // Missing age and email
60
70
  };
61
- expect(() => createUser(incompleteUser)).toThrow(/Validation failed/);
71
+
72
+ expect(() => createUser(incompleteUser as any)).toThrow(/Validation failed/);
62
73
  });
74
+
63
75
  it('should preserve function return type', () => {
64
- const processUser = withValidation(userSchema)((user) => ({
65
- ...user,
66
- processed: true
67
- }));
76
+ const processUser = withValidation(userSchema)(
77
+ (user: FromSchema<typeof userSchema>) => ({
78
+ ...user,
79
+ processed: true
80
+ })
81
+ );
82
+
68
83
  const result = processUser({
69
84
  name: 'John Doe',
70
85
  age: 30,
71
86
  email: 'john@example.com'
72
87
  });
88
+
73
89
  expect(result).toEqual({
74
90
  name: 'John Doe',
75
91
  age: 30,
@@ -77,9 +93,10 @@ describe('withValidation', () => {
77
93
  processed: true
78
94
  });
79
95
  });
96
+
80
97
  it("should pass 'this' context to the wrapped function", () => {
81
98
  const context = { value: 42 };
82
- const fn = function (user) {
99
+ const fn = function (this: typeof context, user: FromSchema<typeof userSchema>) {
83
100
  return this.value;
84
101
  };
85
102
  const wrapped = withValidation(userSchema)(fn);
@@ -93,4 +110,3 @@ describe('withValidation', () => {
93
110
  expect(result).toBe(42);
94
111
  });
95
112
  });
96
- //# sourceMappingURL=with-validation.test.js.map
@@ -19,20 +19,24 @@ 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 { Validator } from '@cfworker/json-schema';
22
+ import { Schema, FromSchema } from '../index.js';
23
+ import { validate } from './validate.js';
24
+
23
25
  /**
24
26
  * Creates a function which can wrap another function and validate the input against a JSON Schema.
25
27
  */
26
- export function withValidation(schema) {
27
- const validator = new Validator(schema);
28
- return function (fn) {
29
- return function (arg) {
30
- const validation = validator.validate(arg);
31
- if (!validation.valid) {
32
- throw new Error(`Validation failed: ${JSON.stringify(validation.errors)}`);
28
+ export function withValidation<T extends Schema>(schema: T) {
29
+ return function <F extends (arg: FromSchema<T>) => any>(fn: F): F {
30
+ return function (this: any, arg: FromSchema<T>) {
31
+ const errors = validate(schema, arg);
32
+
33
+ if (errors.length > 0) {
34
+ throw new Error(
35
+ `Validation failed: ${JSON.stringify(errors)}`
36
+ );
33
37
  }
38
+
34
39
  return fn.call(this, arg);
35
- };
40
+ } as F;
36
41
  };
37
42
  }
38
- //# sourceMappingURL=with-validation.js.map
@@ -0,0 +1,55 @@
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 { type FromSchema, type Schema } from "./schema/index.js";
23
+ import { type Extends, type False, type True } from "./types/types.js";
24
+ import { describe, it } from "vitest";
25
+
26
+ describe("Schema", () => {
27
+ it("should provide compile time and runtime type validation", () => {
28
+ const mySchema = {
29
+ type: "object",
30
+ required: ["name", "aspect"],
31
+ properties: {
32
+ name: { type: "string" },
33
+ age: { type: "integer", minimum: 0 },
34
+ aspect: { enum: ["landscape", "portrait"] },
35
+ },
36
+ additionalProperties: false,
37
+ } as const satisfies Schema;
38
+ type MyType = FromSchema<typeof mySchema>;
39
+
40
+ // compile time type checking.
41
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars -- compile time type check
42
+ type ShouldBeValid = True<
43
+ Extends<{ name: "foo"; aspect: "landscape" }, MyType>
44
+ >;
45
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars -- compile time type check
46
+ type WrongAspect = False<Extends<{ name: "foo"; aspect: "wrong" }, MyType>>;
47
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars -- compile time type check
48
+ type MissingAspect = False<Extends<{ name: "foo" }, MyType>>;
49
+
50
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars -- compile time type check
51
+ type ExtraPropertyCannotBeTypescriptTypeChecked = True<
52
+ Extends<{ name: "foo"; aspect: "landscape"; agewrong: 1 }, MyType>
53
+ >;
54
+ });
55
+ });