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

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 (43) hide show
  1. package/dist/dev.cjs +3 -1
  2. package/dist/dev.js +3 -2
  3. package/dist/server.cjs +64 -84
  4. package/dist/server.js +65 -86
  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 +55 -50
  12. package/frames/dist/server.js +55 -50
  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 +28 -2
  19. package/server-functions/dist/client.js +25 -3
  20. package/server-functions/dist/server.cjs +194 -5
  21. package/server-functions/dist/server.js +187 -6
  22. package/types/client.d.ts +3 -3
  23. package/types/frames/client.d.ts +1 -0
  24. package/types/frames/serializer.d.ts +7 -1
  25. package/types/frames/server.d.ts +28 -0
  26. package/types/jsx.d.ts +1 -1
  27. package/types/response.d.ts +10 -0
  28. package/types/serializer.d.ts +7 -1
  29. package/types/server-functions/client.d.ts +4 -0
  30. package/types/server-functions/flash.d.ts +38 -0
  31. package/types/server-functions/server.d.ts +109 -6
  32. package/types/server-functions/shared.d.ts +48 -0
  33. package/types-cjs/client.d.cts +3 -3
  34. package/types-cjs/frames/client.d.cts +1 -0
  35. package/types-cjs/frames/serializer.d.cts +7 -1
  36. package/types-cjs/frames/server.d.cts +28 -0
  37. package/types-cjs/jsx.d.cts +1 -1
  38. package/types-cjs/response.d.cts +10 -0
  39. package/types-cjs/serializer.d.cts +7 -1
  40. package/types-cjs/server-functions/client.d.cts +4 -0
  41. package/types-cjs/server-functions/flash.d.cts +38 -0
  42. package/types-cjs/server-functions/server.d.cts +109 -6
  43. package/types-cjs/server-functions/shared.d.cts +48 -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({
@@ -198,7 +199,24 @@ function createAssetTracking() {
198
199
  }
199
200
  };
200
201
  }
201
- function applyAssetTracking(context, tracking, manifest) {
202
+ function warnUnresolvedModuleAssets(moduleUrl, warned) {
203
+ if (warned.has(moduleUrl)) return;
204
+ warned.add(moduleUrl);
205
+ console.error(`Asset manifest returned no client assets for module "${moduleUrl}". ` + "If this module is a server-rendered lazy() component, its entry will be missing from " + "the serialized hydration asset map, the client will be unable to preload it, and " + "hydration will fail with 'lazy() module \"…\" was not preloaded before hydration'. " + "This means the integration's asset resolver (dev manifest bridge or build client " + "manifest) failed to answer for this module — check the integration's server logs, " + "restart the dev server, or verify the module is included in the client build.");
206
+ }
207
+ function guardResolvedAssets(moduleUrl, result, warned) {
208
+ if (result && typeof result.then === "function") {
209
+ return result.then(assets => {
210
+ if (!assets || !assets.js || !assets.js.length) warnUnresolvedModuleAssets(moduleUrl, warned);
211
+ return assets;
212
+ });
213
+ }
214
+ if (!result || !result.js || !result.js.length) warnUnresolvedModuleAssets(moduleUrl, warned);
215
+ return result;
216
+ }
217
+ function applyAssetTracking(context, tracking, manifest, noScripts) {
218
+ const warned = new Set();
219
+ const guard = noScripts ? resolve => resolve : resolve => moduleUrl => guardResolvedAssets(moduleUrl, resolve(moduleUrl), warned);
202
220
  Object.defineProperty(context, "_currentBoundaryId", {
203
221
  get() {
204
222
  return tracking.currentBoundaryId;
@@ -212,20 +230,20 @@ function applyAssetTracking(context, tracking, manifest) {
212
230
  context.registerModule = tracking.registerModule;
213
231
  context.getBoundaryModules = tracking.getBoundaryModules;
214
232
  if (typeof manifest === "function") {
215
- context.resolveAssets = manifest;
233
+ context.resolveAssets = guard(manifest);
216
234
  } else if (manifest && typeof manifest.resolve === "function") {
217
- context.resolveAssets = key => manifest.resolve(key);
235
+ context.resolveAssets = guard(key => manifest.resolve(key));
218
236
  if (typeof manifest.resolveSync === "function") {
219
237
  context.resolveAssetsSync = key => manifest.resolveSync(key);
220
238
  }
221
239
  } else if (manifest) {
222
240
  const resolve = moduleUrl => resolveAssets(moduleUrl, manifest);
223
- context.resolveAssets = resolve;
241
+ context.resolveAssets = guard(resolve);
224
242
  context.resolveAssetsSync = resolve;
225
243
  }
226
244
  }
227
245
  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])}`;
246
+ 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
247
  function renderToString(code, options = {}) {
230
248
  const {
231
249
  renderId = "",
@@ -276,7 +294,7 @@ function renderToString(code, options = {}) {
276
294
  tracking.emittedAssets.add(value);
277
295
  }
278
296
  };
279
- applyAssetTracking(solidJs.sharedConfig.context, tracking, manifest);
297
+ applyAssetTracking(solidJs.sharedConfig.context, tracking, manifest, noScripts);
280
298
  registerEntryAssets(manifest);
281
299
  let html = solidJs.createRoot(d => {
282
300
  setTimeout(d);
@@ -287,11 +305,8 @@ function renderToString(code, options = {}) {
287
305
  serializeFragmentAssets("", tracking.boundaryModules, solidJs.sharedConfig.context);
288
306
  solidJs.sharedConfig.context.noHydrate = true;
289
307
  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;
308
+ const assetsHtml = resolveAssetsHtml(solidJs.sharedConfig.context.assets);
309
+ return assembleDocument(html, assetsHtml, tracking.emittedAssets, tracking.inlineStyles, scripts.length ? scripts : "", nonce);
295
310
  }
296
311
  function renderToStream(code, options = {}) {
297
312
  let {
@@ -364,11 +379,7 @@ function renderToStream(code, options = {}) {
364
379
  }
365
380
  },
366
381
  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);
382
+ buffer.write(assembleDocument(shellHtml, meta.assets, meta.preloads, meta.inlineStyles, meta.tasks.length ? meta.tasks : "", nonce));
372
383
  },
373
384
  ...options.sink
374
385
  };
@@ -571,7 +582,7 @@ function renderToStream(code, options = {}) {
571
582
  });
572
583
  }
573
584
  };
574
- applyAssetTracking(context, tracking, manifest);
585
+ applyAssetTracking(context, tracking, manifest, noScripts);
575
586
  registerEntryAssets(manifest);
576
587
  let html = solidJs.createRoot(d => {
577
588
  dispose = d;
@@ -1113,28 +1124,36 @@ function resolveAssetsHtml(assets) {
1113
1124
  for (let i = 0, len = assets.length; i < len; i++) out += assets[i]();
1114
1125
  return out;
1115
1126
  }
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}">`;
1127
+ function assembleDocument(html, assetsHtml, emittedAssets, inlineStyles, scripts, nonce) {
1128
+ const scriptTag = scripts ? `<script${nonce ? ` nonce="${nonce}"` : ""}>${scripts}</script>` : "";
1129
+ if (!assetsHtml && !(emittedAssets && emittedAssets.size) && !(inlineStyles && inlineStyles.size)) {
1130
+ if (!scriptTag) return html;
1131
+ const xs = html.indexOf("<!--xs-->");
1132
+ return xs === -1 ? html + scriptTag : html.slice(0, xs) + scriptTag + html.slice(xs);
1133
+ }
1134
+ const headIdx = html.indexOf("</head>");
1135
+ if (headIdx === -1) {
1136
+ if (!scriptTag) return html;
1137
+ const xs = html.indexOf("<!--xs-->");
1138
+ return xs === -1 ? html + scriptTag : html.slice(0, xs) + scriptTag + html.slice(xs);
1139
+ }
1140
+ let head = assetsHtml || "";
1141
+ if (emittedAssets && emittedAssets.size) {
1142
+ for (const url of emittedAssets) {
1143
+ head += url.endsWith(".css") ? `<link rel="stylesheet" href="${url}">` : `<link rel="modulepreload" href="${url}">`;
1144
+ }
1145
+ }
1146
+ if (inlineStyles && inlineStyles.size) {
1147
+ for (const entry of inlineStyles.values()) {
1148
+ if (entry.emitted) continue;
1149
+ entry.emitted = true;
1150
+ head += renderInlineStyle(entry, nonce);
1133
1151
  }
1134
1152
  }
1135
- const index = html.indexOf("</head>");
1136
- if (index === -1) return html;
1137
- return html.slice(0, index) + links + html.slice(index);
1153
+ if (!scriptTag) return html.slice(0, headIdx) + head + html.slice(headIdx);
1154
+ const xsIdx = html.indexOf("<!--xs-->");
1155
+ if (xsIdx === -1) return html.slice(0, headIdx) + head + html.slice(headIdx) + scriptTag;
1156
+ 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
1157
  }
1139
1158
  function serializeFragmentAssets(key, boundaryModules, context) {
1140
1159
  const map = boundaryModules.get(key);
@@ -1186,26 +1205,6 @@ function renderInlineStyle(entry, nonce) {
1186
1205
  }
1187
1206
  return `<style${nonce ? ` nonce="${nonce}"` : ""} data-asset="${escape(entry.id, true)}"${attrs}>${escapeStyleContent(entry.content)}</style>`;
1188
1207
  }
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
1208
  function waitForFragments(registry, key) {
1210
1209
  for (const k of [...registry.keys()].reverse()) {
1211
1210
  if (key.startsWith(k)) return k;
@@ -1361,13 +1360,14 @@ const HREF = Symbol.for("solid.Href");
1361
1360
  function isHref(value) {
1362
1361
  return !!(value && (typeof value === "object" || typeof value === "function") && value[HREF]);
1363
1362
  }
1363
+ const REVALIDATE_HEADER = "X-Revalidate";
1364
1364
  function initWithRevalidate(init) {
1365
1365
  const {
1366
1366
  revalidate,
1367
1367
  ...responseInit
1368
1368
  } = init;
1369
1369
  const headers = new Headers(responseInit.headers);
1370
- revalidate !== undefined && headers.set("X-Revalidate", revalidate.toString());
1370
+ revalidate !== undefined && headers.set(REVALIDATE_HEADER, revalidate.toString());
1371
1371
  return {
1372
1372
  responseInit,
1373
1373
  headers
@@ -1417,33 +1417,12 @@ function respond(value, init = {}) {
1417
1417
  const isServer = true;
1418
1418
  const isDev = false;
1419
1419
  function dynamic(source) {
1420
- const o = solidJs.getOwner();
1421
- if (o?.id != null) solidJs.getNextChildId(o);
1420
+ const cached = solidJs.createMemo(source, {
1421
+ serialize: false
1422
+ });
1422
1423
  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
1424
  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
- }
1425
+ const c = cached();
1447
1426
  if (c) {
1448
1427
  if (typeof c === "function") return c(props);
1449
1428
  if (typeof c === "string") {
@@ -1536,6 +1515,7 @@ exports.HydrationScript = HydrationScript;
1536
1515
  exports.MathMLElements = MathMLElements;
1537
1516
  exports.Namespaces = Namespaces;
1538
1517
  exports.Portal = Portal;
1518
+ exports.REVALIDATE_HEADER = REVALIDATE_HEADER;
1539
1519
  exports.RawTextElements = RawTextElements;
1540
1520
  exports.RequestContext = RequestContext;
1541
1521
  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({
@@ -197,7 +198,24 @@ function createAssetTracking() {
197
198
  }
198
199
  };
199
200
  }
200
- function applyAssetTracking(context, tracking, manifest) {
201
+ function warnUnresolvedModuleAssets(moduleUrl, warned) {
202
+ if (warned.has(moduleUrl)) return;
203
+ warned.add(moduleUrl);
204
+ console.error(`Asset manifest returned no client assets for module "${moduleUrl}". ` + "If this module is a server-rendered lazy() component, its entry will be missing from " + "the serialized hydration asset map, the client will be unable to preload it, and " + "hydration will fail with 'lazy() module \"…\" was not preloaded before hydration'. " + "This means the integration's asset resolver (dev manifest bridge or build client " + "manifest) failed to answer for this module — check the integration's server logs, " + "restart the dev server, or verify the module is included in the client build.");
205
+ }
206
+ function guardResolvedAssets(moduleUrl, result, warned) {
207
+ if (result && typeof result.then === "function") {
208
+ return result.then(assets => {
209
+ if (!assets || !assets.js || !assets.js.length) warnUnresolvedModuleAssets(moduleUrl, warned);
210
+ return assets;
211
+ });
212
+ }
213
+ if (!result || !result.js || !result.js.length) warnUnresolvedModuleAssets(moduleUrl, warned);
214
+ return result;
215
+ }
216
+ function applyAssetTracking(context, tracking, manifest, noScripts) {
217
+ const warned = new Set();
218
+ const guard = noScripts ? resolve => resolve : resolve => moduleUrl => guardResolvedAssets(moduleUrl, resolve(moduleUrl), warned);
201
219
  Object.defineProperty(context, "_currentBoundaryId", {
202
220
  get() {
203
221
  return tracking.currentBoundaryId;
@@ -211,20 +229,20 @@ function applyAssetTracking(context, tracking, manifest) {
211
229
  context.registerModule = tracking.registerModule;
212
230
  context.getBoundaryModules = tracking.getBoundaryModules;
213
231
  if (typeof manifest === "function") {
214
- context.resolveAssets = manifest;
232
+ context.resolveAssets = guard(manifest);
215
233
  } else if (manifest && typeof manifest.resolve === "function") {
216
- context.resolveAssets = key => manifest.resolve(key);
234
+ context.resolveAssets = guard(key => manifest.resolve(key));
217
235
  if (typeof manifest.resolveSync === "function") {
218
236
  context.resolveAssetsSync = key => manifest.resolveSync(key);
219
237
  }
220
238
  } else if (manifest) {
221
239
  const resolve = moduleUrl => resolveAssets(moduleUrl, manifest);
222
- context.resolveAssets = resolve;
240
+ context.resolveAssets = guard(resolve);
223
241
  context.resolveAssetsSync = resolve;
224
242
  }
225
243
  }
226
244
  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])}`;
245
+ 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
246
  function renderToString(code, options = {}) {
229
247
  const {
230
248
  renderId = "",
@@ -275,7 +293,7 @@ function renderToString(code, options = {}) {
275
293
  tracking.emittedAssets.add(value);
276
294
  }
277
295
  };
278
- applyAssetTracking(sharedConfig.context, tracking, manifest);
296
+ applyAssetTracking(sharedConfig.context, tracking, manifest, noScripts);
279
297
  registerEntryAssets(manifest);
280
298
  let html = createRoot(d => {
281
299
  setTimeout(d);
@@ -286,11 +304,8 @@ function renderToString(code, options = {}) {
286
304
  serializeFragmentAssets("", tracking.boundaryModules, sharedConfig.context);
287
305
  sharedConfig.context.noHydrate = true;
288
306
  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;
307
+ const assetsHtml = resolveAssetsHtml(sharedConfig.context.assets);
308
+ return assembleDocument(html, assetsHtml, tracking.emittedAssets, tracking.inlineStyles, scripts.length ? scripts : "", nonce);
294
309
  }
295
310
  function renderToStream(code, options = {}) {
296
311
  let {
@@ -363,11 +378,7 @@ function renderToStream(code, options = {}) {
363
378
  }
364
379
  },
365
380
  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);
381
+ buffer.write(assembleDocument(shellHtml, meta.assets, meta.preloads, meta.inlineStyles, meta.tasks.length ? meta.tasks : "", nonce));
371
382
  },
372
383
  ...options.sink
373
384
  };
@@ -570,7 +581,7 @@ function renderToStream(code, options = {}) {
570
581
  });
571
582
  }
572
583
  };
573
- applyAssetTracking(context, tracking, manifest);
584
+ applyAssetTracking(context, tracking, manifest, noScripts);
574
585
  registerEntryAssets(manifest);
575
586
  let html = createRoot(d => {
576
587
  dispose = d;
@@ -1112,28 +1123,36 @@ function resolveAssetsHtml(assets) {
1112
1123
  for (let i = 0, len = assets.length; i < len; i++) out += assets[i]();
1113
1124
  return out;
1114
1125
  }
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}">`;
1126
+ function assembleDocument(html, assetsHtml, emittedAssets, inlineStyles, scripts, nonce) {
1127
+ const scriptTag = scripts ? `<script${nonce ? ` nonce="${nonce}"` : ""}>${scripts}</script>` : "";
1128
+ if (!assetsHtml && !(emittedAssets && emittedAssets.size) && !(inlineStyles && inlineStyles.size)) {
1129
+ if (!scriptTag) return html;
1130
+ const xs = html.indexOf("<!--xs-->");
1131
+ return xs === -1 ? html + scriptTag : html.slice(0, xs) + scriptTag + html.slice(xs);
1132
+ }
1133
+ const headIdx = html.indexOf("</head>");
1134
+ if (headIdx === -1) {
1135
+ if (!scriptTag) return html;
1136
+ const xs = html.indexOf("<!--xs-->");
1137
+ return xs === -1 ? html + scriptTag : html.slice(0, xs) + scriptTag + html.slice(xs);
1138
+ }
1139
+ let head = assetsHtml || "";
1140
+ if (emittedAssets && emittedAssets.size) {
1141
+ for (const url of emittedAssets) {
1142
+ head += url.endsWith(".css") ? `<link rel="stylesheet" href="${url}">` : `<link rel="modulepreload" href="${url}">`;
1143
+ }
1144
+ }
1145
+ if (inlineStyles && inlineStyles.size) {
1146
+ for (const entry of inlineStyles.values()) {
1147
+ if (entry.emitted) continue;
1148
+ entry.emitted = true;
1149
+ head += renderInlineStyle(entry, nonce);
1132
1150
  }
1133
1151
  }
1134
- const index = html.indexOf("</head>");
1135
- if (index === -1) return html;
1136
- return html.slice(0, index) + links + html.slice(index);
1152
+ if (!scriptTag) return html.slice(0, headIdx) + head + html.slice(headIdx);
1153
+ const xsIdx = html.indexOf("<!--xs-->");
1154
+ if (xsIdx === -1) return html.slice(0, headIdx) + head + html.slice(headIdx) + scriptTag;
1155
+ 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
1156
  }
1138
1157
  function serializeFragmentAssets(key, boundaryModules, context) {
1139
1158
  const map = boundaryModules.get(key);
@@ -1185,26 +1204,6 @@ function renderInlineStyle(entry, nonce) {
1185
1204
  }
1186
1205
  return `<style${nonce ? ` nonce="${nonce}"` : ""} data-asset="${escape(entry.id, true)}"${attrs}>${escapeStyleContent(entry.content)}</style>`;
1187
1206
  }
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
1207
  function waitForFragments(registry, key) {
1209
1208
  for (const k of [...registry.keys()].reverse()) {
1210
1209
  if (key.startsWith(k)) return k;
@@ -1360,13 +1359,14 @@ const HREF = Symbol.for("solid.Href");
1360
1359
  function isHref(value) {
1361
1360
  return !!(value && (typeof value === "object" || typeof value === "function") && value[HREF]);
1362
1361
  }
1362
+ const REVALIDATE_HEADER = "X-Revalidate";
1363
1363
  function initWithRevalidate(init) {
1364
1364
  const {
1365
1365
  revalidate,
1366
1366
  ...responseInit
1367
1367
  } = init;
1368
1368
  const headers = new Headers(responseInit.headers);
1369
- revalidate !== undefined && headers.set("X-Revalidate", revalidate.toString());
1369
+ revalidate !== undefined && headers.set(REVALIDATE_HEADER, revalidate.toString());
1370
1370
  return {
1371
1371
  responseInit,
1372
1372
  headers
@@ -1416,33 +1416,12 @@ function respond(value, init = {}) {
1416
1416
  const isServer = true;
1417
1417
  const isDev = false;
1418
1418
  function dynamic(source) {
1419
- const o = getOwner();
1420
- if (o?.id != null) getNextChildId(o);
1419
+ const cached = createMemo(source, {
1420
+ serialize: false
1421
+ });
1421
1422
  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
1423
  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
- }
1424
+ const c = cached();
1446
1425
  if (c) {
1447
1426
  if (typeof c === "function") return c(props);
1448
1427
  if (typeof c === "string") {
@@ -1464,4 +1443,4 @@ function Portal(props) {
1464
1443
  return undefined;
1465
1444
  }
1466
1445
 
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 };
1446
+ 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 };