@react-three/fiber 9.3.0 → 9.4.0

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/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # @react-three/fiber
2
2
 
3
+ ## 9.4.0
4
+
5
+ ### Minor Changes
6
+
7
+ - f0976dc14a2d3203af267d0e3524d45a07f3248a: feat: improve applyProps errors, harden pierced props setting
8
+
3
9
  ## 9.3.0
4
10
 
5
11
  ### Minor Changes
@@ -241,24 +241,46 @@ function prepare(target, root, type, props) {
241
241
  return instance;
242
242
  }
243
243
  function resolve(root, key) {
244
- let target = root[key];
245
244
  if (!key.includes('-')) return {
246
245
  root,
247
246
  key,
248
- target
247
+ target: root[key]
249
248
  };
250
249
 
251
- // Resolve pierced target
252
- target = root;
253
- for (const part of key.split('-')) {
254
- var _target;
250
+ // First try the entire key as a single property (e.g., 'foo-bar')
251
+ if (key in root) {
252
+ return {
253
+ root,
254
+ key,
255
+ target: root[key]
256
+ };
257
+ }
258
+
259
+ // Try piercing (e.g., 'material-color' -> material.color)
260
+ let target = root;
261
+ const parts = key.split('-');
262
+ for (const part of parts) {
263
+ if (typeof target !== 'object' || target === null) {
264
+ if (target !== undefined) {
265
+ // Property exists but has unexpected shape
266
+ const remaining = parts.slice(parts.indexOf(part)).join('-');
267
+ return {
268
+ root: target,
269
+ key: remaining,
270
+ target: undefined
271
+ };
272
+ }
273
+ // Property doesn't exist - fallback to original key
274
+ return {
275
+ root,
276
+ key,
277
+ target: undefined
278
+ };
279
+ }
255
280
  key = part;
256
281
  root = target;
257
- target = (_target = target) == null ? void 0 : _target[key];
282
+ target = target[key];
258
283
  }
259
-
260
- // TODO: change key to 'foo-bar' if target is undefined?
261
-
262
284
  return {
263
285
  root,
264
286
  key,
@@ -401,6 +423,11 @@ function applyProps(object, props) {
401
423
  target
402
424
  } = resolve(object, prop);
403
425
 
426
+ // Throw an error if we attempted to set a pierced prop to a non-object
427
+ if (target === undefined && (typeof root !== 'object' || root === null)) {
428
+ throw Error(`R3F: Cannot set "${prop}". Ensure it is an object before setting "${key}".`);
429
+ }
430
+
404
431
  // Layers must be written to the mask property
405
432
  if (target instanceof THREE__namespace.Layers && value instanceof THREE__namespace.Layers) {
406
433
  target.mask = value.mask;
@@ -241,24 +241,46 @@ function prepare(target, root, type, props) {
241
241
  return instance;
242
242
  }
243
243
  function resolve(root, key) {
244
- let target = root[key];
245
244
  if (!key.includes('-')) return {
246
245
  root,
247
246
  key,
248
- target
247
+ target: root[key]
249
248
  };
250
249
 
251
- // Resolve pierced target
252
- target = root;
253
- for (const part of key.split('-')) {
254
- var _target;
250
+ // First try the entire key as a single property (e.g., 'foo-bar')
251
+ if (key in root) {
252
+ return {
253
+ root,
254
+ key,
255
+ target: root[key]
256
+ };
257
+ }
258
+
259
+ // Try piercing (e.g., 'material-color' -> material.color)
260
+ let target = root;
261
+ const parts = key.split('-');
262
+ for (const part of parts) {
263
+ if (typeof target !== 'object' || target === null) {
264
+ if (target !== undefined) {
265
+ // Property exists but has unexpected shape
266
+ const remaining = parts.slice(parts.indexOf(part)).join('-');
267
+ return {
268
+ root: target,
269
+ key: remaining,
270
+ target: undefined
271
+ };
272
+ }
273
+ // Property doesn't exist - fallback to original key
274
+ return {
275
+ root,
276
+ key,
277
+ target: undefined
278
+ };
279
+ }
255
280
  key = part;
256
281
  root = target;
257
- target = (_target = target) == null ? void 0 : _target[key];
282
+ target = target[key];
258
283
  }
259
-
260
- // TODO: change key to 'foo-bar' if target is undefined?
261
-
262
284
  return {
263
285
  root,
264
286
  key,
@@ -401,6 +423,11 @@ function applyProps(object, props) {
401
423
  target
402
424
  } = resolve(object, prop);
403
425
 
426
+ // Throw an error if we attempted to set a pierced prop to a non-object
427
+ if (target === undefined && (typeof root !== 'object' || root === null)) {
428
+ throw Error(`R3F: Cannot set "${prop}". Ensure it is an object before setting "${key}".`);
429
+ }
430
+
404
431
  // Layers must be written to the mask property
405
432
  if (target instanceof THREE__namespace.Layers && value instanceof THREE__namespace.Layers) {
406
433
  target.mask = value.mask;
@@ -215,24 +215,46 @@ function prepare(target, root, type, props) {
215
215
  return instance;
216
216
  }
217
217
  function resolve(root, key) {
218
- let target = root[key];
219
218
  if (!key.includes('-')) return {
220
219
  root,
221
220
  key,
222
- target
221
+ target: root[key]
223
222
  };
224
223
 
225
- // Resolve pierced target
226
- target = root;
227
- for (const part of key.split('-')) {
228
- var _target;
224
+ // First try the entire key as a single property (e.g., 'foo-bar')
225
+ if (key in root) {
226
+ return {
227
+ root,
228
+ key,
229
+ target: root[key]
230
+ };
231
+ }
232
+
233
+ // Try piercing (e.g., 'material-color' -> material.color)
234
+ let target = root;
235
+ const parts = key.split('-');
236
+ for (const part of parts) {
237
+ if (typeof target !== 'object' || target === null) {
238
+ if (target !== undefined) {
239
+ // Property exists but has unexpected shape
240
+ const remaining = parts.slice(parts.indexOf(part)).join('-');
241
+ return {
242
+ root: target,
243
+ key: remaining,
244
+ target: undefined
245
+ };
246
+ }
247
+ // Property doesn't exist - fallback to original key
248
+ return {
249
+ root,
250
+ key,
251
+ target: undefined
252
+ };
253
+ }
229
254
  key = part;
230
255
  root = target;
231
- target = (_target = target) == null ? void 0 : _target[key];
256
+ target = target[key];
232
257
  }
233
-
234
- // TODO: change key to 'foo-bar' if target is undefined?
235
-
236
258
  return {
237
259
  root,
238
260
  key,
@@ -375,6 +397,11 @@ function applyProps(object, props) {
375
397
  target
376
398
  } = resolve(object, prop);
377
399
 
400
+ // Throw an error if we attempted to set a pierced prop to a non-object
401
+ if (target === undefined && (typeof root !== 'object' || root === null)) {
402
+ throw Error(`R3F: Cannot set "${prop}". Ensure it is an object before setting "${key}".`);
403
+ }
404
+
378
405
  // Layers must be written to the mask property
379
406
  if (target instanceof THREE.Layers && value instanceof THREE.Layers) {
380
407
  target.mask = value.mask;
@@ -2,7 +2,7 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- var events = require('./events-d0449b76.cjs.dev.js');
5
+ var events = require('./events-6ab58ae5.cjs.dev.js');
6
6
  var React = require('react');
7
7
  var THREE = require('three');
8
8
  var useMeasure = require('react-use-measure');
@@ -2,7 +2,7 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- var events = require('./events-d0a20a9c.cjs.prod.js');
5
+ var events = require('./events-3afec6fc.cjs.prod.js');
6
6
  var React = require('react');
7
7
  var THREE = require('three');
8
8
  var useMeasure = require('react-use-measure');
@@ -1,5 +1,5 @@
1
- import { e as extend, u as useBridge, a as useMutableCallback, b as useIsomorphicLayoutEffect, c as createRoot, i as isRef, E as ErrorBoundary, B as Block, d as unmountComponentAtNode, f as createPointerEvents } from './events-e3cb66e2.esm.js';
2
- export { t as ReactThreeFiber, _ as _roots, x as act, k as addAfterEffect, j as addEffect, l as addTail, n as advance, s as applyProps, y as buildGraph, q as context, g as createEvents, o as createPortal, c as createRoot, w as dispose, f as events, e as extend, h as flushGlobalEffects, p as flushSync, v as getRootState, m as invalidate, r as reconciler, d as unmountComponentAtNode, D as useFrame, F as useGraph, z as useInstanceHandle, G as useLoader, A as useStore, C as useThree } from './events-e3cb66e2.esm.js';
1
+ import { e as extend, u as useBridge, a as useMutableCallback, b as useIsomorphicLayoutEffect, c as createRoot, i as isRef, E as ErrorBoundary, B as Block, d as unmountComponentAtNode, f as createPointerEvents } from './events-f8cd670d.esm.js';
2
+ export { t as ReactThreeFiber, _ as _roots, x as act, k as addAfterEffect, j as addEffect, l as addTail, n as advance, s as applyProps, y as buildGraph, q as context, g as createEvents, o as createPortal, c as createRoot, w as dispose, f as events, e as extend, h as flushGlobalEffects, p as flushSync, v as getRootState, m as invalidate, r as reconciler, d as unmountComponentAtNode, D as useFrame, F as useGraph, z as useInstanceHandle, G as useLoader, A as useStore, C as useThree } from './events-f8cd670d.esm.js';
3
3
  import * as React from 'react';
4
4
  import * as THREE from 'three';
5
5
  import useMeasure from 'react-use-measure';
@@ -2,7 +2,7 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- var events = require('../../dist/events-d0449b76.cjs.dev.js');
5
+ var events = require('../../dist/events-6ab58ae5.cjs.dev.js');
6
6
  var React = require('react');
7
7
  var THREE = require('three');
8
8
  var reactNative = require('react-native');
@@ -2,7 +2,7 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- var events = require('../../dist/events-d0a20a9c.cjs.prod.js');
5
+ var events = require('../../dist/events-3afec6fc.cjs.prod.js');
6
6
  var React = require('react');
7
7
  var THREE = require('three');
8
8
  var reactNative = require('react-native');
@@ -1,5 +1,5 @@
1
- import { e as extend, u as useBridge, a as useMutableCallback, c as createRoot, b as useIsomorphicLayoutEffect, E as ErrorBoundary, B as Block, d as unmountComponentAtNode, f as createPointerEvents, g as createEvents } from '../../dist/events-e3cb66e2.esm.js';
2
- export { t as ReactThreeFiber, _ as _roots, x as act, k as addAfterEffect, j as addEffect, l as addTail, n as advance, s as applyProps, y as buildGraph, q as context, g as createEvents, o as createPortal, c as createRoot, w as dispose, e as extend, h as flushGlobalEffects, p as flushSync, v as getRootState, m as invalidate, r as reconciler, d as unmountComponentAtNode, D as useFrame, F as useGraph, z as useInstanceHandle, G as useLoader, A as useStore, C as useThree } from '../../dist/events-e3cb66e2.esm.js';
1
+ import { e as extend, u as useBridge, a as useMutableCallback, c as createRoot, b as useIsomorphicLayoutEffect, E as ErrorBoundary, B as Block, d as unmountComponentAtNode, f as createPointerEvents, g as createEvents } from '../../dist/events-f8cd670d.esm.js';
2
+ export { t as ReactThreeFiber, _ as _roots, x as act, k as addAfterEffect, j as addEffect, l as addTail, n as advance, s as applyProps, y as buildGraph, q as context, g as createEvents, o as createPortal, c as createRoot, w as dispose, e as extend, h as flushGlobalEffects, p as flushSync, v as getRootState, m as invalidate, r as reconciler, d as unmountComponentAtNode, D as useFrame, F as useGraph, z as useInstanceHandle, G as useLoader, A as useStore, C as useThree } from '../../dist/events-f8cd670d.esm.js';
3
3
  import * as React from 'react';
4
4
  import * as THREE from 'three';
5
5
  import { PanResponder, PixelRatio, StyleSheet, View, Platform, Image, NativeModules } from 'react-native';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@react-three/fiber",
3
- "version": "9.3.0",
3
+ "version": "9.4.0",
4
4
  "description": "A React renderer for Threejs",
5
5
  "keywords": [
6
6
  "react",