solid-js 1.4.8 → 1.5.0-beta.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.
Files changed (58) hide show
  1. package/dist/dev.cjs +119 -134
  2. package/dist/dev.js +119 -134
  3. package/dist/server.cjs +98 -49
  4. package/dist/server.js +98 -49
  5. package/dist/solid.cjs +119 -132
  6. package/dist/solid.js +119 -132
  7. package/h/jsx-runtime/types/jsx.d.ts +8 -1401
  8. package/h/types/hyperscript.d.ts +17 -0
  9. package/html/types/lit.d.ts +37 -0
  10. package/package.json +103 -41
  11. package/store/dist/dev.cjs +40 -22
  12. package/store/dist/dev.js +41 -23
  13. package/store/dist/store.cjs +40 -22
  14. package/store/dist/store.js +40 -22
  15. package/store/types/index.d.ts +4 -4
  16. package/store/types/mutable.d.ts +1 -1
  17. package/store/types/server.d.ts +1 -1
  18. package/store/types/store.d.ts +1 -1
  19. package/types/index.d.ts +8 -8
  20. package/types/jsx.d.ts +196 -1580
  21. package/types/reactive/array.d.ts +1 -1
  22. package/types/reactive/observable.d.ts +1 -1
  23. package/types/reactive/signal.d.ts +69 -34
  24. package/types/render/Suspense.d.ts +1 -1
  25. package/types/render/component.d.ts +22 -7
  26. package/types/render/flow.d.ts +2 -2
  27. package/types/render/index.d.ts +4 -4
  28. package/types/server/index.d.ts +3 -3
  29. package/types/server/reactive.d.ts +8 -3
  30. package/types/server/rendering.d.ts +11 -6
  31. package/universal/dist/dev.cjs +0 -0
  32. package/universal/dist/dev.js +0 -0
  33. package/universal/dist/universal.cjs +0 -0
  34. package/universal/dist/universal.js +0 -0
  35. package/universal/types/index.d.ts +1 -1
  36. package/web/dist/dev.cjs +3 -3
  37. package/web/dist/dev.js +3 -3
  38. package/web/dist/server.cjs +66 -90
  39. package/web/dist/server.js +66 -90
  40. package/web/dist/web.cjs +3 -3
  41. package/web/dist/web.js +3 -3
  42. package/web/types/client.d.ts +1 -1
  43. package/web/types/core.d.ts +3 -3
  44. package/web/types/index.d.ts +8 -9
  45. package/web/types/jsx.d.ts +1 -1
  46. package/web/types/server-mock.d.ts +4 -2
  47. package/web/types/server.d.ts +70 -0
  48. package/h/README.md +0 -99
  49. package/h/jsx-runtime/package.json +0 -8
  50. package/h/package.json +0 -8
  51. package/html/README.md +0 -84
  52. package/html/package.json +0 -8
  53. package/store/README.md +0 -23
  54. package/store/package.json +0 -35
  55. package/universal/README.md +0 -102
  56. package/universal/package.json +0 -18
  57. package/web/README.md +0 -7
  58. package/web/package.json +0 -35
package/dist/solid.cjs CHANGED
@@ -138,7 +138,6 @@ const signalOptions = {
138
138
  };
139
139
  let ERROR = null;
140
140
  let runEffects = runQueue;
141
- const NOTPENDING = {};
142
141
  const STALE = 1;
143
142
  const PENDING = 2;
144
143
  const UNOWNED = {
@@ -147,13 +146,13 @@ const UNOWNED = {
147
146
  context: null,
148
147
  owner: null
149
148
  };
149
+ const NO_INIT = {};
150
150
  const [transPending, setTransPending] = /*@__PURE__*/createSignal(false);
151
151
  var Owner = null;
152
152
  let Transition = null;
153
153
  let Scheduler = null;
154
154
  let ExternalSourceFactory = null;
155
155
  let Listener = null;
156
- let Pending = null;
157
156
  let Updates = null;
158
157
  let Effects = null;
159
158
  let ExecCount = 0;
@@ -183,12 +182,11 @@ function createSignal(value, options) {
183
182
  value,
184
183
  observers: null,
185
184
  observerSlots: null,
186
- pending: NOTPENDING,
187
185
  comparator: options.equals || undefined
188
186
  };
189
187
  const setter = value => {
190
188
  if (typeof value === "function") {
191
- if (Transition && Transition.running && Transition.sources.has(s)) value = value(s.pending !== NOTPENDING ? s.pending : s.tValue);else value = value(s.pending !== NOTPENDING ? s.pending : s.value);
189
+ if (Transition && Transition.running && Transition.sources.has(s)) value = value(s.tValue);else value = value(s.value);
192
190
  }
193
191
  return writeSignal(s, value);
194
192
  };
@@ -227,7 +225,6 @@ function createReaction(onInvalidate, options) {
227
225
  function createMemo(fn, value, options) {
228
226
  options = options ? Object.assign({}, signalOptions, options) : signalOptions;
229
227
  const c = createComputation(fn, value, true, 0);
230
- c.pending = NOTPENDING;
231
228
  c.observers = null;
232
229
  c.observerSlots = null;
233
230
  c.comparator = options.equals || undefined;
@@ -237,46 +234,46 @@ function createMemo(fn, value, options) {
237
234
  } else updateComputation(c);
238
235
  return readSignal.bind(c);
239
236
  }
240
- function createResource(source, fetcher, options) {
241
- if (arguments.length === 2) {
242
- if (typeof fetcher === "object") {
243
- options = fetcher;
244
- fetcher = source;
245
- source = true;
246
- }
247
- } else if (arguments.length === 1) {
248
- fetcher = source;
237
+ function createResource(pSource, pFetcher, pOptions) {
238
+ let source;
239
+ let fetcher;
240
+ let options;
241
+ if (arguments.length === 2 && typeof pFetcher === "object" || arguments.length === 1) {
249
242
  source = true;
243
+ fetcher = pSource;
244
+ options = pFetcher || {};
245
+ } else {
246
+ source = pSource;
247
+ fetcher = pFetcher;
248
+ options = pOptions || {};
250
249
  }
251
- options || (options = {});
252
- const contexts = new Set(),
253
- [value, setValue] = createSignal(options.initialValue),
254
- [track, trigger] = createSignal(undefined, {
255
- equals: false
256
- }),
257
- [loading, setLoading] = createSignal(false),
258
- [error, setError] = createSignal();
259
250
  let err = undefined,
260
251
  pr = null,
261
- initP = null,
252
+ initP = NO_INIT,
262
253
  id = null,
263
254
  loadedUnderTransition = false,
264
255
  scheduled = false,
265
256
  resolved = ("initialValue" in options),
266
257
  dynamic = typeof source === "function" && createMemo(source);
258
+ const contexts = new Set(),
259
+ [value, setValue] = options.store ? options.store(options.initialValue) : createSignal(options.initialValue),
260
+ [track, trigger] = createSignal(undefined, {
261
+ equals: false
262
+ }),
263
+ [state, setState] = createSignal(resolved ? "ready" : "unresolved");
267
264
  if (sharedConfig.context) {
268
265
  id = `${sharedConfig.context.id}${sharedConfig.context.count++}`;
269
- if (sharedConfig.load) initP = sharedConfig.load(id);
266
+ let v;
267
+ if (sharedConfig.load && (v = sharedConfig.load(id))) initP = v[0];
270
268
  }
271
- function loadEnd(p, v, e, key) {
269
+ function loadEnd(p, v, success, key) {
272
270
  if (pr === p) {
273
271
  pr = null;
274
272
  resolved = true;
275
- if (initP && (p === initP || v === initP) && options.onHydrated) queueMicrotask(() => options.onHydrated(key, {
273
+ if ((p === initP || v === initP) && options.onHydrated) queueMicrotask(() => options.onHydrated(key, {
276
274
  value: v
277
275
  }));
278
- initP = null;
279
- setError(err = e);
276
+ initP = NO_INIT;
280
277
  if (Transition && p && loadedUnderTransition) {
281
278
  Transition.promises.delete(p);
282
279
  loadedUnderTransition = false;
@@ -286,19 +283,20 @@ function createResource(source, fetcher, options) {
286
283
  Effects.push.apply(Effects, Transition.effects);
287
284
  Transition.effects = [];
288
285
  }
289
- completeLoad(v);
286
+ completeLoad(v, success);
290
287
  }, false);
291
- } else completeLoad(v);
288
+ } else completeLoad(v, success);
292
289
  }
293
290
  return v;
294
291
  }
295
- function completeLoad(v) {
296
- batch(() => {
292
+ function completeLoad(v, success) {
293
+ !success && (err = castError(v));
294
+ runUpdates(() => {
297
295
  setValue(() => v);
298
- setLoading(false);
296
+ setState(success ? "ready" : "error");
299
297
  for (const c of contexts.keys()) c.decrement();
300
298
  contexts.clear();
301
- });
299
+ }, false);
302
300
  }
303
301
  function read() {
304
302
  const c = SuspenseContext && lookup(Owner, SuspenseContext.id),
@@ -318,48 +316,54 @@ function createResource(source, fetcher, options) {
318
316
  return v;
319
317
  }
320
318
  function load(refetching = true) {
321
- if (refetching && scheduled) return;
319
+ if (refetching !== false && scheduled) return;
322
320
  scheduled = false;
323
- setError(err = undefined);
321
+ err = undefined;
324
322
  const lookup = dynamic ? dynamic() : source;
325
323
  loadedUnderTransition = Transition && Transition.running;
326
324
  if (lookup == null || lookup === false) {
327
- loadEnd(pr, untrack(value));
325
+ loadEnd(pr, untrack(value), true);
328
326
  return;
329
327
  }
330
328
  if (Transition && pr) Transition.promises.delete(pr);
331
- const p = initP || untrack(() => fetcher(lookup, {
329
+ const p = initP !== NO_INIT ? initP : untrack(() => fetcher(lookup, {
332
330
  value: value(),
333
331
  refetching
334
332
  }));
335
333
  if (typeof p !== "object" || !("then" in p)) {
336
- loadEnd(pr, p);
334
+ loadEnd(pr, p, true);
337
335
  return p;
338
336
  }
339
337
  pr = p;
340
338
  scheduled = true;
341
339
  queueMicrotask(() => scheduled = false);
342
- batch(() => {
343
- setLoading(true);
340
+ runUpdates(() => {
341
+ setState(resolved ? "refreshing" : "pending");
344
342
  trigger();
345
- });
346
- return p.then(v => loadEnd(p, v, undefined, lookup), e => loadEnd(p, e, e));
343
+ }, false);
344
+ return p.then(v => loadEnd(p, v, true, lookup), e => loadEnd(p, e, false));
347
345
  }
348
346
  Object.defineProperties(read, {
347
+ state: {
348
+ get() {
349
+ return state();
350
+ }
351
+ },
349
352
  loading: {
350
353
  get() {
351
- return loading();
354
+ const s = state();
355
+ return s === "pending" || s === "refreshing";
352
356
  }
353
357
  },
354
358
  error: {
355
359
  get() {
356
- return error();
360
+ return state() === "error" ? err : undefined;
357
361
  }
358
362
  },
359
363
  latest: {
360
364
  get() {
361
365
  if (!resolved) return read();
362
- if (err) throw err;
366
+ if (state() === "error") throw err;
363
367
  return value();
364
368
  }
365
369
  }
@@ -412,25 +416,7 @@ function createSelector(source, fn = equalFn, options) {
412
416
  };
413
417
  }
414
418
  function batch(fn) {
415
- if (Pending) return fn();
416
- let result;
417
- const q = Pending = [];
418
- try {
419
- result = fn();
420
- } finally {
421
- Pending = null;
422
- }
423
- runUpdates(() => {
424
- for (let i = 0; i < q.length; i += 1) {
425
- const data = q[i];
426
- if (data.pending !== NOTPENDING) {
427
- const pending = data.pending;
428
- data.pending = NOTPENDING;
429
- writeSignal(data, pending);
430
- }
431
- }
432
- }, false);
433
- return result;
419
+ return runUpdates(fn, false);
434
420
  }
435
421
  function untrack(fn) {
436
422
  let result,
@@ -513,7 +499,7 @@ function startTransition(fn) {
513
499
  t.done || (t.done = new Promise(res => t.resolve = res));
514
500
  t.running = true;
515
501
  }
516
- batch(fn);
502
+ runUpdates(fn, false);
517
503
  Listener = Owner = null;
518
504
  return t ? t.done : undefined;
519
505
  });
@@ -566,10 +552,12 @@ function enableExternalSource(factory) {
566
552
  function readSignal() {
567
553
  const runningTransition = Transition && Transition.running;
568
554
  if (this.sources && (!runningTransition && this.state || runningTransition && this.tState)) {
569
- const updates = Updates;
570
- Updates = null;
571
- !runningTransition && this.state === STALE || runningTransition && this.tState === STALE ? updateComputation(this) : lookUpstream(this);
572
- Updates = updates;
555
+ if (!runningTransition && this.state === STALE || runningTransition && this.tState === STALE) updateComputation(this);else {
556
+ const updates = Updates;
557
+ Updates = null;
558
+ runUpdates(() => lookUpstream(this), false);
559
+ Updates = updates;
560
+ }
573
561
  }
574
562
  if (Listener) {
575
563
  const sSlot = this.observers ? this.observers.length : 0;
@@ -592,42 +580,35 @@ function readSignal() {
592
580
  return this.value;
593
581
  }
594
582
  function writeSignal(node, value, isComp) {
595
- if (Pending) {
596
- if (node.pending === NOTPENDING) Pending.push(node);
597
- node.pending = value;
598
- return value;
599
- }
600
- if (node.comparator) {
601
- if (Transition && Transition.running && Transition.sources.has(node)) {
602
- if (node.comparator(node.tValue, value)) return value;
603
- } else if (node.comparator(node.value, value)) return value;
604
- }
605
- let TransitionRunning = false;
606
- if (Transition) {
607
- TransitionRunning = Transition.running;
608
- if (TransitionRunning || !isComp && Transition.sources.has(node)) {
609
- Transition.sources.add(node);
610
- node.tValue = value;
611
- }
612
- if (!TransitionRunning) node.value = value;
613
- } else node.value = value;
614
- if (node.observers && node.observers.length) {
615
- runUpdates(() => {
616
- for (let i = 0; i < node.observers.length; i += 1) {
617
- const o = node.observers[i];
618
- if (TransitionRunning && Transition.disposed.has(o)) continue;
619
- if (TransitionRunning && !o.tState || !TransitionRunning && !o.state) {
620
- if (o.pure) Updates.push(o);else Effects.push(o);
621
- if (o.observers) markDownstream(o);
622
- }
623
- if (TransitionRunning) o.tState = STALE;else o.state = STALE;
624
- }
625
- if (Updates.length > 10e5) {
626
- Updates = [];
627
- if (false) ;
628
- throw new Error();
583
+ let current = Transition && Transition.running && Transition.sources.has(node) ? node.tValue : node.value;
584
+ if (!node.comparator || !node.comparator(current, value)) {
585
+ if (Transition) {
586
+ const TransitionRunning = Transition.running;
587
+ if (TransitionRunning || !isComp && Transition.sources.has(node)) {
588
+ Transition.sources.add(node);
589
+ node.tValue = value;
629
590
  }
630
- }, false);
591
+ if (!TransitionRunning) node.value = value;
592
+ } else node.value = value;
593
+ if (node.observers && node.observers.length) {
594
+ runUpdates(() => {
595
+ for (let i = 0; i < node.observers.length; i += 1) {
596
+ const o = node.observers[i];
597
+ const TransitionRunning = Transition && Transition.running;
598
+ if (TransitionRunning && Transition.disposed.has(o)) continue;
599
+ if (TransitionRunning && !o.tState || !TransitionRunning && !o.state) {
600
+ if (o.pure) Updates.push(o);else Effects.push(o);
601
+ if (o.observers) markDownstream(o);
602
+ }
603
+ if (TransitionRunning) o.tState = STALE;else o.state = STALE;
604
+ }
605
+ if (Updates.length > 10e5) {
606
+ Updates = [];
607
+ if (false) ;
608
+ throw new Error();
609
+ }
610
+ }, false);
611
+ }
631
612
  }
632
613
  return value;
633
614
  }
@@ -655,10 +636,11 @@ function runComputation(node, value, time) {
655
636
  try {
656
637
  nextValue = node.fn(value);
657
638
  } catch (err) {
639
+ if (node.pure) Transition && Transition.running ? node.tState = STALE : node.state = STALE;
658
640
  handleError(err);
659
641
  }
660
642
  if (!node.updatedAt || node.updatedAt <= time) {
661
- if (node.observers && node.observers.length) {
643
+ if (node.updatedAt && "observers" in node) {
662
644
  writeSignal(node, nextValue, true);
663
645
  } else if (Transition && Transition.running && node.pure) {
664
646
  Transition.sources.add(node);
@@ -731,7 +713,7 @@ function runTop(node) {
731
713
  } else if (!runningTransition && node.state === PENDING || runningTransition && node.tState === PENDING) {
732
714
  const updates = Updates;
733
715
  Updates = null;
734
- lookUpstream(node, ancestors[0]);
716
+ runUpdates(() => lookUpstream(node, ancestors[0]), false);
735
717
  Updates = updates;
736
718
  }
737
719
  }
@@ -774,7 +756,7 @@ function completeUpdates(wait) {
774
756
  delete e.tState;
775
757
  }
776
758
  Transition = null;
777
- batch(() => {
759
+ runUpdates(() => {
778
760
  for (const d of disposed) cleanNode(d);
779
761
  for (const v of sources) {
780
762
  v.value = v.tValue;
@@ -787,14 +769,11 @@ function completeUpdates(wait) {
787
769
  v.tState = 0;
788
770
  }
789
771
  setTransPending(false);
790
- });
791
- }
792
- if (Effects.length) batch(() => {
793
- runEffects(Effects);
794
- Effects = null;
795
- });else {
796
- Effects = null;
772
+ }, false);
797
773
  }
774
+ const e = Effects;
775
+ Effects = null;
776
+ if (e.length) runUpdates(() => runEffects(e), false);
798
777
  if (res) res();
799
778
  }
800
779
  function runQueue(queue) {
@@ -829,9 +808,9 @@ function runUserEffects(queue) {
829
808
  if (!e.user) runTop(e);else queue[userLength++] = e;
830
809
  }
831
810
  if (sharedConfig.context) setHydrateContext();
832
- const resume = queue.length;
811
+ Effects = [];
833
812
  for (i = 0; i < userLength; i++) runTop(queue[i]);
834
- for (i = resume; i < queue.length; i++) runTop(queue[i]);
813
+ if (Effects.length) runUserEffects(Effects);
835
814
  }
836
815
  function lookUpstream(node, ignore) {
837
816
  const runningTransition = Transition && Transition.running;
@@ -900,7 +879,12 @@ function reset(node, top) {
900
879
  for (let i = 0; i < node.owned.length; i++) reset(node.owned[i]);
901
880
  }
902
881
  }
882
+ function castError(err) {
883
+ if (err instanceof Error || typeof err === "string") return err;
884
+ return new Error("Unknown error");
885
+ }
903
886
  function handleError(err) {
887
+ err = castError(err);
904
888
  const fns = ERROR && lookup(Owner, ERROR);
905
889
  if (!fns) throw err;
906
890
  for (const f of fns) f(err);
@@ -946,7 +930,7 @@ function observable(input) {
946
930
  };
947
931
  }
948
932
  const dispose = createRoot(disposer => {
949
- createComputed(() => {
933
+ createEffect(() => {
950
934
  const v = input();
951
935
  untrack(() => handler(v));
952
936
  });
@@ -1335,24 +1319,24 @@ function Match(props) {
1335
1319
  return props;
1336
1320
  }
1337
1321
  let Errors;
1338
- const NoErrors = {};
1339
1322
  function resetErrorBoundaries() {
1340
- Errors && [...Errors].forEach(fn => fn(NoErrors));
1323
+ Errors && [...Errors].forEach(fn => fn());
1341
1324
  }
1342
1325
  function ErrorBoundary(props) {
1343
- let err = NoErrors;
1344
- if (sharedConfig.context && sharedConfig.load) {
1345
- err = sharedConfig.load(sharedConfig.context.id + sharedConfig.context.count) || NoErrors;
1346
- }
1326
+ let err;
1327
+ let v;
1328
+ if (sharedConfig.context && sharedConfig.load && (v = sharedConfig.load(sharedConfig.context.id + sharedConfig.context.count))) err = v[0];
1347
1329
  const [errored, setErrored] = createSignal(err);
1348
1330
  Errors || (Errors = new Set());
1349
1331
  Errors.add(setErrored);
1350
1332
  onCleanup(() => Errors.delete(setErrored));
1351
1333
  return createMemo(() => {
1352
1334
  let e;
1353
- if ((e = errored()) !== NoErrors) {
1335
+ if (e = errored()) {
1354
1336
  const f = props.fallback;
1355
- return typeof f === "function" && f.length ? untrack(() => f(e, () => setErrored(NoErrors))) : f;
1337
+ const res = typeof f === "function" && f.length ? untrack(() => f(e, () => setErrored())) : f;
1338
+ onError(setErrored);
1339
+ return res;
1356
1340
  }
1357
1341
  onError(setErrored);
1358
1342
  return props.children;
@@ -1447,21 +1431,24 @@ function Suspense(props) {
1447
1431
  owner = getOwner();
1448
1432
  if (sharedConfig.context && sharedConfig.load) {
1449
1433
  const key = sharedConfig.context.id + sharedConfig.context.count;
1450
- p = sharedConfig.load(key);
1451
- if (p) {
1434
+ let ref = sharedConfig.load(key);
1435
+ if (ref && (p = ref[0]) && p !== "$$f") {
1452
1436
  if (typeof p !== "object" || !("then" in p)) p = Promise.resolve(p);
1453
1437
  const [s, set] = createSignal(undefined, {
1454
1438
  equals: false
1455
1439
  });
1456
1440
  flicker = s;
1457
1441
  p.then(err => {
1458
- if ((error = err) || sharedConfig.done) return set();
1442
+ if (err || sharedConfig.done) {
1443
+ err && (error = err);
1444
+ return set();
1445
+ }
1459
1446
  sharedConfig.gather(key);
1460
1447
  setHydrateContext(ctx);
1461
1448
  set();
1462
1449
  setHydrateContext();
1463
1450
  });
1464
- } else if (p === null) sharedConfig.gather(key);
1451
+ }
1465
1452
  }
1466
1453
  const listContext = useContext(SuspenseListContext);
1467
1454
  if (listContext) [showContent, showFallback] = listContext.register(store.inFallback);
@@ -1477,14 +1464,14 @@ function Suspense(props) {
1477
1464
  flicker();
1478
1465
  return flicker = undefined;
1479
1466
  }
1480
- if (ctx && p === undefined) setHydrateContext();
1467
+ if (ctx && p === "$$f") setHydrateContext();
1481
1468
  const rendered = createMemo(() => props.children);
1482
1469
  return createMemo(() => {
1483
1470
  const inFallback = store.inFallback(),
1484
1471
  visibleContent = showContent ? showContent() : true,
1485
1472
  visibleFallback = showFallback ? showFallback() : true;
1486
1473
  dispose && dispose();
1487
- if ((!inFallback || p !== undefined) && visibleContent) {
1474
+ if ((!inFallback || p && p !== "$$f") && visibleContent) {
1488
1475
  store.resolved = true;
1489
1476
  ctx = p = undefined;
1490
1477
  resumeEffects(store.effects);