@adobe/data 0.9.54 → 0.9.56

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 (134) hide show
  1. package/dist/cache/blob-store.browser.test.d.ts +1 -0
  2. package/dist/cache/blob-store.browser.test.js +122 -0
  3. package/dist/cache/blob-store.browser.test.js.map +1 -0
  4. package/dist/cache/data-cache.browser.test.d.ts +1 -0
  5. package/dist/cache/data-cache.browser.test.js +41 -0
  6. package/dist/cache/data-cache.browser.test.js.map +1 -0
  7. package/dist/cache/expiring-data-cache.browser.test.d.ts +1 -0
  8. package/dist/cache/expiring-data-cache.browser.test.js +42 -0
  9. package/dist/cache/expiring-data-cache.browser.test.js.map +1 -0
  10. package/dist/cache/functions/functions.browser.test.d.ts +1 -0
  11. package/dist/cache/functions/functions.browser.test.js +72 -0
  12. package/dist/cache/functions/functions.browser.test.js.map +1 -0
  13. package/dist/data.d.ts +1 -1
  14. package/dist/ecs/database/public/create-database-scheduler.browser.test.d.ts +1 -0
  15. package/dist/ecs/database/public/create-database-scheduler.browser.test.js +67 -0
  16. package/dist/ecs/database/public/create-database-scheduler.browser.test.js.map +1 -0
  17. package/dist/ecs/database/public/create-database.test.js +5 -1
  18. package/dist/ecs/database/public/create-database.test.js.map +1 -1
  19. package/dist/ecs/database/transactional-store/coalesce-actions.js +15 -41
  20. package/dist/ecs/database/transactional-store/coalesce-actions.js.map +1 -1
  21. package/dist/ecs/database/transactional-store/coalesce-actions.test.js +30 -1
  22. package/dist/ecs/database/transactional-store/coalesce-actions.test.js.map +1 -1
  23. package/dist/ecs/persistence-service/create-storage-persistence-service.browser.test.d.ts +1 -0
  24. package/dist/ecs/persistence-service/create-storage-persistence-service.browser.test.js +52 -0
  25. package/dist/ecs/persistence-service/create-storage-persistence-service.browser.test.js.map +1 -0
  26. package/dist/functions/serialization/serialize-to-storage.browser.test.d.ts +1 -0
  27. package/dist/functions/serialization/serialize-to-storage.browser.test.js +161 -0
  28. package/dist/functions/serialization/serialize-to-storage.browser.test.js.map +1 -0
  29. package/dist/internal/typed-array/get-byte-size.d.ts +1 -1
  30. package/dist/is-data.d.ts +1 -1
  31. package/dist/math/aabb/face/all.d.ts +2 -0
  32. package/dist/math/aabb/face/all.js +10 -0
  33. package/dist/math/aabb/face/all.js.map +1 -0
  34. package/dist/math/aabb/face/face.d.ts +4 -0
  35. package/dist/math/aabb/face/face.js +3 -0
  36. package/dist/math/aabb/face/face.js.map +1 -0
  37. package/dist/math/aabb/face/from-position.d.ts +9 -0
  38. package/dist/math/aabb/face/from-position.js +32 -0
  39. package/dist/math/aabb/face/from-position.js.map +1 -0
  40. package/dist/math/aabb/face/from-position.test.d.ts +1 -0
  41. package/dist/math/aabb/face/from-position.test.js +21 -0
  42. package/dist/math/aabb/face/from-position.test.js.map +1 -0
  43. package/dist/math/aabb/face/get-adjacent.d.ts +3 -0
  44. package/dist/math/aabb/face/get-adjacent.js +24 -0
  45. package/dist/math/aabb/face/get-adjacent.js.map +1 -0
  46. package/dist/math/aabb/face/get-adjacent.test.d.ts +1 -0
  47. package/dist/math/aabb/face/get-adjacent.test.js +27 -0
  48. package/dist/math/aabb/face/get-adjacent.test.js.map +1 -0
  49. package/dist/math/aabb/face/get-faces.d.ts +3 -0
  50. package/dist/math/aabb/face/get-faces.js +11 -0
  51. package/dist/math/aabb/face/get-faces.js.map +1 -0
  52. package/dist/math/aabb/face/get-faces.test.d.ts +1 -0
  53. package/dist/math/aabb/face/get-faces.test.js +16 -0
  54. package/dist/math/aabb/face/get-faces.test.js.map +1 -0
  55. package/dist/math/aabb/face/get-name.d.ts +3 -0
  56. package/dist/math/aabb/face/get-name.js +7 -0
  57. package/dist/math/aabb/face/get-name.js.map +1 -0
  58. package/dist/math/aabb/face/get-name.test.d.ts +1 -0
  59. package/dist/math/aabb/face/get-name.test.js +13 -0
  60. package/dist/math/aabb/face/get-name.test.js.map +1 -0
  61. package/dist/math/aabb/face/get-normal.d.ts +4 -0
  62. package/dist/math/aabb/face/get-normal.js +11 -0
  63. package/dist/math/aabb/face/get-normal.js.map +1 -0
  64. package/dist/math/aabb/face/get-normal.test.d.ts +1 -0
  65. package/dist/math/aabb/face/get-normal.test.js +13 -0
  66. package/dist/math/aabb/face/get-normal.test.js.map +1 -0
  67. package/dist/math/aabb/face/get-opposite.d.ts +3 -0
  68. package/dist/math/aabb/face/get-opposite.js +27 -0
  69. package/dist/math/aabb/face/get-opposite.js.map +1 -0
  70. package/dist/math/aabb/face/get-opposite.test.d.ts +1 -0
  71. package/dist/math/aabb/face/get-opposite.test.js +20 -0
  72. package/dist/math/aabb/face/get-opposite.test.js.map +1 -0
  73. package/dist/math/aabb/face/internals.d.ts +6 -0
  74. package/dist/math/aabb/face/internals.js +34 -0
  75. package/dist/math/aabb/face/internals.js.map +1 -0
  76. package/dist/math/aabb/face/is-adjacent.d.ts +3 -0
  77. package/dist/math/aabb/face/is-adjacent.js +7 -0
  78. package/dist/math/aabb/face/is-adjacent.js.map +1 -0
  79. package/dist/math/aabb/face/is-adjacent.test.d.ts +1 -0
  80. package/dist/math/aabb/face/is-adjacent.test.js +15 -0
  81. package/dist/math/aabb/face/is-adjacent.test.js.map +1 -0
  82. package/dist/math/aabb/face/is-opposite.d.ts +3 -0
  83. package/dist/math/aabb/face/is-opposite.js +7 -0
  84. package/dist/math/aabb/face/is-opposite.js.map +1 -0
  85. package/dist/math/aabb/face/is-opposite.test.d.ts +1 -0
  86. package/dist/math/aabb/face/is-opposite.test.js +15 -0
  87. package/dist/math/aabb/face/is-opposite.test.js.map +1 -0
  88. package/dist/math/aabb/face/neg-x.d.ts +2 -0
  89. package/dist/math/aabb/face/neg-x.js +4 -0
  90. package/dist/math/aabb/face/neg-x.js.map +1 -0
  91. package/dist/math/aabb/face/neg-y.d.ts +2 -0
  92. package/dist/math/aabb/face/neg-y.js +4 -0
  93. package/dist/math/aabb/face/neg-y.js.map +1 -0
  94. package/dist/math/aabb/face/neg-z.d.ts +2 -0
  95. package/dist/math/aabb/face/neg-z.js +4 -0
  96. package/dist/math/aabb/face/neg-z.js.map +1 -0
  97. package/dist/math/aabb/face/none.d.ts +2 -0
  98. package/dist/math/aabb/face/none.js +4 -0
  99. package/dist/math/aabb/face/none.js.map +1 -0
  100. package/dist/math/aabb/face/pos-x.d.ts +2 -0
  101. package/dist/math/aabb/face/pos-x.js +4 -0
  102. package/dist/math/aabb/face/pos-x.js.map +1 -0
  103. package/dist/math/aabb/face/pos-y.d.ts +2 -0
  104. package/dist/math/aabb/face/pos-y.js +4 -0
  105. package/dist/math/aabb/face/pos-y.js.map +1 -0
  106. package/dist/math/aabb/face/pos-z.d.ts +2 -0
  107. package/dist/math/aabb/face/pos-z.js +4 -0
  108. package/dist/math/aabb/face/pos-z.js.map +1 -0
  109. package/dist/math/aabb/face/public.d.ts +16 -1
  110. package/dist/math/aabb/face/public.js +16 -1
  111. package/dist/math/aabb/face/public.js.map +1 -1
  112. package/dist/math/aabb/public.d.ts +1 -1
  113. package/dist/math/aabb/public.js +1 -1
  114. package/dist/math/aabb/public.js.map +1 -1
  115. package/dist/service/agentic-service/action.d.ts +8 -4
  116. package/dist/service/agentic-service/create.d.ts +5 -1
  117. package/dist/service/agentic-service/create.js +1 -1
  118. package/dist/service/agentic-service/create.js.map +1 -1
  119. package/dist/service/agentic-service/create.test.js +1 -1
  120. package/dist/service/agentic-service/create.test.js.map +1 -1
  121. package/dist/service/agentic-service/create.type-test.js +23 -0
  122. package/dist/service/agentic-service/create.type-test.js.map +1 -1
  123. package/dist/service/async-data-service/create-lazy.test.js.map +1 -1
  124. package/dist/service/async-data-service/is-valid.d.ts +1 -1
  125. package/dist/test-setup.d.ts +1 -0
  126. package/dist/test-setup.js +90 -0
  127. package/dist/test-setup.js.map +1 -0
  128. package/dist/tsconfig.tsbuildinfo +1 -1
  129. package/package.json +2 -2
  130. package/references/data-lit/package.json +1 -1
  131. package/references/data-lit-tictactoe/package.json +1 -1
  132. package/references/data-react/package.json +1 -1
  133. package/references/data-react-hello/package.json +1 -1
  134. package/references/data-react-pixie/package.json +1 -1
@@ -0,0 +1,161 @@
1
+ // © 2026 Adobe. MIT License. See /LICENSE for details.
2
+ import { describe, it, expect, vi, beforeEach } from "vitest";
3
+ import { serializeToStorage, deserializeFromStorage } from "./serialize-to-storage.js";
4
+ import { createBlobStore } from "../../cache/blob-store.js";
5
+ describe("serializeToStorage", () => {
6
+ let mockStorage;
7
+ let testBlobStore;
8
+ beforeEach(async () => {
9
+ mockStorage = {
10
+ setItem: vi.fn(),
11
+ getItem: vi.fn(),
12
+ removeItem: vi.fn(),
13
+ clear: vi.fn(),
14
+ length: 0,
15
+ key: vi.fn(),
16
+ };
17
+ testBlobStore = await createBlobStore();
18
+ vi.clearAllMocks();
19
+ });
20
+ it("should serialize data to storage with blob references", async () => {
21
+ const data = {
22
+ message: "hello world",
23
+ numbers: new Uint8Array([1, 2, 3, 4, 5]),
24
+ coordinates: new Float32Array([10.5, 20.3])
25
+ };
26
+ // Use the real blobStore to get actual references
27
+ await serializeToStorage(data, "test-id", mockStorage);
28
+ expect(mockStorage.setItem).toHaveBeenCalledWith("test-id", expect.any(String));
29
+ const storedData = JSON.parse(mockStorage.setItem.mock.calls[0][1]);
30
+ expect(storedData).toHaveProperty("json");
31
+ expect(storedData).toHaveProperty("binary");
32
+ expect(storedData.json).toHaveProperty("localBlobRef");
33
+ expect(storedData.binary).toHaveProperty("localBlobRef");
34
+ });
35
+ it("should use sessionStorage by default", async () => {
36
+ const data = { test: "data" };
37
+ await serializeToStorage(data, "test-id");
38
+ // This test verifies the function doesn't throw when using default storage
39
+ // The actual storage interaction would be with the real sessionStorage
40
+ expect(true).toBe(true); // Placeholder assertion
41
+ });
42
+ });
43
+ describe("deserializeFromStorage", () => {
44
+ let mockStorage;
45
+ let testBlobStore;
46
+ beforeEach(async () => {
47
+ mockStorage = {
48
+ setItem: vi.fn(),
49
+ getItem: vi.fn(),
50
+ removeItem: vi.fn(),
51
+ clear: vi.fn(),
52
+ length: 0,
53
+ key: vi.fn(),
54
+ };
55
+ testBlobStore = await createBlobStore();
56
+ vi.clearAllMocks();
57
+ });
58
+ it("should deserialize data from storage", async () => {
59
+ const originalData = {
60
+ message: "hello world",
61
+ numbers: new Uint8Array([1, 2, 3, 4, 5]),
62
+ coordinates: new Float32Array([10.5, 20.3])
63
+ };
64
+ // First serialize the data to get real blob references
65
+ await serializeToStorage(originalData, "test-id", mockStorage);
66
+ // Get the stored data
67
+ const storedData = JSON.parse(mockStorage.setItem.mock.calls[0][1]);
68
+ // Mock the getItem to return our stored data
69
+ mockStorage.getItem.mockReturnValue(JSON.stringify(storedData));
70
+ const result = await deserializeFromStorage("test-id", mockStorage);
71
+ expect(mockStorage.getItem).toHaveBeenCalledWith("test-id");
72
+ expect(result).not.toBeNull();
73
+ expect(result).toEqual(originalData);
74
+ });
75
+ it("should return null when no data exists", async () => {
76
+ mockStorage.getItem.mockReturnValue(null);
77
+ const result = await deserializeFromStorage("test-id", mockStorage);
78
+ expect(result).toBeNull();
79
+ });
80
+ it("should return null when blob retrieval fails", async () => {
81
+ // Create invalid blob references
82
+ const invalidRefs = {
83
+ json: { localBlobRef: "invalid-hash" },
84
+ binary: { localBlobRef: "invalid-hash" }
85
+ };
86
+ mockStorage.getItem.mockReturnValue(JSON.stringify(invalidRefs));
87
+ const result = await deserializeFromStorage("test-id", mockStorage);
88
+ expect(result).toBeNull();
89
+ });
90
+ it("should use sessionStorage by default", async () => {
91
+ // For this test, we need to mock the real sessionStorage since the function uses it by default
92
+ const originalSessionStorage = globalThis.sessionStorage;
93
+ const mockSessionStorage = {
94
+ getItem: vi.fn().mockReturnValue(null),
95
+ setItem: vi.fn(),
96
+ removeItem: vi.fn(),
97
+ clear: vi.fn(),
98
+ length: 0,
99
+ key: vi.fn(),
100
+ };
101
+ Object.defineProperty(globalThis, 'sessionStorage', {
102
+ value: mockSessionStorage,
103
+ writable: true,
104
+ });
105
+ try {
106
+ await deserializeFromStorage("test-id");
107
+ expect(mockSessionStorage.getItem).toHaveBeenCalledWith("test-id");
108
+ }
109
+ finally {
110
+ Object.defineProperty(globalThis, 'sessionStorage', {
111
+ value: originalSessionStorage,
112
+ writable: true,
113
+ });
114
+ }
115
+ });
116
+ it("should handle complex nested data with all typed arrays", async () => {
117
+ const originalData = {
118
+ user: {
119
+ name: "John Doe",
120
+ scores: new Uint16Array([95, 87, 92, 88]),
121
+ coordinates: new Float32Array([10.5, 20.3, 30.7])
122
+ },
123
+ metadata: {
124
+ timestamp: 1234567890,
125
+ flags: new Uint8Array([1, 0, 1, 1, 0]),
126
+ measurements: new Float64Array([1.23456789, 2.34567890, 3.45678901])
127
+ }
128
+ };
129
+ // First serialize the data to get real blob references
130
+ await serializeToStorage(originalData, "test-id", mockStorage);
131
+ // Get the stored data
132
+ const storedData = JSON.parse(mockStorage.setItem.mock.calls[0][1]);
133
+ // Mock the getItem to return our stored data
134
+ mockStorage.getItem.mockReturnValue(JSON.stringify(storedData));
135
+ const result = await deserializeFromStorage("test-id", mockStorage);
136
+ expect(result).not.toBeNull();
137
+ expect(result).toEqual(originalData);
138
+ });
139
+ it("should handle all supported typed arrays", async () => {
140
+ const originalData = {
141
+ uint8Array: new Uint8Array([1, 2, 3, 4, 5]),
142
+ uint16Array: new Uint16Array([1000, 2000, 3000]),
143
+ uint32Array: new Uint32Array([1000000, 2000000]),
144
+ int8Array: new Int8Array([-1, -2, -3]),
145
+ int16Array: new Int16Array([-1000, -2000]),
146
+ int32Array: new Int32Array([-1000000, -2000000]),
147
+ float32Array: new Float32Array([1.5, 2.5, 3.5]),
148
+ float64Array: new Float64Array([1.123456789, 2.987654321])
149
+ };
150
+ // First serialize the data to get real blob references
151
+ await serializeToStorage(originalData, "test-id", mockStorage);
152
+ // Get the stored data
153
+ const storedData = JSON.parse(mockStorage.setItem.mock.calls[0][1]);
154
+ // Mock the getItem to return our stored data
155
+ mockStorage.getItem.mockReturnValue(JSON.stringify(storedData));
156
+ const result = await deserializeFromStorage("test-id", mockStorage);
157
+ expect(result).not.toBeNull();
158
+ expect(result).toEqual(originalData);
159
+ });
160
+ });
161
+ //# sourceMappingURL=serialize-to-storage.browser.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serialize-to-storage.browser.test.js","sourceRoot":"","sources":["../../../src/functions/serialization/serialize-to-storage.browser.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,2 @@
1
1
  import type { TypedArrayConstructor } from "../../types/typed-array-constructer.js";
2
- export declare const getByteSize: (typedArrayConstructor: TypedArrayConstructor) => 4 | 1 | 2 | 8;
2
+ export declare const getByteSize: (typedArrayConstructor: TypedArrayConstructor) => 1 | 2 | 4 | 8;
package/dist/is-data.d.ts CHANGED
@@ -6,5 +6,5 @@ export type IsFullyReadonly<T> = EqualReadonly<T, Readonly<T>>;
6
6
  export type IsData<T> = [
7
7
  T
8
8
  ] extends [Primitive] ? true : T extends ReadonlyArray<infer U> ? EqualReadonly<T, ReadonlyArray<U>> extends true ? IsData<U> : false : T extends object ? IsFullyReadonly<T> extends true ? {
9
- [K in keyof T]-?: IsData<T[K]>;
9
+ [K in keyof T]-?: IsData<Exclude<T[K], undefined>>;
10
10
  }[keyof T] extends false ? false : true : false : false;
@@ -0,0 +1,2 @@
1
+ /** All six single-face bits */
2
+ export declare const ALL: number;
@@ -0,0 +1,10 @@
1
+ // © 2026 Adobe. MIT License. See /LICENSE for details.
2
+ import { NEG_X } from "./neg-x.js";
3
+ import { NEG_Y } from "./neg-y.js";
4
+ import { NEG_Z } from "./neg-z.js";
5
+ import { POS_X } from "./pos-x.js";
6
+ import { POS_Y } from "./pos-y.js";
7
+ import { POS_Z } from "./pos-z.js";
8
+ /** All six single-face bits */
9
+ export const ALL = POS_Z | POS_X | NEG_Z | NEG_X | POS_Y | NEG_Y;
10
+ //# sourceMappingURL=all.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"all.js","sourceRoot":"","sources":["../../../../src/math/aabb/face/all.ts"],"names":[],"mappings":"AAAA,uDAAuD;AAEvD,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,+BAA+B;AAC/B,MAAM,CAAC,MAAM,GAAG,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { Schema } from "../../../schema/index.js";
2
+ import { schema } from "./schema.js";
3
+ export type Face = Schema.ToType<typeof schema>;
4
+ export * as Face from "./public.js";
@@ -0,0 +1,3 @@
1
+ // © 2026 Adobe. MIT License. See /LICENSE for details.
2
+ export * as Face from "./public.js";
3
+ //# sourceMappingURL=face.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"face.js","sourceRoot":"","sources":["../../../../src/math/aabb/face/face.ts"],"names":[],"mappings":"AAAA,uDAAuD;AAOvD,OAAO,KAAK,IAAI,MAAM,aAAa,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { Vec3 } from "../../vec3/index.js";
2
+ import { Aabb } from "../index.js";
3
+ import type { Face } from "./face.js";
4
+ /**
5
+ * Single-face bit closest to `position` in normalized box space (unit cube centered on origin by default).
6
+ * @param position World position of the sample point
7
+ * @param aabb Bounds used to compute the box center (defaults to unit cube)
8
+ */
9
+ export declare const fromPosition: (position: Vec3, aabb?: Aabb) => Face;
@@ -0,0 +1,32 @@
1
+ // © 2026 Adobe. MIT License. See /LICENSE for details.
2
+ import { Aabb } from "../index.js";
3
+ import { NEG_X } from "./neg-x.js";
4
+ import { NEG_Y } from "./neg-y.js";
5
+ import { NEG_Z } from "./neg-z.js";
6
+ import { POS_X } from "./pos-x.js";
7
+ import { POS_Y } from "./pos-y.js";
8
+ import { POS_Z } from "./pos-z.js";
9
+ /**
10
+ * Single-face bit closest to `position` in normalized box space (unit cube centered on origin by default).
11
+ * @param position World position of the sample point
12
+ * @param aabb Bounds used to compute the box center (defaults to unit cube)
13
+ */
14
+ export const fromPosition = (position, aabb = Aabb.unit) => {
15
+ const aabbCenter = Aabb.center(aabb);
16
+ const localPos = [
17
+ position[0] - aabbCenter[0],
18
+ position[1] - aabbCenter[1],
19
+ position[2] - aabbCenter[2],
20
+ ];
21
+ const absX = Math.abs(localPos[0]);
22
+ const absY = Math.abs(localPos[1]);
23
+ const absZ = Math.abs(localPos[2]);
24
+ if (absX >= absY && absX >= absZ) {
25
+ return localPos[0] > 0 ? POS_X : NEG_X;
26
+ }
27
+ if (absY >= absZ) {
28
+ return localPos[1] > 0 ? POS_Y : NEG_Y;
29
+ }
30
+ return localPos[2] > 0 ? POS_Z : NEG_Z;
31
+ };
32
+ //# sourceMappingURL=from-position.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"from-position.js","sourceRoot":"","sources":["../../../../src/math/aabb/face/from-position.ts"],"names":[],"mappings":"AAAA,uDAAuD;AAGvD,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAEnC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC;;;;GAIG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,QAAc,EAAE,OAAa,IAAI,CAAC,IAAI,EAAQ,EAAE;IACzE,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACrC,MAAM,QAAQ,GAAG;QACb,QAAQ,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC;QAC3B,QAAQ,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC;QAC3B,QAAQ,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC;KAC9B,CAAC;IAEF,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IAEnC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;QAC/B,OAAO,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;IAC3C,CAAC;IACD,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;QACf,OAAO,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;IAC3C,CAAC;IACD,OAAO,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;AAC3C,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,21 @@
1
+ // © 2026 Adobe. MIT License. See /LICENSE for details.
2
+ import { describe, it, expect } from "vitest";
3
+ import { fromPosition } from "./from-position.js";
4
+ import { NEG_X } from "./neg-x.js";
5
+ import { NEG_Y } from "./neg-y.js";
6
+ import { NEG_Z } from "./neg-z.js";
7
+ import { POS_X } from "./pos-x.js";
8
+ import { POS_Y } from "./pos-y.js";
9
+ import { POS_Z } from "./pos-z.js";
10
+ describe("fromPosition", () => {
11
+ it("selects the dominant-axis face on a unit cube", () => {
12
+ const aabb = { min: [-1, -1, -1], max: [1, 1, 1] };
13
+ expect(fromPosition([1, 0, 0], aabb)).toBe(POS_X);
14
+ expect(fromPosition([-1, 0, 0], aabb)).toBe(NEG_X);
15
+ expect(fromPosition([0, 1, 0], aabb)).toBe(POS_Y);
16
+ expect(fromPosition([0, -1, 0], aabb)).toBe(NEG_Y);
17
+ expect(fromPosition([0, 0, 1], aabb)).toBe(POS_Z);
18
+ expect(fromPosition([0, 0, -1], aabb)).toBe(NEG_Z);
19
+ });
20
+ });
21
+ //# sourceMappingURL=from-position.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"from-position.test.js","sourceRoot":"","sources":["../../../../src/math/aabb/face/from-position.test.ts"],"names":[],"mappings":"AAAA,uDAAuD;AAEvD,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC1B,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACrD,MAAM,IAAI,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAU,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAU,EAAE,CAAC;QACrE,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAClD,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnD,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAClD,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnD,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAClD,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Face } from "./face.js";
2
+ /** Single-face bits that share an edge with `face` */
3
+ export declare const getAdjacent: (face: Face) => readonly Face[];
@@ -0,0 +1,24 @@
1
+ // © 2026 Adobe. MIT License. See /LICENSE for details.
2
+ import { NEG_X } from "./neg-x.js";
3
+ import { NEG_Y } from "./neg-y.js";
4
+ import { NEG_Z } from "./neg-z.js";
5
+ import { POS_X } from "./pos-x.js";
6
+ import { POS_Y } from "./pos-y.js";
7
+ import { POS_Z } from "./pos-z.js";
8
+ /** Single-face bits that share an edge with `face` */
9
+ export const getAdjacent = (face) => {
10
+ switch (face) {
11
+ case POS_Z:
12
+ case NEG_Z:
13
+ return [POS_X, NEG_X, POS_Y, NEG_Y];
14
+ case POS_X:
15
+ case NEG_X:
16
+ return [POS_Z, NEG_Z, POS_Y, NEG_Y];
17
+ case POS_Y:
18
+ case NEG_Y:
19
+ return [POS_Z, NEG_Z, POS_X, NEG_X];
20
+ default:
21
+ throw new Error(`Invalid face index: ${face}`);
22
+ }
23
+ };
24
+ //# sourceMappingURL=get-adjacent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-adjacent.js","sourceRoot":"","sources":["../../../../src/math/aabb/face/get-adjacent.ts"],"names":[],"mappings":"AAAA,uDAAuD;AAGvD,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,sDAAsD;AACtD,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,IAAU,EAAmB,EAAE;IACvD,QAAQ,IAAI,EAAE,CAAC;QACX,KAAK,KAAK,CAAC;QACX,KAAK,KAAK;YACN,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QACxC,KAAK,KAAK,CAAC;QACX,KAAK,KAAK;YACN,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QACxC,KAAK,KAAK,CAAC;QACX,KAAK,KAAK;YACN,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QACxC;YACI,MAAM,IAAI,KAAK,CAAC,uBAAuB,IAAI,EAAE,CAAC,CAAC;IACvD,CAAC;AACL,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,27 @@
1
+ // © 2026 Adobe. MIT License. See /LICENSE for details.
2
+ import { describe, it, expect } from "vitest";
3
+ import { getAdjacent } from "./get-adjacent.js";
4
+ import { NEG_X } from "./neg-x.js";
5
+ import { NEG_Y } from "./neg-y.js";
6
+ import { NEG_Z } from "./neg-z.js";
7
+ import { POS_X } from "./pos-x.js";
8
+ import { POS_Y } from "./pos-y.js";
9
+ import { POS_Z } from "./pos-z.js";
10
+ describe("getAdjacent", () => {
11
+ it("returns four edge neighbors for ±Z", () => {
12
+ expect(getAdjacent(POS_Z)).toEqual([POS_X, NEG_X, POS_Y, NEG_Y]);
13
+ expect(getAdjacent(NEG_Z)).toEqual([POS_X, NEG_X, POS_Y, NEG_Y]);
14
+ });
15
+ it("returns four edge neighbors for ±X", () => {
16
+ expect(getAdjacent(POS_X)).toEqual([POS_Z, NEG_Z, POS_Y, NEG_Y]);
17
+ expect(getAdjacent(NEG_X)).toEqual([POS_Z, NEG_Z, POS_Y, NEG_Y]);
18
+ });
19
+ it("returns four edge neighbors for ±Y", () => {
20
+ expect(getAdjacent(POS_Y)).toEqual([POS_Z, NEG_Z, POS_X, NEG_X]);
21
+ expect(getAdjacent(NEG_Y)).toEqual([POS_Z, NEG_Z, POS_X, NEG_X]);
22
+ });
23
+ it("throws for invalid face index", () => {
24
+ expect(() => getAdjacent(6)).toThrow("Invalid face index: 6");
25
+ });
26
+ });
27
+ //# sourceMappingURL=get-adjacent.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-adjacent.test.js","sourceRoot":"","sources":["../../../../src/math/aabb/face/get-adjacent.test.ts"],"names":[],"mappings":"AAAA,uDAAuD;AAEvD,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IACzB,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC1C,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;QACjE,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC1C,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;QACjE,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC1C,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;QACjE,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACrC,MAAM,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,CAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Face } from "./face.js";
2
+ /** Yields each single-face bit set in `face` */
3
+ export declare function getFaces(face: Face): IterableIterator<Face>;
@@ -0,0 +1,11 @@
1
+ // © 2026 Adobe. MIT License. See /LICENSE for details.
2
+ import { FACES } from "./internals.js";
3
+ /** Yields each single-face bit set in `face` */
4
+ export function* getFaces(face) {
5
+ for (const f of FACES) {
6
+ if (face & f) {
7
+ yield f;
8
+ }
9
+ }
10
+ }
11
+ //# sourceMappingURL=get-faces.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-faces.js","sourceRoot":"","sources":["../../../../src/math/aabb/face/get-faces.ts"],"names":[],"mappings":"AAAA,uDAAuD;AAGvD,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAEvC,gDAAgD;AAChD,MAAM,SAAS,CAAC,CAAC,QAAQ,CAAC,IAAU;IAChC,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACpB,IAAI,IAAI,GAAG,CAAC,EAAE,CAAC;YACX,MAAM,CAAC,CAAC;QACZ,CAAC;IACL,CAAC;AACL,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,16 @@
1
+ // © 2026 Adobe. MIT License. See /LICENSE for details.
2
+ import { describe, it, expect } from "vitest";
3
+ import { getFaces } from "./get-faces.js";
4
+ import { NEG_X } from "./neg-x.js";
5
+ import { POS_X } from "./pos-x.js";
6
+ import { POS_Z } from "./pos-z.js";
7
+ describe("getFaces", () => {
8
+ it("yields each set single-face bit", () => {
9
+ const mask = POS_Z | POS_X;
10
+ expect([...getFaces(mask)]).toEqual([POS_Z, POS_X]);
11
+ });
12
+ it("yields NEG_X when only that bit is set", () => {
13
+ expect([...getFaces(NEG_X)]).toEqual([NEG_X]);
14
+ });
15
+ });
16
+ //# sourceMappingURL=get-faces.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-faces.test.js","sourceRoot":"","sources":["../../../../src/math/aabb/face/get-faces.test.ts"],"names":[],"mappings":"AAAA,uDAAuD;AAEvD,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;IACtB,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACvC,MAAM,IAAI,GAAG,KAAK,GAAG,KAAK,CAAC;QAC3B,MAAM,CAAC,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAC9C,MAAM,CAAC,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Face } from "./face.js";
2
+ /** AABB face direction name for debugging/logging */
3
+ export declare const getName: (face: Face) => string;
@@ -0,0 +1,7 @@
1
+ // © 2026 Adobe. MIT License. See /LICENSE for details.
2
+ import { FACE_NAMES } from "./internals.js";
3
+ /** AABB face direction name for debugging/logging */
4
+ export const getName = (face) => {
5
+ return FACE_NAMES.get(face) ?? `Unknown(${face})`;
6
+ };
7
+ //# sourceMappingURL=get-name.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-name.js","sourceRoot":"","sources":["../../../../src/math/aabb/face/get-name.ts"],"names":[],"mappings":"AAAA,uDAAuD;AAGvD,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE5C,qDAAqD;AACrD,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,IAAU,EAAU,EAAE;IAC1C,OAAO,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,WAAW,IAAI,GAAG,CAAC;AACtD,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,13 @@
1
+ // © 2026 Adobe. MIT License. See /LICENSE for details.
2
+ import { describe, it, expect } from "vitest";
3
+ import { getName } from "./get-name.js";
4
+ import { POS_Z } from "./pos-z.js";
5
+ describe("getName", () => {
6
+ it("returns label for known face bit", () => {
7
+ expect(getName(POS_Z)).toBe("POS_Z");
8
+ });
9
+ it("returns unknown placeholder for invalid value", () => {
10
+ expect(getName(99)).toBe("Unknown(99)");
11
+ });
12
+ });
13
+ //# sourceMappingURL=get-name.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-name.test.js","sourceRoot":"","sources":["../../../../src/math/aabb/face/get-name.test.ts"],"names":[],"mappings":"AAAA,uDAAuD;AAEvD,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE;IACrB,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QACxC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACrD,MAAM,CAAC,OAAO,CAAC,EAAS,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { Vec3 } from "../../vec3/index.js";
2
+ import type { Face } from "./face.js";
3
+ /** Outward unit normal for a single-face bit */
4
+ export declare const getNormal: (face: Face) => Vec3;
@@ -0,0 +1,11 @@
1
+ // © 2026 Adobe. MIT License. See /LICENSE for details.
2
+ import { FACE_NORMALS } from "./internals.js";
3
+ /** Outward unit normal for a single-face bit */
4
+ export const getNormal = (face) => {
5
+ const normal = FACE_NORMALS.get(face);
6
+ if (normal === undefined) {
7
+ throw new Error(`Invalid face index: ${face}`);
8
+ }
9
+ return normal;
10
+ };
11
+ //# sourceMappingURL=get-normal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-normal.js","sourceRoot":"","sources":["../../../../src/math/aabb/face/get-normal.ts"],"names":[],"mappings":"AAAA,uDAAuD;AAIvD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,gDAAgD;AAChD,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,IAAU,EAAQ,EAAE;IAC1C,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACtC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,uBAAuB,IAAI,EAAE,CAAC,CAAC;IACnD,CAAC;IACD,OAAO,MAAM,CAAC;AAClB,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,13 @@
1
+ // © 2026 Adobe. MIT License. See /LICENSE for details.
2
+ import { describe, it, expect } from "vitest";
3
+ import { getNormal } from "./get-normal.js";
4
+ import { POS_Z } from "./pos-z.js";
5
+ describe("getNormal", () => {
6
+ it("returns outward unit normal for a valid face", () => {
7
+ expect(getNormal(POS_Z)).toEqual([0, 0, 1]);
8
+ });
9
+ it("throws for invalid face index", () => {
10
+ expect(() => getNormal(6)).toThrow("Invalid face index: 6");
11
+ });
12
+ });
13
+ //# sourceMappingURL=get-normal.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-normal.test.js","sourceRoot":"","sources":["../../../../src/math/aabb/face/get-normal.test.ts"],"names":[],"mappings":"AAAA,uDAAuD;AAEvD,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IACvB,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACpD,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACrC,MAAM,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Face } from "./face.js";
2
+ /** Opposite single-face bit */
3
+ export declare const getOpposite: (face: Face) => Face;
@@ -0,0 +1,27 @@
1
+ // © 2026 Adobe. MIT License. See /LICENSE for details.
2
+ import { NEG_X } from "./neg-x.js";
3
+ import { NEG_Y } from "./neg-y.js";
4
+ import { NEG_Z } from "./neg-z.js";
5
+ import { POS_X } from "./pos-x.js";
6
+ import { POS_Y } from "./pos-y.js";
7
+ import { POS_Z } from "./pos-z.js";
8
+ /** Opposite single-face bit */
9
+ export const getOpposite = (face) => {
10
+ switch (face) {
11
+ case POS_Z:
12
+ return NEG_Z;
13
+ case NEG_Z:
14
+ return POS_Z;
15
+ case POS_X:
16
+ return NEG_X;
17
+ case NEG_X:
18
+ return POS_X;
19
+ case POS_Y:
20
+ return NEG_Y;
21
+ case NEG_Y:
22
+ return POS_Y;
23
+ default:
24
+ throw new Error(`Invalid face index: ${face}`);
25
+ }
26
+ };
27
+ //# sourceMappingURL=get-opposite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-opposite.js","sourceRoot":"","sources":["../../../../src/math/aabb/face/get-opposite.ts"],"names":[],"mappings":"AAAA,uDAAuD;AAGvD,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,+BAA+B;AAC/B,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,IAAU,EAAQ,EAAE;IAC5C,QAAQ,IAAI,EAAE,CAAC;QACX,KAAK,KAAK;YACN,OAAO,KAAK,CAAC;QACjB,KAAK,KAAK;YACN,OAAO,KAAK,CAAC;QACjB,KAAK,KAAK;YACN,OAAO,KAAK,CAAC;QACjB,KAAK,KAAK;YACN,OAAO,KAAK,CAAC;QACjB,KAAK,KAAK;YACN,OAAO,KAAK,CAAC;QACjB,KAAK,KAAK;YACN,OAAO,KAAK,CAAC;QACjB;YACI,MAAM,IAAI,KAAK,CAAC,uBAAuB,IAAI,EAAE,CAAC,CAAC;IACvD,CAAC;AACL,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,20 @@
1
+ // © 2026 Adobe. MIT License. See /LICENSE for details.
2
+ import { describe, it, expect } from "vitest";
3
+ import { getOpposite } from "./get-opposite.js";
4
+ import { NEG_X } from "./neg-x.js";
5
+ import { NEG_Y } from "./neg-y.js";
6
+ import { NEG_Z } from "./neg-z.js";
7
+ import { POS_X } from "./pos-x.js";
8
+ import { POS_Y } from "./pos-y.js";
9
+ import { POS_Z } from "./pos-z.js";
10
+ describe("getOpposite", () => {
11
+ it("maps each axis to its opposite", () => {
12
+ expect(getOpposite(POS_Z)).toBe(NEG_Z);
13
+ expect(getOpposite(POS_X)).toBe(NEG_X);
14
+ expect(getOpposite(POS_Y)).toBe(NEG_Y);
15
+ });
16
+ it("throws for invalid face index", () => {
17
+ expect(() => getOpposite(6)).toThrow("Invalid face index: 6");
18
+ });
19
+ });
20
+ //# sourceMappingURL=get-opposite.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-opposite.test.js","sourceRoot":"","sources":["../../../../src/math/aabb/face/get-opposite.test.ts"],"names":[],"mappings":"AAAA,uDAAuD;AAEvD,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IACzB,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACtC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACrC,MAAM,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,CAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
@@ -0,0 +1,6 @@
1
+ /** Ordered single-face bits for iteration */
2
+ export declare const FACES: readonly [number, number, number, number, number, number];
3
+ /** Outward unit normal per single-face bit */
4
+ export declare const FACE_NORMALS: Map<number, readonly [number, number, number]>;
5
+ /** Debug labels per single-face bit */
6
+ export declare const FACE_NAMES: Map<number, string>;
@@ -0,0 +1,34 @@
1
+ // © 2026 Adobe. MIT License. See /LICENSE for details.
2
+ import { NEG_X } from "./neg-x.js";
3
+ import { NEG_Y } from "./neg-y.js";
4
+ import { NEG_Z } from "./neg-z.js";
5
+ import { POS_X } from "./pos-x.js";
6
+ import { POS_Y } from "./pos-y.js";
7
+ import { POS_Z } from "./pos-z.js";
8
+ /** Ordered single-face bits for iteration */
9
+ export const FACES = [POS_Z, POS_X, NEG_Z, NEG_X, POS_Y, NEG_Y];
10
+ const NORMAL_POS_Z = [0, 0, 1];
11
+ const NORMAL_NEG_Z = [0, 0, -1];
12
+ const NORMAL_POS_X = [1, 0, 0];
13
+ const NORMAL_NEG_X = [-1, 0, 0];
14
+ const NORMAL_POS_Y = [0, 1, 0];
15
+ const NORMAL_NEG_Y = [0, -1, 0];
16
+ /** Outward unit normal per single-face bit */
17
+ export const FACE_NORMALS = new Map([
18
+ [POS_Z, NORMAL_POS_Z],
19
+ [NEG_Z, NORMAL_NEG_Z],
20
+ [POS_X, NORMAL_POS_X],
21
+ [NEG_X, NORMAL_NEG_X],
22
+ [POS_Y, NORMAL_POS_Y],
23
+ [NEG_Y, NORMAL_NEG_Y],
24
+ ]);
25
+ /** Debug labels per single-face bit */
26
+ export const FACE_NAMES = new Map([
27
+ [POS_Z, "POS_Z"],
28
+ [POS_X, "POS_X"],
29
+ [NEG_Z, "NEG_Z"],
30
+ [NEG_X, "NEG_X"],
31
+ [POS_Y, "POS_Y"],
32
+ [NEG_Y, "NEG_Y"],
33
+ ]);
34
+ //# sourceMappingURL=internals.js.map