@lomray/vite-ssr-boost 8.0.0-beta.1 → 8.0.0-beta.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.
Files changed (204) hide show
  1. package/README.md +2 -1
  2. package/adapters/body.d.ts +1 -1
  3. package/adapters/body.js +1 -1
  4. package/adapters/body.js.map +1 -1
  5. package/adapters/compression.d.ts +5 -5
  6. package/adapters/compression.js +1 -1
  7. package/adapters/compression.js.map +1 -1
  8. package/adapters/edge.d.ts +5 -5
  9. package/adapters/edge.js.map +1 -1
  10. package/adapters/express/create-request.d.ts +2 -2
  11. package/adapters/express/create-request.js.map +1 -1
  12. package/adapters/express/entry.d.ts +17 -19
  13. package/adapters/express/entry.js.map +1 -1
  14. package/adapters/express/prepare-server.d.ts +7 -25
  15. package/adapters/express/prepare-server.js +1 -1
  16. package/adapters/express/prepare-server.js.map +1 -1
  17. package/adapters/express/render.d.ts +14 -15
  18. package/adapters/express/render.js +1 -1
  19. package/adapters/express/render.js.map +1 -1
  20. package/adapters/express/server.d.ts +5 -6
  21. package/adapters/express/server.js +1 -1
  22. package/adapters/express/server.js.map +1 -1
  23. package/adapters/express.d.ts +5 -5
  24. package/adapters/express.js.map +1 -1
  25. package/adapters/fastify.d.ts +5 -5
  26. package/adapters/fastify.js +1 -1
  27. package/adapters/fastify.js.map +1 -1
  28. package/adapters/hono.d.ts +2 -2
  29. package/adapters/hono.js.map +1 -1
  30. package/adapters/node.d.ts +6 -5
  31. package/adapters/node.js.map +1 -1
  32. package/browser/entry.d.ts +9 -9
  33. package/browser/entry.js +1 -1
  34. package/browser/entry.js.map +1 -1
  35. package/cli/build.d.ts +2 -2
  36. package/cli/build.js.map +1 -1
  37. package/cli/helpers/keyboard-input.d.ts +1 -1
  38. package/cli/helpers/keyboard-input.js +1 -1
  39. package/cli/helpers/keyboard-input.js.map +1 -1
  40. package/cli/helpers/vite-reset-cache.d.ts +1 -1
  41. package/cli/helpers/vite-reset-cache.js.map +1 -1
  42. package/cli/interfaces/actions.d.ts +8 -9
  43. package/cli/run-amplify-build.d.ts +1 -1
  44. package/cli/run-amplify-build.js.map +1 -1
  45. package/cli/run-dev.d.ts +3 -4
  46. package/cli/run-dev.js.map +1 -1
  47. package/cli/run-docker-build.d.ts +2 -2
  48. package/cli/run-docker-build.js.map +1 -1
  49. package/cli/run-prod.d.ts +4 -5
  50. package/cli/run-prod.js.map +1 -1
  51. package/cli/run-serverless.d.ts +2 -2
  52. package/cli/run-serverless.js.map +1 -1
  53. package/cli/run-vercel-build.d.ts +1 -1
  54. package/cli/run-vercel-build.js.map +1 -1
  55. package/cli.js +1 -1
  56. package/cli.js.map +1 -1
  57. package/components/navigate.d.ts +3 -3
  58. package/components/navigate.js.map +1 -1
  59. package/components/only-client.d.ts +2 -2
  60. package/components/only-client.js +1 -1
  61. package/components/only-client.js.map +1 -1
  62. package/components/render-client.d.ts +4 -4
  63. package/components/render-client.js +1 -1
  64. package/components/render-client.js.map +1 -1
  65. package/components/response-status.d.ts +2 -2
  66. package/components/response-status.js.map +1 -1
  67. package/components/scroll-to-top.d.ts +2 -2
  68. package/components/scroll-to-top.js +1 -1
  69. package/components/scroll-to-top.js.map +1 -1
  70. package/components/with-suspense.d.ts +3 -3
  71. package/components/with-suspense.js.map +1 -1
  72. package/constants/cli-actions.d.ts +1 -1
  73. package/constants/cli-actions.js.map +1 -1
  74. package/constants/cli-context.d.ts +4 -5
  75. package/constants/cli-context.js.map +1 -1
  76. package/constants/cli-name.d.ts +1 -1
  77. package/constants/cli-name.js.map +1 -1
  78. package/constants/cli-shortcuts.d.ts +2 -2
  79. package/constants/cli-shortcuts.js +1 -1
  80. package/constants/cli-shortcuts.js.map +1 -1
  81. package/constants/common.js.map +1 -1
  82. package/constants/plugin-name.d.ts +1 -1
  83. package/constants/plugin-name.js.map +1 -1
  84. package/constants/stream-error.d.ts +1 -1
  85. package/constants/stream-error.js.map +1 -1
  86. package/context/server.d.ts +3 -4
  87. package/context/server.js.map +1 -1
  88. package/core/compose-html.d.ts +2 -2
  89. package/core/compose-html.js.map +1 -1
  90. package/core/early-hints.d.ts +2 -2
  91. package/core/early-hints.js.map +1 -1
  92. package/core/handler.d.ts +3 -3
  93. package/core/handler.js.map +1 -1
  94. package/core/head-response.d.ts +1 -1
  95. package/core/head-response.js.map +1 -1
  96. package/core/headers.d.ts +3 -4
  97. package/core/headers.js +1 -1
  98. package/core/headers.js.map +1 -1
  99. package/core/render.d.ts +13 -13
  100. package/core/render.js +1 -1
  101. package/core/render.js.map +1 -1
  102. package/core/transform-html.d.ts +1 -1
  103. package/core/transform-html.js.map +1 -1
  104. package/core/types.d.ts +2 -3
  105. package/edge/render-to-stream.d.ts +2 -2
  106. package/edge/render-to-stream.js +1 -1
  107. package/edge/render-to-stream.js.map +1 -1
  108. package/helpers/build-custom-state.d.ts +1 -1
  109. package/helpers/build-custom-state.js +1 -1
  110. package/helpers/build-custom-state.js.map +1 -1
  111. package/helpers/build-router-state.d.ts +2 -2
  112. package/helpers/build-router-state.js.map +1 -1
  113. package/helpers/create-focus-only.d.ts +3 -3
  114. package/helpers/create-focus-only.js.map +1 -1
  115. package/helpers/dev-marker.d.ts +1 -1
  116. package/helpers/dev-marker.js.map +1 -1
  117. package/helpers/get-server-state.d.ts +1 -1
  118. package/helpers/get-server-state.js.map +1 -1
  119. package/helpers/html-escape.d.ts +1 -1
  120. package/helpers/html-escape.js +1 -1
  121. package/helpers/html-escape.js.map +1 -1
  122. package/helpers/import-route.d.ts +7 -7
  123. package/helpers/import-route.js +1 -1
  124. package/helpers/import-route.js.map +1 -1
  125. package/helpers/is-route-file.d.ts +1 -1
  126. package/helpers/is-route-file.js.map +1 -1
  127. package/helpers/obtain-stream-error.d.ts +3 -3
  128. package/helpers/obtain-stream-error.js.map +1 -1
  129. package/helpers/plugin-config.d.ts +5 -5
  130. package/helpers/plugin-config.js +1 -1
  131. package/helpers/plugin-config.js.map +1 -1
  132. package/helpers/print-server-info.d.ts +3 -4
  133. package/helpers/print-server-info.js +1 -1
  134. package/helpers/print-server-info.js.map +1 -1
  135. package/helpers/print-server-urls.d.ts +2 -2
  136. package/helpers/print-server-urls.js +1 -1
  137. package/helpers/print-server-urls.js.map +1 -1
  138. package/helpers/process-stop.d.ts +1 -1
  139. package/helpers/process-stop.js.map +1 -1
  140. package/helpers/resolve-server-urls.d.ts +3 -4
  141. package/helpers/resolve-server-urls.js +1 -1
  142. package/helpers/resolve-server-urls.js.map +1 -1
  143. package/helpers/serialize-errors.d.ts +2 -2
  144. package/helpers/serialize-errors.js.map +1 -1
  145. package/helpers/vite-aliases.d.ts +2 -2
  146. package/helpers/vite-aliases.js +1 -1
  147. package/helpers/vite-aliases.js.map +1 -1
  148. package/interfaces/fc-route.d.ts +4 -4
  149. package/interfaces/fc-route.js.map +1 -1
  150. package/interfaces/fc.d.ts +3 -4
  151. package/interfaces/route-object.d.ts +6 -6
  152. package/node/compress-response.d.ts +2 -2
  153. package/node/compress-response.js +1 -1
  154. package/node/compress-response.js.map +1 -1
  155. package/node/create-headers.d.ts +1 -1
  156. package/node/create-headers.js.map +1 -1
  157. package/node/create-request.d.ts +2 -2
  158. package/node/create-request.js.map +1 -1
  159. package/node/http.d.ts +4 -6
  160. package/node/render-to-stream.d.ts +2 -2
  161. package/node/render-to-stream.js +1 -1
  162. package/node/render-to-stream.js.map +1 -1
  163. package/node/request-signal.d.ts +2 -2
  164. package/node/request-signal.js.map +1 -1
  165. package/node/split-link-header.d.ts +1 -1
  166. package/node/split-link-header.js.map +1 -1
  167. package/node/write-early-hints.d.ts +2 -2
  168. package/node/write-early-hints.js.map +1 -1
  169. package/node/write-fetch-response.d.ts +3 -2
  170. package/node/write-fetch-response.js +1 -1
  171. package/node/write-fetch-response.js.map +1 -1
  172. package/package.json +52 -32
  173. package/plugin.d.ts +7 -7
  174. package/plugin.js.map +1 -1
  175. package/plugins/create-spa-index.d.ts +3 -3
  176. package/plugins/create-spa-index.js.map +1 -1
  177. package/plugins/handle-custom-entrypoint.d.ts +4 -4
  178. package/plugins/handle-custom-entrypoint.js +1 -1
  179. package/plugins/handle-custom-entrypoint.js.map +1 -1
  180. package/plugins/make-aliases.d.ts +3 -3
  181. package/plugins/make-aliases.js +1 -1
  182. package/plugins/make-aliases.js.map +1 -1
  183. package/plugins/normalize-route.d.ts +3 -3
  184. package/plugins/normalize-route.js.map +1 -1
  185. package/services/build.d.ts +5 -51
  186. package/services/build.js +1 -1
  187. package/services/build.js.map +1 -1
  188. package/services/logger.d.ts +2 -30
  189. package/services/logger.js.map +1 -1
  190. package/services/parse-routes.d.ts +5 -42
  191. package/services/parse-routes.js +1 -1
  192. package/services/parse-routes.js.map +1 -1
  193. package/services/path-normalize.d.ts +3 -18
  194. package/services/path-normalize.js +1 -1
  195. package/services/path-normalize.js.map +1 -1
  196. package/services/server-api.d.ts +1 -7
  197. package/services/server-api.js.map +1 -1
  198. package/services/server-config.d.ts +4 -48
  199. package/services/server-config.js +1 -1
  200. package/services/server-config.js.map +1 -1
  201. package/services/ssr-manifest.d.ts +6 -63
  202. package/services/ssr-manifest.js +1 -1
  203. package/services/ssr-manifest.js.map +1 -1
  204. package/workflow/Dockerfile +1 -1
@@ -1,5 +1,5 @@
1
- import { FC, ReactNode } from 'react';
2
- import { FCAny } from "../interfaces/fc.js";
1
+ import type { FC, ReactNode } from 'react';
2
+ import type { FCAny } from '../interfaces/fc.js';
3
3
  /**
4
4
  * HOC: Render component only on client side
5
5
  */
@@ -7,5 +7,5 @@ declare const renderClient: <T extends Record<string, any>>(Component: FCAny<T>
7
7
  element: ReactNode;
8
8
  } | {
9
9
  Component: FC | null;
10
- } | undefined) => FC<T>;
11
- export { renderClient as default };
10
+ }) => FC<T>;
11
+ export default renderClient;
@@ -1,2 +1,2 @@
1
- import e from"hoist-non-react-statics";import t,{useState as n,useEffect as o}from"react";const r=(r,m)=>{const l=e=>{const[l,c]=n(!1);return o((()=>{c(!0)}),[]),l&&r?t.createElement(r,{...e}):m&&"element"in m?m.element:m&&"Component"in m&&m.Component?t.createElement(m.Component,null):null};return r&&e(l,r),l};export{r as default};
1
+ import e from"hoist-non-react-statics";import t,{useState as n,useEffect as o}from"react";const r=(r,m)=>{const l=e=>{const[l,c]=n(!1);return o(()=>{c(!0)},[]),l&&r?t.createElement(r,{...e}):m&&"element"in m?m.element:m&&"Component"in m&&m.Component?t.createElement(m.Component,null):null};return r&&e(l,r),l};export{r as default};
2
2
  //# sourceMappingURL=render-client.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"render-client.js","sources":["../../src/components/render-client.tsx"],"sourcesContent":["import hoistNonReactStatics from 'hoist-non-react-statics';\nimport type { FC, ReactNode } from 'react';\nimport React, { useEffect, useState } from 'react';\nimport type { FCAny } from '@interfaces/fc';\n\n/**\n * HOC: Render component only on client side\n */\nconst renderClient = <T extends Record<string, any>>(\n Component: FCAny<T> | null | undefined,\n Fallback?: { element: ReactNode } | { Component: FC | null },\n): FC<T> => {\n const Element: FC<T> = (props) => {\n const [shouldRender, setShouldRender] = useState(false);\n\n useEffect(() => {\n setShouldRender(true);\n }, []);\n\n if (shouldRender && Component) {\n return <Component {...props} />;\n }\n\n if (Fallback && 'element' in Fallback) {\n return Fallback.element;\n }\n\n if (Fallback && 'Component' in Fallback && Fallback.Component) {\n return <Fallback.Component />;\n }\n\n return null;\n };\n\n if (Component) {\n hoistNonReactStatics(Element, Component);\n }\n\n return Element;\n};\n\nexport default renderClient;\n"],"names":["renderClient","Component","Fallback","Element","props","shouldRender","setShouldRender","useState","useEffect","React","createElement","element","hoistNonReactStatics"],"mappings":"0FAQA,MAAMA,EAAe,CACnBC,EACAC,KAEA,MAAMC,EAAkBC,IACtB,MAAOC,EAAcC,GAAmBC,GAAS,GAMjD,OAJAC,GAAU,KACRF,GAAgB,EAAK,GACpB,IAECD,GAAgBJ,EACXQ,EAAAC,cAACT,EAAS,IAAKG,IAGpBF,GAAY,YAAaA,EACpBA,EAASS,QAGdT,GAAY,cAAeA,GAAYA,EAASD,UAC3CQ,EAAAC,cAACR,EAASD,gBAGZ,IAAI,EAOb,OAJIA,GACFW,EAAqBT,EAASF,GAGzBE,CAAO"}
1
+ {"version":3,"file":"render-client.js","sources":["../../src/components/render-client.tsx"],"sourcesContent":[null],"names":["renderClient","Component","Fallback","Element","props","shouldRender","setShouldRender","useState","useEffect","React","createElement","element","hoistNonReactStatics"],"mappings":"0FAQA,MAAMA,EAAe,CACnBC,EACAC,KAEA,MAAMC,EAAkBC,IACtB,MAAOC,EAAcC,GAAmBC,GAAS,GAMjD,OAJAC,EAAU,KACRF,GAAgB,IACf,IAECD,GAAgBJ,EACXQ,EAAAC,cAACT,EAAS,IAAKG,IAGpBF,GAAY,YAAaA,EACpBA,EAASS,QAGdT,GAAY,cAAeA,GAAYA,EAASD,UAC3CQ,EAAAC,cAACR,EAASD,gBAGZ,MAOT,OAJIA,GACFW,EAAqBT,EAASF,GAGzBE"}
@@ -1,4 +1,4 @@
1
- import { FC } from 'react';
1
+ import type { FC } from 'react';
2
2
  interface IStatusGate {
3
3
  status: number;
4
4
  }
@@ -8,4 +8,4 @@ interface IStatusGate {
8
8
  * @constructor
9
9
  */
10
10
  declare const ResponseStatus: FC<IStatusGate>;
11
- export { ResponseStatus as default };
11
+ export default ResponseStatus;
@@ -1 +1 @@
1
- {"version":3,"file":"response-status.js","sources":["../../src/components/response-status.ts"],"sourcesContent":["import type { FC } from 'react';\nimport { useServerContext } from '@context/server';\n\ninterface IStatusGate {\n status: number;\n}\n\n/**\n * Change server response status\n * Example: <ResponseStatus status={400} />\n * @constructor\n */\nconst ResponseStatus: FC<IStatusGate> = ({ status }) => {\n const context = useServerContext();\n\n if (context.isServer) {\n context.response = new Response(null, { status });\n }\n\n return null;\n};\n\nexport default ResponseStatus;\n"],"names":["ResponseStatus","status","context","useServerContext","isServer","response","Response"],"mappings":"wDAYA,MAAMA,EAAkC,EAAGC,aACzC,MAAMC,EAAUC,IAMhB,OAJID,EAAQE,WACVF,EAAQG,SAAW,IAAIC,SAAS,KAAM,CAAEL,YAGnC,IAAI"}
1
+ {"version":3,"file":"response-status.js","sources":["../../src/components/response-status.ts"],"sourcesContent":[null],"names":["ResponseStatus","status","context","useServerContext","isServer","response","Response"],"mappings":"wDAYA,MAAMA,EAAkC,EAAGC,aACzC,MAAMC,EAAUC,IAMhB,OAJID,EAAQE,WACVF,EAAQG,SAAW,IAAIC,SAAS,KAAM,CAAEL,YAGnC"}
@@ -1,4 +1,4 @@
1
- import { FC } from 'react';
1
+ import type { FC } from 'react';
2
2
  interface IScrollToTop {
3
3
  shouldReloadReset?: boolean;
4
4
  }
@@ -7,4 +7,4 @@ interface IScrollToTop {
7
7
  * @constructor
8
8
  */
9
9
  declare const ScrollToTop: FC<IScrollToTop>;
10
- export { ScrollToTop as default };
10
+ export default ScrollToTop;
@@ -1,2 +1,2 @@
1
- import{useRef as r,useEffect as t}from"react";import{useLocation as o}from"react-router";const e=({shouldReloadReset:e=!1})=>{const{pathname:n}=o(),a=r(n);return t((()=>{(e||a.current!==n)&&(a.current=n,window.scrollTo(0,0))}),[n]),null};export{e as default};
1
+ import{useRef as r,useEffect as t}from"react";import{useLocation as o}from"react-router";const e=({shouldReloadReset:e=!1})=>{const{pathname:n}=o(),a=r(n);return t(()=>{(e||a.current!==n)&&(a.current=n,window.scrollTo(0,0))},[n]),null};export{e as default};
2
2
  //# sourceMappingURL=scroll-to-top.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"scroll-to-top.js","sources":["../../src/components/scroll-to-top.tsx"],"sourcesContent":["import type { FC } from 'react';\nimport { useEffect, useRef } from 'react';\nimport { useLocation } from 'react-router';\n\ninterface IScrollToTop {\n shouldReloadReset?: boolean;\n}\n\n/**\n * Scroll page to top on every pathname (url) change\n * @constructor\n */\nconst ScrollToTop: FC<IScrollToTop> = ({ shouldReloadReset = false }) => {\n const { pathname } = useLocation();\n const prev = useRef(pathname);\n\n useEffect(() => {\n if (!shouldReloadReset && prev.current === pathname) {\n return;\n }\n\n prev.current = pathname;\n window.scrollTo(0, 0);\n }, [pathname]);\n\n return null;\n};\n\nexport default ScrollToTop;\n"],"names":["ScrollToTop","shouldReloadReset","pathname","useLocation","prev","useRef","useEffect","current","window","scrollTo"],"mappings":"yFAYA,MAAMA,EAAgC,EAAGC,qBAAoB,MAC3D,MAAMC,SAAEA,GAAaC,IACfC,EAAOC,EAAOH,GAWpB,OATAI,GAAU,MACHL,GAAqBG,EAAKG,UAAYL,KAI3CE,EAAKG,QAAUL,EACfM,OAAOC,SAAS,EAAG,GAAE,GACpB,CAACP,IAEG,IAAI"}
1
+ {"version":3,"file":"scroll-to-top.js","sources":["../../src/components/scroll-to-top.tsx"],"sourcesContent":[null],"names":["ScrollToTop","shouldReloadReset","pathname","useLocation","prev","useRef","useEffect","current","window","scrollTo"],"mappings":"yFAYA,MAAMA,EAAgC,EAAGC,qBAAoB,MAC3D,MAAMC,SAAEA,GAAaC,IACfC,EAAOC,EAAOH,GAWpB,OATAI,EAAU,MACHL,GAAqBG,EAAKG,UAAYL,KAI3CE,EAAKG,QAAUL,EACfM,OAAOC,SAAS,EAAG,KAClB,CAACP,IAEG"}
@@ -1,7 +1,7 @@
1
- import { FC } from 'react';
2
- import { FCAny, FCC } from "../interfaces/fc.js";
1
+ import type { FC } from 'react';
2
+ import type { FCAny, FCC } from '../interfaces/fc.js';
3
3
  /**
4
4
  * HOC: Wrap component in suspense
5
5
  */
6
6
  declare const withSuspense: <T extends Record<string, any>>(Component: FCAny<T>, Suspense: FCC<Record<string, any>>) => FC<T>;
7
- export { withSuspense as default };
7
+ export default withSuspense;
@@ -1 +1 @@
1
- {"version":3,"file":"with-suspense.js","sources":["../../src/components/with-suspense.tsx"],"sourcesContent":["import hoistNonReactStatics from 'hoist-non-react-statics';\nimport type { FC } from 'react';\nimport React from 'react';\nimport type { FCAny, FCC } from '@interfaces/fc';\n\n/**\n * HOC: Wrap component in suspense\n */\nconst withSuspense = <T extends Record<string, any>>(\n Component: FCAny<T>,\n Suspense: FCC<Record<string, any>>,\n): FC<T> => {\n const Element: FC<T> = (props) => (\n <Suspense>\n <Component {...props} />\n </Suspense>\n );\n\n hoistNonReactStatics(Element, Component);\n\n return Element;\n};\n\nexport default withSuspense;\n"],"names":["withSuspense","Component","Suspense","Element","props","React","createElement","hoistNonReactStatics"],"mappings":"4DAQA,MAAMA,EAAe,CACnBC,EACAC,KAEA,MAAMC,EAAkBC,GACtBC,EAAAC,cAACJ,EAAQ,KACPG,EAAAC,cAACL,EAAS,IAAKG,KAMnB,OAFAG,EAAqBJ,EAASF,GAEvBE,CAAO"}
1
+ {"version":3,"file":"with-suspense.js","sources":["../../src/components/with-suspense.tsx"],"sourcesContent":[null],"names":["withSuspense","Component","Suspense","Element","props","React","createElement","hoistNonReactStatics"],"mappings":"4DAQA,MAAMA,EAAe,CACnBC,EACAC,KAEA,MAAMC,EAAkBC,GACtBC,EAAAC,cAACJ,EAAQ,KACPG,EAAAC,cAACL,EAAS,IAAKG,KAMnB,OAFAG,EAAqBJ,EAASF,GAEvBE"}
@@ -7,4 +7,4 @@ declare enum CliActions {
7
7
  start = "start",
8
8
  preview = "preview"
9
9
  }
10
- export { CliActions as default };
10
+ export default CliActions;
@@ -1 +1 @@
1
- {"version":3,"file":"cli-actions.js","sources":["../../src/constants/cli-actions.ts"],"sourcesContent":["enum CliActions {\n dev = 'dev',\n build = 'build',\n buildDocker = 'build-docker',\n buildAmplify = 'build-amplify',\n buildVercel = 'build-vercel',\n start = 'start',\n preview = 'preview',\n}\n\nexport default CliActions;\n"],"names":["CliActions","CliActions$1"],"mappings":"AAAA,IAAKA,GAAL,SAAKA,GACHA,EAAA,IAAA,MACAA,EAAA,MAAA,QACAA,EAAA,YAAA,eACAA,EAAA,aAAA,gBACAA,EAAA,YAAA,eACAA,EAAA,MAAA,QACAA,EAAA,QAAA,SACD,CARD,CAAKA,IAAAA,EAAU,CAAA,IAUf,IAAAC,EAAeD"}
1
+ {"version":3,"file":"cli-actions.js","sources":["../../src/constants/cli-actions.ts"],"sourcesContent":[null],"names":["CliActions","CliActions$1"],"mappings":"AAAA,IAAKA,GAAL,SAAKA,GACHA,EAAA,IAAA,MACAA,EAAA,MAAA,QACAA,EAAA,YAAA,eACAA,EAAA,aAAA,gBACAA,EAAA,YAAA,eACAA,EAAA,MAAA,QACAA,EAAA,QAAA,SACD,CARD,CAAKA,IAAAA,EAAU,CAAA,IAUf,IAAAC,EAAeD"}
@@ -1,7 +1,6 @@
1
- /// <reference types="node" />
2
- import { Server } from 'node:net';
3
- import ServerConfig from "../services/server-config.js";
4
- interface ICliContext {
1
+ import type { Server } from 'node:net';
2
+ import type ServerConfig from '../services/server-config.js';
3
+ export interface ICliContext {
5
4
  isProd?: boolean;
6
5
  server?: Server;
7
6
  config?: ServerConfig;
@@ -11,4 +10,4 @@ interface ICliContext {
11
10
  * Share CLI context
12
11
  */
13
12
  declare const cliContext: ICliContext;
14
- export { cliContext as default, ICliContext };
13
+ export default cliContext;
@@ -1 +1 @@
1
- {"version":3,"file":"cli-context.js","sources":["../../src/constants/cli-context.ts"],"sourcesContent":["import type { Server } from 'node:net';\nimport type ServerConfig from '@services/server-config';\n\nexport interface ICliContext {\n isProd?: boolean;\n server?: Server;\n config?: ServerConfig;\n reboot?: (isPrintInfo?: boolean) => Promise<void>; // reboot dev server\n}\n\n/**\n * Share CLI context\n */\nconst cliContext: ICliContext = {\n isProd: false,\n};\n\nexport default cliContext;\n"],"names":["cliContext","isProd"],"mappings":"AAaA,MAAMA,EAA0B,CAC9BC,QAAQ"}
1
+ {"version":3,"file":"cli-context.js","sources":["../../src/constants/cli-context.ts"],"sourcesContent":[null],"names":["cliContext","isProd"],"mappings":"AAaA,MAAMA,EAA0B,CAC9BC,QAAQ"}
@@ -1,2 +1,2 @@
1
1
  declare const _default: "ssr-boost";
2
- export { _default as default };
2
+ export default _default;
@@ -1 +1 @@
1
- {"version":3,"file":"cli-name.js","sources":["../../src/constants/cli-name.ts"],"sourcesContent":["export default 'ssr-boost';\n"],"names":["cliName"],"mappings":"AAAA,IAAAA,EAAe"}
1
+ {"version":3,"file":"cli-name.js","sources":["../../src/constants/cli-name.ts"],"sourcesContent":[null],"names":["cliName"],"mappings":"AAAA,IAAAA,EAAe"}
@@ -1,6 +1,6 @@
1
- import { IPluginOptions } from "../plugin.js";
1
+ import type { IPluginOptions } from '../plugin.js';
2
2
  /**
3
3
  * Default plugin shortcuts
4
4
  */
5
5
  declare const shortcuts: NonNullable<IPluginOptions['customShortcuts']>;
6
- export { shortcuts as default };
6
+ export default shortcuts;
@@ -1,2 +1,2 @@
1
- import e from"chalk";import r from"../helpers/process-stop.js";const o=async({server:r,config:o})=>{const t=o?.getLogger(),i=await new Promise((e=>{r?.close(e)}));return await(o?.getVite()?.close()),!i||(t?.info(e.red(`failed to stop dev server: ${i}`)),!1)},t=[{key:"r",description:"restart server",action:async r=>{const{reboot:t,config:i}=r,s=i?.getLogger();s?.info(e.yellow("\nrestarting server...")),await o(r)&&(await(t?.(!1)),s?.info(e.green("server restarted successful.")))}},{key:"u",description:"show server url",action({config:e}){e?.getLogger()?.info(""),e?.getVite()?.printUrls()}},{key:"c",description:"clear console",isOnlyDev:!0,action({config:e}){e?.getLogger()?.clearScreen("error")}},{key:"o",description:"open in browser",isOnlyDev:!0,action({config:e}){e?.getVite()?.openBrowser()}},{key:"q",description:"quit",async action(e){await o(e),r()}}];export{t as default};
1
+ import e from"chalk";import r from"../helpers/process-stop.js";const o=async({server:r,config:o})=>{const t=o?.getLogger(),i=await new Promise(e=>{r?.close(e)});return await(o?.getVite()?.close()),!i||(t?.info(e.red(`failed to stop dev server: ${i}`)),!1)},t=[{key:"r",description:"restart server",action:async r=>{const{reboot:t,config:i}=r,s=i?.getLogger();s?.info(e.yellow("\nrestarting server...")),await o(r)&&(await(t?.(!1)),s?.info(e.green("server restarted successful.")))}},{key:"u",description:"show server url",action({config:e}){e?.getLogger()?.info(""),e?.getVite()?.printUrls()}},{key:"c",description:"clear console",isOnlyDev:!0,action({config:e}){e?.getLogger()?.clearScreen("error")}},{key:"o",description:"open in browser",isOnlyDev:!0,action({config:e}){e?.getVite()?.openBrowser()}},{key:"q",description:"quit",async action(e){await o(e),r()}}];export{t as default};
2
2
  //# sourceMappingURL=cli-shortcuts.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cli-shortcuts.js","sources":["../../src/constants/cli-shortcuts.ts"],"sourcesContent":["import chalk from 'chalk';\nimport type { ICliContext } from '@constants/cli-context';\nimport processStop from '@helpers/process-stop';\nimport type { IPluginOptions } from '../plugin';\n\n/**\n * Stop server\n */\nconst stopServer = async ({ server, config }: ICliContext): Promise<boolean> => {\n const Logger = config?.getLogger();\n\n // stop express server\n const err = await new Promise((resolve) => {\n server?.close(resolve);\n });\n\n // stop vite server\n await config?.getVite()?.close();\n\n if (err) {\n Logger?.info(chalk.red(`failed to stop dev server: ${err as string}`));\n\n return false;\n }\n\n return true;\n};\n\n/**\n * Default plugin shortcuts\n */\nconst shortcuts: NonNullable<IPluginOptions['customShortcuts']> = [\n {\n key: 'r',\n description: 'restart server',\n action: async (cliContext) => {\n const { reboot, config } = cliContext;\n const Logger = config?.getLogger();\n\n Logger?.info(chalk.yellow('\\nrestarting server...'));\n\n if (!(await stopServer(cliContext))) {\n return;\n }\n\n await reboot?.(false);\n Logger?.info(chalk.green('server restarted successful.'));\n },\n },\n {\n key: 'u',\n description: 'show server url',\n action({ config }) {\n config?.getLogger()?.info('');\n config?.getVite()?.printUrls();\n },\n },\n {\n key: 'c',\n description: 'clear console',\n isOnlyDev: true,\n action({ config }) {\n config?.getLogger()?.clearScreen('error');\n },\n },\n {\n key: 'o',\n description: 'open in browser',\n isOnlyDev: true,\n action({ config }) {\n config?.getVite()?.openBrowser();\n },\n },\n {\n key: 'q',\n description: 'quit',\n async action(cliContext) {\n await stopServer(cliContext);\n processStop();\n },\n },\n];\n\nexport default shortcuts;\n"],"names":["stopServer","async","server","config","Logger","getLogger","err","Promise","resolve","close","getVite","info","chalk","red","shortcuts","key","description","action","cliContext","reboot","yellow","green","printUrls","isOnlyDev","clearScreen","openBrowser","processStop"],"mappings":"+DAQA,MAAMA,EAAaC,OAASC,SAAQC,aAClC,MAAMC,EAASD,GAAQE,YAGjBC,QAAY,IAAIC,SAASC,IAC7BN,GAAQO,MAAMD,EAAQ,IAMxB,aAFML,GAAQO,WAAWD,UAErBH,IACFF,GAAQO,KAAKC,EAAMC,IAAI,8BAA8BP,OAE9C,EAGE,EAMPQ,EAA4D,CAChE,CACEC,IAAK,IACLC,YAAa,iBACbC,OAAQhB,MAAOiB,IACb,MAAMC,OAAEA,EAAMhB,OAAEA,GAAWe,EACrBd,EAASD,GAAQE,YAEvBD,GAAQO,KAAKC,EAAMQ,OAAO,iCAEdpB,EAAWkB,WAIjBC,KAAS,IACff,GAAQO,KAAKC,EAAMS,MAAM,iCAAgC,GAG7D,CACEN,IAAK,IACLC,YAAa,kBACbC,QAAOd,OAAEA,IACPA,GAAQE,aAAaM,KAAK,IAC1BR,GAAQO,WAAWY,WACrB,GAEF,CACEP,IAAK,IACLC,YAAa,gBACbO,WAAW,EACXN,QAAOd,OAAEA,IACPA,GAAQE,aAAamB,YAAY,QACnC,GAEF,CACET,IAAK,IACLC,YAAa,kBACbO,WAAW,EACXN,QAAOd,OAAEA,IACPA,GAAQO,WAAWe,aACrB,GAEF,CACEV,IAAK,IACLC,YAAa,OACbf,aAAaiB,SACLlB,EAAWkB,GACjBQ,GACF"}
1
+ {"version":3,"file":"cli-shortcuts.js","sources":["../../src/constants/cli-shortcuts.ts"],"sourcesContent":[null],"names":["stopServer","async","server","config","Logger","getLogger","err","Promise","resolve","close","getVite","info","chalk","red","shortcuts","key","description","action","cliContext","reboot","yellow","green","printUrls","isOnlyDev","clearScreen","openBrowser","processStop"],"mappings":"+DAQA,MAAMA,EAAaC,OAASC,SAAQC,aAClC,MAAMC,EAASD,GAAQE,YAGjBC,QAAY,IAAIC,QAASC,IAC7BN,GAAQO,MAAMD,KAMhB,aAFML,GAAQO,WAAWD,UAErBH,IACFF,GAAQO,KAAKC,EAAMC,IAAI,8BAA8BP,OAE9C,IASLQ,EAA4D,CAChE,CACEC,IAAK,IACLC,YAAa,iBACbC,OAAQhB,MAAOiB,IACb,MAAMC,OAAEA,EAAMhB,OAAEA,GAAWe,EACrBd,EAASD,GAAQE,YAEvBD,GAAQO,KAAKC,EAAMQ,OAAO,iCAEdpB,EAAWkB,WAIjBC,KAAS,IACff,GAAQO,KAAKC,EAAMS,MAAM,oCAG7B,CACEN,IAAK,IACLC,YAAa,kBACb,MAAAC,EAAOd,OAAEA,IACPA,GAAQE,aAAaM,KAAK,IAC1BR,GAAQO,WAAWY,WACrB,GAEF,CACEP,IAAK,IACLC,YAAa,gBACbO,WAAW,EACX,MAAAN,EAAOd,OAAEA,IACPA,GAAQE,aAAamB,YAAY,QACnC,GAEF,CACET,IAAK,IACLC,YAAa,kBACbO,WAAW,EACX,MAAAN,EAAOd,OAAEA,IACPA,GAAQO,WAAWe,aACrB,GAEF,CACEV,IAAK,IACLC,YAAa,OACb,YAAMC,CAAOC,SACLlB,EAAWkB,GACjBQ,GACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"common.js","sources":["../../src/constants/common.ts"],"sourcesContent":["/* eslint-disable no-undef */\n// @ts-ignore\nconst IS_SSR_MODE = (typeof __IS_SSR__ === 'undefined' ? true : __IS_SSR__) as boolean; // build in SSR mode?\n\nconst IS_SERVER = typeof window === 'undefined';\n\nexport { IS_SSR_MODE, IS_SERVER };\n"],"names":["IS_SSR_MODE","__IS_SSR__","IS_SERVER","window"],"mappings":"AAEA,MAAMA,EAAqC,oBAAfC,YAAoCA,WAE1DC,EAA8B,oBAAXC"}
1
+ {"version":3,"file":"common.js","sources":["../../src/constants/common.ts"],"sourcesContent":[null],"names":["IS_SSR_MODE","__IS_SSR__","IS_SERVER","window"],"mappings":"AAEA,MAAMA,EAAqC,oBAAfC,YAAoCA,WAE1DC,EAA8B,oBAAXC"}
@@ -1,2 +1,2 @@
1
1
  declare const _default: "@lomray/vite-ssr-boost";
2
- export { _default as default };
2
+ export default _default;
@@ -1 +1 @@
1
- {"version":3,"file":"plugin-name.js","sources":["../../src/constants/plugin-name.ts"],"sourcesContent":["export default '@lomray/vite-ssr-boost';\n"],"names":["PLUGIN_NAME"],"mappings":"AAAA,IAAAA,EAAe"}
1
+ {"version":3,"file":"plugin-name.js","sources":["../../src/constants/plugin-name.ts"],"sourcesContent":[null],"names":["PLUGIN_NAME"],"mappings":"AAAA,IAAAA,EAAe"}
@@ -8,4 +8,4 @@ declare enum StreamError {
8
8
  RenderSkip = "skip",
9
9
  Unknown = "unknown"
10
10
  }
11
- export { StreamError as default };
11
+ export default StreamError;
@@ -1 +1 @@
1
- {"version":3,"file":"stream-error.js","sources":["../../src/constants/stream-error.ts"],"sourcesContent":["/**\n * React stream errors\n */\nenum StreamError {\n RenderAborted = 'aborted',\n RenderTimeout = 'timeout',\n RenderCancel = 'cancel',\n RenderSkip = 'skip',\n Unknown = 'unknown',\n}\n\nexport default StreamError;\n"],"names":["StreamError","StreamError$1"],"mappings":"AAGA,IAAKA,GAAL,SAAKA,GACHA,EAAA,cAAA,UACAA,EAAA,cAAA,UACAA,EAAA,aAAA,SACAA,EAAA,WAAA,OACAA,EAAA,QAAA,SACD,CAND,CAAKA,IAAAA,EAAW,CAAA,IAQhB,IAAAC,EAAeD"}
1
+ {"version":3,"file":"stream-error.js","sources":["../../src/constants/stream-error.ts"],"sourcesContent":[null],"names":["StreamError","StreamError$1"],"mappings":"AAGA,IAAKA,GAAL,SAAKA,GACHA,EAAA,cAAA,UACAA,EAAA,cAAA,UACAA,EAAA,aAAA,SACAA,EAAA,WAAA,OACAA,EAAA,QAAA,SACD,CAND,CAAKA,IAAAA,EAAW,CAAA,IAQhB,IAAAC,EAAeD"}
@@ -1,7 +1,6 @@
1
- /// <reference types="react" />
1
+ import type { FC, PropsWithChildren } from 'react';
2
2
  import React from 'react';
3
- import { FC, PropsWithChildren } from "react";
4
- interface IServerContext {
3
+ export interface IServerContext {
5
4
  response: Response | null;
6
5
  isServer: boolean;
7
6
  basename?: string;
@@ -19,4 +18,4 @@ interface IServerProvider {
19
18
  */
20
19
  declare const ServerProvider: FC<PropsWithChildren<IServerProvider>>;
21
20
  declare const useServerContext: () => IServerContext;
22
- export { IServerContext, ServerContext, ServerProvider, useServerContext };
21
+ export { ServerContext, ServerProvider, useServerContext };
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sources":["../../src/context/server.tsx"],"sourcesContent":["import type { FC, PropsWithChildren } from 'react';\nimport React, { useContext } from 'react';\n\nexport interface IServerContext {\n response: Response | null;\n isServer: boolean;\n basename?: string;\n}\n\nconst initState = {\n response: null,\n isServer: false,\n};\n\n/**\n * Server application context\n */\nconst ServerContext = React.createContext<IServerContext>(initState);\n\ninterface IServerProvider {\n context: IServerContext;\n}\n\n/**\n * Server application context provider\n * @constructor\n */\nconst ServerProvider: FC<PropsWithChildren<IServerProvider>> = ({ children, context }) => (\n <ServerContext.Provider value={context} children={children} />\n);\n\nconst useServerContext = (): IServerContext => useContext(ServerContext);\n\nexport { ServerContext, ServerProvider, useServerContext };\n"],"names":["ServerContext","React","createContext","response","isServer","ServerProvider","children","context","createElement","Provider","value","useServerContext","useContext"],"mappings":"sCASA,MAQMA,EAAgBC,EAAMC,cARV,CAChBC,SAAU,KACVC,UAAU,IAgBNC,EAAyD,EAAGC,WAAUC,aAC1EN,EAAAO,cAACR,EAAcS,SAAQ,CAACC,MAAOH,EAASD,SAAUA,IAG9CK,EAAmB,IAAsBC,EAAWZ"}
1
+ {"version":3,"file":"server.js","sources":["../../src/context/server.tsx"],"sourcesContent":[null],"names":["ServerContext","React","createContext","response","isServer","ServerProvider","children","context","createElement","Provider","value","useServerContext","useContext"],"mappings":"sCASA,MAQMA,EAAgBC,EAAMC,cARV,CAChBC,SAAU,KACVC,UAAU,IAgBNC,EAAyD,EAAGC,WAAUC,aAC1EN,EAAAO,cAACR,EAAcS,SAAQ,CAACC,MAAOH,EAASD,SAAUA,IAG9CK,EAAmB,IAAsBC,EAAWZ"}
@@ -1,5 +1,5 @@
1
1
  /**
2
2
  * Stream the shell, React body and hydration footer under downstream backpressure.
3
3
  */
4
- declare const composeHtml: (header: string, body: ReadableStream<Uint8Array>, footer: string, abort?: ((reason?: unknown) => void) | undefined, onComplete?: () => void) => ReadableStream<Uint8Array>;
5
- export { composeHtml as default };
4
+ declare const composeHtml: (header: string, body: ReadableStream<Uint8Array>, footer: string, abort?: (reason?: unknown) => void, onComplete?: () => void) => ReadableStream<Uint8Array>;
5
+ export default composeHtml;
@@ -1 +1 @@
1
- {"version":3,"file":"compose-html.js","sources":["../../src/core/compose-html.ts"],"sourcesContent":["/**\n * Stream the shell, React body and hydration footer under downstream backpressure.\n */\nconst composeHtml = (\n header: string,\n body: ReadableStream<Uint8Array>,\n footer: string,\n abort?: (reason?: unknown) => void,\n onComplete?: () => void,\n): ReadableStream<Uint8Array> => {\n const encoder = new TextEncoder();\n const reader = body.getReader();\n let phase: 'body' | 'footer' | 'header' = 'header';\n\n return new ReadableStream<Uint8Array>({\n /**\n * Release the React reader when the response consumer cancels.\n */\n cancel: async (reason) => {\n abort?.(reason);\n\n if (phase === 'footer') {\n return;\n }\n\n try {\n await reader.cancel(reason);\n } finally {\n reader.releaseLock();\n onComplete?.();\n }\n },\n\n /**\n * Emit one available shell or React chunk per downstream pull.\n */\n async pull(controller) {\n if (phase === 'header') {\n phase = 'body';\n\n if (header) {\n controller.enqueue(encoder.encode(header));\n\n return;\n }\n }\n\n if (phase === 'body') {\n let chunk: ReadableStreamReadResult<Uint8Array>;\n\n try {\n chunk = await reader.read();\n } catch (error) {\n abort?.(error);\n reader.releaseLock();\n onComplete?.();\n controller.error(error);\n\n return;\n }\n\n if (!chunk.done) {\n controller.enqueue(chunk.value);\n\n return;\n }\n\n phase = 'footer';\n reader.releaseLock();\n onComplete?.();\n }\n\n if (footer) {\n controller.enqueue(encoder.encode(footer));\n }\n\n controller.close();\n },\n });\n};\n\nexport default composeHtml;\n"],"names":["composeHtml","header","body","footer","abort","onComplete","encoder","TextEncoder","reader","getReader","phase","ReadableStream","cancel","async","reason","releaseLock","controller","enqueue","encode","chunk","read","error","done","value","close"],"mappings":"AAGA,MAAMA,EAAc,CAClBC,EACAC,EACAC,EACAC,EACAC,KAEA,MAAMC,EAAU,IAAIC,YACdC,EAASN,EAAKO,YACpB,IAAIC,EAAsC,SAE1C,OAAO,IAAIC,eAA2B,CAIpCC,OAAQC,MAAOC,IAGb,GAFAV,IAAQU,GAEM,WAAVJ,EAIJ,UACQF,EAAOI,OAAOE,EACtB,SACEN,EAAOO,cACPV,KACF,GAMFQ,WAAWG,GACT,GAAc,WAAVN,IACFA,EAAQ,OAEJT,GACFe,EAAWC,QAAQX,EAAQY,OAAOjB,QAJtC,CAUA,GAAc,SAAVS,EAAkB,CACpB,IAAIS,EAEJ,IACEA,QAAcX,EAAOY,MACvB,CAAE,MAAOC,GAMP,OALAjB,IAAQiB,GACRb,EAAOO,cACPV,WACAW,EAAWK,MAAMA,EAGnB,CAEA,IAAKF,EAAMG,KAGT,YAFAN,EAAWC,QAAQE,EAAMI,OAK3Bb,EAAQ,SACRF,EAAOO,cACPV,KACF,CAEIF,GACFa,EAAWC,QAAQX,EAAQY,OAAOf,IAGpCa,EAAWQ,OA/BX,CAgCF,GACA"}
1
+ {"version":3,"file":"compose-html.js","sources":["../../src/core/compose-html.ts"],"sourcesContent":[null],"names":["composeHtml","header","body","footer","abort","onComplete","encoder","TextEncoder","reader","getReader","phase","ReadableStream","cancel","async","reason","releaseLock","pull","controller","enqueue","encode","chunk","read","error","done","value","close"],"mappings":"AAGA,MAAMA,EAAc,CAClBC,EACAC,EACAC,EACAC,EACAC,KAEA,MAAMC,EAAU,IAAIC,YACdC,EAASN,EAAKO,YACpB,IAAIC,EAAsC,SAE1C,OAAO,IAAIC,eAA2B,CAIpCC,OAAQC,MAAOC,IAGb,GAFAV,IAAQU,GAEM,WAAVJ,EAIJ,UACQF,EAAOI,OAAOE,EACtB,SACEN,EAAOO,cACPV,KACF,GAMF,UAAMW,CAAKC,GACT,GAAc,WAAVP,IACFA,EAAQ,OAEJT,GACFgB,EAAWC,QAAQZ,EAAQa,OAAOlB,QAJtC,CAUA,GAAc,SAAVS,EAAkB,CACpB,IAAIU,EAEJ,IACEA,QAAcZ,EAAOa,MACvB,CAAE,MAAOC,GAMP,OALAlB,IAAQkB,GACRd,EAAOO,cACPV,WACAY,EAAWK,MAAMA,EAGnB,CAEA,IAAKF,EAAMG,KAGT,YAFAN,EAAWC,QAAQE,EAAMI,OAK3Bd,EAAQ,SACRF,EAAOO,cACPV,KACF,CAEIF,GACFc,EAAWC,QAAQZ,EAAQa,OAAOhB,IAGpCc,EAAWQ,OA/BX,CAgCF"}
@@ -1,6 +1,6 @@
1
- import { ISsrExecutionContext } from "./types.js";
1
+ import type { ISsrExecutionContext } from './types.js';
2
2
  /**
3
3
  * Emit informational headers when the runtime supports early hints.
4
4
  */
5
5
  declare const emitEarlyHints: (context: ISsrExecutionContext | undefined, headers: Headers) => Promise<void>;
6
- export { emitEarlyHints as default };
6
+ export default emitEarlyHints;
@@ -1 +1 @@
1
- {"version":3,"file":"early-hints.js","sources":["../../src/core/early-hints.ts"],"sourcesContent":["import type { ISsrExecutionContext } from '@core/types';\n\n/**\n * Emit informational headers when the runtime supports early hints.\n */\nconst emitEarlyHints = async (\n context: ISsrExecutionContext | undefined,\n headers: Headers,\n): Promise<void> => {\n await context?.onEarlyHints?.(headers);\n};\n\nexport default emitEarlyHints;\n"],"names":["emitEarlyHints","async","context","headers","onEarlyHints"],"mappings":"AAKA,MAAMA,EAAiBC,MACrBC,EACAC,WAEMD,GAASE,eAAeD,GAAQ"}
1
+ {"version":3,"file":"early-hints.js","sources":["../../src/core/early-hints.ts"],"sourcesContent":[null],"names":["emitEarlyHints","async","context","headers","onEarlyHints"],"mappings":"AAKA,MAAMA,EAAiBC,MACrBC,EACAC,WAEMD,GAASE,eAAeD"}
package/core/handler.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { ICoreRenderOptions, ICoreRenderParams } from "./render.js";
2
- import { ISsrExecutionContext, TSsrHandler } from "./types.js";
1
+ import type { ICoreRenderOptions, ICoreRenderParams } from './render.js';
2
+ import type { ISsrExecutionContext, TSsrHandler } from './types.js';
3
3
  interface IHtmlShell {
4
4
  footer: string;
5
5
  header: string;
@@ -27,4 +27,4 @@ interface ICreateHandlerOptions<TAppProps> extends ICoreRenderOptions<TAppProps>
27
27
  */
28
28
  declare const createHandler: <TAppProps = Record<string, any>>(params: ICoreRenderParams<TAppProps>, { getHtml, onRequest, ...options }: ICreateHandlerOptions<TAppProps>) => TSsrHandler;
29
29
  export type { ICreateHandlerOptions, IHtmlShell, IRequestInit };
30
- export { createHandler as default };
30
+ export default createHandler;
@@ -1 +1 @@
1
- {"version":3,"file":"handler.js","sources":["../../src/core/handler.ts"],"sourcesContent":["import headResponse from '@core/head-response';\nimport render from '@core/render';\nimport type { ICoreRenderOptions, ICoreRenderParams, ISsrRequestContext } from '@core/render';\nimport type { ISsrExecutionContext, TSsrHandler } from '@core/types';\n\ninterface IHtmlShell {\n footer: string;\n header: string;\n}\n\ninterface IRequestInit<TAppProps> {\n appProps?: TAppProps;\n headers?: HeadersInit;\n status?: number;\n}\n\ninterface ICreateHandlerOptions<TAppProps> extends ICoreRenderOptions<TAppProps> {\n /**\n * Supply the document shell, including the application's browser entry script.\n */\n getHtml: (request: Request) => IHtmlShell | Promise<IHtmlShell>;\n\n /**\n * Initialize request metadata or return a Response to bypass rendering.\n */\n onRequest?: (params: {\n executionContext?: ISsrExecutionContext;\n request: Request;\n }) => IRequestInit<TAppProps> | Promise<IRequestInit<TAppProps> | Response> | Response;\n}\n\n/**\n * Create isolated request state and allow request hooks to bypass rendering.\n */\nconst createHandler = <TAppProps = Record<string, any>>(\n params: ICoreRenderParams<TAppProps>,\n { getHtml, onRequest, ...options }: ICreateHandlerOptions<TAppProps>,\n): TSsrHandler => {\n /**\n * Build fresh context for this request before invoking the renderer.\n */\n return async (request, executionContext) => {\n const requestInit = await onRequest?.({ executionContext, request });\n\n if (requestInit instanceof Response) {\n return headResponse(request, requestInit);\n }\n\n const context: ISsrRequestContext<TAppProps> = {\n appProps: (requestInit?.appProps ?? {}) as NonNullable<TAppProps>,\n html: await getHtml(request),\n request,\n response: {\n headers: new Headers(requestInit?.headers),\n status: requestInit?.status,\n },\n };\n\n return render(params, context, options, executionContext);\n };\n};\n\nexport type { ICreateHandlerOptions, IHtmlShell, IRequestInit };\n\nexport default createHandler;\n"],"names":["createHandler","params","getHtml","onRequest","options","async","request","executionContext","requestInit","Response","headResponse","context","appProps","html","response","headers","Headers","status","render"],"mappings":"6DAkCA,MAAMA,EAAgB,CACpBC,GACEC,UAASC,eAAcC,KAKlBC,MAAOC,EAASC,KACrB,MAAMC,QAAoBL,IAAY,CAAEI,mBAAkBD,aAE1D,GAAIE,aAAuBC,SACzB,OAAOC,EAAaJ,EAASE,GAG/B,MAAMG,EAAyC,CAC7CC,SAAWJ,GAAaI,UAAY,GACpCC,WAAYX,EAAQI,GACpBA,UACAQ,SAAU,CACRC,QAAS,IAAIC,QAAQR,GAAaO,SAClCE,OAAQT,GAAaS,SAIzB,OAAOC,EAAOjB,EAAQU,EAASP,EAASG,EAAiB"}
1
+ {"version":3,"file":"handler.js","sources":["../../src/core/handler.ts"],"sourcesContent":[null],"names":["createHandler","params","getHtml","onRequest","options","async","request","executionContext","requestInit","Response","headResponse","context","appProps","html","response","headers","Headers","status","render"],"mappings":"6DAkCA,MAAMA,EAAgB,CACpBC,GACEC,UAASC,eAAcC,KAKlBC,MAAOC,EAASC,KACrB,MAAMC,QAAoBL,IAAY,CAAEI,mBAAkBD,aAE1D,GAAIE,aAAuBC,SACzB,OAAOC,EAAaJ,EAASE,GAG/B,MAAMG,EAAyC,CAC7CC,SAAWJ,GAAaI,UAAY,GACpCC,WAAYX,EAAQI,GACpBA,UACAQ,SAAU,CACRC,QAAS,IAAIC,QAAQR,GAAaO,SAClCE,OAAQT,GAAaS,SAIzB,OAAOC,EAAOjB,EAAQU,EAASP,EAASG"}
@@ -2,4 +2,4 @@
2
2
  * Preserve GET metadata while releasing a body that cannot be sent for HEAD.
3
3
  */
4
4
  declare const headResponse: (request: Request, response: Response) => Promise<Response>;
5
- export { headResponse as default };
5
+ export default headResponse;
@@ -1 +1 @@
1
- {"version":3,"file":"head-response.js","sources":["../../src/core/head-response.ts"],"sourcesContent":["/**\n * Preserve GET metadata while releasing a body that cannot be sent for HEAD.\n */\nconst headResponse = async (request: Request, response: Response): Promise<Response> => {\n if (request.method !== 'HEAD' || !response.body) {\n return response;\n }\n\n await response.body.cancel();\n\n return new Response(null, {\n headers: response.headers,\n status: response.status,\n statusText: response.statusText,\n });\n};\n\nexport default headResponse;\n"],"names":["headResponse","async","request","response","method","body","cancel","Response","headers","status","statusText"],"mappings":"AAGA,MAAMA,EAAeC,MAAOC,EAAkBC,IACrB,SAAnBD,EAAQE,QAAsBD,EAASE,YAIrCF,EAASE,KAAKC,SAEb,IAAIC,SAAS,KAAM,CACxBC,QAASL,EAASK,QAClBC,OAAQN,EAASM,OACjBC,WAAYP,EAASO,cARdP"}
1
+ {"version":3,"file":"head-response.js","sources":["../../src/core/head-response.ts"],"sourcesContent":[null],"names":["headResponse","async","request","response","method","body","cancel","Response","headers","status","statusText"],"mappings":"AAGA,MAAMA,EAAeC,MAAOC,EAAkBC,IACrB,SAAnBD,EAAQE,QAAsBD,EAASE,YAIrCF,EAASE,KAAKC,SAEb,IAAIC,SAAS,KAAM,CACxBC,QAASL,EAASK,QAClBC,OAAQN,EAASM,OACjBC,WAAYP,EAASO,cARdP"}
package/core/headers.d.ts CHANGED
@@ -1,13 +1,12 @@
1
1
  /**
2
2
  * Enumerate ordinary headers without combining independent Set-Cookie values.
3
3
  */
4
- declare const getHeaderEntries: (headers: Headers) => [string, string][];
4
+ export declare const getHeaderEntries: (headers: Headers) => [string, string][];
5
5
  /**
6
6
  * Read cookies without splitting commas inside Expires attributes.
7
7
  */
8
- declare const getSetCookieHeaders: (headers: Headers) => string[];
8
+ export declare const getSetCookieHeaders: (headers: Headers) => string[];
9
9
  /**
10
10
  * Response headers override hook headers, while every Set-Cookie remains independent.
11
11
  */
12
- declare const mergeResponseHeaders: (response: Response, base: Headers) => Response;
13
- export { getHeaderEntries, getSetCookieHeaders, mergeResponseHeaders };
12
+ export declare const mergeResponseHeaders: (response: Response, base: Headers) => Response;
package/core/headers.js CHANGED
@@ -1,2 +1,2 @@
1
- const e=e=>{const t=[];return e.forEach(((e,s)=>{"set-cookie"!==s.toLowerCase()&&t.push([s,e])})),t},t=e=>e.getSetCookie(),s=(s,o)=>{const a=new Headers(o);return e(s.headers).forEach((([e,t])=>a.set(e,t))),t(s.headers).forEach((e=>a.append("Set-Cookie",e))),new Response(s.body,{headers:a,status:s.status,statusText:s.statusText})};export{e as getHeaderEntries,t as getSetCookieHeaders,s as mergeResponseHeaders};
1
+ const e=e=>{const t=[];return e.forEach((e,s)=>{"set-cookie"!==s.toLowerCase()&&t.push([s,e])}),t},t=e=>e.getSetCookie(),s=(s,o)=>{const a=new Headers(o);return e(s.headers).forEach(([e,t])=>a.set(e,t)),t(s.headers).forEach(e=>a.append("Set-Cookie",e)),new Response(s.body,{headers:a,status:s.status,statusText:s.statusText})};export{e as getHeaderEntries,t as getSetCookieHeaders,s as mergeResponseHeaders};
2
2
  //# sourceMappingURL=headers.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"headers.js","sources":["../../src/core/headers.ts"],"sourcesContent":["/**\n * Enumerate ordinary headers without combining independent Set-Cookie values.\n */\nexport const getHeaderEntries = (headers: Headers): [string, string][] => {\n const entries: [string, string][] = [];\n\n headers.forEach((value, name) => {\n if (name.toLowerCase() !== 'set-cookie') {\n entries.push([name, value]);\n }\n });\n\n return entries;\n};\n\n/**\n * Read cookies without splitting commas inside Expires attributes.\n */\nexport const getSetCookieHeaders = (headers: Headers): string[] => headers.getSetCookie();\n\n/**\n * Response headers override hook headers, while every Set-Cookie remains independent.\n */\nexport const mergeResponseHeaders = (response: Response, base: Headers): Response => {\n const headers = new Headers(base);\n\n getHeaderEntries(response.headers).forEach(([name, value]) => headers.set(name, value));\n getSetCookieHeaders(response.headers).forEach((cookie) => headers.append('Set-Cookie', cookie));\n\n return new Response(response.body, {\n headers,\n status: response.status,\n statusText: response.statusText,\n });\n};\n"],"names":["getHeaderEntries","headers","entries","forEach","value","name","toLowerCase","push","getSetCookieHeaders","getSetCookie","mergeResponseHeaders","response","base","Headers","set","cookie","append","Response","body","status","statusText"],"mappings":"AAGO,MAAMA,EAAoBC,IAC/B,MAAMC,EAA8B,GAQpC,OANAD,EAAQE,SAAQ,CAACC,EAAOC,KACK,eAAvBA,EAAKC,eACPJ,EAAQK,KAAK,CAACF,EAAMD,GACtB,IAGKF,CAAO,EAMHM,EAAuBP,GAA+BA,EAAQQ,eAK9DC,EAAuB,CAACC,EAAoBC,KACvD,MAAMX,EAAU,IAAIY,QAAQD,GAK5B,OAHAZ,EAAiBW,EAASV,SAASE,SAAQ,EAAEE,EAAMD,KAAWH,EAAQa,IAAIT,EAAMD,KAChFI,EAAoBG,EAASV,SAASE,SAASY,GAAWd,EAAQe,OAAO,aAAcD,KAEhF,IAAIE,SAASN,EAASO,KAAM,CACjCjB,UACAkB,OAAQR,EAASQ,OACjBC,WAAYT,EAASS,YACrB"}
1
+ {"version":3,"file":"headers.js","sources":["../../src/core/headers.ts"],"sourcesContent":[null],"names":["getHeaderEntries","headers","entries","forEach","value","name","toLowerCase","push","getSetCookieHeaders","getSetCookie","mergeResponseHeaders","response","base","Headers","set","cookie","append","Response","body","status","statusText"],"mappings":"AAGO,MAAMA,EAAoBC,IAC/B,MAAMC,EAA8B,GAQpC,OANAD,EAAQE,QAAQ,CAACC,EAAOC,KACK,eAAvBA,EAAKC,eACPJ,EAAQK,KAAK,CAACF,EAAMD,MAIjBF,GAMIM,EAAuBP,GAA+BA,EAAQQ,eAK9DC,EAAuB,CAACC,EAAoBC,KACvD,MAAMX,EAAU,IAAIY,QAAQD,GAK5B,OAHAZ,EAAiBW,EAASV,SAASE,QAAQ,EAAEE,EAAMD,KAAWH,EAAQa,IAAIT,EAAMD,IAChFI,EAAoBG,EAASV,SAASE,QAASY,GAAWd,EAAQe,OAAO,aAAcD,IAEhF,IAAIE,SAASN,EAASO,KAAM,CACjCjB,UACAkB,OAAQR,EAASQ,OACjBC,WAAYT,EAASS"}
package/core/render.d.ts CHANGED
@@ -1,10 +1,10 @@
1
- import { ReactNode } from 'react';
2
- import { StaticHandler, StaticHandlerContext } from 'react-router';
3
- import StreamError from "../constants/stream-error.js";
4
- import { IServerContext } from "../context/server.js";
5
- import { ISsrExecutionContext } from "./types.js";
6
- import { IObtainStreamErrorOut } from "../helpers/obtain-stream-error.js";
7
- interface ISsrRequestContext<TAppProps = Record<string, any>> {
1
+ import type { ReactNode } from 'react';
2
+ import type { StaticHandler, StaticHandlerContext } from 'react-router';
3
+ import StreamError from '../constants/stream-error.js';
4
+ import type { IServerContext } from '../context/server.js';
5
+ import type { ISsrExecutionContext } from './types.js';
6
+ import type { IObtainStreamErrorOut } from '../helpers/obtain-stream-error.js';
7
+ export interface ISsrRequestContext<TAppProps = Record<string, any>> {
8
8
  appProps: NonNullable<TAppProps>;
9
9
  /**
10
10
  * First render failure, or the explicit timeout/cancellation classification.
@@ -26,11 +26,11 @@ interface ISsrRequestContext<TAppProps = Record<string, any>> {
26
26
  routerContext?: StaticHandlerContext;
27
27
  serverContext?: IServerContext;
28
28
  }
29
- interface IRenderStreamOptions {
29
+ export interface IRenderStreamOptions {
30
30
  onError: (error: unknown) => void;
31
31
  signal: AbortSignal;
32
32
  }
33
- interface IRenderStream {
33
+ export interface IRenderStream {
34
34
  /**
35
35
  * Settles after all suspended content completes or rendering is aborted.
36
36
  */
@@ -49,13 +49,13 @@ interface IRenderStream {
49
49
  start: () => void;
50
50
  stream: ReadableStream<Uint8Array>;
51
51
  }
52
- type TRenderToStream = (node: ReactNode, options: IRenderStreamOptions) => IRenderStream | Promise<IRenderStream>;
53
- interface ICoreRenderParams<TAppProps = Record<string, any>> {
52
+ export type TRenderToStream = (node: ReactNode, options: IRenderStreamOptions) => IRenderStream | Promise<IRenderStream>;
53
+ export interface ICoreRenderParams<TAppProps = Record<string, any>> {
54
54
  createApp: (children: ReactNode, context: ISsrRequestContext<TAppProps>) => ReactNode;
55
55
  handler: StaticHandler;
56
56
  renderToStream: TRenderToStream;
57
57
  }
58
- interface ICoreRenderOptions<TAppProps = Record<string, any>> {
58
+ export interface ICoreRenderOptions<TAppProps = Record<string, any>> {
59
59
  /**
60
60
  * React rendering deadline in milliseconds, starting after router preparation.
61
61
  */
@@ -98,4 +98,4 @@ interface ICoreRenderOptions<TAppProps = Record<string, any>> {
98
98
  * Coordinate router queries, React rendering and the final Fetch response.
99
99
  */
100
100
  declare const render: <TAppProps>({ createApp, handler, renderToStream }: ICoreRenderParams<TAppProps>, context: ISsrRequestContext<TAppProps>, { abortDelay, getState, onError, onResponse, onRouterReady, onShellError, onShellReady, prepare, routerRequestContext, }: ICoreRenderOptions<TAppProps>, executionContext?: ISsrExecutionContext) => Promise<Response>;
101
- export { render as default, ISsrRequestContext, IRenderStreamOptions, IRenderStream, TRenderToStream, ICoreRenderParams, ICoreRenderOptions };
101
+ export default render;
package/core/render.js CHANGED
@@ -1,2 +1,2 @@
1
- import e from"react";import{createStaticRouter as t,StaticRouterProvider as r}from"react-router";import o from"../constants/stream-error.js";import{ServerProvider as s}from"../context/server.js";import a from"./compose-html.js";import n from"./head-response.js";import{mergeResponseHeaders as c}from"./headers.js";import d from"./transform-html.js";import l from"../helpers/build-custom-state.js";import u from"../helpers/build-router-state.js";import i from"../helpers/obtain-stream-error.js";const m="text/html",h="Content-Type",p=async({createApp:p,handler:x,renderToStream:f},R,{abortDelay:C=15e3,getState:w,onError:E,onResponse:y,onRouterReady:b,onShellError:q,onShellReady:S,prepare:g,routerRequestContext:v},j)=>{const T=await x.query(R.request,{requestContext:v??R});if(T instanceof Response)return n(R.request,c(T,R.response.headers));R.routerContext=T,await(g?.({context:R,executionContext:j}));const{isStream:A=!0}=await(b?.({context:R}))??{};R.isStream=A,R.serverContext={basename:R.routerContext.basename,isServer:!0,response:null};const H=t(x.dataRoutes,R.routerContext),D=e.createElement(s,{context:R.serverContext},p(e.createElement(r,{router:H,context:R.routerContext,hydrate:!1}),R)),L=new AbortController;let k,B,I=!1;const z=()=>J(R.request.signal.reason),F=()=>clearTimeout(K),G=()=>{F(),R.request.signal.removeEventListener("abort",z)},J=e=>{I||(I=!0,k=e,G(),R.didError??=o.RenderCancel,L.abort(e),B?.abort(e))},K=setTimeout((()=>{R.didError=o.RenderTimeout,J()}),C);R.request.signal.aborted?J(R.request.signal.reason):R.request.signal.addEventListener("abort",z,{once:!0});try{B=await f(D,{onError:e=>{const t=i(e);!I||t.code!==o.RenderAborted&&e!==L.signal.reason||(t.code=R.didError===o.RenderTimeout?o.RenderTimeout:o.RenderCancel);const{code:r}=t;R.didError??=r,E?.({context:R,error:t})},signal:L.signal}),I&&B.abort(k),B.allReady.then(F,F),await(A?B.shellReady:B.allReady)}catch(e){return J(e),await(B?.stream.cancel(e).catch((()=>{}))),((e,t,r)=>{const o=t instanceof Error?t:new Error(String(t)),s=r?.({context:e,error:o})||"<!doctype html><p>Internal Server Error</p>",a=new Headers(e.response.headers);return a.set(h,m),new Response("HEAD"===e.request.method?null:s,{headers:a,status:500})})(R,e,q)}try{const e=R.serverContext.response;if(e&&(M=e,Boolean(M&&M.status>=300&&M.status<400&&M.headers.has("Location"))))return J(),await B.stream.cancel().catch((()=>{})),n(R.request,c(e,R.response.headers));const{header:t,footer:r,headers:o,status:s}=((e,{getState:t,onShellReady:r})=>{const o=e.serverContext.response;e.response.status=o?.status??e.response.status??e.routerContext.statusCode??200,e.response.headers.has(h)||e.response.headers.set(h,m);const s=r?.({context:e})??{},a=u(e.routerContext),n=l(t?.({context:e}));return{header:s.header||e.html.header,footer:a+n+(s.footer||e.html.footer),headers:new Headers(e.response.headers),status:e.response.status}})(R,{getState:w,onShellReady:S});if("HEAD"===R.request.method||[204,205,304].includes(s))return J(),await B.stream.cancel().catch((()=>{})),new Response(null,{headers:o,status:s});const i=a(t,B.stream,r,J,G),p=d(i,y?e=>y({context:R,html:e}):void 0);return B.start(),new Response(p,{headers:o,status:s})}catch(e){throw J(e),B.stream.locked||await B.stream.cancel(e).catch((()=>{})),e}var M};export{p as default};
1
+ import e from"react";import{createStaticRouter as t,StaticRouterProvider as r}from"react-router";import o from"../constants/stream-error.js";import{ServerProvider as s}from"../context/server.js";import a from"./compose-html.js";import n from"./head-response.js";import{mergeResponseHeaders as c}from"./headers.js";import d from"./transform-html.js";import l from"../helpers/build-custom-state.js";import u from"../helpers/build-router-state.js";import i from"../helpers/obtain-stream-error.js";const m="text/html",h="Content-Type",p=async({createApp:p,handler:x,renderToStream:f},R,{abortDelay:C=15e3,getState:w,onError:E,onResponse:y,onRouterReady:b,onShellError:q,onShellReady:S,prepare:g,routerRequestContext:v},j)=>{const T=await x.query(R.request,{requestContext:v??R});if(T instanceof Response)return n(R.request,c(T,R.response.headers));R.routerContext=T,await(g?.({context:R,executionContext:j}));const{isStream:A=!0}=await(b?.({context:R}))??{};R.isStream=A,R.serverContext={basename:R.routerContext.basename,isServer:!0,response:null};const H=t(x.dataRoutes,R.routerContext),D=e.createElement(s,{context:R.serverContext},p(e.createElement(r,{router:H,context:R.routerContext,hydrate:!1}),R)),L=new AbortController;let k,B,I=!1;const z=()=>J(R.request.signal.reason),F=()=>clearTimeout(K),G=()=>{F(),R.request.signal.removeEventListener("abort",z)},J=e=>{I||(I=!0,k=e,G(),R.didError??=o.RenderCancel,L.abort(e),B?.abort(e))},K=setTimeout(()=>{R.didError=o.RenderTimeout,J()},C);R.request.signal.aborted?J(R.request.signal.reason):R.request.signal.addEventListener("abort",z,{once:!0});try{B=await f(D,{onError:e=>{const t=i(e);!I||t.code!==o.RenderAborted&&e!==L.signal.reason||(t.code=R.didError===o.RenderTimeout?o.RenderTimeout:o.RenderCancel);const{code:r}=t;R.didError??=r,E?.({context:R,error:t})},signal:L.signal}),I&&B.abort(k),B.allReady.then(F,F),await(A?B.shellReady:B.allReady)}catch(e){return J(e),await(B?.stream.cancel(e).catch(()=>{})),((e,t,r)=>{const o=t instanceof Error?t:new Error(String(t)),s=r?.({context:e,error:o})||"<!doctype html><p>Internal Server Error</p>",a=new Headers(e.response.headers);return a.set(h,m),new Response("HEAD"===e.request.method?null:s,{headers:a,status:500})})(R,e,q)}try{const e=R.serverContext.response;if(e&&(M=e,Boolean(M&&M.status>=300&&M.status<400&&M.headers.has("Location"))))return J(),await B.stream.cancel().catch(()=>{}),n(R.request,c(e,R.response.headers));const{header:t,footer:r,headers:o,status:s}=((e,{getState:t,onShellReady:r})=>{const o=e.serverContext.response;e.response.status=o?.status??e.response.status??e.routerContext.statusCode??200,e.response.headers.has(h)||e.response.headers.set(h,m);const s=r?.({context:e})??{},a=u(e.routerContext),n=l(t?.({context:e}));return{header:s.header||e.html.header,footer:a+n+(s.footer||e.html.footer),headers:new Headers(e.response.headers),status:e.response.status}})(R,{getState:w,onShellReady:S});if("HEAD"===R.request.method||[204,205,304].includes(s))return J(),await B.stream.cancel().catch(()=>{}),new Response(null,{headers:o,status:s});const i=a(t,B.stream,r,J,G),p=d(i,y?e=>y({context:R,html:e}):void 0);return B.start(),new Response(p,{headers:o,status:s})}catch(e){throw J(e),B.stream.locked||await B.stream.cancel(e).catch(()=>{}),e}var M};export{p as default};
2
2
  //# sourceMappingURL=render.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"render.js","sources":["../../src/core/render.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport React from 'react';\nimport type { StaticHandler, StaticHandlerContext } from 'react-router';\nimport { createStaticRouter, StaticRouterProvider } from 'react-router';\nimport StreamError from '@constants/stream-error';\nimport { ServerProvider } from '@context/server';\nimport type { IServerContext } from '@context/server';\nimport composeHtml from '@core/compose-html';\nimport headResponse from '@core/head-response';\nimport { mergeResponseHeaders } from '@core/headers';\nimport transformHtml from '@core/transform-html';\nimport type { ISsrExecutionContext } from '@core/types';\nimport buildCustomState from '@helpers/build-custom-state';\nimport buildRouterState from '@helpers/build-router-state';\nimport type { IObtainStreamErrorOut } from '@helpers/obtain-stream-error';\nimport obtainStreamError from '@helpers/obtain-stream-error';\n\nexport interface ISsrRequestContext<TAppProps = Record<string, any>> {\n appProps: NonNullable<TAppProps>;\n\n /**\n * First render failure, or the explicit timeout/cancellation classification.\n */\n didError?: StreamError;\n html: { footer: string; header: string };\n isStream?: boolean;\n request: Request;\n\n /**\n * Mutable response metadata shared with request and render hooks.\n */\n response: {\n headers: Headers;\n status?: number;\n };\n routerContext?: StaticHandlerContext;\n serverContext?: IServerContext;\n}\n\nexport interface IRenderStreamOptions {\n onError: (error: unknown) => void;\n signal: AbortSignal;\n}\n\nexport interface IRenderStream {\n /**\n * Settles after all suspended content completes or rendering is aborted.\n */\n allReady: Promise<void>;\n\n /**\n * Stop rendering and settle pending readiness promises.\n */\n abort: (reason?: unknown) => void;\n\n /**\n * Settles when the first shell is available or cannot be produced.\n */\n shellReady: Promise<void>;\n\n /**\n * Begin piping after the core commits its response metadata.\n */\n start: () => void;\n stream: ReadableStream<Uint8Array>;\n}\n\nexport type TRenderToStream = (\n node: ReactNode,\n options: IRenderStreamOptions,\n) => IRenderStream | Promise<IRenderStream>;\n\nexport interface ICoreRenderParams<TAppProps = Record<string, any>> {\n createApp: (children: ReactNode, context: ISsrRequestContext<TAppProps>) => ReactNode;\n handler: StaticHandler;\n renderToStream: TRenderToStream;\n}\n\nexport interface ICoreRenderOptions<TAppProps = Record<string, any>> {\n /**\n * React rendering deadline in milliseconds, starting after router preparation.\n */\n abortDelay?: number;\n getState?: (params: {\n context: ISsrRequestContext<TAppProps>;\n }) => Record<string, Record<string, any>> | undefined | void;\n onError?: (params: {\n context: ISsrRequestContext<TAppProps>;\n error: IObtainStreamErrorOut;\n }) => void;\n onResponse?: (params: {\n context: ISsrRequestContext<TAppProps>;\n html: string;\n }) => string | undefined | void;\n onRouterReady?: (params: {\n context: ISsrRequestContext<TAppProps>;\n }) => Promise<{ isStream?: boolean }> | { isStream?: boolean };\n onShellError?: (params: {\n context: ISsrRequestContext<TAppProps>;\n error: Error;\n }) => string | undefined | void;\n onShellReady?: (params: { context: ISsrRequestContext<TAppProps> }) => {\n footer?: string;\n header?: string;\n };\n prepare?: (params: {\n context: ISsrRequestContext<TAppProps>;\n executionContext?: ISsrExecutionContext;\n }) => Promise<void> | void;\n routerRequestContext?: unknown;\n}\n\ninterface IHtmlResponse {\n header: string;\n footer: string;\n headers: Headers;\n status: number;\n}\n\nconst HTML_CONTENT_TYPE = 'text/html';\nconst CONTENT_TYPE = 'Content-Type';\n\n/**\n * Distinguish navigational redirects from bodyless statuses such as 304.\n */\nconst isRedirect = (response?: Response | null): boolean =>\n Boolean(\n response && response.status >= 300 && response.status < 400 && response.headers.has('Location'),\n );\n\n/**\n * Build a bodyless HEAD or generic 500 response when React cannot produce a shell.\n */\nconst createShellErrorResponse = <TAppProps,>(\n context: ISsrRequestContext<TAppProps>,\n error: unknown,\n onShellError: ICoreRenderOptions<TAppProps>['onShellError'],\n): Response => {\n const shellError = error instanceof Error ? error : new Error(String(error));\n const html =\n onShellError?.({ context, error: shellError }) || '<!doctype html><p>Internal Server Error</p>';\n const headers = new Headers(context.response.headers);\n\n headers.set(CONTENT_TYPE, HTML_CONTENT_TYPE);\n\n return new Response(context.request.method === 'HEAD' ? null : html, {\n headers,\n status: 500,\n });\n};\n\n/**\n * Prepare the document shell and let hooks finalize response metadata synchronously.\n */\nconst prepareHtmlResponse = <TAppProps,>(\n context: ISsrRequestContext<TAppProps>,\n { getState, onShellReady }: ICoreRenderOptions<TAppProps>,\n): IHtmlResponse => {\n const serverResponse = context.serverContext!.response;\n\n context.response.status =\n serverResponse?.status ?? context.response.status ?? context.routerContext!.statusCode ?? 200;\n\n if (!context.response.headers.has(CONTENT_TYPE)) {\n context.response.headers.set(CONTENT_TYPE, HTML_CONTENT_TYPE);\n }\n\n const shell = onShellReady?.({ context }) ?? {};\n const routerState = buildRouterState(context.routerContext!);\n const customState = buildCustomState(getState?.({ context }));\n const header = shell.header || context.html.header;\n const footer = routerState + customState + (shell.footer || context.html.footer);\n const headers = new Headers(context.response.headers);\n\n return { header, footer, headers, status: context.response.status };\n};\n\n/**\n * Coordinate router queries, React rendering and the final Fetch response.\n */\nconst render = async <TAppProps,>(\n { createApp, handler, renderToStream }: ICoreRenderParams<TAppProps>,\n context: ISsrRequestContext<TAppProps>,\n {\n abortDelay = 15_000,\n getState,\n onError,\n onResponse,\n onRouterReady,\n onShellError,\n onShellReady,\n prepare,\n routerRequestContext,\n }: ICoreRenderOptions<TAppProps>,\n executionContext?: ISsrExecutionContext,\n): Promise<Response> => {\n const queried = await handler.query(context.request, {\n requestContext: routerRequestContext ?? context,\n });\n\n if (queried instanceof Response) {\n return headResponse(context.request, mergeResponseHeaders(queried, context.response.headers));\n }\n\n context.routerContext = queried;\n\n await prepare?.({ context, executionContext });\n\n const { isStream = true } = (await onRouterReady?.({ context })) ?? {};\n\n context.isStream = isStream;\n context.serverContext = {\n basename: context.routerContext.basename,\n isServer: true,\n response: null,\n };\n\n const router = createStaticRouter(handler.dataRoutes, context.routerContext);\n const node = (\n <ServerProvider context={context.serverContext}>\n {createApp(\n <StaticRouterProvider router={router} context={context.routerContext} hydrate={false} />,\n context,\n )}\n </ServerProvider>\n );\n const renderController = new AbortController();\n let abortReason: unknown;\n\n /**\n * Assigned after abort is defined so an async renderer can be cancelled while it initializes.\n */\n let output: IRenderStream | undefined;\n let hasAborted = false;\n\n /**\n * Propagate the request cancellation reason into the renderer.\n */\n const onRequestAbort = (): void => abort(context.request.signal.reason);\n\n /**\n * Clear the deadline when React finishes or the response is cancelled.\n */\n const clearAbortTimer = (): void => clearTimeout(abortTimer);\n\n /**\n * Release the render deadline and request disconnect listener.\n */\n const cleanup = (): void => {\n clearAbortTimer();\n context.request.signal.removeEventListener('abort', onRequestAbort);\n };\n\n /**\n * Cancel rendering once while preserving the reason reported by lifecycle hooks.\n */\n const abort = (reason?: unknown): void => {\n if (hasAborted) {\n return;\n }\n\n hasAborted = true;\n abortReason = reason;\n cleanup();\n context.didError ??= StreamError.RenderCancel;\n renderController.abort(reason);\n output?.abort(reason);\n };\n\n /**\n * Apply the render deadline after routing and preparation finish.\n */\n const abortTimer = setTimeout(() => {\n context.didError = StreamError.RenderTimeout;\n abort();\n }, abortDelay);\n\n if (context.request.signal.aborted) {\n abort(context.request.signal.reason);\n } else {\n context.request.signal.addEventListener('abort', onRequestAbort, { once: true });\n }\n\n try {\n output = await renderToStream(node, {\n /**\n * Classify expected cancellation separately from unexpected React errors.\n */\n onError: (error) => {\n const streamError = obtainStreamError(error);\n\n if (\n hasAborted &&\n (streamError.code === StreamError.RenderAborted ||\n error === renderController.signal.reason)\n ) {\n streamError.code =\n context.didError === StreamError.RenderTimeout\n ? StreamError.RenderTimeout\n : StreamError.RenderCancel;\n }\n\n const { code } = streamError;\n\n context.didError ??= code;\n onError?.({ context, error: streamError });\n },\n signal: renderController.signal,\n });\n\n if (hasAborted) {\n output.abort(abortReason);\n }\n\n void output.allReady.then(clearAbortTimer, clearAbortTimer);\n\n await (isStream ? output.shellReady : output.allReady);\n } catch (error) {\n abort(error);\n await output?.stream.cancel(error).catch(() => undefined);\n\n return createShellErrorResponse(context, error, onShellError);\n }\n\n try {\n const serverResponse = context.serverContext.response;\n\n if (serverResponse && isRedirect(serverResponse)) {\n abort();\n await output.stream.cancel().catch(() => undefined);\n\n return headResponse(\n context.request,\n mergeResponseHeaders(serverResponse, context.response.headers),\n );\n }\n\n const { header, footer, headers, status } = prepareHtmlResponse(context, {\n getState,\n onShellReady,\n });\n\n if (context.request.method === 'HEAD' || [204, 205, 304].includes(status)) {\n abort();\n await output.stream.cancel().catch(() => undefined);\n\n return new Response(null, {\n headers,\n status,\n });\n }\n\n const body = composeHtml(header, output.stream, footer, abort, cleanup);\n const transformed = transformHtml(\n body,\n onResponse ? (html) => onResponse({ context, html }) : undefined,\n );\n\n output.start();\n\n return new Response(transformed, {\n headers,\n status,\n });\n } catch (error) {\n abort(error);\n\n if (!output.stream.locked) {\n await output.stream.cancel(error).catch(() => undefined);\n }\n\n throw error;\n }\n};\n\nexport default render;\n"],"names":["HTML_CONTENT_TYPE","CONTENT_TYPE","render","async","createApp","handler","renderToStream","context","abortDelay","getState","onError","onResponse","onRouterReady","onShellError","onShellReady","prepare","routerRequestContext","executionContext","queried","query","request","requestContext","Response","headResponse","mergeResponseHeaders","response","headers","routerContext","isStream","serverContext","basename","isServer","router","createStaticRouter","dataRoutes","node","React","createElement","ServerProvider","StaticRouterProvider","hydrate","renderController","AbortController","abortReason","output","hasAborted","onRequestAbort","abort","signal","reason","clearAbortTimer","clearTimeout","abortTimer","cleanup","removeEventListener","didError","StreamError","RenderCancel","setTimeout","RenderTimeout","aborted","addEventListener","once","error","streamError","obtainStreamError","code","RenderAborted","allReady","then","shellReady","stream","cancel","catch","shellError","Error","String","html","Headers","set","method","status","createShellErrorResponse","serverResponse","Boolean","has","header","footer","statusCode","shell","routerState","buildRouterState","customState","buildCustomState","prepareHtmlResponse","includes","body","composeHtml","transformed","transformHtml","undefined","start","locked"],"mappings":"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"}
1
+ {"version":3,"file":"render.js","sources":["../../src/core/render.tsx"],"sourcesContent":[null],"names":["HTML_CONTENT_TYPE","CONTENT_TYPE","render","async","createApp","handler","renderToStream","context","abortDelay","getState","onError","onResponse","onRouterReady","onShellError","onShellReady","prepare","routerRequestContext","executionContext","queried","query","request","requestContext","Response","headResponse","mergeResponseHeaders","response","headers","routerContext","isStream","serverContext","basename","isServer","router","createStaticRouter","dataRoutes","node","React","createElement","ServerProvider","StaticRouterProvider","hydrate","renderController","AbortController","abortReason","output","hasAborted","onRequestAbort","abort","signal","reason","clearAbortTimer","clearTimeout","abortTimer","cleanup","removeEventListener","didError","StreamError","RenderCancel","setTimeout","RenderTimeout","aborted","addEventListener","once","error","streamError","obtainStreamError","code","RenderAborted","allReady","then","shellReady","stream","cancel","catch","shellError","Error","String","html","Headers","set","method","status","createShellErrorResponse","serverResponse","Boolean","has","header","footer","statusCode","shell","routerState","buildRouterState","customState","buildCustomState","prepareHtmlResponse","includes","body","composeHtml","transformed","transformHtml","undefined","start","locked"],"mappings":"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"}
@@ -4,4 +4,4 @@ type TTransformHtml = (html: string) => string | undefined | void;
4
4
  */
5
5
  declare const transformHtml: (stream: ReadableStream<Uint8Array>, transform?: TTransformHtml) => ReadableStream<Uint8Array>;
6
6
  export type { TTransformHtml };
7
- export { transformHtml as default };
7
+ export default transformHtml;
@@ -1 +1 @@
1
- {"version":3,"file":"transform-html.js","sources":["../../src/core/transform-html.ts"],"sourcesContent":["type TTransformHtml = (html: string) => string | undefined | void;\n\n/**\n * Apply response hooks to decoded text without splitting UTF-8 characters.\n */\nconst transformHtml = (\n stream: ReadableStream<Uint8Array>,\n transform?: TTransformHtml,\n): ReadableStream<Uint8Array> => {\n if (!transform) {\n return stream;\n }\n\n const decoder = new TextDecoder();\n const encoder = new TextEncoder();\n\n /**\n * Keep the original HTML when the response hook does not replace a chunk.\n */\n const apply = (html: string, controller: TransformStreamDefaultController<Uint8Array>): void => {\n if (!html) {\n return;\n }\n\n controller.enqueue(encoder.encode(transform(html) || html));\n };\n\n return stream.pipeThrough(\n new TransformStream<Uint8Array, Uint8Array>({\n /**\n * Flush any final characters retained by the streaming decoder.\n */\n flush: (controller) => apply(decoder.decode(), controller),\n\n /**\n * Decode successive chunks using the same UTF-8 state.\n */\n transform: (chunk, controller) => apply(decoder.decode(chunk, { stream: true }), controller),\n }),\n );\n};\n\nexport type { TTransformHtml };\n\nexport default transformHtml;\n"],"names":["transformHtml","stream","transform","decoder","TextDecoder","encoder","TextEncoder","apply","html","controller","enqueue","encode","pipeThrough","TransformStream","flush","decode","chunk"],"mappings":"AAKA,MAAMA,EAAgB,CACpBC,EACAC,KAEA,IAAKA,EACH,OAAOD,EAGT,MAAME,EAAU,IAAIC,YACdC,EAAU,IAAIC,YAKdC,EAAQ,CAACC,EAAcC,KACtBD,GAILC,EAAWC,QAAQL,EAAQM,OAAOT,EAAUM,IAASA,GAAM,EAG7D,OAAOP,EAAOW,YACZ,IAAIC,gBAAwC,CAI1CC,MAAQL,GAAeF,EAAMJ,EAAQY,SAAUN,GAK/CP,UAAW,CAACc,EAAOP,IAAeF,EAAMJ,EAAQY,OAAOC,EAAO,CAAEf,QAAQ,IAASQ,KAEpF"}
1
+ {"version":3,"file":"transform-html.js","sources":["../../src/core/transform-html.ts"],"sourcesContent":[null],"names":["transformHtml","stream","transform","decoder","TextDecoder","encoder","TextEncoder","apply","html","controller","enqueue","encode","pipeThrough","TransformStream","flush","decode","chunk"],"mappings":"AAKA,MAAMA,EAAgB,CACpBC,EACAC,KAEA,IAAKA,EACH,OAAOD,EAGT,MAAME,EAAU,IAAIC,YACdC,EAAU,IAAIC,YAKdC,EAAQ,CAACC,EAAcC,KACtBD,GAILC,EAAWC,QAAQL,EAAQM,OAAOT,EAAUM,IAASA,KAGvD,OAAOP,EAAOW,YACZ,IAAIC,gBAAwC,CAI1CC,MAAQL,GAAeF,EAAMJ,EAAQY,SAAUN,GAK/CP,UAAW,CAACc,EAAOP,IAAeF,EAAMJ,EAAQY,OAAOC,EAAO,CAAEf,QAAQ,IAASQ"}
package/core/types.d.ts CHANGED
@@ -1,8 +1,7 @@
1
- interface ISsrExecutionContext {
1
+ export interface ISsrExecutionContext {
2
2
  /**
3
3
  * Deliver informational headers outside the final Fetch response when supported.
4
4
  */
5
5
  onEarlyHints?: (headers: Headers) => Promise<void> | void;
6
6
  }
7
- type TSsrHandler = (request: Request, context?: ISsrExecutionContext) => Promise<Response>;
8
- export { ISsrExecutionContext, TSsrHandler };
7
+ export type TSsrHandler = (request: Request, context?: ISsrExecutionContext) => Promise<Response>;
@@ -1,6 +1,6 @@
1
- import { TRenderToStream } from "../core/render.js";
1
+ import type { TRenderToStream } from '../core/render.js';
2
2
  /**
3
3
  * Adapt React Web streams and settle readiness even when initialization is aborted.
4
4
  */
5
5
  declare const renderToStream: TRenderToStream;
6
- export { renderToStream as default };
6
+ export default renderToStream;
@@ -1,2 +1,2 @@
1
- import*as e from"react-dom/server";const r=async()=>e.renderToReadableStream??(await import("react-dom/server.browser")).renderToReadableStream,a=async(e,{onError:a,signal:t})=>{const o=new AbortController;let n;const s=new Promise(((e,r)=>{n=r})),l=()=>{const{reason:e}=t;o.abort(e);const{reason:r}=o.signal;n(r instanceof Error?r:new Error(String(r)))};let c;t.aborted?l():t.addEventListener("abort",l,{once:!0});try{c=await Promise.race([r().then((r=>r(e,{onError:a,signal:o.signal}))),s])}catch(e){t.removeEventListener("abort",l);const r=Promise.reject(e);return r.catch((()=>{})),{allReady:r,abort:e=>o.abort(e),shellReady:r,start:()=>{},stream:new ReadableStream}}const d=()=>t.removeEventListener("abort",l);return c.allReady.then(d,d),{allReady:c.allReady,abort:e=>o.abort(e),shellReady:Promise.resolve(),start:()=>{},stream:c}};export{a as default};
1
+ import*as e from"react-dom/server";const r=async()=>e.renderToReadableStream??(await(import("react-dom/server.browser"))).renderToReadableStream,a=async(e,{onError:a,signal:t})=>{const o=new AbortController;let n;const s=new Promise((e,r)=>{n=r}),l=()=>{const{reason:e}=t;o.abort(e);const{reason:r}=o.signal;n(r instanceof Error?r:new Error(String(r)))};let c;t.aborted?l():t.addEventListener("abort",l,{once:!0});try{c=await Promise.race([r().then(r=>r(e,{onError:a,signal:o.signal})),s])}catch(e){t.removeEventListener("abort",l);const r=Promise.reject(e);return r.catch(()=>{}),{allReady:r,abort:e=>o.abort(e),shellReady:r,start:()=>{},stream:new ReadableStream}}const d=()=>t.removeEventListener("abort",l);return c.allReady.then(d,d),{allReady:c.allReady,abort:e=>o.abort(e),shellReady:Promise.resolve(),start:()=>{},stream:c}};export{a as default};
2
2
  //# sourceMappingURL=render-to-stream.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"render-to-stream.js","sources":["../../src/edge/render-to-stream.ts"],"sourcesContent":["import * as ReactDOMServer from 'react-dom/server';\nimport type { TRenderToStream } from '@core/render';\n\n/**\n * Let React select its workerd/Bun/Deno renderer. Node's React 18 entry lacks Web streams.\n */\nconst getRenderer = async (): Promise<typeof ReactDOMServer.renderToReadableStream> =>\n ReactDOMServer.renderToReadableStream ??\n (await import('react-dom/server.browser')).renderToReadableStream;\n\n/**\n * Adapt React Web streams and settle readiness even when initialization is aborted.\n */\nconst renderToStream: TRenderToStream = async (node, { onError, signal }) => {\n const controller = new AbortController();\n let rejectPending!: (reason: Error) => void;\n\n /**\n * Interrupt initialization even if React never settles its shell promise.\n */\n const pendingAbort = new Promise<never>((_, reject) => {\n rejectPending = reject;\n });\n\n /**\n * Reject pending readiness when the platform request is cancelled.\n */\n const abort = (): void => {\n const { reason: signalReason } = signal as { reason: unknown };\n\n controller.abort(signalReason);\n\n const { reason } = controller.signal as { reason: unknown };\n\n rejectPending(reason instanceof Error ? reason : new Error(String(reason)));\n };\n\n if (signal.aborted) {\n abort();\n } else {\n signal.addEventListener('abort', abort, { once: true });\n }\n\n let stream: Awaited<ReturnType<typeof ReactDOMServer.renderToReadableStream>>;\n\n try {\n stream = await Promise.race([\n getRenderer().then((renderToReadableStream) =>\n renderToReadableStream(node, { onError, signal: controller.signal }),\n ),\n pendingAbort,\n ]);\n } catch (error) {\n signal.removeEventListener('abort', abort);\n const shellError = Promise.reject(error);\n\n void shellError.catch(() => undefined);\n\n return {\n allReady: shellError,\n\n /**\n * Cancel the Web renderer with the reason supplied by the core.\n */\n abort: (reason) => controller.abort(reason),\n shellReady: shellError,\n\n /**\n * Web rendering starts through pulls and needs no separate pipe operation.\n */\n start: () => undefined,\n stream: new ReadableStream<Uint8Array>(),\n };\n }\n\n /**\n * Detach the cancellation listener once React settles.\n */\n const removeAbortListener = (): void => signal.removeEventListener('abort', abort);\n\n void stream.allReady.then(removeAbortListener, removeAbortListener);\n\n return {\n allReady: stream.allReady,\n\n /**\n * Cancel the Web renderer with the reason supplied by the core.\n */\n abort: (reason) => controller.abort(reason),\n shellReady: Promise.resolve(),\n\n /**\n * Web rendering starts through pulls and needs no separate pipe operation.\n */\n start: () => undefined,\n stream,\n };\n};\n\nexport default renderToStream;\n"],"names":["getRenderer","async","ReactDOMServer","renderToReadableStream","import","renderToStream","node","onError","signal","controller","AbortController","rejectPending","pendingAbort","Promise","_","reject","abort","reason","signalReason","Error","String","stream","aborted","addEventListener","once","race","then","error","removeEventListener","shellError","catch","allReady","shellReady","start","ReadableStream","removeAbortListener","resolve"],"mappings":"mCAMA,MAAMA,EAAcC,SAClBC,EAAeC,+BACRC,OAAO,6BAA6BD,uBAKvCE,EAAkCJ,MAAOK,GAAQC,UAASC,aAC9D,MAAMC,EAAa,IAAIC,gBACvB,IAAIC,EAKJ,MAAMC,EAAe,IAAIC,SAAe,CAACC,EAAGC,KAC1CJ,EAAgBI,CAAM,IAMlBC,EAAQ,KACZ,MAAQC,OAAQC,GAAiBV,EAEjCC,EAAWO,MAAME,GAEjB,MAAMD,OAAEA,GAAWR,EAAWD,OAE9BG,EAAcM,aAAkBE,MAAQF,EAAS,IAAIE,MAAMC,OAAOH,IAAS,EAS7E,IAAII,EANAb,EAAOc,QACTN,IAEAR,EAAOe,iBAAiB,QAASP,EAAO,CAAEQ,MAAM,IAKlD,IACEH,QAAeR,QAAQY,KAAK,CAC1BzB,IAAc0B,MAAMvB,GAClBA,EAAuBG,EAAM,CAAEC,UAASC,OAAQC,EAAWD,WAE7DI,GAEJ,CAAE,MAAOe,GACPnB,EAAOoB,oBAAoB,QAASZ,GACpC,MAAMa,EAAahB,QAAQE,OAAOY,GAIlC,OAFKE,EAAWC,OAAM,KAAe,IAE9B,CACLC,SAAUF,EAKVb,MAAQC,GAAWR,EAAWO,MAAMC,GACpCe,WAAYH,EAKZI,MAAO,KAAe,EACtBZ,OAAQ,IAAIa,eAEhB,CAKA,MAAMC,EAAsB,IAAY3B,EAAOoB,oBAAoB,QAASZ,GAI5E,OAFKK,EAAOU,SAASL,KAAKS,EAAqBA,GAExC,CACLJ,SAAUV,EAAOU,SAKjBf,MAAQC,GAAWR,EAAWO,MAAMC,GACpCe,WAAYnB,QAAQuB,UAKpBH,MAAO,KAAe,EACtBZ,SACD"}
1
+ {"version":3,"file":"render-to-stream.js","sources":["../../src/edge/render-to-stream.ts"],"sourcesContent":[null],"names":["getRenderer","async","ReactDOMServer","renderToReadableStream","renderToStream","node","onError","signal","controller","AbortController","rejectPending","pendingAbort","Promise","_","reject","abort","reason","signalReason","Error","String","stream","aborted","addEventListener","once","race","then","error","removeEventListener","shellError","catch","allReady","shellReady","start","ReadableStream","removeAbortListener","resolve"],"mappings":"mCAMA,MAAMA,EAAcC,SAClBC,EAAeC,sCACD,8BAA6BA,uBAKvCC,EAAkCH,MAAOI,GAAQC,UAASC,aAC9D,MAAMC,EAAa,IAAIC,gBACvB,IAAIC,EAKJ,MAAMC,EAAe,IAAIC,QAAe,CAACC,EAAGC,KAC1CJ,EAAgBI,IAMZC,EAAQ,KACZ,MAAQC,OAAQC,GAAiBV,EAEjCC,EAAWO,MAAME,GAEjB,MAAMD,OAAEA,GAAWR,EAAWD,OAE9BG,EAAcM,aAAkBE,MAAQF,EAAS,IAAIE,MAAMC,OAAOH,MASpE,IAAII,EANAb,EAAOc,QACTN,IAEAR,EAAOe,iBAAiB,QAASP,EAAO,CAAEQ,MAAM,IAKlD,IACEH,QAAeR,QAAQY,KAAK,CAC1BxB,IAAcyB,KAAMtB,GAClBA,EAAuBE,EAAM,CAAEC,UAASC,OAAQC,EAAWD,UAE7DI,GAEJ,CAAE,MAAOe,GACPnB,EAAOoB,oBAAoB,QAASZ,GACpC,MAAMa,EAAahB,QAAQE,OAAOY,GAIlC,OAFKE,EAAWC,MAAM,QAEf,CACLC,SAAUF,EAKVb,MAAQC,GAAWR,EAAWO,MAAMC,GACpCe,WAAYH,EAKZI,MAAO,OACPZ,OAAQ,IAAIa,eAEhB,CAKA,MAAMC,EAAsB,IAAY3B,EAAOoB,oBAAoB,QAASZ,GAI5E,OAFKK,EAAOU,SAASL,KAAKS,EAAqBA,GAExC,CACLJ,SAAUV,EAAOU,SAKjBf,MAAQC,GAAWR,EAAWO,MAAMC,GACpCe,WAAYnB,QAAQuB,UAKpBH,MAAO,OACPZ"}
@@ -2,4 +2,4 @@
2
2
  * Build custom state
3
3
  */
4
4
  declare function buildCustomState(initState?: Record<string, Record<string, any>> | void): string;
5
- export { buildCustomState as default };
5
+ export default buildCustomState;
@@ -1,2 +1,2 @@
1
- import t from"./html-escape.js";function r(r){return Object.entries(r??{}).map((([r,e])=>{if(!r||!e||!Object.keys(e||{}).length)return"";const i=t(JSON.stringify(JSON.stringify(e)));return`<script async>window${/^[A-Za-z_$][\w$]*$/.test(r)?`.${r}`:`[${t(JSON.stringify(r))}]`} = JSON.parse(${i});<\/script>`})).join("").trim()}export{r as default};
1
+ import t from"./html-escape.js";function r(r){return Object.entries(r??{}).map(([r,e])=>{if(!r||!e||!Object.keys(e||{}).length)return"";const i=t(JSON.stringify(JSON.stringify(e)));return`<script async>window${/^[A-Za-z_$][\w$]*$/.test(r)?`.${r}`:`[${t(JSON.stringify(r))}]`} = JSON.parse(${i});<\/script>`}).join("").trim()}export{r as default};
2
2
  //# sourceMappingURL=build-custom-state.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"build-custom-state.js","sources":["../../src/helpers/build-custom-state.ts"],"sourcesContent":["import htmlEscape from '@helpers/html-escape';\n\n/**\n * Build custom state\n */\nfunction buildCustomState(initState?: Record<string, Record<string, any>> | void): string {\n const stateScripts = Object.entries(initState ?? {}).map(([key, state]) => {\n if (!key || !state || !Object.keys(state || {}).length) {\n return '';\n }\n\n const json = htmlEscape(JSON.stringify(JSON.stringify(state)));\n const property = /^[A-Za-z_$][\\w$]*$/.test(key)\n ? `.${key}`\n : `[${htmlEscape(JSON.stringify(key))}]`;\n\n return `<script async>window${property} = JSON.parse(${json});</script>`;\n });\n\n return stateScripts.join('').trim();\n}\n\nexport default buildCustomState;\n"],"names":["buildCustomState","initState","Object","entries","map","key","state","keys","length","json","htmlEscape","JSON","stringify","test","join","trim"],"mappings":"gCAKA,SAASA,EAAiBC,GAcxB,OAbqBC,OAAOC,QAAQF,GAAa,CAAA,GAAIG,KAAI,EAAEC,EAAKC,MAC9D,IAAKD,IAAQC,IAAUJ,OAAOK,KAAKD,GAAS,IAAIE,OAC9C,MAAO,GAGT,MAAMC,EAAOC,EAAWC,KAAKC,UAAUD,KAAKC,UAAUN,KAKtD,MAAO,uBAJU,qBAAqBO,KAAKR,GACvC,IAAIA,IACJ,IAAIK,EAAWC,KAAKC,UAAUP,uBAEqBI,eAAiB,IAGtDK,KAAK,IAAIC,MAC/B"}
1
+ {"version":3,"file":"build-custom-state.js","sources":["../../src/helpers/build-custom-state.ts"],"sourcesContent":[null],"names":["buildCustomState","initState","Object","entries","map","key","state","keys","length","json","htmlEscape","JSON","stringify","test","join","trim"],"mappings":"gCAKA,SAASA,EAAiBC,GAcxB,OAbqBC,OAAOC,QAAQF,GAAa,CAAA,GAAIG,IAAI,EAAEC,EAAKC,MAC9D,IAAKD,IAAQC,IAAUJ,OAAOK,KAAKD,GAAS,IAAIE,OAC9C,MAAO,GAGT,MAAMC,EAAOC,EAAWC,KAAKC,UAAUD,KAAKC,UAAUN,KAKtD,MAAO,uBAJU,qBAAqBO,KAAKR,GACvC,IAAIA,IACJ,IAAIK,EAAWC,KAAKC,UAAUP,uBAEqBI,kBAGrCK,KAAK,IAAIC,MAC/B"}