@fictjs/ssr 0.26.0 → 0.27.0

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 (41) hide show
  1. package/README.md +169 -52
  2. package/dist/experimental.cjs +1 -1
  3. package/dist/experimental.d.cts +1 -1
  4. package/dist/experimental.d.ts +1 -1
  5. package/dist/experimental.js +1 -1
  6. package/dist/experimental.node.cjs +5 -0
  7. package/dist/experimental.node.d.cts +2 -0
  8. package/dist/experimental.node.d.ts +2 -0
  9. package/dist/experimental.node.js +4 -0
  10. package/dist/fict-stream-runtime.js +1 -1
  11. package/dist/index.cjs +1 -1
  12. package/dist/index.d.cts +1 -1
  13. package/dist/index.d.ts +1 -1
  14. package/dist/index.js +1 -1
  15. package/dist/index.node.cjs +10 -0
  16. package/dist/index.node.d.cts +2 -0
  17. package/dist/index.node.d.ts +2 -0
  18. package/dist/index.node.js +4 -0
  19. package/dist/node-session-carrier-CTo-1Awq.cjs +8 -0
  20. package/dist/node-session-carrier-ClqRbdoQ.js +12 -0
  21. package/dist/node-session-carrier-ClqRbdoQ.js.map +1 -0
  22. package/dist/render-core-D0nOT_Pe.js +1824 -0
  23. package/dist/render-core-D0nOT_Pe.js.map +1 -0
  24. package/dist/render-core-D_EheVwh.cjs +1863 -0
  25. package/dist/{render-core-BCYvLfHF.d.ts → render-core-KCiJV_SK.d.cts} +22 -1
  26. package/dist/render-core-KCiJV_SK.d.cts.map +1 -0
  27. package/dist/{render-core-BCYvLfHF.d.cts → render-core-KCiJV_SK.d.ts} +22 -1
  28. package/dist/render-core-KCiJV_SK.d.ts.map +1 -0
  29. package/dist/stream-runtime.cjs +1 -1
  30. package/dist/stream-runtime.d.cts +2 -0
  31. package/dist/stream-runtime.d.cts.map +1 -1
  32. package/dist/stream-runtime.d.ts +2 -0
  33. package/dist/stream-runtime.d.ts.map +1 -1
  34. package/dist/stream-runtime.js +1 -1
  35. package/dist/stream-runtime.js.map +1 -1
  36. package/package.json +15 -5
  37. package/dist/render-core-BCYvLfHF.d.cts.map +0 -1
  38. package/dist/render-core-BCYvLfHF.d.ts.map +0 -1
  39. package/dist/render-core-BLLUhkYy.js +0 -969
  40. package/dist/render-core-BLLUhkYy.js.map +0 -1
  41. package/dist/render-core-CWudV9yi.cjs +0 -1008
@@ -84,6 +84,17 @@ interface RenderToStringOptions {
84
84
  * Nonce applied to generated <script> tags for CSP compatibility.
85
85
  */
86
86
  scriptNonce?: string;
87
+ /**
88
+ * Stable namespace for resumable scope identifiers in `data-fict-s` and
89
+ * snapshot payloads. Set this when independently cached or separately rendered
90
+ * outputs can share a document, and keep it unique within that document.
91
+ * This does not change streaming Suspense patch identifiers.
92
+ *
93
+ * Values must contain 1-128 ASCII letters, digits, `_`, `.`, `:`, or `-`, and
94
+ * must not contain `--`. When omitted, each render gets an automatic edge-safe
95
+ * namespace.
96
+ */
97
+ scopeIdentifierPrefix?: string;
87
98
  }
88
99
  interface RenderToStreamOptions extends RenderToStringOptions {
89
100
  /**
@@ -122,6 +133,16 @@ interface RenderToStreamOptions extends RenderToStringOptions {
122
133
  * Defaults to 'inline' for inline runtimes and 'observer' for external runtimes.
123
134
  */
124
135
  streamPatchMode?: 'inline' | 'observer';
136
+ /**
137
+ * Stable namespace for Suspense patch identifiers. Set this when independently
138
+ * cached or separately rendered streams can share a document, and keep it unique
139
+ * within that document. This does not change resumable scope identifiers.
140
+ *
141
+ * Values must contain 1-128 ASCII letters, digits, `_`, `.`, `:`, or `-`, and
142
+ * must not contain `--`. When omitted, each shell stream gets an automatic
143
+ * edge-safe namespace.
144
+ */
145
+ streamIdentifierPrefix?: string;
125
146
  }
126
147
  interface PipeableStream {
127
148
  pipe: (writable: NodeJS.WritableStream) => void;
@@ -163,4 +184,4 @@ declare function renderToPipeableStream(view: () => FictNode, options?: RenderTo
163
184
  declare function renderToPartial(view: () => FictNode, options?: RenderToStreamOptions): PartialPrerenderResult;
164
185
  //#endregion
165
186
  export { RenderToStringOptions as a, renderToDocument as c, renderToStream as d, renderToString as f, RenderToStreamOptions as i, renderToPartial as l, PipeableStream as n, SSRDom as o, renderToStringAsync as p, RenderToDocumentResult as r, createSSRDocument as s, PartialPrerenderResult as t, renderToPipeableStream as u };
166
- //# sourceMappingURL=render-core-BCYvLfHF.d.ts.map
187
+ //# sourceMappingURL=render-core-KCiJV_SK.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-core-KCiJV_SK.d.cts","names":[],"sources":["../src/render-core.ts"],"mappings":";;;UAkCiB,MAAA;EACf,MAAA,EAAQ,MAAA;EACR,QAAA,EAAU,QAAQ;AAAA;AAAA,UAGH,qBAAA;EAHG;;;;EAQlB,GAAA,GAAM,MAAA;EARY;AAAA;AAGpB;;EAUE,QAAA,GAAW,QAAA;EALL;;;EASN,MAAA,GAAS,MAAA;EAoBa;;;EAhBtB,IAAA;EAbA;;;EAiBA,SAAA,GAAY,WAAA;EARZ;;;EAYA,YAAA;EAJY;;;EAQZ,WAAA;EAIsB;;;EAAtB,mBAAA,GAAsB,MAAA;EAkBtB;;;EAdA,gBAAA;EA+BA;;;EA3BA,YAAA;EA+CqB;AAAA;AAGvB;EA9CE,OAAA;;;;;;EAMA,aAAA;EA0DA;;;;;;;EAlDA,QAAA,GAAW,MAAA;EA8EW;AAAA;AAGxB;;EA5EE,eAAA;EA6EiB;;;EAzEjB,gBAAA;EA4EiB;;;;EAvEjB,cAAA;EAqEA;;;EAjEA,WAAA;EAmEA;;;AAAiB;AAGnB;;;;;;EA3DE,qBAAA;AAAA;AAAA,UAGe,qBAAA,SAA8B,qBAAqB;EA+DlE;;;;;EAzDA,IAAA;EA+DA;;;EA3DA,YAAA;EA4DwB;AAAA;AAG1B;EA3DE,UAAA;;;;EAIA,OAAA,IAAW,GAAA;EAyDX;;;EArDA,MAAA,GAAS,WAAA;EAsDF;AAQT;;;EAzDE,aAAA;EAyDoE;AAStE;;EA9DE,gBAAA;EA+DY;;;;EA1DZ,eAAA;EA0DY;;;;;;AAEW;AA+DzB;;EAjHE,sBAAA;AAAA;AAAA,UAGe,cAAA;EACf,IAAA,GAAO,QAAA,EAAU,MAAA,CAAO,cAAA;EACxB,KAAA,GAAQ,MAAA;EACR,UAAA,EAAY,OAAA;EACZ,QAAA,EAAU,OAAA;AAAA;AAAA,UAGK,sBAAA;EA8GwB;;;;;;EAvGvC,KAAA;EAwGY;;;EApGZ,MAAA,EAAQ,cAAA,CAAe,UAAA;EACvB,UAAA,EAAY,OAAA;EACZ,QAAA,EAAU,OAAA;EACV,KAAA,GAAQ,MAAA;AAAA;AAAA,UAGO,sBAAA,SAA+B,MAAM;EACpD,IAAA;EACA,SAAA,EAAW,WAAA;EACX,OAAA;AAAA;AAAA,iBAQc,iBAAA,CAAkB,IAAA,YAA8B,MAAM;AAAA,iBAStD,gBAAA,CACd,IAAA,QAAY,QAAA,EACZ,OAAA,GAAS,qBAAA,GACR,sBAAA;AAAA,iBA+Da,cAAA,CAAe,IAAA,QAAY,QAAA,EAAU,OAAA,GAAS,qBAA0B;AAAA,iBAOlE,mBAAA,CACpB,IAAA,QAAY,QAAA,EACZ,OAAA,GAAS,qBAAA,GACR,OAAA;AAAA,iBA6Ba,cAAA,CACd,IAAA,QAAY,QAAA,EACZ,OAAA,GAAS,qBAAA,GACR,cAAA,CAAe,UAAA;AAAA,iBAkFF,sBAAA,CACd,IAAA,QAAY,QAAA,EACZ,OAAA,GAAS,qBAAA,GACR,cAAA;;;;;iBA8Ba,eAAA,CACd,IAAA,QAAY,QAAA,EACZ,OAAA,GAAS,qBAAA,GACR,sBAAA"}
@@ -84,6 +84,17 @@ interface RenderToStringOptions {
84
84
  * Nonce applied to generated <script> tags for CSP compatibility.
85
85
  */
86
86
  scriptNonce?: string;
87
+ /**
88
+ * Stable namespace for resumable scope identifiers in `data-fict-s` and
89
+ * snapshot payloads. Set this when independently cached or separately rendered
90
+ * outputs can share a document, and keep it unique within that document.
91
+ * This does not change streaming Suspense patch identifiers.
92
+ *
93
+ * Values must contain 1-128 ASCII letters, digits, `_`, `.`, `:`, or `-`, and
94
+ * must not contain `--`. When omitted, each render gets an automatic edge-safe
95
+ * namespace.
96
+ */
97
+ scopeIdentifierPrefix?: string;
87
98
  }
88
99
  interface RenderToStreamOptions extends RenderToStringOptions {
89
100
  /**
@@ -122,6 +133,16 @@ interface RenderToStreamOptions extends RenderToStringOptions {
122
133
  * Defaults to 'inline' for inline runtimes and 'observer' for external runtimes.
123
134
  */
124
135
  streamPatchMode?: 'inline' | 'observer';
136
+ /**
137
+ * Stable namespace for Suspense patch identifiers. Set this when independently
138
+ * cached or separately rendered streams can share a document, and keep it unique
139
+ * within that document. This does not change resumable scope identifiers.
140
+ *
141
+ * Values must contain 1-128 ASCII letters, digits, `_`, `.`, `:`, or `-`, and
142
+ * must not contain `--`. When omitted, each shell stream gets an automatic
143
+ * edge-safe namespace.
144
+ */
145
+ streamIdentifierPrefix?: string;
125
146
  }
126
147
  interface PipeableStream {
127
148
  pipe: (writable: NodeJS.WritableStream) => void;
@@ -163,4 +184,4 @@ declare function renderToPipeableStream(view: () => FictNode, options?: RenderTo
163
184
  declare function renderToPartial(view: () => FictNode, options?: RenderToStreamOptions): PartialPrerenderResult;
164
185
  //#endregion
165
186
  export { RenderToStringOptions as a, renderToDocument as c, renderToStream as d, renderToString as f, RenderToStreamOptions as i, renderToPartial as l, PipeableStream as n, SSRDom as o, renderToStringAsync as p, RenderToDocumentResult as r, createSSRDocument as s, PartialPrerenderResult as t, renderToPipeableStream as u };
166
- //# sourceMappingURL=render-core-BCYvLfHF.d.cts.map
187
+ //# sourceMappingURL=render-core-KCiJV_SK.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-core-KCiJV_SK.d.ts","names":[],"sources":["../src/render-core.ts"],"mappings":";;;UAkCiB,MAAA;EACf,MAAA,EAAQ,MAAA;EACR,QAAA,EAAU,QAAQ;AAAA;AAAA,UAGH,qBAAA;EAHG;;;;EAQlB,GAAA,GAAM,MAAA;EARY;AAAA;AAGpB;;EAUE,QAAA,GAAW,QAAA;EALL;;;EASN,MAAA,GAAS,MAAA;EAoBa;;;EAhBtB,IAAA;EAbA;;;EAiBA,SAAA,GAAY,WAAA;EARZ;;;EAYA,YAAA;EAJY;;;EAQZ,WAAA;EAIsB;;;EAAtB,mBAAA,GAAsB,MAAA;EAkBtB;;;EAdA,gBAAA;EA+BA;;;EA3BA,YAAA;EA+CqB;AAAA;AAGvB;EA9CE,OAAA;;;;;;EAMA,aAAA;EA0DA;;;;;;;EAlDA,QAAA,GAAW,MAAA;EA8EW;AAAA;AAGxB;;EA5EE,eAAA;EA6EiB;;;EAzEjB,gBAAA;EA4EiB;;;;EAvEjB,cAAA;EAqEA;;;EAjEA,WAAA;EAmEA;;;AAAiB;AAGnB;;;;;;EA3DE,qBAAA;AAAA;AAAA,UAGe,qBAAA,SAA8B,qBAAqB;EA+DlE;;;;;EAzDA,IAAA;EA+DA;;;EA3DA,YAAA;EA4DwB;AAAA;AAG1B;EA3DE,UAAA;;;;EAIA,OAAA,IAAW,GAAA;EAyDX;;;EArDA,MAAA,GAAS,WAAA;EAsDF;AAQT;;;EAzDE,aAAA;EAyDoE;AAStE;;EA9DE,gBAAA;EA+DY;;;;EA1DZ,eAAA;EA0DY;;;;;;AAEW;AA+DzB;;EAjHE,sBAAA;AAAA;AAAA,UAGe,cAAA;EACf,IAAA,GAAO,QAAA,EAAU,MAAA,CAAO,cAAA;EACxB,KAAA,GAAQ,MAAA;EACR,UAAA,EAAY,OAAA;EACZ,QAAA,EAAU,OAAA;AAAA;AAAA,UAGK,sBAAA;EA8GwB;;;;;;EAvGvC,KAAA;EAwGY;;;EApGZ,MAAA,EAAQ,cAAA,CAAe,UAAA;EACvB,UAAA,EAAY,OAAA;EACZ,QAAA,EAAU,OAAA;EACV,KAAA,GAAQ,MAAA;AAAA;AAAA,UAGO,sBAAA,SAA+B,MAAM;EACpD,IAAA;EACA,SAAA,EAAW,WAAA;EACX,OAAA;AAAA;AAAA,iBAQc,iBAAA,CAAkB,IAAA,YAA8B,MAAM;AAAA,iBAStD,gBAAA,CACd,IAAA,QAAY,QAAA,EACZ,OAAA,GAAS,qBAAA,GACR,sBAAA;AAAA,iBA+Da,cAAA,CAAe,IAAA,QAAY,QAAA,EAAU,OAAA,GAAS,qBAA0B;AAAA,iBAOlE,mBAAA,CACpB,IAAA,QAAY,QAAA,EACZ,OAAA,GAAS,qBAAA,GACR,OAAA;AAAA,iBA6Ba,cAAA,CACd,IAAA,QAAY,QAAA,EACZ,OAAA,GAAS,qBAAA,GACR,cAAA,CAAe,UAAA;AAAA,iBAkFF,sBAAA,CACd,IAAA,QAAY,QAAA,EACZ,OAAA,GAAS,qBAAA,GACR,cAAA;;;;;iBA8Ba,eAAA,CACd,IAAA,QAAY,QAAA,EACZ,OAAA,GAAS,qBAAA,GACR,sBAAA"}
@@ -7,7 +7,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
7
7
  * this helper with `observerMode: true`.
8
8
  */
9
9
  function createStreamRuntimeCode(options = {}) {
10
- return "(function(){if(window.__FICT_STREAM)return;var cache=new Map();function find(id){var hit=cache.get(id);if(hit)return hit;var start=null,end=null;var w=document.createTreeWalker(document,NodeFilter.SHOW_COMMENT);while(w.nextNode()){var n=w.currentNode;var d=n.data;if(d===\"fict:suspense-start:\"+id)start=n;else if(d===\"fict:suspense-end:\"+id)end=n;if(start&&end)break;}if(start&&end){hit={start:start,end:end};cache.set(id,hit);}return hit;}function apply(id){var tpl=document.querySelector('template[data-fict-suspense=\"' + id + '\"]');if(!tpl)return;var b=find(id);if(!b)return;var node=b.start.nextSibling;while(node&&node!==b.end){var next=node.nextSibling;node.parentNode&&node.parentNode.removeChild(node);node=next;}b.end.parentNode&&b.end.parentNode.insertBefore(tpl.content,b.end);tpl.parentNode&&tpl.parentNode.removeChild(tpl);}window.__FICT_STREAM={apply:apply};" + (options.observerMode ?? true ? "function scan(root){var list=(root&&root.querySelectorAll?root:document).querySelectorAll(\"template[data-fict-suspense]\");for(var i=0;i<list.length;i++){apply(list[i].getAttribute(\"data-fict-suspense\"));}}if(typeof MutationObserver===\"function\"){new MutationObserver(function(muts){for(var i=0;i<muts.length;i++){for(var j=0;j<muts[i].addedNodes.length;j++){var n=muts[i].addedNodes[j];if(n.nodeType===1){if(n.matches&&n.matches(\"template[data-fict-suspense]\"))apply(n.getAttribute(\"data-fict-suspense\"));scan(n);}}}}).observe(document.documentElement||document,{childList:true,subtree:true});}if(document.readyState===\"loading\"){document.addEventListener(\"DOMContentLoaded\",function(){scan(document);},{once:true});}else{scan(document);}" : "") + "})();";
10
+ return "(function(){var runtime=window.__FICT_STREAM;function walk(root,visit){var stack=[root];while(stack.length){var node=stack.pop();if(visit(node)===false)return false;var container=node.nodeType===1&&node.localName===\"template\"&&node.content?node.content:node;for(var child=container.lastChild;child;child=child.previousSibling)stack.push(child);}return true;}if(!runtime||typeof runtime.apply!==\"function\"){var cache=new Map();function findTemplate(id){var tpl=null;walk(document,function(n){if(n.nodeType===1&&n.localName===\"template\"&&n.content&&n.getAttribute(\"data-fict-suspense\")===id){tpl=n;return false;}});return tpl;}function find(id){var hit=cache.get(id);if(hit)return hit;var startMarker=\"fict:suspense-start:\"+id,endMarker=\"fict:suspense-end:\"+id;walk(document,function(n){if(n.nodeType!==8||n.data!==startMarker)return;var end=n.nextSibling;while(end&&(end.nodeType!==8||end.data!==endMarker))end=end.nextSibling;if(end){hit={start:n,end:end};return false;}});if(hit)cache.set(id,hit);return hit;}function apply(id){if(typeof id!==\"string\"||!id)return;var tpl=findTemplate(id);if(!tpl)return;var b=find(id);if(!b)return;var parent=b.start.parentNode;if(!parent||b.end.parentNode!==parent)return;var cursor=b.start.nextSibling;while(cursor&&cursor!==b.end)cursor=cursor.nextSibling;if(cursor!==b.end)return;var content=tpl.content;var ns=tpl.getAttribute(\"data-fict-patch-namespace\");if(ns){var tag=ns===\"svg\"?\"svg\":ns===\"mathml\"?\"math\":null;var wrapper=content.firstElementChild;if(!tag||!wrapper||wrapper.localName!==tag)return;var fragment=document.createDocumentFragment();while(wrapper.firstChild)fragment.appendChild(wrapper.firstChild);content=fragment;}var node=b.start.nextSibling;while(node&&node!==b.end){var next=node.nextSibling;node.parentNode&&node.parentNode.removeChild(node);node=next;}parent.insertBefore(content,b.end);tpl.parentNode&&tpl.parentNode.removeChild(tpl);}runtime={apply:apply};window.__FICT_STREAM=runtime;}" + (options.observerMode ?? true ? "if(runtime.observerInstalled)return;runtime.observerInstalled=true;function scan(root){var ids=[];walk(root,function(n){if(n.nodeType===1&&n.localName===\"template\"&&n.content&&n.hasAttribute(\"data-fict-suspense\")){var id=n.getAttribute(\"data-fict-suspense\");if(id)ids.push(id);}});for(var i=0;i<ids.length;i++)runtime.apply(ids[i]);}if(typeof MutationObserver===\"function\"){new MutationObserver(function(muts){for(var i=0;i<muts.length;i++){for(var j=0;j<muts[i].addedNodes.length;j++){var n=muts[i].addedNodes[j];if(n.nodeType===1)scan(n);}}}).observe(document.documentElement||document,{childList:true,subtree:true});}if(document.readyState===\"loading\"){document.addEventListener(\"DOMContentLoaded\",function(){scan(document);},{once:true});}else{scan(document);}" : "") + "})();";
11
11
  }
12
12
  const FICT_STREAM_RUNTIME_CODE = createStreamRuntimeCode({ observerMode: true });
13
13
  //#endregion
@@ -2,6 +2,8 @@
2
2
  interface StreamRuntimeCodeOptions {
3
3
  /**
4
4
  * Enable observer mode so patch templates are applied without per-chunk inline scripts.
5
+ * Existing template fragments are covered by the initial scan; observation follows
6
+ * additions to the document tree made while streamed HTML is parsed.
5
7
  */
6
8
  observerMode?: boolean;
7
9
  }
@@ -1 +1 @@
1
- {"version":3,"file":"stream-runtime.d.cts","names":[],"sources":["../src/stream-runtime.ts"],"mappings":";UAAiB,wBAAA;EAAA;;;EAIf,YAAY;AAAA;AASd;;;;AAA8E;AAqC9E;AArCA,iBAAgB,uBAAA,CAAwB,OAAsC,GAA7B,wBAA6B;AAAA,cAqCjE,wBAAA"}
1
+ {"version":3,"file":"stream-runtime.d.cts","names":[],"sources":["../src/stream-runtime.ts"],"mappings":";UAAiB,wBAAA;EAAA;;;;AAMH;EAAZ,YAAY;AAAA;;;AASgE;AAsD9E;;;iBAtDgB,uBAAA,CAAwB,OAAsC,GAA7B,wBAA6B;AAAA,cAsDjE,wBAAA"}
@@ -2,6 +2,8 @@
2
2
  interface StreamRuntimeCodeOptions {
3
3
  /**
4
4
  * Enable observer mode so patch templates are applied without per-chunk inline scripts.
5
+ * Existing template fragments are covered by the initial scan; observation follows
6
+ * additions to the document tree made while streamed HTML is parsed.
5
7
  */
6
8
  observerMode?: boolean;
7
9
  }
@@ -1 +1 @@
1
- {"version":3,"file":"stream-runtime.d.ts","names":[],"sources":["../src/stream-runtime.ts"],"mappings":";UAAiB,wBAAA;EAAA;;;EAIf,YAAY;AAAA;AASd;;;;AAA8E;AAqC9E;AArCA,iBAAgB,uBAAA,CAAwB,OAAsC,GAA7B,wBAA6B;AAAA,cAqCjE,wBAAA"}
1
+ {"version":3,"file":"stream-runtime.d.ts","names":[],"sources":["../src/stream-runtime.ts"],"mappings":";UAAiB,wBAAA;EAAA;;;;AAMH;EAAZ,YAAY;AAAA;;;AASgE;AAsD9E;;;iBAtDgB,uBAAA,CAAwB,OAAsC,GAA7B,wBAA6B;AAAA,cAsDjE,wBAAA"}
@@ -6,7 +6,7 @@
6
6
  * this helper with `observerMode: true`.
7
7
  */
8
8
  function createStreamRuntimeCode(options = {}) {
9
- return "(function(){if(window.__FICT_STREAM)return;var cache=new Map();function find(id){var hit=cache.get(id);if(hit)return hit;var start=null,end=null;var w=document.createTreeWalker(document,NodeFilter.SHOW_COMMENT);while(w.nextNode()){var n=w.currentNode;var d=n.data;if(d===\"fict:suspense-start:\"+id)start=n;else if(d===\"fict:suspense-end:\"+id)end=n;if(start&&end)break;}if(start&&end){hit={start:start,end:end};cache.set(id,hit);}return hit;}function apply(id){var tpl=document.querySelector('template[data-fict-suspense=\"' + id + '\"]');if(!tpl)return;var b=find(id);if(!b)return;var node=b.start.nextSibling;while(node&&node!==b.end){var next=node.nextSibling;node.parentNode&&node.parentNode.removeChild(node);node=next;}b.end.parentNode&&b.end.parentNode.insertBefore(tpl.content,b.end);tpl.parentNode&&tpl.parentNode.removeChild(tpl);}window.__FICT_STREAM={apply:apply};" + (options.observerMode ?? true ? "function scan(root){var list=(root&&root.querySelectorAll?root:document).querySelectorAll(\"template[data-fict-suspense]\");for(var i=0;i<list.length;i++){apply(list[i].getAttribute(\"data-fict-suspense\"));}}if(typeof MutationObserver===\"function\"){new MutationObserver(function(muts){for(var i=0;i<muts.length;i++){for(var j=0;j<muts[i].addedNodes.length;j++){var n=muts[i].addedNodes[j];if(n.nodeType===1){if(n.matches&&n.matches(\"template[data-fict-suspense]\"))apply(n.getAttribute(\"data-fict-suspense\"));scan(n);}}}}).observe(document.documentElement||document,{childList:true,subtree:true});}if(document.readyState===\"loading\"){document.addEventListener(\"DOMContentLoaded\",function(){scan(document);},{once:true});}else{scan(document);}" : "") + "})();";
9
+ return "(function(){var runtime=window.__FICT_STREAM;function walk(root,visit){var stack=[root];while(stack.length){var node=stack.pop();if(visit(node)===false)return false;var container=node.nodeType===1&&node.localName===\"template\"&&node.content?node.content:node;for(var child=container.lastChild;child;child=child.previousSibling)stack.push(child);}return true;}if(!runtime||typeof runtime.apply!==\"function\"){var cache=new Map();function findTemplate(id){var tpl=null;walk(document,function(n){if(n.nodeType===1&&n.localName===\"template\"&&n.content&&n.getAttribute(\"data-fict-suspense\")===id){tpl=n;return false;}});return tpl;}function find(id){var hit=cache.get(id);if(hit)return hit;var startMarker=\"fict:suspense-start:\"+id,endMarker=\"fict:suspense-end:\"+id;walk(document,function(n){if(n.nodeType!==8||n.data!==startMarker)return;var end=n.nextSibling;while(end&&(end.nodeType!==8||end.data!==endMarker))end=end.nextSibling;if(end){hit={start:n,end:end};return false;}});if(hit)cache.set(id,hit);return hit;}function apply(id){if(typeof id!==\"string\"||!id)return;var tpl=findTemplate(id);if(!tpl)return;var b=find(id);if(!b)return;var parent=b.start.parentNode;if(!parent||b.end.parentNode!==parent)return;var cursor=b.start.nextSibling;while(cursor&&cursor!==b.end)cursor=cursor.nextSibling;if(cursor!==b.end)return;var content=tpl.content;var ns=tpl.getAttribute(\"data-fict-patch-namespace\");if(ns){var tag=ns===\"svg\"?\"svg\":ns===\"mathml\"?\"math\":null;var wrapper=content.firstElementChild;if(!tag||!wrapper||wrapper.localName!==tag)return;var fragment=document.createDocumentFragment();while(wrapper.firstChild)fragment.appendChild(wrapper.firstChild);content=fragment;}var node=b.start.nextSibling;while(node&&node!==b.end){var next=node.nextSibling;node.parentNode&&node.parentNode.removeChild(node);node=next;}parent.insertBefore(content,b.end);tpl.parentNode&&tpl.parentNode.removeChild(tpl);}runtime={apply:apply};window.__FICT_STREAM=runtime;}" + (options.observerMode ?? true ? "if(runtime.observerInstalled)return;runtime.observerInstalled=true;function scan(root){var ids=[];walk(root,function(n){if(n.nodeType===1&&n.localName===\"template\"&&n.content&&n.hasAttribute(\"data-fict-suspense\")){var id=n.getAttribute(\"data-fict-suspense\");if(id)ids.push(id);}});for(var i=0;i<ids.length;i++)runtime.apply(ids[i]);}if(typeof MutationObserver===\"function\"){new MutationObserver(function(muts){for(var i=0;i<muts.length;i++){for(var j=0;j<muts[i].addedNodes.length;j++){var n=muts[i].addedNodes[j];if(n.nodeType===1)scan(n);}}}).observe(document.documentElement||document,{childList:true,subtree:true});}if(document.readyState===\"loading\"){document.addEventListener(\"DOMContentLoaded\",function(){scan(document);},{once:true});}else{scan(document);}" : "") + "})();";
10
10
  }
11
11
  const FICT_STREAM_RUNTIME_CODE = createStreamRuntimeCode({ observerMode: true });
12
12
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"stream-runtime.js","names":[],"sources":["../src/stream-runtime.ts"],"sourcesContent":["export interface StreamRuntimeCodeOptions {\n /**\n * Enable observer mode so patch templates are applied without per-chunk inline scripts.\n */\n observerMode?: boolean\n}\n\n/**\n * Create the browser-side streaming patch runtime as classic-script JavaScript.\n *\n * The generated package asset `@fictjs/ssr/fict-stream-runtime.js` is built from\n * this helper with `observerMode: true`.\n */\nexport function createStreamRuntimeCode(options: StreamRuntimeCodeOptions = {}): string {\n const observerMode = options.observerMode ?? true\n return (\n '(function(){' +\n 'if(window.__FICT_STREAM)return;' +\n 'var cache=new Map();' +\n 'function find(id){' +\n 'var hit=cache.get(id);if(hit)return hit;' +\n 'var start=null,end=null;' +\n 'var w=document.createTreeWalker(document,NodeFilter.SHOW_COMMENT);' +\n 'while(w.nextNode()){' +\n 'var n=w.currentNode;var d=n.data;' +\n 'if(d===\"fict:suspense-start:\"+id)start=n;' +\n 'else if(d===\"fict:suspense-end:\"+id)end=n;' +\n 'if(start&&end)break;' +\n '}' +\n 'if(start&&end){hit={start:start,end:end};cache.set(id,hit);}return hit;' +\n '}' +\n 'function apply(id){' +\n \"var tpl=document.querySelector('template[data-fict-suspense=\\\"' + id + '\\\"]');\" +\n 'if(!tpl)return;' +\n 'var b=find(id);if(!b)return;' +\n 'var node=b.start.nextSibling;' +\n 'while(node&&node!==b.end){var next=node.nextSibling;node.parentNode&&node.parentNode.removeChild(node);node=next;}' +\n 'b.end.parentNode&&b.end.parentNode.insertBefore(tpl.content,b.end);' +\n 'tpl.parentNode&&tpl.parentNode.removeChild(tpl);' +\n '}' +\n 'window.__FICT_STREAM={apply:apply};' +\n (observerMode\n ? 'function scan(root){var list=(root&&root.querySelectorAll?root:document).querySelectorAll(\"template[data-fict-suspense]\");for(var i=0;i<list.length;i++){apply(list[i].getAttribute(\"data-fict-suspense\"));}}' +\n 'if(typeof MutationObserver===\"function\"){new MutationObserver(function(muts){for(var i=0;i<muts.length;i++){for(var j=0;j<muts[i].addedNodes.length;j++){var n=muts[i].addedNodes[j];if(n.nodeType===1){if(n.matches&&n.matches(\"template[data-fict-suspense]\"))apply(n.getAttribute(\"data-fict-suspense\"));scan(n);}}}}).observe(document.documentElement||document,{childList:true,subtree:true});}' +\n 'if(document.readyState===\"loading\"){document.addEventListener(\"DOMContentLoaded\",function(){scan(document);},{once:true});}else{scan(document);}'\n : '') +\n '})();'\n )\n}\n\nexport const FICT_STREAM_RUNTIME_CODE = createStreamRuntimeCode({ observerMode: true })\n"],"mappings":";;;;;;;AAaA,SAAgB,wBAAwB,UAAoC,CAAC,GAAW;CAEtF,OACE,o3BAFmB,QAAQ,gBAAgB,OA4BvC,qvBAGA,MACJ;AAEJ;AAEA,MAAa,2BAA2B,wBAAwB,EAAE,cAAc,KAAK,CAAC"}
1
+ {"version":3,"file":"stream-runtime.js","names":[],"sources":["../src/stream-runtime.ts"],"sourcesContent":["export interface StreamRuntimeCodeOptions {\n /**\n * Enable observer mode so patch templates are applied without per-chunk inline scripts.\n * Existing template fragments are covered by the initial scan; observation follows\n * additions to the document tree made while streamed HTML is parsed.\n */\n observerMode?: boolean\n}\n\n/**\n * Create the browser-side streaming patch runtime as classic-script JavaScript.\n *\n * The generated package asset `@fictjs/ssr/fict-stream-runtime.js` is built from\n * this helper with `observerMode: true`.\n */\nexport function createStreamRuntimeCode(options: StreamRuntimeCodeOptions = {}): string {\n const observerMode = options.observerMode ?? true\n return (\n '(function(){' +\n 'var runtime=window.__FICT_STREAM;' +\n 'function walk(root,visit){' +\n 'var stack=[root];while(stack.length){' +\n 'var node=stack.pop();if(visit(node)===false)return false;' +\n 'var container=node.nodeType===1&&node.localName===\"template\"&&node.content?node.content:node;' +\n 'for(var child=container.lastChild;child;child=child.previousSibling)stack.push(child);' +\n '}return true;' +\n '}' +\n 'if(!runtime||typeof runtime.apply!==\"function\"){' +\n 'var cache=new Map();' +\n 'function findTemplate(id){' +\n 'var tpl=null;walk(document,function(n){' +\n 'if(n.nodeType===1&&n.localName===\"template\"&&n.content&&n.getAttribute(\"data-fict-suspense\")===id){tpl=n;return false;}' +\n '});return tpl;' +\n '}' +\n 'function find(id){' +\n 'var hit=cache.get(id);if(hit)return hit;' +\n 'var startMarker=\"fict:suspense-start:\"+id,endMarker=\"fict:suspense-end:\"+id;' +\n 'walk(document,function(n){' +\n 'if(n.nodeType!==8||n.data!==startMarker)return;' +\n 'var end=n.nextSibling;while(end&&(end.nodeType!==8||end.data!==endMarker))end=end.nextSibling;' +\n 'if(end){hit={start:n,end:end};return false;}' +\n '});' +\n 'if(hit)cache.set(id,hit);return hit;' +\n '}' +\n 'function apply(id){' +\n 'if(typeof id!==\"string\"||!id)return;' +\n 'var tpl=findTemplate(id);if(!tpl)return;' +\n 'var b=find(id);if(!b)return;' +\n 'var parent=b.start.parentNode;if(!parent||b.end.parentNode!==parent)return;' +\n 'var cursor=b.start.nextSibling;while(cursor&&cursor!==b.end)cursor=cursor.nextSibling;if(cursor!==b.end)return;' +\n 'var content=tpl.content;var ns=tpl.getAttribute(\"data-fict-patch-namespace\");' +\n 'if(ns){var tag=ns===\"svg\"?\"svg\":ns===\"mathml\"?\"math\":null;var wrapper=content.firstElementChild;if(!tag||!wrapper||wrapper.localName!==tag)return;var fragment=document.createDocumentFragment();while(wrapper.firstChild)fragment.appendChild(wrapper.firstChild);content=fragment;}' +\n 'var node=b.start.nextSibling;' +\n 'while(node&&node!==b.end){var next=node.nextSibling;node.parentNode&&node.parentNode.removeChild(node);node=next;}' +\n 'parent.insertBefore(content,b.end);' +\n 'tpl.parentNode&&tpl.parentNode.removeChild(tpl);' +\n '}' +\n 'runtime={apply:apply};window.__FICT_STREAM=runtime;' +\n '}' +\n (observerMode\n ? 'if(runtime.observerInstalled)return;runtime.observerInstalled=true;' +\n 'function scan(root){var ids=[];walk(root,function(n){if(n.nodeType===1&&n.localName===\"template\"&&n.content&&n.hasAttribute(\"data-fict-suspense\")){var id=n.getAttribute(\"data-fict-suspense\");if(id)ids.push(id);}});for(var i=0;i<ids.length;i++)runtime.apply(ids[i]);}' +\n 'if(typeof MutationObserver===\"function\"){new MutationObserver(function(muts){for(var i=0;i<muts.length;i++){for(var j=0;j<muts[i].addedNodes.length;j++){var n=muts[i].addedNodes[j];if(n.nodeType===1)scan(n);}}}).observe(document.documentElement||document,{childList:true,subtree:true});}' +\n 'if(document.readyState===\"loading\"){document.addEventListener(\"DOMContentLoaded\",function(){scan(document);},{once:true});}else{scan(document);}'\n : '') +\n '})();'\n )\n}\n\nexport const FICT_STREAM_RUNTIME_CODE = createStreamRuntimeCode({ observerMode: true })\n"],"mappings":";;;;;;;AAeA,SAAgB,wBAAwB,UAAoC,CAAC,GAAW;CAEtF,OACE,87DAFmB,QAAQ,gBAAgB,OA4CvC,6wBAIA,MACJ;AAEJ;AAEA,MAAa,2BAA2B,wBAAwB,EAAE,cAAc,KAAK,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fictjs/ssr",
3
- "version": "0.26.0",
3
+ "version": "0.27.0",
4
4
  "description": "Fict server-side rendering",
5
5
  "publishConfig": {
6
6
  "access": "public",
@@ -12,17 +12,25 @@
12
12
  "directory": "packages/ssr"
13
13
  },
14
14
  "type": "module",
15
- "main": "dist/index.cjs",
15
+ "main": "dist/index.node.cjs",
16
16
  "module": "dist/index.js",
17
17
  "types": "dist/index.d.ts",
18
18
  "exports": {
19
19
  ".": {
20
20
  "types": "./dist/index.d.ts",
21
+ "node": {
22
+ "import": "./dist/index.node.js",
23
+ "require": "./dist/index.node.cjs"
24
+ },
21
25
  "import": "./dist/index.js",
22
26
  "require": "./dist/index.cjs"
23
27
  },
24
28
  "./experimental": {
25
29
  "types": "./dist/experimental.d.ts",
30
+ "node": {
31
+ "import": "./dist/experimental.node.js",
32
+ "require": "./dist/experimental.node.cjs"
33
+ },
26
34
  "import": "./dist/experimental.js",
27
35
  "require": "./dist/experimental.cjs"
28
36
  },
@@ -38,11 +46,11 @@
38
46
  ],
39
47
  "dependencies": {
40
48
  "linkedom": "^0.18.12",
41
- "@fictjs/runtime": "0.26.0"
49
+ "@fictjs/runtime": "0.27.0"
42
50
  },
43
51
  "devDependencies": {
44
52
  "tsdown": "^0.22.3",
45
- "fict": "0.26.0"
53
+ "fict": "0.27.0"
46
54
  },
47
55
  "keywords": [
48
56
  "fict",
@@ -58,8 +66,10 @@
58
66
  "build:stream-runtime": "node scripts/write-stream-runtime-asset.mjs",
59
67
  "dev": "tsdown --watch --on-success \"pnpm run build:stream-runtime\"",
60
68
  "test": "vitest run",
69
+ "test:node": "node test/node-runtime.smoke.mjs",
61
70
  "test:edge": "node test/edge-runtime.smoke.mjs",
62
- "test:matrix": "pnpm run test && pnpm run test:edge",
71
+ "test:cjs": "node test/cjs-runtime.smoke.cjs",
72
+ "test:matrix": "pnpm run test && pnpm run test:node && pnpm run test:edge && pnpm run test:cjs",
63
73
  "test:coverage": "vitest run --coverage",
64
74
  "lint": "eslint src",
65
75
  "typecheck": "tsc --noEmit",
@@ -1 +0,0 @@
1
- {"version":3,"file":"render-core-BCYvLfHF.d.cts","names":[],"sources":["../src/render-core.ts"],"mappings":";;;UAqBiB,MAAA;EACf,MAAA,EAAQ,MAAA;EACR,QAAA,EAAU,QAAQ;AAAA;AAAA,UAGH,qBAAA;EAHG;;;;EAQlB,GAAA,GAAM,MAAA;EARY;AAAA;AAGpB;;EAUE,QAAA,GAAW,QAAA;EALL;;;EASN,MAAA,GAAS,MAAA;EAoBa;;;EAhBtB,IAAA;EAbA;;;EAiBA,SAAA,GAAY,WAAA;EARZ;;;EAYA,YAAA;EAJY;;;EAQZ,WAAA;EAIsB;;;EAAtB,mBAAA,GAAsB,MAAA;EAkBtB;;;EAdA,gBAAA;EA+BA;;;EA3BA,YAAA;EAoCW;AAGb;;EAnCE,OAAA;EAmCkE;;;;;EA7BlE,aAAA;EA+CW;;;;;;;EAvCX,QAAA,GAAW,MAAA;EA4DI;;;;EAvDf,eAAA;EA2DU;;;EAvDV,gBAAA;EAoDiB;;;;EA/CjB,cAAA;EAiDA;;;EA7CA,WAAA;AAAA;AAAA,UAGe,qBAAA,SAA8B,qBAAqB;EA8CnD;;;;;EAxCf,IAAA;EAqDU;;;EAjDV,YAAA;EA+CA;;;EA3CA,UAAA;EA4CY;;;EAxCZ,OAAA,IAAW,GAAA;EA0CH;;AAAgB;EAtCxB,MAAA,GAAS,WAAA;EAyC6B;;;;EApCtC,aAAA;EAsCA;;;EAlCA,gBAAA;EAmCO;AAQT;;;EAtCE,eAAA;AAAA;AAAA,UAGe,cAAA;EACf,IAAA,GAAO,QAAA,EAAU,MAAA,CAAO,cAAA;EACxB,KAAA,GAAQ,MAAA;EACR,UAAA,EAAY,OAAA;EACZ,QAAA,EAAU,OAAA;AAAA;AAAA,UAGK,sBAAA;EAwCQ;;;;;;EAjCvB,KAAA;EAiCuB;AA8DzB;;EA3FE,MAAA,EAAQ,cAAA,CAAe,UAAA;EACvB,UAAA,EAAY,OAAA;EACZ,QAAA,EAAU,OAAA;EACV,KAAA,GAAQ,MAAA;AAAA;AAAA,UAGO,sBAAA,SAA+B,MAAM;EACpD,IAAA;EACA,SAAA,EAAW,WAAA;EACX,OAAA;AAAA;AAAA,iBAQc,iBAAA,CAAkB,IAAA,YAA8B,MAAM;AAAA,iBAStD,gBAAA,CACd,IAAA,QAAY,QAAA,EACZ,OAAA,GAAS,qBAAA,GACR,sBAAA;AAAA,iBA8Da,cAAA,CAAe,IAAA,QAAY,QAAA,EAAU,OAAA,GAAS,qBAA0B;AAAA,iBAOlE,mBAAA,CACpB,IAAA,QAAY,QAAA,EACZ,OAAA,GAAS,qBAAA,GACR,OAAA;AAAA,iBAIa,cAAA,CACd,IAAA,QAAY,QAAA,EACZ,OAAA,GAAS,qBAAA,GACR,cAAA,CAAe,UAAA;AAAA,iBAgFF,sBAAA,CACd,IAAA,QAAY,QAAA,EACZ,OAAA,GAAS,qBAAA,GACR,cAAA;;;;;iBA8Ba,eAAA,CACd,IAAA,QAAY,QAAA,EACZ,OAAA,GAAS,qBAAA,GACR,sBAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"render-core-BCYvLfHF.d.ts","names":[],"sources":["../src/render-core.ts"],"mappings":";;;UAqBiB,MAAA;EACf,MAAA,EAAQ,MAAA;EACR,QAAA,EAAU,QAAQ;AAAA;AAAA,UAGH,qBAAA;EAHG;;;;EAQlB,GAAA,GAAM,MAAA;EARY;AAAA;AAGpB;;EAUE,QAAA,GAAW,QAAA;EALL;;;EASN,MAAA,GAAS,MAAA;EAoBa;;;EAhBtB,IAAA;EAbA;;;EAiBA,SAAA,GAAY,WAAA;EARZ;;;EAYA,YAAA;EAJY;;;EAQZ,WAAA;EAIsB;;;EAAtB,mBAAA,GAAsB,MAAA;EAkBtB;;;EAdA,gBAAA;EA+BA;;;EA3BA,YAAA;EAoCW;AAGb;;EAnCE,OAAA;EAmCkE;;;;;EA7BlE,aAAA;EA+CW;;;;;;;EAvCX,QAAA,GAAW,MAAA;EA4DI;;;;EAvDf,eAAA;EA2DU;;;EAvDV,gBAAA;EAoDiB;;;;EA/CjB,cAAA;EAiDA;;;EA7CA,WAAA;AAAA;AAAA,UAGe,qBAAA,SAA8B,qBAAqB;EA8CnD;;;;;EAxCf,IAAA;EAqDU;;;EAjDV,YAAA;EA+CA;;;EA3CA,UAAA;EA4CY;;;EAxCZ,OAAA,IAAW,GAAA;EA0CH;;AAAgB;EAtCxB,MAAA,GAAS,WAAA;EAyC6B;;;;EApCtC,aAAA;EAsCA;;;EAlCA,gBAAA;EAmCO;AAQT;;;EAtCE,eAAA;AAAA;AAAA,UAGe,cAAA;EACf,IAAA,GAAO,QAAA,EAAU,MAAA,CAAO,cAAA;EACxB,KAAA,GAAQ,MAAA;EACR,UAAA,EAAY,OAAA;EACZ,QAAA,EAAU,OAAA;AAAA;AAAA,UAGK,sBAAA;EAwCQ;;;;;;EAjCvB,KAAA;EAiCuB;AA8DzB;;EA3FE,MAAA,EAAQ,cAAA,CAAe,UAAA;EACvB,UAAA,EAAY,OAAA;EACZ,QAAA,EAAU,OAAA;EACV,KAAA,GAAQ,MAAA;AAAA;AAAA,UAGO,sBAAA,SAA+B,MAAM;EACpD,IAAA;EACA,SAAA,EAAW,WAAA;EACX,OAAA;AAAA;AAAA,iBAQc,iBAAA,CAAkB,IAAA,YAA8B,MAAM;AAAA,iBAStD,gBAAA,CACd,IAAA,QAAY,QAAA,EACZ,OAAA,GAAS,qBAAA,GACR,sBAAA;AAAA,iBA8Da,cAAA,CAAe,IAAA,QAAY,QAAA,EAAU,OAAA,GAAS,qBAA0B;AAAA,iBAOlE,mBAAA,CACpB,IAAA,QAAY,QAAA,EACZ,OAAA,GAAS,qBAAA,GACR,OAAA;AAAA,iBAIa,cAAA,CACd,IAAA,QAAY,QAAA,EACZ,OAAA,GAAS,qBAAA,GACR,cAAA,CAAe,UAAA;AAAA,iBAgFF,sBAAA,CACd,IAAA,QAAY,QAAA,EACZ,OAAA,GAAS,qBAAA,GACR,cAAA;;;;;iBA8Ba,eAAA,CACd,IAAA,QAAY,QAAA,EACZ,OAAA,GAAS,qBAAA,GACR,sBAAA"}