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/dev.cjs +26 -25
- package/dist/dev.js +26 -25
- package/dist/server.cjs +9 -9
- package/dist/server.js +10 -9
- package/dist/solid.cjs +26 -25
- package/dist/solid.js +26 -25
- package/package.json +2 -2
- package/store/dist/dev.cjs +31 -28
- package/store/dist/dev.js +32 -29
- package/store/dist/store.cjs +31 -28
- package/store/dist/store.js +32 -29
- package/store/types/store.d.ts +1 -0
- package/types/index.d.ts +1 -1
- package/types/jsx.d.ts +23 -6
- package/types/reactive/signal.d.ts +3 -4
- package/types/render/component.d.ts +6 -11
- package/types/server/index.d.ts +1 -1
- package/types/server/rendering.d.ts +3 -9
- package/web/dist/dev.cjs +8 -2
- package/web/dist/dev.js +7 -3
- package/web/dist/server.cjs +17 -8
- package/web/dist/server.js +17 -8
- package/web/dist/web.cjs +8 -2
- package/web/dist/web.js +7 -3
- package/web/types/client.d.ts +2 -0
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) :
|
|
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
|
-
[
|
|
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
|
-
|
|
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 =
|
|
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 ?
|
|
316
|
+
const lookup = dynamic ? dynamic() : source;
|
|
321
317
|
loadedUnderTransition = Transition && Transition.running;
|
|
322
318
|
if (lookup == null || lookup === false) {
|
|
323
|
-
loadEnd(pr, untrack(
|
|
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:
|
|
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:
|
|
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) !==
|
|
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
|
-
|
|
737
|
+
const res = fn();
|
|
738
|
+
completeUpdates(wait);
|
|
739
|
+
return res;
|
|
740
740
|
} catch (err) {
|
|
741
741
|
handleError(err);
|
|
742
742
|
} finally {
|
|
743
|
-
|
|
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,
|
|
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.
|
|
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": "
|
|
147
|
+
"gitHead": "c47bee46d775574c4eebd94ea207f4e679f08d60"
|
|
148
148
|
}
|
package/store/dist/dev.cjs
CHANGED
|
@@ -71,11 +71,14 @@ function proxyDescriptor(target, property) {
|
|
|
71
71
|
desc.get = () => target[solidJs.$PROXY][property];
|
|
72
72
|
return desc;
|
|
73
73
|
}
|
|
74
|
-
function
|
|
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
|
-
|
|
98
|
+
if (property === solidJs.$TRACK) return trackSelf(target);
|
|
96
99
|
if (solidJs.getListener() && (typeof value !== "function" || target.hasOwnProperty(property))) {
|
|
97
|
-
|
|
98
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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(() =>
|
|
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
|
-
|
|
215
|
+
if (property === solidJs.$TRACK) return trackSelf(target);
|
|
209
216
|
if (solidJs.getListener() && (typeof value !== "function" || target.hasOwnProperty(property))) {
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
94
|
+
if (property === $TRACK) return trackSelf(target);
|
|
92
95
|
if (getListener() && (typeof value !== "function" || target.hasOwnProperty(property))) {
|
|
93
|
-
|
|
94
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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(() =>
|
|
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
|
-
|
|
211
|
+
if (property === $TRACK) return trackSelf(target);
|
|
205
212
|
if (getListener() && (typeof value !== "function" || target.hasOwnProperty(property))) {
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
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
|
|
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
|
}
|
package/store/dist/store.cjs
CHANGED
|
@@ -68,11 +68,14 @@ function proxyDescriptor(target, property) {
|
|
|
68
68
|
desc.get = () => target[solidJs.$PROXY][property];
|
|
69
69
|
return desc;
|
|
70
70
|
}
|
|
71
|
-
function
|
|
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
|
-
|
|
95
|
+
if (property === solidJs.$TRACK) return trackSelf(target);
|
|
93
96
|
if (solidJs.getListener() && (typeof value !== "function" || target.hasOwnProperty(property))) {
|
|
94
|
-
|
|
95
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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(() =>
|
|
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
|
-
|
|
203
|
+
if (property === solidJs.$TRACK) return trackSelf(target);
|
|
197
204
|
if (solidJs.getListener() && (typeof value !== "function" || target.hasOwnProperty(property))) {
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
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
|
|
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
|
}
|