@solidjs/web 2.0.0-beta.31 → 2.0.0-beta.33

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 (73) hide show
  1. package/README.md +1 -6
  2. package/dist/dev.cjs +285 -60
  3. package/dist/dev.js +267 -57
  4. package/dist/server.cjs +1148 -176
  5. package/dist/server.js +1133 -175
  6. package/dist/web.cjs +285 -60
  7. package/dist/web.js +267 -57
  8. package/frames/dist/client.cjs +397 -175
  9. package/frames/dist/client.dev.cjs +401 -175
  10. package/frames/dist/client.dev.js +399 -173
  11. package/frames/dist/client.js +395 -173
  12. package/frames/dist/server.cjs +1424 -277
  13. package/frames/dist/server.js +1426 -280
  14. package/package.json +69 -7
  15. package/serialization/decode/package.json +20 -0
  16. package/serialization/dist/decode.cjs +110 -0
  17. package/serialization/dist/decode.js +104 -0
  18. package/serialization/dist/serialization.cjs +106 -43
  19. package/serialization/dist/serialization.js +100 -44
  20. package/serialization/types/index.d.ts +85 -60
  21. package/serialization/types/serializer-decode.d.ts +182 -0
  22. package/serialization/types-cjs/index.d.cts +85 -60
  23. package/serialization/types-cjs/serializer-decode.d.cts +182 -0
  24. package/server-functions/dist/client.cjs +131 -98
  25. package/server-functions/dist/client.js +131 -99
  26. package/server-functions/dist/rich-args.cjs +11 -0
  27. package/server-functions/dist/rich-args.js +9 -0
  28. package/server-functions/dist/server.cjs +367 -194
  29. package/server-functions/dist/server.dev.cjs +1077 -0
  30. package/server-functions/dist/server.dev.js +1045 -0
  31. package/server-functions/dist/server.js +365 -195
  32. package/server-functions/package.json +10 -0
  33. package/server-functions/rich-args/package.json +20 -0
  34. package/storage/types/index.d.ts +1 -1
  35. package/storage/types-cjs/index.d.cts +1 -1
  36. package/types/client.d.ts +149 -6
  37. package/types/cookies.d.ts +93 -0
  38. package/types/core.d.ts +4 -2
  39. package/types/frames/client.d.ts +15 -1
  40. package/types/frames/frame-client.d.ts +63 -7
  41. package/types/frames/frame-sink.d.ts +26 -3
  42. package/types/frames/frame-transport.d.ts +40 -8
  43. package/types/frames/serializer.d.ts +85 -60
  44. package/types/frames/server.d.ts +22 -0
  45. package/types/index.d.ts +2 -3
  46. package/types/response.d.ts +45 -0
  47. package/types/serializer-decode.d.ts +182 -0
  48. package/types/serializer.d.ts +85 -60
  49. package/types/server-functions/client.d.ts +2 -1
  50. package/types/server-functions/rich-args.d.ts +10 -0
  51. package/types/server-functions/server.d.ts +99 -1
  52. package/types/server-functions/shared.d.ts +79 -1
  53. package/types/server-mock.d.ts +171 -59
  54. package/types/server.d.ts +209 -37
  55. package/types-cjs/client.d.cts +149 -6
  56. package/types-cjs/cookies.d.cts +93 -0
  57. package/types-cjs/core.d.cts +4 -2
  58. package/types-cjs/frames/client.d.cts +15 -1
  59. package/types-cjs/frames/frame-client.d.cts +63 -7
  60. package/types-cjs/frames/frame-sink.d.cts +26 -3
  61. package/types-cjs/frames/frame-transport.d.cts +40 -8
  62. package/types-cjs/frames/serializer.d.cts +85 -60
  63. package/types-cjs/frames/server.d.cts +22 -0
  64. package/types-cjs/index.d.cts +2 -3
  65. package/types-cjs/response.d.cts +45 -0
  66. package/types-cjs/serializer-decode.d.cts +182 -0
  67. package/types-cjs/serializer.d.cts +85 -60
  68. package/types-cjs/server-functions/client.d.cts +2 -1
  69. package/types-cjs/server-functions/rich-args.d.cts +10 -0
  70. package/types-cjs/server-functions/server.d.cts +99 -1
  71. package/types-cjs/server-functions/shared.d.cts +79 -1
  72. package/types-cjs/server-mock.d.cts +171 -59
  73. package/types-cjs/server.d.cts +209 -37
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,
@@ -174,6 +185,7 @@ const HEAD_ELIGIBLE_TAGS = new Set(["title", "meta", "link", "style", "script",
174
185
  const HEAD_ATTR_NAME = /^[a-zA-Z_][a-zA-Z0-9_:.-]*$/;
175
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
  }
@@ -255,6 +267,64 @@ function resolveHead(groups) {
255
267
  return winners;
256
268
  }
257
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
+ const FLASH_COOKIE = "flash";
307
+ const FLASH_MATCHER = new RegExp(`(?:^|;\\s*)${FLASH_COOKIE}=([^;]+)`);
308
+ function hasFlashCookie(cookieHeader) {
309
+ return !!cookieHeader && FLASH_MATCHER.test(cookieHeader);
310
+ }
311
+ function clearFlashCookie() {
312
+ return `${FLASH_COOKIE}=; Max-Age=0; Path=/`;
313
+ }
314
+
315
+ const SERVER_FUNCTION_METADATA = Symbol.for("solid.ServerFunctionMetadata");
316
+ function getServerFunctionMetadata(fn) {
317
+ if (typeof fn !== "function") return undefined;
318
+ return fn[SERVER_FUNCTION_METADATA] || undefined;
319
+ }
320
+ function isServerFunction(fn) {
321
+ return typeof fn === "function" && !!fn[SERVER_FUNCTION_METADATA];
322
+ }
323
+ const SERVER_FUNCTION_RPC = Symbol.for("solid.ServerFunctionRPC");
324
+ function getServerFunctionRPC() {
325
+ return globalThis[SERVER_FUNCTION_RPC];
326
+ }
327
+
258
328
  const $$EVENT_OWNER = "_$DX_EVENT_OWNER";
259
329
  const INNER_OWNED = {};
260
330
  const delegatedEvents = new Set();
@@ -609,8 +679,7 @@ function insert(parent, accessor, marker, initial, options) {
609
679
  const value = normalize(accessor(), current, multi, true);
610
680
  if (typeof value !== "function") return value;
611
681
  effect(() => (hydrationRt !== null && (current = hydrationRt.reclaimRegion(current, parent, marker)), normalize(value, current, multi)), inner => {
612
- insertExpression(parent, inner, current, marker);
613
- current = inner;
682
+ current = insertExpression(parent, inner, current, marker);
614
683
  host && tagHost(current, host);
615
684
  }, prev !== undefined && !(options && options.schedule) ? {
616
685
  ...options,
@@ -619,8 +688,7 @@ function insert(parent, accessor, marker, initial, options) {
619
688
  return INNER_OWNED;
620
689
  }, value => {
621
690
  if (value === INNER_OWNED) return;
622
- insertExpression(parent, value, current, marker);
623
- current = value;
691
+ current = insertExpression(parent, value, current, marker);
624
692
  host && tagHost(current, host);
625
693
  },
626
694
  accessor.$s ? options ? {
@@ -658,6 +726,9 @@ function findAssetElement(selector, attr, value) {
658
726
  }
659
727
  return null;
660
728
  }
729
+ function setAssetAttrs(el, attrs) {
730
+ for (const name in attrs) el.setAttribute(name, attrs[name]);
731
+ }
661
732
  function mountAssetElement(descriptor) {
662
733
  let el;
663
734
  if (descriptor.type === "inline-style") {
@@ -676,12 +747,77 @@ function mountAssetElement(descriptor) {
676
747
  el.href = descriptor.href;
677
748
  }
678
749
  }
679
- if (descriptor.attrs) {
680
- for (const name in descriptor.attrs) el.setAttribute(name, descriptor.attrs[name]);
681
- }
750
+ if (descriptor.attrs) setAssetAttrs(el, descriptor.attrs);
682
751
  if (!el.isConnected) document.head.appendChild(el);
683
752
  return el;
684
753
  }
754
+ const assetLoadSettled = /*#__PURE__*/Promise.resolve();
755
+ function trackAssetLoad(entry, adopted) {
756
+ if (entry.loadPromise) return;
757
+ const el = entry.element;
758
+ let settled = el.sheet != null;
759
+ if (!settled && adopted && typeof performance !== "undefined" && performance.getEntriesByName) {
760
+ settled = performance.getEntriesByName(el.href).length > 0;
761
+ }
762
+ if (settled) {
763
+ entry.loadState = "loaded";
764
+ entry.loadPromise = assetLoadSettled;
765
+ return;
766
+ }
767
+ entry.loadState = "pending";
768
+ entry.loadPromise = new Promise(resolve => {
769
+ const settle = state => {
770
+ entry.loadState = state;
771
+ resolve();
772
+ };
773
+ el.addEventListener("load", () => settle("loaded"), {
774
+ once: true
775
+ });
776
+ el.addEventListener("error", () => settle("errored"), {
777
+ once: true
778
+ });
779
+ });
780
+ }
781
+ function warmAsset(descriptor) {
782
+ if (descriptor.policy === "exclusive" || descriptor.type === "inline-style") return;
783
+ const key = assetEntryKey(descriptor);
784
+ let entry = assetRegistry.get(key);
785
+ if (!entry) {
786
+ entry = {
787
+ count: 0,
788
+ element: null,
789
+ timer: null
790
+ };
791
+ assetRegistry.set(key, entry);
792
+ }
793
+ let adopted = true;
794
+ if (!entry.element || !entry.element.isConnected) {
795
+ const rel = descriptor.type === "module" ? "modulepreload" : "stylesheet";
796
+ let el = findAssetElement(`link[rel="${rel}"]`, "href", descriptor.href);
797
+ if (!el && descriptor.type === "style") {
798
+ el = findAssetElement('link[rel="preload"][as="style"]', "href", descriptor.href);
799
+ }
800
+ if (!el) {
801
+ adopted = false;
802
+ el = document.createElement("link");
803
+ if (descriptor.type === "style") {
804
+ el.setAttribute("rel", "preload");
805
+ el.setAttribute("as", "style");
806
+ } else {
807
+ el.setAttribute("rel", "modulepreload");
808
+ }
809
+ el.setAttribute("href", descriptor.href);
810
+ if (!document.body) el.setAttribute("blocking", "render");
811
+ }
812
+ if (descriptor.attrs) setAssetAttrs(el, descriptor.attrs);
813
+ if (!el.isConnected) document.head.appendChild(el);
814
+ entry.element = el;
815
+ entry.loadState = undefined;
816
+ entry.loadPromise = undefined;
817
+ }
818
+ if (descriptor.type === "style") trackAssetLoad(entry, adopted);
819
+ return entry;
820
+ }
685
821
  function acquireAsset(descriptor) {
686
822
  const key = assetEntryKey(descriptor);
687
823
  let entry = assetRegistry.get(key);
@@ -728,7 +864,12 @@ function acquireAsset(descriptor) {
728
864
  entry.timer = null;
729
865
  }
730
866
  entry.count++;
731
- if (!entry.element || !entry.element.isConnected) entry.element = mountAssetElement(descriptor);
867
+ if (!entry.element || !entry.element.isConnected) {
868
+ entry.element = mountAssetElement(descriptor);
869
+ } else if (descriptor.type === "style" && entry.element.getAttribute("rel") === "preload") {
870
+ entry.element.removeAttribute("as");
871
+ entry.element.setAttribute("rel", "stylesheet");
872
+ }
732
873
  let released = false;
733
874
  return () => {
734
875
  if (released) return;
@@ -877,25 +1018,9 @@ function headElementMatches(el, t) {
877
1018
  const children = t.props.children;
878
1019
  return (children == null ? "" : String(children)) === el.textContent;
879
1020
  }
880
- function acquireHeadResource(tag, props) {
881
- if (tag === "link" && (props.rel === "stylesheet" || props.rel === "modulepreload")) {
882
- const descriptor = {
883
- type: props.rel === "stylesheet" ? "style" : "module",
884
- href: props.href
885
- };
886
- let attrs = null;
887
- for (const name in props) {
888
- if (name === "rel" || name === "href") continue;
889
- if (!HEAD_ATTR_NAME.test(name)) continue;
890
- const v = props[name];
891
- if (v == null || v === false) continue;
892
- (attrs || (attrs = {}))[name] = v === true ? "" : String(v);
893
- }
894
- if (attrs) descriptor.attrs = attrs;
895
- return acquireAsset(descriptor);
896
- }
1021
+ function mountHeadResource(tag, props) {
897
1022
  const identity = resourceIdentity(tag, props);
898
- if (headMountedResources.has(identity)) return noopFn;
1023
+ if (headMountedResources.has(identity)) return;
899
1024
  headMountedResources.add(identity);
900
1025
  const url = props.href || props.src;
901
1026
  let el = null;
@@ -903,9 +1028,28 @@ function acquireHeadResource(tag, props) {
903
1028
  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);
904
1029
  }
905
1030
  if (!el) document.head.appendChild(createHeadElement(tag, props));
906
- return noopFn;
907
1031
  }
908
- function noopFn() {}
1032
+ function gateHeadResource(props) {
1033
+ const descriptor = {
1034
+ type: props.rel === "stylesheet" ? "style" : "module",
1035
+ href: props.href
1036
+ };
1037
+ let gateable = props.rel === "stylesheet" && props.href != null;
1038
+ let attrs = null;
1039
+ for (const name in props) {
1040
+ if (name === "rel" || name === "href") continue;
1041
+ if (!STYLESHEET_FETCH_META.has(name)) gateable = false;
1042
+ if (!HEAD_ATTR_NAME.test(name)) continue;
1043
+ const v = props[name];
1044
+ if (v == null || v === false) continue;
1045
+ (attrs || (attrs = {}))[name] = v === true ? "" : String(v);
1046
+ }
1047
+ if (attrs) descriptor.attrs = attrs;
1048
+ effect(() => {
1049
+ const entry = warmAsset(descriptor);
1050
+ if (gateable && entry.loadState === "pending" && typeof waitAsset === "function") waitAsset(entry.loadPromise);
1051
+ }, () => acquireAsset(descriptor));
1052
+ }
909
1053
  function useHead(tags) {
910
1054
  initHeadRegistry();
911
1055
  const reg = {
@@ -929,10 +1073,16 @@ function useHead(tags) {
929
1073
  rel: cls.rel
930
1074
  } : undefined);
931
1075
  if (cls.resource) {
932
- resources.push({
933
- tag: desc.tag,
934
- props
935
- });
1076
+ if (desc.tag === "link" && (props.rel === "stylesheet" || props.rel === "modulepreload")) {
1077
+ gateHeadResource(props);
1078
+ } else if (desc.tag === "link") {
1079
+ mountHeadResource(desc.tag, props);
1080
+ } else {
1081
+ resources.push({
1082
+ tag: desc.tag,
1083
+ props
1084
+ });
1085
+ }
936
1086
  } else {
937
1087
  const key = evalHeadValue(desc.key);
938
1088
  replaceable.push({
@@ -947,9 +1097,8 @@ function useHead(tags) {
947
1097
  resources
948
1098
  };
949
1099
  }, evaluated => {
950
- const releases = [];
951
1100
  for (let i = 0; i < evaluated.resources.length; i++) {
952
- releases.push(acquireHeadResource(evaluated.resources[i].tag, evaluated.resources[i].props));
1101
+ mountHeadResource(evaluated.resources[i].tag, evaluated.resources[i].props);
953
1102
  }
954
1103
  reg.tags = evaluated.replaceable;
955
1104
  if (reg.seq < 0) reg.seq = ++headSeq;
@@ -958,7 +1107,6 @@ function useHead(tags) {
958
1107
  return () => {
959
1108
  const idx = headRegistrations.indexOf(reg);
960
1109
  if (idx > -1) headRegistrations.splice(idx, 1);
961
- for (let i = 0; i < releases.length; i++) releases[i]();
962
1110
  scheduleHeadApply();
963
1111
  };
964
1112
  });
@@ -1324,8 +1472,11 @@ function eventHandler(e, container, state) {
1324
1472
  retarget(oriTarget);
1325
1473
  }
1326
1474
  function insertExpression(parent, value, current, marker) {
1327
- if (hydrationRt !== null && isHydrating(parent)) return;
1328
- if (value === current) return;
1475
+ if (hydrationRt !== null && isHydrating(parent)) {
1476
+ if (value && value !== current) for (const n of Array.isArray(value) ? value : [value]) if (n && n.nodeType && !isHydrating(n)) return current;
1477
+ return value;
1478
+ }
1479
+ if (value === current) return value;
1329
1480
  const t = typeof value,
1330
1481
  multi = marker !== undefined;
1331
1482
  if (t === "string" || t === "number") {
@@ -1364,6 +1515,7 @@ function insertExpression(parent, value, current, marker) {
1364
1515
  appendNodes(parent, value);
1365
1516
  }
1366
1517
  } else console.warn(`Unrecognized value. Skipped inserting`, value);
1518
+ return value;
1367
1519
  }
1368
1520
  function normalize(value, current, multi, doNotUnwrap) {
1369
1521
  value = solidJs.flatten(value, {
@@ -1446,7 +1598,13 @@ function gatherHydratable(element, root) {
1446
1598
  for (let i = 0; i < templates.length; i++) {
1447
1599
  const node = templates[i];
1448
1600
  const key = node.getAttribute("_hk");
1449
- if ((!root || key.startsWith(root)) && !solidJs.sharedConfig.registry.has(key)) solidJs.sharedConfig.registry.set(key, node);
1601
+ if (root) {
1602
+ if (!key.startsWith(root)) continue;
1603
+ } else {
1604
+ const frame = node.closest("[data-fid]");
1605
+ if (frame && frame !== element && element.contains(frame)) continue;
1606
+ }
1607
+ if (!solidJs.sharedConfig.registry.has(key)) solidJs.sharedConfig.registry.set(key, node);
1450
1608
  }
1451
1609
  }
1452
1610
  function getHydrationKey() {
@@ -1462,29 +1620,50 @@ function throwInBrowser(func) {
1462
1620
  function renderToString(fn, options) {
1463
1621
  throwInBrowser(renderToString);
1464
1622
  }
1465
- function renderToStringAsync(fn, options) {
1466
- throwInBrowser(renderToStringAsync);
1467
- }
1468
1623
  function renderToStream(fn, options) {
1469
1624
  throwInBrowser(renderToStream);
1470
1625
  }
1626
+ function createResponseStub() {
1627
+ throwInBrowser(createResponseStub);
1628
+ }
1629
+ function createRequestEvent(request, init) {
1630
+ throwInBrowser(createRequestEvent);
1631
+ }
1632
+ function getExpectedRedirectStatus(response) {
1633
+ throwInBrowser(getExpectedRedirectStatus);
1634
+ }
1635
+ function createSSRResponse() {
1636
+ throwInBrowser(createSSRResponse);
1637
+ }
1638
+ function commitEventResponse(response, event) {
1639
+ throwInBrowser(commitEventResponse);
1640
+ }
1641
+ function composeMiddleware(middlewares) {
1642
+ throwInBrowser(composeMiddleware);
1643
+ }
1471
1644
  function ssr(template, ...nodes) {}
1472
1645
  function ssrElement(name, props, children, needsId) {}
1473
- function ssrClassList(value) {}
1646
+ function ssrClassName(value) {}
1474
1647
  function ssrStyle(value) {}
1648
+ function ssrStyleProperty(name, value) {}
1475
1649
  function ssrAttribute(key, value) {}
1650
+ function ssrGroup(fn, n) {}
1476
1651
  function ssrHydrationKey() {}
1477
- function resolveSSRNode(node) {}
1478
- function escape(html) {}
1652
+ function resolveSSRNode(node, result, top) {}
1653
+ function escape(s, attr) {}
1479
1654
 
1480
1655
  const ENVELOPE = Symbol.for("solid.ResponseEnvelope");
1481
- class ResponseEnvelope {
1482
- constructor(response, value) {
1483
- this.response = response;
1484
- this.value = value;
1656
+ // PURE-annotated factory (same convention as solid's MockPromise): the brand
1657
+ const ResponseEnvelope = /* @__PURE__ */(() => {
1658
+ class ResponseEnvelope {
1659
+ constructor(response, value) {
1660
+ this.response = response;
1661
+ this.value = value;
1662
+ }
1485
1663
  }
1486
- }
1487
- ResponseEnvelope.prototype[ENVELOPE] = true;
1664
+ ResponseEnvelope.prototype[ENVELOPE] = true;
1665
+ return ResponseEnvelope;
1666
+ })();
1488
1667
  function isResponseEnvelope(value) {
1489
1668
  return !!(value && typeof value === "object" && value[ENVELOPE]);
1490
1669
  }
@@ -1492,13 +1671,38 @@ const HREF = Symbol.for("solid.Href");
1492
1671
  function isHref(value) {
1493
1672
  return !!(value && (typeof value === "object" || typeof value === "function") && value[HREF]);
1494
1673
  }
1674
+ const SAFE_ERROR = Symbol.for("solid.SafeError");
1675
+ function markSafeError(error) {
1676
+ if (error && (typeof error === "object" || typeof error === "function")) {
1677
+ Object.defineProperty(error, SAFE_ERROR, {
1678
+ value: true,
1679
+ enumerable: false,
1680
+ configurable: true
1681
+ });
1682
+ }
1683
+ return error;
1684
+ }
1685
+ function isSafeError(value) {
1686
+ return !!(value && (typeof value === "object" || typeof value === "function") && value[SAFE_ERROR]);
1687
+ }
1495
1688
  const REVALIDATE_HEADER = "X-Revalidate";
1496
1689
  function initWithRevalidate(init) {
1497
1690
  const {
1498
1691
  revalidate,
1499
1692
  ...responseInit
1500
1693
  } = init;
1501
- const headers = new Headers(responseInit.headers);
1694
+ let headers;
1695
+ if (responseInit.headers && responseInit.headers.getSetCookie) {
1696
+ headers = new Headers();
1697
+ responseInit.headers.forEach((value, key) => {
1698
+ if (key !== "set-cookie") headers.append(key, value);
1699
+ });
1700
+ for (const cookie of responseInit.headers.getSetCookie()) {
1701
+ headers.append("Set-Cookie", cookie);
1702
+ }
1703
+ } else {
1704
+ headers = new Headers(responseInit.headers);
1705
+ }
1502
1706
  revalidate !== undefined && headers.set(REVALIDATE_HEADER, revalidate.toString());
1503
1707
  return {
1504
1708
  responseInit,
@@ -1577,7 +1781,8 @@ function portalImpl(props) {
1577
1781
  endMarker = document.createTextNode(""),
1578
1782
  mount = () => props.mount || document.body,
1579
1783
  content = solidJs.createMemo(() => [startMarker, props.children], {
1580
- ssrSource: "client"
1784
+ ssrSource: "client",
1785
+ loadingValue: undefined
1581
1786
  });
1582
1787
  solidJs.createRenderEffect(
1583
1788
  () => [mount(), content(), solidJs.getOwner()], ([, c, owner]) => {
@@ -1614,7 +1819,8 @@ function portalImpl(props) {
1614
1819
  ssrSource: "client"
1615
1820
  });
1616
1821
  if (solidJs.sharedConfig.hydrating) return solidJs.createMemo(() => treeMarker, {
1617
- ssrSource: "client"
1822
+ ssrSource: "client",
1823
+ loadingValue: undefined
1618
1824
  });
1619
1825
  return treeMarker;
1620
1826
  }
@@ -1625,9 +1831,11 @@ function bindingOf(value) {
1625
1831
  function dynamic(source) {
1626
1832
  let latest = 0;
1627
1833
  const sites = new Set();
1834
+ let deliveredAddress;
1628
1835
  const resolveBinding = (next, prev) => {
1629
1836
  const binding = bindingOf(next);
1630
1837
  if (!binding) return next;
1838
+ deliveredAddress = binding.address;
1631
1839
  const prevBinding = bindingOf(prev);
1632
1840
  if (prevBinding && prevBinding.component === binding.component) {
1633
1841
  for (const deliver of sites) deliver(binding.address);
@@ -1656,7 +1864,7 @@ function dynamic(source) {
1656
1864
  });
1657
1865
  const binding = bindingOf(component);
1658
1866
  if (binding) {
1659
- const [address, setAddress] = solidJs.createSignal(binding.address);
1867
+ const [address, setAddress] = solidJs.createSignal(deliveredAddress ?? binding.address);
1660
1868
  sites.add(setAddress);
1661
1869
  solidJs.onCleanup(() => sites.delete(setAddress));
1662
1870
  return solidJs.untrack(() => binding.component(props, address));
@@ -1699,7 +1907,9 @@ _moduleUrl) {
1699
1907
  if ((Comp = solidJs.untrack(comp)) && !solidJs.sharedConfig.hydrating) return Comp(rest);
1700
1908
  const [mounted, setMounted] = solidJs.createSignal(!solidJs.sharedConfig.hydrating);
1701
1909
  const gate = solidJs.createMemo(() => (Comp = comp(), m = mounted(), solidJs.untrack(() => Comp && m ? Comp(rest) : props.fallback)));
1702
- solidJs.sharedConfig.onHydrationEnd(() => setMounted(true));
1910
+ const onHydrationEnd = solidJs.sharedConfig.onHydrationEnd;
1911
+ const release = () => setMounted(true);
1912
+ onHydrationEnd ? onHydrationEnd(release) : queueMicrotask(release);
1703
1913
  return gate;
1704
1914
  };
1705
1915
  }
@@ -1758,7 +1968,6 @@ Object.defineProperty(exports, "untrack", {
1758
1968
  enumerable: true,
1759
1969
  get: function () { return solidJs.untrack; }
1760
1970
  });
1761
- exports.Assets = voidFn;
1762
1971
  exports.ChildProperties = ChildProperties;
1763
1972
  exports.DOMElements = DOMElements;
1764
1973
  exports.DOMWithState = DOMWithState;
@@ -1773,6 +1982,7 @@ exports.REVALIDATE_HEADER = REVALIDATE_HEADER;
1773
1982
  exports.RawTextElements = RawTextElements;
1774
1983
  exports.RequestContext = RequestContext;
1775
1984
  exports.ResponseEnvelope = ResponseEnvelope;
1985
+ exports.SAFE_ERROR = SAFE_ERROR;
1776
1986
  exports.SVGElements = SVGElements;
1777
1987
  exports.VoidElements = VoidElements;
1778
1988
  exports.acquireAsset = acquireAsset;
@@ -1782,15 +1992,21 @@ exports.assign = assign;
1782
1992
  exports.claimElement = claimElement;
1783
1993
  exports.claimElementTree = claimElementTree;
1784
1994
  exports.className = className;
1995
+ exports.clearFlashCookie = clearFlashCookie;
1785
1996
  exports.clientOnly = clientOnly;
1997
+ exports.commitEventResponse = commitEventResponse;
1998
+ exports.composeMiddleware = composeMiddleware;
1999
+ exports.createRequestEvent = createRequestEvent;
2000
+ exports.createResponseStub = createResponseStub;
2001
+ exports.createSSRResponse = createSSRResponse;
1786
2002
  exports.delegateEvents = delegateEvents;
1787
2003
  exports.dynamic = dynamic;
1788
2004
  exports.dynamicProperty = dynamicProperty;
1789
2005
  exports.effect = effect;
1790
2006
  exports.escape = escape;
1791
2007
  exports.generateHydrationScript = voidFn;
1792
- exports.getAssets = voidFn;
1793
2008
  exports.getDelegatedRoot = getDelegatedRoot;
2009
+ exports.getExpectedRedirectStatus = getExpectedRedirectStatus;
1794
2010
  exports.getFirstChild = getFirstChild;
1795
2011
  exports.getHydrationKey = getHydrationKey;
1796
2012
  exports.getNextElement = getNextElement;
@@ -1798,6 +2014,9 @@ exports.getNextMarker = getNextMarker;
1798
2014
  exports.getNextMatch = getNextMatch;
1799
2015
  exports.getNextSibling = getNextSibling;
1800
2016
  exports.getRequestEvent = voidFn;
2017
+ exports.getServerFunctionMetadata = getServerFunctionMetadata;
2018
+ exports.getServerFunctionRPC = getServerFunctionRPC;
2019
+ exports.hasFlashCookie = hasFlashCookie;
1801
2020
  exports.httpHeader = httpHeader;
1802
2021
  exports.httpStatus = httpStatus;
1803
2022
  exports.hydrate = hydrate;
@@ -1806,9 +2025,13 @@ exports.installHydrationRuntime = installHydrationRuntime;
1806
2025
  exports.isDev = isDev;
1807
2026
  exports.isHref = isHref;
1808
2027
  exports.isResponseEnvelope = isResponseEnvelope;
2028
+ exports.isSafeError = isSafeError;
1809
2029
  exports.isServer = isServer;
2030
+ exports.isServerFunction = isServerFunction;
2031
+ exports.markSafeError = markSafeError;
1810
2032
  exports.memo = memo;
1811
2033
  exports.mergeProps = mergeProps;
2034
+ exports.parseCookieHeader = parseCookieHeader;
1812
2035
  exports.redirect = redirect;
1813
2036
  exports.ref = ref;
1814
2037
  exports.registerDelegatedContainer = registerDelegatedContainer;
@@ -1818,11 +2041,11 @@ exports.reload = reload;
1818
2041
  exports.render = render;
1819
2042
  exports.renderToStream = renderToStream;
1820
2043
  exports.renderToString = renderToString;
1821
- exports.renderToStringAsync = renderToStringAsync;
1822
2044
  exports.resolveSSRNode = resolveSSRNode;
1823
2045
  exports.respond = respond;
1824
2046
  exports.runHydrationEvents = runHydrationEvents;
1825
2047
  exports.scope = scope;
2048
+ exports.serializeCookie = serializeCookie;
1826
2049
  exports.setAttribute = setAttribute;
1827
2050
  exports.setAttributeNS = setAttributeNS;
1828
2051
  exports.setProperty = setProperty;
@@ -1830,13 +2053,15 @@ exports.setStyleProperty = setStyleProperty;
1830
2053
  exports.spread = spread;
1831
2054
  exports.ssr = ssr;
1832
2055
  exports.ssrAttribute = ssrAttribute;
1833
- exports.ssrClassList = ssrClassList;
2056
+ exports.ssrClassName = ssrClassName;
1834
2057
  exports.ssrElement = ssrElement;
2058
+ exports.ssrGroup = ssrGroup;
1835
2059
  exports.ssrHydrationKey = ssrHydrationKey;
1836
2060
  exports.ssrStyle = ssrStyle;
2061
+ exports.ssrStyleProperty = ssrStyleProperty;
1837
2062
  exports.style = style;
1838
2063
  exports.template = template;
1839
2064
  exports.unregisterDelegatedContainer = unregisterDelegatedContainer;
1840
2065
  exports.unregisterDelegatedRoot = unregisterDelegatedRoot;
1841
- exports.useAssets = voidFn;
1842
2066
  exports.useHead = useHead;
2067
+ exports.warmAsset = warmAsset;