@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/dist/web.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) {
@@ -252,6 +266,43 @@ function resolveHead(groups) {
252
266
  return winners;
253
267
  }
254
268
 
269
+ function parseCookieHeader(header) {
270
+ const cookies = {};
271
+ if (!header) return cookies;
272
+ for (const part of header.split(";")) {
273
+ const eq = part.indexOf("=");
274
+ if (eq < 0) continue;
275
+ const name = decodeSafe(part.slice(0, eq).trim());
276
+ let value = part.slice(eq + 1).trim();
277
+ if (value.length > 1 && value[0] === '"' && value[value.length - 1] === '"') {
278
+ value = value.slice(1, -1);
279
+ }
280
+ cookies[name] = decodeSafe(value);
281
+ }
282
+ return cookies;
283
+ }
284
+ function decodeSafe(text) {
285
+ try {
286
+ return decodeURIComponent(text);
287
+ } catch {
288
+ return text;
289
+ }
290
+ }
291
+ function serializeCookie(name, value, options = {}) {
292
+ let cookie = `${encodeURIComponent(name)}=${encodeURIComponent(value)}`;
293
+ cookie += `; Path=${options.path === undefined ? "/" : options.path}`;
294
+ if (options.domain) cookie += `; Domain=${options.domain}`;
295
+ if (options.maxAge !== undefined) cookie += `; Max-Age=${Math.trunc(options.maxAge)}`;
296
+ if (options.expires) cookie += `; Expires=${options.expires.toUTCString()}`;
297
+ if (options.httpOnly) cookie += "; HttpOnly";
298
+ if (options.secure) cookie += "; Secure";
299
+ if (options.sameSite) {
300
+ const sameSite = options.sameSite.toLowerCase();
301
+ cookie += `; SameSite=${sameSite === "none" ? "None" : sameSite === "strict" ? "Strict" : "Lax"}`;
302
+ }
303
+ return cookie;
304
+ }
305
+
255
306
  const $$EVENT_OWNER = "_$DX_EVENT_OWNER";
256
307
  const INNER_OWNED = {};
257
308
  const delegatedEvents = new Set();
@@ -650,6 +701,9 @@ function findAssetElement(selector, attr, value) {
650
701
  }
651
702
  return null;
652
703
  }
704
+ function setAssetAttrs(el, attrs) {
705
+ for (const name in attrs) el.setAttribute(name, attrs[name]);
706
+ }
653
707
  function mountAssetElement(descriptor) {
654
708
  let el;
655
709
  if (descriptor.type === "inline-style") {
@@ -668,12 +722,77 @@ function mountAssetElement(descriptor) {
668
722
  el.href = descriptor.href;
669
723
  }
670
724
  }
671
- if (descriptor.attrs) {
672
- for (const name in descriptor.attrs) el.setAttribute(name, descriptor.attrs[name]);
673
- }
725
+ if (descriptor.attrs) setAssetAttrs(el, descriptor.attrs);
674
726
  if (!el.isConnected) document.head.appendChild(el);
675
727
  return el;
676
728
  }
729
+ const assetLoadSettled = /*#__PURE__*/Promise.resolve();
730
+ function trackAssetLoad(entry, adopted) {
731
+ if (entry.loadPromise) return;
732
+ const el = entry.element;
733
+ let settled = el.sheet != null;
734
+ if (!settled && adopted && typeof performance !== "undefined" && performance.getEntriesByName) {
735
+ settled = performance.getEntriesByName(el.href).length > 0;
736
+ }
737
+ if (settled) {
738
+ entry.loadState = "loaded";
739
+ entry.loadPromise = assetLoadSettled;
740
+ return;
741
+ }
742
+ entry.loadState = "pending";
743
+ entry.loadPromise = new Promise(resolve => {
744
+ const settle = state => {
745
+ entry.loadState = state;
746
+ resolve();
747
+ };
748
+ el.addEventListener("load", () => settle("loaded"), {
749
+ once: true
750
+ });
751
+ el.addEventListener("error", () => settle("errored"), {
752
+ once: true
753
+ });
754
+ });
755
+ }
756
+ function warmAsset(descriptor) {
757
+ if (descriptor.policy === "exclusive" || descriptor.type === "inline-style") return;
758
+ const key = assetEntryKey(descriptor);
759
+ let entry = assetRegistry.get(key);
760
+ if (!entry) {
761
+ entry = {
762
+ count: 0,
763
+ element: null,
764
+ timer: null
765
+ };
766
+ assetRegistry.set(key, entry);
767
+ }
768
+ let adopted = true;
769
+ if (!entry.element || !entry.element.isConnected) {
770
+ const rel = descriptor.type === "module" ? "modulepreload" : "stylesheet";
771
+ let el = findAssetElement(`link[rel="${rel}"]`, "href", descriptor.href);
772
+ if (!el && descriptor.type === "style") {
773
+ el = findAssetElement('link[rel="preload"][as="style"]', "href", descriptor.href);
774
+ }
775
+ if (!el) {
776
+ adopted = false;
777
+ el = document.createElement("link");
778
+ if (descriptor.type === "style") {
779
+ el.setAttribute("rel", "preload");
780
+ el.setAttribute("as", "style");
781
+ } else {
782
+ el.setAttribute("rel", "modulepreload");
783
+ }
784
+ el.setAttribute("href", descriptor.href);
785
+ if (!document.body) el.setAttribute("blocking", "render");
786
+ }
787
+ if (descriptor.attrs) setAssetAttrs(el, descriptor.attrs);
788
+ if (!el.isConnected) document.head.appendChild(el);
789
+ entry.element = el;
790
+ entry.loadState = undefined;
791
+ entry.loadPromise = undefined;
792
+ }
793
+ if (descriptor.type === "style") trackAssetLoad(entry, adopted);
794
+ return entry;
795
+ }
677
796
  function acquireAsset(descriptor) {
678
797
  const key = assetEntryKey(descriptor);
679
798
  let entry = assetRegistry.get(key);
@@ -720,7 +839,12 @@ function acquireAsset(descriptor) {
720
839
  entry.timer = null;
721
840
  }
722
841
  entry.count++;
723
- if (!entry.element || !entry.element.isConnected) entry.element = mountAssetElement(descriptor);
842
+ if (!entry.element || !entry.element.isConnected) {
843
+ entry.element = mountAssetElement(descriptor);
844
+ } else if (descriptor.type === "style" && entry.element.getAttribute("rel") === "preload") {
845
+ entry.element.removeAttribute("as");
846
+ entry.element.setAttribute("rel", "stylesheet");
847
+ }
724
848
  let released = false;
725
849
  return () => {
726
850
  if (released) return;
@@ -831,21 +955,25 @@ function flushHeadRegistry() {
831
955
  headOwned.set(identity, els);
832
956
  }
833
957
  }
834
- function renderHeadElement(t, identity, existing) {
835
- for (let i = 0; i < existing.length; i++) {
836
- if (headElementMatches(existing[i], t)) return existing.splice(i, 1)[0];
837
- }
838
- const el = document.createElement(t.tag);
839
- for (const name in t.props) {
958
+ function createHeadElement(tag, props) {
959
+ const el = document.createElement(tag);
960
+ for (const name in props) {
840
961
  if (name === "children" || name === "ref" || name.slice(0, 2) === "on") continue;
841
962
  if (!HEAD_ATTR_NAME.test(name)) {
842
963
  continue;
843
964
  }
844
- const v = t.props[name];
965
+ const v = props[name];
845
966
  if (v == null || v === false) continue;
846
967
  el.setAttribute(name, v === true ? "" : String(v));
847
968
  }
848
- if (t.props.children != null) el.textContent = String(t.props.children);
969
+ if (props.children != null) el.textContent = String(props.children);
970
+ return el;
971
+ }
972
+ function renderHeadElement(t, identity, existing) {
973
+ for (let i = 0; i < existing.length; i++) {
974
+ if (headElementMatches(existing[i], t)) return existing.splice(i, 1)[0];
975
+ }
976
+ const el = createHeadElement(t.tag, t.props);
849
977
  el.setAttribute("data-dh", identity);
850
978
  document.head.appendChild(el);
851
979
  return el;
@@ -863,48 +991,39 @@ function headElementMatches(el, t) {
863
991
  const children = t.props.children;
864
992
  return (children == null ? "" : String(children)) === el.textContent;
865
993
  }
866
- function acquireHeadResource(tag, props) {
867
- if (tag === "link" && (props.rel === "stylesheet" || props.rel === "modulepreload")) {
868
- const descriptor = {
869
- type: props.rel === "stylesheet" ? "style" : "module",
870
- href: props.href
871
- };
872
- let attrs = null;
873
- for (const name in props) {
874
- if (name === "rel" || name === "href") continue;
875
- if (!HEAD_ATTR_NAME.test(name)) continue;
876
- const v = props[name];
877
- if (v == null || v === false) continue;
878
- (attrs || (attrs = {}))[name] = v === true ? "" : String(v);
879
- }
880
- if (attrs) descriptor.attrs = attrs;
881
- return acquireAsset(descriptor);
882
- }
994
+ function mountHeadResource(tag, props) {
883
995
  const identity = resourceIdentity(tag, props);
884
- if (headMountedResources.has(identity)) return noopFn;
996
+ if (headMountedResources.has(identity)) return;
885
997
  headMountedResources.add(identity);
886
998
  const url = props.href || props.src;
887
999
  let el = null;
888
1000
  if (url != null) {
889
1001
  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);
890
1002
  }
891
- if (!el) {
892
- el = document.createElement(tag);
893
- for (const name in props) {
894
- if (name === "children" || name === "ref" || name.slice(0, 2) === "on") continue;
895
- if (!HEAD_ATTR_NAME.test(name)) continue;
896
- const v = props[name];
897
- if (v == null || v === false) continue;
898
- el.setAttribute(name, v === true ? "" : String(v));
899
- }
900
- if (props.children != null) el.textContent = String(props.children);
901
- document.head.appendChild(el);
1003
+ if (!el) document.head.appendChild(createHeadElement(tag, props));
1004
+ }
1005
+ function gateHeadResource(props) {
1006
+ const descriptor = {
1007
+ type: props.rel === "stylesheet" ? "style" : "module",
1008
+ href: props.href
1009
+ };
1010
+ let gateable = props.rel === "stylesheet" && props.href != null;
1011
+ let attrs = null;
1012
+ for (const name in props) {
1013
+ if (name === "rel" || name === "href") continue;
1014
+ if (!STYLESHEET_FETCH_META.has(name)) gateable = false;
1015
+ if (!HEAD_ATTR_NAME.test(name)) continue;
1016
+ const v = props[name];
1017
+ if (v == null || v === false) continue;
1018
+ (attrs || (attrs = {}))[name] = v === true ? "" : String(v);
902
1019
  }
903
- return noopFn;
1020
+ if (attrs) descriptor.attrs = attrs;
1021
+ effect(() => {
1022
+ const entry = warmAsset(descriptor);
1023
+ if (gateable && entry.loadState === "pending" && typeof waitAsset === "function") waitAsset(entry.loadPromise);
1024
+ }, () => acquireAsset(descriptor));
904
1025
  }
905
- function noopFn() {}
906
1026
  function useHead(tags) {
907
- const list = Array.isArray(tags) ? tags : [tags];
908
1027
  initHeadRegistry();
909
1028
  const reg = {
910
1029
  seq: -1,
@@ -912,6 +1031,8 @@ function useHead(tags) {
912
1031
  };
913
1032
  const uid = ++headUid;
914
1033
  effect(() => {
1034
+ let list = typeof tags === "function" ? tags() : tags;
1035
+ if (!Array.isArray(list)) list = [list];
915
1036
  const replaceable = [];
916
1037
  const resources = [];
917
1038
  for (let i = 0; i < list.length; i++) {
@@ -924,10 +1045,16 @@ function useHead(tags) {
924
1045
  rel: cls.rel
925
1046
  } : undefined);
926
1047
  if (cls.resource) {
927
- resources.push({
928
- tag: desc.tag,
929
- props
930
- });
1048
+ if (desc.tag === "link" && (props.rel === "stylesheet" || props.rel === "modulepreload")) {
1049
+ gateHeadResource(props);
1050
+ } else if (desc.tag === "link") {
1051
+ mountHeadResource(desc.tag, props);
1052
+ } else {
1053
+ resources.push({
1054
+ tag: desc.tag,
1055
+ props
1056
+ });
1057
+ }
931
1058
  } else {
932
1059
  const key = evalHeadValue(desc.key);
933
1060
  replaceable.push({
@@ -942,9 +1069,8 @@ function useHead(tags) {
942
1069
  resources
943
1070
  };
944
1071
  }, evaluated => {
945
- const releases = [];
946
1072
  for (let i = 0; i < evaluated.resources.length; i++) {
947
- releases.push(acquireHeadResource(evaluated.resources[i].tag, evaluated.resources[i].props));
1073
+ mountHeadResource(evaluated.resources[i].tag, evaluated.resources[i].props);
948
1074
  }
949
1075
  reg.tags = evaluated.replaceable;
950
1076
  if (reg.seq < 0) reg.seq = ++headSeq;
@@ -953,7 +1079,6 @@ function useHead(tags) {
953
1079
  return () => {
954
1080
  const idx = headRegistrations.indexOf(reg);
955
1081
  if (idx > -1) headRegistrations.splice(idx, 1);
956
- for (let i = 0; i < releases.length; i++) releases[i]();
957
1082
  scheduleHeadApply();
958
1083
  };
959
1084
  });
@@ -1389,7 +1514,13 @@ function gatherHydratable(element, root) {
1389
1514
  for (let i = 0; i < templates.length; i++) {
1390
1515
  const node = templates[i];
1391
1516
  const key = node.getAttribute("_hk");
1392
- if ((!root || key.startsWith(root)) && !solidJs.sharedConfig.registry.has(key)) solidJs.sharedConfig.registry.set(key, node);
1517
+ if (root) {
1518
+ if (!key.startsWith(root)) continue;
1519
+ } else {
1520
+ const frame = node.closest("[data-fid]");
1521
+ if (frame && frame !== element && element.contains(frame)) continue;
1522
+ }
1523
+ if (!solidJs.sharedConfig.registry.has(key)) solidJs.sharedConfig.registry.set(key, node);
1393
1524
  }
1394
1525
  }
1395
1526
  function getHydrationKey() {
@@ -1405,20 +1536,37 @@ function throwInBrowser(func) {
1405
1536
  function renderToString(fn, options) {
1406
1537
  throwInBrowser(renderToString);
1407
1538
  }
1408
- function renderToStringAsync(fn, options) {
1409
- throwInBrowser(renderToStringAsync);
1410
- }
1411
1539
  function renderToStream(fn, options) {
1412
1540
  throwInBrowser(renderToStream);
1413
1541
  }
1542
+ function createResponseStub() {
1543
+ throwInBrowser(createResponseStub);
1544
+ }
1545
+ function createRequestEvent(request, init) {
1546
+ throwInBrowser(createRequestEvent);
1547
+ }
1548
+ function getExpectedRedirectStatus(response) {
1549
+ throwInBrowser(getExpectedRedirectStatus);
1550
+ }
1551
+ function createSSRResponse() {
1552
+ throwInBrowser(createSSRResponse);
1553
+ }
1554
+ function commitEventResponse(response, event) {
1555
+ throwInBrowser(commitEventResponse);
1556
+ }
1557
+ function composeMiddleware(middlewares) {
1558
+ throwInBrowser(composeMiddleware);
1559
+ }
1414
1560
  function ssr(template, ...nodes) {}
1415
1561
  function ssrElement(name, props, children, needsId) {}
1416
- function ssrClassList(value) {}
1562
+ function ssrClassName(value) {}
1417
1563
  function ssrStyle(value) {}
1564
+ function ssrStyleProperty(name, value) {}
1418
1565
  function ssrAttribute(key, value) {}
1566
+ function ssrGroup(fn, n) {}
1419
1567
  function ssrHydrationKey() {}
1420
- function resolveSSRNode(node) {}
1421
- function escape(html) {}
1568
+ function resolveSSRNode(node, result, top) {}
1569
+ function escape(s, attr) {}
1422
1570
 
1423
1571
  const ENVELOPE = Symbol.for("solid.ResponseEnvelope");
1424
1572
  class ResponseEnvelope {
@@ -1435,13 +1583,38 @@ const HREF = Symbol.for("solid.Href");
1435
1583
  function isHref(value) {
1436
1584
  return !!(value && (typeof value === "object" || typeof value === "function") && value[HREF]);
1437
1585
  }
1586
+ const SAFE_ERROR = Symbol.for("solid.SafeError");
1587
+ function markSafeError(error) {
1588
+ if (error && (typeof error === "object" || typeof error === "function")) {
1589
+ Object.defineProperty(error, SAFE_ERROR, {
1590
+ value: true,
1591
+ enumerable: false,
1592
+ configurable: true
1593
+ });
1594
+ }
1595
+ return error;
1596
+ }
1597
+ function isSafeError(value) {
1598
+ return !!(value && (typeof value === "object" || typeof value === "function") && value[SAFE_ERROR]);
1599
+ }
1438
1600
  const REVALIDATE_HEADER = "X-Revalidate";
1439
1601
  function initWithRevalidate(init) {
1440
1602
  const {
1441
1603
  revalidate,
1442
1604
  ...responseInit
1443
1605
  } = init;
1444
- const headers = new Headers(responseInit.headers);
1606
+ let headers;
1607
+ if (responseInit.headers && responseInit.headers.getSetCookie) {
1608
+ headers = new Headers();
1609
+ responseInit.headers.forEach((value, key) => {
1610
+ if (key !== "set-cookie") headers.append(key, value);
1611
+ });
1612
+ for (const cookie of responseInit.headers.getSetCookie()) {
1613
+ headers.append("Set-Cookie", cookie);
1614
+ }
1615
+ } else {
1616
+ headers = new Headers(responseInit.headers);
1617
+ }
1445
1618
  revalidate !== undefined && headers.set(REVALIDATE_HEADER, revalidate.toString());
1446
1619
  return {
1447
1620
  responseInit,
@@ -1559,19 +1732,31 @@ function portalImpl(props) {
1559
1732
  });
1560
1733
  return treeMarker;
1561
1734
  }
1562
- const COMPONENT_HANDOFF = Symbol.for("dom-expressions.component-handoff");
1563
- function resolveHandoff(next, prev) {
1564
- const handoff = typeof next === "function" && next !== null && next[COMPONENT_HANDOFF];
1565
- return handoff && handoff.take(prev) ? prev : next;
1735
+ const COMPONENT_BINDING = Symbol.for("dom-expressions.component-binding");
1736
+ function bindingOf(value) {
1737
+ return value !== null && (typeof value === "function" || typeof value === "object") && value[COMPONENT_BINDING] || undefined;
1566
1738
  }
1567
1739
  function dynamic(source) {
1568
1740
  let latest = 0;
1741
+ const sites = new Set();
1742
+ let deliveredAddress;
1743
+ const resolveBinding = (next, prev) => {
1744
+ const binding = bindingOf(next);
1745
+ if (!binding) return next;
1746
+ deliveredAddress = binding.address;
1747
+ const prevBinding = bindingOf(prev);
1748
+ if (prevBinding && prevBinding.component === binding.component) {
1749
+ for (const deliver of sites) deliver(binding.address);
1750
+ return prev;
1751
+ }
1752
+ return next;
1753
+ };
1569
1754
  const cached = solidJs.createMemo(prev => {
1570
1755
  const next = source();
1571
- if (!next || typeof next.then !== "function") return resolveHandoff(next, prev);
1756
+ if (!next || typeof next.then !== "function") return resolveBinding(next, prev);
1572
1757
  const token = ++latest;
1573
1758
  return {
1574
- then: (onFulfilled, onRejected) => next.then(resolved => onFulfilled(token === latest ? resolveHandoff(resolved, prev) : resolved), onRejected)
1759
+ then: (onFulfilled, onRejected) => next.then(resolved => onFulfilled(token === latest ? resolveBinding(resolved, prev) : resolved), onRejected)
1575
1760
  };
1576
1761
  }, {
1577
1762
  lazy: true
@@ -1581,7 +1766,16 @@ function dynamic(source) {
1581
1766
  const component = cached();
1582
1767
  switch (typeof component) {
1583
1768
  case "function":
1584
- return solidJs.untrack(() => component(props));
1769
+ {
1770
+ const binding = bindingOf(component);
1771
+ if (binding) {
1772
+ const [address, setAddress] = solidJs.createSignal(deliveredAddress ?? binding.address);
1773
+ sites.add(setAddress);
1774
+ solidJs.onCleanup(() => sites.delete(setAddress));
1775
+ return solidJs.untrack(() => binding.component(props, address));
1776
+ }
1777
+ return solidJs.untrack(() => component(props));
1778
+ }
1585
1779
  case "string":
1586
1780
  const el = solidJs.sharedConfig.hydrating ? getNextElement() : createElement(component, solidJs.untrack(() => props.is));
1587
1781
  spread(el, props);
@@ -1618,9 +1812,7 @@ _moduleUrl) {
1618
1812
  if ((Comp = solidJs.untrack(comp)) && !solidJs.sharedConfig.hydrating) return Comp(rest);
1619
1813
  const [mounted, setMounted] = solidJs.createSignal(!solidJs.sharedConfig.hydrating);
1620
1814
  const gate = solidJs.createMemo(() => (Comp = comp(), m = mounted(), solidJs.untrack(() => Comp && m ? Comp(rest) : props.fallback)));
1621
- solidJs.onSettled(() => {
1622
- setMounted(true);
1623
- });
1815
+ solidJs.sharedConfig.onHydrationEnd(() => setMounted(true));
1624
1816
  return gate;
1625
1817
  };
1626
1818
  }
@@ -1679,7 +1871,6 @@ Object.defineProperty(exports, "untrack", {
1679
1871
  enumerable: true,
1680
1872
  get: function () { return solidJs.untrack; }
1681
1873
  });
1682
- exports.Assets = voidFn;
1683
1874
  exports.ChildProperties = ChildProperties;
1684
1875
  exports.DOMElements = DOMElements;
1685
1876
  exports.DOMWithState = DOMWithState;
@@ -1694,6 +1885,7 @@ exports.REVALIDATE_HEADER = REVALIDATE_HEADER;
1694
1885
  exports.RawTextElements = RawTextElements;
1695
1886
  exports.RequestContext = RequestContext;
1696
1887
  exports.ResponseEnvelope = ResponseEnvelope;
1888
+ exports.SAFE_ERROR = SAFE_ERROR;
1697
1889
  exports.SVGElements = SVGElements;
1698
1890
  exports.VoidElements = VoidElements;
1699
1891
  exports.acquireAsset = acquireAsset;
@@ -1704,14 +1896,19 @@ exports.claimElement = claimElement;
1704
1896
  exports.claimElementTree = claimElementTree;
1705
1897
  exports.className = className;
1706
1898
  exports.clientOnly = clientOnly;
1899
+ exports.commitEventResponse = commitEventResponse;
1900
+ exports.composeMiddleware = composeMiddleware;
1901
+ exports.createRequestEvent = createRequestEvent;
1902
+ exports.createResponseStub = createResponseStub;
1903
+ exports.createSSRResponse = createSSRResponse;
1707
1904
  exports.delegateEvents = delegateEvents;
1708
1905
  exports.dynamic = dynamic;
1709
1906
  exports.dynamicProperty = dynamicProperty;
1710
1907
  exports.effect = effect;
1711
1908
  exports.escape = escape;
1712
1909
  exports.generateHydrationScript = voidFn;
1713
- exports.getAssets = voidFn;
1714
1910
  exports.getDelegatedRoot = getDelegatedRoot;
1911
+ exports.getExpectedRedirectStatus = getExpectedRedirectStatus;
1715
1912
  exports.getFirstChild = getFirstChild;
1716
1913
  exports.getHydrationKey = getHydrationKey;
1717
1914
  exports.getNextElement = getNextElement;
@@ -1727,9 +1924,12 @@ exports.installHydrationRuntime = installHydrationRuntime;
1727
1924
  exports.isDev = isDev;
1728
1925
  exports.isHref = isHref;
1729
1926
  exports.isResponseEnvelope = isResponseEnvelope;
1927
+ exports.isSafeError = isSafeError;
1730
1928
  exports.isServer = isServer;
1929
+ exports.markSafeError = markSafeError;
1731
1930
  exports.memo = memo;
1732
1931
  exports.mergeProps = mergeProps;
1932
+ exports.parseCookieHeader = parseCookieHeader;
1733
1933
  exports.redirect = redirect;
1734
1934
  exports.ref = ref;
1735
1935
  exports.registerDelegatedContainer = registerDelegatedContainer;
@@ -1739,11 +1939,11 @@ exports.reload = reload;
1739
1939
  exports.render = render;
1740
1940
  exports.renderToStream = renderToStream;
1741
1941
  exports.renderToString = renderToString;
1742
- exports.renderToStringAsync = renderToStringAsync;
1743
1942
  exports.resolveSSRNode = resolveSSRNode;
1744
1943
  exports.respond = respond;
1745
1944
  exports.runHydrationEvents = runHydrationEvents;
1746
1945
  exports.scope = scope;
1946
+ exports.serializeCookie = serializeCookie;
1747
1947
  exports.setAttribute = setAttribute;
1748
1948
  exports.setAttributeNS = setAttributeNS;
1749
1949
  exports.setProperty = setProperty;
@@ -1751,13 +1951,15 @@ exports.setStyleProperty = setStyleProperty;
1751
1951
  exports.spread = spread;
1752
1952
  exports.ssr = ssr;
1753
1953
  exports.ssrAttribute = ssrAttribute;
1754
- exports.ssrClassList = ssrClassList;
1954
+ exports.ssrClassName = ssrClassName;
1755
1955
  exports.ssrElement = ssrElement;
1956
+ exports.ssrGroup = ssrGroup;
1756
1957
  exports.ssrHydrationKey = ssrHydrationKey;
1757
1958
  exports.ssrStyle = ssrStyle;
1959
+ exports.ssrStyleProperty = ssrStyleProperty;
1758
1960
  exports.style = style;
1759
1961
  exports.template = template;
1760
1962
  exports.unregisterDelegatedContainer = unregisterDelegatedContainer;
1761
1963
  exports.unregisterDelegatedRoot = unregisterDelegatedRoot;
1762
- exports.useAssets = voidFn;
1763
1964
  exports.useHead = useHead;
1965
+ exports.warmAsset = warmAsset;