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.js CHANGED
@@ -134,7 +134,6 @@ const signalOptions = {
134
134
  };
135
135
  let ERROR = null;
136
136
  let runEffects = runQueue;
137
- const NOTPENDING = {};
138
137
  const STALE = 1;
139
138
  const PENDING = 2;
140
139
  const UNOWNED = {
@@ -143,13 +142,13 @@ const UNOWNED = {
143
142
  context: null,
144
143
  owner: null
145
144
  };
145
+ const NO_INIT = {};
146
146
  const [transPending, setTransPending] = /*@__PURE__*/createSignal(false);
147
147
  var Owner = null;
148
148
  let Transition = null;
149
149
  let Scheduler = null;
150
150
  let ExternalSourceFactory = null;
151
151
  let Listener = null;
152
- let Pending = null;
153
152
  let Updates = null;
154
153
  let Effects = null;
155
154
  let ExecCount = 0;
@@ -179,12 +178,11 @@ function createSignal(value, options) {
179
178
  value,
180
179
  observers: null,
181
180
  observerSlots: null,
182
- pending: NOTPENDING,
183
181
  comparator: options.equals || undefined
184
182
  };
185
183
  const setter = value => {
186
184
  if (typeof value === "function") {
187
- 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);
185
+ if (Transition && Transition.running && Transition.sources.has(s)) value = value(s.tValue);else value = value(s.value);
188
186
  }
189
187
  return writeSignal(s, value);
190
188
  };
@@ -223,7 +221,6 @@ function createReaction(onInvalidate, options) {
223
221
  function createMemo(fn, value, options) {
224
222
  options = options ? Object.assign({}, signalOptions, options) : signalOptions;
225
223
  const c = createComputation(fn, value, true, 0);
226
- c.pending = NOTPENDING;
227
224
  c.observers = null;
228
225
  c.observerSlots = null;
229
226
  c.comparator = options.equals || undefined;
@@ -233,46 +230,46 @@ function createMemo(fn, value, options) {
233
230
  } else updateComputation(c);
234
231
  return readSignal.bind(c);
235
232
  }
236
- function createResource(source, fetcher, options) {
237
- if (arguments.length === 2) {
238
- if (typeof fetcher === "object") {
239
- options = fetcher;
240
- fetcher = source;
241
- source = true;
242
- }
243
- } else if (arguments.length === 1) {
244
- fetcher = source;
233
+ function createResource(pSource, pFetcher, pOptions) {
234
+ let source;
235
+ let fetcher;
236
+ let options;
237
+ if (arguments.length === 2 && typeof pFetcher === "object" || arguments.length === 1) {
245
238
  source = true;
239
+ fetcher = pSource;
240
+ options = pFetcher || {};
241
+ } else {
242
+ source = pSource;
243
+ fetcher = pFetcher;
244
+ options = pOptions || {};
246
245
  }
247
- options || (options = {});
248
- const contexts = new Set(),
249
- [value, setValue] = createSignal(options.initialValue),
250
- [track, trigger] = createSignal(undefined, {
251
- equals: false
252
- }),
253
- [loading, setLoading] = createSignal(false),
254
- [error, setError] = createSignal();
255
246
  let err = undefined,
256
247
  pr = null,
257
- initP = null,
248
+ initP = NO_INIT,
258
249
  id = null,
259
250
  loadedUnderTransition = false,
260
251
  scheduled = false,
261
252
  resolved = ("initialValue" in options),
262
253
  dynamic = typeof source === "function" && createMemo(source);
254
+ const contexts = new Set(),
255
+ [value, setValue] = options.store ? options.store(options.initialValue) : createSignal(options.initialValue),
256
+ [track, trigger] = createSignal(undefined, {
257
+ equals: false
258
+ }),
259
+ [state, setState] = createSignal(resolved ? "ready" : "unresolved");
263
260
  if (sharedConfig.context) {
264
261
  id = `${sharedConfig.context.id}${sharedConfig.context.count++}`;
265
- if (sharedConfig.load) initP = sharedConfig.load(id);
262
+ let v;
263
+ if (sharedConfig.load && (v = sharedConfig.load(id))) initP = v[0];
266
264
  }
267
- function loadEnd(p, v, e, key) {
265
+ function loadEnd(p, v, success, key) {
268
266
  if (pr === p) {
269
267
  pr = null;
270
268
  resolved = true;
271
- if (initP && (p === initP || v === initP) && options.onHydrated) queueMicrotask(() => options.onHydrated(key, {
269
+ if ((p === initP || v === initP) && options.onHydrated) queueMicrotask(() => options.onHydrated(key, {
272
270
  value: v
273
271
  }));
274
- initP = null;
275
- setError(err = e);
272
+ initP = NO_INIT;
276
273
  if (Transition && p && loadedUnderTransition) {
277
274
  Transition.promises.delete(p);
278
275
  loadedUnderTransition = false;
@@ -282,19 +279,20 @@ function createResource(source, fetcher, options) {
282
279
  Effects.push.apply(Effects, Transition.effects);
283
280
  Transition.effects = [];
284
281
  }
285
- completeLoad(v);
282
+ completeLoad(v, success);
286
283
  }, false);
287
- } else completeLoad(v);
284
+ } else completeLoad(v, success);
288
285
  }
289
286
  return v;
290
287
  }
291
- function completeLoad(v) {
292
- batch(() => {
288
+ function completeLoad(v, success) {
289
+ !success && (err = castError(v));
290
+ runUpdates(() => {
293
291
  setValue(() => v);
294
- setLoading(false);
292
+ setState(success ? "ready" : "error");
295
293
  for (const c of contexts.keys()) c.decrement();
296
294
  contexts.clear();
297
- });
295
+ }, false);
298
296
  }
299
297
  function read() {
300
298
  const c = SuspenseContext && lookup(Owner, SuspenseContext.id),
@@ -314,48 +312,54 @@ function createResource(source, fetcher, options) {
314
312
  return v;
315
313
  }
316
314
  function load(refetching = true) {
317
- if (refetching && scheduled) return;
315
+ if (refetching !== false && scheduled) return;
318
316
  scheduled = false;
319
- setError(err = undefined);
317
+ err = undefined;
320
318
  const lookup = dynamic ? dynamic() : source;
321
319
  loadedUnderTransition = Transition && Transition.running;
322
320
  if (lookup == null || lookup === false) {
323
- loadEnd(pr, untrack(value));
321
+ loadEnd(pr, untrack(value), true);
324
322
  return;
325
323
  }
326
324
  if (Transition && pr) Transition.promises.delete(pr);
327
- const p = initP || untrack(() => fetcher(lookup, {
325
+ const p = initP !== NO_INIT ? initP : untrack(() => fetcher(lookup, {
328
326
  value: value(),
329
327
  refetching
330
328
  }));
331
329
  if (typeof p !== "object" || !("then" in p)) {
332
- loadEnd(pr, p);
330
+ loadEnd(pr, p, true);
333
331
  return p;
334
332
  }
335
333
  pr = p;
336
334
  scheduled = true;
337
335
  queueMicrotask(() => scheduled = false);
338
- batch(() => {
339
- setLoading(true);
336
+ runUpdates(() => {
337
+ setState(resolved ? "refreshing" : "pending");
340
338
  trigger();
341
- });
342
- return p.then(v => loadEnd(p, v, undefined, lookup), e => loadEnd(p, e, e));
339
+ }, false);
340
+ return p.then(v => loadEnd(p, v, true, lookup), e => loadEnd(p, e, false));
343
341
  }
344
342
  Object.defineProperties(read, {
343
+ state: {
344
+ get() {
345
+ return state();
346
+ }
347
+ },
345
348
  loading: {
346
349
  get() {
347
- return loading();
350
+ const s = state();
351
+ return s === "pending" || s === "refreshing";
348
352
  }
349
353
  },
350
354
  error: {
351
355
  get() {
352
- return error();
356
+ return state() === "error" ? err : undefined;
353
357
  }
354
358
  },
355
359
  latest: {
356
360
  get() {
357
361
  if (!resolved) return read();
358
- if (err) throw err;
362
+ if (state() === "error") throw err;
359
363
  return value();
360
364
  }
361
365
  }
@@ -408,25 +412,7 @@ function createSelector(source, fn = equalFn, options) {
408
412
  };
409
413
  }
410
414
  function batch(fn) {
411
- if (Pending) return fn();
412
- let result;
413
- const q = Pending = [];
414
- try {
415
- result = fn();
416
- } finally {
417
- Pending = null;
418
- }
419
- runUpdates(() => {
420
- for (let i = 0; i < q.length; i += 1) {
421
- const data = q[i];
422
- if (data.pending !== NOTPENDING) {
423
- const pending = data.pending;
424
- data.pending = NOTPENDING;
425
- writeSignal(data, pending);
426
- }
427
- }
428
- }, false);
429
- return result;
415
+ return runUpdates(fn, false);
430
416
  }
431
417
  function untrack(fn) {
432
418
  let result,
@@ -509,7 +495,7 @@ function startTransition(fn) {
509
495
  t.done || (t.done = new Promise(res => t.resolve = res));
510
496
  t.running = true;
511
497
  }
512
- batch(fn);
498
+ runUpdates(fn, false);
513
499
  Listener = Owner = null;
514
500
  return t ? t.done : undefined;
515
501
  });
@@ -562,10 +548,12 @@ function enableExternalSource(factory) {
562
548
  function readSignal() {
563
549
  const runningTransition = Transition && Transition.running;
564
550
  if (this.sources && (!runningTransition && this.state || runningTransition && this.tState)) {
565
- const updates = Updates;
566
- Updates = null;
567
- !runningTransition && this.state === STALE || runningTransition && this.tState === STALE ? updateComputation(this) : lookUpstream(this);
568
- Updates = updates;
551
+ if (!runningTransition && this.state === STALE || runningTransition && this.tState === STALE) updateComputation(this);else {
552
+ const updates = Updates;
553
+ Updates = null;
554
+ runUpdates(() => lookUpstream(this), false);
555
+ Updates = updates;
556
+ }
569
557
  }
570
558
  if (Listener) {
571
559
  const sSlot = this.observers ? this.observers.length : 0;
@@ -588,42 +576,35 @@ function readSignal() {
588
576
  return this.value;
589
577
  }
590
578
  function writeSignal(node, value, isComp) {
591
- if (Pending) {
592
- if (node.pending === NOTPENDING) Pending.push(node);
593
- node.pending = value;
594
- return value;
595
- }
596
- if (node.comparator) {
597
- if (Transition && Transition.running && Transition.sources.has(node)) {
598
- if (node.comparator(node.tValue, value)) return value;
599
- } else if (node.comparator(node.value, value)) return value;
600
- }
601
- let TransitionRunning = false;
602
- if (Transition) {
603
- TransitionRunning = Transition.running;
604
- if (TransitionRunning || !isComp && Transition.sources.has(node)) {
605
- Transition.sources.add(node);
606
- node.tValue = value;
607
- }
608
- if (!TransitionRunning) node.value = value;
609
- } else node.value = value;
610
- if (node.observers && node.observers.length) {
611
- runUpdates(() => {
612
- for (let i = 0; i < node.observers.length; i += 1) {
613
- const o = node.observers[i];
614
- if (TransitionRunning && Transition.disposed.has(o)) continue;
615
- if (TransitionRunning && !o.tState || !TransitionRunning && !o.state) {
616
- if (o.pure) Updates.push(o);else Effects.push(o);
617
- if (o.observers) markDownstream(o);
618
- }
619
- if (TransitionRunning) o.tState = STALE;else o.state = STALE;
620
- }
621
- if (Updates.length > 10e5) {
622
- Updates = [];
623
- if (false) ;
624
- throw new Error();
579
+ let current = Transition && Transition.running && Transition.sources.has(node) ? node.tValue : node.value;
580
+ if (!node.comparator || !node.comparator(current, value)) {
581
+ if (Transition) {
582
+ const TransitionRunning = Transition.running;
583
+ if (TransitionRunning || !isComp && Transition.sources.has(node)) {
584
+ Transition.sources.add(node);
585
+ node.tValue = value;
625
586
  }
626
- }, false);
587
+ if (!TransitionRunning) node.value = value;
588
+ } else node.value = value;
589
+ if (node.observers && node.observers.length) {
590
+ runUpdates(() => {
591
+ for (let i = 0; i < node.observers.length; i += 1) {
592
+ const o = node.observers[i];
593
+ const TransitionRunning = Transition && Transition.running;
594
+ if (TransitionRunning && Transition.disposed.has(o)) continue;
595
+ if (TransitionRunning && !o.tState || !TransitionRunning && !o.state) {
596
+ if (o.pure) Updates.push(o);else Effects.push(o);
597
+ if (o.observers) markDownstream(o);
598
+ }
599
+ if (TransitionRunning) o.tState = STALE;else o.state = STALE;
600
+ }
601
+ if (Updates.length > 10e5) {
602
+ Updates = [];
603
+ if (false) ;
604
+ throw new Error();
605
+ }
606
+ }, false);
607
+ }
627
608
  }
628
609
  return value;
629
610
  }
@@ -651,10 +632,11 @@ function runComputation(node, value, time) {
651
632
  try {
652
633
  nextValue = node.fn(value);
653
634
  } catch (err) {
635
+ if (node.pure) Transition && Transition.running ? node.tState = STALE : node.state = STALE;
654
636
  handleError(err);
655
637
  }
656
638
  if (!node.updatedAt || node.updatedAt <= time) {
657
- if (node.observers && node.observers.length) {
639
+ if (node.updatedAt && "observers" in node) {
658
640
  writeSignal(node, nextValue, true);
659
641
  } else if (Transition && Transition.running && node.pure) {
660
642
  Transition.sources.add(node);
@@ -727,7 +709,7 @@ function runTop(node) {
727
709
  } else if (!runningTransition && node.state === PENDING || runningTransition && node.tState === PENDING) {
728
710
  const updates = Updates;
729
711
  Updates = null;
730
- lookUpstream(node, ancestors[0]);
712
+ runUpdates(() => lookUpstream(node, ancestors[0]), false);
731
713
  Updates = updates;
732
714
  }
733
715
  }
@@ -770,7 +752,7 @@ function completeUpdates(wait) {
770
752
  delete e.tState;
771
753
  }
772
754
  Transition = null;
773
- batch(() => {
755
+ runUpdates(() => {
774
756
  for (const d of disposed) cleanNode(d);
775
757
  for (const v of sources) {
776
758
  v.value = v.tValue;
@@ -783,14 +765,11 @@ function completeUpdates(wait) {
783
765
  v.tState = 0;
784
766
  }
785
767
  setTransPending(false);
786
- });
787
- }
788
- if (Effects.length) batch(() => {
789
- runEffects(Effects);
790
- Effects = null;
791
- });else {
792
- Effects = null;
768
+ }, false);
793
769
  }
770
+ const e = Effects;
771
+ Effects = null;
772
+ if (e.length) runUpdates(() => runEffects(e), false);
794
773
  if (res) res();
795
774
  }
796
775
  function runQueue(queue) {
@@ -825,9 +804,9 @@ function runUserEffects(queue) {
825
804
  if (!e.user) runTop(e);else queue[userLength++] = e;
826
805
  }
827
806
  if (sharedConfig.context) setHydrateContext();
828
- const resume = queue.length;
807
+ Effects = [];
829
808
  for (i = 0; i < userLength; i++) runTop(queue[i]);
830
- for (i = resume; i < queue.length; i++) runTop(queue[i]);
809
+ if (Effects.length) runUserEffects(Effects);
831
810
  }
832
811
  function lookUpstream(node, ignore) {
833
812
  const runningTransition = Transition && Transition.running;
@@ -896,7 +875,12 @@ function reset(node, top) {
896
875
  for (let i = 0; i < node.owned.length; i++) reset(node.owned[i]);
897
876
  }
898
877
  }
878
+ function castError(err) {
879
+ if (err instanceof Error || typeof err === "string") return err;
880
+ return new Error("Unknown error");
881
+ }
899
882
  function handleError(err) {
883
+ err = castError(err);
900
884
  const fns = ERROR && lookup(Owner, ERROR);
901
885
  if (!fns) throw err;
902
886
  for (const f of fns) f(err);
@@ -942,7 +926,7 @@ function observable(input) {
942
926
  };
943
927
  }
944
928
  const dispose = createRoot(disposer => {
945
- createComputed(() => {
929
+ createEffect(() => {
946
930
  const v = input();
947
931
  untrack(() => handler(v));
948
932
  });
@@ -1331,24 +1315,24 @@ function Match(props) {
1331
1315
  return props;
1332
1316
  }
1333
1317
  let Errors;
1334
- const NoErrors = {};
1335
1318
  function resetErrorBoundaries() {
1336
- Errors && [...Errors].forEach(fn => fn(NoErrors));
1319
+ Errors && [...Errors].forEach(fn => fn());
1337
1320
  }
1338
1321
  function ErrorBoundary(props) {
1339
- let err = NoErrors;
1340
- if (sharedConfig.context && sharedConfig.load) {
1341
- err = sharedConfig.load(sharedConfig.context.id + sharedConfig.context.count) || NoErrors;
1342
- }
1322
+ let err;
1323
+ let v;
1324
+ if (sharedConfig.context && sharedConfig.load && (v = sharedConfig.load(sharedConfig.context.id + sharedConfig.context.count))) err = v[0];
1343
1325
  const [errored, setErrored] = createSignal(err);
1344
1326
  Errors || (Errors = new Set());
1345
1327
  Errors.add(setErrored);
1346
1328
  onCleanup(() => Errors.delete(setErrored));
1347
1329
  return createMemo(() => {
1348
1330
  let e;
1349
- if ((e = errored()) !== NoErrors) {
1331
+ if (e = errored()) {
1350
1332
  const f = props.fallback;
1351
- return typeof f === "function" && f.length ? untrack(() => f(e, () => setErrored(NoErrors))) : f;
1333
+ const res = typeof f === "function" && f.length ? untrack(() => f(e, () => setErrored())) : f;
1334
+ onError(setErrored);
1335
+ return res;
1352
1336
  }
1353
1337
  onError(setErrored);
1354
1338
  return props.children;
@@ -1443,21 +1427,24 @@ function Suspense(props) {
1443
1427
  owner = getOwner();
1444
1428
  if (sharedConfig.context && sharedConfig.load) {
1445
1429
  const key = sharedConfig.context.id + sharedConfig.context.count;
1446
- p = sharedConfig.load(key);
1447
- if (p) {
1430
+ let ref = sharedConfig.load(key);
1431
+ if (ref && (p = ref[0]) && p !== "$$f") {
1448
1432
  if (typeof p !== "object" || !("then" in p)) p = Promise.resolve(p);
1449
1433
  const [s, set] = createSignal(undefined, {
1450
1434
  equals: false
1451
1435
  });
1452
1436
  flicker = s;
1453
1437
  p.then(err => {
1454
- if ((error = err) || sharedConfig.done) return set();
1438
+ if (err || sharedConfig.done) {
1439
+ err && (error = err);
1440
+ return set();
1441
+ }
1455
1442
  sharedConfig.gather(key);
1456
1443
  setHydrateContext(ctx);
1457
1444
  set();
1458
1445
  setHydrateContext();
1459
1446
  });
1460
- } else if (p === null) sharedConfig.gather(key);
1447
+ }
1461
1448
  }
1462
1449
  const listContext = useContext(SuspenseListContext);
1463
1450
  if (listContext) [showContent, showFallback] = listContext.register(store.inFallback);
@@ -1473,14 +1460,14 @@ function Suspense(props) {
1473
1460
  flicker();
1474
1461
  return flicker = undefined;
1475
1462
  }
1476
- if (ctx && p === undefined) setHydrateContext();
1463
+ if (ctx && p === "$$f") setHydrateContext();
1477
1464
  const rendered = createMemo(() => props.children);
1478
1465
  return createMemo(() => {
1479
1466
  const inFallback = store.inFallback(),
1480
1467
  visibleContent = showContent ? showContent() : true,
1481
1468
  visibleFallback = showFallback ? showFallback() : true;
1482
1469
  dispose && dispose();
1483
- if ((!inFallback || p !== undefined) && visibleContent) {
1470
+ if ((!inFallback || p && p !== "$$f") && visibleContent) {
1484
1471
  store.resolved = true;
1485
1472
  ctx = p = undefined;
1486
1473
  resumeEffects(store.effects);