@solidjs/web 2.0.0-beta.30 → 2.0.0-beta.32

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 (66) hide show
  1. package/README.md +1 -6
  2. package/dist/dev.cjs +284 -82
  3. package/dist/dev.js +271 -79
  4. package/dist/server.cjs +555 -135
  5. package/dist/server.js +544 -132
  6. package/dist/web.cjs +281 -79
  7. package/dist/web.js +268 -76
  8. package/frames/dist/client.cjs +413 -360
  9. package/frames/dist/client.dev.cjs +413 -360
  10. package/frames/dist/client.dev.js +414 -361
  11. package/frames/dist/client.js +414 -361
  12. package/frames/dist/server.cjs +604 -199
  13. package/frames/dist/server.js +605 -201
  14. package/package.json +56 -6
  15. package/serialization/dist/serialization.cjs +8 -0
  16. package/serialization/dist/serialization.js +1 -0
  17. package/serialization/types/index.d.ts +173 -6
  18. package/serialization/types-cjs/index.d.cts +173 -6
  19. package/server-functions/dist/client.cjs +46 -9
  20. package/server-functions/dist/client.js +47 -11
  21. package/server-functions/dist/rich-args.cjs +11 -0
  22. package/server-functions/dist/rich-args.js +9 -0
  23. package/server-functions/dist/server.cjs +275 -126
  24. package/server-functions/dist/server.dev.cjs +1053 -0
  25. package/server-functions/dist/server.dev.js +1021 -0
  26. package/server-functions/dist/server.js +273 -127
  27. package/server-functions/package.json +10 -0
  28. package/server-functions/rich-args/package.json +20 -0
  29. package/storage/types/index.d.ts +1 -1
  30. package/storage/types-cjs/index.d.cts +1 -1
  31. package/types/client.d.ts +134 -11
  32. package/types/core.d.ts +3 -1
  33. package/types/frames/client.d.ts +24 -8
  34. package/types/frames/frame-client.d.ts +49 -7
  35. package/types/frames/frame-sink.d.ts +32 -6
  36. package/types/frames/frame-transport.d.ts +88 -62
  37. package/types/frames/serializer.d.ts +173 -6
  38. package/types/frames/server.d.ts +22 -0
  39. package/types/index.d.ts +2 -3
  40. package/types/jsx.d.ts +3 -3
  41. package/types/response.d.ts +45 -0
  42. package/types/serializer.d.ts +173 -6
  43. package/types/server-functions/client.d.ts +1 -0
  44. package/types/server-functions/rich-args.d.ts +10 -0
  45. package/types/server-functions/server.d.ts +98 -0
  46. package/types/server-functions/shared.d.ts +22 -0
  47. package/types/server-mock.d.ts +171 -59
  48. package/types/server.d.ts +196 -42
  49. package/types-cjs/client.d.cts +134 -11
  50. package/types-cjs/core.d.cts +3 -1
  51. package/types-cjs/frames/client.d.cts +24 -8
  52. package/types-cjs/frames/frame-client.d.cts +49 -7
  53. package/types-cjs/frames/frame-sink.d.cts +32 -6
  54. package/types-cjs/frames/frame-transport.d.cts +88 -62
  55. package/types-cjs/frames/serializer.d.cts +173 -6
  56. package/types-cjs/frames/server.d.cts +22 -0
  57. package/types-cjs/index.d.cts +2 -3
  58. package/types-cjs/jsx.d.cts +3 -3
  59. package/types-cjs/response.d.cts +45 -0
  60. package/types-cjs/serializer.d.cts +173 -6
  61. package/types-cjs/server-functions/client.d.cts +1 -0
  62. package/types-cjs/server-functions/rich-args.d.cts +10 -0
  63. package/types-cjs/server-functions/server.d.cts +98 -0
  64. package/types-cjs/server-functions/shared.d.cts +22 -0
  65. package/types-cjs/server-mock.d.cts +171 -59
  66. package/types-cjs/server.d.cts +196 -42
package/README.md CHANGED
@@ -13,12 +13,7 @@ Solid 2.0's web platform runtime — DOM rendering, hydration, server-side rende
13
13
  import { render, hydrate, Portal, Dynamic, dynamic } from "@solidjs/web";
14
14
 
15
15
  // Server (SSR)
16
- import {
17
- renderToString,
18
- renderToStringAsync,
19
- renderToStream,
20
- isServer
21
- } from "@solidjs/web";
16
+ import { renderToString, renderToStream, isServer } from "@solidjs/web";
22
17
  ```
23
18
 
24
19
  The control-flow components from `solid-js` (`For`, `Show`, `Switch`/`Match`, `Loading`, `Errored`, `Repeat`, `Reveal`) are also re-exported from `@solidjs/web` for convenience.
package/dist/dev.cjs CHANGED
@@ -63,6 +63,17 @@ const effect = (fn, effectFn, options) => solidJs.createRenderEffect(fn, effectF
63
63
  transparent: !options.scope
64
64
  } : transparentOptions);
65
65
  const memo = fn => solidJs.createMemo(() => fn(), syncOptions);
66
+ const assetGates = new WeakMap();
67
+ const waitAsset = promise => {
68
+ let gate = assetGates.get(promise);
69
+ if (!gate) {
70
+ solidJs.runWithOwner(null, () => {
71
+ gate = solidJs.createMemo(() => promise);
72
+ });
73
+ assetGates.set(promise, gate);
74
+ }
75
+ gate();
76
+ };
66
77
 
67
78
  function reconcileArrays(parentNode, a, b, marker) {
68
79
  let bLength = b.length,
@@ -172,8 +183,9 @@ function reconcileArrays(parentNode, a, b, marker) {
172
183
 
173
184
  const HEAD_ELIGIBLE_TAGS = new Set(["title", "meta", "link", "style", "script", "base"]);
174
185
  const HEAD_ATTR_NAME = /^[a-zA-Z_][a-zA-Z0-9_:.-]*$/;
175
- const RESOURCE_LINK_RELS = new Set(["preload", "modulepreload", "prefetch", "preconnect", "dns-prefetch", "icon", "stylesheet"]);
186
+ const RESOURCE_LINK_RELS = new Set(["preload", "modulepreload", "prefetch", "preconnect", "dns-prefetch", "stylesheet"]);
176
187
  const RESOURCE_QUALIFIERS = ["as", "crossorigin", "type", "media", "imagesrcset", "imagesizes"];
188
+ const STYLESHEET_FETCH_META = new Set(["crossorigin", "integrity", "referrerpolicy", "fetchpriority"]);
177
189
  function evalHeadValue(v) {
178
190
  return typeof v === "function" ? v() : v;
179
191
  }
@@ -215,12 +227,14 @@ function replaceableIdentity(tag, props, key, unique) {
215
227
  if (tag === "meta" && props.charset != null) return "charset";
216
228
  if (key != null) return tag + ":key:" + key;
217
229
  if (tag === "meta") {
218
- if (props.name != null) return "meta:name:" + props.name;
219
- if (props.property != null) return "meta:property:" + props.property;
220
- if (props["http-equiv"] != null) return "meta:http-equiv:" + props["http-equiv"];
230
+ for (const ns of ["name", "property", "http-equiv"]) if (props[ns] != null) return "meta:" + ns + ":" + props[ns] + (props.media != null ? ":media=" + props.media : "");
221
231
  return unique;
222
232
  }
223
- if (tag === "link") return "link:" + (props.rel || "") + ":" + (props.href || "");
233
+ if (tag === "link") {
234
+ const rel = props.rel || "";
235
+ if (rel === "icon" || rel === "apple-touch-icon") return "link:" + rel + (props.sizes != null ? ":sizes=" + props.sizes : "") + (props.type != null ? ":type=" + props.type : "");
236
+ return "link:" + rel + ":" + (props.href || "");
237
+ }
224
238
  return unique;
225
239
  }
226
240
  function resolveHead(groups) {
@@ -253,6 +267,43 @@ function resolveHead(groups) {
253
267
  return winners;
254
268
  }
255
269
 
270
+ function parseCookieHeader(header) {
271
+ const cookies = {};
272
+ if (!header) return cookies;
273
+ for (const part of header.split(";")) {
274
+ const eq = part.indexOf("=");
275
+ if (eq < 0) continue;
276
+ const name = decodeSafe(part.slice(0, eq).trim());
277
+ let value = part.slice(eq + 1).trim();
278
+ if (value.length > 1 && value[0] === '"' && value[value.length - 1] === '"') {
279
+ value = value.slice(1, -1);
280
+ }
281
+ cookies[name] = decodeSafe(value);
282
+ }
283
+ return cookies;
284
+ }
285
+ function decodeSafe(text) {
286
+ try {
287
+ return decodeURIComponent(text);
288
+ } catch {
289
+ return text;
290
+ }
291
+ }
292
+ function serializeCookie(name, value, options = {}) {
293
+ let cookie = `${encodeURIComponent(name)}=${encodeURIComponent(value)}`;
294
+ cookie += `; Path=${options.path === undefined ? "/" : options.path}`;
295
+ if (options.domain) cookie += `; Domain=${options.domain}`;
296
+ if (options.maxAge !== undefined) cookie += `; Max-Age=${Math.trunc(options.maxAge)}`;
297
+ if (options.expires) cookie += `; Expires=${options.expires.toUTCString()}`;
298
+ if (options.httpOnly) cookie += "; HttpOnly";
299
+ if (options.secure) cookie += "; Secure";
300
+ if (options.sameSite) {
301
+ const sameSite = options.sameSite.toLowerCase();
302
+ cookie += `; SameSite=${sameSite === "none" ? "None" : sameSite === "strict" ? "Strict" : "Lax"}`;
303
+ }
304
+ return cookie;
305
+ }
306
+
256
307
  const $$EVENT_OWNER = "_$DX_EVENT_OWNER";
257
308
  const INNER_OWNED = {};
258
309
  const delegatedEvents = new Set();
@@ -656,6 +707,9 @@ function findAssetElement(selector, attr, value) {
656
707
  }
657
708
  return null;
658
709
  }
710
+ function setAssetAttrs(el, attrs) {
711
+ for (const name in attrs) el.setAttribute(name, attrs[name]);
712
+ }
659
713
  function mountAssetElement(descriptor) {
660
714
  let el;
661
715
  if (descriptor.type === "inline-style") {
@@ -674,12 +728,77 @@ function mountAssetElement(descriptor) {
674
728
  el.href = descriptor.href;
675
729
  }
676
730
  }
677
- if (descriptor.attrs) {
678
- for (const name in descriptor.attrs) el.setAttribute(name, descriptor.attrs[name]);
679
- }
731
+ if (descriptor.attrs) setAssetAttrs(el, descriptor.attrs);
680
732
  if (!el.isConnected) document.head.appendChild(el);
681
733
  return el;
682
734
  }
735
+ const assetLoadSettled = /*#__PURE__*/Promise.resolve();
736
+ function trackAssetLoad(entry, adopted) {
737
+ if (entry.loadPromise) return;
738
+ const el = entry.element;
739
+ let settled = el.sheet != null;
740
+ if (!settled && adopted && typeof performance !== "undefined" && performance.getEntriesByName) {
741
+ settled = performance.getEntriesByName(el.href).length > 0;
742
+ }
743
+ if (settled) {
744
+ entry.loadState = "loaded";
745
+ entry.loadPromise = assetLoadSettled;
746
+ return;
747
+ }
748
+ entry.loadState = "pending";
749
+ entry.loadPromise = new Promise(resolve => {
750
+ const settle = state => {
751
+ entry.loadState = state;
752
+ resolve();
753
+ };
754
+ el.addEventListener("load", () => settle("loaded"), {
755
+ once: true
756
+ });
757
+ el.addEventListener("error", () => settle("errored"), {
758
+ once: true
759
+ });
760
+ });
761
+ }
762
+ function warmAsset(descriptor) {
763
+ if (descriptor.policy === "exclusive" || descriptor.type === "inline-style") return;
764
+ const key = assetEntryKey(descriptor);
765
+ let entry = assetRegistry.get(key);
766
+ if (!entry) {
767
+ entry = {
768
+ count: 0,
769
+ element: null,
770
+ timer: null
771
+ };
772
+ assetRegistry.set(key, entry);
773
+ }
774
+ let adopted = true;
775
+ if (!entry.element || !entry.element.isConnected) {
776
+ const rel = descriptor.type === "module" ? "modulepreload" : "stylesheet";
777
+ let el = findAssetElement(`link[rel="${rel}"]`, "href", descriptor.href);
778
+ if (!el && descriptor.type === "style") {
779
+ el = findAssetElement('link[rel="preload"][as="style"]', "href", descriptor.href);
780
+ }
781
+ if (!el) {
782
+ adopted = false;
783
+ el = document.createElement("link");
784
+ if (descriptor.type === "style") {
785
+ el.setAttribute("rel", "preload");
786
+ el.setAttribute("as", "style");
787
+ } else {
788
+ el.setAttribute("rel", "modulepreload");
789
+ }
790
+ el.setAttribute("href", descriptor.href);
791
+ if (!document.body) el.setAttribute("blocking", "render");
792
+ }
793
+ if (descriptor.attrs) setAssetAttrs(el, descriptor.attrs);
794
+ if (!el.isConnected) document.head.appendChild(el);
795
+ entry.element = el;
796
+ entry.loadState = undefined;
797
+ entry.loadPromise = undefined;
798
+ }
799
+ if (descriptor.type === "style") trackAssetLoad(entry, adopted);
800
+ return entry;
801
+ }
683
802
  function acquireAsset(descriptor) {
684
803
  const key = assetEntryKey(descriptor);
685
804
  let entry = assetRegistry.get(key);
@@ -726,7 +845,12 @@ function acquireAsset(descriptor) {
726
845
  entry.timer = null;
727
846
  }
728
847
  entry.count++;
729
- if (!entry.element || !entry.element.isConnected) entry.element = mountAssetElement(descriptor);
848
+ if (!entry.element || !entry.element.isConnected) {
849
+ entry.element = mountAssetElement(descriptor);
850
+ } else if (descriptor.type === "style" && entry.element.getAttribute("rel") === "preload") {
851
+ entry.element.removeAttribute("as");
852
+ entry.element.setAttribute("rel", "stylesheet");
853
+ }
730
854
  let released = false;
731
855
  return () => {
732
856
  if (released) return;
@@ -838,22 +962,26 @@ function flushHeadRegistry() {
838
962
  headOwned.set(identity, els);
839
963
  }
840
964
  }
841
- function renderHeadElement(t, identity, existing) {
842
- for (let i = 0; i < existing.length; i++) {
843
- if (headElementMatches(existing[i], t)) return existing.splice(i, 1)[0];
844
- }
845
- const el = document.createElement(t.tag);
846
- for (const name in t.props) {
965
+ function createHeadElement(tag, props) {
966
+ const el = document.createElement(tag);
967
+ for (const name in props) {
847
968
  if (name === "children" || name === "ref" || name.slice(0, 2) === "on") continue;
848
969
  if (!HEAD_ATTR_NAME.test(name)) {
849
970
  console.warn(`useHead: ignoring invalid attribute name "${name}"`);
850
971
  continue;
851
972
  }
852
- const v = t.props[name];
973
+ const v = props[name];
853
974
  if (v == null || v === false) continue;
854
975
  el.setAttribute(name, v === true ? "" : String(v));
855
976
  }
856
- if (t.props.children != null) el.textContent = String(t.props.children);
977
+ if (props.children != null) el.textContent = String(props.children);
978
+ return el;
979
+ }
980
+ function renderHeadElement(t, identity, existing) {
981
+ for (let i = 0; i < existing.length; i++) {
982
+ if (headElementMatches(existing[i], t)) return existing.splice(i, 1)[0];
983
+ }
984
+ const el = createHeadElement(t.tag, t.props);
857
985
  el.setAttribute("data-dh", identity);
858
986
  document.head.appendChild(el);
859
987
  return el;
@@ -871,48 +999,39 @@ function headElementMatches(el, t) {
871
999
  const children = t.props.children;
872
1000
  return (children == null ? "" : String(children)) === el.textContent;
873
1001
  }
874
- function acquireHeadResource(tag, props) {
875
- if (tag === "link" && (props.rel === "stylesheet" || props.rel === "modulepreload")) {
876
- const descriptor = {
877
- type: props.rel === "stylesheet" ? "style" : "module",
878
- href: props.href
879
- };
880
- let attrs = null;
881
- for (const name in props) {
882
- if (name === "rel" || name === "href") continue;
883
- if (!HEAD_ATTR_NAME.test(name)) continue;
884
- const v = props[name];
885
- if (v == null || v === false) continue;
886
- (attrs || (attrs = {}))[name] = v === true ? "" : String(v);
887
- }
888
- if (attrs) descriptor.attrs = attrs;
889
- return acquireAsset(descriptor);
890
- }
1002
+ function mountHeadResource(tag, props) {
891
1003
  const identity = resourceIdentity(tag, props);
892
- if (headMountedResources.has(identity)) return noopFn;
1004
+ if (headMountedResources.has(identity)) return;
893
1005
  headMountedResources.add(identity);
894
1006
  const url = props.href || props.src;
895
1007
  let el = null;
896
1008
  if (url != null) {
897
1009
  if (tag === "link") el = findAssetElement(`link[rel="${props.rel}"]`, "href", url);else if (tag === "script") el = findAssetElement("script[src]", "src", url);else el = findAssetElement("style[href]", "href", url);
898
1010
  }
899
- if (!el) {
900
- el = document.createElement(tag);
901
- for (const name in props) {
902
- if (name === "children" || name === "ref" || name.slice(0, 2) === "on") continue;
903
- if (!HEAD_ATTR_NAME.test(name)) continue;
904
- const v = props[name];
905
- if (v == null || v === false) continue;
906
- el.setAttribute(name, v === true ? "" : String(v));
907
- }
908
- if (props.children != null) el.textContent = String(props.children);
909
- document.head.appendChild(el);
1011
+ if (!el) document.head.appendChild(createHeadElement(tag, props));
1012
+ }
1013
+ function gateHeadResource(props) {
1014
+ const descriptor = {
1015
+ type: props.rel === "stylesheet" ? "style" : "module",
1016
+ href: props.href
1017
+ };
1018
+ let gateable = props.rel === "stylesheet" && props.href != null;
1019
+ let attrs = null;
1020
+ for (const name in props) {
1021
+ if (name === "rel" || name === "href") continue;
1022
+ if (!STYLESHEET_FETCH_META.has(name)) gateable = false;
1023
+ if (!HEAD_ATTR_NAME.test(name)) continue;
1024
+ const v = props[name];
1025
+ if (v == null || v === false) continue;
1026
+ (attrs || (attrs = {}))[name] = v === true ? "" : String(v);
910
1027
  }
911
- return noopFn;
1028
+ if (attrs) descriptor.attrs = attrs;
1029
+ effect(() => {
1030
+ const entry = warmAsset(descriptor);
1031
+ if (gateable && entry.loadState === "pending" && typeof waitAsset === "function") waitAsset(entry.loadPromise);
1032
+ }, () => acquireAsset(descriptor));
912
1033
  }
913
- function noopFn() {}
914
1034
  function useHead(tags) {
915
- const list = Array.isArray(tags) ? tags : [tags];
916
1035
  initHeadRegistry();
917
1036
  const reg = {
918
1037
  seq: -1,
@@ -920,6 +1039,8 @@ function useHead(tags) {
920
1039
  };
921
1040
  const uid = ++headUid;
922
1041
  effect(() => {
1042
+ let list = typeof tags === "function" ? tags() : tags;
1043
+ if (!Array.isArray(list)) list = [list];
923
1044
  const replaceable = [];
924
1045
  const resources = [];
925
1046
  for (let i = 0; i < list.length; i++) {
@@ -933,10 +1054,16 @@ function useHead(tags) {
933
1054
  rel: cls.rel
934
1055
  } : undefined);
935
1056
  if (cls.resource) {
936
- resources.push({
937
- tag: desc.tag,
938
- props
939
- });
1057
+ if (desc.tag === "link" && (props.rel === "stylesheet" || props.rel === "modulepreload")) {
1058
+ gateHeadResource(props);
1059
+ } else if (desc.tag === "link") {
1060
+ mountHeadResource(desc.tag, props);
1061
+ } else {
1062
+ resources.push({
1063
+ tag: desc.tag,
1064
+ props
1065
+ });
1066
+ }
940
1067
  } else {
941
1068
  const key = evalHeadValue(desc.key);
942
1069
  replaceable.push({
@@ -951,9 +1078,8 @@ function useHead(tags) {
951
1078
  resources
952
1079
  };
953
1080
  }, evaluated => {
954
- const releases = [];
955
1081
  for (let i = 0; i < evaluated.resources.length; i++) {
956
- releases.push(acquireHeadResource(evaluated.resources[i].tag, evaluated.resources[i].props));
1082
+ mountHeadResource(evaluated.resources[i].tag, evaluated.resources[i].props);
957
1083
  }
958
1084
  reg.tags = evaluated.replaceable;
959
1085
  if (reg.seq < 0) reg.seq = ++headSeq;
@@ -962,7 +1088,6 @@ function useHead(tags) {
962
1088
  return () => {
963
1089
  const idx = headRegistrations.indexOf(reg);
964
1090
  if (idx > -1) headRegistrations.splice(idx, 1);
965
- for (let i = 0; i < releases.length; i++) releases[i]();
966
1091
  scheduleHeadApply();
967
1092
  };
968
1093
  });
@@ -1450,7 +1575,13 @@ function gatherHydratable(element, root) {
1450
1575
  for (let i = 0; i < templates.length; i++) {
1451
1576
  const node = templates[i];
1452
1577
  const key = node.getAttribute("_hk");
1453
- if ((!root || key.startsWith(root)) && !solidJs.sharedConfig.registry.has(key)) solidJs.sharedConfig.registry.set(key, node);
1578
+ if (root) {
1579
+ if (!key.startsWith(root)) continue;
1580
+ } else {
1581
+ const frame = node.closest("[data-fid]");
1582
+ if (frame && frame !== element && element.contains(frame)) continue;
1583
+ }
1584
+ if (!solidJs.sharedConfig.registry.has(key)) solidJs.sharedConfig.registry.set(key, node);
1454
1585
  }
1455
1586
  }
1456
1587
  function getHydrationKey() {
@@ -1466,20 +1597,37 @@ function throwInBrowser(func) {
1466
1597
  function renderToString(fn, options) {
1467
1598
  throwInBrowser(renderToString);
1468
1599
  }
1469
- function renderToStringAsync(fn, options) {
1470
- throwInBrowser(renderToStringAsync);
1471
- }
1472
1600
  function renderToStream(fn, options) {
1473
1601
  throwInBrowser(renderToStream);
1474
1602
  }
1603
+ function createResponseStub() {
1604
+ throwInBrowser(createResponseStub);
1605
+ }
1606
+ function createRequestEvent(request, init) {
1607
+ throwInBrowser(createRequestEvent);
1608
+ }
1609
+ function getExpectedRedirectStatus(response) {
1610
+ throwInBrowser(getExpectedRedirectStatus);
1611
+ }
1612
+ function createSSRResponse() {
1613
+ throwInBrowser(createSSRResponse);
1614
+ }
1615
+ function commitEventResponse(response, event) {
1616
+ throwInBrowser(commitEventResponse);
1617
+ }
1618
+ function composeMiddleware(middlewares) {
1619
+ throwInBrowser(composeMiddleware);
1620
+ }
1475
1621
  function ssr(template, ...nodes) {}
1476
1622
  function ssrElement(name, props, children, needsId) {}
1477
- function ssrClassList(value) {}
1623
+ function ssrClassName(value) {}
1478
1624
  function ssrStyle(value) {}
1625
+ function ssrStyleProperty(name, value) {}
1479
1626
  function ssrAttribute(key, value) {}
1627
+ function ssrGroup(fn, n) {}
1480
1628
  function ssrHydrationKey() {}
1481
- function resolveSSRNode(node) {}
1482
- function escape(html) {}
1629
+ function resolveSSRNode(node, result, top) {}
1630
+ function escape(s, attr) {}
1483
1631
 
1484
1632
  const ENVELOPE = Symbol.for("solid.ResponseEnvelope");
1485
1633
  class ResponseEnvelope {
@@ -1496,13 +1644,38 @@ const HREF = Symbol.for("solid.Href");
1496
1644
  function isHref(value) {
1497
1645
  return !!(value && (typeof value === "object" || typeof value === "function") && value[HREF]);
1498
1646
  }
1647
+ const SAFE_ERROR = Symbol.for("solid.SafeError");
1648
+ function markSafeError(error) {
1649
+ if (error && (typeof error === "object" || typeof error === "function")) {
1650
+ Object.defineProperty(error, SAFE_ERROR, {
1651
+ value: true,
1652
+ enumerable: false,
1653
+ configurable: true
1654
+ });
1655
+ }
1656
+ return error;
1657
+ }
1658
+ function isSafeError(value) {
1659
+ return !!(value && (typeof value === "object" || typeof value === "function") && value[SAFE_ERROR]);
1660
+ }
1499
1661
  const REVALIDATE_HEADER = "X-Revalidate";
1500
1662
  function initWithRevalidate(init) {
1501
1663
  const {
1502
1664
  revalidate,
1503
1665
  ...responseInit
1504
1666
  } = init;
1505
- const headers = new Headers(responseInit.headers);
1667
+ let headers;
1668
+ if (responseInit.headers && responseInit.headers.getSetCookie) {
1669
+ headers = new Headers();
1670
+ responseInit.headers.forEach((value, key) => {
1671
+ if (key !== "set-cookie") headers.append(key, value);
1672
+ });
1673
+ for (const cookie of responseInit.headers.getSetCookie()) {
1674
+ headers.append("Set-Cookie", cookie);
1675
+ }
1676
+ } else {
1677
+ headers = new Headers(responseInit.headers);
1678
+ }
1506
1679
  revalidate !== undefined && headers.set(REVALIDATE_HEADER, revalidate.toString());
1507
1680
  return {
1508
1681
  responseInit,
@@ -1622,19 +1795,31 @@ function portalImpl(props) {
1622
1795
  });
1623
1796
  return treeMarker;
1624
1797
  }
1625
- const COMPONENT_HANDOFF = Symbol.for("dom-expressions.component-handoff");
1626
- function resolveHandoff(next, prev) {
1627
- const handoff = typeof next === "function" && next !== null && next[COMPONENT_HANDOFF];
1628
- return handoff && handoff.take(prev) ? prev : next;
1798
+ const COMPONENT_BINDING = Symbol.for("dom-expressions.component-binding");
1799
+ function bindingOf(value) {
1800
+ return value !== null && (typeof value === "function" || typeof value === "object") && value[COMPONENT_BINDING] || undefined;
1629
1801
  }
1630
1802
  function dynamic(source) {
1631
1803
  let latest = 0;
1804
+ const sites = new Set();
1805
+ let deliveredAddress;
1806
+ const resolveBinding = (next, prev) => {
1807
+ const binding = bindingOf(next);
1808
+ if (!binding) return next;
1809
+ deliveredAddress = binding.address;
1810
+ const prevBinding = bindingOf(prev);
1811
+ if (prevBinding && prevBinding.component === binding.component) {
1812
+ for (const deliver of sites) deliver(binding.address);
1813
+ return prev;
1814
+ }
1815
+ return next;
1816
+ };
1632
1817
  const cached = solidJs.createMemo(prev => {
1633
1818
  const next = source();
1634
- if (!next || typeof next.then !== "function") return resolveHandoff(next, prev);
1819
+ if (!next || typeof next.then !== "function") return resolveBinding(next, prev);
1635
1820
  const token = ++latest;
1636
1821
  return {
1637
- then: (onFulfilled, onRejected) => next.then(resolved => onFulfilled(token === latest ? resolveHandoff(resolved, prev) : resolved), onRejected)
1822
+ then: (onFulfilled, onRejected) => next.then(resolved => onFulfilled(token === latest ? resolveBinding(resolved, prev) : resolved), onRejected)
1638
1823
  };
1639
1824
  }, {
1640
1825
  lazy: true
@@ -1644,10 +1829,19 @@ function dynamic(source) {
1644
1829
  const component = cached();
1645
1830
  switch (typeof component) {
1646
1831
  case "function":
1647
- Object.assign(component, {
1648
- [solidJs.$DEVCOMP]: true
1649
- });
1650
- return solidJs.untrack(() => component(props));
1832
+ {
1833
+ Object.assign(component, {
1834
+ [solidJs.$DEVCOMP]: true
1835
+ });
1836
+ const binding = bindingOf(component);
1837
+ if (binding) {
1838
+ const [address, setAddress] = solidJs.createSignal(deliveredAddress ?? binding.address);
1839
+ sites.add(setAddress);
1840
+ solidJs.onCleanup(() => sites.delete(setAddress));
1841
+ return solidJs.untrack(() => binding.component(props, address));
1842
+ }
1843
+ return solidJs.untrack(() => component(props));
1844
+ }
1651
1845
  case "string":
1652
1846
  const el = solidJs.sharedConfig.hydrating ? getNextElement() : createElement(component, solidJs.untrack(() => props.is));
1653
1847
  spread(el, props);
@@ -1684,9 +1878,7 @@ _moduleUrl) {
1684
1878
  if ((Comp = solidJs.untrack(comp)) && !solidJs.sharedConfig.hydrating) return Comp(rest);
1685
1879
  const [mounted, setMounted] = solidJs.createSignal(!solidJs.sharedConfig.hydrating);
1686
1880
  const gate = solidJs.createMemo(() => (Comp = comp(), m = mounted(), solidJs.untrack(() => Comp && m ? Comp(rest) : props.fallback)));
1687
- solidJs.onSettled(() => {
1688
- setMounted(true);
1689
- });
1881
+ solidJs.sharedConfig.onHydrationEnd(() => setMounted(true));
1690
1882
  return gate;
1691
1883
  };
1692
1884
  }
@@ -1745,7 +1937,6 @@ Object.defineProperty(exports, "untrack", {
1745
1937
  enumerable: true,
1746
1938
  get: function () { return solidJs.untrack; }
1747
1939
  });
1748
- exports.Assets = voidFn;
1749
1940
  exports.ChildProperties = ChildProperties;
1750
1941
  exports.DOMElements = DOMElements;
1751
1942
  exports.DOMWithState = DOMWithState;
@@ -1760,6 +1951,7 @@ exports.REVALIDATE_HEADER = REVALIDATE_HEADER;
1760
1951
  exports.RawTextElements = RawTextElements;
1761
1952
  exports.RequestContext = RequestContext;
1762
1953
  exports.ResponseEnvelope = ResponseEnvelope;
1954
+ exports.SAFE_ERROR = SAFE_ERROR;
1763
1955
  exports.SVGElements = SVGElements;
1764
1956
  exports.VoidElements = VoidElements;
1765
1957
  exports.acquireAsset = acquireAsset;
@@ -1770,14 +1962,19 @@ exports.claimElement = claimElement;
1770
1962
  exports.claimElementTree = claimElementTree;
1771
1963
  exports.className = className;
1772
1964
  exports.clientOnly = clientOnly;
1965
+ exports.commitEventResponse = commitEventResponse;
1966
+ exports.composeMiddleware = composeMiddleware;
1967
+ exports.createRequestEvent = createRequestEvent;
1968
+ exports.createResponseStub = createResponseStub;
1969
+ exports.createSSRResponse = createSSRResponse;
1773
1970
  exports.delegateEvents = delegateEvents;
1774
1971
  exports.dynamic = dynamic;
1775
1972
  exports.dynamicProperty = dynamicProperty;
1776
1973
  exports.effect = effect;
1777
1974
  exports.escape = escape;
1778
1975
  exports.generateHydrationScript = voidFn;
1779
- exports.getAssets = voidFn;
1780
1976
  exports.getDelegatedRoot = getDelegatedRoot;
1977
+ exports.getExpectedRedirectStatus = getExpectedRedirectStatus;
1781
1978
  exports.getFirstChild = getFirstChild;
1782
1979
  exports.getHydrationKey = getHydrationKey;
1783
1980
  exports.getNextElement = getNextElement;
@@ -1793,9 +1990,12 @@ exports.installHydrationRuntime = installHydrationRuntime;
1793
1990
  exports.isDev = isDev;
1794
1991
  exports.isHref = isHref;
1795
1992
  exports.isResponseEnvelope = isResponseEnvelope;
1993
+ exports.isSafeError = isSafeError;
1796
1994
  exports.isServer = isServer;
1995
+ exports.markSafeError = markSafeError;
1797
1996
  exports.memo = memo;
1798
1997
  exports.mergeProps = mergeProps;
1998
+ exports.parseCookieHeader = parseCookieHeader;
1799
1999
  exports.redirect = redirect;
1800
2000
  exports.ref = ref;
1801
2001
  exports.registerDelegatedContainer = registerDelegatedContainer;
@@ -1805,11 +2005,11 @@ exports.reload = reload;
1805
2005
  exports.render = render;
1806
2006
  exports.renderToStream = renderToStream;
1807
2007
  exports.renderToString = renderToString;
1808
- exports.renderToStringAsync = renderToStringAsync;
1809
2008
  exports.resolveSSRNode = resolveSSRNode;
1810
2009
  exports.respond = respond;
1811
2010
  exports.runHydrationEvents = runHydrationEvents;
1812
2011
  exports.scope = scope;
2012
+ exports.serializeCookie = serializeCookie;
1813
2013
  exports.setAttribute = setAttribute;
1814
2014
  exports.setAttributeNS = setAttributeNS;
1815
2015
  exports.setProperty = setProperty;
@@ -1817,13 +2017,15 @@ exports.setStyleProperty = setStyleProperty;
1817
2017
  exports.spread = spread;
1818
2018
  exports.ssr = ssr;
1819
2019
  exports.ssrAttribute = ssrAttribute;
1820
- exports.ssrClassList = ssrClassList;
2020
+ exports.ssrClassName = ssrClassName;
1821
2021
  exports.ssrElement = ssrElement;
2022
+ exports.ssrGroup = ssrGroup;
1822
2023
  exports.ssrHydrationKey = ssrHydrationKey;
1823
2024
  exports.ssrStyle = ssrStyle;
2025
+ exports.ssrStyleProperty = ssrStyleProperty;
1824
2026
  exports.style = style;
1825
2027
  exports.template = template;
1826
2028
  exports.unregisterDelegatedContainer = unregisterDelegatedContainer;
1827
2029
  exports.unregisterDelegatedRoot = unregisterDelegatedRoot;
1828
- exports.useAssets = voidFn;
1829
2030
  exports.useHead = useHead;
2031
+ exports.warmAsset = warmAsset;