@react-three/fiber 8.0.0-alpha-09 → 8.0.0-beta-03

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 (32) hide show
  1. package/CHANGELOG.md +97 -0
  2. package/dist/declarations/src/core/events.d.ts +63 -59
  3. package/dist/declarations/src/core/hooks.d.ts +21 -29
  4. package/dist/declarations/src/core/loop.d.ts +12 -12
  5. package/dist/declarations/src/core/renderer.d.ts +50 -51
  6. package/dist/declarations/src/core/store.d.ts +117 -106
  7. package/dist/declarations/src/core/utils.d.ts +50 -27
  8. package/dist/declarations/src/index.d.ts +8 -7
  9. package/dist/declarations/src/native/Canvas.d.ts +16 -0
  10. package/dist/declarations/src/native/events.d.ts +6 -0
  11. package/dist/declarations/src/native/hooks.d.ts +9 -0
  12. package/dist/declarations/src/native/index.d.ts +36 -0
  13. package/dist/declarations/src/native.d.ts +8 -0
  14. package/dist/declarations/src/three-types.d.ts +309 -319
  15. package/dist/declarations/src/web/Canvas.d.ts +13 -13
  16. package/dist/declarations/src/web/events.d.ts +5 -5
  17. package/dist/declarations/src/web/index.d.ts +33 -30
  18. package/dist/hooks-15c12e3e.esm.js +1539 -0
  19. package/dist/hooks-6526f63c.cjs.dev.js +1589 -0
  20. package/dist/hooks-7b7e01e6.cjs.prod.js +1589 -0
  21. package/dist/react-three-fiber.cjs.dev.js +261 -1596
  22. package/dist/react-three-fiber.cjs.prod.js +261 -1596
  23. package/dist/react-three-fiber.esm.js +222 -1554
  24. package/native/dist/react-three-fiber-native.cjs.d.ts +1 -0
  25. package/native/dist/react-three-fiber-native.cjs.dev.js +589 -0
  26. package/native/dist/react-three-fiber-native.cjs.js +7 -0
  27. package/native/dist/react-three-fiber-native.cjs.prod.js +589 -0
  28. package/native/dist/react-three-fiber-native.esm.js +537 -0
  29. package/native/package.json +5 -0
  30. package/package.json +18 -8
  31. package/readme.md +10 -10
  32. package/__mocks__/react-use-measure/index.ts +0 -22
@@ -0,0 +1 @@
1
+ export * from "../../dist/declarations/src/native";
@@ -0,0 +1,589 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var hooks = require('../../dist/hooks-6526f63c.cjs.dev.js');
6
+ var _extends = require('@babel/runtime/helpers/extends');
7
+ var React = require('react');
8
+ var THREE = require('three');
9
+ var reactNative = require('react-native');
10
+ var expoGl = require('expo-gl');
11
+ var constants = require('react-reconciler/constants');
12
+ var Pressability = require('react-native/Libraries/Pressability/Pressability');
13
+ var expoAsset = require('expo-asset');
14
+ var expoFileSystem = require('expo-file-system');
15
+ var base64Arraybuffer = require('base64-arraybuffer');
16
+ var suspendReact = require('suspend-react');
17
+ require('react-reconciler');
18
+ require('scheduler');
19
+ require('zustand');
20
+
21
+ function _interopDefault (e) { return e && e.__esModule ? e : { 'default': e }; }
22
+
23
+ function _interopNamespace(e) {
24
+ if (e && e.__esModule) return e;
25
+ var n = Object.create(null);
26
+ if (e) {
27
+ Object.keys(e).forEach(function (k) {
28
+ if (k !== 'default') {
29
+ var d = Object.getOwnPropertyDescriptor(e, k);
30
+ Object.defineProperty(n, k, d.get ? d : {
31
+ enumerable: true,
32
+ get: function () {
33
+ return e[k];
34
+ }
35
+ });
36
+ }
37
+ });
38
+ }
39
+ n['default'] = e;
40
+ return Object.freeze(n);
41
+ }
42
+
43
+ var React__namespace = /*#__PURE__*/_interopNamespace(React);
44
+ var THREE__namespace = /*#__PURE__*/_interopNamespace(THREE);
45
+ var Pressability__default = /*#__PURE__*/_interopDefault(Pressability);
46
+
47
+ // @ts-ignore
48
+ const EVENTS = {
49
+ PRESS: 'onPress',
50
+ PRESSIN: 'onPressIn',
51
+ PRESSOUT: 'onPressOut',
52
+ LONGPRESS: 'onLongPress',
53
+ HOVERIN: 'onHoverIn',
54
+ HOVEROUT: 'onHoverOut',
55
+ PRESSMOVE: 'onPressMove'
56
+ };
57
+ const DOM_EVENTS = {
58
+ [EVENTS.PRESS]: 'onClick',
59
+ [EVENTS.PRESSIN]: 'onPointerDown',
60
+ [EVENTS.PRESSOUT]: 'onPointerUp',
61
+ [EVENTS.LONGPRESS]: 'onDoubleClick',
62
+ [EVENTS.HOVERIN]: 'onPointerOver',
63
+ [EVENTS.HOVEROUT]: 'onPointerOut',
64
+ [EVENTS.PRESSMOVE]: 'onPointerMove'
65
+ }; // https://github.com/facebook/react/tree/main/packages/react-reconciler#getcurrenteventpriority
66
+ // Gives React a clue as to how import the current interaction is
67
+
68
+ function getEventPriority() {
69
+ var _window, _window$event;
70
+
71
+ let name = (_window = window) == null ? void 0 : (_window$event = _window.event) == null ? void 0 : _window$event.type;
72
+
73
+ switch (name) {
74
+ case EVENTS.PRESS:
75
+ case EVENTS.PRESSIN:
76
+ case EVENTS.PRESSOUT:
77
+ case EVENTS.LONGPRESS:
78
+ return constants.DiscreteEventPriority;
79
+
80
+ case EVENTS.HOVERIN:
81
+ case EVENTS.HOVEROUT:
82
+ case EVENTS.PRESSMOVE:
83
+ return constants.ContinuousEventPriority;
84
+
85
+ default:
86
+ return constants.DefaultEventPriority;
87
+ }
88
+ }
89
+ function createTouchEvents(store) {
90
+ const {
91
+ handlePointer
92
+ } = hooks.createEvents(store);
93
+
94
+ const handleTouch = (event, name) => {
95
+ event.persist() // Apply offset
96
+ ;
97
+ event.nativeEvent.offsetX = event.nativeEvent.pageX;
98
+ event.nativeEvent.offsetY = event.nativeEvent.pageY; // Emulate DOM event
99
+
100
+ const callback = handlePointer(DOM_EVENTS[name]);
101
+ return callback(event.nativeEvent);
102
+ };
103
+
104
+ return {
105
+ connected: false,
106
+ handlers: Object.values(EVENTS).reduce((acc, name) => ({ ...acc,
107
+ [name]: event => handleTouch(event, name)
108
+ }), {}),
109
+ connect: () => {
110
+ const {
111
+ set,
112
+ events
113
+ } = store.getState();
114
+ events.disconnect == null ? void 0 : events.disconnect();
115
+ const manager = new Pressability__default['default'](events == null ? void 0 : events.handlers);
116
+ set(state => ({
117
+ events: { ...state.events,
118
+ connected: manager
119
+ }
120
+ }));
121
+ },
122
+ disconnect: () => {
123
+ const {
124
+ set,
125
+ events
126
+ } = store.getState();
127
+
128
+ if (events.connected) {
129
+ events.connected.reset();
130
+ set(state => ({
131
+ events: { ...state.events,
132
+ connected: false
133
+ }
134
+ }));
135
+ }
136
+ }
137
+ };
138
+ }
139
+
140
+ /**
141
+ * Generates an asset based on input type.
142
+ */
143
+
144
+ const getAsset = input => {
145
+ if (input instanceof expoAsset.Asset) return input;
146
+
147
+ switch (typeof input) {
148
+ case 'string':
149
+ return expoAsset.Asset.fromURI(input);
150
+
151
+ case 'number':
152
+ return expoAsset.Asset.fromModule(input);
153
+
154
+ default:
155
+ throw 'Invalid asset! Must be a URI or module.';
156
+ }
157
+ };
158
+ /**
159
+ * Downloads from a local URI and decodes into an ArrayBuffer.
160
+ */
161
+
162
+
163
+ const toBuffer = async localUri => expoFileSystem.readAsStringAsync(localUri, {
164
+ encoding: 'base64'
165
+ }).then(base64Arraybuffer.decode);
166
+
167
+ function loadingFn(extensions, onProgress) {
168
+ return function (Proto, ...input) {
169
+ // Construct new loader and run extensions
170
+ const loader = new Proto();
171
+ if (extensions) extensions(loader); // Go through the urls and load them
172
+
173
+ return Promise.all(input.map(entry => new Promise(async (res, reject) => {
174
+ // Construct URL
175
+ const url = typeof entry === 'string' ? loader.path + entry : entry; // There's no Image in native, so we create & pass a data texture instead
176
+
177
+ if (loader instanceof THREE__namespace.TextureLoader) {
178
+ const asset = await getAsset(url).downloadAsync();
179
+ const texture = new THREE__namespace.Texture();
180
+ texture.isDataTexture = true;
181
+ texture.image = {
182
+ data: asset,
183
+ width: asset.width,
184
+ height: asset.height
185
+ };
186
+ texture.needsUpdate = true;
187
+ return res(texture);
188
+ } // Do similar for CubeTextures
189
+
190
+
191
+ if (loader instanceof THREE__namespace.CubeTextureLoader) {
192
+ const texture = new THREE__namespace.CubeTexture();
193
+ texture.isDataTexture = true;
194
+ texture.images = await Promise.all(url.map(async src => {
195
+ const asset = await getAsset(src).downloadAsync();
196
+ return {
197
+ data: asset,
198
+ width: asset.width,
199
+ height: asset.height
200
+ };
201
+ }));
202
+ texture.needsUpdate = true;
203
+ return res(texture);
204
+ } // If asset is external and not an Image, load it
205
+
206
+
207
+ if (url.startsWith != null && url.startsWith('http') && Proto.prototype.hasOwnProperty('load')) {
208
+ return loader.load(entry, data => {
209
+ if (data.scene) Object.assign(data, hooks.buildGraph(data.scene));
210
+ res(data);
211
+ }, onProgress, error => reject(`Could not load ${url}: ${error.message}`));
212
+ } // Otherwise, create a localUri and a file buffer
213
+
214
+
215
+ const {
216
+ localUri
217
+ } = await getAsset(url).downloadAsync();
218
+ const arrayBuffer = await toBuffer(localUri); // Parse it
219
+
220
+ const parsed = loader.parse == null ? void 0 : loader.parse(arrayBuffer, undefined, data => {
221
+ if (data.scene) Object.assign(data, hooks.buildGraph(data.scene));
222
+ res(data);
223
+ }, error => reject(`Could not load ${url}: ${error.message}`)); // Respect synchronous parsers which don't have callbacks
224
+
225
+ if (parsed) return res(parsed);
226
+ })));
227
+ };
228
+ }
229
+
230
+ function useLoader(Proto, input, extensions, onProgress) {
231
+ // Use suspense to load async assets
232
+ const keys = Array.isArray(input) ? input : [input];
233
+ const results = suspendReact.suspend(loadingFn(extensions, onProgress), [Proto, ...keys], {
234
+ equal: hooks.is.equ
235
+ }); // Return the object/s
236
+
237
+ return Array.isArray(input) ? results : results[0];
238
+ }
239
+
240
+ useLoader.preload = function (Proto, input, extensions) {
241
+ const keys = Array.isArray(input) ? input : [input];
242
+ return suspendReact.preload(loadingFn(extensions), [Proto, ...keys]);
243
+ };
244
+
245
+ useLoader.clear = function (Proto, input) {
246
+ const keys = Array.isArray(input) ? input : [input];
247
+ return suspendReact.clear([Proto, ...keys]);
248
+ };
249
+
250
+ const roots = new Map();
251
+ const {
252
+ invalidate,
253
+ advance
254
+ } = hooks.createLoop(roots);
255
+ const {
256
+ reconciler,
257
+ applyProps
258
+ } = hooks.createRenderer(roots, getEventPriority);
259
+
260
+ const createRendererInstance = (gl, context) => {
261
+ // Create canvas shim
262
+ const canvas = {
263
+ width: context.drawingBufferWidth,
264
+ height: context.drawingBufferHeight,
265
+ style: {},
266
+ addEventListener: () => {},
267
+ removeEventListener: () => {},
268
+ clientHeight: context.drawingBufferHeight
269
+ }; // If a renderer is specified, return it
270
+
271
+ const customRenderer = typeof gl === 'function' ? gl(canvas, context) : gl;
272
+ if (hooks.isRenderer(customRenderer)) return customRenderer; // Create renderer and pass our canvas and its context
273
+
274
+ const renderer = new THREE__namespace.WebGLRenderer({
275
+ powerPreference: 'high-performance',
276
+ antialias: true,
277
+ alpha: true,
278
+ ...gl,
279
+ canvas,
280
+ context
281
+ }); // Set color management
282
+
283
+ renderer.outputEncoding = THREE__namespace.sRGBEncoding;
284
+ renderer.toneMapping = THREE__namespace.ACESFilmicToneMapping; // Set GL props
285
+
286
+ if (gl) applyProps(renderer, gl); // Bind render to RN bridge
287
+
288
+ if (context.endFrameEXP) {
289
+ const renderFrame = renderer.render.bind(renderer);
290
+
291
+ renderer.render = (scene, camera) => {
292
+ renderFrame(scene, camera);
293
+ context.endFrameEXP();
294
+ };
295
+ }
296
+
297
+ return renderer;
298
+ };
299
+
300
+ function createRoot(context, config) {
301
+ return {
302
+ render: element => {
303
+ var _store;
304
+
305
+ let {
306
+ gl,
307
+ size = {
308
+ width: 0,
309
+ height: 0
310
+ },
311
+ events,
312
+ onCreated,
313
+ ...props
314
+ } = config || {};
315
+ let root = roots.get(context);
316
+ let fiber = root == null ? void 0 : root.fiber;
317
+ let store = root == null ? void 0 : root.store;
318
+ let state = (_store = store) == null ? void 0 : _store.getState();
319
+
320
+ if (fiber && state) {
321
+ // When a root was found, see if any fundamental props must be changed or exchanged
322
+ // Check size
323
+ if (state.size.width !== size.width || state.size.height !== size.height) state.setSize(size.width, size.height); // Check frameloop
324
+
325
+ if (state.frameloop !== props.frameloop) state.setFrameloop(props.frameloop); // For some props we want to reset the entire root
326
+ // Changes to the color-space
327
+
328
+ const linearChanged = props.linear !== state.internal.lastProps.linear;
329
+
330
+ if (linearChanged) {
331
+ unmountComponentAtNode(context);
332
+ fiber = undefined;
333
+ }
334
+ }
335
+
336
+ if (!fiber) {
337
+ // If no root has been found, make one
338
+ // Create gl
339
+ const glRenderer = createRendererInstance(gl, context); // Create store
340
+
341
+ store = hooks.createStore(applyProps, invalidate, advance, {
342
+ gl: glRenderer,
343
+ size,
344
+ ...props,
345
+ // expo-gl can only render at native dpr/resolution
346
+ // https://github.com/expo/expo-three/issues/39
347
+ dpr: reactNative.PixelRatio.get()
348
+ });
349
+ const state = store.getState(); // Create renderer
350
+
351
+ fiber = reconciler.createContainer(store, constants.ConcurrentRoot, false, null); // Map it
352
+
353
+ roots.set(context, {
354
+ fiber,
355
+ store
356
+ }); // Store event manager internally and connect it
357
+
358
+ if (events) {
359
+ var _state$get$events$con, _state$get$events;
360
+
361
+ state.set({
362
+ events: events(store)
363
+ });
364
+ (_state$get$events$con = (_state$get$events = state.get().events).connect) == null ? void 0 : _state$get$events$con.call(_state$get$events, context);
365
+ }
366
+ }
367
+
368
+ if (store && fiber) {
369
+ reconciler.updateContainer( /*#__PURE__*/React__namespace.createElement(Provider, {
370
+ store: store,
371
+ element: element,
372
+ onCreated: onCreated
373
+ }), fiber, null, () => undefined);
374
+ return store;
375
+ } else {
376
+ throw 'Error creating root!';
377
+ }
378
+ },
379
+ unmount: () => unmountComponentAtNode(context)
380
+ };
381
+ }
382
+
383
+ function render(element, context, config = {}) {
384
+ console.warn('R3F.render is no longer supported in React 18. Use createRoot instead!');
385
+ return createRoot(context, config).render(element);
386
+ }
387
+
388
+ function Provider({
389
+ store,
390
+ element,
391
+ onCreated
392
+ }) {
393
+ React__namespace.useEffect(() => {
394
+ const state = store.getState(); // Flag the canvas active, rendering will now begin
395
+
396
+ state.set(state => ({
397
+ internal: { ...state.internal,
398
+ active: true
399
+ }
400
+ })); // Notifiy that init is completed, the scene graph exists, but nothing has yet rendered
401
+
402
+ if (onCreated) onCreated(state); // eslint-disable-next-line react-hooks/exhaustive-deps
403
+ }, []);
404
+ return /*#__PURE__*/React__namespace.createElement(hooks.context.Provider, {
405
+ value: store
406
+ }, element);
407
+ }
408
+
409
+ function unmountComponentAtNode(context, callback) {
410
+ const root = roots.get(context);
411
+ const fiber = root == null ? void 0 : root.fiber;
412
+
413
+ if (fiber) {
414
+ const state = root == null ? void 0 : root.store.getState();
415
+ if (state) state.internal.active = false;
416
+ reconciler.updateContainer(null, fiber, null, () => {
417
+ if (state) {
418
+ setTimeout(() => {
419
+ try {
420
+ var _state$gl, _state$gl$renderLists, _state$gl2;
421
+
422
+ state.events.disconnect == null ? void 0 : state.events.disconnect();
423
+ (_state$gl = state.gl) == null ? void 0 : (_state$gl$renderLists = _state$gl.renderLists) == null ? void 0 : _state$gl$renderLists.dispose == null ? void 0 : _state$gl$renderLists.dispose();
424
+ (_state$gl2 = state.gl) == null ? void 0 : _state$gl2.forceContextLoss == null ? void 0 : _state$gl2.forceContextLoss();
425
+ hooks.dispose(state);
426
+ roots.delete(context);
427
+ if (callback) callback(context);
428
+ } catch (e) {
429
+ /* ... */
430
+ }
431
+ }, 500);
432
+ }
433
+ });
434
+ }
435
+ }
436
+
437
+ const act = React__namespace.unstable_act;
438
+
439
+ function createPortal(children, container) {
440
+ return reconciler.createPortal(children, container, null, null);
441
+ }
442
+
443
+ reconciler.injectIntoDevTools({
444
+ bundleType: process.env.NODE_ENV === 'production' ? 0 : 1,
445
+ rendererPackageName: '@react-three/fiber',
446
+ version: '18.0.0'
447
+ });
448
+
449
+ const CANVAS_PROPS = ['gl', 'events', 'shadows', 'linear', 'flat', 'orthographic', 'frameloop', 'performance', 'clock', 'raycaster', 'camera', 'onPointerMissed', 'onCreated'];
450
+
451
+ function Block({
452
+ set
453
+ }) {
454
+ React__namespace.useLayoutEffect(() => {
455
+ set(new Promise(() => null));
456
+ return () => set(false);
457
+ }, [set]);
458
+ return null;
459
+ }
460
+
461
+ class ErrorBoundary extends React__namespace.Component {
462
+ constructor(...args) {
463
+ super(...args);
464
+ this.state = {
465
+ error: false
466
+ };
467
+ }
468
+
469
+ componentDidCatch(error) {
470
+ this.props.set(error);
471
+ }
472
+
473
+ render() {
474
+ return this.state.error ? null : this.props.children;
475
+ }
476
+
477
+ }
478
+
479
+ ErrorBoundary.getDerivedStateFromError = () => ({
480
+ error: true
481
+ });
482
+
483
+ const Canvas = /*#__PURE__*/React__namespace.forwardRef(({
484
+ children,
485
+ fallback,
486
+ style,
487
+ events,
488
+ nativeRef_EXPERIMENTAL,
489
+ onContextCreate,
490
+ ...props
491
+ }, forwardedRef) => {
492
+ // Create a known catalogue of Threejs-native elements
493
+ // This will include the entire THREE namespace by default, users can extend
494
+ // their own elements by using the createRoot API instead
495
+ React__namespace.useMemo(() => hooks.extend(THREE__namespace), []);
496
+ const [{
497
+ width,
498
+ height
499
+ }, setSize] = React__namespace.useState({
500
+ width: 0,
501
+ height: 0
502
+ });
503
+ const [context, setContext] = React__namespace.useState(null);
504
+ const [bind, setBind] = React__namespace.useState();
505
+ const canvasProps = hooks.pick(props, CANVAS_PROPS);
506
+ const viewProps = hooks.omit(props, CANVAS_PROPS);
507
+ const [block, setBlock] = React__namespace.useState(false);
508
+ const [error, setError] = React__namespace.useState(false); // Suspend this component if block is a promise (2nd run)
509
+
510
+ if (block) throw block; // Throw exception outwards if anything within canvas throws
511
+
512
+ if (error) throw error;
513
+ const onLayout = React__namespace.useCallback(e => {
514
+ const {
515
+ width,
516
+ height
517
+ } = e.nativeEvent.layout;
518
+ setSize({
519
+ width,
520
+ height
521
+ });
522
+ }, []);
523
+
524
+ if (width > 0 && height > 0 && context) {
525
+ const store = createRoot(context, { ...canvasProps,
526
+ size: {
527
+ width,
528
+ height
529
+ },
530
+ events: events || createTouchEvents
531
+ }).render( /*#__PURE__*/React__namespace.createElement(ErrorBoundary, {
532
+ set: setError
533
+ }, /*#__PURE__*/React__namespace.createElement(React__namespace.Suspense, {
534
+ fallback: /*#__PURE__*/React__namespace.createElement(Block, {
535
+ set: setBlock
536
+ })
537
+ }, children)));
538
+ const state = store.getState();
539
+ setBind(state.events.connected.getEventHandlers());
540
+ }
541
+
542
+ React__namespace.useEffect(() => {
543
+ return () => unmountComponentAtNode(context);
544
+ }, [context]);
545
+ return /*#__PURE__*/React__namespace.createElement(reactNative.View, _extends({}, viewProps, {
546
+ ref: forwardedRef,
547
+ onLayout: onLayout,
548
+ style: {
549
+ flex: 1,
550
+ ...style
551
+ }
552
+ }, bind), width > 0 && /*#__PURE__*/React__namespace.createElement(expoGl.GLView, {
553
+ nativeRef_EXPERIMENTAL: ref => {
554
+ if (nativeRef_EXPERIMENTAL && !nativeRef_EXPERIMENTAL.current) {
555
+ nativeRef_EXPERIMENTAL.current = ref;
556
+ }
557
+ },
558
+ onContextCreate: async gl => {
559
+ await (onContextCreate == null ? void 0 : onContextCreate(gl));
560
+ setContext(gl);
561
+ },
562
+ style: reactNative.StyleSheet.absoluteFill
563
+ }));
564
+ });
565
+
566
+ exports.ReactThreeFiber = hooks.threeTypes;
567
+ exports.addAfterEffect = hooks.addAfterEffect;
568
+ exports.addEffect = hooks.addEffect;
569
+ exports.addTail = hooks.addTail;
570
+ exports.context = hooks.context;
571
+ exports.dispose = hooks.dispose;
572
+ exports.extend = hooks.extend;
573
+ exports.useFrame = hooks.useFrame;
574
+ exports.useGraph = hooks.useGraph;
575
+ exports.useStore = hooks.useStore;
576
+ exports.useThree = hooks.useThree;
577
+ exports.Canvas = Canvas;
578
+ exports._roots = roots;
579
+ exports.act = act;
580
+ exports.advance = advance;
581
+ exports.applyProps = applyProps;
582
+ exports.createPortal = createPortal;
583
+ exports.createRoot = createRoot;
584
+ exports.events = createTouchEvents;
585
+ exports.invalidate = invalidate;
586
+ exports.reconciler = reconciler;
587
+ exports.render = render;
588
+ exports.unmountComponentAtNode = unmountComponentAtNode;
589
+ exports.useLoader = useLoader;
@@ -0,0 +1,7 @@
1
+ 'use strict';
2
+
3
+ if (process.env.NODE_ENV === "production") {
4
+ module.exports = require("./react-three-fiber-native.cjs.prod.js");
5
+ } else {
6
+ module.exports = require("./react-three-fiber-native.cjs.dev.js");
7
+ }