@adobe/data 0.5.12 → 0.5.14

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 (68) hide show
  1. package/dist/ecs/archetype/archetype.d.ts +2 -1
  2. package/dist/ecs/archetype/archetype.js +14 -0
  3. package/dist/ecs/archetype/archetype.js.map +1 -1
  4. package/dist/ecs/archetype/create-archetype.d.ts +2 -2
  5. package/dist/ecs/archetype/create-archetype.test.js +6 -6
  6. package/dist/ecs/archetype/create-archetype.test.js.map +1 -1
  7. package/dist/ecs/archetype/delete-row.test.js +4 -4
  8. package/dist/ecs/archetype/delete-row.test.js.map +1 -1
  9. package/dist/ecs/database/transactional-store/apply-operations.js.map +1 -1
  10. package/dist/ecs/database/transactional-store/create-transactional-store.js.map +1 -1
  11. package/dist/ecs/database/transactional-store/transactional-store.d.ts +1 -1
  12. package/dist/ecs/entity.d.ts +2 -2
  13. package/dist/ecs/entity.js +1 -1
  14. package/dist/ecs/entity.js.map +1 -1
  15. package/dist/ecs/index.d.ts +2 -1
  16. package/dist/ecs/index.js +2 -1
  17. package/dist/ecs/index.js.map +1 -1
  18. package/dist/ecs/store/core/create-core.js +2 -2
  19. package/dist/ecs/store/core/create-core.js.map +1 -1
  20. package/dist/index.d.ts +1 -0
  21. package/dist/internal/function/debounce.js +0 -2
  22. package/dist/internal/function/debounce.js.map +1 -1
  23. package/dist/lit/hooks/use-element.d.ts +3 -0
  24. package/dist/lit/hooks/use-element.js +63 -5
  25. package/dist/lit/hooks/use-element.js.map +1 -1
  26. package/dist/math/f32/f32.d.ts +2 -3
  27. package/dist/math/f32/f32.js +2 -2
  28. package/dist/mutable-clone.d.ts +1 -4
  29. package/dist/mutable-clone.js +21 -0
  30. package/dist/mutable-clone.js.map +1 -1
  31. package/dist/mutable.d.ts +9 -0
  32. package/dist/mutable.js +26 -0
  33. package/dist/mutable.js.map +1 -0
  34. package/dist/old-ecs/core-ecs/core-ecs-serialization.test.js +4 -4
  35. package/dist/old-ecs/core-ecs/core-ecs-serialization.test.js.map +1 -1
  36. package/dist/old-ecs/core-ecs/core-ecs-types.d.ts +7 -0
  37. package/dist/old-ecs/core-ecs/core-ecs.js +5 -2
  38. package/dist/old-ecs/core-ecs/core-ecs.js.map +1 -1
  39. package/dist/schema/schema.d.ts +3 -0
  40. package/dist/schema/schema.js +5 -1
  41. package/dist/schema/schema.js.map +1 -1
  42. package/dist/schema/to-vertex-buffer-layout.d.ts +56 -0
  43. package/dist/schema/to-vertex-buffer-layout.js +129 -0
  44. package/dist/schema/to-vertex-buffer-layout.js.map +1 -0
  45. package/dist/schema/to-vertex-buffer-layout.test.d.ts +1 -0
  46. package/dist/schema/to-vertex-buffer-layout.test.js +247 -0
  47. package/dist/schema/to-vertex-buffer-layout.test.js.map +1 -0
  48. package/dist/tsconfig.tsbuildinfo +1 -1
  49. package/dist/typed-buffer/create-struct-buffer.js +3 -3
  50. package/dist/typed-buffer/create-struct-buffer.js.map +1 -1
  51. package/dist/typed-buffer/create-struct-buffer.test.d.ts +1 -0
  52. package/dist/typed-buffer/create-struct-buffer.test.js +227 -0
  53. package/dist/typed-buffer/create-struct-buffer.test.js.map +1 -0
  54. package/dist/typed-buffer/create-typed-buffer.js +3 -1
  55. package/dist/typed-buffer/create-typed-buffer.js.map +1 -1
  56. package/dist/typed-buffer/create-typed-buffer.test.d.ts +1 -0
  57. package/dist/typed-buffer/create-typed-buffer.test.js +148 -0
  58. package/dist/typed-buffer/create-typed-buffer.test.js.map +1 -0
  59. package/dist/typed-buffer/structs/get-struct-layout.d.ts +0 -1
  60. package/dist/typed-buffer/structs/get-struct-layout.js +72 -39
  61. package/dist/typed-buffer/structs/get-struct-layout.js.map +1 -1
  62. package/dist/typed-buffer/structs/get-struct-layout.test.js +137 -0
  63. package/dist/typed-buffer/structs/get-struct-layout.test.js.map +1 -1
  64. package/dist/typed-buffer/structs/struct-layout.d.ts +4 -0
  65. package/dist/types/types.d.ts +5 -0
  66. package/dist/types/types.js +3 -0
  67. package/dist/types/types.js.map +1 -1
  68. package/package.json +1 -1
@@ -31,11 +31,11 @@ class StructTypedBuffer extends TypedBuffer {
31
31
  constructor(schema, initialCapacityOrArrayBuffer) {
32
32
  super(schema);
33
33
  this.type = structBufferType;
34
- const layout = getStructLayout(schema);
35
- if (!layout) {
34
+ const structLayout = getStructLayout(schema);
35
+ if (!structLayout) {
36
36
  throw new Error("Schema is not a valid struct schema");
37
37
  }
38
- this.layout = layout;
38
+ this.layout = structLayout;
39
39
  this.typedArrayElementSizeInBytes = this.layout.size;
40
40
  this.arrayType = 'f32';
41
41
  this.sizeInQuads = this.layout.size / 4;
@@ -1 +1 @@
1
- {"version":3,"file":"create-struct-buffer.js","sourceRoot":"","sources":["../../src/typed-buffer/create-struct-buffer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"create-struct-buffer.js","sourceRoot":"","sources":["../../src/typed-buffer/create-struct-buffer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;WAoBW;AACX,OAAO,EAAE,IAAI,EAAE,MAAM,uCAAuC,CAAC;AAE7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,iDAAiD,CAAC;AAEnF,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,WAAW,EAAmB,MAAM,mBAAmB,CAAC;AAEjE,OAAO,EAAE,uBAAuB,EAAE,MAAM,+DAA+D,CAAC;AAExG,MAAM,CAAC,MAAM,gBAAgB,GAAG,QAAQ,CAAC;AAEzC,MAAM,iBAAgF,SAAQ,WAA0B;IAcpH,YAAY,MAAS,EAAE,4BAAkD;QACrE,KAAK,CAAC,MAAM,CAAC,CAAC;QAdF,SAAI,GAAoB,gBAAgB,CAAC;QAgBrD,MAAM,YAAY,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;QAC7C,IAAI,CAAC,YAAY,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;QAC3D,CAAC;QAED,IAAI,CAAC,MAAM,GAAG,YAAY,CAAC;QAC3B,IAAI,CAAC,4BAA4B,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;QACrD,IAAI,CAAC,SAAS,GAAG,KAAkB,CAAC;QACpC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC;QAExC,IAAI,CAAC,WAAW;cACV,4BAA4B,YAAY,WAAW;gBACrD,CAAC,CAAC,4BAA4B;gBAC9B,CAAC,CAAC,uBAAuB,CAAC,4BAA4B,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC/E,IAAI,CAAC,QAAQ,GAAG,gBAAgB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACnD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAChD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC;QAE3D,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAgB,IAAI,CAAC,MAAM,CAAC,CAAC;QACzD,IAAI,CAAC,KAAK,GAAG,iBAAiB,CAAgB,IAAI,CAAC,MAAM,CAAC,CAAC;IAC/D,CAAC;IAED,IAAI,QAAQ;QACR,OAAO,IAAI,CAAC,SAAS,CAAC;IAC1B,CAAC;IAED,IAAI,QAAQ,CAAC,KAAa;QACtB,IAAI,KAAK,KAAK,IAAI,CAAC,SAAS,EAAE,CAAC;YAC3B,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;YACvB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACpE,IAAI,CAAC,QAAQ,GAAG,gBAAgB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACnD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACpD,CAAC;IACL,CAAC;IAED,aAAa;QACT,OAAO,IAAI,CAAC,UAAU,CAAC;IAC3B,CAAC;IAED,GAAG,CAAC,KAAa;QACb,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC3C,CAAC;IAED,GAAG,CAAC,KAAa,EAAE,KAAoB;QACnC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IAC5C,CAAC;IAED,UAAU,CAAC,MAAc,EAAE,KAAa,EAAE,GAAW;QACjD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,UAAU,CAAC,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC;IAC1H,CAAC;IAED,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,SAAS;QACjC,MAAM,MAAM,GAAG,IAAI,KAAK,CAAgB,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC;QAClE,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;YAC/B,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QACpD,CAAC;QACD,OAAO,MAAM,CAAC;IAClB,CAAC;CACJ;AAUD,MAAM,UAAU,kBAAkB,CAC9B,MAAS,EACT,4BAAkD;IAElD,OAAO,IAAI,iBAAiB,CAAe,MAAM,EAAE,4BAA4B,CAAC,CAAC;AACrF,CAAC;AAAA,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,227 @@
1
+ /*MIT License
2
+
3
+ © Copyright 2025 Adobe. All rights reserved.
4
+
5
+ Permission<|tool▁call▁begin|>implemented in the Software without restriction, including without limitation the rights
6
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ copies of the Software, and to permit persons to whom the Software is furnished
8
+ to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in all
11
+ copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19
+ SOFTWARE.*/
20
+ import { describe, it, expect } from "vitest";
21
+ import { createStructBuffer } from "./create-struct-buffer.js";
22
+ import { F32Schema } from "../schema/f32.js";
23
+ describe("createStructBuffer", () => {
24
+ // Helper function to create vec3 schema
25
+ const Vec3Schema = {
26
+ type: "array",
27
+ items: { type: "number", precision: 1 },
28
+ minItems: 3,
29
+ maxItems: 3
30
+ };
31
+ // Helper function to create vec4 schema
32
+ const Vec4Schema = {
33
+ type: "array",
34
+ items: { type: "number", precision: 1 },
35
+ minItems: 4,
36
+ maxItems: 4
37
+ };
38
+ describe("std140 layout (default)", () => {
39
+ it("should create buffer with std140 layout by default", () => {
40
+ const schema = {
41
+ type: "object",
42
+ properties: {
43
+ position: Vec3Schema,
44
+ color: Vec4Schema
45
+ }
46
+ };
47
+ const buffer = createStructBuffer(schema, 1);
48
+ // Should use std140 layout (32 bytes: 16 + 16)
49
+ expect(buffer.capacity).toBe(1);
50
+ expect(buffer.type).toBe("struct");
51
+ expect(buffer.typedArrayElementSizeInBytes).toBe(32); // vec3 padded to vec4 + vec4
52
+ });
53
+ it("should explicitly accept std140 layout parameter", () => {
54
+ const schema = {
55
+ type: "object",
56
+ properties: {
57
+ position: Vec3Schema,
58
+ scale: F32Schema
59
+ }
60
+ };
61
+ const buffer = createStructBuffer(schema, 1);
62
+ // vec3 (16 bytes padded) + f32 (4 bytes) = 20 bytes, rounded to vec4 = 20 bytes
63
+ expect(buffer.typedArrayElementSizeInBytes).toBeGreaterThanOrEqual(16);
64
+ });
65
+ it("should work with arrayBuffer parameter", () => {
66
+ const schema = {
67
+ type: "object",
68
+ properties: {
69
+ a: F32Schema,
70
+ b: F32Schema
71
+ }
72
+ };
73
+ const arrayBuffer = new ArrayBuffer(32); // 2 * 16 bytes for std140
74
+ const buffer = createStructBuffer(schema, arrayBuffer);
75
+ expect(buffer.capacity).toBe(2); // 32 bytes / 16 bytes per element
76
+ });
77
+ });
78
+ describe("packed layout", () => {
79
+ it("should create buffer with packed layout", () => {
80
+ const schema = {
81
+ type: "object",
82
+ properties: {
83
+ position: Vec3Schema, // 12 bytes
84
+ color: Vec4Schema // 16 bytes
85
+ },
86
+ layout: "packed"
87
+ };
88
+ const buffer = createStructBuffer(schema, 1);
89
+ // Packed layout: 12 + 16 = 28 bytes
90
+ expect(buffer.type).toBe("struct");
91
+ expect(buffer.typedArrayElementSizeInBytes).toBe(28);
92
+ expect(buffer.capacity).toBe(1);
93
+ });
94
+ it("should show memory efficiency difference", () => {
95
+ const std140Schema = {
96
+ type: "object",
97
+ properties: {
98
+ position: Vec3Schema, // 12 bytes
99
+ normal: Vec3Schema // 12 bytes
100
+ },
101
+ layout: "std140"
102
+ };
103
+ const packedSchema = {
104
+ type: "object",
105
+ properties: {
106
+ position: Vec3Schema, // 12 bytes
107
+ normal: Vec3Schema // 12 bytes
108
+ },
109
+ layout: "packed"
110
+ };
111
+ const std140Buffer = createStructBuffer(std140Schema, 100);
112
+ const packedBuffer = createStructBuffer(packedSchema, 100);
113
+ // std140: 2 * 16 bytes = 32 bytes per element
114
+ // packed: 12 + 12 = 24 bytes per element
115
+ expect(packedBuffer.typedArrayElementSizeInBytes).toBeLessThan(std140Buffer.typedArrayElementSizeInBytes);
116
+ expect(packedBuffer.typedArrayElementSizeInBytes).toBe(24);
117
+ expect(std140Buffer.typedArrayElementSizeInBytes).toBe(32);
118
+ });
119
+ it("should work with primitive fields in packed layout", () => {
120
+ const schema = {
121
+ type: "object",
122
+ properties: {
123
+ id: { type: "integer", minimum: 0, maximum: 65535 }, // u32: 4 bytes
124
+ weight: F32Schema
125
+ },
126
+ layout: "packed"
127
+ };
128
+ const buffer = createStructBuffer(schema, 2);
129
+ // Packed: 4 + 4 = 8 bytes per element
130
+ expect(buffer.typedArrayElementSizeInBytes).toBe(8);
131
+ expect(buffer.capacity).toBe(2);
132
+ });
133
+ it("should work with arrayBuffer parameter for packed layout", () => {
134
+ const schema = {
135
+ type: "object",
136
+ properties: {
137
+ position: Vec3Schema, // 12 bytes
138
+ scale: F32Schema // 4 bytes
139
+ },
140
+ layout: "packed"
141
+ };
142
+ const arrayBuffer = new ArrayBuffer(96); // 6 * 16 bytes
143
+ const buffer = createStructBuffer(schema, arrayBuffer);
144
+ // Packed size: 16 bytes per element, so capacity should be 6
145
+ expect(buffer.capacity).toBe(6);
146
+ });
147
+ });
148
+ describe("type safety", () => {
149
+ it("should accept Layout type for enhanced type safety", () => {
150
+ const schema = {
151
+ type: "object",
152
+ properties: {
153
+ value: F32Schema
154
+ }
155
+ };
156
+ // Demonstrate Layout type usage
157
+ const layouts = ["std140", "packed"];
158
+ layouts.forEach(layout => {
159
+ const schemaWithLayout = { ...schema, layout };
160
+ const buffer = createStructBuffer(schemaWithLayout, 1);
161
+ expect(buffer.type).toBe("struct");
162
+ });
163
+ // Type safety: This would cause a TypeScript error:
164
+ // const invalidLayout = "invalid" as Layout; // Expected error
165
+ // const buffer = createStructBuffer(schema, 1, invalidLayout);
166
+ });
167
+ });
168
+ describe("backwards compatibility", () => {
169
+ it("should default to std140 layout when no layout specified", () => {
170
+ const schema = {
171
+ type: "object",
172
+ properties: {
173
+ a: F32Schema,
174
+ b: F32Schema
175
+ }
176
+ };
177
+ const buffer = createStructBuffer(schema, 1);
178
+ // Should default to std140 (padded to vec4 = 16 bytes)
179
+ expect(buffer.typedArrayElementSizeInBytes).toBe(16);
180
+ });
181
+ it("should work with existing function signatures", () => {
182
+ const schema = {
183
+ type: "object",
184
+ properties: {
185
+ value: F32Schema
186
+ }
187
+ };
188
+ // Test both function signature forms
189
+ const buffer1 = createStructBuffer(schema, 5);
190
+ const buffer2 = createStructBuffer(schema, new ArrayBuffer(80)); // 5 * 16 bytes
191
+ expect(buffer1.capacity).toBe(5);
192
+ expect(buffer2.capacity).toBe(5);
193
+ });
194
+ });
195
+ describe("vertex buffer use case", () => {
196
+ it("should be optimized for vertex data with packed layout", () => {
197
+ // Typical vertex format: position + color
198
+ const std140VertexSchema = {
199
+ type: "object",
200
+ properties: {
201
+ position: Vec3Schema, // 12 bytes for tight vertex packing
202
+ color: Vec4Schema // 16 bytes
203
+ },
204
+ layout: "std140"
205
+ };
206
+ const packedVertexSchema = {
207
+ type: "object",
208
+ properties: {
209
+ position: Vec3Schema, // 12 bytes for tight vertex packing
210
+ color: Vec4Schema // 16 bytes
211
+ },
212
+ layout: "packed"
213
+ };
214
+ const std140VertexBuffer = createStructBuffer(std140VertexSchema, 1000);
215
+ const packedVertexBuffer = createStructBuffer(packedVertexSchema, 1000);
216
+ // Calculate memory usage
217
+ const std140Memory = std140VertexBuffer.capacity * std140VertexBuffer.typedArrayElementSizeInBytes;
218
+ const packedMemory = packedVertexBuffer.capacity * packedVertexBuffer.typedArrayElementSizeInBytes;
219
+ // Packed should use less memory
220
+ expect(packedMemory).toBeLessThan(std140Memory);
221
+ // Verify the difference is sensible (12.5% reduction for vec3 + vec4)
222
+ const memorySavings = (std140Memory - packedMemory) / std140Memory;
223
+ expect(memorySavings).toBeCloseTo(0.125, 2); // 12.5% savings
224
+ });
225
+ });
226
+ });
227
+ //# sourceMappingURL=create-struct-buffer.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-struct-buffer.test.js","sourceRoot":"","sources":["../../src/typed-buffer/create-struct-buffer.test.ts"],"names":[],"mappings":"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"}
@@ -20,7 +20,9 @@ function createTypedBufferInternal(schema, initialCapacity) {
20
20
  if (schema.type === 'number' || schema.type === 'integer') {
21
21
  return createNumberBuffer(schema, initialCapacity);
22
22
  }
23
- const structLayout = getStructLayout(schema, false);
23
+ // If schema has layout property, it should be treated as a struct layout
24
+ const shouldBeStruct = schema.layout !== undefined;
25
+ const structLayout = getStructLayout(schema, shouldBeStruct);
24
26
  if (structLayout) {
25
27
  return createStructBuffer(schema, initialCapacity);
26
28
  }
@@ -1 +1 @@
1
- {"version":3,"file":"create-typed-buffer.js","sourceRoot":"","sources":["../../src/typed-buffer/create-typed-buffer.ts"],"names":[],"mappings":"AAsBA,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAEjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAU7D,MAAM,UAAU,iBAAiB,CAC7B,MAAS,EACT,uBAAkD;IAElD,IAAI,KAAK,CAAC,OAAO,CAAC,uBAAuB,CAAC,EAAE,CAAC;QACzC,MAAM,MAAM,GAAG,yBAAyB,CAAI,MAAM,EAAE,uBAAuB,CAAC,MAAM,CAAC,CAAC;QACpF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,uBAAuB,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtD,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,uBAAuB,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9C,CAAC;QACD,OAAO,MAAM,CAAC;IAClB,CAAC;IACD,OAAO,yBAAyB,CAAI,MAAM,EAAE,uBAAuB,IAAI,EAAE,CAAC,CAAC;AAC/E,CAAC;AAED,SAAS,yBAAyB,CAC9B,MAAS,EACT,eAAuB;IAGvB,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC7B,OAAO,iBAAiB,CAAC,MAAM,EAAE,eAAe,CAA+B,CAAC;IACpF,CAAC;IAED,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QACxD,OAAO,kBAAkB,CAAC,MAAM,EAAE,eAAe,CAA+B,CAAC;IACrF,CAAC;IAED,MAAM,YAAY,GAAG,eAAe,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACpD,IAAI,YAAY,EAAE,CAAC;QACf,OAAO,kBAAkB,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IACvD,CAAC;IAED,OAAO,iBAAiB,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;AACtD,CAAC"}
1
+ {"version":3,"file":"create-typed-buffer.js","sourceRoot":"","sources":["../../src/typed-buffer/create-typed-buffer.ts"],"names":[],"mappings":"AAsBA,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAEjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAU7D,MAAM,UAAU,iBAAiB,CAC7B,MAAS,EACT,uBAAkD;IAElD,IAAI,KAAK,CAAC,OAAO,CAAC,uBAAuB,CAAC,EAAE,CAAC;QACzC,MAAM,MAAM,GAAG,yBAAyB,CAAI,MAAM,EAAE,uBAAuB,CAAC,MAAM,CAAC,CAAC;QACpF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,uBAAuB,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtD,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,uBAAuB,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9C,CAAC;QACD,OAAO,MAAM,CAAC;IAClB,CAAC;IACD,OAAO,yBAAyB,CAAI,MAAM,EAAE,uBAAuB,IAAI,EAAE,CAAC,CAAC;AAC/E,CAAC;AAED,SAAS,yBAAyB,CAC9B,MAAS,EACT,eAAuB;IAGvB,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC7B,OAAO,iBAAiB,CAAC,MAAM,EAAE,eAAe,CAA+B,CAAC;IACpF,CAAC;IAED,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QACxD,OAAO,kBAAkB,CAAC,MAAM,EAAE,eAAe,CAA+B,CAAC;IACrF,CAAC;IAED,yEAAyE;IACzE,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,KAAK,SAAS,CAAC;IACnD,MAAM,YAAY,GAAG,eAAe,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAC7D,IAAI,YAAY,EAAE,CAAC;QACf,OAAO,kBAAkB,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IACvD,CAAC;IAED,OAAO,iBAAiB,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;AACtD,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,148 @@
1
+ /*MIT License
2
+
3
+ © Copyright 2025 Adobe. All rights reserved.
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.*/
22
+ import { describe, it, expect } from "vitest";
23
+ import { createTypedBuffer } from "./create-typed-buffer.js";
24
+ describe("createTypedBuffer", () => {
25
+ describe("layout property runtime validation", () => {
26
+ it("should enforce struct layout when layout property is present", () => {
27
+ // Valid struct schema with layout
28
+ const validStructSchema = {
29
+ type: "object",
30
+ properties: {
31
+ position: {
32
+ type: "array",
33
+ items: { type: "number", precision: 1 },
34
+ minItems: 3,
35
+ maxItems: 3
36
+ },
37
+ color: {
38
+ type: "array",
39
+ items: { type: "number", precision: 1 },
40
+ minItems: 4,
41
+ maxItems: 4
42
+ }
43
+ },
44
+ layout: "packed"
45
+ };
46
+ // Should work fine - this is a valid struct with layout
47
+ const buffer = createTypedBuffer(validStructSchema, 10);
48
+ expect(buffer.type).toBe("struct");
49
+ expect(buffer.capacity).toBe(10);
50
+ });
51
+ it("should throw error for invalid schemas with layout property", () => {
52
+ // Invalid schema: has layout but not a proper struct
53
+ const invalidSchema = {
54
+ type: "array", // Wrong type for layout property
55
+ items: { type: "number" },
56
+ layout: "packed" // This should cause error
57
+ };
58
+ // Should throw error because we're enforcing struct validation
59
+ expect(() => {
60
+ createTypedBuffer(invalidSchema, 10);
61
+ }).toThrow(/Array must have fixed length/);
62
+ });
63
+ it("should throw specific error for invalid array schemas with layout", () => {
64
+ // Array without single item type
65
+ const invalidArraySchema1 = {
66
+ type: "array",
67
+ layout: "packed"
68
+ };
69
+ expect(() => {
70
+ createTypedBuffer(invalidArraySchema1, 10);
71
+ }).toThrow(/Array schema must have single item type/);
72
+ // Array without fixed length
73
+ const invalidArraySchema2 = {
74
+ type: "array",
75
+ items: { type: "number" },
76
+ layout: "packed"
77
+ };
78
+ expect(() => {
79
+ createTypedBuffer(invalidArraySchema2, 10);
80
+ }).toThrow(/Array must have fixed length/);
81
+ });
82
+ it("should throw specific error for invalid object schemas with layout", () => {
83
+ // Object without properties
84
+ const invalidObjectSchema = {
85
+ type: "object",
86
+ layout: "packed"
87
+ };
88
+ expect(() => {
89
+ createTypedBuffer(invalidObjectSchema, 10);
90
+ }).toThrow(/Schema must be an object type with properties definition/);
91
+ // Object with invalid field
92
+ const invalidFieldSchema = {
93
+ type: "object",
94
+ properties: {
95
+ invalidField: { type: "string" } // Not a valid struct type
96
+ },
97
+ layout: "packed"
98
+ };
99
+ expect(() => {
100
+ createTypedBuffer(invalidFieldSchema, 10);
101
+ }).toThrow(/Field "invalidField" is not a valid struct type/);
102
+ });
103
+ it("should work normally for schemas without layout property", () => {
104
+ // Schema without layout should fall back to normal logic
105
+ const arraySchema = {
106
+ type: "array",
107
+ items: { type: "number" }
108
+ };
109
+ const buffer = createTypedBuffer(arraySchema, 10);
110
+ expect(buffer.type).toBe("array");
111
+ expect(buffer.capacity).toBe(10);
112
+ });
113
+ it("should handle number schemas with layout property", () => {
114
+ // Number schema with layout should still validate properly
115
+ const numberSchema = {
116
+ type: "number",
117
+ layout: "packed" // This shouldn't interfere with number creation
118
+ };
119
+ // Number schemas are handled before struct validation
120
+ const buffer = createTypedBuffer(numberSchema, 10);
121
+ expect(buffer.type).toBe("number");
122
+ expect(buffer.capacity).toBe(10);
123
+ });
124
+ });
125
+ describe("basic functionality", () => {
126
+ it("should create typed buffer from capacity", () => {
127
+ const schema = {
128
+ type: "array",
129
+ items: { type: "number" }
130
+ };
131
+ const buffer = createTypedBuffer(schema, 20);
132
+ expect(buffer.capacity).toBe(20);
133
+ });
134
+ it("should create typed buffer from initial values", () => {
135
+ const schema = {
136
+ type: "array",
137
+ items: { type: "number" }
138
+ };
139
+ const initialValues = [[1], [2], [3]];
140
+ const buffer = createTypedBuffer(schema, initialValues);
141
+ expect(buffer.capacity).toBe(3);
142
+ expect(buffer.get(0)).toEqual([1]);
143
+ expect(buffer.get(1)).toEqual([2]);
144
+ expect(buffer.get(2)).toEqual([3]);
145
+ });
146
+ });
147
+ });
148
+ //# sourceMappingURL=create-typed-buffer.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-typed-buffer.test.js","sourceRoot":"","sources":["../../src/typed-buffer/create-typed-buffer.test.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,4 @@
1
1
  import { type Schema } from "../../schema/schema.js";
2
2
  import type { StructLayout } from "./struct-layout.js";
3
3
  export declare function getStructLayout(schema: Schema): StructLayout;
4
- export declare function getStructLayout(schema: Schema, throwError: true): StructLayout;
5
4
  export declare function getStructLayout(schema: Schema, throwError: boolean): StructLayout | null;