mathbox-react 0.0.0-a53eb3e
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.
- package/README.md +30 -0
- package/build/cjs/components/ContainedMathbox.d.ts +11 -0
- package/build/cjs/components/ContainedMathbox.js +59 -0
- package/build/cjs/components/ContainedMathbox.js.map +1 -0
- package/build/cjs/components/Mathbox.d.ts +9 -0
- package/build/cjs/components/Mathbox.js +87 -0
- package/build/cjs/components/Mathbox.js.map +1 -0
- package/build/cjs/components/MathboxAPIContext.d.ts +9 -0
- package/build/cjs/components/MathboxAPIContext.js +18 -0
- package/build/cjs/components/MathboxAPIContext.js.map +1 -0
- package/build/cjs/components/components.d.ts +267 -0
- package/build/cjs/components/components.js +383 -0
- package/build/cjs/components/components.js.map +1 -0
- package/build/cjs/components/components.spec.d.ts +1 -0
- package/build/cjs/components/components.spec.js +332 -0
- package/build/cjs/components/components.spec.js.map +1 -0
- package/build/cjs/components/index.d.ts +4 -0
- package/build/cjs/components/index.js +28 -0
- package/build/cjs/components/index.js.map +1 -0
- package/build/cjs/components/types.d.ts +7 -0
- package/build/cjs/components/types.js +3 -0
- package/build/cjs/components/types.js.map +1 -0
- package/build/cjs/components/util.d.ts +38 -0
- package/build/cjs/components/util.js +107 -0
- package/build/cjs/components/util.js.map +1 -0
- package/build/cjs/index.d.ts +3 -0
- package/build/cjs/index.js +33 -0
- package/build/cjs/index.js.map +1 -0
- package/build/cjs/stories/Area.stories.d.ts +68 -0
- package/build/cjs/stories/Area.stories.js +53 -0
- package/build/cjs/stories/Area.stories.js.map +1 -0
- package/build/cjs/stories/Cartesian.stories.d.ts +34 -0
- package/build/cjs/stories/Cartesian.stories.js +47 -0
- package/build/cjs/stories/Cartesian.stories.js.map +1 -0
- package/build/cjs/stories/Grid.stories.d.ts +262 -0
- package/build/cjs/stories/Grid.stories.js +45 -0
- package/build/cjs/stories/Grid.stories.js.map +1 -0
- package/build/cjs/stories/Mathbox.stories.d.ts +18 -0
- package/build/cjs/stories/Mathbox.stories.js +16 -0
- package/build/cjs/stories/Mathbox.stories.js.map +1 -0
- package/build/cjs/stories/Play.stories.d.ts +36 -0
- package/build/cjs/stories/Play.stories.js +35 -0
- package/build/cjs/stories/Play.stories.js.map +1 -0
- package/build/cjs/stories/Point.stories.d.ts +101 -0
- package/build/cjs/stories/Point.stories.js +103 -0
- package/build/cjs/stories/Point.stories.js.map +1 -0
- package/build/cjs/stories/Surface.stories.d.ts +68 -0
- package/build/cjs/stories/Surface.stories.js +49 -0
- package/build/cjs/stories/Surface.stories.js.map +1 -0
- package/build/cjs/stories/utils.d.ts +5 -0
- package/build/cjs/stories/utils.js +69 -0
- package/build/cjs/stories/utils.js.map +1 -0
- package/build/cjs/testSetup.d.ts +1 -0
- package/build/cjs/testSetup.js +5 -0
- package/build/cjs/testSetup.js.map +1 -0
- package/build/cjs/testUtils.d.ts +1 -0
- package/build/cjs/testUtils.js +47 -0
- package/build/cjs/testUtils.js.map +1 -0
- package/build/cjs/threestrap/Controls.d.ts +21 -0
- package/build/cjs/threestrap/Controls.js +75 -0
- package/build/cjs/threestrap/Controls.js.map +1 -0
- package/build/cjs/threestrap/Renderer.d.ts +7 -0
- package/build/cjs/threestrap/Renderer.js +15 -0
- package/build/cjs/threestrap/Renderer.js.map +1 -0
- package/build/cjs/threestrap/ThreestrapContext.d.ts +6 -0
- package/build/cjs/threestrap/ThreestrapContext.js +15 -0
- package/build/cjs/threestrap/ThreestrapContext.js.map +1 -0
- package/build/cjs/threestrap/index.d.ts +4 -0
- package/build/cjs/threestrap/index.js +13 -0
- package/build/cjs/threestrap/index.js.map +1 -0
- package/build/cjs/threestrap/threestrap.d.ts +13 -0
- package/build/cjs/threestrap/threestrap.js +3 -0
- package/build/cjs/threestrap/threestrap.js.map +1 -0
- package/build/esm/components/ContainedMathbox.d.ts +11 -0
- package/build/esm/components/ContainedMathbox.js +31 -0
- package/build/esm/components/ContainedMathbox.js.map +1 -0
- package/build/esm/components/Mathbox.d.ts +9 -0
- package/build/esm/components/Mathbox.js +59 -0
- package/build/esm/components/Mathbox.js.map +1 -0
- package/build/esm/components/MathboxAPIContext.d.ts +9 -0
- package/build/esm/components/MathboxAPIContext.js +15 -0
- package/build/esm/components/MathboxAPIContext.js.map +1 -0
- package/build/esm/components/components.d.ts +267 -0
- package/build/esm/components/components.js +353 -0
- package/build/esm/components/components.js.map +1 -0
- package/build/esm/components/components.spec.d.ts +1 -0
- package/build/esm/components/components.spec.js +304 -0
- package/build/esm/components/components.spec.js.map +1 -0
- package/build/esm/components/index.d.ts +4 -0
- package/build/esm/components/index.js +5 -0
- package/build/esm/components/index.js.map +1 -0
- package/build/esm/components/types.d.ts +7 -0
- package/build/esm/components/types.js +2 -0
- package/build/esm/components/types.js.map +1 -0
- package/build/esm/components/util.d.ts +38 -0
- package/build/esm/components/util.js +96 -0
- package/build/esm/components/util.js.map +1 -0
- package/build/esm/index.d.ts +3 -0
- package/build/esm/index.js +4 -0
- package/build/esm/index.js.map +1 -0
- package/build/esm/testSetup.d.ts +1 -0
- package/build/esm/testSetup.js +3 -0
- package/build/esm/testSetup.js.map +1 -0
- package/build/esm/testUtils.d.ts +1 -0
- package/build/esm/testUtils.js +43 -0
- package/build/esm/testUtils.js.map +1 -0
- package/build/esm/threestrap/Controls.d.ts +21 -0
- package/build/esm/threestrap/Controls.js +73 -0
- package/build/esm/threestrap/Controls.js.map +1 -0
- package/build/esm/threestrap/Renderer.d.ts +7 -0
- package/build/esm/threestrap/Renderer.js +13 -0
- package/build/esm/threestrap/Renderer.js.map +1 -0
- package/build/esm/threestrap/ThreestrapContext.d.ts +6 -0
- package/build/esm/threestrap/ThreestrapContext.js +12 -0
- package/build/esm/threestrap/ThreestrapContext.js.map +1 -0
- package/build/esm/threestrap/index.d.ts +4 -0
- package/build/esm/threestrap/index.js +4 -0
- package/build/esm/threestrap/index.js.map +1 -0
- package/build/esm/threestrap/threestrap.d.ts +13 -0
- package/build/esm/threestrap/threestrap.js +2 -0
- package/build/esm/threestrap/threestrap.js.map +1 -0
- package/package.json +74 -0
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
var __assign = (this && this.__assign) || function () {
|
|
2
|
+
__assign = Object.assign || function(t) {
|
|
3
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
4
|
+
s = arguments[i];
|
|
5
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
6
|
+
t[p] = s[p];
|
|
7
|
+
}
|
|
8
|
+
return t;
|
|
9
|
+
};
|
|
10
|
+
return __assign.apply(this, arguments);
|
|
11
|
+
};
|
|
12
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
13
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
14
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
15
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
16
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
17
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
18
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
19
|
+
});
|
|
20
|
+
};
|
|
21
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
22
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
23
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
24
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
25
|
+
function step(op) {
|
|
26
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
27
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
28
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
29
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
30
|
+
switch (op[0]) {
|
|
31
|
+
case 0: case 1: t = op; break;
|
|
32
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
33
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
34
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
35
|
+
default:
|
|
36
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
37
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
38
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
39
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
40
|
+
if (t[2]) _.ops.pop();
|
|
41
|
+
_.trys.pop(); continue;
|
|
42
|
+
}
|
|
43
|
+
op = body.call(thisArg, _);
|
|
44
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
45
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
import { describe, it, expect } from "vitest";
|
|
49
|
+
import React, { useState } from "react";
|
|
50
|
+
import { render, act } from "@testing-library/react";
|
|
51
|
+
import ContainedMathbox from "./ContainedMathbox";
|
|
52
|
+
import Mathbox from "./Mathbox";
|
|
53
|
+
import { Cartesian, Grid, Voxel } from "./components";
|
|
54
|
+
function assertNotNil(value) {
|
|
55
|
+
if (value === undefined) {
|
|
56
|
+
throw new Error("Unexpected undefined value");
|
|
57
|
+
}
|
|
58
|
+
if (value === null) {
|
|
59
|
+
throw new Error("Unexpected null value");
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Assert that two mathbox selections have the same nodes in the same order.
|
|
64
|
+
*/
|
|
65
|
+
var assertSelectionsEqual = function (s1, s2) {
|
|
66
|
+
expect(s1.length).toBe(s2.length);
|
|
67
|
+
Array(s1.length)
|
|
68
|
+
.fill(null)
|
|
69
|
+
.forEach(function (_, i) {
|
|
70
|
+
expect(s1[i]).toBe(s2[i]);
|
|
71
|
+
});
|
|
72
|
+
};
|
|
73
|
+
describe("ContainedMathbox", function () {
|
|
74
|
+
it("makes a new mathbox instance only if the options have changed", function () {
|
|
75
|
+
var mbRef = { current: null };
|
|
76
|
+
var rerender = render(React.createElement(ContainedMathbox, { options: {}, ref: mbRef })).rerender;
|
|
77
|
+
var mb0 = mbRef.current;
|
|
78
|
+
assertNotNil(mb0);
|
|
79
|
+
rerender(React.createElement(ContainedMathbox, { options: {}, ref: mbRef }));
|
|
80
|
+
var mb1 = mbRef.current;
|
|
81
|
+
expect(mb1).toBe(mb0);
|
|
82
|
+
assertNotNil(mb1);
|
|
83
|
+
rerender(React.createElement(ContainedMathbox, { options: { plugins: ["core"] }, ref: mbRef }));
|
|
84
|
+
var mb2 = mbRef.current;
|
|
85
|
+
assertNotNil(mb2);
|
|
86
|
+
expect(mb2).not.toBe(mb1);
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
describe("Cartesian", function () {
|
|
90
|
+
it("exposes Mathbox instance via ref", function () {
|
|
91
|
+
var _a, _b;
|
|
92
|
+
var mbRef = { current: null };
|
|
93
|
+
var cartesianRef = { current: null };
|
|
94
|
+
render(React.createElement(ContainedMathbox, { ref: mbRef },
|
|
95
|
+
React.createElement(Cartesian, { ref: cartesianRef })));
|
|
96
|
+
expect((_a = mbRef.current) === null || _a === void 0 ? void 0 : _a[0].type).toBe("root");
|
|
97
|
+
expect((_b = cartesianRef.current) === null || _b === void 0 ? void 0 : _b[0].type).toBe("cartesian");
|
|
98
|
+
});
|
|
99
|
+
it("creates a cartesian instance as child of root", function () {
|
|
100
|
+
var _a;
|
|
101
|
+
var mbRef = { current: null };
|
|
102
|
+
render(React.createElement(ContainedMathbox, { ref: mbRef },
|
|
103
|
+
React.createElement(Cartesian, null)));
|
|
104
|
+
expect((_a = mbRef.current) === null || _a === void 0 ? void 0 : _a.select("cartesian").length).toBe(1);
|
|
105
|
+
});
|
|
106
|
+
it("creates mathbox children as children of itself", function () {
|
|
107
|
+
var _a, _b, _c;
|
|
108
|
+
var mbRef = { current: null };
|
|
109
|
+
render(React.createElement(ContainedMathbox, { ref: mbRef },
|
|
110
|
+
React.createElement(Cartesian, null,
|
|
111
|
+
React.createElement(Grid, null),
|
|
112
|
+
React.createElement(Grid, null))));
|
|
113
|
+
(_a = mbRef.current) === null || _a === void 0 ? void 0 : _a.print();
|
|
114
|
+
expect((_b = mbRef.current) === null || _b === void 0 ? void 0 : _b.select("cartesian").length).toBe(1);
|
|
115
|
+
expect((_c = mbRef.current) === null || _c === void 0 ? void 0 : _c.select("cartesian grid").length).toBe(2);
|
|
116
|
+
});
|
|
117
|
+
it("removes its mathbox instance when unmounted", function () {
|
|
118
|
+
var _a, _b;
|
|
119
|
+
var mbRef = { current: null };
|
|
120
|
+
var rerender = render(React.createElement(ContainedMathbox, { ref: mbRef },
|
|
121
|
+
React.createElement(Cartesian, null))).rerender;
|
|
122
|
+
expect((_a = mbRef.current) === null || _a === void 0 ? void 0 : _a.select("cartesian").length).toBe(1);
|
|
123
|
+
rerender(React.createElement(ContainedMathbox, { ref: mbRef }));
|
|
124
|
+
expect((_b = mbRef.current) === null || _b === void 0 ? void 0 : _b.select("cartesian").length).toBe(0);
|
|
125
|
+
});
|
|
126
|
+
it.each([
|
|
127
|
+
{ props: { visible: true, scale: [3, 2, 1] } },
|
|
128
|
+
{ props: { visible: false, scale: [1, 2, 3] } },
|
|
129
|
+
])("passes appropriate props to its mathbox instance", function (_a) {
|
|
130
|
+
var _b;
|
|
131
|
+
var props = _a.props;
|
|
132
|
+
var mbRef = { current: null };
|
|
133
|
+
render(React.createElement(ContainedMathbox, { ref: mbRef },
|
|
134
|
+
React.createElement(Cartesian, __assign({}, props))));
|
|
135
|
+
var cartesian = (_b = mbRef.current) === null || _b === void 0 ? void 0 : _b.select("cartesian");
|
|
136
|
+
assertNotNil(cartesian);
|
|
137
|
+
expect(cartesian.get("visible")).toBe(props.visible);
|
|
138
|
+
// Mathbox converts scale to a ThreeJS Vec3
|
|
139
|
+
expect(cartesian.get("scale").toArray()).toStrictEqual(props.scale);
|
|
140
|
+
});
|
|
141
|
+
it("updates props on its mathbox instance when rerendered", function () {
|
|
142
|
+
var _a;
|
|
143
|
+
var mbRef = { current: null };
|
|
144
|
+
var rerender = render(React.createElement(ContainedMathbox, { ref: mbRef },
|
|
145
|
+
React.createElement(Cartesian, null))).rerender;
|
|
146
|
+
var cartesian = (_a = mbRef.current) === null || _a === void 0 ? void 0 : _a.select("cartesian");
|
|
147
|
+
assertNotNil(cartesian);
|
|
148
|
+
expect(cartesian.get("visible")).toBe(true);
|
|
149
|
+
rerender(React.createElement(ContainedMathbox, { ref: mbRef },
|
|
150
|
+
React.createElement(Cartesian, { visible: false })));
|
|
151
|
+
expect(cartesian.get("visible")).toBe(false);
|
|
152
|
+
});
|
|
153
|
+
it("updates liveProps on its mathbox instance when rerendered", function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
154
|
+
var mbRef, rerender, grid, w1, w2;
|
|
155
|
+
var _a;
|
|
156
|
+
return __generator(this, function (_b) {
|
|
157
|
+
switch (_b.label) {
|
|
158
|
+
case 0:
|
|
159
|
+
mbRef = { current: null };
|
|
160
|
+
rerender = render(React.createElement(ContainedMathbox, { ref: mbRef },
|
|
161
|
+
React.createElement(Cartesian, null,
|
|
162
|
+
React.createElement(Grid, { liveProps: {
|
|
163
|
+
width: function (t) { return 1 + t; },
|
|
164
|
+
} })))).rerender;
|
|
165
|
+
grid = (_a = mbRef.current) === null || _a === void 0 ? void 0 : _a.select("grid");
|
|
166
|
+
assertNotNil(grid);
|
|
167
|
+
w1 = grid.get("width");
|
|
168
|
+
return [4 /*yield*/, new Promise(function (resolve) {
|
|
169
|
+
setTimeout(resolve, 500);
|
|
170
|
+
})];
|
|
171
|
+
case 1:
|
|
172
|
+
_b.sent();
|
|
173
|
+
w2 = grid.get("width");
|
|
174
|
+
expect(w1).toBe(1);
|
|
175
|
+
// Mathbox uses seconds
|
|
176
|
+
expect(w2 - w1).toBeGreaterThan(0.45);
|
|
177
|
+
expect(w2 - w1).toBeLessThanOrEqual(0.5);
|
|
178
|
+
rerender(React.createElement(ContainedMathbox, { ref: mbRef },
|
|
179
|
+
React.createElement(Cartesian, null,
|
|
180
|
+
React.createElement(Grid, { width: 10 }))));
|
|
181
|
+
expect(grid.get("width")).toBe(10);
|
|
182
|
+
return [2 /*return*/];
|
|
183
|
+
}
|
|
184
|
+
});
|
|
185
|
+
}); });
|
|
186
|
+
it("re-renders inside new instance when root changes", function () {
|
|
187
|
+
var mbRef = { current: null };
|
|
188
|
+
var cartesianRef = { current: null };
|
|
189
|
+
var gridRef = { current: null };
|
|
190
|
+
var options1 = {};
|
|
191
|
+
var rerender = render(React.createElement(ContainedMathbox, { ref: mbRef, options: options1 },
|
|
192
|
+
React.createElement(Cartesian, { ref: cartesianRef },
|
|
193
|
+
React.createElement(Grid, { ref: gridRef })))).rerender;
|
|
194
|
+
var mb1 = mbRef.current;
|
|
195
|
+
var cartesian1 = cartesianRef.current;
|
|
196
|
+
var grid1 = gridRef.current;
|
|
197
|
+
assertNotNil(mb1);
|
|
198
|
+
assertNotNil(cartesian1);
|
|
199
|
+
assertNotNil(grid1);
|
|
200
|
+
expect(cartesian1).toHaveLength(1);
|
|
201
|
+
assertSelectionsEqual(mb1.select("cartesian"), cartesian1);
|
|
202
|
+
expect(grid1).toHaveLength(1);
|
|
203
|
+
assertSelectionsEqual(mb1.select("grid"), grid1);
|
|
204
|
+
/**
|
|
205
|
+
* When re-rendered, this will create a new mathBox since the options
|
|
206
|
+
* object prop will have changed.
|
|
207
|
+
*/
|
|
208
|
+
var options2 = { plugins: ["core"] };
|
|
209
|
+
expect(options1).not.toBe(options2);
|
|
210
|
+
rerender(React.createElement(ContainedMathbox, { ref: mbRef, options: options2 },
|
|
211
|
+
React.createElement(Cartesian, { ref: cartesianRef },
|
|
212
|
+
React.createElement(Grid, { ref: gridRef }))));
|
|
213
|
+
var mb2 = mbRef.current;
|
|
214
|
+
var cartesian2 = cartesianRef.current;
|
|
215
|
+
var grid2 = gridRef.current;
|
|
216
|
+
assertNotNil(mb2);
|
|
217
|
+
assertNotNil(cartesian2);
|
|
218
|
+
assertNotNil(grid2);
|
|
219
|
+
// The options have changed (via deep equal) so a new instance is created
|
|
220
|
+
expect(mb1).not.toBe(mb2);
|
|
221
|
+
expect(cartesian2).toHaveLength(1);
|
|
222
|
+
assertSelectionsEqual(mb2.select("cartesian"), cartesian2);
|
|
223
|
+
expect(grid2).toHaveLength(1);
|
|
224
|
+
assertSelectionsEqual(mb2.select("grid"), grid2);
|
|
225
|
+
});
|
|
226
|
+
it("Can render a new instance without error", function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
227
|
+
var mbRef, containerDiv, setKey, KeyedMathbox;
|
|
228
|
+
return __generator(this, function (_a) {
|
|
229
|
+
mbRef = { current: null };
|
|
230
|
+
containerDiv = null;
|
|
231
|
+
KeyedMathbox = function () {
|
|
232
|
+
var _a = useState(null), container = _a[0], setContainer = _a[1];
|
|
233
|
+
var _b = useState("key-0"), key = _b[0], setKeyState = _b[1];
|
|
234
|
+
setKey = setKeyState;
|
|
235
|
+
containerDiv = container;
|
|
236
|
+
return (React.createElement("div", { ref: setContainer, key: key }, container && (React.createElement(Mathbox, { ref: mbRef, container: container },
|
|
237
|
+
React.createElement(Cartesian, null)))));
|
|
238
|
+
};
|
|
239
|
+
render(React.createElement(KeyedMathbox, null));
|
|
240
|
+
assertNotNil(mbRef.current);
|
|
241
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
242
|
+
act(function () { return setKey("key-2"); });
|
|
243
|
+
assertNotNil(containerDiv);
|
|
244
|
+
expect(mbRef.current.three.element).toBe(containerDiv);
|
|
245
|
+
expect(mbRef.current.select("cartesian").length).toBe(1);
|
|
246
|
+
return [2 /*return*/];
|
|
247
|
+
});
|
|
248
|
+
}); });
|
|
249
|
+
it("Can add and remove children without error", function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
250
|
+
var mbRef, rerender;
|
|
251
|
+
return __generator(this, function (_a) {
|
|
252
|
+
mbRef = { current: null };
|
|
253
|
+
rerender = render(React.createElement(ContainedMathbox, { ref: mbRef, options: {} },
|
|
254
|
+
React.createElement(Cartesian, null,
|
|
255
|
+
React.createElement(Grid, null)))).rerender;
|
|
256
|
+
assertNotNil(mbRef.current);
|
|
257
|
+
expect(mbRef.current.select("grid").length).toBe(1);
|
|
258
|
+
rerender(React.createElement(ContainedMathbox, { ref: mbRef, options: {} },
|
|
259
|
+
React.createElement(Cartesian, null,
|
|
260
|
+
React.createElement(Grid, null),
|
|
261
|
+
React.createElement(Grid, null))));
|
|
262
|
+
assertNotNil(mbRef.current);
|
|
263
|
+
expect(mbRef.current.select("grid").length).toBe(2);
|
|
264
|
+
rerender(React.createElement(ContainedMathbox, { ref: mbRef, options: {} },
|
|
265
|
+
React.createElement(Cartesian, null)));
|
|
266
|
+
assertNotNil(mbRef.current);
|
|
267
|
+
expect(mbRef.current.select("grid").length).toBe(0);
|
|
268
|
+
return [2 /*return*/];
|
|
269
|
+
});
|
|
270
|
+
}); });
|
|
271
|
+
});
|
|
272
|
+
describe("<Voxel />", function () {
|
|
273
|
+
it("throws a runtime error if it has children", function () {
|
|
274
|
+
/**
|
|
275
|
+
* In development React re-dispatches errors thrown during render through a
|
|
276
|
+
* `window` "error" event (invokeGuardedCallbackDev) in addition to
|
|
277
|
+
* rethrowing them to the caller. Vitest's global "error" listener collects
|
|
278
|
+
* that expected error as an unhandled error and fails the run — observed
|
|
279
|
+
* intermittently in CI. Calling preventDefault on the matching event marks
|
|
280
|
+
* it handled, which suppresses Vitest's collection, while `render` still
|
|
281
|
+
* throws so the assertion below holds.
|
|
282
|
+
*/
|
|
283
|
+
var suppressExpectedError = function (event) {
|
|
284
|
+
var _a, _b;
|
|
285
|
+
if ((_b = (_a = event.error) === null || _a === void 0 ? void 0 : _a.message) === null || _b === void 0 ? void 0 : _b.includes("cannot have children")) {
|
|
286
|
+
event.preventDefault();
|
|
287
|
+
}
|
|
288
|
+
};
|
|
289
|
+
window.addEventListener("error", suppressExpectedError);
|
|
290
|
+
try {
|
|
291
|
+
var willThrow = function () {
|
|
292
|
+
return render(React.createElement(ContainedMathbox, null,
|
|
293
|
+
React.createElement(Cartesian, null,
|
|
294
|
+
React.createElement(Voxel, null,
|
|
295
|
+
React.createElement(Grid, null)))));
|
|
296
|
+
};
|
|
297
|
+
expect(willThrow).toThrow("Component <Voxel /> cannot have children.");
|
|
298
|
+
}
|
|
299
|
+
finally {
|
|
300
|
+
window.removeEventListener("error", suppressExpectedError);
|
|
301
|
+
}
|
|
302
|
+
});
|
|
303
|
+
});
|
|
304
|
+
//# sourceMappingURL=components.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"components.spec.js","sourceRoot":"","sources":["../../../src/components/components.spec.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAA;AAC5B,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,WAAW,CAAA;AAC9C,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AAEhE,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ReactNode } from "react";
|
|
2
|
+
import type { MathboxSelection, NodeType } from "mathbox";
|
|
3
|
+
import React from "react";
|
|
4
|
+
export type WithChildren<T> = {
|
|
5
|
+
children?: ReactNode | ReactNode[];
|
|
6
|
+
} & T;
|
|
7
|
+
export type MathboxRef<T extends NodeType> = React.Ref<MathboxSelection<T>>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/components/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { MathboxSelection, NodeType } from "mathbox";
|
|
2
|
+
export declare const isRootDestroyed: (selection: MathboxSelection) => boolean;
|
|
3
|
+
/**
|
|
4
|
+
* Check that parent is actually the selection's parent.
|
|
5
|
+
* The mathbox components occasionally render with a selection value whose
|
|
6
|
+
* parent does not match the parent specified in MathboxContext.
|
|
7
|
+
*
|
|
8
|
+
* I believe this fundamentally this is happening because
|
|
9
|
+
* - we store parent value in context...
|
|
10
|
+
* - we update the context parent value using useEffect hooks..
|
|
11
|
+
* - useEffect hooks are called children before parents.
|
|
12
|
+
*
|
|
13
|
+
* One wonders whether we really need to be using useEffect hooks for the
|
|
14
|
+
* mathbox components, or if we can just put all the node creation/removal stuff
|
|
15
|
+
* in a render function. Hooks seem nice for dependencies, but mathbox is pretty
|
|
16
|
+
* smart about diffing out the actual changes.
|
|
17
|
+
*/
|
|
18
|
+
export declare const isSelectionParent: (selection: MathboxSelection, parent: MathboxSelection) => boolean;
|
|
19
|
+
declare const CAN_HAVE_CHILDREN: readonly ["view", "cartesian", "cartesian4", "polar", "spherical", "stereographic", "stereographic4", "transform", "transform4", "vertex", "fragment", "layer", "mask", "group", "inherit", "root", "unit", "rtt", "clock", "now", "move", "present", "reveal", "slide"];
|
|
20
|
+
export type ParentNodeTypes = (typeof CAN_HAVE_CHILDREN)[number];
|
|
21
|
+
export declare const canNodeHaveChildren: (type: NodeType) => boolean;
|
|
22
|
+
export declare const capitalize: (s: string) => string;
|
|
23
|
+
/**
|
|
24
|
+
* Returns the same reference to `value` as long as the the given values are
|
|
25
|
+
* deep equal.
|
|
26
|
+
*
|
|
27
|
+
* This is, in general, not a great idea. See
|
|
28
|
+
* https://github.com/facebook/react/issues/14476#issuecomment-471199055
|
|
29
|
+
*
|
|
30
|
+
* This should work OK for mathbox options because the objects in question are
|
|
31
|
+
* either shallow, or are deep equal at a fairly shallow level.
|
|
32
|
+
* E.g., OrbitControls may not be a shall object, but if it's not, it will at
|
|
33
|
+
* least be deep equal between renders.
|
|
34
|
+
*
|
|
35
|
+
* But should work OK for mathbox options.
|
|
36
|
+
*/
|
|
37
|
+
export declare const useDeepCompareMemo: <T>(value: T, initial: T) => T;
|
|
38
|
+
export {};
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/* eslint-disable no-underscore-dangle */
|
|
2
|
+
import isEqual from "lodash/isEqual";
|
|
3
|
+
import { useRef, useMemo } from "react";
|
|
4
|
+
/**
|
|
5
|
+
* Get root node given any node in Mathbox tree
|
|
6
|
+
*/
|
|
7
|
+
var getRoot = function (selection) {
|
|
8
|
+
var current = selection;
|
|
9
|
+
while (current._up) {
|
|
10
|
+
current = current._up;
|
|
11
|
+
}
|
|
12
|
+
return current;
|
|
13
|
+
};
|
|
14
|
+
export var isRootDestroyed = function (selection) {
|
|
15
|
+
var root = getRoot(selection);
|
|
16
|
+
return root.three === undefined;
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* Check that parent is actually the selection's parent.
|
|
20
|
+
* The mathbox components occasionally render with a selection value whose
|
|
21
|
+
* parent does not match the parent specified in MathboxContext.
|
|
22
|
+
*
|
|
23
|
+
* I believe this fundamentally this is happening because
|
|
24
|
+
* - we store parent value in context...
|
|
25
|
+
* - we update the context parent value using useEffect hooks..
|
|
26
|
+
* - useEffect hooks are called children before parents.
|
|
27
|
+
*
|
|
28
|
+
* One wonders whether we really need to be using useEffect hooks for the
|
|
29
|
+
* mathbox components, or if we can just put all the node creation/removal stuff
|
|
30
|
+
* in a render function. Hooks seem nice for dependencies, but mathbox is pretty
|
|
31
|
+
* smart about diffing out the actual changes.
|
|
32
|
+
*/
|
|
33
|
+
export var isSelectionParent = function (selection, parent) {
|
|
34
|
+
var _a;
|
|
35
|
+
var selectionParentNode = (_a = selection._up) === null || _a === void 0 ? void 0 : _a[0];
|
|
36
|
+
return selectionParentNode === parent[0];
|
|
37
|
+
};
|
|
38
|
+
var CAN_HAVE_CHILDREN = [
|
|
39
|
+
"view",
|
|
40
|
+
"cartesian",
|
|
41
|
+
"cartesian4",
|
|
42
|
+
"polar",
|
|
43
|
+
"spherical",
|
|
44
|
+
"stereographic",
|
|
45
|
+
"stereographic4",
|
|
46
|
+
"transform",
|
|
47
|
+
"transform4",
|
|
48
|
+
"vertex",
|
|
49
|
+
"fragment",
|
|
50
|
+
"layer",
|
|
51
|
+
"mask",
|
|
52
|
+
"group",
|
|
53
|
+
"inherit",
|
|
54
|
+
"root",
|
|
55
|
+
"unit",
|
|
56
|
+
"rtt",
|
|
57
|
+
"clock",
|
|
58
|
+
"now",
|
|
59
|
+
"move",
|
|
60
|
+
"present",
|
|
61
|
+
"reveal",
|
|
62
|
+
"slide",
|
|
63
|
+
];
|
|
64
|
+
export var canNodeHaveChildren = function (type) {
|
|
65
|
+
return CAN_HAVE_CHILDREN.includes(type);
|
|
66
|
+
};
|
|
67
|
+
export var capitalize = function (s) {
|
|
68
|
+
if (!s)
|
|
69
|
+
return "";
|
|
70
|
+
return s[0].toLocaleUpperCase() + s.slice(1);
|
|
71
|
+
};
|
|
72
|
+
/**
|
|
73
|
+
* Returns the same reference to `value` as long as the the given values are
|
|
74
|
+
* deep equal.
|
|
75
|
+
*
|
|
76
|
+
* This is, in general, not a great idea. See
|
|
77
|
+
* https://github.com/facebook/react/issues/14476#issuecomment-471199055
|
|
78
|
+
*
|
|
79
|
+
* This should work OK for mathbox options because the objects in question are
|
|
80
|
+
* either shallow, or are deep equal at a fairly shallow level.
|
|
81
|
+
* E.g., OrbitControls may not be a shall object, but if it's not, it will at
|
|
82
|
+
* least be deep equal between renders.
|
|
83
|
+
*
|
|
84
|
+
* But should work OK for mathbox options.
|
|
85
|
+
*/
|
|
86
|
+
export var useDeepCompareMemo = function (value, initial) {
|
|
87
|
+
var oldValue = useRef(initial);
|
|
88
|
+
var memoOptions = useMemo(function () {
|
|
89
|
+
if (isEqual(value, oldValue.current))
|
|
90
|
+
return oldValue.current;
|
|
91
|
+
oldValue.current = value;
|
|
92
|
+
return value;
|
|
93
|
+
}, [value]);
|
|
94
|
+
return memoOptions;
|
|
95
|
+
};
|
|
96
|
+
//# sourceMappingURL=util.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"util.js","sourceRoot":"","sources":["../../../src/components/util.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,OAAO,OAAO,MAAM,gBAAgB,CAAA;AACpC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,OAAO,CAAA;AAKvC;;GAEG;AACH,IAAM,OAAO,GAAG,UAAC,SAA2B;IAC1C,IAAI,OAAO,GAAG,SAA0B,CAAA;IACxC,OAAO,OAAO,CAAC,GAAG,EAAE;QAClB,OAAO,GAAG,OAAO,CAAC,GAAG,CAAA;KACtB;IACD,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA;AAED,MAAM,CAAC,IAAM,eAAe,GAAG,UAAC,SAA2B;IACzD,IAAM,IAAI,GAAG,OAAO,CAAC,SAAS,CAAC,CAAA;IAC/B,OAAO,IAAI,CAAC,KAAK,KAAK,SAAS,CAAA;AACjC,CAAC,CAAA;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,IAAM,iBAAiB,GAAG,UAC/B,SAA2B,EAC3B,MAAwB;;IAExB,IAAM,mBAAmB,GAAG,MAAC,SAA2B,CAAC,GAAG,0CAAG,CAAC,CAAC,CAAA;IACjE,OAAO,mBAAmB,KAAK,MAAM,CAAC,CAAC,CAAC,CAAA;AAC1C,CAAC,CAAA;AAED,IAAM,iBAAiB,GAAG;IACxB,MAAM;IACN,WAAW;IACX,YAAY;IACZ,OAAO;IACP,WAAW;IACX,eAAe;IACf,gBAAgB;IAChB,WAAW;IACX,YAAY;IACZ,QAAQ;IACR,UAAU;IACV,OAAO;IACP,MAAM;IACN,OAAO;IACP,SAAS;IACT,MAAM;IACN,MAAM;IACN,KAAK;IACL,OAAO;IACP,KAAK;IACL,MAAM;IACN,SAAS;IACT,QAAQ;IACR,OAAO;CACC,CAAA;AAIV,MAAM,CAAC,IAAM,mBAAmB,GAAG,UAAC,IAAc;IAChD,OAAC,iBAAuC,CAAC,QAAQ,CAAC,IAAI,CAAC;AAAvD,CAAuD,CAAA;AAEzD,MAAM,CAAC,IAAM,UAAU,GAAG,UAAC,CAAS;IAClC,IAAI,CAAC,CAAC;QAAE,OAAO,EAAE,CAAA;IACjB,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;AAC9C,CAAC,CAAA;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,IAAM,kBAAkB,GAAG,UAAI,KAAQ,EAAE,OAAU;IACxD,IAAM,QAAQ,GAAG,MAAM,CAAI,OAAO,CAAC,CAAA;IACnC,IAAM,WAAW,GAAG,OAAO,CAAC;QAC1B,IAAI,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC;YAAE,OAAO,QAAQ,CAAC,OAAO,CAAA;QAC7D,QAAQ,CAAC,OAAO,GAAG,KAAK,CAAA;QACxB,OAAO,KAAK,CAAA;IACd,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAA;IACX,OAAO,WAAW,CAAA;AACpB,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,UAAU,MAAM,cAAc,CAAA;AAE1C,cAAc,cAAc,CAAA;AAC5B,OAAO,EAAE,UAAU,EAAE,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testSetup.js","sourceRoot":"","sources":["../../src/testSetup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAE5C,iBAAiB,CAAC,SAAS,CAAC,UAAU,GAAG,cAAc,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const getMockContext: () => any;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A mock that uses proxies to create properties as they are accessed. Supports
|
|
3
|
+
* function calls and toPrimitive.
|
|
4
|
+
*
|
|
5
|
+
* @param specifics Allows specifying specific values for properties. If a prop
|
|
6
|
+
* exists on `specifics`, then that value will be used when the property is
|
|
7
|
+
* accessed on automock.
|
|
8
|
+
* @returns
|
|
9
|
+
*/
|
|
10
|
+
var getAutomock = function (specifics) {
|
|
11
|
+
// Only needs to be callable so the Proxy target supports the `apply` trap.
|
|
12
|
+
var autmockSeed = function () { return undefined; };
|
|
13
|
+
var handler = {
|
|
14
|
+
get: function (target, prop) {
|
|
15
|
+
if (prop === Symbol.toPrimitive) {
|
|
16
|
+
return function () { return "Automock: ".concat(JSON.stringify(specifics)); };
|
|
17
|
+
}
|
|
18
|
+
if (specifics && Reflect.has(specifics, prop)) {
|
|
19
|
+
var value = Reflect.get(specifics, prop);
|
|
20
|
+
return value;
|
|
21
|
+
}
|
|
22
|
+
if (!Reflect.has(target, prop)) {
|
|
23
|
+
Reflect.set(target, prop, getAutomock());
|
|
24
|
+
}
|
|
25
|
+
return Reflect.get(target, prop);
|
|
26
|
+
},
|
|
27
|
+
apply: function () {
|
|
28
|
+
return getAutomock();
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
return new Proxy(autmockSeed, handler);
|
|
32
|
+
};
|
|
33
|
+
export var getMockContext = function () {
|
|
34
|
+
var mockContext = getAutomock({
|
|
35
|
+
getParameter: function (name) {
|
|
36
|
+
if (name === mockContext.VERSION)
|
|
37
|
+
return "Fake version!";
|
|
38
|
+
return getAutomock();
|
|
39
|
+
},
|
|
40
|
+
});
|
|
41
|
+
return mockContext;
|
|
42
|
+
};
|
|
43
|
+
//# sourceMappingURL=testUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testUtils.js","sourceRoot":"","sources":["../../src/testUtils.ts"],"names":[],"mappings":"AAGA;;;;;;;;GAQG;AACH,IAAM,WAAW,GAAG,UAClB,SAAa;IAEb,2EAA2E;IAC3E,IAAM,WAAW,GAAG,cAAM,OAAA,SAAS,EAAT,CAAS,CAAA;IACnC,IAAM,OAAO,GAAG;QACd,GAAG,YAAC,MAAgB,EAAE,IAAqB;YACzC,IAAI,IAAI,KAAK,MAAM,CAAC,WAAW,EAAE;gBAC/B,OAAO,cAAM,OAAA,oBAAa,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAE,EAAxC,CAAwC,CAAA;aACtD;YACD,IAAI,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE;gBAC7C,IAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;gBAC1C,OAAO,KAAK,CAAA;aACb;YACD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE;gBAC9B,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAA;aACzC;YACD,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;QAClC,CAAC;QACD,KAAK;YACH,OAAO,WAAW,EAAE,CAAA;QACtB,CAAC;KACF,CAAA;IACD,OAAO,IAAI,KAAK,CAAC,WAAW,EAAE,OAAO,CAAC,CAAA;AACxC,CAAC,CAAA;AAED,MAAM,CAAC,IAAM,cAAc,GAAG;IAC5B,IAAM,WAAW,GAAG,WAAW,CAAC;QAC9B,YAAY,EAAE,UAAC,IAAa;YAC1B,IAAI,IAAI,KAAK,WAAW,CAAC,OAAO;gBAAE,OAAO,eAAe,CAAA;YACxD,OAAO,WAAW,EAAE,CAAA;QACtB,CAAC;KACF,CAAC,CAAA;IACF,OAAO,WAAW,CAAA;AACpB,CAAC,CAAA"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import type { OrbitControls } from "three/examples/jsm/controls/OrbitControls";
|
|
3
|
+
import type { Vector3 } from "three";
|
|
4
|
+
type OrbitControlsProps = {
|
|
5
|
+
type: "orbit";
|
|
6
|
+
enablePan?: boolean;
|
|
7
|
+
enableRotate?: boolean;
|
|
8
|
+
enableZoom?: boolean;
|
|
9
|
+
target?: Vector3;
|
|
10
|
+
onStart?: (event: {
|
|
11
|
+
type: "start";
|
|
12
|
+
target: OrbitControls;
|
|
13
|
+
}) => void;
|
|
14
|
+
onEnd?: (event: {
|
|
15
|
+
type: "end";
|
|
16
|
+
target: OrbitControls;
|
|
17
|
+
}) => void;
|
|
18
|
+
};
|
|
19
|
+
type ControlsProps = OrbitControlsProps;
|
|
20
|
+
declare const Controls: React.FC<ControlsProps>;
|
|
21
|
+
export default Controls;
|