solid-js 1.3.15 → 1.4.0-beta.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/dist/solid.js CHANGED
@@ -127,6 +127,7 @@ function nextHydrateContext() {
127
127
 
128
128
  const equalFn = (a, b) => a === b;
129
129
  const $PROXY = Symbol("solid-proxy");
130
+ const $TRACK = Symbol("solid-track");
130
131
  const $DEVCOMP = Symbol("solid-dev-component");
131
132
  const signalOptions = {
132
133
  equals: equalFn
@@ -201,7 +202,7 @@ function createEffect(fn, value, options) {
201
202
  s = SuspenseContext && lookup(Owner, SuspenseContext.id);
202
203
  if (s) c.suspense = s;
203
204
  c.user = true;
204
- Effects ? Effects.push(c) : queueMicrotask(() => updateComputation(c));
205
+ Effects ? Effects.push(c) : updateComputation(c);
205
206
  }
206
207
  function createReaction(onInvalidate, options) {
207
208
  let fn;
@@ -242,13 +243,8 @@ function createResource(source, fetcher, options) {
242
243
  source = true;
243
244
  }
244
245
  options || (options = {});
245
- if (options.globalRefetch !== false) {
246
- Resources || (Resources = new Set());
247
- Resources.add(load);
248
- Owner && onCleanup(() => Resources.delete(load));
249
- }
250
246
  const contexts = new Set(),
251
- [s, set] = createSignal(options.initialValue),
247
+ [value, setValue] = createSignal(options.initialValue),
252
248
  [track, trigger] = createSignal(undefined, {
253
249
  equals: false
254
250
  }),
@@ -260,7 +256,7 @@ function createResource(source, fetcher, options) {
260
256
  id = null,
261
257
  loadedUnderTransition = false,
262
258
  scheduled = false,
263
- dynamic = typeof source === "function";
259
+ dynamic = typeof source === "function" && createMemo(source);
264
260
  if (sharedConfig.context) {
265
261
  id = `${sharedConfig.context.id}${sharedConfig.context.count++}`;
266
262
  if (sharedConfig.load) initP = sharedConfig.load(id);
@@ -290,7 +286,7 @@ function createResource(source, fetcher, options) {
290
286
  }
291
287
  function completeLoad(v) {
292
288
  batch(() => {
293
- set(() => v);
289
+ setValue(() => v);
294
290
  setLoading(false);
295
291
  for (const c of contexts.keys()) c.decrement();
296
292
  contexts.clear();
@@ -298,7 +294,7 @@ function createResource(source, fetcher, options) {
298
294
  }
299
295
  function read() {
300
296
  const c = SuspenseContext && lookup(Owner, SuspenseContext.id),
301
- v = s();
297
+ v = value();
302
298
  if (err) throw err;
303
299
  if (Listener && !Listener.user && c) {
304
300
  createComputed(() => {
@@ -317,15 +313,15 @@ function createResource(source, fetcher, options) {
317
313
  if (refetching && scheduled) return;
318
314
  scheduled = false;
319
315
  setError(err = undefined);
320
- const lookup = dynamic ? source() : source;
316
+ const lookup = dynamic ? dynamic() : source;
321
317
  loadedUnderTransition = Transition && Transition.running;
322
318
  if (lookup == null || lookup === false) {
323
- loadEnd(pr, untrack(s));
319
+ loadEnd(pr, untrack(value));
324
320
  return;
325
321
  }
326
322
  if (Transition && pr) Transition.promises.delete(pr);
327
323
  const p = initP || untrack(() => fetcher(lookup, {
328
- value: s(),
324
+ value: value(),
329
325
  refetching
330
326
  }));
331
327
  if (typeof p !== "object" || !("then" in p)) {
@@ -351,18 +347,20 @@ function createResource(source, fetcher, options) {
351
347
  get() {
352
348
  return error();
353
349
  }
350
+ },
351
+ latest: {
352
+ get() {
353
+ if (err) throw err;
354
+ return value();
355
+ }
354
356
  }
355
357
  });
356
358
  if (dynamic) createComputed(() => load(false));else load(false);
357
359
  return [read, {
358
360
  refetch: load,
359
- mutate: set
361
+ mutate: setValue
360
362
  }];
361
363
  }
362
- let Resources;
363
- function refetchResources(info) {
364
- return Resources && Promise.all([...Resources].map(fn => fn(info)));
365
- }
366
364
  function createDeferred(source, options) {
367
365
  let t,
368
366
  timeout = options ? options.timeoutMs : undefined;
@@ -381,7 +379,7 @@ function createSelector(source, fn = equalFn, options) {
381
379
  const subs = new Map();
382
380
  const node = createComputation(p => {
383
381
  const v = source();
384
- for (const key of subs.keys()) if (fn(key, v) !== (p !== undefined && fn(key, p))) {
382
+ for (const key of subs.keys()) if (fn(key, v) !== fn(key, p)) {
385
383
  const l = subs.get(key);
386
384
  for (const c of l.values()) {
387
385
  c.state = STALE;
@@ -736,11 +734,14 @@ function runUpdates(fn, init) {
736
734
  if (Effects) wait = true;else Effects = [];
737
735
  ExecCount++;
738
736
  try {
739
- return fn();
737
+ const res = fn();
738
+ completeUpdates(wait);
739
+ return res;
740
740
  } catch (err) {
741
741
  handleError(err);
742
742
  } finally {
743
- completeUpdates(wait);
743
+ Updates = null;
744
+ if (!wait) Effects = null;
744
745
  }
745
746
  }
746
747
  function completeUpdates(wait) {
@@ -981,6 +982,7 @@ function mapArray(list, mapFn, options = {}) {
981
982
  let newItems = list() || [],
982
983
  i,
983
984
  j;
985
+ newItems[$TRACK];
984
986
  return untrack(() => {
985
987
  let newLen = newItems.length,
986
988
  newIndices,
@@ -1082,6 +1084,7 @@ function indexArray(list, mapFn, options = {}) {
1082
1084
  onCleanup(() => dispose(disposers));
1083
1085
  return () => {
1084
1086
  const newItems = list() || [];
1087
+ newItems[$TRACK];
1085
1088
  return untrack(() => {
1086
1089
  if (newItems.length === 0) {
1087
1090
  if (len !== 0) {
@@ -1245,9 +1248,7 @@ function lazy(fn) {
1245
1248
  });
1246
1249
  comp = s;
1247
1250
  } else if (!comp) {
1248
- const [s] = createResource(() => (p || (p = fn())).then(mod => mod.default), {
1249
- globalRefetch: false
1250
- });
1251
+ const [s] = createResource(() => (p || (p = fn())).then(mod => mod.default));
1251
1252
  comp = s;
1252
1253
  } else {
1253
1254
  const c = comp();
@@ -1499,4 +1500,4 @@ function Suspense(props) {
1499
1500
 
1500
1501
  let DEV;
1501
1502
 
1502
- export { $DEVCOMP, $PROXY, DEV, ErrorBoundary, For, Index, Match, Show, Suspense, SuspenseList, Switch, batch, cancelCallback, children, createComponent, createComputed, createContext, createDeferred, createEffect, createMemo, createReaction, createRenderEffect, createResource, createRoot, createSelector, createSignal, createUniqueId, enableExternalSource, enableHydration, enableScheduling, equalFn, from, getListener, getOwner, indexArray, lazy, mapArray, mergeProps, observable, on, onCleanup, onError, onMount, refetchResources, requestCallback, resetErrorBoundaries, runWithOwner, sharedConfig, splitProps, startTransition, untrack, useContext, useTransition };
1503
+ export { $DEVCOMP, $PROXY, $TRACK, DEV, ErrorBoundary, For, Index, Match, Show, Suspense, SuspenseList, Switch, batch, cancelCallback, children, createComponent, createComputed, createContext, createDeferred, createEffect, createMemo, createReaction, createRenderEffect, createResource, createRoot, createSelector, createSignal, createUniqueId, enableExternalSource, enableHydration, enableScheduling, equalFn, from, getListener, getOwner, indexArray, lazy, mapArray, mergeProps, observable, on, onCleanup, onError, onMount, requestCallback, resetErrorBoundaries, runWithOwner, sharedConfig, splitProps, startTransition, untrack, useContext, useTransition };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "solid-js",
3
3
  "description": "A declarative JavaScript library for building user interfaces.",
4
- "version": "1.3.15",
4
+ "version": "1.4.0-beta.0",
5
5
  "author": "Ryan Carniato",
6
6
  "license": "MIT",
7
7
  "homepage": "https://solidjs.com",
@@ -144,5 +144,5 @@
144
144
  "compiler",
145
145
  "performance"
146
146
  ],
147
- "gitHead": "0a6fc7bbeebf14f1a9297358801acf365dfbb716"
147
+ "gitHead": "c47bee46d775574c4eebd94ea207f4e679f08d60"
148
148
  }
@@ -71,11 +71,14 @@ function proxyDescriptor(target, property) {
71
71
  desc.get = () => target[solidJs.$PROXY][property];
72
72
  return desc;
73
73
  }
74
- function ownKeys(target) {
74
+ function trackSelf(target) {
75
75
  if (solidJs.getListener()) {
76
76
  const nodes = getDataNodes(target);
77
77
  (nodes._ || (nodes._ = createDataNode()))();
78
78
  }
79
+ }
80
+ function ownKeys(target) {
81
+ trackSelf(target);
79
82
  return Reflect.ownKeys(target);
80
83
  }
81
84
  function createDataNode() {
@@ -92,18 +95,12 @@ const proxyTraps$1 = {
92
95
  if (property === solidJs.$PROXY) return receiver;
93
96
  const value = target[property];
94
97
  if (property === $NODE || property === "__proto__") return value;
95
- const wrappable = isWrappable(value);
98
+ if (property === solidJs.$TRACK) return trackSelf(target);
96
99
  if (solidJs.getListener() && (typeof value !== "function" || target.hasOwnProperty(property))) {
97
- let nodes, node;
98
- if (wrappable && (nodes = getDataNodes(value))) {
99
- node = nodes._ || (nodes._ = createDataNode());
100
- node();
101
- }
102
- nodes = getDataNodes(target);
103
- node = nodes[property] || (nodes[property] = createDataNode());
104
- node();
100
+ const nodes = getDataNodes(target);
101
+ (nodes[property] || (nodes[property] = createDataNode()))();
105
102
  }
106
- return wrappable ? wrap$1(value, target[$NAME] && `${target[$NAME]}:${property.toString()}`) : value;
103
+ return isWrappable(value) ? wrap$1(value, target[$NAME] && `${target[$NAME]}:${property.toString()}`) : value;
107
104
  },
108
105
  set() {
109
106
  console.warn("Cannot mutate a Store directly");
@@ -120,16 +117,14 @@ function setProperty(state, property, value) {
120
117
  if (state[property] === value) return;
121
118
  const array = Array.isArray(state);
122
119
  const len = state.length;
123
- const isUndefined = value === undefined;
124
- const notify = array || isUndefined === property in state;
125
- if (isUndefined) {
120
+ if (value === undefined) {
126
121
  delete state[property];
127
122
  } else state[property] = value;
128
123
  let nodes = getDataNodes(state),
129
124
  node;
130
125
  (node = nodes[property]) && node.$();
131
126
  if (array && state.length !== len) (node = nodes.length) && node.$();
132
- notify && (node = nodes._) && node.$();
127
+ (node = nodes._) && node.$();
133
128
  }
134
129
  function mergeStoreNode(state, value) {
135
130
  const keys = Object.keys(value);
@@ -138,6 +133,15 @@ function mergeStoreNode(state, value) {
138
133
  setProperty(state, key, value[key]);
139
134
  }
140
135
  }
136
+ function updateArray(current, next) {
137
+ let i = 0,
138
+ len = next.length;
139
+ for (; i < len; i++) {
140
+ const value = next[i];
141
+ if (current[i] !== value) setProperty(current, i, value);
142
+ }
143
+ setProperty(current, "length", len);
144
+ }
141
145
  function updatePath(current, path, traversed = []) {
142
146
  let part,
143
147
  prev = current;
@@ -185,6 +189,7 @@ function updatePath(current, path, traversed = []) {
185
189
  }
186
190
  function createStore(store, options) {
187
191
  const unwrappedStore = unwrap(store || {});
192
+ const isArray = Array.isArray(unwrappedStore);
188
193
  if (typeof unwrappedStore !== "object" && typeof unwrappedStore !== "function") throw new Error(`Unexpected type ${typeof unwrappedStore} received when initializing 'createStore'. Expected an object.`);
189
194
  const wrappedStore = wrap$1(unwrappedStore, (options && options.name || solidJs.DEV.hashValue(unwrappedStore)));
190
195
  {
@@ -194,7 +199,9 @@ function createStore(store, options) {
194
199
  });
195
200
  }
196
201
  function setStore(...args) {
197
- solidJs.batch(() => updatePath(unwrappedStore, args));
202
+ solidJs.batch(() => {
203
+ isArray && args.length === 1 ? updateArray(unwrappedStore, unwrap(args[0])) : updatePath(unwrappedStore, args);
204
+ });
198
205
  }
199
206
  return [wrappedStore, setStore];
200
207
  }
@@ -205,18 +212,14 @@ const proxyTraps = {
205
212
  if (property === solidJs.$PROXY) return receiver;
206
213
  const value = target[property];
207
214
  if (property === $NODE || property === "__proto__") return value;
208
- const wrappable = isWrappable(value);
215
+ if (property === solidJs.$TRACK) return trackSelf(target);
209
216
  if (solidJs.getListener() && (typeof value !== "function" || target.hasOwnProperty(property))) {
210
- let nodes, node;
211
- if (wrappable && (nodes = getDataNodes(value))) {
212
- node = nodes._ || (nodes._ = createDataNode());
213
- node();
214
- }
215
- nodes = getDataNodes(target);
216
- node = nodes[property] || (nodes[property] = createDataNode());
217
- node();
217
+ const nodes = getDataNodes(target);
218
+ (nodes[property] || (nodes[property] = createDataNode()))();
219
+ } else if (value != null && value === Array.prototype[property]) {
220
+ return (...args) => solidJs.batch(() => Array.prototype[property].apply(target, args));
218
221
  }
219
- return wrappable ? wrap(value, target[$NAME] && `${target[$NAME]}:${property.toString()}`) : value;
222
+ return isWrappable(value) ? wrap(value, target[$NAME] && `${target[$NAME]}:${property.toString()}`) : value;
220
223
  },
221
224
  set(target, property, value) {
222
225
  setProperty(target, property, unwrap(value));
@@ -348,9 +351,9 @@ function reconcile(value, options = {}) {
348
351
  v = unwrap(value);
349
352
  return state => {
350
353
  if (!isWrappable(state) || !isWrappable(v)) return v;
351
- applyState(v, {
354
+ solidJs.batch(() => applyState(v, {
352
355
  state
353
- }, "state", merge, key);
356
+ }, "state", merge, key));
354
357
  return state;
355
358
  };
356
359
  }
package/store/dist/dev.js CHANGED
@@ -1,4 +1,4 @@
1
- import { $PROXY, DEV, getListener, batch, createSignal } from 'solid-js';
1
+ import { $PROXY, DEV, $TRACK, getListener, batch, createSignal } from 'solid-js';
2
2
 
3
3
  const $RAW = Symbol("store-raw"),
4
4
  $NODE = Symbol("store-node"),
@@ -67,11 +67,14 @@ function proxyDescriptor(target, property) {
67
67
  desc.get = () => target[$PROXY][property];
68
68
  return desc;
69
69
  }
70
- function ownKeys(target) {
70
+ function trackSelf(target) {
71
71
  if (getListener()) {
72
72
  const nodes = getDataNodes(target);
73
73
  (nodes._ || (nodes._ = createDataNode()))();
74
74
  }
75
+ }
76
+ function ownKeys(target) {
77
+ trackSelf(target);
75
78
  return Reflect.ownKeys(target);
76
79
  }
77
80
  function createDataNode() {
@@ -88,18 +91,12 @@ const proxyTraps$1 = {
88
91
  if (property === $PROXY) return receiver;
89
92
  const value = target[property];
90
93
  if (property === $NODE || property === "__proto__") return value;
91
- const wrappable = isWrappable(value);
94
+ if (property === $TRACK) return trackSelf(target);
92
95
  if (getListener() && (typeof value !== "function" || target.hasOwnProperty(property))) {
93
- let nodes, node;
94
- if (wrappable && (nodes = getDataNodes(value))) {
95
- node = nodes._ || (nodes._ = createDataNode());
96
- node();
97
- }
98
- nodes = getDataNodes(target);
99
- node = nodes[property] || (nodes[property] = createDataNode());
100
- node();
96
+ const nodes = getDataNodes(target);
97
+ (nodes[property] || (nodes[property] = createDataNode()))();
101
98
  }
102
- return wrappable ? wrap$1(value, target[$NAME] && `${target[$NAME]}:${property.toString()}`) : value;
99
+ return isWrappable(value) ? wrap$1(value, target[$NAME] && `${target[$NAME]}:${property.toString()}`) : value;
103
100
  },
104
101
  set() {
105
102
  console.warn("Cannot mutate a Store directly");
@@ -116,16 +113,14 @@ function setProperty(state, property, value) {
116
113
  if (state[property] === value) return;
117
114
  const array = Array.isArray(state);
118
115
  const len = state.length;
119
- const isUndefined = value === undefined;
120
- const notify = array || isUndefined === property in state;
121
- if (isUndefined) {
116
+ if (value === undefined) {
122
117
  delete state[property];
123
118
  } else state[property] = value;
124
119
  let nodes = getDataNodes(state),
125
120
  node;
126
121
  (node = nodes[property]) && node.$();
127
122
  if (array && state.length !== len) (node = nodes.length) && node.$();
128
- notify && (node = nodes._) && node.$();
123
+ (node = nodes._) && node.$();
129
124
  }
130
125
  function mergeStoreNode(state, value) {
131
126
  const keys = Object.keys(value);
@@ -134,6 +129,15 @@ function mergeStoreNode(state, value) {
134
129
  setProperty(state, key, value[key]);
135
130
  }
136
131
  }
132
+ function updateArray(current, next) {
133
+ let i = 0,
134
+ len = next.length;
135
+ for (; i < len; i++) {
136
+ const value = next[i];
137
+ if (current[i] !== value) setProperty(current, i, value);
138
+ }
139
+ setProperty(current, "length", len);
140
+ }
137
141
  function updatePath(current, path, traversed = []) {
138
142
  let part,
139
143
  prev = current;
@@ -181,6 +185,7 @@ function updatePath(current, path, traversed = []) {
181
185
  }
182
186
  function createStore(store, options) {
183
187
  const unwrappedStore = unwrap(store || {});
188
+ const isArray = Array.isArray(unwrappedStore);
184
189
  if (typeof unwrappedStore !== "object" && typeof unwrappedStore !== "function") throw new Error(`Unexpected type ${typeof unwrappedStore} received when initializing 'createStore'. Expected an object.`);
185
190
  const wrappedStore = wrap$1(unwrappedStore, (options && options.name || DEV.hashValue(unwrappedStore)));
186
191
  {
@@ -190,7 +195,9 @@ function createStore(store, options) {
190
195
  });
191
196
  }
192
197
  function setStore(...args) {
193
- batch(() => updatePath(unwrappedStore, args));
198
+ batch(() => {
199
+ isArray && args.length === 1 ? updateArray(unwrappedStore, unwrap(args[0])) : updatePath(unwrappedStore, args);
200
+ });
194
201
  }
195
202
  return [wrappedStore, setStore];
196
203
  }
@@ -201,18 +208,14 @@ const proxyTraps = {
201
208
  if (property === $PROXY) return receiver;
202
209
  const value = target[property];
203
210
  if (property === $NODE || property === "__proto__") return value;
204
- const wrappable = isWrappable(value);
211
+ if (property === $TRACK) return trackSelf(target);
205
212
  if (getListener() && (typeof value !== "function" || target.hasOwnProperty(property))) {
206
- let nodes, node;
207
- if (wrappable && (nodes = getDataNodes(value))) {
208
- node = nodes._ || (nodes._ = createDataNode());
209
- node();
210
- }
211
- nodes = getDataNodes(target);
212
- node = nodes[property] || (nodes[property] = createDataNode());
213
- node();
213
+ const nodes = getDataNodes(target);
214
+ (nodes[property] || (nodes[property] = createDataNode()))();
215
+ } else if (value != null && value === Array.prototype[property]) {
216
+ return (...args) => batch(() => Array.prototype[property].apply(target, args));
214
217
  }
215
- return wrappable ? wrap(value, target[$NAME] && `${target[$NAME]}:${property.toString()}`) : value;
218
+ return isWrappable(value) ? wrap(value, target[$NAME] && `${target[$NAME]}:${property.toString()}`) : value;
216
219
  },
217
220
  set(target, property, value) {
218
221
  setProperty(target, property, unwrap(value));
@@ -344,9 +347,9 @@ function reconcile(value, options = {}) {
344
347
  v = unwrap(value);
345
348
  return state => {
346
349
  if (!isWrappable(state) || !isWrappable(v)) return v;
347
- applyState(v, {
350
+ batch(() => applyState(v, {
348
351
  state
349
- }, "state", merge, key);
352
+ }, "state", merge, key));
350
353
  return state;
351
354
  };
352
355
  }
@@ -68,11 +68,14 @@ function proxyDescriptor(target, property) {
68
68
  desc.get = () => target[solidJs.$PROXY][property];
69
69
  return desc;
70
70
  }
71
- function ownKeys(target) {
71
+ function trackSelf(target) {
72
72
  if (solidJs.getListener()) {
73
73
  const nodes = getDataNodes(target);
74
74
  (nodes._ || (nodes._ = createDataNode()))();
75
75
  }
76
+ }
77
+ function ownKeys(target) {
78
+ trackSelf(target);
76
79
  return Reflect.ownKeys(target);
77
80
  }
78
81
  function createDataNode() {
@@ -89,18 +92,12 @@ const proxyTraps$1 = {
89
92
  if (property === solidJs.$PROXY) return receiver;
90
93
  const value = target[property];
91
94
  if (property === $NODE || property === "__proto__") return value;
92
- const wrappable = isWrappable(value);
95
+ if (property === solidJs.$TRACK) return trackSelf(target);
93
96
  if (solidJs.getListener() && (typeof value !== "function" || target.hasOwnProperty(property))) {
94
- let nodes, node;
95
- if (wrappable && (nodes = getDataNodes(value))) {
96
- node = nodes._ || (nodes._ = createDataNode());
97
- node();
98
- }
99
- nodes = getDataNodes(target);
100
- node = nodes[property] || (nodes[property] = createDataNode());
101
- node();
97
+ const nodes = getDataNodes(target);
98
+ (nodes[property] || (nodes[property] = createDataNode()))();
102
99
  }
103
- return wrappable ? wrap$1(value) : value;
100
+ return isWrappable(value) ? wrap$1(value) : value;
104
101
  },
105
102
  set() {
106
103
  return true;
@@ -115,16 +112,14 @@ function setProperty(state, property, value) {
115
112
  if (state[property] === value) return;
116
113
  const array = Array.isArray(state);
117
114
  const len = state.length;
118
- const isUndefined = value === undefined;
119
- const notify = array || isUndefined === property in state;
120
- if (isUndefined) {
115
+ if (value === undefined) {
121
116
  delete state[property];
122
117
  } else state[property] = value;
123
118
  let nodes = getDataNodes(state),
124
119
  node;
125
120
  (node = nodes[property]) && node.$();
126
121
  if (array && state.length !== len) (node = nodes.length) && node.$();
127
- notify && (node = nodes._) && node.$();
122
+ (node = nodes._) && node.$();
128
123
  }
129
124
  function mergeStoreNode(state, value) {
130
125
  const keys = Object.keys(value);
@@ -133,6 +128,15 @@ function mergeStoreNode(state, value) {
133
128
  setProperty(state, key, value[key]);
134
129
  }
135
130
  }
131
+ function updateArray(current, next) {
132
+ let i = 0,
133
+ len = next.length;
134
+ for (; i < len; i++) {
135
+ const value = next[i];
136
+ if (current[i] !== value) setProperty(current, i, value);
137
+ }
138
+ setProperty(current, "length", len);
139
+ }
136
140
  function updatePath(current, path, traversed = []) {
137
141
  let part,
138
142
  prev = current;
@@ -180,9 +184,12 @@ function updatePath(current, path, traversed = []) {
180
184
  }
181
185
  function createStore(store, options) {
182
186
  const unwrappedStore = unwrap(store || {});
187
+ const isArray = Array.isArray(unwrappedStore);
183
188
  const wrappedStore = wrap$1(unwrappedStore);
184
189
  function setStore(...args) {
185
- solidJs.batch(() => updatePath(unwrappedStore, args));
190
+ solidJs.batch(() => {
191
+ isArray && args.length === 1 ? updateArray(unwrappedStore, unwrap(args[0])) : updatePath(unwrappedStore, args);
192
+ });
186
193
  }
187
194
  return [wrappedStore, setStore];
188
195
  }
@@ -193,18 +200,14 @@ const proxyTraps = {
193
200
  if (property === solidJs.$PROXY) return receiver;
194
201
  const value = target[property];
195
202
  if (property === $NODE || property === "__proto__") return value;
196
- const wrappable = isWrappable(value);
203
+ if (property === solidJs.$TRACK) return trackSelf(target);
197
204
  if (solidJs.getListener() && (typeof value !== "function" || target.hasOwnProperty(property))) {
198
- let nodes, node;
199
- if (wrappable && (nodes = getDataNodes(value))) {
200
- node = nodes._ || (nodes._ = createDataNode());
201
- node();
202
- }
203
- nodes = getDataNodes(target);
204
- node = nodes[property] || (nodes[property] = createDataNode());
205
- node();
205
+ const nodes = getDataNodes(target);
206
+ (nodes[property] || (nodes[property] = createDataNode()))();
207
+ } else if (value != null && value === Array.prototype[property]) {
208
+ return (...args) => solidJs.batch(() => Array.prototype[property].apply(target, args));
206
209
  }
207
- return wrappable ? wrap(value) : value;
210
+ return isWrappable(value) ? wrap(value) : value;
208
211
  },
209
212
  set(target, property, value) {
210
213
  setProperty(target, property, unwrap(value));
@@ -326,9 +329,9 @@ function reconcile(value, options = {}) {
326
329
  v = unwrap(value);
327
330
  return state => {
328
331
  if (!isWrappable(state) || !isWrappable(v)) return v;
329
- applyState(v, {
332
+ solidJs.batch(() => applyState(v, {
330
333
  state
331
- }, "state", merge, key);
334
+ }, "state", merge, key));
332
335
  return state;
333
336
  };
334
337
  }