solid-js 1.3.0-rc.3 → 1.3.2

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 CHANGED
@@ -131,7 +131,7 @@ function nextHydrateContext() {
131
131
 
132
132
  const equalFn = (a, b) => a === b;
133
133
  const $PROXY = Symbol("solid-proxy");
134
- const $DEVCOMP = Symbol('solid-dev-component');
134
+ const $DEVCOMP = Symbol("solid-dev-component");
135
135
  const signalOptions = {
136
136
  equals: equalFn
137
137
  };
@@ -170,14 +170,12 @@ function createRoot(fn, detachedOwner) {
170
170
  if (owner) root.name = `${owner.name}-r${rootCount++}`;
171
171
  Owner = root;
172
172
  Listener = null;
173
- let result;
174
173
  try {
175
- runUpdates(() => result = fn(() => cleanNode(root)), true);
174
+ return runUpdates(() => fn(() => cleanNode(root)), true);
176
175
  } finally {
177
176
  Listener = listener;
178
177
  Owner = owner;
179
178
  }
180
- return result;
181
179
  }
182
180
  function createSignal(value, options) {
183
181
  options = options ? Object.assign({}, signalOptions, options) : signalOptions;
@@ -211,7 +209,21 @@ function createEffect(fn, value, options) {
211
209
  s = SuspenseContext && lookup(Owner, SuspenseContext.id);
212
210
  if (s) c.suspense = s;
213
211
  c.user = true;
214
- Effects && Effects.push(c);
212
+ Effects ? Effects.push(c) : queueMicrotask(() => updateComputation(c));
213
+ }
214
+ function createReaction(onInvalidate, options) {
215
+ let fn;
216
+ const c = createComputation(() => {
217
+ fn ? fn() : untrack(onInvalidate);
218
+ fn = undefined;
219
+ }, undefined, false, 0, options ),
220
+ s = SuspenseContext && lookup(Owner, SuspenseContext.id);
221
+ if (s) c.suspense = s;
222
+ c.user = true;
223
+ return tracking => {
224
+ fn = tracking;
225
+ updateComputation(c);
226
+ };
215
227
  }
216
228
  function createMemo(fn, value, options) {
217
229
  options = options ? Object.assign({}, signalOptions, options) : signalOptions;
@@ -237,11 +249,11 @@ function createResource(source, fetcher, options) {
237
249
  fetcher = source;
238
250
  source = true;
239
251
  }
240
- options ||= {};
252
+ options || (options = {});
241
253
  if (options.globalRefetch !== false) {
242
254
  Resources || (Resources = new Set());
243
255
  Resources.add(load);
244
- onCleanup(() => Resources.delete(load));
256
+ Owner && onCleanup(() => Resources.delete(load));
245
257
  }
246
258
  const contexts = new Set(),
247
259
  [s, set] = createSignal(options.initialValue),
@@ -352,7 +364,7 @@ function createResource(source, fetcher, options) {
352
364
  }
353
365
  let Resources;
354
366
  function refetchResources(info) {
355
- Resources && Resources.forEach(fn => fn(info));
367
+ return Resources && Promise.all([...Resources].map(fn => fn(info)));
356
368
  }
357
369
  function createDeferred(source, options) {
358
370
  let t,
@@ -494,7 +506,7 @@ function startTransition(fn) {
494
506
  queue: new Set(),
495
507
  running: true
496
508
  });
497
- t.done ||= new Promise(res => t.resolve = res);
509
+ t.done || (t.done = new Promise(res => t.resolve = res));
498
510
  t.running = true;
499
511
  }
500
512
  batch(fn);
@@ -777,7 +789,7 @@ function runUpdates(fn, init) {
777
789
  if (Effects) wait = true;else Effects = [];
778
790
  ExecCount++;
779
791
  try {
780
- fn();
792
+ return fn();
781
793
  } catch (err) {
782
794
  handleError(err);
783
795
  } finally {
@@ -937,7 +949,7 @@ function handleError(err) {
937
949
  fns.forEach(f => f(err));
938
950
  }
939
951
  function lookup(owner, key) {
940
- return owner && (owner.context && owner.context[key] || owner.owner && lookup(owner.owner, key));
952
+ return owner && (owner.context && owner.context[key] !== undefined ? owner.context[key] : owner.owner && lookup(owner.owner, key));
941
953
  }
942
954
  function resolveChildren(children) {
943
955
  if (typeof children === "function" && !children.length) return resolveChildren(children());
@@ -1496,20 +1508,19 @@ function Suspense(props) {
1496
1508
  const key = sharedConfig.context.id + sharedConfig.context.count;
1497
1509
  p = sharedConfig.load(key);
1498
1510
  if (p) {
1499
- if (typeof p !== "object" || !("then" in p)) error = p;else {
1500
- const [s, set] = createSignal(undefined, {
1501
- equals: false
1502
- });
1503
- flicker = s;
1504
- p.then(err => {
1505
- if (error = err) return set();
1506
- sharedConfig.gather(key);
1507
- setHydrateContext(ctx);
1508
- set();
1509
- setHydrateContext();
1510
- p = undefined;
1511
- });
1512
- }
1511
+ if (typeof p !== "object" || !("then" in p)) p = Promise.resolve(p);
1512
+ const [s, set] = createSignal(undefined, {
1513
+ equals: false
1514
+ });
1515
+ flicker = s;
1516
+ p.then(err => {
1517
+ if (error = err) return set();
1518
+ sharedConfig.gather(key);
1519
+ setHydrateContext(ctx);
1520
+ set();
1521
+ setHydrateContext();
1522
+ p = undefined;
1523
+ });
1513
1524
  }
1514
1525
  }
1515
1526
  const listContext = useContext(SuspenseListContext);
@@ -1588,6 +1599,7 @@ exports.createContext = createContext;
1588
1599
  exports.createDeferred = createDeferred;
1589
1600
  exports.createEffect = createEffect;
1590
1601
  exports.createMemo = createMemo;
1602
+ exports.createReaction = createReaction;
1591
1603
  exports.createRenderEffect = createRenderEffect;
1592
1604
  exports.createResource = createResource;
1593
1605
  exports.createRoot = createRoot;
package/dist/dev.js CHANGED
@@ -127,7 +127,7 @@ function nextHydrateContext() {
127
127
 
128
128
  const equalFn = (a, b) => a === b;
129
129
  const $PROXY = Symbol("solid-proxy");
130
- const $DEVCOMP = Symbol('solid-dev-component');
130
+ const $DEVCOMP = Symbol("solid-dev-component");
131
131
  const signalOptions = {
132
132
  equals: equalFn
133
133
  };
@@ -166,14 +166,12 @@ function createRoot(fn, detachedOwner) {
166
166
  if (owner) root.name = `${owner.name}-r${rootCount++}`;
167
167
  Owner = root;
168
168
  Listener = null;
169
- let result;
170
169
  try {
171
- runUpdates(() => result = fn(() => cleanNode(root)), true);
170
+ return runUpdates(() => fn(() => cleanNode(root)), true);
172
171
  } finally {
173
172
  Listener = listener;
174
173
  Owner = owner;
175
174
  }
176
- return result;
177
175
  }
178
176
  function createSignal(value, options) {
179
177
  options = options ? Object.assign({}, signalOptions, options) : signalOptions;
@@ -207,7 +205,21 @@ function createEffect(fn, value, options) {
207
205
  s = SuspenseContext && lookup(Owner, SuspenseContext.id);
208
206
  if (s) c.suspense = s;
209
207
  c.user = true;
210
- Effects && Effects.push(c);
208
+ Effects ? Effects.push(c) : queueMicrotask(() => updateComputation(c));
209
+ }
210
+ function createReaction(onInvalidate, options) {
211
+ let fn;
212
+ const c = createComputation(() => {
213
+ fn ? fn() : untrack(onInvalidate);
214
+ fn = undefined;
215
+ }, undefined, false, 0, options ),
216
+ s = SuspenseContext && lookup(Owner, SuspenseContext.id);
217
+ if (s) c.suspense = s;
218
+ c.user = true;
219
+ return tracking => {
220
+ fn = tracking;
221
+ updateComputation(c);
222
+ };
211
223
  }
212
224
  function createMemo(fn, value, options) {
213
225
  options = options ? Object.assign({}, signalOptions, options) : signalOptions;
@@ -233,11 +245,11 @@ function createResource(source, fetcher, options) {
233
245
  fetcher = source;
234
246
  source = true;
235
247
  }
236
- options ||= {};
248
+ options || (options = {});
237
249
  if (options.globalRefetch !== false) {
238
250
  Resources || (Resources = new Set());
239
251
  Resources.add(load);
240
- onCleanup(() => Resources.delete(load));
252
+ Owner && onCleanup(() => Resources.delete(load));
241
253
  }
242
254
  const contexts = new Set(),
243
255
  [s, set] = createSignal(options.initialValue),
@@ -348,7 +360,7 @@ function createResource(source, fetcher, options) {
348
360
  }
349
361
  let Resources;
350
362
  function refetchResources(info) {
351
- Resources && Resources.forEach(fn => fn(info));
363
+ return Resources && Promise.all([...Resources].map(fn => fn(info)));
352
364
  }
353
365
  function createDeferred(source, options) {
354
366
  let t,
@@ -490,7 +502,7 @@ function startTransition(fn) {
490
502
  queue: new Set(),
491
503
  running: true
492
504
  });
493
- t.done ||= new Promise(res => t.resolve = res);
505
+ t.done || (t.done = new Promise(res => t.resolve = res));
494
506
  t.running = true;
495
507
  }
496
508
  batch(fn);
@@ -773,7 +785,7 @@ function runUpdates(fn, init) {
773
785
  if (Effects) wait = true;else Effects = [];
774
786
  ExecCount++;
775
787
  try {
776
- fn();
788
+ return fn();
777
789
  } catch (err) {
778
790
  handleError(err);
779
791
  } finally {
@@ -933,7 +945,7 @@ function handleError(err) {
933
945
  fns.forEach(f => f(err));
934
946
  }
935
947
  function lookup(owner, key) {
936
- return owner && (owner.context && owner.context[key] || owner.owner && lookup(owner.owner, key));
948
+ return owner && (owner.context && owner.context[key] !== undefined ? owner.context[key] : owner.owner && lookup(owner.owner, key));
937
949
  }
938
950
  function resolveChildren(children) {
939
951
  if (typeof children === "function" && !children.length) return resolveChildren(children());
@@ -1492,20 +1504,19 @@ function Suspense(props) {
1492
1504
  const key = sharedConfig.context.id + sharedConfig.context.count;
1493
1505
  p = sharedConfig.load(key);
1494
1506
  if (p) {
1495
- if (typeof p !== "object" || !("then" in p)) error = p;else {
1496
- const [s, set] = createSignal(undefined, {
1497
- equals: false
1498
- });
1499
- flicker = s;
1500
- p.then(err => {
1501
- if (error = err) return set();
1502
- sharedConfig.gather(key);
1503
- setHydrateContext(ctx);
1504
- set();
1505
- setHydrateContext();
1506
- p = undefined;
1507
- });
1508
- }
1507
+ if (typeof p !== "object" || !("then" in p)) p = Promise.resolve(p);
1508
+ const [s, set] = createSignal(undefined, {
1509
+ equals: false
1510
+ });
1511
+ flicker = s;
1512
+ p.then(err => {
1513
+ if (error = err) return set();
1514
+ sharedConfig.gather(key);
1515
+ setHydrateContext(ctx);
1516
+ set();
1517
+ setHydrateContext();
1518
+ p = undefined;
1519
+ });
1509
1520
  }
1510
1521
  }
1511
1522
  const listContext = useContext(SuspenseListContext);
@@ -1565,4 +1576,4 @@ if (globalThis) {
1565
1576
  if (!globalThis.Solid$$) globalThis.Solid$$ = true;else console.warn("You appear to have multiple instances of Solid. This can lead to unexpected behavior.");
1566
1577
  }
1567
1578
 
1568
- export { $DEVCOMP, $PROXY, DEV, ErrorBoundary, For, Index, Match, Show, Suspense, SuspenseList, Switch, batch, cancelCallback, children, createComponent, createComputed, createContext, createDeferred, createEffect, createMemo, createRenderEffect, createResource, createRoot, createSelector, createSignal, createUniqueId, enableExternalSource, enableHydration, enableScheduling, equalFn, from, getListener, getOwner, indexArray, lazy, mapArray, mergeProps, observable, on, onCleanup, onError, onMount, refetchResources, requestCallback, runWithOwner, sharedConfig, splitProps, startTransition, untrack, useContext, useTransition };
1579
+ 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, runWithOwner, sharedConfig, splitProps, startTransition, untrack, useContext, useTransition };
package/dist/server.cjs CHANGED
@@ -54,6 +54,11 @@ function createComputed(fn, value) {
54
54
  }
55
55
  const createRenderEffect = createComputed;
56
56
  function createEffect(fn, value) {}
57
+ function createReaction(fn) {
58
+ return fn => {
59
+ fn();
60
+ };
61
+ }
57
62
  function createMemo(fn, value) {
58
63
  Owner = {
59
64
  owner: Owner,
@@ -131,7 +136,7 @@ function runWithOwner(o, fn) {
131
136
  }
132
137
  }
133
138
  function lookup(owner, key) {
134
- return owner && (owner.context && owner.context[key] || owner.owner && lookup(owner.owner, key));
139
+ return owner && (owner.context && owner.context[key] !== undefined ? owner.context[key] : owner.owner && lookup(owner.owner, key));
135
140
  }
136
141
  function resolveChildren(children) {
137
142
  if (typeof children === "function" && !children.length) return resolveChildren(children());
@@ -529,6 +534,7 @@ exports.createContext = createContext;
529
534
  exports.createDeferred = createDeferred;
530
535
  exports.createEffect = createEffect;
531
536
  exports.createMemo = createMemo;
537
+ exports.createReaction = createReaction;
532
538
  exports.createRenderEffect = createRenderEffect;
533
539
  exports.createResource = createResource;
534
540
  exports.createRoot = createRoot;
package/dist/server.js CHANGED
@@ -50,6 +50,11 @@ function createComputed(fn, value) {
50
50
  }
51
51
  const createRenderEffect = createComputed;
52
52
  function createEffect(fn, value) {}
53
+ function createReaction(fn) {
54
+ return fn => {
55
+ fn();
56
+ };
57
+ }
53
58
  function createMemo(fn, value) {
54
59
  Owner = {
55
60
  owner: Owner,
@@ -127,7 +132,7 @@ function runWithOwner(o, fn) {
127
132
  }
128
133
  }
129
134
  function lookup(owner, key) {
130
- return owner && (owner.context && owner.context[key] || owner.owner && lookup(owner.owner, key));
135
+ return owner && (owner.context && owner.context[key] !== undefined ? owner.context[key] : owner.owner && lookup(owner.owner, key));
131
136
  }
132
137
  function resolveChildren(children) {
133
138
  if (typeof children === "function" && !children.length) return resolveChildren(children());
@@ -506,4 +511,4 @@ function Suspense(props) {
506
511
  return props.fallback;
507
512
  }
508
513
 
509
- export { $DEVCOMP, $PROXY, DEV, ErrorBoundary, For, Index, Match, Show, Suspense, SuspenseList, Switch, batch, children, createComponent, createComputed, createContext, createDeferred, createEffect, createMemo, createRenderEffect, createResource, createRoot, createSelector, createSignal, createUniqueId, enableExternalSource, enableHydration, enableScheduling, equalFn, from, getListener, getOwner, lazy, mapArray, mergeProps, observable, on, onCleanup, onError, onMount, requestCallback, runWithOwner, sharedConfig, splitProps, startTransition, untrack, useContext, useTransition };
514
+ export { $DEVCOMP, $PROXY, DEV, ErrorBoundary, For, Index, Match, Show, Suspense, SuspenseList, Switch, batch, children, createComponent, createComputed, createContext, createDeferred, createEffect, createMemo, createReaction, createRenderEffect, createResource, createRoot, createSelector, createSignal, createUniqueId, enableExternalSource, enableHydration, enableScheduling, equalFn, from, getListener, getOwner, lazy, mapArray, mergeProps, observable, on, onCleanup, onError, onMount, requestCallback, runWithOwner, sharedConfig, splitProps, startTransition, untrack, useContext, useTransition };
package/dist/solid.cjs CHANGED
@@ -131,7 +131,7 @@ function nextHydrateContext() {
131
131
 
132
132
  const equalFn = (a, b) => a === b;
133
133
  const $PROXY = Symbol("solid-proxy");
134
- const $DEVCOMP = Symbol('solid-dev-component');
134
+ const $DEVCOMP = Symbol("solid-dev-component");
135
135
  const signalOptions = {
136
136
  equals: equalFn
137
137
  };
@@ -168,14 +168,12 @@ function createRoot(fn, detachedOwner) {
168
168
  };
169
169
  Owner = root;
170
170
  Listener = null;
171
- let result;
172
171
  try {
173
- runUpdates(() => result = fn(() => cleanNode(root)), true);
172
+ return runUpdates(() => fn(() => cleanNode(root)), true);
174
173
  } finally {
175
174
  Listener = listener;
176
175
  Owner = owner;
177
176
  }
178
- return result;
179
177
  }
180
178
  function createSignal(value, options) {
181
179
  options = options ? Object.assign({}, signalOptions, options) : signalOptions;
@@ -208,7 +206,21 @@ function createEffect(fn, value, options) {
208
206
  s = SuspenseContext && lookup(Owner, SuspenseContext.id);
209
207
  if (s) c.suspense = s;
210
208
  c.user = true;
211
- Effects && Effects.push(c);
209
+ Effects ? Effects.push(c) : queueMicrotask(() => updateComputation(c));
210
+ }
211
+ function createReaction(onInvalidate, options) {
212
+ let fn;
213
+ const c = createComputation(() => {
214
+ fn ? fn() : untrack(onInvalidate);
215
+ fn = undefined;
216
+ }, undefined, false, 0),
217
+ s = SuspenseContext && lookup(Owner, SuspenseContext.id);
218
+ if (s) c.suspense = s;
219
+ c.user = true;
220
+ return tracking => {
221
+ fn = tracking;
222
+ updateComputation(c);
223
+ };
212
224
  }
213
225
  function createMemo(fn, value, options) {
214
226
  options = options ? Object.assign({}, signalOptions, options) : signalOptions;
@@ -234,11 +246,11 @@ function createResource(source, fetcher, options) {
234
246
  fetcher = source;
235
247
  source = true;
236
248
  }
237
- options ||= {};
249
+ options || (options = {});
238
250
  if (options.globalRefetch !== false) {
239
251
  Resources || (Resources = new Set());
240
252
  Resources.add(load);
241
- onCleanup(() => Resources.delete(load));
253
+ Owner && onCleanup(() => Resources.delete(load));
242
254
  }
243
255
  const contexts = new Set(),
244
256
  [s, set] = createSignal(options.initialValue),
@@ -349,7 +361,7 @@ function createResource(source, fetcher, options) {
349
361
  }
350
362
  let Resources;
351
363
  function refetchResources(info) {
352
- Resources && Resources.forEach(fn => fn(info));
364
+ return Resources && Promise.all([...Resources].map(fn => fn(info)));
353
365
  }
354
366
  function createDeferred(source, options) {
355
367
  let t,
@@ -491,7 +503,7 @@ function startTransition(fn) {
491
503
  queue: new Set(),
492
504
  running: true
493
505
  });
494
- t.done ||= new Promise(res => t.resolve = res);
506
+ t.done || (t.done = new Promise(res => t.resolve = res));
495
507
  t.running = true;
496
508
  }
497
509
  batch(fn);
@@ -720,7 +732,7 @@ function runUpdates(fn, init) {
720
732
  if (Effects) wait = true;else Effects = [];
721
733
  ExecCount++;
722
734
  try {
723
- fn();
735
+ return fn();
724
736
  } catch (err) {
725
737
  handleError(err);
726
738
  } finally {
@@ -879,7 +891,7 @@ function handleError(err) {
879
891
  fns.forEach(f => f(err));
880
892
  }
881
893
  function lookup(owner, key) {
882
- return owner && (owner.context && owner.context[key] || owner.owner && lookup(owner.owner, key));
894
+ return owner && (owner.context && owner.context[key] !== undefined ? owner.context[key] : owner.owner && lookup(owner.owner, key));
883
895
  }
884
896
  function resolveChildren(children) {
885
897
  if (typeof children === "function" && !children.length) return resolveChildren(children());
@@ -1415,20 +1427,19 @@ function Suspense(props) {
1415
1427
  const key = sharedConfig.context.id + sharedConfig.context.count;
1416
1428
  p = sharedConfig.load(key);
1417
1429
  if (p) {
1418
- if (typeof p !== "object" || !("then" in p)) error = p;else {
1419
- const [s, set] = createSignal(undefined, {
1420
- equals: false
1421
- });
1422
- flicker = s;
1423
- p.then(err => {
1424
- if (error = err) return set();
1425
- sharedConfig.gather(key);
1426
- setHydrateContext(ctx);
1427
- set();
1428
- setHydrateContext();
1429
- p = undefined;
1430
- });
1431
- }
1430
+ if (typeof p !== "object" || !("then" in p)) p = Promise.resolve(p);
1431
+ const [s, set] = createSignal(undefined, {
1432
+ equals: false
1433
+ });
1434
+ flicker = s;
1435
+ p.then(err => {
1436
+ if (error = err) return set();
1437
+ sharedConfig.gather(key);
1438
+ setHydrateContext(ctx);
1439
+ set();
1440
+ setHydrateContext();
1441
+ p = undefined;
1442
+ });
1432
1443
  }
1433
1444
  }
1434
1445
  const listContext = useContext(SuspenseListContext);
@@ -1497,6 +1508,7 @@ exports.createContext = createContext;
1497
1508
  exports.createDeferred = createDeferred;
1498
1509
  exports.createEffect = createEffect;
1499
1510
  exports.createMemo = createMemo;
1511
+ exports.createReaction = createReaction;
1500
1512
  exports.createRenderEffect = createRenderEffect;
1501
1513
  exports.createResource = createResource;
1502
1514
  exports.createRoot = createRoot;
package/dist/solid.js CHANGED
@@ -127,7 +127,7 @@ function nextHydrateContext() {
127
127
 
128
128
  const equalFn = (a, b) => a === b;
129
129
  const $PROXY = Symbol("solid-proxy");
130
- const $DEVCOMP = Symbol('solid-dev-component');
130
+ const $DEVCOMP = Symbol("solid-dev-component");
131
131
  const signalOptions = {
132
132
  equals: equalFn
133
133
  };
@@ -164,14 +164,12 @@ function createRoot(fn, detachedOwner) {
164
164
  };
165
165
  Owner = root;
166
166
  Listener = null;
167
- let result;
168
167
  try {
169
- runUpdates(() => result = fn(() => cleanNode(root)), true);
168
+ return runUpdates(() => fn(() => cleanNode(root)), true);
170
169
  } finally {
171
170
  Listener = listener;
172
171
  Owner = owner;
173
172
  }
174
- return result;
175
173
  }
176
174
  function createSignal(value, options) {
177
175
  options = options ? Object.assign({}, signalOptions, options) : signalOptions;
@@ -204,7 +202,21 @@ function createEffect(fn, value, options) {
204
202
  s = SuspenseContext && lookup(Owner, SuspenseContext.id);
205
203
  if (s) c.suspense = s;
206
204
  c.user = true;
207
- Effects && Effects.push(c);
205
+ Effects ? Effects.push(c) : queueMicrotask(() => updateComputation(c));
206
+ }
207
+ function createReaction(onInvalidate, options) {
208
+ let fn;
209
+ const c = createComputation(() => {
210
+ fn ? fn() : untrack(onInvalidate);
211
+ fn = undefined;
212
+ }, undefined, false, 0),
213
+ s = SuspenseContext && lookup(Owner, SuspenseContext.id);
214
+ if (s) c.suspense = s;
215
+ c.user = true;
216
+ return tracking => {
217
+ fn = tracking;
218
+ updateComputation(c);
219
+ };
208
220
  }
209
221
  function createMemo(fn, value, options) {
210
222
  options = options ? Object.assign({}, signalOptions, options) : signalOptions;
@@ -230,11 +242,11 @@ function createResource(source, fetcher, options) {
230
242
  fetcher = source;
231
243
  source = true;
232
244
  }
233
- options ||= {};
245
+ options || (options = {});
234
246
  if (options.globalRefetch !== false) {
235
247
  Resources || (Resources = new Set());
236
248
  Resources.add(load);
237
- onCleanup(() => Resources.delete(load));
249
+ Owner && onCleanup(() => Resources.delete(load));
238
250
  }
239
251
  const contexts = new Set(),
240
252
  [s, set] = createSignal(options.initialValue),
@@ -345,7 +357,7 @@ function createResource(source, fetcher, options) {
345
357
  }
346
358
  let Resources;
347
359
  function refetchResources(info) {
348
- Resources && Resources.forEach(fn => fn(info));
360
+ return Resources && Promise.all([...Resources].map(fn => fn(info)));
349
361
  }
350
362
  function createDeferred(source, options) {
351
363
  let t,
@@ -487,7 +499,7 @@ function startTransition(fn) {
487
499
  queue: new Set(),
488
500
  running: true
489
501
  });
490
- t.done ||= new Promise(res => t.resolve = res);
502
+ t.done || (t.done = new Promise(res => t.resolve = res));
491
503
  t.running = true;
492
504
  }
493
505
  batch(fn);
@@ -716,7 +728,7 @@ function runUpdates(fn, init) {
716
728
  if (Effects) wait = true;else Effects = [];
717
729
  ExecCount++;
718
730
  try {
719
- fn();
731
+ return fn();
720
732
  } catch (err) {
721
733
  handleError(err);
722
734
  } finally {
@@ -875,7 +887,7 @@ function handleError(err) {
875
887
  fns.forEach(f => f(err));
876
888
  }
877
889
  function lookup(owner, key) {
878
- return owner && (owner.context && owner.context[key] || owner.owner && lookup(owner.owner, key));
890
+ return owner && (owner.context && owner.context[key] !== undefined ? owner.context[key] : owner.owner && lookup(owner.owner, key));
879
891
  }
880
892
  function resolveChildren(children) {
881
893
  if (typeof children === "function" && !children.length) return resolveChildren(children());
@@ -1411,20 +1423,19 @@ function Suspense(props) {
1411
1423
  const key = sharedConfig.context.id + sharedConfig.context.count;
1412
1424
  p = sharedConfig.load(key);
1413
1425
  if (p) {
1414
- if (typeof p !== "object" || !("then" in p)) error = p;else {
1415
- const [s, set] = createSignal(undefined, {
1416
- equals: false
1417
- });
1418
- flicker = s;
1419
- p.then(err => {
1420
- if (error = err) return set();
1421
- sharedConfig.gather(key);
1422
- setHydrateContext(ctx);
1423
- set();
1424
- setHydrateContext();
1425
- p = undefined;
1426
- });
1427
- }
1426
+ if (typeof p !== "object" || !("then" in p)) p = Promise.resolve(p);
1427
+ const [s, set] = createSignal(undefined, {
1428
+ equals: false
1429
+ });
1430
+ flicker = s;
1431
+ p.then(err => {
1432
+ if (error = err) return set();
1433
+ sharedConfig.gather(key);
1434
+ setHydrateContext(ctx);
1435
+ set();
1436
+ setHydrateContext();
1437
+ p = undefined;
1438
+ });
1428
1439
  }
1429
1440
  }
1430
1441
  const listContext = useContext(SuspenseListContext);
@@ -1473,4 +1484,4 @@ function Suspense(props) {
1473
1484
 
1474
1485
  let DEV;
1475
1486
 
1476
- export { $DEVCOMP, $PROXY, DEV, ErrorBoundary, For, Index, Match, Show, Suspense, SuspenseList, Switch, batch, cancelCallback, children, createComponent, createComputed, createContext, createDeferred, createEffect, createMemo, createRenderEffect, createResource, createRoot, createSelector, createSignal, createUniqueId, enableExternalSource, enableHydration, enableScheduling, equalFn, from, getListener, getOwner, indexArray, lazy, mapArray, mergeProps, observable, on, onCleanup, onError, onMount, refetchResources, requestCallback, runWithOwner, sharedConfig, splitProps, startTransition, untrack, useContext, useTransition };
1487
+ 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, 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.0-rc.3",
4
+ "version": "1.3.2",
5
5
  "author": "Ryan Carniato",
6
6
  "license": "MIT",
7
7
  "homepage": "https://solidjs.com",
@@ -124,9 +124,9 @@
124
124
  "build": "npm-run-all -cnl build:*",
125
125
  "build:link": "symlink-dir . node_modules/solid-js",
126
126
  "build:js": "ncp ../../node_modules/dom-expressions/src/jsx.d.ts ./src/jsx.d.ts && rollup -c",
127
- "build:types": "tsc",
128
- "build:types-store": "tsc --project ./store/tsconfig.json && tsconfig-replace-paths --project ./store/tsconfig.types.json",
129
- "build:types-web": "tsc --project ./web/tsconfig.json && tsconfig-replace-paths --project ./web/tsconfig.types.json",
127
+ "build:types": "tsc --project ./tsconfig.build.json",
128
+ "build:types-store": "tsc --project ./store/tsconfig.build.json && tsconfig-replace-paths --project ./store/tsconfig.types.json",
129
+ "build:types-web": "tsc --project ./web/tsconfig.build.json && tsconfig-replace-paths --project ./web/tsconfig.types.json",
130
130
  "build:types-html": "tsc --project ./html/tsconfig.json",
131
131
  "build:types-h": "tsc --project ./h/tsconfig.json",
132
132
  "build:types-universal": "tsc --project ./universal/tsconfig.json",
@@ -144,5 +144,5 @@
144
144
  "compiler",
145
145
  "performance"
146
146
  ],
147
- "gitHead": "24a44a798dc517a578ac4881af594990a1faadc8"
147
+ "gitHead": "b0aa7b227de8a3b4dc686690207d54a8af244efc"
148
148
  }
@@ -103,7 +103,7 @@ const proxyTraps$1 = {
103
103
  node = nodes[property] || (nodes[property] = createDataNode());
104
104
  node();
105
105
  }
106
- return wrappable ? wrap$1(value, target[$NAME] && `${target[$NAME]}:${property}`) : value;
106
+ return wrappable ? wrap$1(value, target[$NAME] && `${target[$NAME]}:${property.toString()}`) : value;
107
107
  },
108
108
  set() {
109
109
  console.warn("Cannot mutate a Store directly");
@@ -344,8 +344,7 @@ function reconcile(value, options = {}) {
344
344
  key = "id"
345
345
  } = options,
346
346
  v = unwrap(value);
347
- return s => {
348
- const state = s;
347
+ return state => {
349
348
  if (!isWrappable(state) || !isWrappable(v)) return v;
350
349
  applyState(v, {
351
350
  state
@@ -369,8 +368,7 @@ const setterTraps = {
369
368
  }
370
369
  };
371
370
  function produce(fn) {
372
- return s => {
373
- const state = s;
371
+ return state => {
374
372
  if (isWrappable(state)) fn(new Proxy(state, setterTraps));
375
373
  return state;
376
374
  };
package/store/dist/dev.js CHANGED
@@ -99,7 +99,7 @@ const proxyTraps$1 = {
99
99
  node = nodes[property] || (nodes[property] = createDataNode());
100
100
  node();
101
101
  }
102
- return wrappable ? wrap$1(value, target[$NAME] && `${target[$NAME]}:${property}`) : value;
102
+ return wrappable ? wrap$1(value, target[$NAME] && `${target[$NAME]}:${property.toString()}`) : value;
103
103
  },
104
104
  set() {
105
105
  console.warn("Cannot mutate a Store directly");
@@ -340,8 +340,7 @@ function reconcile(value, options = {}) {
340
340
  key = "id"
341
341
  } = options,
342
342
  v = unwrap(value);
343
- return s => {
344
- const state = s;
343
+ return state => {
345
344
  if (!isWrappable(state) || !isWrappable(v)) return v;
346
345
  applyState(v, {
347
346
  state
@@ -365,8 +364,7 @@ const setterTraps = {
365
364
  }
366
365
  };
367
366
  function produce(fn) {
368
- return s => {
369
- const state = s;
367
+ return state => {
370
368
  if (isWrappable(state)) fn(new Proxy(state, setterTraps));
371
369
  return state;
372
370
  };
@@ -324,8 +324,7 @@ function reconcile(value, options = {}) {
324
324
  key = "id"
325
325
  } = options,
326
326
  v = unwrap(value);
327
- return s => {
328
- const state = s;
327
+ return state => {
329
328
  if (!isWrappable(state) || !isWrappable(v)) return v;
330
329
  applyState(v, {
331
330
  state
@@ -349,8 +348,7 @@ const setterTraps = {
349
348
  }
350
349
  };
351
350
  function produce(fn) {
352
- return s => {
353
- const state = s;
351
+ return state => {
354
352
  if (isWrappable(state)) fn(new Proxy(state, setterTraps));
355
353
  return state;
356
354
  };
@@ -320,8 +320,7 @@ function reconcile(value, options = {}) {
320
320
  key = "id"
321
321
  } = options,
322
322
  v = unwrap(value);
323
- return s => {
324
- const state = s;
323
+ return state => {
325
324
  if (!isWrappable(state) || !isWrappable(v)) return v;
326
325
  applyState(v, {
327
326
  state
@@ -345,8 +344,7 @@ const setterTraps = {
345
344
  }
346
345
  };
347
346
  function produce(fn) {
348
- return s => {
349
- const state = s;
347
+ return state => {
350
348
  if (isWrappable(state)) fn(new Proxy(state, setterTraps));
351
349
  return state;
352
350
  };
@@ -1,4 +1,4 @@
1
1
  export { createStore, unwrap, $RAW } from "./store";
2
- export type { Store, SetStoreFunction, NotWrappable, StoreNode, StoreSetter, StorePathRange, ArrayFilterFn, Part, Next, Readonly, DeepReadonly } from "./store";
2
+ export type { Store, SetStoreFunction, NotWrappable, StoreNode, StoreSetter, StorePathRange, ArrayFilterFn, Part, Next, WrappableNext, DeepReadonly } from "./store";
3
3
  export * from "./mutable";
4
4
  export * from "./modifiers";
@@ -1,7 +1,7 @@
1
- import { Store, NotWrappable, DeepReadonly } from "./store";
1
+ import { Store } from "./store";
2
2
  export declare type ReconcileOptions = {
3
3
  key?: string | null;
4
4
  merge?: boolean;
5
5
  };
6
- export declare function reconcile<T>(value: T | Store<T>, options?: ReconcileOptions): (state: T extends NotWrappable ? T : Store<DeepReadonly<T>>) => T extends NotWrappable ? T : Store<T>;
7
- export declare function produce<T>(fn: (state: T) => void): (state: T extends NotWrappable ? T : Store<DeepReadonly<T>>) => T extends NotWrappable ? T : Store<T>;
6
+ export declare function reconcile<T>(value: T, options?: ReconcileOptions): (state: unknown) => Store<T>;
7
+ export declare function produce<T>(fn: (state: T) => void): (state: Store<T>) => Store<T>;
@@ -1,4 +1,4 @@
1
- import { StoreNode, Store } from "./store";
2
- export declare function createMutable<T extends StoreNode>(state: T | Store<T>, options?: {
1
+ import { StoreNode } from "./store";
2
+ export declare function createMutable<T extends StoreNode>(state: T, options?: {
3
3
  name?: string;
4
- }): Store<T>;
4
+ }): T;
@@ -1,50 +1,15 @@
1
+ import { SetStoreFunction, Store } from "store";
1
2
  export declare const $RAW: unique symbol;
2
- declare type AddSymbolToPrimitive<T> = T extends {
3
- [Symbol.toPrimitive]: infer V;
4
- } ? {
5
- [Symbol.toPrimitive]: V;
6
- } : {};
7
- declare type AddCallable<T> = T extends {
8
- (...x: any[]): infer V;
9
- } ? {
10
- (...x: Parameters<T>): V;
11
- } : {};
12
- declare type NotWrappable = string | number | boolean | Function | null;
13
- export declare type Store<T> = {
14
- [P in keyof T]: T[P] extends object ? Store<T[P]> : T[P];
15
- } & {
16
- [$RAW]?: T;
17
- } & AddSymbolToPrimitive<T> & AddCallable<T>;
18
3
  export declare function isWrappable(obj: any): boolean;
19
4
  export declare function unwrap<T>(item: any): T;
20
5
  export declare function setProperty(state: any, property: string | number, value: any, force?: boolean): void;
21
6
  export declare function updatePath(current: any, path: any[], traversed?: (number | string)[]): void;
22
- declare type StoreSetter<T> = Partial<T> | ((prevState: T extends NotWrappable ? T : Store<T>, traversed?: (string | number)[]) => Partial<T> | void);
23
- declare type StorePathRange = {
24
- from?: number;
25
- to?: number;
26
- by?: number;
27
- };
28
- declare type ArrayFilterFn<T> = (item: T extends any[] ? T[number] : never, index: number) => boolean;
29
- declare type Part<T> = keyof T | Array<keyof T> | StorePathRange | ArrayFilterFn<T>;
30
- declare type Next<T, K> = K extends keyof T ? T[K] : K extends Array<keyof T> ? T[K[number]] : T extends any[] ? K extends StorePathRange ? T[number] : K extends ArrayFilterFn<T> ? T[number] : never : never;
31
- export interface SetStoreFunction<T> {
32
- <Setter extends StoreSetter<T>>(...args: [Setter]): void;
33
- <K1 extends Part<T>, Setter extends StoreSetter<Next<T, K1>>>(...args: [K1, Setter]): void;
34
- <K1 extends Part<T>, K2 extends Part<Next<T, K1>>, Setter extends StoreSetter<Next<Next<T, K1>, K2>>>(...args: [K1, K2, Setter]): void;
35
- <K1 extends Part<T>, K2 extends Part<Next<T, K1>>, K3 extends Part<Next<Next<T, K1>, K2>>, Setter extends StoreSetter<Next<Next<Next<T, K1>, K2>, K3>>>(...args: [K1, K2, K3, Setter]): void;
36
- <K1 extends Part<T>, K2 extends Part<Next<T, K1>>, K3 extends Part<Next<Next<T, K1>, K2>>, K4 extends Part<Next<Next<Next<T, K1>, K2>, K3>>, Setter extends StoreSetter<Next<Next<Next<Next<T, K1>, K2>, K3>, K4>>>(...args: [K1, K2, K3, K4, Setter]): void;
37
- <K1 extends Part<T>, K2 extends Part<Next<T, K1>>, K3 extends Part<Next<Next<T, K1>, K2>>, K4 extends Part<Next<Next<Next<T, K1>, K2>, K3>>, K5 extends Part<Next<Next<Next<Next<T, K1>, K2>, K3>, K4>>, Setter extends StoreSetter<Next<Next<Next<Next<Next<T, K1>, K2>, K3>, K4>, K5>>>(...args: [K1, K2, K3, K4, K5, Setter]): void;
38
- <K1 extends Part<T>, K2 extends Part<Next<T, K1>>, K3 extends Part<Next<Next<T, K1>, K2>>, K4 extends Part<Next<Next<Next<T, K1>, K2>, K3>>, K5 extends Part<Next<Next<Next<Next<T, K1>, K2>, K3>, K4>>, K6 extends Part<Next<Next<Next<Next<Next<T, K1>, K2>, K3>, K4>, K5>>, Setter extends StoreSetter<Next<Next<Next<Next<Next<Next<T, K1>, K2>, K3>, K4>, K5>, K6>>>(...args: [K1, K2, K3, K4, K5, K6, Setter]): void;
39
- <K1 extends Part<T>, K2 extends Part<Next<T, K1>>, K3 extends Part<Next<Next<T, K1>, K2>>, K4 extends Part<Next<Next<Next<T, K1>, K2>, K3>>, K5 extends Part<Next<Next<Next<Next<T, K1>, K2>, K3>, K4>>, K6 extends Part<Next<Next<Next<Next<Next<T, K1>, K2>, K3>, K4>, K5>>, K7 extends Part<Next<Next<Next<Next<Next<Next<T, K1>, K2>, K3>, K4>, K5>, K6>>, Setter extends StoreSetter<Next<Next<Next<Next<Next<Next<Next<T, K1>, K2>, K3>, K4>, K5>, K6>, K7>>>(...args: [K1, K2, K3, K4, K5, K6, K7, Setter]): void;
40
- <K1 extends Part<T>, K2 extends Part<Next<T, K1>>, K3 extends Part<Next<Next<T, K1>, K2>>, K4 extends Part<Next<Next<Next<T, K1>, K2>, K3>>, K5 extends Part<Next<Next<Next<Next<T, K1>, K2>, K3>, K4>>, K6 extends Part<Next<Next<Next<Next<Next<T, K1>, K2>, K3>, K4>, K5>>, K7 extends Part<Next<Next<Next<Next<Next<Next<T, K1>, K2>, K3>, K4>, K5>, K6>>, K8 extends Part<Next<Next<Next<Next<Next<Next<Next<T, K1>, K2>, K3>, K4>, K5>, K6>, K7>>>(...args: [K1, K2, K3, K4, K5, K6, K7, K8, ...(Part<any> | StoreSetter<any>)[]]): void;
41
- }
42
7
  export declare function createStore<T>(state: T | Store<T>): [Store<T>, SetStoreFunction<T>];
43
8
  export declare function createMutable<T>(state: T | Store<T>): Store<T>;
44
9
  declare type ReconcileOptions = {
45
10
  key?: string | null;
46
11
  merge?: boolean;
47
12
  };
48
- export declare function reconcile<T>(value: T | Store<T>, options?: ReconcileOptions): (state: T extends NotWrappable ? T : Store<T>) => void;
49
- export declare function produce<T>(fn: (state: T) => void): (state: T extends NotWrappable ? T : Store<T>) => T extends NotWrappable ? T : Store<T>;
13
+ export declare function reconcile<T>(value: T | Store<T>, options?: ReconcileOptions): (state: Store<T>) => void;
14
+ export declare function produce<T>(fn: (state: T) => void): (state: Store<T>) => Store<T>;
50
15
  export {};
@@ -1,72 +1,44 @@
1
- import { $PROXY, Accessor } from "../..";
1
+ import { Accessor } from "../..";
2
2
  export declare const $RAW: unique symbol, $NODE: unique symbol, $NAME: unique symbol;
3
- export declare type StoreNode = {
4
- [$NODE]?: any;
5
- [$PROXY]?: any;
6
- [$NAME]?: string;
7
- [k: string]: any;
8
- [k: number]: any;
9
- };
10
- declare type AddSymbolToPrimitive<T> = T extends {
11
- [Symbol.toPrimitive]: infer V;
12
- } ? {
13
- [Symbol.toPrimitive]: V;
14
- } : {};
15
- declare type AddSymbolIterator<T> = T extends {
16
- [Symbol.iterator]: infer V;
17
- } ? {
18
- [Symbol.iterator]: V;
19
- } : {};
20
- declare type AddSymbolToStringTag<T> = T extends {
21
- [Symbol.toStringTag]: infer V;
22
- } ? {
23
- [Symbol.toStringTag]: V;
24
- } : {};
25
- declare type AddCallable<T> = T extends {
26
- (...x: any[]): infer V;
27
- } ? {
28
- (...x: Parameters<T>): V;
29
- } : {};
30
- export declare type NotWrappable = string | number | boolean | Function | null;
31
- export declare type Store<T> = {
32
- [P in keyof T]: T[P] extends object ? Store<T[P]> & T[P] : T[P];
33
- } & {
34
- [$RAW]?: T;
35
- } & AddSymbolToPrimitive<T> & AddSymbolIterator<T> & AddSymbolToStringTag<T> & AddCallable<T>;
3
+ export declare type StoreNode = Record<keyof any, any>;
4
+ export declare type NotWrappable = string | number | bigint | symbol | boolean | Function | null | undefined;
5
+ export declare type Store<T> = DeepReadonly<T>;
36
6
  export declare function isWrappable(obj: any): any;
37
7
  export declare function unwrap<T extends StoreNode>(item: any, set?: Set<unknown>): T;
38
8
  export declare function getDataNodes(target: StoreNode): any;
39
- export declare function proxyDescriptor(target: StoreNode, property: string | number | symbol): PropertyDescriptor | undefined;
9
+ export declare function proxyDescriptor(target: StoreNode, property: keyof any): PropertyDescriptor | undefined;
40
10
  export declare function ownKeys(target: StoreNode): (string | symbol)[];
41
11
  export declare function createDataNode(): Accessor<void> & {
42
12
  $: () => void;
43
13
  };
44
- export declare function setProperty(state: StoreNode, property: string | number, value: any): void;
45
- export declare function updatePath(current: StoreNode, path: any[], traversed?: (number | string)[]): void;
46
- export declare type Readonly<T> = {
47
- readonly [K in keyof T]: DeepReadonly<T[K]>;
14
+ export declare function setProperty(state: StoreNode, property: keyof any, value: any): void;
15
+ export declare function updatePath(current: StoreNode, path: any[], traversed?: (keyof any)[]): void;
16
+ export declare type DeepReadonly<T> = {
17
+ readonly [K in keyof T]: T[K] extends NotWrappable ? T[K] : DeepReadonly<T[K]>;
48
18
  };
49
- export declare type DeepReadonly<T> = T extends [infer A] ? Readonly<[A]> : T extends [infer A, infer B] ? Readonly<[A, B]> : T extends [infer A, infer B, infer C] ? Readonly<[A, B, C]> : T extends [infer A, infer B, infer C, infer D] ? Readonly<[A, B, C, D]> : T extends [infer A, infer B, infer C, infer D, infer E] ? Readonly<[A, B, C, D, E]> : T extends [infer A, infer B, infer C, infer D, infer E, infer F] ? Readonly<[A, B, C, D, E, F]> : T extends [infer A, infer B, infer C, infer D, infer E, infer F, infer G] ? Readonly<[A, B, C, D, E, F, G]> : T extends [infer A, infer B, infer C, infer D, infer E, infer F, infer G, infer H] ? Readonly<[A, B, C, D, E, F, G, H]> : T extends object ? Readonly<T> : T;
50
- export declare type StoreSetter<T> = Partial<T> | ((prevState: T extends NotWrappable ? T : Store<DeepReadonly<T>>, traversed?: (string | number)[]) => Partial<T | DeepReadonly<T>> | void);
19
+ export declare type StoreSetter<T> = T | Partial<T> | ((prevState: T, traversed?: (keyof any)[]) => Partial<T> | void);
51
20
  export declare type StorePathRange = {
52
21
  from?: number;
53
22
  to?: number;
54
23
  by?: number;
55
24
  };
56
- export declare type ArrayFilterFn<T> = (item: T extends any[] ? T[number] : never, index: number) => boolean;
57
- export declare type Part<T> = T extends any[] ? keyof T | Array<keyof T> | ArrayFilterFn<T> | StorePathRange : T extends object ? keyof T | Array<keyof T> : never;
58
- export declare type NullableNext<T, K> = K extends keyof T ? T[K] : K extends Array<keyof T> ? T[K[number]] : T extends any[] ? K extends StorePathRange ? T[number] : K extends ArrayFilterFn<T> ? T[number] : never : never;
59
- export declare type Next<T, K> = NonNullable<NullableNext<T, K>>;
60
- export interface SetStoreFunction<T> {
61
- <Setter extends StoreSetter<T>>(...args: [Setter]): void;
62
- <K1 extends Part<T>, Setter extends StoreSetter<NullableNext<T, K1>>>(...args: [K1, Setter]): void;
63
- <K1 extends Part<T>, K2 extends Part<Next<T, K1>>, Setter extends StoreSetter<NullableNext<Next<T, K1>, K2>>>(...args: [K1, K2, Setter]): void;
64
- <K1 extends Part<T>, K2 extends Part<Next<T, K1>>, K3 extends Part<Next<Next<T, K1>, K2>>, Setter extends StoreSetter<NullableNext<Next<Next<T, K1>, K2>, K3>>>(...args: [K1, K2, K3, Setter]): void;
65
- <K1 extends Part<T>, K2 extends Part<Next<T, K1>>, K3 extends Part<Next<Next<T, K1>, K2>>, K4 extends Part<Next<Next<Next<T, K1>, K2>, K3>>, Setter extends StoreSetter<NullableNext<Next<Next<Next<T, K1>, K2>, K3>, K4>>>(...args: [K1, K2, K3, K4, Setter]): void;
66
- <K1 extends Part<T>, K2 extends Part<Next<T, K1>>, K3 extends Part<Next<Next<T, K1>, K2>>, K4 extends Part<Next<Next<Next<T, K1>, K2>, K3>>, K5 extends Part<Next<Next<Next<Next<T, K1>, K2>, K3>, K4>>, Setter extends StoreSetter<NullableNext<Next<Next<Next<Next<T, K1>, K2>, K3>, K4>, K5>>>(...args: [K1, K2, K3, K4, K5, Setter]): void;
67
- <K1 extends Part<T>, K2 extends Part<Next<T, K1>>, K3 extends Part<Next<Next<T, K1>, K2>>, K4 extends Part<Next<Next<Next<T, K1>, K2>, K3>>, K5 extends Part<Next<Next<Next<Next<T, K1>, K2>, K3>, K4>>, K6 extends Part<Next<Next<Next<Next<Next<T, K1>, K2>, K3>, K4>, K5>>, Setter extends StoreSetter<NullableNext<Next<Next<Next<Next<Next<T, K1>, K2>, K3>, K4>, K5>, K6>>>(...args: [K1, K2, K3, K4, K5, K6, Setter]): void;
68
- <K1 extends Part<T>, K2 extends Part<Next<T, K1>>, K3 extends Part<Next<Next<T, K1>, K2>>, K4 extends Part<Next<Next<Next<T, K1>, K2>, K3>>, K5 extends Part<Next<Next<Next<Next<T, K1>, K2>, K3>, K4>>, K6 extends Part<Next<Next<Next<Next<Next<T, K1>, K2>, K3>, K4>, K5>>, K7 extends Part<Next<Next<Next<Next<Next<Next<T, K1>, K2>, K3>, K4>, K5>, K6>>, Setter extends StoreSetter<NullableNext<Next<Next<Next<Next<Next<Next<T, K1>, K2>, K3>, K4>, K5>, K6>, K7>>>(...args: [K1, K2, K3, K4, K5, K6, K7, Setter]): void;
69
- <K1 extends Part<T>, K2 extends Part<Next<T, K1>>, K3 extends Part<Next<Next<T, K1>, K2>>, K4 extends Part<Next<Next<Next<T, K1>, K2>, K3>>, K5 extends Part<Next<Next<Next<Next<T, K1>, K2>, K3>, K4>>, K6 extends Part<Next<Next<Next<Next<Next<T, K1>, K2>, K3>, K4>, K5>>, K7 extends Part<Next<Next<Next<Next<Next<Next<T, K1>, K2>, K3>, K4>, K5>, K6>>, K8 extends Part<Next<Next<Next<Next<Next<Next<Next<T, K1>, K2>, K3>, K4>, K5>, K6>, K7>>>(...args: [K1, K2, K3, K4, K5, K6, K7, K8, ...(Part<any> | StoreSetter<any>)[]]): void;
25
+ export declare type ArrayFilterFn<T> = (item: T, index: number) => boolean;
26
+ export declare type Part<T> = [T] extends [never] ? never : [keyof T] extends [never] ? never : keyof T | (keyof T)[] | (number extends keyof T ? ArrayFilterFn<T[number]> | StorePathRange : never);
27
+ export declare type Next<T, K extends Part<T>> = [K] extends [never] ? never : K extends keyof T ? T[K] : K extends (keyof T)[] ? T[K[number]] : number extends keyof T ? T[number] : never;
28
+ export declare type WrappableNext<T, K extends Part<T>> = Exclude<Next<T, K>, NotWrappable>;
29
+ declare type DistributeRest<T, K extends Part<T>> = K extends K ? [K, ...Rest<Next<T, K>>] : never;
30
+ export declare type Rest<T> = 0 extends 1 & T ? [...(keyof any)[], any] : [StoreSetter<T>] | (T extends NotWrappable ? never : DistributeRest<T, Part<T>>);
31
+ export declare type SetStoreFunction<T> = _SetStoreFunction<Store<T>>;
32
+ interface _SetStoreFunction<T> {
33
+ <K1 extends Part<T>, K2 extends Part<T1>, K3 extends Part<T2>, K4 extends Part<T3>, K5 extends Part<T4>, K6 extends Part<T5>, K7 extends Part<T6>, T1 extends WrappableNext<T, K1>, T2 extends WrappableNext<T1, K2>, T3 extends WrappableNext<T2, K3>, T4 extends WrappableNext<T3, K4>, T5 extends WrappableNext<T4, K5>, T6 extends WrappableNext<T5, K6>>(k1: K1, k2: K2, k3: K3, k4: K4, k5: K5, k6: K6, k7: K7, ...rest: Rest<Next<T6, K7>>): void;
34
+ <K1 extends Part<T>, K2 extends Part<T1>, K3 extends Part<T2>, K4 extends Part<T3>, K5 extends Part<T4>, K6 extends Part<T5>, K7 extends Part<T6>, T1 extends WrappableNext<T, K1>, T2 extends WrappableNext<T1, K2>, T3 extends WrappableNext<T2, K3>, T4 extends WrappableNext<T3, K4>, T5 extends WrappableNext<T4, K5>, T6 extends WrappableNext<T5, K6>>(k1: K1, k2: K2, k3: K3, k4: K4, k5: K5, k6: K6, k7: K7, setter: StoreSetter<Next<T6, K7>>): void;
35
+ <K1 extends Part<T>, K2 extends Part<T1>, K3 extends Part<T2>, K4 extends Part<T3>, K5 extends Part<T4>, K6 extends Part<T5>, T1 extends WrappableNext<T, K1>, T2 extends WrappableNext<T1, K2>, T3 extends WrappableNext<T2, K3>, T4 extends WrappableNext<T3, K4>, T5 extends WrappableNext<T4, K5>>(k1: K1, k2: K2, k3: K3, k4: K4, k5: K5, k6: K6, setter: StoreSetter<Next<T5, K6>>): void;
36
+ <K1 extends Part<T>, K2 extends Part<T1>, K3 extends Part<T2>, K4 extends Part<T3>, K5 extends Part<T4>, T1 extends WrappableNext<T, K1>, T2 extends WrappableNext<T1, K2>, T3 extends WrappableNext<T2, K3>, T4 extends WrappableNext<T3, K4>>(k1: K1, k2: K2, k3: K3, k4: K4, k5: K5, setter: StoreSetter<Next<T4, K5>>): void;
37
+ <K1 extends Part<T>, K2 extends Part<T1>, K3 extends Part<T2>, K4 extends Part<T3>, T1 extends WrappableNext<T, K1>, T2 extends WrappableNext<T1, K2>, T3 extends WrappableNext<T2, K3>>(k1: K1, k2: K2, k3: K3, k4: K4, setter: StoreSetter<Next<T3, K4>>): void;
38
+ <K1 extends Part<T>, K2 extends Part<T1>, K3 extends Part<T2>, T1 extends WrappableNext<T, K1>, T2 extends WrappableNext<T1, K2>>(k1: K1, k2: K2, k3: K3, setter: StoreSetter<Next<T2, K3>>): void;
39
+ <K1 extends Part<T>, K2 extends Part<T1>, T1 extends WrappableNext<T, K1>>(k1: K1, k2: K2, setter: StoreSetter<Next<T1, K2>>): void;
40
+ <K extends Part<T>>(k: K, setter: StoreSetter<Next<T, K>>): void;
41
+ (setter: StoreSetter<T>): void;
70
42
  }
71
43
  /**
72
44
  * creates a reactive store that can be read through a proxy object and written with a setter function
package/types/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export { createRoot, createSignal, createEffect, createRenderEffect, createComputed, createDeferred, createSelector, createMemo, createResource, onMount, onCleanup, onError, untrack, batch, on, enableScheduling, enableExternalSource, startTransition, useTransition, refetchResources, createContext, useContext, children, getListener, getOwner, runWithOwner, equalFn, $DEVCOMP, $PROXY } from "./reactive/signal";
1
+ export { createRoot, createSignal, createEffect, createRenderEffect, createComputed, createReaction, createDeferred, createSelector, createMemo, createResource, onMount, onCleanup, onError, untrack, batch, on, enableScheduling, enableExternalSource, startTransition, useTransition, refetchResources, createContext, useContext, children, getListener, getOwner, runWithOwner, equalFn, $DEVCOMP, $PROXY } from "./reactive/signal";
2
2
  export type { Accessor, Setter, Resource, ResourceReturn, ResourceFetcher, ResourceFetcherInfo, Context, ReturnTypes } from "./reactive/signal";
3
3
  export * from "./reactive/observable";
4
4
  export * from "./reactive/scheduler";
package/types/jsx.d.ts CHANGED
@@ -3160,6 +3160,7 @@ export namespace JSX {
3160
3160
  startOffset?: number | string;
3161
3161
  method?: "align" | "stretch";
3162
3162
  spacing?: "auto" | "exact";
3163
+ href?: string;
3163
3164
  }
3164
3165
  interface TSpanSVGAttributes<T>
3165
3166
  extends TextContentElementSVGAttributes<T>,
@@ -158,6 +158,20 @@ export declare function createRenderEffect<Next, Init = undefined>(..._: undefin
158
158
  */
159
159
  export declare function createEffect<Next, Init = Next>(fn: EffectFunction<Init | Next, Next>, value: Init, options?: EffectOptions): void;
160
160
  export declare function createEffect<Next, Init = undefined>(..._: undefined extends Init ? [fn: EffectFunction<Init | Next, Next>, value?: Init, options?: EffectOptions] : [fn: EffectFunction<Init | Next, Next>, value: Init, options?: EffectOptions]): void;
161
+ /**
162
+ * Creates a reactive computation that runs after the render phase with flexible tracking
163
+ * ```typescript
164
+ * export function createReaction(
165
+ * onInvalidate: () => void,
166
+ * options?: { name?: string }
167
+ * ): (fn: () => void) => void;
168
+ * ```
169
+ * @param invalidated a function that is called when tracked function is invalidated.
170
+ * @param options allows to set a name in dev mode for debugging purposes
171
+ *
172
+ * @description https://www.solidjs.com/docs/latest/api#createreaction
173
+ */
174
+ export declare function createReaction(onInvalidate: () => void, options?: EffectOptions): (tracking: () => void) => void;
161
175
  interface Memo<Prev, Next = Prev> extends SignalState<Next>, Computation<Next> {
162
176
  tOwned?: Computation<Prev | Next, Next>[];
163
177
  }
@@ -171,7 +185,7 @@ export interface MemoOptions<T> extends EffectOptions {
171
185
  * fn: (v: T) => T,
172
186
  * value?: T,
173
187
  * options?: { name?: string, equals?: false | ((prev: T, next: T) => boolean) }
174
- * ): T;
188
+ * ): () => T;
175
189
  * ```
176
190
  * @param fn a function that receives its previous or the initial value, if set, and returns a new value used to react on a computation
177
191
  * @param value an optional initial value for the computation; if set, fn will never receive undefined as first argument
@@ -236,7 +250,7 @@ export declare function createResource<T, S = true>(fetcher: ResourceFetcher<S,
236
250
  export declare function createResource<T, S = true>(fetcher: ResourceFetcher<S, T>, options: ResourceOptions<T>): ResourceReturn<T>;
237
251
  export declare function createResource<T, S>(source: ResourceSource<S>, fetcher: ResourceFetcher<S, T>, options?: ResourceOptions<undefined>): ResourceReturn<T | undefined>;
238
252
  export declare function createResource<T, S>(source: ResourceSource<S>, fetcher: ResourceFetcher<S, T>, options: ResourceOptions<T>): ResourceReturn<T>;
239
- export declare function refetchResources(info?: unknown): void;
253
+ export declare function refetchResources(info?: unknown): Promise<any[]>;
240
254
  export interface DeferredOptions<T> {
241
255
  equals?: false | ((prev: T, next: T) => boolean);
242
256
  name?: string;
@@ -357,7 +371,7 @@ export declare function onCleanup(fn: () => void): () => void;
357
371
  export declare function onError(fn: (err: any) => void): void;
358
372
  export declare function getListener(): Computation<any, any> | null;
359
373
  export declare function getOwner(): Owner | null;
360
- export declare function runWithOwner(o: Owner, fn: () => any): void;
374
+ export declare function runWithOwner<T>(o: Owner, fn: () => T): T;
361
375
  export declare function enableScheduling(scheduler?: typeof requestCallback): void;
362
376
  /**
363
377
  * ```typescript
@@ -1,3 +1,3 @@
1
- export { createRoot, createSignal, createComputed, createRenderEffect, createEffect, createDeferred, createSelector, createMemo, getListener, onMount, onCleanup, onError, untrack, batch, on, children, createContext, useContext, getOwner, runWithOwner, equalFn, requestCallback, mapArray, observable, from, $PROXY, $DEVCOMP, DEV, enableExternalSource } from "./reactive";
1
+ export { createRoot, createSignal, createComputed, createRenderEffect, createEffect, createReaction, createDeferred, createSelector, createMemo, getListener, onMount, onCleanup, onError, untrack, batch, on, children, createContext, useContext, getOwner, runWithOwner, equalFn, requestCallback, mapArray, observable, from, $PROXY, $DEVCOMP, DEV, enableExternalSource } from "./reactive";
2
2
  export { mergeProps, splitProps, createComponent, For, Index, Show, Switch, Match, ErrorBoundary, Suspense, SuspenseList, createResource, enableScheduling, enableHydration, startTransition, useTransition, createUniqueId, lazy, sharedConfig } from "./rendering";
3
3
  export type { Component, Resource } from "./rendering";
@@ -16,6 +16,7 @@ export declare function createSignal<T>(value: T, options?: {
16
16
  export declare function createComputed<T>(fn: (v?: T) => T, value?: T): void;
17
17
  export declare const createRenderEffect: typeof createComputed;
18
18
  export declare function createEffect<T>(fn: (v?: T) => T, value?: T): void;
19
+ export declare function createReaction(fn: () => void): (fn: () => void) => void;
19
20
  export declare function createMemo<T>(fn: (v?: T) => T, value?: T): () => T;
20
21
  export declare function createDeferred<T>(source: () => T): () => T;
21
22
  export declare function createSelector<T>(source: () => T, fn: (k: T, value: T) => boolean): (k: T) => boolean;
package/web/dist/dev.cjs CHANGED
@@ -59,7 +59,7 @@ function reconcileArrays(parentNode, a, b) {
59
59
  while (bStart < bEnd) parentNode.insertBefore(b[bStart++], node);
60
60
  } else if (bEnd === bStart) {
61
61
  while (aStart < aEnd) {
62
- if (!map || !map.has(a[aStart])) parentNode.removeChild(a[aStart]);
62
+ if (!map || !map.has(a[aStart])) a[aStart].remove();
63
63
  aStart++;
64
64
  }
65
65
  } else if (a[aStart] === b[bEnd - 1] && b[bStart] === a[aEnd - 1]) {
@@ -88,7 +88,7 @@ function reconcileArrays(parentNode, a, b) {
88
88
  while (bStart < index) parentNode.insertBefore(b[bStart++], node);
89
89
  } else parentNode.replaceChild(b[bStart++], a[aStart++]);
90
90
  } else aStart++;
91
- } else parentNode.removeChild(a[aStart++]);
91
+ } else a[aStart++].remove();
92
92
  }
93
93
  }
94
94
  }
@@ -347,6 +347,7 @@ function spreadExpression(node, props, prevProps = {}, isSVG, skipChildren) {
347
347
  return prevProps;
348
348
  }
349
349
  function insertExpression(parent, value, current, marker, unwrapArray) {
350
+ if (solidJs.sharedConfig.context && !current) current = [...parent.childNodes];
350
351
  while (typeof current === "function") current = current();
351
352
  if (value === current) return current;
352
353
  const t = typeof value,
@@ -449,10 +450,10 @@ function cleanChildren(parent, current, marker, replacement) {
449
450
  const el = current[i];
450
451
  if (node !== el) {
451
452
  const isParent = el.parentNode === parent;
452
- if (!inserted && !i) isParent ? parent.replaceChild(node, el) : parent.insertBefore(node, marker);else isParent && parent.removeChild(el);
453
+ if (!inserted && !i) isParent ? parent.replaceChild(node, el) : parent.insertBefore(node, marker);else isParent && el.remove();
453
454
  } else inserted = true;
454
455
  }
455
- } else parent.insertBefore(node, marker);
456
+ } else if (current instanceof Node) parent.replaceChild(node, current);else parent.insertBefore(node, marker);
456
457
  return [node];
457
458
  }
458
459
  function gatherHydratable(element, root) {
package/web/dist/dev.js CHANGED
@@ -56,7 +56,7 @@ function reconcileArrays(parentNode, a, b) {
56
56
  while (bStart < bEnd) parentNode.insertBefore(b[bStart++], node);
57
57
  } else if (bEnd === bStart) {
58
58
  while (aStart < aEnd) {
59
- if (!map || !map.has(a[aStart])) parentNode.removeChild(a[aStart]);
59
+ if (!map || !map.has(a[aStart])) a[aStart].remove();
60
60
  aStart++;
61
61
  }
62
62
  } else if (a[aStart] === b[bEnd - 1] && b[bStart] === a[aEnd - 1]) {
@@ -85,7 +85,7 @@ function reconcileArrays(parentNode, a, b) {
85
85
  while (bStart < index) parentNode.insertBefore(b[bStart++], node);
86
86
  } else parentNode.replaceChild(b[bStart++], a[aStart++]);
87
87
  } else aStart++;
88
- } else parentNode.removeChild(a[aStart++]);
88
+ } else a[aStart++].remove();
89
89
  }
90
90
  }
91
91
  }
@@ -344,6 +344,7 @@ function spreadExpression(node, props, prevProps = {}, isSVG, skipChildren) {
344
344
  return prevProps;
345
345
  }
346
346
  function insertExpression(parent, value, current, marker, unwrapArray) {
347
+ if (sharedConfig.context && !current) current = [...parent.childNodes];
347
348
  while (typeof current === "function") current = current();
348
349
  if (value === current) return current;
349
350
  const t = typeof value,
@@ -446,10 +447,10 @@ function cleanChildren(parent, current, marker, replacement) {
446
447
  const el = current[i];
447
448
  if (node !== el) {
448
449
  const isParent = el.parentNode === parent;
449
- if (!inserted && !i) isParent ? parent.replaceChild(node, el) : parent.insertBefore(node, marker);else isParent && parent.removeChild(el);
450
+ if (!inserted && !i) isParent ? parent.replaceChild(node, el) : parent.insertBefore(node, marker);else isParent && el.remove();
450
451
  } else inserted = true;
451
452
  }
452
- } else parent.insertBefore(node, marker);
453
+ } else if (current instanceof Node) parent.replaceChild(node, current);else parent.insertBefore(node, marker);
453
454
  return [node];
454
455
  }
455
456
  function gatherHydratable(element, root) {
@@ -575,8 +575,8 @@ function getHydrationKey() {
575
575
  function generateHydrationScript({
576
576
  eventNames = ["click", "input"],
577
577
  nonce
578
- }) {
579
- return `<script${nonce ? ` nonce="${nonce}"` : ""}>var e,t;e=window._$HY||(_$HY={events:[],completed:new WeakSet,r:{}}),t=e=>e&&e.hasAttribute&&(e.hasAttribute("data-hk")?e:t(e.host&&e.host instanceof Node?e.host:e.parentNode)),["${eventNames.join('","')}"].forEach((o=>document.addEventListener(o,(o=>{let s=o.composedPath&&o.composedPath()[0]||o.target,a=t(s);a&&!e.completed.has(a)&&e.events.push([a,o])})))),e.init=(t,o)=>{e.r[t]=[new Promise(((e,t)=>o=e)),o]},e.set=(t,o,s)=>{(s=e.r[t])&&s[1](o),e.r[t]=[o]},e.unset=t=>{delete e.r[t]},e.load=(t,o)=>{if(o=e.r[t])return o[0]};</script><!xs>`;
578
+ } = {}) {
579
+ return `<script${nonce ? ` nonce="${nonce}"` : ""}>var e,t;e=window._$HY||(_$HY={events:[],completed:new WeakSet,r:{}}),t=e=>e&&e.hasAttribute&&(e.hasAttribute("data-hk")?e:t(e.host&&e.host instanceof Node?e.host:e.parentNode)),["${eventNames.join('","')}"].forEach((o=>document.addEventListener(o,(o=>{let s=o.composedPath&&o.composedPath()[0]||o.target,a=t(s);a&&!e.completed.has(a)&&e.events.push([a,o])})))),e.init=(t,o)=>{e.r[t]=[new Promise(((e,t)=>o=e)),o]},e.set=(t,o,s)=>{(s=e.r[t])&&s[1](o),e.r[t]=[o]},e.unset=t=>{delete e.r[t]},e.load=(t,o)=>{if(o=e.r[t])return o[0]};</script><!--xs-->`;
580
580
  }
581
581
  function injectAssets(assets, html) {
582
582
  for (let i = 0; i < assets.length; i++) {
@@ -586,7 +586,7 @@ function injectAssets(assets, html) {
586
586
  }
587
587
  function injectScripts(html, scripts, nonce) {
588
588
  const tag = `<script${nonce ? ` nonce="${nonce}"` : ""}>${scripts}</script>`;
589
- const index = html.indexOf("<!xs>");
589
+ const index = html.indexOf("<!--xs-->");
590
590
  if (index > -1) {
591
591
  return html.slice(0, index) + tag + html.slice(index);
592
592
  }
@@ -607,7 +607,7 @@ function waitForFragments(registry, key) {
607
607
  function serializeSet(registry, key, value) {
608
608
  const exist = registry.get(value);
609
609
  if (exist) return `_$HY.set("${key}", _$HY.r["${exist}"][0]);`;
610
- registry.set(value, key);
610
+ value !== null && typeof value === "object" && registry.set(value, key);
611
611
  return `_$HY.set("${key}", ${devalue(value)});`;
612
612
  }
613
613
  function pipeToNodeWritable(code, writable, options = {}) {
@@ -572,8 +572,8 @@ function getHydrationKey() {
572
572
  function generateHydrationScript({
573
573
  eventNames = ["click", "input"],
574
574
  nonce
575
- }) {
576
- return `<script${nonce ? ` nonce="${nonce}"` : ""}>var e,t;e=window._$HY||(_$HY={events:[],completed:new WeakSet,r:{}}),t=e=>e&&e.hasAttribute&&(e.hasAttribute("data-hk")?e:t(e.host&&e.host instanceof Node?e.host:e.parentNode)),["${eventNames.join('","')}"].forEach((o=>document.addEventListener(o,(o=>{let s=o.composedPath&&o.composedPath()[0]||o.target,a=t(s);a&&!e.completed.has(a)&&e.events.push([a,o])})))),e.init=(t,o)=>{e.r[t]=[new Promise(((e,t)=>o=e)),o]},e.set=(t,o,s)=>{(s=e.r[t])&&s[1](o),e.r[t]=[o]},e.unset=t=>{delete e.r[t]},e.load=(t,o)=>{if(o=e.r[t])return o[0]};</script><!xs>`;
575
+ } = {}) {
576
+ return `<script${nonce ? ` nonce="${nonce}"` : ""}>var e,t;e=window._$HY||(_$HY={events:[],completed:new WeakSet,r:{}}),t=e=>e&&e.hasAttribute&&(e.hasAttribute("data-hk")?e:t(e.host&&e.host instanceof Node?e.host:e.parentNode)),["${eventNames.join('","')}"].forEach((o=>document.addEventListener(o,(o=>{let s=o.composedPath&&o.composedPath()[0]||o.target,a=t(s);a&&!e.completed.has(a)&&e.events.push([a,o])})))),e.init=(t,o)=>{e.r[t]=[new Promise(((e,t)=>o=e)),o]},e.set=(t,o,s)=>{(s=e.r[t])&&s[1](o),e.r[t]=[o]},e.unset=t=>{delete e.r[t]},e.load=(t,o)=>{if(o=e.r[t])return o[0]};</script><!--xs-->`;
577
577
  }
578
578
  function injectAssets(assets, html) {
579
579
  for (let i = 0; i < assets.length; i++) {
@@ -583,7 +583,7 @@ function injectAssets(assets, html) {
583
583
  }
584
584
  function injectScripts(html, scripts, nonce) {
585
585
  const tag = `<script${nonce ? ` nonce="${nonce}"` : ""}>${scripts}</script>`;
586
- const index = html.indexOf("<!xs>");
586
+ const index = html.indexOf("<!--xs-->");
587
587
  if (index > -1) {
588
588
  return html.slice(0, index) + tag + html.slice(index);
589
589
  }
@@ -604,7 +604,7 @@ function waitForFragments(registry, key) {
604
604
  function serializeSet(registry, key, value) {
605
605
  const exist = registry.get(value);
606
606
  if (exist) return `_$HY.set("${key}", _$HY.r["${exist}"][0]);`;
607
- registry.set(value, key);
607
+ value !== null && typeof value === "object" && registry.set(value, key);
608
608
  return `_$HY.set("${key}", ${devalue(value)});`;
609
609
  }
610
610
  function pipeToNodeWritable(code, writable, options = {}) {
package/web/dist/web.cjs CHANGED
@@ -59,7 +59,7 @@ function reconcileArrays(parentNode, a, b) {
59
59
  while (bStart < bEnd) parentNode.insertBefore(b[bStart++], node);
60
60
  } else if (bEnd === bStart) {
61
61
  while (aStart < aEnd) {
62
- if (!map || !map.has(a[aStart])) parentNode.removeChild(a[aStart]);
62
+ if (!map || !map.has(a[aStart])) a[aStart].remove();
63
63
  aStart++;
64
64
  }
65
65
  } else if (a[aStart] === b[bEnd - 1] && b[bStart] === a[aEnd - 1]) {
@@ -88,7 +88,7 @@ function reconcileArrays(parentNode, a, b) {
88
88
  while (bStart < index) parentNode.insertBefore(b[bStart++], node);
89
89
  } else parentNode.replaceChild(b[bStart++], a[aStart++]);
90
90
  } else aStart++;
91
- } else parentNode.removeChild(a[aStart++]);
91
+ } else a[aStart++].remove();
92
92
  }
93
93
  }
94
94
  }
@@ -346,6 +346,7 @@ function spreadExpression(node, props, prevProps = {}, isSVG, skipChildren) {
346
346
  return prevProps;
347
347
  }
348
348
  function insertExpression(parent, value, current, marker, unwrapArray) {
349
+ if (solidJs.sharedConfig.context && !current) current = [...parent.childNodes];
349
350
  while (typeof current === "function") current = current();
350
351
  if (value === current) return current;
351
352
  const t = typeof value,
@@ -448,10 +449,10 @@ function cleanChildren(parent, current, marker, replacement) {
448
449
  const el = current[i];
449
450
  if (node !== el) {
450
451
  const isParent = el.parentNode === parent;
451
- if (!inserted && !i) isParent ? parent.replaceChild(node, el) : parent.insertBefore(node, marker);else isParent && parent.removeChild(el);
452
+ if (!inserted && !i) isParent ? parent.replaceChild(node, el) : parent.insertBefore(node, marker);else isParent && el.remove();
452
453
  } else inserted = true;
453
454
  }
454
- } else parent.insertBefore(node, marker);
455
+ } else if (current instanceof Node) parent.replaceChild(node, current);else parent.insertBefore(node, marker);
455
456
  return [node];
456
457
  }
457
458
  function gatherHydratable(element, root) {
package/web/dist/web.js CHANGED
@@ -56,7 +56,7 @@ function reconcileArrays(parentNode, a, b) {
56
56
  while (bStart < bEnd) parentNode.insertBefore(b[bStart++], node);
57
57
  } else if (bEnd === bStart) {
58
58
  while (aStart < aEnd) {
59
- if (!map || !map.has(a[aStart])) parentNode.removeChild(a[aStart]);
59
+ if (!map || !map.has(a[aStart])) a[aStart].remove();
60
60
  aStart++;
61
61
  }
62
62
  } else if (a[aStart] === b[bEnd - 1] && b[bStart] === a[aEnd - 1]) {
@@ -85,7 +85,7 @@ function reconcileArrays(parentNode, a, b) {
85
85
  while (bStart < index) parentNode.insertBefore(b[bStart++], node);
86
86
  } else parentNode.replaceChild(b[bStart++], a[aStart++]);
87
87
  } else aStart++;
88
- } else parentNode.removeChild(a[aStart++]);
88
+ } else a[aStart++].remove();
89
89
  }
90
90
  }
91
91
  }
@@ -343,6 +343,7 @@ function spreadExpression(node, props, prevProps = {}, isSVG, skipChildren) {
343
343
  return prevProps;
344
344
  }
345
345
  function insertExpression(parent, value, current, marker, unwrapArray) {
346
+ if (sharedConfig.context && !current) current = [...parent.childNodes];
346
347
  while (typeof current === "function") current = current();
347
348
  if (value === current) return current;
348
349
  const t = typeof value,
@@ -445,10 +446,10 @@ function cleanChildren(parent, current, marker, replacement) {
445
446
  const el = current[i];
446
447
  if (node !== el) {
447
448
  const isParent = el.parentNode === parent;
448
- if (!inserted && !i) isParent ? parent.replaceChild(node, el) : parent.insertBefore(node, marker);else isParent && parent.removeChild(el);
449
+ if (!inserted && !i) isParent ? parent.replaceChild(node, el) : parent.insertBefore(node, marker);else isParent && el.remove();
449
450
  } else inserted = true;
450
451
  }
451
- } else parent.insertBefore(node, marker);
452
+ } else if (current instanceof Node) parent.replaceChild(node, current);else parent.insertBefore(node, marker);
452
453
  return [node];
453
454
  }
454
455
  function gatherHydratable(element, root) {
@@ -53,7 +53,7 @@ export function dynamicProperty(props: unknown, key: string): unknown;
53
53
  export function hydrate(
54
54
  fn: () => JSX.Element,
55
55
  node: MountableElement,
56
- options: { renderId?: string }
56
+ options?: { renderId?: string }
57
57
  ): () => void;
58
58
  export function getHydrationKey(): string;
59
59
  export function getNextElement(template?: HTMLTemplateElement): Element;