@solidjs/web 2.0.0-beta.26 → 2.0.0-beta.27

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 (39) hide show
  1. package/dist/dev.cjs +3 -1
  2. package/dist/dev.js +3 -2
  3. package/dist/server.cjs +41 -78
  4. package/dist/server.js +42 -80
  5. package/dist/web.cjs +3 -1
  6. package/dist/web.js +3 -2
  7. package/frames/dist/client.cjs +69 -21
  8. package/frames/dist/client.dev.cjs +69 -21
  9. package/frames/dist/client.dev.js +70 -22
  10. package/frames/dist/client.js +70 -22
  11. package/frames/dist/server.cjs +33 -45
  12. package/frames/dist/server.js +33 -45
  13. package/package.json +4 -4
  14. package/serialization/dist/serialization.cjs +6 -3
  15. package/serialization/dist/serialization.js +6 -3
  16. package/serialization/types/index.d.ts +7 -1
  17. package/serialization/types-cjs/index.d.cts +7 -1
  18. package/server-functions/dist/client.cjs +15 -2
  19. package/server-functions/dist/client.js +13 -3
  20. package/server-functions/dist/server.cjs +161 -5
  21. package/server-functions/dist/server.js +155 -6
  22. package/types/client.d.ts +3 -3
  23. package/types/frames/serializer.d.ts +7 -1
  24. package/types/jsx.d.ts +1 -1
  25. package/types/response.d.ts +10 -0
  26. package/types/serializer.d.ts +7 -1
  27. package/types/server-functions/client.d.ts +3 -0
  28. package/types/server-functions/flash.d.ts +38 -0
  29. package/types/server-functions/server.d.ts +79 -4
  30. package/types/server-functions/shared.d.ts +35 -0
  31. package/types-cjs/client.d.cts +3 -3
  32. package/types-cjs/frames/serializer.d.cts +7 -1
  33. package/types-cjs/jsx.d.cts +1 -1
  34. package/types-cjs/response.d.cts +10 -0
  35. package/types-cjs/serializer.d.cts +7 -1
  36. package/types-cjs/server-functions/client.d.cts +3 -0
  37. package/types-cjs/server-functions/flash.d.cts +38 -0
  38. package/types-cjs/server-functions/server.d.cts +79 -4
  39. package/types-cjs/server-functions/shared.d.cts +35 -0
package/dist/dev.cjs CHANGED
@@ -1175,13 +1175,14 @@ const HREF = Symbol.for("solid.Href");
1175
1175
  function isHref(value) {
1176
1176
  return !!(value && (typeof value === "object" || typeof value === "function") && value[HREF]);
1177
1177
  }
1178
+ const REVALIDATE_HEADER = "X-Revalidate";
1178
1179
  function initWithRevalidate(init) {
1179
1180
  const {
1180
1181
  revalidate,
1181
1182
  ...responseInit
1182
1183
  } = init;
1183
1184
  const headers = new Headers(responseInit.headers);
1184
- revalidate !== undefined && headers.set("X-Revalidate", revalidate.toString());
1185
+ revalidate !== undefined && headers.set(REVALIDATE_HEADER, revalidate.toString());
1185
1186
  return {
1186
1187
  responseInit,
1187
1188
  headers
@@ -1394,6 +1395,7 @@ exports.HydrationScript = voidFn;
1394
1395
  exports.MathMLElements = MathMLElements;
1395
1396
  exports.Namespaces = Namespaces;
1396
1397
  exports.Portal = Portal;
1398
+ exports.REVALIDATE_HEADER = REVALIDATE_HEADER;
1397
1399
  exports.RawTextElements = RawTextElements;
1398
1400
  exports.RequestContext = RequestContext;
1399
1401
  exports.ResponseEnvelope = ResponseEnvelope;
package/dist/dev.js CHANGED
@@ -1174,13 +1174,14 @@ const HREF = Symbol.for("solid.Href");
1174
1174
  function isHref(value) {
1175
1175
  return !!(value && (typeof value === "object" || typeof value === "function") && value[HREF]);
1176
1176
  }
1177
+ const REVALIDATE_HEADER = "X-Revalidate";
1177
1178
  function initWithRevalidate(init) {
1178
1179
  const {
1179
1180
  revalidate,
1180
1181
  ...responseInit
1181
1182
  } = init;
1182
1183
  const headers = new Headers(responseInit.headers);
1183
- revalidate !== undefined && headers.set("X-Revalidate", revalidate.toString());
1184
+ revalidate !== undefined && headers.set(REVALIDATE_HEADER, revalidate.toString());
1184
1185
  return {
1185
1186
  responseInit,
1186
1187
  headers
@@ -1330,4 +1331,4 @@ function createElement(tagName, is = undefined) {
1330
1331
  });
1331
1332
  }
1332
1333
 
1333
- export { voidFn as Assets, ChildProperties, DOMElements, DOMWithState, DelegatedEvents, Dynamic, HREF, voidFn as HydrationScript, MathMLElements, Namespaces, Portal, RawTextElements, RequestContext, ResponseEnvelope, SVGElements, VoidElements, acquireAsset, addEvent, applyRef, assign, claimElement, claimElementTree, className, delegateEvents, dynamic, dynamicProperty, effect, escape, voidFn as generateHydrationScript, voidFn as getAssets, getDelegatedRoot, getFirstChild, getHydrationKey, getNextElement, getNextMarker, getNextMatch, getNextSibling, voidFn as getRequestEvent, hydrate, insert, installHydrationRuntime, isDev, isHref, isResponseEnvelope, isServer, memo, mergeProps, redirect, ref, registerDelegatedContainer, registerDelegatedRoot, registerElementClaim, reload, render, renderToStream, renderToString, renderToStringAsync, resolveSSRNode, respond, runHydrationEvents, scope, setAttribute, setAttributeNS, setProperty, setStyleProperty, spread, ssr, ssrAttribute, ssrClassList, ssrElement, ssrHydrationKey, ssrStyle, style, template, unregisterDelegatedContainer, unregisterDelegatedRoot, voidFn as useAssets };
1334
+ export { voidFn as Assets, ChildProperties, DOMElements, DOMWithState, DelegatedEvents, Dynamic, HREF, voidFn as HydrationScript, MathMLElements, Namespaces, Portal, REVALIDATE_HEADER, RawTextElements, RequestContext, ResponseEnvelope, SVGElements, VoidElements, acquireAsset, addEvent, applyRef, assign, claimElement, claimElementTree, className, delegateEvents, dynamic, dynamicProperty, effect, escape, voidFn as generateHydrationScript, voidFn as getAssets, getDelegatedRoot, getFirstChild, getHydrationKey, getNextElement, getNextMarker, getNextMatch, getNextSibling, voidFn as getRequestEvent, hydrate, insert, installHydrationRuntime, isDev, isHref, isResponseEnvelope, isServer, memo, mergeProps, redirect, ref, registerDelegatedContainer, registerDelegatedRoot, registerElementClaim, reload, render, renderToStream, renderToString, renderToStringAsync, resolveSSRNode, respond, runHydrationEvents, scope, setAttribute, setAttributeNS, setProperty, setStyleProperty, spread, ssr, ssrAttribute, ssrClassList, ssrElement, ssrHydrationKey, ssrStyle, style, template, unregisterDelegatedContainer, unregisterDelegatedRoot, voidFn as useAssets };
package/dist/server.cjs CHANGED
@@ -65,6 +65,7 @@ const effect = (fn, effectFn, options) => solidJs.createRenderEffect(fn, effectF
65
65
  const memo = fn => solidJs.createMemo(() => fn(), syncOptions);
66
66
 
67
67
  const DEFAULT_DISABLED_FEATURES = seroval.Feature.AggregateError | seroval.Feature.BigIntTypedArray;
68
+ const serializeOnlyDisabledFeatures = () => process.env.NODE_ENV === "development" ? 0 : seroval.Feature.ErrorPrototypeStack;
68
69
  const HYDRATION_GLOBAL = "_$HY.r";
69
70
  const DEFAULT_WEB_PLUGINS = Object.freeze([web.AbortSignalPlugin,
70
71
  web.CustomEventPlugin, web.DOMExceptionPlugin, web.EventPlugin,
@@ -76,7 +77,7 @@ function createSerializer(options) {
76
77
  return new seroval.Serializer({
77
78
  ...options,
78
79
  plugins: resolveSerializerPlugins(options.plugins),
79
- disabledFeatures: options.disabledFeatures === undefined ? DEFAULT_DISABLED_FEATURES : options.disabledFeatures
80
+ disabledFeatures: (options.disabledFeatures === undefined ? DEFAULT_DISABLED_FEATURES : options.disabledFeatures) | serializeOnlyDisabledFeatures()
80
81
  });
81
82
  }
82
83
  function createHydrationSerializer({
@@ -225,7 +226,7 @@ function applyAssetTracking(context, tracking, manifest) {
225
226
  }
226
227
  }
227
228
  const VOID_ELEMENTS = /^(?:area|base|br|col|embed|hr|img|input|keygen|link|menuitem|meta|param|source|track|wbr)$/i;
228
- const REPLACE_SCRIPT = `function $df(e,n,o,t){if(!(n=document.getElementById(e)))return 0;if(!(o=document.getElementById("pl-"+e)))return(_$HY.dq=_$HY.dq||{})[e]=1,0;for(;o&&(8!==o.nodeType||o.nodeValue!=="pl-"+e);)t=o.nextSibling,o.remove(),o=t;_$HY.done?o.remove():o.replaceWith(n.content),n.remove(),_$HY.fe(e),$dfd();return 1}function $dfl(e,o,n){if(!(o=document.getElementById("pl-"+e)))return(_$HY.dlq=_$HY.dlq||{})[e]=1,0;if(o._$fl)return 1;for(n=o.nextSibling;n;){if(8===n.nodeType&&n.nodeValue==="pl-"+e){o.parentNode&&o.parentNode.insertBefore(o.content.cloneNode(!0),n),o._$fl=1,$dfd();return 1}n=n.nextSibling}return 0}function $dflj(e,i){for(i=0;i<e.length;i++)$dfl(e[i])}function $dfd(e,i){if(e=_$HY.dq){_$HY.dq=0;for(i in e)$df(i)}if(e=_$HY.dlq){_$HY.dlq=0;for(i in e)$dfl(i)}}function $dfs(e,c,d){(_$HY.sc=_$HY.sc||{})[e]=c,d&&((_$HY.sd=_$HY.sd||{})[e]=1)}function $dfg(e,g,i,k){if(!(g=_$HY.sg&&_$HY.sg[e]))return;for(i=0;i<g.length;i++)if(_$HY.sc&&_$HY.sc[g[i]]>0)return;for(i=0;i<g.length;i++)k=g[i],delete _$HY.sg[k],$df(k)}function $dfc(e){if(--_$HY.sc[e]<=0){delete _$HY.sc[e],_$HY.sg&&_$HY.sg[e]?$dfg(e):!(_$HY.sd&&_$HY.sd[e])&&$df(e);_$HY.sd&&delete _$HY.sd[e]}}function $dfj(e,i,n){for(i=0;i<e.length;i++)if(_$HY.sc&&_$HY.sc[e[i]]>0){for(n=0;n<e.length;n++)(_$HY.sg=_$HY.sg||{})[e[n]]=e;return}for(i=0;i<e.length;i++)$df(e[i])}`;
229
+ const REPLACE_SCRIPT = `function $df(e,n,o,t){if(!(n=document.getElementById(e)))return 0;if(!(o=document.getElementById("pl-"+e)))return(_$HY.dq=_$HY.dq||{})[e]=1,0;for(;o&&(8!==o.nodeType||o.nodeValue!=="pl-"+e);)t=o.nextSibling,o.remove(),o=t;t=o.parentNode,_$HY.done?o.remove():o.replaceWith(n.content),n.remove(),_$HY.fe(e,t),$dfd();return 1}function $dfl(e,o,n){if(!(o=document.getElementById("pl-"+e)))return(_$HY.dlq=_$HY.dlq||{})[e]=1,0;if(o._$fl)return 1;for(n=o.nextSibling;n;){if(8===n.nodeType&&n.nodeValue==="pl-"+e){o.parentNode&&o.parentNode.insertBefore(o.content.cloneNode(!0),n),o._$fl=1,$dfd();return 1}n=n.nextSibling}return 0}function $dflj(e,i){for(i=0;i<e.length;i++)$dfl(e[i])}function $dfd(e,i){if(e=_$HY.dq){_$HY.dq=0;for(i in e)$df(i)}if(e=_$HY.dlq){_$HY.dlq=0;for(i in e)$dfl(i)}}function $dfs(e,c,d){(_$HY.sc=_$HY.sc||{})[e]=c,d&&((_$HY.sd=_$HY.sd||{})[e]=1)}function $dfg(e,g,i,k){if(!(g=_$HY.sg&&_$HY.sg[e]))return;for(i=0;i<g.length;i++)if(_$HY.sc&&_$HY.sc[g[i]]>0)return;for(i=0;i<g.length;i++)k=g[i],delete _$HY.sg[k],$df(k)}function $dfc(e){if(--_$HY.sc[e]<=0){delete _$HY.sc[e],_$HY.sg&&_$HY.sg[e]?$dfg(e):!(_$HY.sd&&_$HY.sd[e])&&$df(e);_$HY.sd&&delete _$HY.sd[e]}}function $dfj(e,i,n){for(i=0;i<e.length;i++)if(_$HY.sc&&_$HY.sc[e[i]]>0){for(n=0;n<e.length;n++)(_$HY.sg=_$HY.sg||{})[e[n]]=e;return}for(i=0;i<e.length;i++)$df(e[i])}`;
229
230
  function renderToString(code, options = {}) {
230
231
  const {
231
232
  renderId = "",
@@ -287,11 +288,8 @@ function renderToString(code, options = {}) {
287
288
  serializeFragmentAssets("", tracking.boundaryModules, solidJs.sharedConfig.context);
288
289
  solidJs.sharedConfig.context.noHydrate = true;
289
290
  serializer.close();
290
- html = injectAssets(solidJs.sharedConfig.context.assets, html);
291
- html = injectPreloadLinks(tracking.emittedAssets, html);
292
- html = injectInlineStyles(tracking.inlineStyles, html, nonce);
293
- if (scripts.length) html = injectScripts(html, scripts, options.nonce);
294
- return html;
291
+ const assetsHtml = resolveAssetsHtml(solidJs.sharedConfig.context.assets);
292
+ return assembleDocument(html, assetsHtml, tracking.emittedAssets, tracking.inlineStyles, scripts.length ? scripts : "", nonce);
295
293
  }
296
294
  function renderToStream(code, options = {}) {
297
295
  let {
@@ -364,11 +362,7 @@ function renderToStream(code, options = {}) {
364
362
  }
365
363
  },
366
364
  shell(shellHtml, meta) {
367
- shellHtml = injectBeforeHead(shellHtml, meta.assets);
368
- shellHtml = injectPreloadLinks(meta.preloads, shellHtml);
369
- shellHtml = injectInlineStyles(meta.inlineStyles, shellHtml, nonce);
370
- if (meta.tasks.length) shellHtml = injectScripts(shellHtml, meta.tasks, nonce);
371
- buffer.write(shellHtml);
365
+ buffer.write(assembleDocument(shellHtml, meta.assets, meta.preloads, meta.inlineStyles, meta.tasks.length ? meta.tasks : "", nonce));
372
366
  },
373
367
  ...options.sink
374
368
  };
@@ -1113,28 +1107,36 @@ function resolveAssetsHtml(assets) {
1113
1107
  for (let i = 0, len = assets.length; i < len; i++) out += assets[i]();
1114
1108
  return out;
1115
1109
  }
1116
- function injectBeforeHead(html, content) {
1117
- if (!content) return html;
1118
- const index = html.indexOf("</head>");
1119
- if (index === -1) return html;
1120
- return html.slice(0, index) + content + html.slice(index);
1121
- }
1122
- function injectAssets(assets, html) {
1123
- return injectBeforeHead(html, resolveAssetsHtml(assets));
1124
- }
1125
- function injectPreloadLinks(emittedAssets, html, nonce) {
1126
- if (!emittedAssets.size) return html;
1127
- let links = "";
1128
- for (const url of emittedAssets) {
1129
- if (url.endsWith(".css")) {
1130
- links += `<link rel="stylesheet" href="${url}">`;
1131
- } else {
1132
- links += `<link rel="modulepreload" href="${url}">`;
1110
+ function assembleDocument(html, assetsHtml, emittedAssets, inlineStyles, scripts, nonce) {
1111
+ const scriptTag = scripts ? `<script${nonce ? ` nonce="${nonce}"` : ""}>${scripts}</script>` : "";
1112
+ if (!assetsHtml && !(emittedAssets && emittedAssets.size) && !(inlineStyles && inlineStyles.size)) {
1113
+ if (!scriptTag) return html;
1114
+ const xs = html.indexOf("<!--xs-->");
1115
+ return xs === -1 ? html + scriptTag : html.slice(0, xs) + scriptTag + html.slice(xs);
1116
+ }
1117
+ const headIdx = html.indexOf("</head>");
1118
+ if (headIdx === -1) {
1119
+ if (!scriptTag) return html;
1120
+ const xs = html.indexOf("<!--xs-->");
1121
+ return xs === -1 ? html + scriptTag : html.slice(0, xs) + scriptTag + html.slice(xs);
1122
+ }
1123
+ let head = assetsHtml || "";
1124
+ if (emittedAssets && emittedAssets.size) {
1125
+ for (const url of emittedAssets) {
1126
+ head += url.endsWith(".css") ? `<link rel="stylesheet" href="${url}">` : `<link rel="modulepreload" href="${url}">`;
1133
1127
  }
1134
1128
  }
1135
- const index = html.indexOf("</head>");
1136
- if (index === -1) return html;
1137
- return html.slice(0, index) + links + html.slice(index);
1129
+ if (inlineStyles && inlineStyles.size) {
1130
+ for (const entry of inlineStyles.values()) {
1131
+ if (entry.emitted) continue;
1132
+ entry.emitted = true;
1133
+ head += renderInlineStyle(entry, nonce);
1134
+ }
1135
+ }
1136
+ if (!scriptTag) return html.slice(0, headIdx) + head + html.slice(headIdx);
1137
+ const xsIdx = html.indexOf("<!--xs-->");
1138
+ if (xsIdx === -1) return html.slice(0, headIdx) + head + html.slice(headIdx) + scriptTag;
1139
+ return xsIdx < headIdx ? html.slice(0, xsIdx) + scriptTag + html.slice(xsIdx, headIdx) + head + html.slice(headIdx) : html.slice(0, headIdx) + head + html.slice(headIdx, xsIdx) + scriptTag + html.slice(xsIdx);
1138
1140
  }
1139
1141
  function serializeFragmentAssets(key, boundaryModules, context) {
1140
1142
  const map = boundaryModules.get(key);
@@ -1186,26 +1188,6 @@ function renderInlineStyle(entry, nonce) {
1186
1188
  }
1187
1189
  return `<style${nonce ? ` nonce="${nonce}"` : ""} data-asset="${escape(entry.id, true)}"${attrs}>${escapeStyleContent(entry.content)}</style>`;
1188
1190
  }
1189
- function injectInlineStyles(inlineStyles, html, nonce) {
1190
- if (!inlineStyles.size) return html;
1191
- const index = html.indexOf("</head>");
1192
- if (index === -1) return html;
1193
- let out = "";
1194
- for (const entry of inlineStyles.values()) {
1195
- if (entry.emitted) continue;
1196
- entry.emitted = true;
1197
- out += renderInlineStyle(entry, nonce);
1198
- }
1199
- return out ? html.slice(0, index) + out + html.slice(index) : html;
1200
- }
1201
- function injectScripts(html, scripts, nonce) {
1202
- const tag = `<script${nonce ? ` nonce="${nonce}"` : ""}>${scripts}</script>`;
1203
- const index = html.indexOf("<!--xs-->");
1204
- if (index > -1) {
1205
- return html.slice(0, index) + tag + html.slice(index);
1206
- }
1207
- return html + tag;
1208
- }
1209
1191
  function waitForFragments(registry, key) {
1210
1192
  for (const k of [...registry.keys()].reverse()) {
1211
1193
  if (key.startsWith(k)) return k;
@@ -1361,13 +1343,14 @@ const HREF = Symbol.for("solid.Href");
1361
1343
  function isHref(value) {
1362
1344
  return !!(value && (typeof value === "object" || typeof value === "function") && value[HREF]);
1363
1345
  }
1346
+ const REVALIDATE_HEADER = "X-Revalidate";
1364
1347
  function initWithRevalidate(init) {
1365
1348
  const {
1366
1349
  revalidate,
1367
1350
  ...responseInit
1368
1351
  } = init;
1369
1352
  const headers = new Headers(responseInit.headers);
1370
- revalidate !== undefined && headers.set("X-Revalidate", revalidate.toString());
1353
+ revalidate !== undefined && headers.set(REVALIDATE_HEADER, revalidate.toString());
1371
1354
  return {
1372
1355
  responseInit,
1373
1356
  headers
@@ -1417,33 +1400,12 @@ function respond(value, init = {}) {
1417
1400
  const isServer = true;
1418
1401
  const isDev = false;
1419
1402
  function dynamic(source) {
1420
- const o = solidJs.getOwner();
1421
- if (o?.id != null) solidJs.getNextChildId(o);
1403
+ const cached = solidJs.createMemo(source, {
1404
+ serialize: false
1405
+ });
1422
1406
  return props => {
1423
- const comp = source();
1424
- let p;
1425
- let settled = false;
1426
- let value;
1427
- let error;
1428
- if (comp && typeof comp.then === "function") {
1429
- p = comp;
1430
- p.then(v => {
1431
- value = v;
1432
- settled = true;
1433
- }, err => {
1434
- error = err;
1435
- settled = true;
1436
- });
1437
- const ctx = solidJs.sharedConfig.context;
1438
- if (ctx?.async) ctx.block(p.then(() => {}, () => {}));
1439
- }
1440
1407
  return solidJs.createMemo(() => {
1441
- let c = comp;
1442
- if (p) {
1443
- if (!settled) throw new solidJs.NotReadyError(p);
1444
- if (error) throw error;
1445
- c = value;
1446
- }
1408
+ const c = cached();
1447
1409
  if (c) {
1448
1410
  if (typeof c === "function") return c(props);
1449
1411
  if (typeof c === "string") {
@@ -1536,6 +1498,7 @@ exports.HydrationScript = HydrationScript;
1536
1498
  exports.MathMLElements = MathMLElements;
1537
1499
  exports.Namespaces = Namespaces;
1538
1500
  exports.Portal = Portal;
1501
+ exports.REVALIDATE_HEADER = REVALIDATE_HEADER;
1539
1502
  exports.RawTextElements = RawTextElements;
1540
1503
  exports.RequestContext = RequestContext;
1541
1504
  exports.ResponseEnvelope = ResponseEnvelope;
package/dist/server.js CHANGED
@@ -1,4 +1,4 @@
1
- import { createRenderEffect, createMemo, sharedConfig, createRoot, ssrHandleError, getOwner, runWithOwner, createComponent, omit, getNextChildId, NotReadyError } from 'solid-js';
1
+ import { createRenderEffect, createMemo, sharedConfig, createRoot, ssrHandleError, getOwner, runWithOwner, createComponent, omit, getNextChildId } from 'solid-js';
2
2
  export { Errored, For, Hydration, Loading, Match, NoHydration, Repeat, Reveal, Show, Switch, createComponent, getOwner, merge as mergeProps, ssrScope as scope, untrack } from 'solid-js';
3
3
  import { Serializer, getCrossReferenceHeader, Feature } from 'seroval';
4
4
  import { AbortSignalPlugin, CustomEventPlugin, DOMExceptionPlugin, EventPlugin, FormDataPlugin, HeadersPlugin, ReadableStreamPlugin, RequestPlugin, ResponsePlugin, URLSearchParamsPlugin, URLPlugin } from 'seroval-plugins/web';
@@ -64,6 +64,7 @@ const effect = (fn, effectFn, options) => createRenderEffect(fn, effectFn, optio
64
64
  const memo = fn => createMemo(() => fn(), syncOptions);
65
65
 
66
66
  const DEFAULT_DISABLED_FEATURES = Feature.AggregateError | Feature.BigIntTypedArray;
67
+ const serializeOnlyDisabledFeatures = () => process.env.NODE_ENV === "development" ? 0 : Feature.ErrorPrototypeStack;
67
68
  const HYDRATION_GLOBAL = "_$HY.r";
68
69
  const DEFAULT_WEB_PLUGINS = Object.freeze([AbortSignalPlugin,
69
70
  CustomEventPlugin, DOMExceptionPlugin, EventPlugin,
@@ -75,7 +76,7 @@ function createSerializer(options) {
75
76
  return new Serializer({
76
77
  ...options,
77
78
  plugins: resolveSerializerPlugins(options.plugins),
78
- disabledFeatures: options.disabledFeatures === undefined ? DEFAULT_DISABLED_FEATURES : options.disabledFeatures
79
+ disabledFeatures: (options.disabledFeatures === undefined ? DEFAULT_DISABLED_FEATURES : options.disabledFeatures) | serializeOnlyDisabledFeatures()
79
80
  });
80
81
  }
81
82
  function createHydrationSerializer({
@@ -224,7 +225,7 @@ function applyAssetTracking(context, tracking, manifest) {
224
225
  }
225
226
  }
226
227
  const VOID_ELEMENTS = /^(?:area|base|br|col|embed|hr|img|input|keygen|link|menuitem|meta|param|source|track|wbr)$/i;
227
- const REPLACE_SCRIPT = `function $df(e,n,o,t){if(!(n=document.getElementById(e)))return 0;if(!(o=document.getElementById("pl-"+e)))return(_$HY.dq=_$HY.dq||{})[e]=1,0;for(;o&&(8!==o.nodeType||o.nodeValue!=="pl-"+e);)t=o.nextSibling,o.remove(),o=t;_$HY.done?o.remove():o.replaceWith(n.content),n.remove(),_$HY.fe(e),$dfd();return 1}function $dfl(e,o,n){if(!(o=document.getElementById("pl-"+e)))return(_$HY.dlq=_$HY.dlq||{})[e]=1,0;if(o._$fl)return 1;for(n=o.nextSibling;n;){if(8===n.nodeType&&n.nodeValue==="pl-"+e){o.parentNode&&o.parentNode.insertBefore(o.content.cloneNode(!0),n),o._$fl=1,$dfd();return 1}n=n.nextSibling}return 0}function $dflj(e,i){for(i=0;i<e.length;i++)$dfl(e[i])}function $dfd(e,i){if(e=_$HY.dq){_$HY.dq=0;for(i in e)$df(i)}if(e=_$HY.dlq){_$HY.dlq=0;for(i in e)$dfl(i)}}function $dfs(e,c,d){(_$HY.sc=_$HY.sc||{})[e]=c,d&&((_$HY.sd=_$HY.sd||{})[e]=1)}function $dfg(e,g,i,k){if(!(g=_$HY.sg&&_$HY.sg[e]))return;for(i=0;i<g.length;i++)if(_$HY.sc&&_$HY.sc[g[i]]>0)return;for(i=0;i<g.length;i++)k=g[i],delete _$HY.sg[k],$df(k)}function $dfc(e){if(--_$HY.sc[e]<=0){delete _$HY.sc[e],_$HY.sg&&_$HY.sg[e]?$dfg(e):!(_$HY.sd&&_$HY.sd[e])&&$df(e);_$HY.sd&&delete _$HY.sd[e]}}function $dfj(e,i,n){for(i=0;i<e.length;i++)if(_$HY.sc&&_$HY.sc[e[i]]>0){for(n=0;n<e.length;n++)(_$HY.sg=_$HY.sg||{})[e[n]]=e;return}for(i=0;i<e.length;i++)$df(e[i])}`;
228
+ const REPLACE_SCRIPT = `function $df(e,n,o,t){if(!(n=document.getElementById(e)))return 0;if(!(o=document.getElementById("pl-"+e)))return(_$HY.dq=_$HY.dq||{})[e]=1,0;for(;o&&(8!==o.nodeType||o.nodeValue!=="pl-"+e);)t=o.nextSibling,o.remove(),o=t;t=o.parentNode,_$HY.done?o.remove():o.replaceWith(n.content),n.remove(),_$HY.fe(e,t),$dfd();return 1}function $dfl(e,o,n){if(!(o=document.getElementById("pl-"+e)))return(_$HY.dlq=_$HY.dlq||{})[e]=1,0;if(o._$fl)return 1;for(n=o.nextSibling;n;){if(8===n.nodeType&&n.nodeValue==="pl-"+e){o.parentNode&&o.parentNode.insertBefore(o.content.cloneNode(!0),n),o._$fl=1,$dfd();return 1}n=n.nextSibling}return 0}function $dflj(e,i){for(i=0;i<e.length;i++)$dfl(e[i])}function $dfd(e,i){if(e=_$HY.dq){_$HY.dq=0;for(i in e)$df(i)}if(e=_$HY.dlq){_$HY.dlq=0;for(i in e)$dfl(i)}}function $dfs(e,c,d){(_$HY.sc=_$HY.sc||{})[e]=c,d&&((_$HY.sd=_$HY.sd||{})[e]=1)}function $dfg(e,g,i,k){if(!(g=_$HY.sg&&_$HY.sg[e]))return;for(i=0;i<g.length;i++)if(_$HY.sc&&_$HY.sc[g[i]]>0)return;for(i=0;i<g.length;i++)k=g[i],delete _$HY.sg[k],$df(k)}function $dfc(e){if(--_$HY.sc[e]<=0){delete _$HY.sc[e],_$HY.sg&&_$HY.sg[e]?$dfg(e):!(_$HY.sd&&_$HY.sd[e])&&$df(e);_$HY.sd&&delete _$HY.sd[e]}}function $dfj(e,i,n){for(i=0;i<e.length;i++)if(_$HY.sc&&_$HY.sc[e[i]]>0){for(n=0;n<e.length;n++)(_$HY.sg=_$HY.sg||{})[e[n]]=e;return}for(i=0;i<e.length;i++)$df(e[i])}`;
228
229
  function renderToString(code, options = {}) {
229
230
  const {
230
231
  renderId = "",
@@ -286,11 +287,8 @@ function renderToString(code, options = {}) {
286
287
  serializeFragmentAssets("", tracking.boundaryModules, sharedConfig.context);
287
288
  sharedConfig.context.noHydrate = true;
288
289
  serializer.close();
289
- html = injectAssets(sharedConfig.context.assets, html);
290
- html = injectPreloadLinks(tracking.emittedAssets, html);
291
- html = injectInlineStyles(tracking.inlineStyles, html, nonce);
292
- if (scripts.length) html = injectScripts(html, scripts, options.nonce);
293
- return html;
290
+ const assetsHtml = resolveAssetsHtml(sharedConfig.context.assets);
291
+ return assembleDocument(html, assetsHtml, tracking.emittedAssets, tracking.inlineStyles, scripts.length ? scripts : "", nonce);
294
292
  }
295
293
  function renderToStream(code, options = {}) {
296
294
  let {
@@ -363,11 +361,7 @@ function renderToStream(code, options = {}) {
363
361
  }
364
362
  },
365
363
  shell(shellHtml, meta) {
366
- shellHtml = injectBeforeHead(shellHtml, meta.assets);
367
- shellHtml = injectPreloadLinks(meta.preloads, shellHtml);
368
- shellHtml = injectInlineStyles(meta.inlineStyles, shellHtml, nonce);
369
- if (meta.tasks.length) shellHtml = injectScripts(shellHtml, meta.tasks, nonce);
370
- buffer.write(shellHtml);
364
+ buffer.write(assembleDocument(shellHtml, meta.assets, meta.preloads, meta.inlineStyles, meta.tasks.length ? meta.tasks : "", nonce));
371
365
  },
372
366
  ...options.sink
373
367
  };
@@ -1112,28 +1106,36 @@ function resolveAssetsHtml(assets) {
1112
1106
  for (let i = 0, len = assets.length; i < len; i++) out += assets[i]();
1113
1107
  return out;
1114
1108
  }
1115
- function injectBeforeHead(html, content) {
1116
- if (!content) return html;
1117
- const index = html.indexOf("</head>");
1118
- if (index === -1) return html;
1119
- return html.slice(0, index) + content + html.slice(index);
1120
- }
1121
- function injectAssets(assets, html) {
1122
- return injectBeforeHead(html, resolveAssetsHtml(assets));
1123
- }
1124
- function injectPreloadLinks(emittedAssets, html, nonce) {
1125
- if (!emittedAssets.size) return html;
1126
- let links = "";
1127
- for (const url of emittedAssets) {
1128
- if (url.endsWith(".css")) {
1129
- links += `<link rel="stylesheet" href="${url}">`;
1130
- } else {
1131
- links += `<link rel="modulepreload" href="${url}">`;
1109
+ function assembleDocument(html, assetsHtml, emittedAssets, inlineStyles, scripts, nonce) {
1110
+ const scriptTag = scripts ? `<script${nonce ? ` nonce="${nonce}"` : ""}>${scripts}</script>` : "";
1111
+ if (!assetsHtml && !(emittedAssets && emittedAssets.size) && !(inlineStyles && inlineStyles.size)) {
1112
+ if (!scriptTag) return html;
1113
+ const xs = html.indexOf("<!--xs-->");
1114
+ return xs === -1 ? html + scriptTag : html.slice(0, xs) + scriptTag + html.slice(xs);
1115
+ }
1116
+ const headIdx = html.indexOf("</head>");
1117
+ if (headIdx === -1) {
1118
+ if (!scriptTag) return html;
1119
+ const xs = html.indexOf("<!--xs-->");
1120
+ return xs === -1 ? html + scriptTag : html.slice(0, xs) + scriptTag + html.slice(xs);
1121
+ }
1122
+ let head = assetsHtml || "";
1123
+ if (emittedAssets && emittedAssets.size) {
1124
+ for (const url of emittedAssets) {
1125
+ head += url.endsWith(".css") ? `<link rel="stylesheet" href="${url}">` : `<link rel="modulepreload" href="${url}">`;
1132
1126
  }
1133
1127
  }
1134
- const index = html.indexOf("</head>");
1135
- if (index === -1) return html;
1136
- return html.slice(0, index) + links + html.slice(index);
1128
+ if (inlineStyles && inlineStyles.size) {
1129
+ for (const entry of inlineStyles.values()) {
1130
+ if (entry.emitted) continue;
1131
+ entry.emitted = true;
1132
+ head += renderInlineStyle(entry, nonce);
1133
+ }
1134
+ }
1135
+ if (!scriptTag) return html.slice(0, headIdx) + head + html.slice(headIdx);
1136
+ const xsIdx = html.indexOf("<!--xs-->");
1137
+ if (xsIdx === -1) return html.slice(0, headIdx) + head + html.slice(headIdx) + scriptTag;
1138
+ return xsIdx < headIdx ? html.slice(0, xsIdx) + scriptTag + html.slice(xsIdx, headIdx) + head + html.slice(headIdx) : html.slice(0, headIdx) + head + html.slice(headIdx, xsIdx) + scriptTag + html.slice(xsIdx);
1137
1139
  }
1138
1140
  function serializeFragmentAssets(key, boundaryModules, context) {
1139
1141
  const map = boundaryModules.get(key);
@@ -1185,26 +1187,6 @@ function renderInlineStyle(entry, nonce) {
1185
1187
  }
1186
1188
  return `<style${nonce ? ` nonce="${nonce}"` : ""} data-asset="${escape(entry.id, true)}"${attrs}>${escapeStyleContent(entry.content)}</style>`;
1187
1189
  }
1188
- function injectInlineStyles(inlineStyles, html, nonce) {
1189
- if (!inlineStyles.size) return html;
1190
- const index = html.indexOf("</head>");
1191
- if (index === -1) return html;
1192
- let out = "";
1193
- for (const entry of inlineStyles.values()) {
1194
- if (entry.emitted) continue;
1195
- entry.emitted = true;
1196
- out += renderInlineStyle(entry, nonce);
1197
- }
1198
- return out ? html.slice(0, index) + out + html.slice(index) : html;
1199
- }
1200
- function injectScripts(html, scripts, nonce) {
1201
- const tag = `<script${nonce ? ` nonce="${nonce}"` : ""}>${scripts}</script>`;
1202
- const index = html.indexOf("<!--xs-->");
1203
- if (index > -1) {
1204
- return html.slice(0, index) + tag + html.slice(index);
1205
- }
1206
- return html + tag;
1207
- }
1208
1190
  function waitForFragments(registry, key) {
1209
1191
  for (const k of [...registry.keys()].reverse()) {
1210
1192
  if (key.startsWith(k)) return k;
@@ -1360,13 +1342,14 @@ const HREF = Symbol.for("solid.Href");
1360
1342
  function isHref(value) {
1361
1343
  return !!(value && (typeof value === "object" || typeof value === "function") && value[HREF]);
1362
1344
  }
1345
+ const REVALIDATE_HEADER = "X-Revalidate";
1363
1346
  function initWithRevalidate(init) {
1364
1347
  const {
1365
1348
  revalidate,
1366
1349
  ...responseInit
1367
1350
  } = init;
1368
1351
  const headers = new Headers(responseInit.headers);
1369
- revalidate !== undefined && headers.set("X-Revalidate", revalidate.toString());
1352
+ revalidate !== undefined && headers.set(REVALIDATE_HEADER, revalidate.toString());
1370
1353
  return {
1371
1354
  responseInit,
1372
1355
  headers
@@ -1416,33 +1399,12 @@ function respond(value, init = {}) {
1416
1399
  const isServer = true;
1417
1400
  const isDev = false;
1418
1401
  function dynamic(source) {
1419
- const o = getOwner();
1420
- if (o?.id != null) getNextChildId(o);
1402
+ const cached = createMemo(source, {
1403
+ serialize: false
1404
+ });
1421
1405
  return props => {
1422
- const comp = source();
1423
- let p;
1424
- let settled = false;
1425
- let value;
1426
- let error;
1427
- if (comp && typeof comp.then === "function") {
1428
- p = comp;
1429
- p.then(v => {
1430
- value = v;
1431
- settled = true;
1432
- }, err => {
1433
- error = err;
1434
- settled = true;
1435
- });
1436
- const ctx = sharedConfig.context;
1437
- if (ctx?.async) ctx.block(p.then(() => {}, () => {}));
1438
- }
1439
1406
  return createMemo(() => {
1440
- let c = comp;
1441
- if (p) {
1442
- if (!settled) throw new NotReadyError(p);
1443
- if (error) throw error;
1444
- c = value;
1445
- }
1407
+ const c = cached();
1446
1408
  if (c) {
1447
1409
  if (typeof c === "function") return c(props);
1448
1410
  if (typeof c === "string") {
@@ -1464,4 +1426,4 @@ function Portal(props) {
1464
1426
  return undefined;
1465
1427
  }
1466
1428
 
1467
- export { Assets, ChildProperties, DOMElements, DOMWithState, DelegatedEvents, Dynamic, HREF, HydrationScript, MathMLElements, Namespaces, Portal, RawTextElements, RequestContext, ResponseEnvelope, SVGElements, VoidElements, notSup as acquireAsset, notSup as addEvent, applyRef, notSup as assign, claimElement, claimElementTree, notSup as className, notSup as delegateEvents, dynamic, notSup as dynamicProperty, effect, escape, generateHydrationScript, getAssets, notSup as getDelegatedRoot, getHydrationKey, notSup as getNextElement, notSup as getNextMarker, notSup as getNextMatch, getRequestEvent, notSup as hydrate, notSup as insert, isDev, isHref, isResponseEnvelope, isServer, memo, redirect, notSup as ref, notSup as registerDelegatedContainer, notSup as registerDelegatedRoot, registerElementClaim, reload, notSup as render, renderToStream, renderToString, renderToStringAsync, respond, notSup as runHydrationEvents, notSup as setAttribute, notSup as setAttributeNS, notSup as setProperty, notSup as setStyleProperty, notSup as spread, ssr, ssrAttribute, ssrClassName, ssrElement, ssrGroup, ssrHydrationKey, ssrStyle, ssrStyleProperty, notSup as style, notSup as template, notSup as unregisterDelegatedContainer, notSup as unregisterDelegatedRoot, useAssets };
1429
+ export { Assets, ChildProperties, DOMElements, DOMWithState, DelegatedEvents, Dynamic, HREF, HydrationScript, MathMLElements, Namespaces, Portal, REVALIDATE_HEADER, RawTextElements, RequestContext, ResponseEnvelope, SVGElements, VoidElements, notSup as acquireAsset, notSup as addEvent, applyRef, notSup as assign, claimElement, claimElementTree, notSup as className, notSup as delegateEvents, dynamic, notSup as dynamicProperty, effect, escape, generateHydrationScript, getAssets, notSup as getDelegatedRoot, getHydrationKey, notSup as getNextElement, notSup as getNextMarker, notSup as getNextMatch, getRequestEvent, notSup as hydrate, notSup as insert, isDev, isHref, isResponseEnvelope, isServer, memo, redirect, notSup as ref, notSup as registerDelegatedContainer, notSup as registerDelegatedRoot, registerElementClaim, reload, notSup as render, renderToStream, renderToString, renderToStringAsync, respond, notSup as runHydrationEvents, notSup as setAttribute, notSup as setAttributeNS, notSup as setProperty, notSup as setStyleProperty, notSup as spread, ssr, ssrAttribute, ssrClassName, ssrElement, ssrGroup, ssrHydrationKey, ssrStyle, ssrStyleProperty, notSup as style, notSup as template, notSup as unregisterDelegatedContainer, notSup as unregisterDelegatedRoot, useAssets };
package/dist/web.cjs CHANGED
@@ -1118,13 +1118,14 @@ const HREF = Symbol.for("solid.Href");
1118
1118
  function isHref(value) {
1119
1119
  return !!(value && (typeof value === "object" || typeof value === "function") && value[HREF]);
1120
1120
  }
1121
+ const REVALIDATE_HEADER = "X-Revalidate";
1121
1122
  function initWithRevalidate(init) {
1122
1123
  const {
1123
1124
  revalidate,
1124
1125
  ...responseInit
1125
1126
  } = init;
1126
1127
  const headers = new Headers(responseInit.headers);
1127
- revalidate !== undefined && headers.set("X-Revalidate", revalidate.toString());
1128
+ revalidate !== undefined && headers.set(REVALIDATE_HEADER, revalidate.toString());
1128
1129
  return {
1129
1130
  responseInit,
1130
1131
  headers
@@ -1332,6 +1333,7 @@ exports.HydrationScript = voidFn;
1332
1333
  exports.MathMLElements = MathMLElements;
1333
1334
  exports.Namespaces = Namespaces;
1334
1335
  exports.Portal = Portal;
1336
+ exports.REVALIDATE_HEADER = REVALIDATE_HEADER;
1335
1337
  exports.RawTextElements = RawTextElements;
1336
1338
  exports.RequestContext = RequestContext;
1337
1339
  exports.ResponseEnvelope = ResponseEnvelope;
package/dist/web.js CHANGED
@@ -1117,13 +1117,14 @@ const HREF = Symbol.for("solid.Href");
1117
1117
  function isHref(value) {
1118
1118
  return !!(value && (typeof value === "object" || typeof value === "function") && value[HREF]);
1119
1119
  }
1120
+ const REVALIDATE_HEADER = "X-Revalidate";
1120
1121
  function initWithRevalidate(init) {
1121
1122
  const {
1122
1123
  revalidate,
1123
1124
  ...responseInit
1124
1125
  } = init;
1125
1126
  const headers = new Headers(responseInit.headers);
1126
- revalidate !== undefined && headers.set("X-Revalidate", revalidate.toString());
1127
+ revalidate !== undefined && headers.set(REVALIDATE_HEADER, revalidate.toString());
1127
1128
  return {
1128
1129
  responseInit,
1129
1130
  headers
@@ -1268,4 +1269,4 @@ function createElement(tagName, is = undefined) {
1268
1269
  });
1269
1270
  }
1270
1271
 
1271
- export { voidFn as Assets, ChildProperties, DOMElements, DOMWithState, DelegatedEvents, Dynamic, HREF, voidFn as HydrationScript, MathMLElements, Namespaces, Portal, RawTextElements, RequestContext, ResponseEnvelope, SVGElements, VoidElements, acquireAsset, addEvent, applyRef, assign, claimElement, claimElementTree, className, delegateEvents, dynamic, dynamicProperty, effect, escape, voidFn as generateHydrationScript, voidFn as getAssets, getDelegatedRoot, getFirstChild, getHydrationKey, getNextElement, getNextMarker, getNextMatch, getNextSibling, voidFn as getRequestEvent, hydrate, insert, installHydrationRuntime, isDev, isHref, isResponseEnvelope, isServer, memo, mergeProps, redirect, ref, registerDelegatedContainer, registerDelegatedRoot, registerElementClaim, reload, render, renderToStream, renderToString, renderToStringAsync, resolveSSRNode, respond, runHydrationEvents, scope, setAttribute, setAttributeNS, setProperty, setStyleProperty, spread, ssr, ssrAttribute, ssrClassList, ssrElement, ssrHydrationKey, ssrStyle, style, template, unregisterDelegatedContainer, unregisterDelegatedRoot, voidFn as useAssets };
1272
+ export { voidFn as Assets, ChildProperties, DOMElements, DOMWithState, DelegatedEvents, Dynamic, HREF, voidFn as HydrationScript, MathMLElements, Namespaces, Portal, REVALIDATE_HEADER, RawTextElements, RequestContext, ResponseEnvelope, SVGElements, VoidElements, acquireAsset, addEvent, applyRef, assign, claimElement, claimElementTree, className, delegateEvents, dynamic, dynamicProperty, effect, escape, voidFn as generateHydrationScript, voidFn as getAssets, getDelegatedRoot, getFirstChild, getHydrationKey, getNextElement, getNextMarker, getNextMatch, getNextSibling, voidFn as getRequestEvent, hydrate, insert, installHydrationRuntime, isDev, isHref, isResponseEnvelope, isServer, memo, mergeProps, redirect, ref, registerDelegatedContainer, registerDelegatedRoot, registerElementClaim, reload, render, renderToStream, renderToString, renderToStringAsync, resolveSSRNode, respond, runHydrationEvents, scope, setAttribute, setAttributeNS, setProperty, setStyleProperty, spread, ssr, ssrAttribute, ssrClassList, ssrElement, ssrHydrationKey, ssrStyle, style, template, unregisterDelegatedContainer, unregisterDelegatedRoot, voidFn as useAssets };