@solidjs/web 2.0.0-rc.1 → 2.0.0-rc.2
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.
- package/dist/dev.cjs +31 -6
- package/dist/dev.js +30 -7
- package/dist/server.cjs +353 -93
- package/dist/server.js +346 -97
- package/dist/web.cjs +31 -6
- package/dist/web.js +30 -7
- package/frames/dist/client.cjs +93 -7
- package/frames/dist/client.dev.cjs +96 -7
- package/frames/dist/client.dev.js +97 -8
- package/frames/dist/client.js +94 -8
- package/frames/dist/server.cjs +259 -138
- package/frames/dist/server.js +260 -139
- package/package.json +3 -3
- package/serialization/dist/decode.cjs +19 -2
- package/serialization/dist/decode.js +20 -3
- package/serialization/dist/serialization.cjs +19 -2
- package/serialization/dist/serialization.js +20 -3
- package/server-functions/dist/client.cjs +48 -7
- package/server-functions/dist/client.js +48 -8
- package/server-functions/dist/server.cjs +76 -5
- package/server-functions/dist/server.dev.cjs +76 -5
- package/server-functions/dist/server.dev.js +76 -6
- package/server-functions/dist/server.js +76 -6
- package/types/core.d.ts +3 -0
- package/types/frames/frame-client.d.ts +18 -0
- package/types/server-functions/client.d.ts +33 -2
- package/types/server-functions/server.d.ts +67 -2
- package/types/server-mock.d.ts +11 -2
- package/types/server.d.ts +23 -2
- package/types-cjs/core.d.cts +3 -0
- package/types-cjs/frames/frame-client.d.cts +18 -0
- package/types-cjs/server-functions/client.d.cts +33 -2
- package/types-cjs/server-functions/server.d.cts +67 -2
- package/types-cjs/server-mock.d.cts +11 -2
- package/types-cjs/server.d.cts +23 -2
package/dist/server.cjs
CHANGED
|
@@ -72,6 +72,9 @@ const state = globalThis[STATE] || (globalThis[STATE] = {
|
|
|
72
72
|
function setContainerTraceResolver(fn) {
|
|
73
73
|
state.resolveTrace = fn;
|
|
74
74
|
}
|
|
75
|
+
function setContainerTraceStreamMint(fn) {
|
|
76
|
+
state.streamOf = fn;
|
|
77
|
+
}
|
|
75
78
|
const TRACE = Symbol.for("dom-expressions.container-trace");
|
|
76
79
|
function materialize(marker) {
|
|
77
80
|
let value = state.materialized.get(marker.$tr);
|
|
@@ -84,9 +87,10 @@ function materialize(marker) {
|
|
|
84
87
|
}
|
|
85
88
|
function parseTrace(value, ctx) {
|
|
86
89
|
const trace = value[TRACE];
|
|
90
|
+
const sub = trace.subscribe();
|
|
87
91
|
return {
|
|
88
92
|
a: trace.array ? 1 : 0,
|
|
89
|
-
i: ctx.parse(
|
|
93
|
+
i: ctx.parse(state.streamOf ? state.streamOf(sub) : sub)
|
|
90
94
|
};
|
|
91
95
|
}
|
|
92
96
|
const ContainerTracePlugin = {
|
|
@@ -100,9 +104,10 @@ const ContainerTracePlugin = {
|
|
|
100
104
|
},
|
|
101
105
|
async async(value, ctx) {
|
|
102
106
|
const trace = value[TRACE];
|
|
107
|
+
const sub = trace.subscribe();
|
|
103
108
|
return {
|
|
104
109
|
a: trace.array ? 1 : 0,
|
|
105
|
-
i: await ctx.parse(
|
|
110
|
+
i: await ctx.parse(state.streamOf ? state.streamOf(sub) : sub)
|
|
106
111
|
};
|
|
107
112
|
},
|
|
108
113
|
stream: parseTrace
|
|
@@ -120,6 +125,18 @@ const ContainerTracePlugin = {
|
|
|
120
125
|
}
|
|
121
126
|
};
|
|
122
127
|
|
|
128
|
+
setContainerTraceStreamMint(iterable => {
|
|
129
|
+
const stream = seroval.createStream();
|
|
130
|
+
(async () => {
|
|
131
|
+
try {
|
|
132
|
+
for await (const value of iterable) stream.next(value);
|
|
133
|
+
stream.return(undefined);
|
|
134
|
+
} catch (error) {
|
|
135
|
+
stream.throw(error);
|
|
136
|
+
}
|
|
137
|
+
})();
|
|
138
|
+
return stream;
|
|
139
|
+
});
|
|
123
140
|
const DEFAULT_WEB_PLUGINS = Object.freeze([web.AbortSignalPlugin,
|
|
124
141
|
web.CustomEventPlugin, web.DOMExceptionPlugin, web.EventPlugin,
|
|
125
142
|
web.FormDataPlugin, web.HeadersPlugin, web.ReadableStreamPlugin, web.RequestPlugin, web.ResponsePlugin, web.URLSearchParamsPlugin, web.URLPlugin,
|
|
@@ -442,6 +459,7 @@ function registerEntryAssets(manifest) {
|
|
|
442
459
|
const assets = resolveAssets(key, manifest);
|
|
443
460
|
if (assets) {
|
|
444
461
|
for (let i = 0; i < assets.css.length; i++) ctx.registerAsset("style", assets.css[i]);
|
|
462
|
+
for (let i = 1; i < assets.js.length; i++) ctx.registerAsset("module", assets.js[i]);
|
|
445
463
|
}
|
|
446
464
|
return;
|
|
447
465
|
}
|
|
@@ -701,7 +719,7 @@ function emitHeadResource(registry, context, tracking, emitResource, nonce, desc
|
|
|
701
719
|
if (!styles) tracking.boundaryStyles.set(tracking.currentBoundaryId, styles = new Set());
|
|
702
720
|
styles.add(entry);
|
|
703
721
|
}
|
|
704
|
-
const markup = `<link${attrHtml}>`;
|
|
722
|
+
const markup = `<link${attrHtml}${nonceAttr(nonce, "style")}>`;
|
|
705
723
|
if (emitResource) emitResource(markup, entry);else {
|
|
706
724
|
registry.eagerHtml += markup;
|
|
707
725
|
entry.emitted = true;
|
|
@@ -799,7 +817,7 @@ function headGroupSignature(winner) {
|
|
|
799
817
|
}
|
|
800
818
|
return sig;
|
|
801
819
|
}
|
|
802
|
-
function renderShellHead(registry, nonce, isPendingFragment) {
|
|
820
|
+
function renderShellHead(registry, nonce, isPendingFragment, noScripts) {
|
|
803
821
|
commitHeadBoundary(registry, "", isPendingFragment);
|
|
804
822
|
registry.shellFlushed = true;
|
|
805
823
|
const winners = resolveHead(registry.committed);
|
|
@@ -809,8 +827,14 @@ function renderShellHead(registry, nonce, isPendingFragment) {
|
|
|
809
827
|
let metas = "";
|
|
810
828
|
let others = "";
|
|
811
829
|
let scripts = "";
|
|
830
|
+
let title = null;
|
|
812
831
|
for (const [identity, winner] of winners) {
|
|
813
832
|
registry.flushed.set(identity, headGroupSignature(winner));
|
|
833
|
+
if (identity === "title") {
|
|
834
|
+
const children = winner.tags[0].props.children;
|
|
835
|
+
title = children == null ? "" : String(children);
|
|
836
|
+
continue;
|
|
837
|
+
}
|
|
814
838
|
for (let i = 0; i < winner.tags.length; i++) {
|
|
815
839
|
const t = winner.tags[i];
|
|
816
840
|
const markup = renderHeadTagMarkup(t.tag, t.props, identity, nonce);
|
|
@@ -819,10 +843,12 @@ function renderShellHead(registry, nonce, isPendingFragment) {
|
|
|
819
843
|
}
|
|
820
844
|
return {
|
|
821
845
|
prelude,
|
|
822
|
-
html: registry.eagerHtml + links + metas + others + scripts
|
|
846
|
+
html: registry.eagerHtml + links + metas + others + scripts,
|
|
847
|
+
title,
|
|
848
|
+
noScripts
|
|
823
849
|
};
|
|
824
850
|
}
|
|
825
|
-
function flushHeadFragment(registry, boundary) {
|
|
851
|
+
function flushHeadFragment(registry, boundary, nonce) {
|
|
826
852
|
const groups = commitHeadBoundary(registry, boundary);
|
|
827
853
|
if (!groups.length) return null;
|
|
828
854
|
const winners = resolveHead(registry.committed);
|
|
@@ -853,12 +879,87 @@ function flushHeadFragment(registry, boundary) {
|
|
|
853
879
|
if (v == null || v === false) continue;
|
|
854
880
|
attrs[name] = v === true ? "" : String(v);
|
|
855
881
|
}
|
|
882
|
+
if (nonce && !hasNonceProp(t.props)) {
|
|
883
|
+
const destination = nonceDestination(t.tag, t.props);
|
|
884
|
+
const value = destination && nonce[destination];
|
|
885
|
+
if (value) attrs.nonce = String(value);
|
|
886
|
+
}
|
|
856
887
|
const children = t.props.children;
|
|
857
888
|
ops.push(["a", identity, t.tag, attrs, children == null ? null : String(children)]);
|
|
858
889
|
}
|
|
859
890
|
}
|
|
860
891
|
return ops.length ? ops : null;
|
|
861
892
|
}
|
|
893
|
+
function normalizeNonce(nonce) {
|
|
894
|
+
if (nonce == null) return undefined;
|
|
895
|
+
if (typeof nonce === "string") {
|
|
896
|
+
const attr = nonce ? ` nonce="${escape(nonce, true)}"` : "";
|
|
897
|
+
return {
|
|
898
|
+
script: nonce,
|
|
899
|
+
style: nonce,
|
|
900
|
+
scriptAttr: attr,
|
|
901
|
+
styleAttr: attr
|
|
902
|
+
};
|
|
903
|
+
}
|
|
904
|
+
const script = nonce.script;
|
|
905
|
+
const style = nonce.style;
|
|
906
|
+
if (!script && !style) return undefined;
|
|
907
|
+
return {
|
|
908
|
+
script,
|
|
909
|
+
style,
|
|
910
|
+
scriptAttr: typeof script === "string" && script ? ` nonce="${escape(script, true)}"` : "",
|
|
911
|
+
styleAttr: typeof style === "string" && style ? ` nonce="${escape(style, true)}"` : ""
|
|
912
|
+
};
|
|
913
|
+
}
|
|
914
|
+
function destinationNonce(nonce, destination) {
|
|
915
|
+
if (nonce == null) return undefined;
|
|
916
|
+
if (typeof nonce === "string") return nonce || undefined;
|
|
917
|
+
const value = nonce[destination];
|
|
918
|
+
return typeof value === "string" && value ? value : undefined;
|
|
919
|
+
}
|
|
920
|
+
function scriptNonce(nonce) {
|
|
921
|
+
return destinationNonce(nonce, "script");
|
|
922
|
+
}
|
|
923
|
+
function styleNonce(nonce) {
|
|
924
|
+
return destinationNonce(nonce, "style");
|
|
925
|
+
}
|
|
926
|
+
function asciiLowerCase(value) {
|
|
927
|
+
return value.replace(/[A-Z]/g, c => String.fromCharCode(c.charCodeAt(0) + 32));
|
|
928
|
+
}
|
|
929
|
+
function hasNonceProp(props) {
|
|
930
|
+
for (const name in props) if (name.length === 5 && asciiLowerCase(name) === "nonce" && props[name] != null) return true;
|
|
931
|
+
return false;
|
|
932
|
+
}
|
|
933
|
+
function nonceDestination(tag, props) {
|
|
934
|
+
if (tag === "script") return "script";
|
|
935
|
+
if (tag === "style") return "style";
|
|
936
|
+
if (tag !== "link") return null;
|
|
937
|
+
const rel = props.rel;
|
|
938
|
+
if (typeof rel !== "string") return null;
|
|
939
|
+
const rels = asciiLowerCase(rel).split(/[\t\n\f\r ]+/);
|
|
940
|
+
if (rels.includes("stylesheet")) return "style";
|
|
941
|
+
const isModulePreload = rels.includes("modulepreload");
|
|
942
|
+
if (!isModulePreload && !rels.includes("preload")) return null;
|
|
943
|
+
const as = typeof props.as === "string" ? asciiLowerCase(props.as) : "";
|
|
944
|
+
if (as === "style") return "style";
|
|
945
|
+
if (as === "script") return "script";
|
|
946
|
+
if (!isModulePreload) return null;
|
|
947
|
+
switch (as) {
|
|
948
|
+
case "fetch":
|
|
949
|
+
case "font":
|
|
950
|
+
case "image":
|
|
951
|
+
case "json":
|
|
952
|
+
case "text":
|
|
953
|
+
case "track":
|
|
954
|
+
return null;
|
|
955
|
+
default:
|
|
956
|
+
return "script";
|
|
957
|
+
}
|
|
958
|
+
}
|
|
959
|
+
function nonceAttr(nonce, destination) {
|
|
960
|
+
if (!nonce || !destination) return "";
|
|
961
|
+
return destination === "script" ? nonce.scriptAttr : nonce.styleAttr;
|
|
962
|
+
}
|
|
862
963
|
function renderHeadAttrHtml(props) {
|
|
863
964
|
let attrs = "";
|
|
864
965
|
for (const name in props) {
|
|
@@ -887,7 +988,7 @@ function headAttrRecord(props, skipRelHref) {
|
|
|
887
988
|
function renderHeadTagMarkup(tag, props, identity, nonce) {
|
|
888
989
|
let attrs = renderHeadAttrHtml(props);
|
|
889
990
|
if (identity != null) attrs += ` data-dh="${escape(identity, true)}"`;
|
|
890
|
-
if (nonce && (
|
|
991
|
+
if (nonce && !hasNonceProp(props)) attrs += nonceAttr(nonce, nonceDestination(tag, props));
|
|
891
992
|
if (tag === "meta" || tag === "link" || tag === "base") return `<${tag}${attrs}>`;
|
|
892
993
|
let body = props.children == null ? "" : String(props.children);
|
|
893
994
|
if (tag === "script") body = body.replace(/<\/(script)/gi, "<\\/$1");else if (tag === "style") body = escapeStyleContent(body);else body = escape(body);
|
|
@@ -902,15 +1003,15 @@ function useHead(tags) {
|
|
|
902
1003
|
}
|
|
903
1004
|
const VOID_ELEMENTS = /^(?:area|base|br|col|embed|hr|img|input|keygen|link|menuitem|meta|param|source|track|wbr)$/i;
|
|
904
1005
|
const REPLACE_SCRIPT = `function $df(e){return _$HY.f?_$HY.f(e):$dfr(e)}function $dfr(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,o.replaceWith(n.content),n.remove(),(_$HY.v=_$HY.v||{})[e]=1,_$HY.fe(e,t),_$HY.hp&&_$HY.hp[e]&&($dh(_$HY.hp[e]),delete _$HY.hp[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])}`;
|
|
905
|
-
const HEAD_SCRIPT = `function $dha(o,i,e,n){for(i=0;i<o.length;i++)e=o[i],"t"==e[0]?((n=document.querySelector("title"))||(n=document.createElement("title"),document.head.appendChild(n)),n.textContent=e[1],n.setAttribute("data-dh","title")):"r"==e[0]?$dhr(e[1]):(n=document.createElement(e[2]),Object.keys(e[3]).forEach(function(a){n.setAttribute(a,e[3][a])}),null!=e[4]&&(n.textContent=e[4]),n.setAttribute("data-dh",e[1]),document.head.appendChild(n))}function $dhr(v,l,i){for(l=document.head.querySelectorAll("[data-dh]"),i=0;i<l.length;i++)l[i].getAttribute("data-dh")==v&&l[i].remove()}function $dh(o){_$HY.h?_$HY.h(o):$dha(o)}`;
|
|
1006
|
+
const HEAD_SCRIPT = `function $dha(o,i,e,n){for(i=0;i<o.length;i++)e=o[i],"t"==e[0]?((n=document.querySelector("title"))?n.hasAttribute("data-dh")||n.setAttribute("data-dhf",n.textContent):(n=document.createElement("title"),document.head.appendChild(n)),n.textContent=e[1],n.setAttribute("data-dh","title")):"r"==e[0]?$dhr(e[1]):(n=document.createElement(e[2]),Object.keys(e[3]).forEach(function(a){n.setAttribute(a,e[3][a])}),null!=e[4]&&(n.textContent=e[4]),n.setAttribute("data-dh",e[1]),document.head.appendChild(n))}function $dhr(v,l,i){for(l=document.head.querySelectorAll("[data-dh]"),i=0;i<l.length;i++)l[i].getAttribute("data-dh")==v&&l[i].remove()}function $dh(o){_$HY.h?_$HY.h(o):$dha(o)}`;
|
|
906
1007
|
function renderToString(code, options = {}) {
|
|
907
1008
|
const {
|
|
908
1009
|
renderId = "",
|
|
909
|
-
nonce,
|
|
910
1010
|
noScripts,
|
|
911
1011
|
manifest,
|
|
912
1012
|
onHead
|
|
913
1013
|
} = options;
|
|
1014
|
+
const nonce = normalizeNonce(options.nonce);
|
|
914
1015
|
let scripts = "";
|
|
915
1016
|
const serializer = createHydrationSerializer({
|
|
916
1017
|
scopeId: renderId,
|
|
@@ -927,7 +1028,7 @@ function renderToString(code, options = {}) {
|
|
|
927
1028
|
const tracking = createAssetTracking();
|
|
928
1029
|
const headRegistry = createHeadRegistry();
|
|
929
1030
|
solidJs.sharedConfig.context = {
|
|
930
|
-
nonce,
|
|
1031
|
+
nonce: options.nonce,
|
|
931
1032
|
escape: escape,
|
|
932
1033
|
resolve: resolveSSRNode,
|
|
933
1034
|
ssr: ssr,
|
|
@@ -968,12 +1069,11 @@ function renderToString(code, options = {}) {
|
|
|
968
1069
|
serializeFragmentAssets("", tracking.boundaryModules, solidJs.sharedConfig.context, renderId);
|
|
969
1070
|
solidJs.sharedConfig.context.noHydrate = true;
|
|
970
1071
|
serializer.close();
|
|
971
|
-
const head = renderShellHead(headRegistry, nonce, null);
|
|
1072
|
+
const head = renderShellHead(headRegistry, nonce, null, noScripts);
|
|
972
1073
|
return assembleDocument(resolveSSRSelectValues(html), tracking.emittedAssets, tracking.inlineStyles, scripts.length ? scripts : "", nonce, head, onHead);
|
|
973
1074
|
}
|
|
974
1075
|
function renderToStream(code, options = {}) {
|
|
975
1076
|
let {
|
|
976
|
-
nonce,
|
|
977
1077
|
onCompleteShell,
|
|
978
1078
|
onCompleteAll,
|
|
979
1079
|
renderId = "",
|
|
@@ -981,6 +1081,7 @@ function renderToStream(code, options = {}) {
|
|
|
981
1081
|
manifest,
|
|
982
1082
|
onHead
|
|
983
1083
|
} = options;
|
|
1084
|
+
const nonce = normalizeNonce(options.nonce);
|
|
984
1085
|
let dispose;
|
|
985
1086
|
let dead = false;
|
|
986
1087
|
const abandon = () => {
|
|
@@ -1005,6 +1106,32 @@ function renderToStream(code, options = {}) {
|
|
|
1005
1106
|
} catch (_) {}
|
|
1006
1107
|
abandon();
|
|
1007
1108
|
};
|
|
1109
|
+
const coalesceWrites = (writeRaw, endRaw) => {
|
|
1110
|
+
let buf = "";
|
|
1111
|
+
let scheduled = false;
|
|
1112
|
+
const flush = () => {
|
|
1113
|
+
scheduled = false;
|
|
1114
|
+
if (!buf) return;
|
|
1115
|
+
const out = buf;
|
|
1116
|
+
buf = "";
|
|
1117
|
+
writeRaw(out);
|
|
1118
|
+
};
|
|
1119
|
+
return {
|
|
1120
|
+
write(payload) {
|
|
1121
|
+
buf += payload;
|
|
1122
|
+
if (buf.length >= 16384) return flush();
|
|
1123
|
+
if (!scheduled) {
|
|
1124
|
+
scheduled = true;
|
|
1125
|
+
deferFlush(flush);
|
|
1126
|
+
}
|
|
1127
|
+
},
|
|
1128
|
+
flush,
|
|
1129
|
+
end() {
|
|
1130
|
+
flush();
|
|
1131
|
+
endRaw();
|
|
1132
|
+
}
|
|
1133
|
+
};
|
|
1134
|
+
};
|
|
1008
1135
|
const guardSink = w => ({
|
|
1009
1136
|
write(payload) {
|
|
1010
1137
|
if (dead) return;
|
|
@@ -1024,6 +1151,23 @@ function renderToStream(code, options = {}) {
|
|
|
1024
1151
|
}
|
|
1025
1152
|
});
|
|
1026
1153
|
const blockingPromises = new Set();
|
|
1154
|
+
const canBatchStubs = !options.serializer && !options.sink;
|
|
1155
|
+
let stubBatch = null;
|
|
1156
|
+
const STUB_BATCH_KEY = "$B";
|
|
1157
|
+
const flushStubBatch = () => {
|
|
1158
|
+
if (!stubBatch) return;
|
|
1159
|
+
const batch = stubBatch;
|
|
1160
|
+
stubBatch = null;
|
|
1161
|
+
if (batch.size === 1) {
|
|
1162
|
+
const [id, p] = batch.entries().next().value;
|
|
1163
|
+
serializer.write(id, p);
|
|
1164
|
+
return;
|
|
1165
|
+
}
|
|
1166
|
+
const obj = {};
|
|
1167
|
+
for (const [id, p] of batch) obj[id] = p;
|
|
1168
|
+
serializer.write(STUB_BATCH_KEY, obj);
|
|
1169
|
+
pushTask(`(b=>{for(var k in b)_$HY.r[k]=b[k];delete _$HY.r["${STUB_BATCH_KEY}"]})(_$HY.r["${STUB_BATCH_KEY}"])`);
|
|
1170
|
+
};
|
|
1027
1171
|
let headerEmitted = false;
|
|
1028
1172
|
const pushTask = task => {
|
|
1029
1173
|
if (noScripts) return;
|
|
@@ -1060,10 +1204,11 @@ function renderToStream(code, options = {}) {
|
|
|
1060
1204
|
buffer.write(renderInlineStyle(styles.inline[i], nonce));
|
|
1061
1205
|
}
|
|
1062
1206
|
if (styles.links.length) {
|
|
1207
|
+
const styleAttr = nonceAttr(nonce, "style");
|
|
1063
1208
|
emitTask(`$dfs("${key}",${styles.links.length},${deferActivation ? 1 : 0})`);
|
|
1064
1209
|
writeTasks();
|
|
1065
1210
|
for (const entry of styles.links) {
|
|
1066
|
-
buffer.write(typeof entry === "string" ? `<link rel="stylesheet" href="${entry}" onload="$dfc('${key}')" onerror="$dfc('${key}')">` : `<link${entry.attrHtml} onload="$dfc('${key}')" onerror="$dfc('${key}')">`);
|
|
1211
|
+
buffer.write(typeof entry === "string" ? `<link rel="stylesheet" href="${entry}"${styleAttr} onload="$dfc('${key}')" onerror="$dfc('${key}')">` : `<link${entry.attrHtml}${styleAttr} onload="$dfc('${key}')" onerror="$dfc('${key}')">`);
|
|
1067
1212
|
}
|
|
1068
1213
|
buffer.write(`<template id="${key}">${value}</template>`);
|
|
1069
1214
|
} else {
|
|
@@ -1078,7 +1223,7 @@ function renderToStream(code, options = {}) {
|
|
|
1078
1223
|
},
|
|
1079
1224
|
asset(type, value) {
|
|
1080
1225
|
if (type === "module") {
|
|
1081
|
-
buffer.write(`<link rel="modulepreload" href="${value}">`);
|
|
1226
|
+
buffer.write(`<link rel="modulepreload" href="${value}"${nonceAttr(nonce, "script")}>`);
|
|
1082
1227
|
} else if (type === "inline-style") {
|
|
1083
1228
|
buffer.write(renderInlineStyle(value, nonce));
|
|
1084
1229
|
} else if (type === "head-tag") {
|
|
@@ -1113,6 +1258,7 @@ function renderToStream(code, options = {}) {
|
|
|
1113
1258
|
context.live.end = null;
|
|
1114
1259
|
end();
|
|
1115
1260
|
}
|
|
1261
|
+
flushStubBatch();
|
|
1116
1262
|
serializer.flush();
|
|
1117
1263
|
}));
|
|
1118
1264
|
}
|
|
@@ -1120,7 +1266,7 @@ function renderToStream(code, options = {}) {
|
|
|
1120
1266
|
const registry = new Map();
|
|
1121
1267
|
const writeTasks = () => {
|
|
1122
1268
|
if (tasks.length && !completed && firstFlushed) {
|
|
1123
|
-
buffer.write(`<script${nonce
|
|
1269
|
+
buffer.write(`<script${nonceAttr(nonce, "script")}>${tasks}</script>`);
|
|
1124
1270
|
tasks = "";
|
|
1125
1271
|
}
|
|
1126
1272
|
timer = null;
|
|
@@ -1174,7 +1320,7 @@ function renderToStream(code, options = {}) {
|
|
|
1174
1320
|
};
|
|
1175
1321
|
solidJs.sharedConfig.context = context = {
|
|
1176
1322
|
async: true,
|
|
1177
|
-
nonce,
|
|
1323
|
+
nonce: options.nonce,
|
|
1178
1324
|
live: {},
|
|
1179
1325
|
registerHeadTags(tags) {
|
|
1180
1326
|
registerHeadTags(headRegistry, context, tracking,
|
|
@@ -1232,10 +1378,18 @@ function renderToStream(code, options = {}) {
|
|
|
1232
1378
|
},
|
|
1233
1379
|
serialize(id, p, deferStream) {
|
|
1234
1380
|
if (solidJs.sharedConfig.context.noHydrate) return;
|
|
1235
|
-
if (!firstFlushed &&
|
|
1236
|
-
|
|
1237
|
-
|
|
1238
|
-
|
|
1381
|
+
if (!firstFlushed && p && typeof p === "object" && "then" in p) {
|
|
1382
|
+
if (deferStream) {
|
|
1383
|
+
blockingPromises.add(p);
|
|
1384
|
+
p.then(d => serializer.write(id, d)).catch(e => serializer.write(id, e));
|
|
1385
|
+
return;
|
|
1386
|
+
}
|
|
1387
|
+
if (canBatchStubs && !shellCompleted) {
|
|
1388
|
+
(stubBatch ||= new Map()).set(id, p);
|
|
1389
|
+
return;
|
|
1390
|
+
}
|
|
1391
|
+
}
|
|
1392
|
+
serializer.write(id, p);
|
|
1239
1393
|
},
|
|
1240
1394
|
escape: escape,
|
|
1241
1395
|
resolve: resolveSSRNode,
|
|
@@ -1269,7 +1423,7 @@ function renderToStream(code, options = {}) {
|
|
|
1269
1423
|
queue(flushEnd);
|
|
1270
1424
|
}))
|
|
1271
1425
|
});
|
|
1272
|
-
serializer.write(key + "_fr", p);
|
|
1426
|
+
if (canBatchStubs && !shellCompleted) (stubBatch ||= new Map()).set(key + "_fr", p);else serializer.write(key + "_fr", p);
|
|
1273
1427
|
}
|
|
1274
1428
|
return (value, error) => {
|
|
1275
1429
|
if (registry.has(key)) {
|
|
@@ -1300,7 +1454,7 @@ function renderToStream(code, options = {}) {
|
|
|
1300
1454
|
} else {
|
|
1301
1455
|
serializeFragmentAssets(key, tracking.boundaryModules, context);
|
|
1302
1456
|
const styles = collectStreamStyles(key, tracking, headStyles);
|
|
1303
|
-
const headOps = error ? null : flushHeadFragment(headRegistry, key);
|
|
1457
|
+
const headOps = error ? null : flushHeadFragment(headRegistry, key, nonce);
|
|
1304
1458
|
if (headOps) emitHeadOps(key, headOps);
|
|
1305
1459
|
sink.fragment(key, resolveSSRSelectValues(value !== undefined ? value : " "), {
|
|
1306
1460
|
styles,
|
|
@@ -1386,14 +1540,17 @@ function renderToStream(code, options = {}) {
|
|
|
1386
1540
|
function doShell() {
|
|
1387
1541
|
if (shellCompleted) return;
|
|
1388
1542
|
solidJs.sharedConfig.context = context;
|
|
1543
|
+
const blockersBefore = blockingPromises.size;
|
|
1389
1544
|
if (!resolveRootHoles()) return;
|
|
1545
|
+
if (blockingPromises.size !== blockersBefore) return;
|
|
1390
1546
|
if (!headShellReady(headRegistry, p => blockingPromises.add(p))) return;
|
|
1391
1547
|
headStyles = new Set();
|
|
1392
1548
|
for (const url of tracking.emittedAssets) {
|
|
1393
1549
|
if (isCssUrl(url)) headStyles.add(url);
|
|
1394
1550
|
}
|
|
1395
1551
|
serializeRootAssets();
|
|
1396
|
-
|
|
1552
|
+
flushStubBatch();
|
|
1553
|
+
const head = renderShellHead(headRegistry, nonce, k => registry.has(k), noScripts);
|
|
1397
1554
|
sink.shell(resolveSSRSelectValues(html), {
|
|
1398
1555
|
preloads: tracking.emittedAssets,
|
|
1399
1556
|
inlineStyles: tracking.inlineStyles,
|
|
@@ -1414,6 +1571,7 @@ function renderToStream(code, options = {}) {
|
|
|
1414
1571
|
let drainTurn = 0;
|
|
1415
1572
|
const scheduleFlush = fn => {
|
|
1416
1573
|
const attempt = () => {
|
|
1574
|
+
flushStubBatch();
|
|
1417
1575
|
if (registry.size !== lastRegistrySize || drainTurn++ < MIN_DRAIN_TURNS) {
|
|
1418
1576
|
if (registry.size !== lastRegistrySize) drainTurn = 0;
|
|
1419
1577
|
lastRegistrySize = registry.size;
|
|
@@ -1461,22 +1619,18 @@ function renderToStream(code, options = {}) {
|
|
|
1461
1619
|
}
|
|
1462
1620
|
};
|
|
1463
1621
|
writer.closed && writer.closed.catch(failed);
|
|
1464
|
-
writable = {
|
|
1465
|
-
|
|
1466
|
-
|
|
1467
|
-
|
|
1468
|
-
|
|
1469
|
-
|
|
1470
|
-
|
|
1471
|
-
|
|
1472
|
-
}
|
|
1473
|
-
};
|
|
1474
|
-
buffer = {
|
|
1475
|
-
write(payload) {
|
|
1476
|
-
pendingWrites = pendingWrites.then(() => writer.write(encoder.encode(payload))).catch(failed);
|
|
1477
|
-
}
|
|
1478
|
-
};
|
|
1622
|
+
buffer = writable = coalesceWrites(payload => {
|
|
1623
|
+
pendingWrites = pendingWrites.then(() => writer.write(encoder.encode(payload))).catch(failed);
|
|
1624
|
+
}, () => {
|
|
1625
|
+
pendingWrites.then(() => {
|
|
1626
|
+
ended = true;
|
|
1627
|
+
writer.releaseLock();
|
|
1628
|
+
w.close().catch(() => {});
|
|
1629
|
+
resolve();
|
|
1630
|
+
});
|
|
1631
|
+
});
|
|
1479
1632
|
buffer.write(tmp);
|
|
1633
|
+
buffer.flush();
|
|
1480
1634
|
firstFlushed = true;
|
|
1481
1635
|
if (completed) {
|
|
1482
1636
|
dispose();
|
|
@@ -1506,7 +1660,8 @@ function renderToStream(code, options = {}) {
|
|
|
1506
1660
|
allSettled(blockingPromises).then(() => {
|
|
1507
1661
|
scheduleFlush(() => {
|
|
1508
1662
|
try {
|
|
1509
|
-
|
|
1663
|
+
const blockersBefore = blockingPromises.size;
|
|
1664
|
+
if (!resolveRootHoles() || blockingPromises.size !== blockersBefore || !headShellReady(headRegistry, p => blockingPromises.add(p))) return flush();
|
|
1510
1665
|
} catch (err) {
|
|
1511
1666
|
failRender(err);
|
|
1512
1667
|
return resolve(tmp);
|
|
@@ -1535,8 +1690,10 @@ function renderToStream(code, options = {}) {
|
|
|
1535
1690
|
return;
|
|
1536
1691
|
}
|
|
1537
1692
|
if (!shellCompleted) return flush();
|
|
1538
|
-
|
|
1693
|
+
const sink = guardSink(w);
|
|
1694
|
+
buffer = writable = coalesceWrites(sink.write, sink.end);
|
|
1539
1695
|
buffer.write(tmp);
|
|
1696
|
+
buffer.flush();
|
|
1540
1697
|
firstFlushed = true;
|
|
1541
1698
|
if (completed) {
|
|
1542
1699
|
dispose();
|
|
@@ -1563,9 +1720,7 @@ function renderToStream(code, options = {}) {
|
|
|
1563
1720
|
};
|
|
1564
1721
|
}
|
|
1565
1722
|
function HydrationScript(props) {
|
|
1566
|
-
const
|
|
1567
|
-
nonce
|
|
1568
|
-
} = solidJs.sharedConfig.context;
|
|
1723
|
+
const nonce = scriptNonce(solidJs.sharedConfig.context && solidJs.sharedConfig.context.nonce);
|
|
1569
1724
|
return ssr(generateHydrationScript({
|
|
1570
1725
|
nonce,
|
|
1571
1726
|
...props
|
|
@@ -2279,6 +2434,32 @@ function ssrHydrationKey() {
|
|
|
2279
2434
|
const hk = getHydrationKey();
|
|
2280
2435
|
return hk ? ` _hk=${hk}` : "";
|
|
2281
2436
|
}
|
|
2437
|
+
const CLAIM_PROP = /*#__PURE__*/Symbol.for("dom-expressions.claim-prop");
|
|
2438
|
+
const CLAIMS_STREAM = 1;
|
|
2439
|
+
const CLAIMS_DOCUMENT = 2;
|
|
2440
|
+
const CLAIM_UNSAFE = /[^A-Za-z0-9_.!~*'()-]/g;
|
|
2441
|
+
function encodeClaimKey(key) {
|
|
2442
|
+
return String(key).replace(CLAIM_UNSAFE, c => encodeURIComponent(c));
|
|
2443
|
+
}
|
|
2444
|
+
function ssrClaim(map) {
|
|
2445
|
+
const mode = solidJs.sharedConfig.context && solidJs.sharedConfig.context.claims;
|
|
2446
|
+
if (!mode || mode === CLAIMS_DOCUMENT && !(typeof solidJs.inServerComponentScope === "function" && solidJs.inServerComponentScope())) {
|
|
2447
|
+
return "";
|
|
2448
|
+
}
|
|
2449
|
+
let out = "";
|
|
2450
|
+
for (const pos in map) {
|
|
2451
|
+
const value = map[pos];
|
|
2452
|
+
const list = Array.isArray(value) ? value : [value];
|
|
2453
|
+
for (const fn of list) {
|
|
2454
|
+
const prop = typeof fn === "function" && fn[CLAIM_PROP] || undefined;
|
|
2455
|
+
if (prop === undefined) {
|
|
2456
|
+
continue;
|
|
2457
|
+
}
|
|
2458
|
+
out += `${out ? "," : ""}${pos}=${encodeClaimKey(prop)}`;
|
|
2459
|
+
}
|
|
2460
|
+
}
|
|
2461
|
+
return out ? ` _bnd="${out}"` : "";
|
|
2462
|
+
}
|
|
2282
2463
|
function decodeSSREntities(s) {
|
|
2283
2464
|
return s.indexOf("&") < 0 ? s : s.replace(/"/g, '"').replace(/</g, "<").replace(/&/g, "&");
|
|
2284
2465
|
}
|
|
@@ -2311,22 +2492,49 @@ function tagIs(html, i, name) {
|
|
|
2311
2492
|
const c = html.charCodeAt(i + 1 + name.length);
|
|
2312
2493
|
return c === 32 || c === 62 || c === 9 || c === 10 || c === 13;
|
|
2313
2494
|
}
|
|
2495
|
+
let selectValuesActive = false;
|
|
2496
|
+
function ssrSelectValues() {
|
|
2497
|
+
selectValuesActive = true;
|
|
2498
|
+
}
|
|
2314
2499
|
function resolveSSRSelectValues(html) {
|
|
2315
|
-
if (
|
|
2500
|
+
if (!selectValuesActive) return html;
|
|
2501
|
+
let cand = html.indexOf("<select");
|
|
2502
|
+
if (cand < 0) return html;
|
|
2316
2503
|
let out = "";
|
|
2317
2504
|
let idx = 0;
|
|
2318
|
-
|
|
2319
|
-
|
|
2320
|
-
|
|
2321
|
-
|
|
2322
|
-
|
|
2323
|
-
|
|
2324
|
-
|
|
2325
|
-
|
|
2326
|
-
|
|
2327
|
-
|
|
2328
|
-
|
|
2329
|
-
|
|
2505
|
+
while (cand >= 0) {
|
|
2506
|
+
if (!tagIs(html, cand, "select")) {
|
|
2507
|
+
cand = html.indexOf("<select", cand + 7);
|
|
2508
|
+
continue;
|
|
2509
|
+
}
|
|
2510
|
+
const e0 = tagEnd(html, cand);
|
|
2511
|
+
if (e0 < 0) break;
|
|
2512
|
+
const open = html.slice(cand, e0 + 1);
|
|
2513
|
+
const m = SELECT_VALUE_ATTR.exec(open);
|
|
2514
|
+
if (!m) {
|
|
2515
|
+
cand = html.indexOf("<select", e0 + 1);
|
|
2516
|
+
continue;
|
|
2517
|
+
}
|
|
2518
|
+
const bound = decodeSSREntities(m[1]);
|
|
2519
|
+
const sel = {
|
|
2520
|
+
values: /\smultiple(?=[\s>=])/.test(open) ? bound.split(",") : [bound],
|
|
2521
|
+
strip: cand + m.index,
|
|
2522
|
+
stripEnd: cand + m.index + m[0].length,
|
|
2523
|
+
body: e0 + 1,
|
|
2524
|
+
marks: [],
|
|
2525
|
+
defaulted: false
|
|
2526
|
+
};
|
|
2527
|
+
let committed = false;
|
|
2528
|
+
let i = html.indexOf("<", e0 + 1);
|
|
2529
|
+
while (i >= 0) {
|
|
2530
|
+
let e;
|
|
2531
|
+
if (html.charCodeAt(i + 1) === 33) {
|
|
2532
|
+
e = html.charCodeAt(i + 2) === 45 ? html.indexOf("-->", i) : html.indexOf(">", i);
|
|
2533
|
+
if (e < 0) break;
|
|
2534
|
+
if (html.charCodeAt(i + 2) === 45) e += 2;
|
|
2535
|
+
} else {
|
|
2536
|
+
e = tagEnd(html, i);
|
|
2537
|
+
if (e < 0) break;
|
|
2330
2538
|
if (html.startsWith("</select>", i)) {
|
|
2331
2539
|
out += html.slice(idx, sel.strip) + html.slice(sel.stripEnd, sel.body);
|
|
2332
2540
|
let seg = sel.body;
|
|
@@ -2338,7 +2546,8 @@ function resolveSSRSelectValues(html) {
|
|
|
2338
2546
|
}
|
|
2339
2547
|
out += html.slice(seg, i);
|
|
2340
2548
|
idx = i;
|
|
2341
|
-
|
|
2549
|
+
committed = true;
|
|
2550
|
+
break;
|
|
2342
2551
|
} else if (tagIs(html, i, "option")) {
|
|
2343
2552
|
const attrs = html.slice(i + 7, e);
|
|
2344
2553
|
if (/\sselected(?=[\s=]|$)/.test(attrs)) sel.defaulted = true;else {
|
|
@@ -2347,23 +2556,13 @@ function resolveSSRSelectValues(html) {
|
|
|
2347
2556
|
if (sel.values.includes(value)) sel.marks.push(e);
|
|
2348
2557
|
}
|
|
2349
2558
|
}
|
|
2350
|
-
} else if (tagIs(html, i, "select")) {
|
|
2351
|
-
const m = SELECT_VALUE_ATTR.exec(html.slice(i, e + 1));
|
|
2352
|
-
if (m) {
|
|
2353
|
-
const bound = decodeSSREntities(m[1]);
|
|
2354
|
-
sel = {
|
|
2355
|
-
values: /\smultiple(?=[\s>=])/.test(html.slice(i, e + 1)) ? bound.split(",") : [bound],
|
|
2356
|
-
strip: i + m.index,
|
|
2357
|
-
stripEnd: i + m.index + m[0].length,
|
|
2358
|
-
body: e + 1,
|
|
2359
|
-
marks: [],
|
|
2360
|
-
defaulted: false
|
|
2361
|
-
};
|
|
2362
|
-
}
|
|
2363
2559
|
}
|
|
2560
|
+
i = html.indexOf("<", e + 1);
|
|
2364
2561
|
}
|
|
2365
|
-
|
|
2562
|
+
if (!committed) break;
|
|
2563
|
+
cand = html.indexOf("<select", idx);
|
|
2366
2564
|
}
|
|
2565
|
+
if (idx === 0) return html;
|
|
2367
2566
|
return out + html.slice(idx);
|
|
2368
2567
|
}
|
|
2369
2568
|
function escape(s, attr) {
|
|
@@ -2387,22 +2586,20 @@ function escape(s, attr) {
|
|
|
2387
2586
|
return escapeSlow(s, attr, i);
|
|
2388
2587
|
}
|
|
2389
2588
|
const ESCAPE_CONTENT = /[&<]/;
|
|
2390
|
-
const ESCAPE_ATTR = /[&"]/;
|
|
2589
|
+
const ESCAPE_ATTR = /[&"<]/;
|
|
2391
2590
|
function escapeSlow(s, attr, start) {
|
|
2392
|
-
|
|
2393
|
-
const delimCode = attr ? 34 : 60;
|
|
2394
|
-
const escDelim = attr ? """ : "<";
|
|
2591
|
+
if (attr) return escapeAttrSlow(s, start);
|
|
2395
2592
|
const c0 = s.charCodeAt(start);
|
|
2396
|
-
let iDelim = c0 ===
|
|
2593
|
+
let iDelim = c0 === 60 ? start : s.indexOf("<", start);
|
|
2397
2594
|
let iAmp = c0 === 38 ? start : s.indexOf("&", start);
|
|
2398
2595
|
let left = 0,
|
|
2399
2596
|
out = "";
|
|
2400
2597
|
while (iDelim >= 0 && iAmp >= 0) {
|
|
2401
2598
|
if (iDelim < iAmp) {
|
|
2402
2599
|
if (left < iDelim) out += s.substring(left, iDelim);
|
|
2403
|
-
out +=
|
|
2600
|
+
out += "<";
|
|
2404
2601
|
left = iDelim + 1;
|
|
2405
|
-
iDelim = s.indexOf(
|
|
2602
|
+
iDelim = s.indexOf("<", left);
|
|
2406
2603
|
} else {
|
|
2407
2604
|
if (left < iAmp) out += s.substring(left, iAmp);
|
|
2408
2605
|
out += "&";
|
|
@@ -2413,9 +2610,9 @@ function escapeSlow(s, attr, start) {
|
|
|
2413
2610
|
if (iDelim >= 0) {
|
|
2414
2611
|
do {
|
|
2415
2612
|
if (left < iDelim) out += s.substring(left, iDelim);
|
|
2416
|
-
out +=
|
|
2613
|
+
out += "<";
|
|
2417
2614
|
left = iDelim + 1;
|
|
2418
|
-
iDelim = s.indexOf(
|
|
2615
|
+
iDelim = s.indexOf("<", left);
|
|
2419
2616
|
} while (iDelim >= 0);
|
|
2420
2617
|
} else while (iAmp >= 0) {
|
|
2421
2618
|
if (left < iAmp) out += s.substring(left, iAmp);
|
|
@@ -2425,6 +2622,36 @@ function escapeSlow(s, attr, start) {
|
|
|
2425
2622
|
}
|
|
2426
2623
|
return left < s.length ? out + s.substring(left) : out;
|
|
2427
2624
|
}
|
|
2625
|
+
function escapeAttrSlow(s, start) {
|
|
2626
|
+
const c0 = s.charCodeAt(start);
|
|
2627
|
+
let iQuot = c0 === 34 ? start : s.indexOf('"', start);
|
|
2628
|
+
let iAmp = c0 === 38 ? start : s.indexOf("&", start);
|
|
2629
|
+
let iLt = c0 === 60 ? start : s.indexOf("<", start);
|
|
2630
|
+
let left = 0,
|
|
2631
|
+
out = "";
|
|
2632
|
+
for (;;) {
|
|
2633
|
+
let i = -1,
|
|
2634
|
+
ent;
|
|
2635
|
+
if (iQuot >= 0) {
|
|
2636
|
+
i = iQuot;
|
|
2637
|
+
ent = """;
|
|
2638
|
+
}
|
|
2639
|
+
if (iAmp >= 0 && (i < 0 || iAmp < i)) {
|
|
2640
|
+
i = iAmp;
|
|
2641
|
+
ent = "&";
|
|
2642
|
+
}
|
|
2643
|
+
if (iLt >= 0 && (i < 0 || iLt < i)) {
|
|
2644
|
+
i = iLt;
|
|
2645
|
+
ent = "<";
|
|
2646
|
+
}
|
|
2647
|
+
if (i < 0) break;
|
|
2648
|
+
if (left < i) out += s.substring(left, i);
|
|
2649
|
+
out += ent;
|
|
2650
|
+
left = i + 1;
|
|
2651
|
+
if (i === iQuot) iQuot = s.indexOf('"', left);else if (i === iAmp) iAmp = s.indexOf("&", left);else iLt = s.indexOf("<", left);
|
|
2652
|
+
}
|
|
2653
|
+
return left < s.length ? out + s.substring(left) : out;
|
|
2654
|
+
}
|
|
2428
2655
|
function tryJoinPlainSSRArray(nodes) {
|
|
2429
2656
|
if (nodes.length === 0) return undefined;
|
|
2430
2657
|
let out = "";
|
|
@@ -2448,11 +2675,12 @@ function generateHydrationScript({
|
|
|
2448
2675
|
eventNames = ["click", "input"],
|
|
2449
2676
|
nonce
|
|
2450
2677
|
} = {}) {
|
|
2451
|
-
return `<script${nonce ? ` nonce="${nonce}"` : ""}>window._$HY||(e=>{let t=e=>e&&e.hasAttribute&&(e.hasAttribute("_hk")?e:t(e.host&&e.host.nodeType?e.host:e.parentNode));["${eventNames.join('","')}"].forEach((o=>document.addEventListener(o,(o=>{if(!e.events)return;let s=t(o.composedPath&&o.composedPath()[0]||o.target);s&&!e.completed.has(s)&&e.events.push([s,o])}))))})(_$HY={events:[],completed:new WeakSet,r:{},fe(){}});</script><!--xs-->`;
|
|
2678
|
+
return `<script${nonce ? ` nonce="${escape(String(nonce), true)}"` : ""}>window._$HY||(e=>{let t=e=>e&&e.hasAttribute&&(e.hasAttribute("_hk")?e:t(e.host&&e.host.nodeType?e.host:e.parentNode));["${eventNames.join('","')}"].forEach((o=>document.addEventListener(o,(o=>{if(!e.events)return;let s=t(o.composedPath&&o.composedPath()[0]||o.target);s&&!e.completed.has(s)&&e.events.push([s,o])}))))})(_$HY={events:[],completed:new WeakSet,r:{},fe(){}});</script><!--xs-->`;
|
|
2452
2679
|
}
|
|
2453
2680
|
function queue(fn) {
|
|
2454
2681
|
return Promise.resolve().then(fn);
|
|
2455
2682
|
}
|
|
2683
|
+
const deferFlush = typeof setImmediate === "function" ? setImmediate : fn => setTimeout(fn, 0);
|
|
2456
2684
|
function allSettled(promises) {
|
|
2457
2685
|
let size = promises.size;
|
|
2458
2686
|
return Promise.allSettled(promises).then(() => {
|
|
@@ -2461,10 +2689,11 @@ function allSettled(promises) {
|
|
|
2461
2689
|
});
|
|
2462
2690
|
}
|
|
2463
2691
|
function assembleDocument(html, emittedAssets, inlineStyles, scripts, nonce, headTags, onHead) {
|
|
2464
|
-
const scriptTag = scripts ? `<script${nonce
|
|
2465
|
-
const
|
|
2692
|
+
const scriptTag = scripts ? `<script${nonceAttr(nonce, "script")}>${scripts}</script>` : "";
|
|
2693
|
+
const title = headTags ? headTags.title : null;
|
|
2694
|
+
let headTagsHtml = headTags ? headTags.html : "";
|
|
2466
2695
|
const headPrelude = headTags ? headTags.prelude : "";
|
|
2467
|
-
if (!onHead && !headTagsHtml && !headPrelude && !(emittedAssets && emittedAssets.size) && !(inlineStyles && inlineStyles.size)) {
|
|
2696
|
+
if (!onHead && title == null && !headTagsHtml && !headPrelude && !(emittedAssets && emittedAssets.size) && !(inlineStyles && inlineStyles.size)) {
|
|
2468
2697
|
if (!scriptTag) return html;
|
|
2469
2698
|
const xs = html.indexOf("<!--xs-->");
|
|
2470
2699
|
return xs === -1 ? html + scriptTag : html.slice(0, xs) + scriptTag + html.slice(xs);
|
|
@@ -2476,15 +2705,33 @@ function assembleDocument(html, emittedAssets, inlineStyles, scripts, nonce, hea
|
|
|
2476
2705
|
html = html.slice(0, at) + headPrelude + html.slice(at);
|
|
2477
2706
|
}
|
|
2478
2707
|
}
|
|
2479
|
-
|
|
2708
|
+
let headIdx = html.indexOf("</head>");
|
|
2480
2709
|
if (headIdx === -1) {
|
|
2481
2710
|
if (onHead) {
|
|
2482
|
-
|
|
2711
|
+
let titleHtml = "";
|
|
2712
|
+
if (title != null) {
|
|
2713
|
+
titleHtml = headTags.noScripts ? `<title data-dh="title">${escape(title)}</title>` : `<script${nonceAttr(nonce, "script")}>(function(x,t){(t=document.querySelector("title"))?(t.hasAttribute("data-dh")||t.setAttribute("data-dhf",t.textContent),t.textContent=x):(document.title=x,t=document.querySelector("title"));t&&t.setAttribute("data-dh","title")})(${JSON.stringify(title).replace(/</g, "\\u003C")})</script>`;
|
|
2714
|
+
}
|
|
2715
|
+
onHead(headPrelude + headTagsHtml + titleHtml + renderHeadAssets(emittedAssets, inlineStyles, nonce));
|
|
2483
2716
|
}
|
|
2484
2717
|
if (!scriptTag) return html;
|
|
2485
2718
|
const xs = html.indexOf("<!--xs-->");
|
|
2486
2719
|
return xs === -1 ? html + scriptTag : html.slice(0, xs) + scriptTag + html.slice(xs);
|
|
2487
2720
|
}
|
|
2721
|
+
if (title != null) {
|
|
2722
|
+
const winner = escape(title);
|
|
2723
|
+
const open = html.match(/<head(?:\s[^>]*)?>/);
|
|
2724
|
+
const from = open ? open.index + open[0].length : 0;
|
|
2725
|
+
const m = /<title(\s[^>]*)?>([\s\S]*?)<\/title>/.exec(html.slice(from, headIdx));
|
|
2726
|
+
if (m) {
|
|
2727
|
+
const at = from + m.index;
|
|
2728
|
+
const stash = m[2].replace(/"/g, """);
|
|
2729
|
+
html = html.slice(0, at) + `<title${m[1] || ""} data-dh="title" data-dhf="${stash}">${winner}</title>` + html.slice(at + m[0].length);
|
|
2730
|
+
headIdx = html.indexOf("</head>");
|
|
2731
|
+
} else {
|
|
2732
|
+
headTagsHtml = `<title data-dh="title">${winner}</title>` + headTagsHtml;
|
|
2733
|
+
}
|
|
2734
|
+
}
|
|
2488
2735
|
const head = headTagsHtml + renderHeadAssets(emittedAssets, inlineStyles, nonce);
|
|
2489
2736
|
if (!scriptTag) return html.slice(0, headIdx) + head + html.slice(headIdx);
|
|
2490
2737
|
const xsIdx = html.indexOf("<!--xs-->");
|
|
@@ -2493,9 +2740,11 @@ function assembleDocument(html, emittedAssets, inlineStyles, scripts, nonce, hea
|
|
|
2493
2740
|
}
|
|
2494
2741
|
function renderHeadAssets(emittedAssets, inlineStyles, nonce) {
|
|
2495
2742
|
let head = "";
|
|
2743
|
+
const styleAttr = nonceAttr(nonce, "style");
|
|
2744
|
+
const scriptAttr = nonceAttr(nonce, "script");
|
|
2496
2745
|
if (emittedAssets && emittedAssets.size) {
|
|
2497
2746
|
for (const url of emittedAssets) {
|
|
2498
|
-
head += isCssUrl(url) ? `<link rel="stylesheet" href="${url}">` : `<link rel="modulepreload" href="${url}">`;
|
|
2747
|
+
head += isCssUrl(url) ? `<link rel="stylesheet" href="${url}"${styleAttr}>` : `<link rel="modulepreload" href="${url}"${scriptAttr}>`;
|
|
2499
2748
|
}
|
|
2500
2749
|
}
|
|
2501
2750
|
if (inlineStyles && inlineStyles.size) {
|
|
@@ -2557,12 +2806,15 @@ function escapeStyleContent(content) {
|
|
|
2557
2806
|
}
|
|
2558
2807
|
function renderInlineStyle(entry, nonce) {
|
|
2559
2808
|
let attrs = "";
|
|
2809
|
+
let hasNonce = false;
|
|
2560
2810
|
if (entry.attrs) {
|
|
2561
2811
|
for (const name in entry.attrs) {
|
|
2812
|
+
if (name.length === 5 && asciiLowerCase(name) === "nonce") hasNonce = true;
|
|
2562
2813
|
attrs += ` ${name}="${escape(String(entry.attrs[name]), true)}"`;
|
|
2563
2814
|
}
|
|
2564
2815
|
}
|
|
2565
|
-
|
|
2816
|
+
const nonceHtml = hasNonce ? "" : nonceAttr(nonce, "style");
|
|
2817
|
+
return `<style${nonceHtml} data-asset="${escape(entry.id, true)}"${attrs}>${escapeStyleContent(entry.content)}</style>`;
|
|
2566
2818
|
}
|
|
2567
2819
|
function waitForFragments(registry, key) {
|
|
2568
2820
|
for (const k of [...registry.keys()].reverse()) {
|
|
@@ -2804,16 +3056,13 @@ function deriveHead(stub, responseInit = {}) {
|
|
|
2804
3056
|
headers
|
|
2805
3057
|
};
|
|
2806
3058
|
}
|
|
2807
|
-
function escapeAttribute(value) {
|
|
2808
|
-
return value.replace(/&/g, "&").replace(/"/g, """).replace(/</g, "<");
|
|
2809
|
-
}
|
|
2810
3059
|
function createSSRResponse(result, event, options = {}) {
|
|
2811
3060
|
const stub = event && event.response;
|
|
2812
3061
|
const {
|
|
2813
3062
|
responseInit,
|
|
2814
|
-
nonce,
|
|
2815
3063
|
transformChunk
|
|
2816
3064
|
} = options;
|
|
3065
|
+
const nonce = normalizeNonce(options.nonce);
|
|
2817
3066
|
if (typeof result === "string") {
|
|
2818
3067
|
if (stub) commitResponseStub(stub);
|
|
2819
3068
|
const head = deriveHead(stub, responseInit);
|
|
@@ -2883,7 +3132,7 @@ function createSSRResponse(result, event, options = {}) {
|
|
|
2883
3132
|
if (closed || !controller) return;
|
|
2884
3133
|
const location = stub && stub.headers.get("Location");
|
|
2885
3134
|
if (location) {
|
|
2886
|
-
const attr =
|
|
3135
|
+
const attr = nonceAttr(nonce, "script");
|
|
2887
3136
|
enqueue(`<script${attr}>window.location=${JSON.stringify(location).replace(/</g, "\\u003c")}</script>`);
|
|
2888
3137
|
}
|
|
2889
3138
|
closed = true;
|
|
@@ -3120,10 +3369,17 @@ Object.defineProperty(exports, "scope", {
|
|
|
3120
3369
|
enumerable: true,
|
|
3121
3370
|
get: function () { return solidJs.ssrScope; }
|
|
3122
3371
|
});
|
|
3372
|
+
Object.defineProperty(exports, "sharedConfig", {
|
|
3373
|
+
enumerable: true,
|
|
3374
|
+
get: function () { return solidJs.sharedConfig; }
|
|
3375
|
+
});
|
|
3123
3376
|
Object.defineProperty(exports, "untrack", {
|
|
3124
3377
|
enumerable: true,
|
|
3125
3378
|
get: function () { return solidJs.untrack; }
|
|
3126
3379
|
});
|
|
3380
|
+
exports.CLAIMS_DOCUMENT = CLAIMS_DOCUMENT;
|
|
3381
|
+
exports.CLAIMS_STREAM = CLAIMS_STREAM;
|
|
3382
|
+
exports.CLAIM_PROP = CLAIM_PROP;
|
|
3127
3383
|
exports.ChildProperties = ChildProperties;
|
|
3128
3384
|
exports.DOMElements = DOMElements;
|
|
3129
3385
|
exports.DOMWithState = DOMWithState;
|
|
@@ -3198,6 +3454,7 @@ exports.renderToString = renderToString;
|
|
|
3198
3454
|
exports.resolveSSRSelectValues = resolveSSRSelectValues;
|
|
3199
3455
|
exports.respond = respond;
|
|
3200
3456
|
exports.runHydrationEvents = notSup;
|
|
3457
|
+
exports.scriptNonce = scriptNonce;
|
|
3201
3458
|
exports.serializeCookie = serializeCookie;
|
|
3202
3459
|
exports.setAttribute = notSup;
|
|
3203
3460
|
exports.setAttributeNS = notSup;
|
|
@@ -3206,13 +3463,16 @@ exports.setStyleProperty = notSup;
|
|
|
3206
3463
|
exports.spread = notSup;
|
|
3207
3464
|
exports.ssr = ssr;
|
|
3208
3465
|
exports.ssrAttribute = ssrAttribute;
|
|
3466
|
+
exports.ssrClaim = ssrClaim;
|
|
3209
3467
|
exports.ssrClassName = ssrClassName;
|
|
3210
3468
|
exports.ssrElement = ssrElement;
|
|
3211
3469
|
exports.ssrGroup = ssrGroup;
|
|
3212
3470
|
exports.ssrHydrationKey = ssrHydrationKey;
|
|
3471
|
+
exports.ssrSelectValues = ssrSelectValues;
|
|
3213
3472
|
exports.ssrStyle = ssrStyle;
|
|
3214
3473
|
exports.ssrStyleProperty = ssrStyleProperty;
|
|
3215
3474
|
exports.style = notSup;
|
|
3475
|
+
exports.styleNonce = styleNonce;
|
|
3216
3476
|
exports.template = notSup;
|
|
3217
3477
|
exports.unregisterDelegatedContainer = notSup;
|
|
3218
3478
|
exports.unregisterDelegatedRoot = notSup;
|