@adobe/data 0.7.3 → 0.7.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 (219) hide show
  1. package/dist/blob/download-handle.d.ts +4 -0
  2. package/dist/blob/download-handle.js +2 -0
  3. package/dist/blob/download-handle.js.map +1 -0
  4. package/dist/blob/upload-handle.d.ts +4 -0
  5. package/dist/blob/upload-handle.js +2 -0
  6. package/dist/blob/upload-handle.js.map +1 -0
  7. package/dist/ecs/database/create-database.test.js +130 -0
  8. package/dist/ecs/database/create-database.test.js.map +1 -1
  9. package/dist/ecs/database/database.d.ts +2 -1
  10. package/dist/ecs/database/index.d.ts +0 -1
  11. package/dist/ecs/database/index.js +0 -1
  12. package/dist/ecs/database/index.js.map +1 -1
  13. package/dist/ecs/database/observe-select-entities.d.ts +2 -2
  14. package/dist/ecs/database/observe-select-entities.js.map +1 -1
  15. package/dist/ecs/database/observed/create-observed-database.js +8 -0
  16. package/dist/ecs/database/observed/create-observed-database.js.map +1 -1
  17. package/dist/ecs/database/reconciling/create-reconciling-database.d.ts +8 -1
  18. package/dist/ecs/database/reconciling/create-reconciling-database.js +50 -19
  19. package/dist/ecs/database/reconciling/create-reconciling-database.js.map +1 -1
  20. package/dist/ecs/database/reconciling/create-reconciling-database.test.js +297 -0
  21. package/dist/ecs/database/reconciling/create-reconciling-database.test.js.map +1 -1
  22. package/dist/ecs/database/transactional-store/coalesce-transactions.d.ts +5 -1
  23. package/dist/ecs/database/transactional-store/coalesce-transactions.js +17 -28
  24. package/dist/ecs/database/transactional-store/coalesce-transactions.js.map +1 -1
  25. package/dist/ecs/database/transactional-store/coalesce-transactions.test.js +84 -7
  26. package/dist/ecs/database/transactional-store/coalesce-transactions.test.js.map +1 -1
  27. package/dist/ecs/database/transactional-store/create-transactional-store.js +7 -2
  28. package/dist/ecs/database/transactional-store/create-transactional-store.js.map +1 -1
  29. package/dist/ecs/database/transactional-store/create-transactional-store.test.js +5 -3
  30. package/dist/ecs/database/transactional-store/create-transactional-store.test.js.map +1 -1
  31. package/dist/ecs/database/transactional-store/entity-id-preservation.test.d.ts +1 -0
  32. package/dist/ecs/database/transactional-store/entity-id-preservation.test.js +106 -0
  33. package/dist/ecs/database/transactional-store/entity-id-preservation.test.js.map +1 -0
  34. package/dist/ecs/entity/entity.d.ts +8 -0
  35. package/dist/ecs/entity/entity.js +3 -0
  36. package/dist/ecs/entity/entity.js.map +1 -0
  37. package/dist/ecs/entity/u32.d.ts +8 -0
  38. package/dist/ecs/entity/u32.js +24 -0
  39. package/dist/ecs/entity/u32.js.map +1 -0
  40. package/dist/ecs/entity-location-table/create-entity-location-table.js +13 -1
  41. package/dist/ecs/entity-location-table/create-entity-location-table.js.map +1 -1
  42. package/dist/ecs/entity-location-table/create-entity-location-table.test.js +1 -2
  43. package/dist/ecs/entity-location-table/create-entity-location-table.test.js.map +1 -1
  44. package/dist/ecs/index.d.ts +2 -2
  45. package/dist/ecs/index.js +3 -2
  46. package/dist/ecs/index.js.map +1 -1
  47. package/dist/ecs/store/core/core.d.ts +13 -12
  48. package/dist/ecs/store/core/create-core.js +17 -11
  49. package/dist/ecs/store/core/create-core.js.map +1 -1
  50. package/dist/ecs/store/core/create-core.test.js +48 -0
  51. package/dist/ecs/store/core/create-core.test.js.map +1 -1
  52. package/dist/ecs/store/core/select-entities.d.ts +2 -1
  53. package/dist/ecs/store/core/select-entities.js.map +1 -1
  54. package/dist/ecs/store/create-store.d.ts +1 -1
  55. package/dist/ecs/store/create-store.js.map +1 -1
  56. package/dist/ecs/store/create-store.test.js.map +1 -1
  57. package/dist/ecs/store/store-schema/create-store-schema-test.d.ts +1 -0
  58. package/dist/ecs/store/store-schema/create-store-schema-test.js +33 -0
  59. package/dist/ecs/store/store-schema/create-store-schema-test.js.map +1 -0
  60. package/dist/ecs/store/store-schema/create-store-schema.d.ts +1 -0
  61. package/dist/ecs/store/store-schema/create-store-schema.js +45 -0
  62. package/dist/ecs/store/store-schema/create-store-schema.js.map +1 -0
  63. package/dist/ecs/store/store-schema/index.d.ts +1 -0
  64. package/dist/ecs/store/store-schema/index.js +21 -0
  65. package/dist/ecs/store/store-schema/index.js.map +1 -0
  66. package/dist/ecs/store/store-schema/store-schema.d.ts +1 -0
  67. package/dist/ecs/store/store-schema/store-schema.js +57 -0
  68. package/dist/ecs/store/store-schema/store-schema.js.map +1 -0
  69. package/dist/ecs/store/store.d.ts +9 -8
  70. package/dist/ecs/store/store.js.map +1 -1
  71. package/dist/ecs/undo-redo-service/create-undo-redo-service.test.js +23 -23
  72. package/dist/ecs/undo-redo-service/create-undo-redo-service.test.js.map +1 -1
  73. package/dist/ecs/world/create-world.d.ts +7 -0
  74. package/dist/ecs/world/create-world.js +113 -0
  75. package/dist/ecs/world/create-world.js.map +1 -0
  76. package/dist/ecs/world/create-world.test.d.ts +1 -0
  77. package/dist/ecs/world/create-world.test.js +499 -0
  78. package/dist/ecs/world/create-world.test.js.map +1 -0
  79. package/dist/ecs/world/index.d.ts +5 -0
  80. package/dist/ecs/world/index.js +27 -0
  81. package/dist/ecs/world/index.js.map +1 -0
  82. package/dist/ecs/world/system-phase.d.ts +5 -0
  83. package/dist/ecs/world/system-phase.js +14 -0
  84. package/dist/ecs/world/system-phase.js.map +1 -0
  85. package/dist/ecs/world/system.d.ts +25 -0
  86. package/dist/ecs/world/system.js +2 -0
  87. package/dist/ecs/world/system.js.map +1 -0
  88. package/dist/ecs/world/world-schema/create-world-schema-test.d.ts +1 -0
  89. package/dist/ecs/world/world-schema/create-world-schema-test.js +55 -0
  90. package/dist/ecs/world/world-schema/create-world-schema-test.js.map +1 -0
  91. package/dist/ecs/world/world-schema/create-world-schema.d.ts +19 -0
  92. package/dist/ecs/world/world-schema/create-world-schema.js +33 -0
  93. package/dist/ecs/world/world-schema/create-world-schema.js.map +1 -0
  94. package/dist/ecs/world/world-schema/index.d.ts +2 -0
  95. package/dist/ecs/world/world-schema/index.js +24 -0
  96. package/dist/ecs/world/world-schema/index.js.map +1 -0
  97. package/dist/ecs/world/world-schema/world-schema.d.ts +18 -0
  98. package/dist/ecs/world/world-schema/world-schema.js +23 -0
  99. package/dist/ecs/world/world-schema/world-schema.js.map +1 -0
  100. package/dist/ecs/world/world.d.ts +11 -0
  101. package/dist/ecs/world/world.js +2 -0
  102. package/dist/ecs/world/world.js.map +1 -0
  103. package/dist/graphics/camera/camera.d.ts +62 -0
  104. package/dist/graphics/camera/camera.js +17 -0
  105. package/dist/graphics/camera/camera.js.map +1 -0
  106. package/dist/graphics/camera/index.d.ts +4 -0
  107. package/dist/graphics/camera/index.js +5 -0
  108. package/dist/graphics/camera/index.js.map +1 -0
  109. package/dist/graphics/camera/screen-to-world-ray.d.ts +12 -0
  110. package/dist/graphics/camera/screen-to-world-ray.js +49 -0
  111. package/dist/graphics/camera/screen-to-world-ray.js.map +1 -0
  112. package/dist/graphics/camera/screen-to-world-ray.test.d.ts +1 -0
  113. package/dist/graphics/camera/screen-to-world-ray.test.js +171 -0
  114. package/dist/graphics/camera/screen-to-world-ray.test.js.map +1 -0
  115. package/dist/graphics/camera/to-view-projection.d.ts +3 -0
  116. package/dist/graphics/camera/to-view-projection.js +8 -0
  117. package/dist/graphics/camera/to-view-projection.js.map +1 -0
  118. package/dist/graphics/camera/world-to-screen.d.ts +12 -0
  119. package/dist/graphics/camera/world-to-screen.js +38 -0
  120. package/dist/graphics/camera/world-to-screen.js.map +1 -0
  121. package/dist/graphics/camera/world-to-screen.test.d.ts +1 -0
  122. package/dist/graphics/camera/world-to-screen.test.js +124 -0
  123. package/dist/graphics/camera/world-to-screen.test.js.map +1 -0
  124. package/dist/graphics/create-struct-gpu-buffer.d.ts +7 -0
  125. package/dist/graphics/create-struct-gpu-buffer.js +17 -0
  126. package/dist/graphics/create-struct-gpu-buffer.js.map +1 -0
  127. package/dist/graphics/extract-wgsl-bindings.d.ts +5 -0
  128. package/dist/graphics/extract-wgsl-bindings.js +10 -0
  129. package/dist/graphics/extract-wgsl-bindings.js.map +1 -0
  130. package/dist/graphics/frame.d.ts +1 -0
  131. package/dist/graphics/frame.js +15 -0
  132. package/dist/graphics/frame.js.map +1 -0
  133. package/dist/graphics/get-web-gpu-device-and-context.d.ts +1 -0
  134. package/dist/graphics/get-web-gpu-device-and-context.js +24 -0
  135. package/dist/graphics/get-web-gpu-device-and-context.js.map +1 -0
  136. package/dist/graphics/graphics-context.d.ts +1 -0
  137. package/dist/graphics/graphics-context.js +7 -0
  138. package/dist/graphics/graphics-context.js.map +1 -0
  139. package/dist/graphics/index.d.ts +5 -0
  140. package/dist/graphics/index.js +5 -0
  141. package/dist/graphics/index.js.map +1 -0
  142. package/dist/graphics/to-gpu-buffer.d.ts +2 -0
  143. package/dist/graphics/to-gpu-buffer.js +14 -0
  144. package/dist/graphics/to-gpu-buffer.js.map +1 -0
  145. package/dist/internal/array-buffer-like/grow.d.ts +1 -0
  146. package/dist/internal/array-buffer-like/grow.js +9 -0
  147. package/dist/internal/array-buffer-like/grow.js.map +1 -0
  148. package/dist/lit/hooks/use-observable-values.d.ts +1 -2
  149. package/dist/lit/hooks/use-observable-values.js.map +1 -1
  150. package/dist/math/aabb-face/face.d.ts +51 -0
  151. package/dist/math/aabb-face/face.js +110 -0
  152. package/dist/math/aabb-face/face.js.map +1 -0
  153. package/dist/math/aabb-face/face.test.d.ts +1 -0
  154. package/dist/math/aabb-face/face.test.js +94 -0
  155. package/dist/math/aabb-face/face.test.js.map +1 -0
  156. package/dist/math/box/box.d.ts +50 -0
  157. package/dist/math/box/box.js +23 -0
  158. package/dist/math/box/box.js.map +1 -0
  159. package/dist/math/face/face.d.ts +51 -0
  160. package/dist/math/face/face.js +110 -0
  161. package/dist/math/face/face.js.map +1 -0
  162. package/dist/math/face/face.test.d.ts +1 -0
  163. package/dist/math/face/face.test.js +94 -0
  164. package/dist/math/face/face.test.js.map +1 -0
  165. package/dist/math/picking/face.d.ts +1 -0
  166. package/dist/math/picking/face.js +2 -0
  167. package/dist/math/picking/face.js.map +1 -0
  168. package/dist/math/picking/get-closest-entity-to-line.d.ts +4 -0
  169. package/dist/math/picking/get-closest-entity-to-line.js +30 -0
  170. package/dist/math/picking/get-closest-entity-to-line.js.map +1 -0
  171. package/dist/math/picking/get-closest-entity-to-point.d.ts +4 -0
  172. package/dist/math/picking/get-closest-entity-to-point.js +27 -0
  173. package/dist/math/picking/get-closest-entity-to-point.js.map +1 -0
  174. package/dist/math/picking/get-intersecting-entities.d.ts +12 -0
  175. package/dist/math/picking/get-intersecting-entities.js +15 -0
  176. package/dist/math/picking/get-intersecting-entities.js.map +1 -0
  177. package/dist/math/picking/getClosestEntityToLine.d.ts +4 -0
  178. package/dist/math/picking/getClosestEntityToLine.js +29 -0
  179. package/dist/math/picking/getClosestEntityToLine.js.map +1 -0
  180. package/dist/math/picking/getClosestEntityToPoint.d.ts +4 -0
  181. package/dist/math/picking/getClosestEntityToPoint.js +27 -0
  182. package/dist/math/picking/getClosestEntityToPoint.js.map +1 -0
  183. package/dist/math/picking/getIntersectingEntities.d.ts +12 -0
  184. package/dist/math/picking/getIntersectingEntities.js +15 -0
  185. package/dist/math/picking/getIntersectingEntities.js.map +1 -0
  186. package/dist/math/picking/index.d.ts +5 -0
  187. package/dist/math/picking/index.js +27 -0
  188. package/dist/math/picking/index.js.map +1 -0
  189. package/dist/math/picking/pick-from-tables.d.ts +19 -0
  190. package/dist/math/picking/pick-from-tables.js +63 -0
  191. package/dist/math/picking/pick-from-tables.js.map +1 -0
  192. package/dist/math/picking/pick-result.d.ts +12 -0
  193. package/dist/math/picking/pick-result.js +23 -0
  194. package/dist/math/picking/pick-result.js.map +1 -0
  195. package/dist/math/transform/debug-inverse.d.ts +1 -0
  196. package/dist/math/transform/debug-inverse.js +28 -0
  197. package/dist/math/transform/debug-inverse.js.map +1 -0
  198. package/dist/math/transform/debug-quat.d.ts +1 -0
  199. package/dist/math/transform/debug-quat.js +23 -0
  200. package/dist/math/transform/debug-quat.js.map +1 -0
  201. package/dist/math/transform/debug-test.d.ts +1 -0
  202. package/dist/math/transform/debug-test.js +34 -0
  203. package/dist/math/transform/debug-test.js.map +1 -0
  204. package/dist/math/transform/transform.d.ts +58 -0
  205. package/dist/math/transform/transform.js +101 -0
  206. package/dist/math/transform/transform.js.map +1 -0
  207. package/dist/math/transform/transform.test.d.ts +1 -0
  208. package/dist/math/transform/transform.test.js +309 -0
  209. package/dist/math/transform/transform.test.js.map +1 -0
  210. package/dist/old-ecs/privacy/helper-functions.d.ts +43 -0
  211. package/dist/old-ecs/privacy/helper-functions.js +76 -0
  212. package/dist/old-ecs/privacy/helper-functions.js.map +1 -0
  213. package/dist/old-ecs/privacy/helper-functions.test.d.ts +1 -0
  214. package/dist/old-ecs/privacy/helper-functions.test.js +173 -0
  215. package/dist/old-ecs/privacy/helper-functions.test.js.map +1 -0
  216. package/dist/samples/todo/services/state-service/create-todo-database.d.ts +1 -1
  217. package/dist/samples/todo/services/state-service/create-todo-store.d.ts +1 -1
  218. package/dist/tsconfig.tsbuildinfo +1 -1
  219. package/package.json +1 -1
@@ -0,0 +1,309 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { Transform } from "./transform.js";
3
+ import { Vec3 } from "../vec3/vec3.js";
4
+ import { Quat } from "../quat/quat.js";
5
+ import { Mat4x4 } from "../mat4x4/mat4x4.js";
6
+ const EPSILON = 1e-6;
7
+ const expectVec3Close = (a, b, epsilon = EPSILON) => {
8
+ expect(Math.abs(a[0] - b[0])).toBeLessThan(epsilon);
9
+ expect(Math.abs(a[1] - b[1])).toBeLessThan(epsilon);
10
+ expect(Math.abs(a[2] - b[2])).toBeLessThan(epsilon);
11
+ };
12
+ describe("Transform", () => {
13
+ describe("identity transform", () => {
14
+ it("should not change a point when applying identity transform", () => {
15
+ const point = [1, 2, 3];
16
+ const result = Transform.transform(Transform.identity, point);
17
+ expectVec3Close(result, point);
18
+ });
19
+ it("should match matrix transformation for identity", () => {
20
+ const point = [1, 2, 3];
21
+ const matrix = Transform.toMatrix(Transform.identity);
22
+ const matrixResult = Mat4x4.multiplyVec3(matrix, point);
23
+ const directResult = Transform.transform(Transform.identity, point);
24
+ expectVec3Close(directResult, matrixResult);
25
+ });
26
+ });
27
+ describe("translation only", () => {
28
+ it("should translate a point correctly", () => {
29
+ const transform = {
30
+ position: [5, -3, 2],
31
+ rotation: Quat.identity,
32
+ scale: Vec3.one,
33
+ };
34
+ const point = [1, 2, 3];
35
+ const result = Transform.transform(transform, point);
36
+ expectVec3Close(result, [6, -1, 5]);
37
+ });
38
+ it("should match matrix transformation for translation", () => {
39
+ const transform = {
40
+ position: [5, -3, 2],
41
+ rotation: Quat.identity,
42
+ scale: Vec3.one,
43
+ };
44
+ const point = [1, 2, 3];
45
+ const matrix = Transform.toMatrix(transform);
46
+ const matrixResult = Mat4x4.multiplyVec3(matrix, point);
47
+ const directResult = Transform.transform(transform, point);
48
+ expectVec3Close(directResult, matrixResult);
49
+ });
50
+ });
51
+ describe("scale only", () => {
52
+ it("should scale a point correctly", () => {
53
+ const transform = {
54
+ position: Vec3.zero,
55
+ rotation: Quat.identity,
56
+ scale: [2, 3, 0.5],
57
+ };
58
+ const point = [1, 2, 4];
59
+ const result = Transform.transform(transform, point);
60
+ expectVec3Close(result, [2, 6, 2]);
61
+ });
62
+ it("should match matrix transformation for scale", () => {
63
+ const transform = {
64
+ position: Vec3.zero,
65
+ rotation: Quat.identity,
66
+ scale: [2, 3, 0.5],
67
+ };
68
+ const point = [1, 2, 4];
69
+ const matrix = Transform.toMatrix(transform);
70
+ const matrixResult = Mat4x4.multiplyVec3(matrix, point);
71
+ const directResult = Transform.transform(transform, point);
72
+ expectVec3Close(directResult, matrixResult);
73
+ });
74
+ });
75
+ describe("rotation only", () => {
76
+ it("should rotate a point 90 degrees around Z axis", () => {
77
+ const transform = {
78
+ position: Vec3.zero,
79
+ rotation: Quat.fromAxisAngle([0, 0, 1], Math.PI / 2),
80
+ scale: Vec3.one,
81
+ };
82
+ const point = [1, 0, 0];
83
+ const result = Transform.transform(transform, point);
84
+ expectVec3Close(result, [0, 1, 0]);
85
+ });
86
+ it("should rotate a point 90 degrees around Y axis", () => {
87
+ const transform = {
88
+ position: Vec3.zero,
89
+ rotation: Quat.fromAxisAngle([0, 1, 0], Math.PI / 2),
90
+ scale: Vec3.one,
91
+ };
92
+ const point = [1, 0, 0];
93
+ const result = Transform.transform(transform, point);
94
+ expectVec3Close(result, [0, 0, -1]);
95
+ });
96
+ it("should match matrix transformation for rotation", () => {
97
+ const transform = {
98
+ position: Vec3.zero,
99
+ rotation: Quat.fromAxisAngle([0, 0, 1], Math.PI / 2),
100
+ scale: Vec3.one,
101
+ };
102
+ const point = [1, 2, 3];
103
+ const matrix = Transform.toMatrix(transform);
104
+ const matrixResult = Mat4x4.multiplyVec3(matrix, point);
105
+ const directResult = Transform.transform(transform, point);
106
+ expectVec3Close(directResult, matrixResult);
107
+ });
108
+ });
109
+ describe("combined transformations", () => {
110
+ it("should apply scale, rotation, and translation in correct order", () => {
111
+ const transform = {
112
+ position: [10, 20, 30],
113
+ rotation: Quat.fromAxisAngle([0, 0, 1], Math.PI / 2),
114
+ scale: [2, 2, 2],
115
+ };
116
+ const point = [1, 0, 0];
117
+ const result = Transform.transform(transform, point);
118
+ // Scale: [2, 0, 0]
119
+ // Rotate 90° around Z: [0, 2, 0]
120
+ // Translate: [10, 22, 30]
121
+ expectVec3Close(result, [10, 22, 30]);
122
+ });
123
+ it("should match matrix transformation for complex transform", () => {
124
+ const transform = {
125
+ position: [5, -3, 7],
126
+ rotation: Quat.fromAxisAngle([1, 1, 0], Math.PI / 4),
127
+ scale: [2, 0.5, 3],
128
+ };
129
+ const point = [1, 2, 3];
130
+ const matrix = Transform.toMatrix(transform);
131
+ const matrixResult = Mat4x4.multiplyVec3(matrix, point);
132
+ const directResult = Transform.transform(transform, point);
133
+ expectVec3Close(directResult, matrixResult);
134
+ });
135
+ it("should match matrix transformation with arbitrary rotation", () => {
136
+ const transform = {
137
+ position: [-2, 4, -1],
138
+ rotation: Quat.fromEuler(0.5, 1.2, -0.3),
139
+ scale: [1.5, 0.8, 2.2],
140
+ };
141
+ const point = [3, -1, 2];
142
+ const matrix = Transform.toMatrix(transform);
143
+ const matrixResult = Mat4x4.multiplyVec3(matrix, point);
144
+ const directResult = Transform.transform(transform, point);
145
+ expectVec3Close(directResult, matrixResult);
146
+ });
147
+ });
148
+ describe("multiple points consistency", () => {
149
+ it("should consistently match matrix transformation for various points", () => {
150
+ const transform = {
151
+ position: [1, 2, 3],
152
+ rotation: Quat.fromAxisAngle([1, 0.5, 0.3], 1.5),
153
+ scale: [2, 1.5, 0.75],
154
+ };
155
+ const testPoints = [
156
+ [0, 0, 0],
157
+ [1, 0, 0],
158
+ [0, 1, 0],
159
+ [0, 0, 1],
160
+ [1, 1, 1],
161
+ [-1, -1, -1],
162
+ [5, -3, 2],
163
+ [0.1, 0.2, 0.3],
164
+ ];
165
+ const matrix = Transform.toMatrix(transform);
166
+ for (const point of testPoints) {
167
+ const matrixResult = Mat4x4.multiplyVec3(matrix, point);
168
+ const directResult = Transform.transform(transform, point);
169
+ expectVec3Close(directResult, matrixResult);
170
+ }
171
+ });
172
+ });
173
+ describe("edge cases", () => {
174
+ it("should handle zero point", () => {
175
+ const transform = {
176
+ position: [1, 2, 3],
177
+ rotation: Quat.fromAxisAngle([0, 1, 0], Math.PI / 4),
178
+ scale: [2, 3, 4],
179
+ };
180
+ const point = [0, 0, 0];
181
+ const matrix = Transform.toMatrix(transform);
182
+ const matrixResult = Mat4x4.multiplyVec3(matrix, point);
183
+ const directResult = Transform.transform(transform, point);
184
+ expectVec3Close(directResult, matrixResult);
185
+ });
186
+ it("should handle zero scale components", () => {
187
+ const transform = {
188
+ position: [1, 2, 3],
189
+ rotation: Quat.fromAxisAngle([0, 1, 0], Math.PI / 4),
190
+ scale: [0, 1, 1],
191
+ };
192
+ const point = [5, 5, 5];
193
+ const matrix = Transform.toMatrix(transform);
194
+ const matrixResult = Mat4x4.multiplyVec3(matrix, point);
195
+ const directResult = Transform.transform(transform, point);
196
+ expectVec3Close(directResult, matrixResult);
197
+ });
198
+ it("should handle negative scale", () => {
199
+ const transform = {
200
+ position: [0, 0, 0],
201
+ rotation: Quat.identity,
202
+ scale: [-1, 1, -1],
203
+ };
204
+ const point = [1, 2, 3];
205
+ const matrix = Transform.toMatrix(transform);
206
+ const matrixResult = Mat4x4.multiplyVec3(matrix, point);
207
+ const directResult = Transform.transform(transform, point);
208
+ expectVec3Close(directResult, matrixResult);
209
+ });
210
+ });
211
+ describe("transformInverse", () => {
212
+ it("should be the inverse of transform for identity", () => {
213
+ const point = [1, 2, 3];
214
+ const transformed = Transform.transform(Transform.identity, point);
215
+ const result = Transform.transformInverse(Transform.identity, transformed);
216
+ expectVec3Close(result, point);
217
+ });
218
+ it("should be the inverse of transform for translation only", () => {
219
+ const transform = {
220
+ position: [5, -3, 2],
221
+ rotation: Quat.identity,
222
+ scale: Vec3.one,
223
+ };
224
+ const point = [1, 2, 3];
225
+ const transformed = Transform.transform(transform, point);
226
+ const result = Transform.transformInverse(transform, transformed);
227
+ expectVec3Close(result, point);
228
+ });
229
+ it("should be the inverse of transform for scale only", () => {
230
+ const transform = {
231
+ position: Vec3.zero,
232
+ rotation: Quat.identity,
233
+ scale: [2, 3, 0.5],
234
+ };
235
+ const point = [1, 2, 4];
236
+ const transformed = Transform.transform(transform, point);
237
+ const result = Transform.transformInverse(transform, transformed);
238
+ expectVec3Close(result, point);
239
+ });
240
+ it("should be the inverse of transform for rotation only", () => {
241
+ const transform = {
242
+ position: Vec3.zero,
243
+ rotation: Quat.fromAxisAngle([0, 0, 1], Math.PI / 2),
244
+ scale: Vec3.one,
245
+ };
246
+ const point = [1, 2, 3];
247
+ const transformed = Transform.transform(transform, point);
248
+ const result = Transform.transformInverse(transform, transformed);
249
+ expectVec3Close(result, point);
250
+ });
251
+ it("should be the inverse of transform for combined transformations", () => {
252
+ const transform = {
253
+ position: [5, -3, 7],
254
+ rotation: Quat.fromAxisAngle([1, 1, 0], Math.PI / 4),
255
+ scale: [2, 0.5, 3],
256
+ };
257
+ const point = [1, 2, 3];
258
+ const transformed = Transform.transform(transform, point);
259
+ const result = Transform.transformInverse(transform, transformed);
260
+ expectVec3Close(result, point);
261
+ });
262
+ it("should handle multiple points correctly", () => {
263
+ const transform = {
264
+ position: [1, 2, 3],
265
+ rotation: Quat.fromEuler(0.5, 1.2, -0.3),
266
+ scale: [2, 1.5, 0.75],
267
+ };
268
+ const testPoints = [
269
+ [0, 0, 0],
270
+ [1, 0, 0],
271
+ [0, 1, 0],
272
+ [0, 0, 1],
273
+ [1, 1, 1],
274
+ [-1, -1, -1],
275
+ [5, -3, 2],
276
+ ];
277
+ for (const point of testPoints) {
278
+ const transformed = Transform.transform(transform, point);
279
+ const result = Transform.transformInverse(transform, transformed);
280
+ expectVec3Close(result, point);
281
+ }
282
+ });
283
+ it("should match inverse matrix transformation", () => {
284
+ const transform = {
285
+ position: [2, -1, 3],
286
+ rotation: Quat.fromAxisAngle([1, 0, 1], 0.8),
287
+ scale: [1.5, 2, 0.8],
288
+ };
289
+ const point = [3, -1, 2];
290
+ const matrix = Transform.toMatrix(transform);
291
+ const inverseMatrix = Mat4x4.inverse(matrix);
292
+ const matrixResult = Mat4x4.multiplyVec3(inverseMatrix, point);
293
+ const directResult = Transform.transformInverse(transform, point);
294
+ expectVec3Close(directResult, matrixResult);
295
+ });
296
+ it("should handle negative scale", () => {
297
+ const transform = {
298
+ position: [1, 2, 3],
299
+ rotation: Quat.fromAxisAngle([0, 1, 0], Math.PI / 6),
300
+ scale: [-2, 1, -1],
301
+ };
302
+ const point = [4, 5, 6];
303
+ const transformed = Transform.transform(transform, point);
304
+ const result = Transform.transformInverse(transform, transformed);
305
+ expectVec3Close(result, point);
306
+ });
307
+ });
308
+ });
309
+ //# sourceMappingURL=transform.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transform.test.js","sourceRoot":"","sources":["../../../src/math/transform/transform.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ import { Schema } from "../../schema/index.js";
2
+ /**
3
+ * Privacy options used in Schema
4
+ */
5
+ export type PrivacyOptions = {
6
+ [K in NonNullable<Schema["privacy"]>]?: boolean;
7
+ };
8
+ /**
9
+ * Checks if a component should be included for serialization
10
+ * @param schema
11
+ * @param privacyOptions
12
+ * @returns Whether the component should be included
13
+ */
14
+ export declare const shouldIncludeComponentForSerialization: (schema: Schema, privacyOptions?: PrivacyOptions) => boolean;
15
+ /**
16
+ * Filters a column for privacy by replacing its data with default values if it contains any data.
17
+ * @param schema - The schema of the component
18
+ * @param rows - The number of rows in the table
19
+ * @param data - The data of the column
20
+ * @returns The filtered column containing default values
21
+ */
22
+ export declare const filterColumnForPrivacy: (schema: Schema, rows: any, data: any) => any;
23
+ /**
24
+ * Gets a filtered column based on privacy options
25
+ * @param name - The name of the component
26
+ * @param privacyOptions
27
+ * @param data - The data of the column
28
+ * @param componentSchemas
29
+ * @param rows - The number of rows in the table
30
+ * @returns A tuple containing the name of the component and the filtered column data
31
+ */
32
+ export declare const getFilteredColumn: (name: string, privacyOptions: PrivacyOptions | undefined, data: any, componentSchemas: Record<string, Schema>, rows: number) => any[];
33
+ /**
34
+ * Filters a table for privacy based on the filtered components.
35
+ * @param filteredComponents - The components to filter
36
+ * @param table - The table to filter
37
+ * @param options - The privacy options to use
38
+ * @returns The filtered table
39
+ */
40
+ export declare const filterTableForPrivacy: (filteredComponents: Record<string, Schema>, table: any, options: any) => {
41
+ rows: any;
42
+ columns: any;
43
+ };
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Checks if a component should be included for serialization
3
+ * @param schema
4
+ * @param privacyOptions
5
+ * @returns Whether the component should be included
6
+ */
7
+ export const shouldIncludeComponentForSerialization = (schema, privacyOptions) => {
8
+ // const schema = componentSchemas[component as keyof C];
9
+ // if the component has no privacy attribute, it is considered as necessary.
10
+ // this is to maintain backwards compatibility with existing schemas
11
+ if (!schema?.privacy) {
12
+ return true;
13
+ }
14
+ // Check the privacy attribute
15
+ return !schema.privacy || (privacyOptions?.[schema.privacy] ?? (schema.privacy === 'strictlyNecessary'));
16
+ };
17
+ /**
18
+ * Filters a column for privacy by replacing its data with default values if it contains any data.
19
+ * @param schema - The schema of the component
20
+ * @param rows - The number of rows in the table
21
+ * @param data - The data of the column
22
+ * @returns The filtered column containing default values
23
+ */
24
+ export const filterColumnForPrivacy = (schema, rows, data) => {
25
+ let value = data;
26
+ // If the column has no data and the filtered component has a default, use the default
27
+ if (value !== undefined && value !== null && (Array.isArray(value) && value.length !== 0)) {
28
+ // Create array filled with default values for the number of rows
29
+ if (rows > 0) {
30
+ value = new Array(rows).fill(schema.default);
31
+ }
32
+ else {
33
+ value = [];
34
+ }
35
+ }
36
+ console.warn(`Updated column for schema ${JSON.stringify(schema)} with rows: ${rows}, original data: ${JSON.stringify(data)}, resulting value: ${JSON.stringify(value)} for privacy filter`);
37
+ return value;
38
+ };
39
+ /**
40
+ * Gets a filtered column based on privacy options
41
+ * @param name - The name of the component
42
+ * @param privacyOptions
43
+ * @param data - The data of the column
44
+ * @param componentSchemas
45
+ * @param rows - The number of rows in the table
46
+ * @returns A tuple containing the name of the component and the filtered column data
47
+ */
48
+ export const getFilteredColumn = (name, privacyOptions, data, componentSchemas, rows) => {
49
+ const schema = componentSchemas[name];
50
+ if (shouldIncludeComponentForSerialization(schema, privacyOptions)) {
51
+ return [name, data];
52
+ }
53
+ else {
54
+ return [name, filterColumnForPrivacy(componentSchemas[name], rows, data)];
55
+ }
56
+ };
57
+ /**
58
+ * Filters a table for privacy based on the filtered components.
59
+ * @param filteredComponents - The components to filter
60
+ * @param table - The table to filter
61
+ * @param options - The privacy options to use
62
+ * @returns The filtered table
63
+ */
64
+ export const filterTableForPrivacy = (filteredComponents, table, options) => {
65
+ // filter the tables for privacy based on the filtered components.
66
+ const { rows, columns } = table;
67
+ const filteredColumns = Object.fromEntries(Object.entries(columns)
68
+ .map(([name, data]) => {
69
+ return getFilteredColumn(name, options, data, filteredComponents, rows);
70
+ }));
71
+ return {
72
+ rows,
73
+ columns: filteredColumns,
74
+ };
75
+ };
76
+ //# sourceMappingURL=helper-functions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helper-functions.js","sourceRoot":"","sources":["../../../src/old-ecs/privacy/helper-functions.ts"],"names":[],"mappings":"AA8BA;;;;;GAKG;AACH,MAAM,CAAC,MAAM,sCAAsC,GAAG,CAAC,MAAc,EAAE,cAA+B,EAAW,EAAE;IAC/G,yDAAyD;IACzD,4EAA4E;IAC5E,oEAAoE;IACpE,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;QACnB,OAAO,IAAI,CAAC;IAChB,CAAC;IACD,8BAA8B;IAC9B,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,cAAc,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,KAAK,mBAAmB,CAAC,CAAC,CAAC;AAC7G,CAAC,CAAA;AAED;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,MAAc,EAAE,IAAS,EAAE,IAAS,EAAE,EAAE;IAC3E,IAAI,KAAK,GAAG,IAAI,CAAC;IACjB,sFAAsF;IACtF,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC;QACxF,iEAAiE;QACjE,IAAI,IAAI,GAAG,CAAC,EAAE,CAAC;YACX,KAAK,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACjD,CAAC;aAAM,CAAC;YACJ,KAAK,GAAG,EAAE,CAAC;QACf,CAAC;IACL,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,6BAA6B,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,eAAe,IAAI,oBAAoB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,sBAAsB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;IAC7L,OAAO,KAAK,CAAC;AACjB,CAAC,CAAA;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,IAAY,EAAE,cAA0C,EAAE,IAAS,EAAE,gBAAwC,EAAE,IAAY,EAAE,EAAE;IAC7J,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACtC,IAAI,sCAAsC,CAAC,MAAM,EAAE,cAAc,CAAC,EAAE,CAAC;QACjE,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACxB,CAAC;SAAM,CAAC;QACJ,OAAO,CAAC,IAAI,EAAE,sBAAsB,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;IAC9E,CAAC;AACL,CAAC,CAAA;AAED;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,kBAA0C,EAAE,KAAU,EAAE,OAAY,EAAE,EAAE;IAC1G,kEAAkE;IAClE,MAAM,EAAC,IAAI,EAAE,OAAO,EAAC,GAAG,KAAK,CAAC;IAC9B,MAAM,eAAe,GAAG,MAAM,CAAC,WAAW,CACtC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC;SAClB,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE;QAClB,OAAO,iBAAiB,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,kBAAkB,EAAE,IAAI,CAAC,CAAC;IAC5E,CAAC,CAAC,CACT,CAAC;IAEF,OAAO;QACH,IAAI;QACJ,OAAO,EAAE,eAAe;KAC3B,CAAC;AACN,CAAC,CAAA"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,173 @@
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 { shouldIncludeComponentForSerialization, filterColumnForPrivacy, getFilteredColumn, filterTableForPrivacy } from "./helper-functions.js";
23
+ import { describe, expect, test } from "vitest";
24
+ describe("Privacy Helper Functions", () => {
25
+ test("shouldIncludeComponentForSerialization works correctly", () => {
26
+ const testCases = [
27
+ {
28
+ schema: { type: "string", privacy: "strictlyNecessary" },
29
+ options: { strictlyNecessary: true },
30
+ expected: true,
31
+ description: "strictlyNecessary with permission"
32
+ },
33
+ {
34
+ schema: { type: "string", privacy: "strictlyNecessary" },
35
+ options: undefined,
36
+ expected: true,
37
+ description: "strictlyNecessary without options (default)"
38
+ },
39
+ {
40
+ schema: { type: "string", privacy: "functional" },
41
+ options: { functional: true },
42
+ expected: true,
43
+ description: "functional with permission"
44
+ },
45
+ {
46
+ schema: { type: "string", privacy: "functional" },
47
+ options: { functional: false },
48
+ expected: false,
49
+ description: "functional without permission"
50
+ },
51
+ {
52
+ schema: { type: "string", privacy: "performance" },
53
+ options: { performance: true },
54
+ expected: true,
55
+ description: "performance with permission"
56
+ },
57
+ {
58
+ schema: { type: "string", privacy: "performance" },
59
+ options: { performance: false },
60
+ expected: false,
61
+ description: "performance without permission"
62
+ },
63
+ {
64
+ schema: { type: "string", privacy: "advertising" },
65
+ options: { advertising: true },
66
+ expected: true,
67
+ description: "advertising with permission"
68
+ },
69
+ {
70
+ schema: { type: "string", privacy: "advertising" },
71
+ options: { advertising: false },
72
+ expected: false,
73
+ description: "advertising without permission"
74
+ },
75
+ {
76
+ schema: { type: "string" },
77
+ options: {},
78
+ expected: true,
79
+ description: "no privacy classification (always included)"
80
+ },
81
+ {
82
+ schema: { type: "string" },
83
+ options: { strictlyNecessary: false, functional: false, performance: false, advertising: false },
84
+ expected: true,
85
+ description: "no privacy classification with all permissions false"
86
+ },
87
+ ];
88
+ for (const testCase of testCases) {
89
+ const result = shouldIncludeComponentForSerialization(testCase.schema, testCase.options);
90
+ expect(result).toBe(testCase.expected);
91
+ }
92
+ });
93
+ test("filterColumnForPrivacy replaces data with default values", () => {
94
+ const schema = { type: "string", default: "defaultValue" };
95
+ const rows = 3;
96
+ const originalData = ["value1", "value2", "value3"];
97
+ const result = filterColumnForPrivacy(schema, rows, originalData);
98
+ expect(result).toEqual(["defaultValue", "defaultValue", "defaultValue"]);
99
+ });
100
+ test("filterColumnForPrivacy handles empty data", () => {
101
+ const schema = { type: "string", default: "defaultValue" };
102
+ const rows = 0;
103
+ const originalData = [];
104
+ const result = filterColumnForPrivacy(schema, rows, originalData);
105
+ expect(result).toEqual([]);
106
+ });
107
+ test("filterColumnForPrivacy handles null/undefined data", () => {
108
+ const schema = { type: "string", default: "defaultValue" };
109
+ const rows = 2;
110
+ expect(filterColumnForPrivacy(schema, rows, null)).toBe(null);
111
+ expect(filterColumnForPrivacy(schema, rows, undefined)).toBe(undefined);
112
+ });
113
+ test("getFilteredColumn returns original data when component should be included", () => {
114
+ const componentSchemas = {
115
+ allowedComponent: { type: "string", privacy: "strictlyNecessary" }
116
+ };
117
+ const privacyOptions = { strictlyNecessary: true };
118
+ const originalData = ["value1", "value2"];
119
+ const rows = 2;
120
+ const [name, data] = getFilteredColumn("allowedComponent", privacyOptions, originalData, componentSchemas, rows);
121
+ expect(name).toBe("allowedComponent");
122
+ expect(data).toBe(originalData);
123
+ });
124
+ test("getFilteredColumn returns filtered data when component should be excluded", () => {
125
+ const componentSchemas = {
126
+ blockedComponent: { type: "string", privacy: "advertising", default: "blocked" }
127
+ };
128
+ const privacyOptions = { strictlyNecessary: true };
129
+ const originalData = ["value1", "value2"];
130
+ const rows = 2;
131
+ const [name, data] = getFilteredColumn("blockedComponent", privacyOptions, originalData, componentSchemas, rows);
132
+ expect(name).toBe("blockedComponent");
133
+ expect(data).toEqual(["blocked", "blocked"]);
134
+ });
135
+ test("filterTableForPrivacy filters table columns based on privacy", () => {
136
+ const componentSchemas = {
137
+ allowedComponent: { type: "string", privacy: "strictlyNecessary" },
138
+ blockedComponent: { type: "string", privacy: "advertising", default: "filtered" }
139
+ };
140
+ const privacyOptions = { strictlyNecessary: true };
141
+ const table = {
142
+ rows: 2,
143
+ columns: {
144
+ allowedComponent: ["allowed1", "allowed2"],
145
+ blockedComponent: ["blocked1", "blocked2"]
146
+ }
147
+ };
148
+ const result = filterTableForPrivacy(componentSchemas, table, privacyOptions);
149
+ expect(result.rows).toBe(2);
150
+ expect(result.columns.allowedComponent).toEqual(["allowed1", "allowed2"]);
151
+ expect(result.columns.blockedComponent).toEqual(["filtered", "filtered"]);
152
+ });
153
+ test("filterTableForPrivacy preserves table structure", () => {
154
+ const componentSchemas = {
155
+ comp1: { type: "string", privacy: "functional", default: "default1" },
156
+ comp2: { type: "number", privacy: "performance", default: 0 }
157
+ };
158
+ const privacyOptions = { functional: true };
159
+ const table = {
160
+ rows: 3,
161
+ columns: {
162
+ comp1: ["a", "b", "c"],
163
+ comp2: [1, 2, 3]
164
+ }
165
+ };
166
+ const result = filterTableForPrivacy(componentSchemas, table, privacyOptions);
167
+ expect(result.rows).toBe(3);
168
+ expect(Object.keys(result.columns)).toEqual(["comp1", "comp2"]);
169
+ expect(result.columns.comp1).toEqual(["a", "b", "c"]);
170
+ expect(result.columns.comp2).toEqual([0, 0, 0]);
171
+ });
172
+ });
173
+ //# sourceMappingURL=helper-functions.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helper-functions.test.js","sourceRoot":"","sources":["../../../src/old-ecs/privacy/helper-functions.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;WAoBW;AACX,OAAO,EAEH,sCAAsC,EACtC,sBAAsB,EACtB,iBAAiB,EACjB,qBAAqB,EACxB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAGhD,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACtC,IAAI,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,MAAM,SAAS,GAA2F;YACtG;gBACI,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,mBAAmB,EAAE;gBACxD,OAAO,EAAE,EAAE,iBAAiB,EAAE,IAAI,EAAE;gBACpC,QAAQ,EAAE,IAAI;gBACd,WAAW,EAAE,mCAAmC;aACnD;YACD;gBACI,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,mBAAmB,EAAE;gBACxD,OAAO,EAAE,SAAS;gBAClB,QAAQ,EAAE,IAAI;gBACd,WAAW,EAAE,6CAA6C;aAC7D;YACD;gBACI,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAE;gBACjD,OAAO,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE;gBAC7B,QAAQ,EAAE,IAAI;gBACd,WAAW,EAAE,4BAA4B;aAC5C;YACD;gBACI,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAE;gBACjD,OAAO,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE;gBAC9B,QAAQ,EAAE,KAAK;gBACf,WAAW,EAAE,+BAA+B;aAC/C;YACD;gBACI,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,aAAa,EAAE;gBAClD,OAAO,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE;gBAC9B,QAAQ,EAAE,IAAI;gBACd,WAAW,EAAE,6BAA6B;aAC7C;YACD;gBACI,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,aAAa,EAAE;gBAClD,OAAO,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE;gBAC/B,QAAQ,EAAE,KAAK;gBACf,WAAW,EAAE,gCAAgC;aAChD;YACD;gBACI,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,aAAa,EAAE;gBAClD,OAAO,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE;gBAC9B,QAAQ,EAAE,IAAI;gBACd,WAAW,EAAE,6BAA6B;aAC7C;YACD;gBACI,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,aAAa,EAAE;gBAClD,OAAO,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE;gBAC/B,QAAQ,EAAE,KAAK;gBACf,WAAW,EAAE,gCAAgC;aAChD;YACD;gBACI,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBAC1B,OAAO,EAAE,EAAE;gBACX,QAAQ,EAAE,IAAI;gBACd,WAAW,EAAE,6CAA6C;aAC7D;YACD;gBACI,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBAC1B,OAAO,EAAE,EAAE,iBAAiB,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE;gBAChG,QAAQ,EAAE,IAAI;gBACd,WAAW,EAAE,sDAAsD;aACtE;SACJ,CAAC;QAEF,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YAC/B,MAAM,MAAM,GAAG,sCAAsC,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;YACzF,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC3C,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,0DAA0D,EAAE,GAAG,EAAE;QAClE,MAAM,MAAM,GAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC;QACnE,MAAM,IAAI,GAAG,CAAC,CAAC;QACf,MAAM,YAAY,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAEpD,MAAM,MAAM,GAAG,sBAAsB,CAAC,MAAM,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC;QAElE,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,cAAc,EAAE,cAAc,EAAE,cAAc,CAAC,CAAC,CAAC;IAC7E,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,MAAM,GAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC;QACnE,MAAM,IAAI,GAAG,CAAC,CAAC;QACf,MAAM,YAAY,GAAa,EAAE,CAAC;QAElC,MAAM,MAAM,GAAG,sBAAsB,CAAC,MAAM,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC;QAElE,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,MAAM,MAAM,GAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC;QACnE,MAAM,IAAI,GAAG,CAAC,CAAC;QAEf,MAAM,CAAC,sBAAsB,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9D,MAAM,CAAC,sBAAsB,CAAC,MAAM,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC5E,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,2EAA2E,EAAE,GAAG,EAAE;QACnF,MAAM,gBAAgB,GAAG;YACrB,gBAAgB,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,mBAAmB,EAAE;SACrE,CAAC;QACF,MAAM,cAAc,GAAmB,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC;QACnE,MAAM,YAAY,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC1C,MAAM,IAAI,GAAG,CAAC,CAAC;QAEf,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,iBAAiB,CAAC,kBAAkB,EAAE,cAAc,EAAE,YAAY,EAAE,gBAA0C,EAAE,IAAI,CAAC,CAAC;QAE3I,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QACtC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,2EAA2E,EAAE,GAAG,EAAE;QACnF,MAAM,gBAAgB,GAAG;YACrB,gBAAgB,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,SAAS,EAAE;SACnF,CAAC;QACF,MAAM,cAAc,GAAmB,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC;QACnE,MAAM,YAAY,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC1C,MAAM,IAAI,GAAG,CAAC,CAAC;QAEf,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,iBAAiB,CAAC,kBAAkB,EAAE,cAAc,EAAE,YAAY,EAAE,gBAA0C,EAAE,IAAI,CAAC,CAAC;QAE3I,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QACtC,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,8DAA8D,EAAE,GAAG,EAAE;QACtE,MAAM,gBAAgB,GAAG;YACrB,gBAAgB,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,mBAAmB,EAAE;YAClE,gBAAgB,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,UAAU,EAAE;SACpF,CAAC;QACF,MAAM,cAAc,GAAmB,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC;QAEnE,MAAM,KAAK,GAAG;YACV,IAAI,EAAE,CAAC;YACP,OAAO,EAAE;gBACL,gBAAgB,EAAE,CAAC,UAAU,EAAE,UAAU,CAAC;gBAC1C,gBAAgB,EAAE,CAAC,UAAU,EAAE,UAAU,CAAC;aAC7C;SACJ,CAAC;QAEF,MAAM,MAAM,GAAG,qBAAqB,CAAC,gBAA0C,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC;QAExG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC5B,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC;QAC1E,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC;IAC9E,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,gBAAgB,GAAG;YACrB,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,UAAU,EAAE;YACrE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,CAAC,EAAE;SAChE,CAAC;QACF,MAAM,cAAc,GAAmB,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;QAE5D,MAAM,KAAK,GAAG;YACV,IAAI,EAAE,CAAC;YACP,OAAO,EAAE;gBACL,KAAK,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;gBACtB,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;aACnB;SACJ,CAAC;QAEF,MAAM,MAAM,GAAG,qBAAqB,CAAC,gBAA0C,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC;QAExG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC5B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;QAChE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;QACtD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
@@ -25,7 +25,7 @@ export declare const createTodoDatabase: () => import("../../../../ecs/index.js"
25
25
  type: "null";
26
26
  }];
27
27
  };
28
- }> & import("../../../../ecs/optional-components.js").OptionalComponents, import("../../../../schema/schema.js").FromSchemas<{
28
+ }>, import("../../../../schema/schema.js").FromSchemas<{
29
29
  displayCompleted: {
30
30
  type: "boolean";
31
31
  default: boolean;