@quilted/quilt 0.5.151 → 0.5.153

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 (186) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/build/cjs/assets.cjs +39 -0
  3. package/build/cjs/async.cjs +32 -0
  4. package/build/cjs/events.cjs +46 -0
  5. package/build/cjs/graphql/testing.cjs +2 -6
  6. package/build/cjs/html/HTML.cjs +21 -0
  7. package/build/cjs/html.cjs +33 -6
  8. package/build/cjs/http.cjs +16 -0
  9. package/build/cjs/index.cjs +0 -319
  10. package/build/cjs/localize.cjs +46 -0
  11. package/build/cjs/navigate/testing.cjs +12 -0
  12. package/build/cjs/navigate.cjs +70 -0
  13. package/build/cjs/performance.cjs +26 -0
  14. package/build/cjs/polyfills/fetch-get-set-cookie.cjs +4 -0
  15. package/build/cjs/react/testing.cjs +30 -0
  16. package/build/cjs/react/tools.cjs +19 -0
  17. package/build/cjs/react.cjs +15 -0
  18. package/build/cjs/server/ServerContext.cjs +1 -1
  19. package/build/cjs/server/preload.cjs +1 -1
  20. package/build/cjs/server/request-router.cjs +215 -231
  21. package/build/cjs/{server/index.cjs → server.cjs} +26 -52
  22. package/build/cjs/signals.cjs +51 -0
  23. package/build/cjs/static/StaticContext.cjs +1 -1
  24. package/build/cjs/static/index.cjs +43 -51
  25. package/build/cjs/static/render.cjs +1 -1
  26. package/build/cjs/testing.cjs +6 -34
  27. package/build/esm/assets.mjs +2 -0
  28. package/build/esm/async.mjs +3 -0
  29. package/build/esm/events.mjs +1 -0
  30. package/build/esm/graphql/testing.mjs +1 -1
  31. package/build/esm/html/HTML.mjs +19 -0
  32. package/build/esm/html.mjs +3 -1
  33. package/build/esm/http.mjs +1 -1
  34. package/build/esm/index.mjs +1 -15
  35. package/build/esm/localize.mjs +1 -0
  36. package/build/esm/navigate/testing.mjs +1 -0
  37. package/build/esm/navigate.mjs +1 -0
  38. package/build/esm/performance.mjs +1 -0
  39. package/build/esm/polyfills/fetch-get-set-cookie.mjs +1 -0
  40. package/build/esm/react/testing.mjs +3 -0
  41. package/build/esm/react/tools.mjs +2 -0
  42. package/build/esm/react.mjs +2 -0
  43. package/build/esm/server/ServerContext.mjs +2 -2
  44. package/build/esm/server/preload.mjs +2 -2
  45. package/build/esm/server/request-router.mjs +218 -232
  46. package/build/esm/server.mjs +10 -0
  47. package/build/esm/signals.mjs +2 -0
  48. package/build/esm/static/StaticContext.mjs +2 -2
  49. package/build/esm/static/index.mjs +40 -48
  50. package/build/esm/static/render.mjs +2 -2
  51. package/build/esm/testing.mjs +0 -3
  52. package/build/esnext/assets.esnext +2 -0
  53. package/build/esnext/async.esnext +3 -0
  54. package/build/esnext/events.esnext +1 -0
  55. package/build/esnext/graphql/testing.esnext +1 -1
  56. package/build/esnext/html/HTML.esnext +19 -0
  57. package/build/esnext/html.esnext +3 -1
  58. package/build/esnext/http.esnext +1 -1
  59. package/build/esnext/index.esnext +1 -15
  60. package/build/esnext/localize.esnext +1 -0
  61. package/build/esnext/navigate/testing.esnext +1 -0
  62. package/build/esnext/navigate.esnext +1 -0
  63. package/build/esnext/performance.esnext +1 -0
  64. package/build/esnext/polyfills/fetch-get-set-cookie.esnext +1 -0
  65. package/build/esnext/react/testing.esnext +3 -0
  66. package/build/esnext/react/tools.esnext +2 -0
  67. package/build/esnext/react.esnext +2 -0
  68. package/build/esnext/server/ServerContext.esnext +2 -2
  69. package/build/esnext/server/preload.esnext +2 -2
  70. package/build/esnext/server/request-router.esnext +218 -232
  71. package/build/esnext/server.esnext +10 -0
  72. package/build/esnext/signals.esnext +2 -0
  73. package/build/esnext/static/StaticContext.esnext +2 -2
  74. package/build/esnext/static/index.esnext +40 -48
  75. package/build/esnext/static/render.esnext +2 -2
  76. package/build/esnext/testing.esnext +0 -3
  77. package/build/tsconfig.tsbuildinfo +1 -1
  78. package/build/typescript/assets.d.ts +3 -1
  79. package/build/typescript/assets.d.ts.map +1 -1
  80. package/build/typescript/async.d.ts +6 -0
  81. package/build/typescript/async.d.ts.map +1 -0
  82. package/build/typescript/events.d.ts +3 -0
  83. package/build/typescript/events.d.ts.map +1 -0
  84. package/build/typescript/globals.d.ts +8 -0
  85. package/build/typescript/globals.d.ts.map +1 -0
  86. package/build/typescript/graphql/testing/matchers/operations.d.ts +7 -0
  87. package/build/typescript/graphql/testing/matchers/operations.d.ts.map +1 -0
  88. package/build/typescript/graphql/testing/matchers/utilities.d.ts +8 -0
  89. package/build/typescript/graphql/testing/matchers/utilities.d.ts.map +1 -0
  90. package/build/typescript/graphql/testing/matchers.d.ts +11 -0
  91. package/build/typescript/graphql/testing/matchers.d.ts.map +1 -0
  92. package/build/typescript/graphql/testing.d.ts +2 -1
  93. package/build/typescript/graphql/testing.d.ts.map +1 -1
  94. package/build/typescript/html/HTML.d.ts +5 -0
  95. package/build/typescript/html/HTML.d.ts.map +1 -0
  96. package/build/typescript/html.d.ts +3 -1
  97. package/build/typescript/html.d.ts.map +1 -1
  98. package/build/typescript/http.d.ts +1 -1
  99. package/build/typescript/http.d.ts.map +1 -1
  100. package/build/typescript/index.d.ts +1 -24
  101. package/build/typescript/index.d.ts.map +1 -1
  102. package/build/typescript/localize.d.ts +3 -0
  103. package/build/typescript/localize.d.ts.map +1 -0
  104. package/build/typescript/magic/assets.d.ts +4 -2
  105. package/build/typescript/magic/assets.d.ts.map +1 -1
  106. package/build/typescript/navigate/testing.d.ts +2 -0
  107. package/build/typescript/navigate/testing.d.ts.map +1 -0
  108. package/build/typescript/navigate.d.ts +3 -0
  109. package/build/typescript/navigate.d.ts.map +1 -0
  110. package/build/typescript/performance.d.ts +3 -0
  111. package/build/typescript/performance.d.ts.map +1 -0
  112. package/build/typescript/polyfills/fetch-get-set-cookie.d.ts +2 -0
  113. package/build/typescript/polyfills/fetch-get-set-cookie.d.ts.map +1 -0
  114. package/build/typescript/react/testing.d.ts +5 -0
  115. package/build/typescript/react/testing.d.ts.map +1 -0
  116. package/build/typescript/react/tools.d.ts +3 -0
  117. package/build/typescript/react/tools.d.ts.map +1 -0
  118. package/build/typescript/react-dom.d.ts +3 -0
  119. package/build/typescript/react-dom.d.ts.map +1 -0
  120. package/build/typescript/react.d.ts +3 -0
  121. package/build/typescript/react.d.ts.map +1 -0
  122. package/build/typescript/routing.d.ts +3 -0
  123. package/build/typescript/routing.d.ts.map +1 -0
  124. package/build/typescript/server/ServerContext.d.ts +2 -2
  125. package/build/typescript/server/request-router.d.ts +13 -37
  126. package/build/typescript/server/request-router.d.ts.map +1 -1
  127. package/build/typescript/server.d.ts +14 -0
  128. package/build/typescript/server.d.ts.map +1 -0
  129. package/build/typescript/signals.d.ts +3 -0
  130. package/build/typescript/signals.d.ts.map +1 -0
  131. package/build/typescript/static/StaticContext.d.ts +2 -2
  132. package/build/typescript/static/index.d.ts.map +1 -1
  133. package/build/typescript/static/render.d.ts +2 -2
  134. package/build/typescript/testing.d.ts +0 -4
  135. package/build/typescript/testing.d.ts.map +1 -1
  136. package/package.json +158 -54
  137. package/source/assets.ts +20 -2
  138. package/source/async.ts +17 -0
  139. package/source/events.ts +20 -0
  140. package/source/graphql/testing/matchers.ts +37 -0
  141. package/source/graphql/testing.ts +3 -2
  142. package/source/html/HTML.tsx +22 -0
  143. package/source/html.ts +15 -3
  144. package/source/http.ts +4 -0
  145. package/source/index.ts +1 -149
  146. package/source/localize.ts +21 -0
  147. package/source/magic/assets.ts +7 -4
  148. package/source/navigate/testing.ts +1 -0
  149. package/source/navigate.ts +24 -0
  150. package/source/performance.ts +12 -0
  151. package/source/polyfills/fetch-get-set-cookie.ts +1 -0
  152. package/source/react/testing.ts +30 -0
  153. package/source/react/tools.ts +2 -0
  154. package/source/routing.ts +24 -0
  155. package/source/server/ServerContext.tsx +3 -3
  156. package/source/server/preload.ts +2 -2
  157. package/source/server/request-router.tsx +281 -403
  158. package/source/{server/index.ts → server.ts} +20 -46
  159. package/source/signals.ts +12 -0
  160. package/source/static/StaticContext.tsx +3 -3
  161. package/source/static/index.tsx +40 -56
  162. package/source/static/render.tsx +2 -2
  163. package/source/testing.ts +0 -29
  164. package/build/cjs/App.cjs +0 -72
  165. package/build/cjs/TestApp.cjs +0 -20
  166. package/build/cjs/matchers.cjs +0 -4
  167. package/build/esm/App.mjs +0 -70
  168. package/build/esm/TestApp.mjs +0 -18
  169. package/build/esm/matchers.mjs +0 -1
  170. package/build/esm/server/index.mjs +0 -10
  171. package/build/esnext/App.esnext +0 -70
  172. package/build/esnext/TestApp.esnext +0 -18
  173. package/build/esnext/matchers.esnext +0 -1
  174. package/build/esnext/server/index.esnext +0 -10
  175. package/source/App.tsx +0 -162
  176. package/source/TestApp.tsx +0 -33
  177. package/source/matchers/graphql.ts +0 -24
  178. package/source/matchers.ts +0 -3
  179. /package/build/cjs/{global.cjs → globals.cjs} +0 -0
  180. /package/build/esm/{global.mjs → globals.mjs} +0 -0
  181. /package/build/esnext/{global.esnext → globals.esnext} +0 -0
  182. /package/source/{global.ts → globals.ts} +0 -0
  183. /package/source/{matchers/graphql → graphql/testing/matchers}/operations.ts +0 -0
  184. /package/source/{matchers/graphql → graphql/testing/matchers}/utilities.ts +0 -0
  185. /package/source/{react-dom/index.ts → react-dom.ts} +0 -0
  186. /package/source/{react/index.ts → react.ts} +0 -0
@@ -0,0 +1,70 @@
1
+ 'use strict';
2
+
3
+ var reactRouter = require('@quilted/react-router');
4
+
5
+
6
+
7
+ Object.defineProperty(exports, 'Link', {
8
+ enumerable: true,
9
+ get: function () { return reactRouter.Link; }
10
+ });
11
+ Object.defineProperty(exports, 'NavigationBlock', {
12
+ enumerable: true,
13
+ get: function () { return reactRouter.NavigationBlock; }
14
+ });
15
+ Object.defineProperty(exports, 'Redirect', {
16
+ enumerable: true,
17
+ get: function () { return reactRouter.Redirect; }
18
+ });
19
+ Object.defineProperty(exports, 'RoutePreloading', {
20
+ enumerable: true,
21
+ get: function () { return reactRouter.RoutePreloading; }
22
+ });
23
+ Object.defineProperty(exports, 'Routing', {
24
+ enumerable: true,
25
+ get: function () { return reactRouter.Routing; }
26
+ });
27
+ Object.defineProperty(exports, 'useCurrentUrl', {
28
+ enumerable: true,
29
+ get: function () { return reactRouter.useCurrentUrl; }
30
+ });
31
+ Object.defineProperty(exports, 'useInitialUrl', {
32
+ enumerable: true,
33
+ get: function () { return reactRouter.useInitialUrl; }
34
+ });
35
+ Object.defineProperty(exports, 'useNavigate', {
36
+ enumerable: true,
37
+ get: function () { return reactRouter.useNavigate; }
38
+ });
39
+ Object.defineProperty(exports, 'useNavigationBlock', {
40
+ enumerable: true,
41
+ get: function () { return reactRouter.useNavigationBlock; }
42
+ });
43
+ Object.defineProperty(exports, 'useRedirect', {
44
+ enumerable: true,
45
+ get: function () { return reactRouter.useRedirect; }
46
+ });
47
+ Object.defineProperty(exports, 'useRouteChangeFocusRef', {
48
+ enumerable: true,
49
+ get: function () { return reactRouter.useRouteChangeFocusRef; }
50
+ });
51
+ Object.defineProperty(exports, 'useRouteMatch', {
52
+ enumerable: true,
53
+ get: function () { return reactRouter.useRouteMatch; }
54
+ });
55
+ Object.defineProperty(exports, 'useRouteMatchDetails', {
56
+ enumerable: true,
57
+ get: function () { return reactRouter.useRouteMatchDetails; }
58
+ });
59
+ Object.defineProperty(exports, 'useRouter', {
60
+ enumerable: true,
61
+ get: function () { return reactRouter.useRouter; }
62
+ });
63
+ Object.defineProperty(exports, 'useRoutes', {
64
+ enumerable: true,
65
+ get: function () { return reactRouter.useRoutes; }
66
+ });
67
+ Object.defineProperty(exports, 'useScrollRestoration', {
68
+ enumerable: true,
69
+ get: function () { return reactRouter.useScrollRestoration; }
70
+ });
@@ -0,0 +1,26 @@
1
+ 'use strict';
2
+
3
+ var reactPerformance = require('@quilted/react-performance');
4
+
5
+
6
+
7
+ Object.defineProperty(exports, 'PerformanceContext', {
8
+ enumerable: true,
9
+ get: function () { return reactPerformance.PerformanceContext; }
10
+ });
11
+ Object.defineProperty(exports, 'createPerformance', {
12
+ enumerable: true,
13
+ get: function () { return reactPerformance.createPerformance; }
14
+ });
15
+ Object.defineProperty(exports, 'usePerformance', {
16
+ enumerable: true,
17
+ get: function () { return reactPerformance.usePerformance; }
18
+ });
19
+ Object.defineProperty(exports, 'usePerformanceNavigation', {
20
+ enumerable: true,
21
+ get: function () { return reactPerformance.usePerformanceNavigation; }
22
+ });
23
+ Object.defineProperty(exports, 'usePerformanceNavigationEvent', {
24
+ enumerable: true,
25
+ get: function () { return reactPerformance.usePerformanceNavigationEvent; }
26
+ });
@@ -0,0 +1,4 @@
1
+ 'use strict';
2
+
3
+ require('@quilted/polyfills/fetch-get-set-cookie');
4
+
@@ -0,0 +1,30 @@
1
+ 'use strict';
2
+
3
+ require('@quilted/react-testing/matchers');
4
+ var testing = require('@quilted/testing');
5
+ var reactTesting = require('@quilted/react-testing');
6
+
7
+
8
+
9
+ Object.defineProperty(exports, 'createRender', {
10
+ enumerable: true,
11
+ get: function () { return reactTesting.createRender; }
12
+ });
13
+ Object.defineProperty(exports, 'destroyAll', {
14
+ enumerable: true,
15
+ get: function () { return reactTesting.destroyAll; }
16
+ });
17
+ Object.defineProperty(exports, 'render', {
18
+ enumerable: true,
19
+ get: function () { return reactTesting.render; }
20
+ });
21
+ Object.defineProperty(exports, 'rendered', {
22
+ enumerable: true,
23
+ get: function () { return reactTesting.rendered; }
24
+ });
25
+ Object.keys(testing).forEach(function (k) {
26
+ if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, {
27
+ enumerable: true,
28
+ get: function () { return testing[k]; }
29
+ });
30
+ });
@@ -0,0 +1,19 @@
1
+ 'use strict';
2
+
3
+ var usefulReactTypes = require('@quilted/useful-react-types');
4
+ var reactUtilities = require('@quilted/react-utilities');
5
+
6
+
7
+
8
+ Object.keys(usefulReactTypes).forEach(function (k) {
9
+ if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, {
10
+ enumerable: true,
11
+ get: function () { return usefulReactTypes[k]; }
12
+ });
13
+ });
14
+ Object.keys(reactUtilities).forEach(function (k) {
15
+ if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, {
16
+ enumerable: true,
17
+ get: function () { return reactUtilities[k]; }
18
+ });
19
+ });
@@ -0,0 +1,15 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var react = require('@quilted/react');
6
+
7
+
8
+
9
+ exports["default"] = react;
10
+ Object.keys(react).forEach(function (k) {
11
+ if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, {
12
+ enumerable: true,
13
+ get: function () { return react[k]; }
14
+ });
15
+ });
@@ -14,7 +14,7 @@ function ServerContext({
14
14
  children
15
15
  }) {
16
16
  const normalizedUrl = typeof url === 'string' ? new URL(url) : url;
17
- return react.maybeWrapContext(server$2.AssetsContext, assets, react.maybeWrapContext(server.HttpServerContext, http, react.maybeWrapContext(server$1.HtmlContext, html, react.maybeWrapContext(reactRouter.InitialUrlContext, normalizedUrl, children))));
17
+ return react.maybeWrapContext(server$2.AssetsContext, assets, react.maybeWrapContext(server.HttpServerContext, http, react.maybeWrapContext(server$1.HTMLContext, html, react.maybeWrapContext(reactRouter.InitialUrlContext, normalizedUrl, children))));
18
18
  }
19
19
 
20
20
  exports.ServerContext = ServerContext;
@@ -8,7 +8,7 @@ function createAssetPreloader(options) {
8
8
  ...options,
9
9
  context: requestContext
10
10
  });
11
- return requestRouter.json(manifest);
11
+ return new requestRouter.JSONResponse(manifest);
12
12
  };
13
13
  }
14
14
  async function assetsForRequest(request, {
@@ -1,6 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  var react = require('react');
4
+ var server$4 = require('react-dom/server');
4
5
  var assets = require('@quilted/assets');
5
6
  var server$2 = require('@quilted/react-assets/server');
6
7
  var server$1 = require('@quilted/react-http/server');
@@ -10,250 +11,224 @@ var requestRouter = require('@quilted/request-router');
10
11
  var ServerContext = require('./ServerContext.cjs');
11
12
  var jsxRuntime = require('react/jsx-runtime');
12
13
 
13
- function createServerRender(...args) {
14
- let getApp;
14
+ async function renderToResponse(optionsOrElement, definitelyOptions) {
15
+ let element;
15
16
  let options;
16
- if (args.length > 1) {
17
- getApp = args[0];
18
- options = args[1] ?? {};
17
+ if ( /*#__PURE__*/react.isValidElement(optionsOrElement)) {
18
+ element = optionsOrElement;
19
+ options = definitelyOptions;
19
20
  } else {
20
- options = args[0] ?? {};
21
+ options = optionsOrElement;
21
22
  }
22
- const stream = options.stream;
23
- return async (request, requestContext) => {
24
- const accepts = request.headers.get('Accept');
25
- if (accepts != null && !accepts.includes('text/html')) return;
26
- const renderResponse = stream ? renderAppToStreamedResponse : renderAppToResponse;
27
- return renderResponse(typeof getApp === 'function' ? () => getApp(request, requestContext) : getApp, {
28
- ...options,
29
- request,
30
- context: requestContext,
31
- extract: {
32
- ...options.extract,
33
- context: typeof options.extract?.context === 'function' ? options.extract.context(request, requestContext) : options.extract?.context
34
- }
35
- });
36
- };
37
- }
38
- async function renderAppToResponse(getApp, {
39
- request,
40
- context,
41
- assets,
42
- extract,
43
- html: htmlOptions
44
- }) {
45
- const app = typeof getApp === 'function' ? await getApp() : getApp;
46
- const cacheKey = await assets?.cacheKey?.(request);
47
- const renderDetails = await serverRenderDetailsForApp(app, {
48
- extract,
49
- cacheKey,
50
- url: request.url,
51
- headers: request.headers
52
- });
53
23
  const {
54
- headers,
55
- statusCode = 200,
56
- redirectUrl
57
- } = renderDetails.http.state;
58
- if (redirectUrl) {
59
- return requestRouter.redirect(redirectUrl, {
60
- status: statusCode,
61
- headers
62
- });
63
- }
64
- const content = await renderAppDetailsToHtmlString(renderDetails, {
65
24
  request,
66
- context,
67
- assets,
68
- html: htmlOptions
69
- });
70
- return requestRouter.html(content, {
71
- headers,
72
- status: statusCode
25
+ stream: shouldStream = false,
26
+ assets: assets$1,
27
+ cacheKey: explicitCacheKey,
28
+ waitUntil = noop,
29
+ renderHTML
30
+ } = options;
31
+ const baseUrl = request.URL ?? new URL(request.url);
32
+ const cacheKey = explicitCacheKey ?? (await assets$1?.cacheKey?.(request)) ?? {};
33
+ const html = new server.HTMLManager();
34
+ const http = new server$1.HttpManager({
35
+ headers: request.headers
73
36
  });
74
- }
75
- async function renderAppToStreamedResponse(getApp, {
76
- request,
77
- context,
78
- assets: assets$1,
79
- extract,
80
- html: htmlOptions
81
- }) {
82
- const headers = new Headers();
83
- const stream = new TransformStream();
84
- const cacheKey = await assets$1?.cacheKey?.(request);
85
- const guaranteedAssets = await assets$1?.entry({
37
+ const assetsManager = new server$2.AssetsManager({
86
38
  cacheKey
87
39
  });
88
- if (guaranteedAssets) {
89
- for (const style of guaranteedAssets.styles) {
90
- headers.append('Link', preloadHeader(assets.styleAssetPreloadAttributes(style)));
91
- }
92
- for (const script of guaranteedAssets.scripts) {
93
- headers.append('Link', preloadHeader(assets.scriptAssetPreloadAttributes(script)));
40
+ let responseStatus = 200;
41
+ let appHeaders;
42
+ let appStream;
43
+ if (shouldStream === false && element != null) {
44
+ const rendered = await server$3.extract(element, {
45
+ decorate(element) {
46
+ return /*#__PURE__*/jsxRuntime.jsx(ServerContext.ServerContext, {
47
+ http: http,
48
+ html: html,
49
+ url: baseUrl,
50
+ assets: assetsManager,
51
+ children: element
52
+ });
53
+ }
54
+ });
55
+ const {
56
+ headers,
57
+ statusCode = 200,
58
+ redirectUrl
59
+ } = http.state;
60
+ if (redirectUrl) {
61
+ return new requestRouter.RedirectResponse(redirectUrl, {
62
+ status: statusCode,
63
+ headers,
64
+ request
65
+ });
94
66
  }
67
+ appHeaders = headers;
68
+ responseStatus = statusCode;
69
+ const appTransformStream = new TransformStream();
70
+ const appWriter = appTransformStream.writable.getWriter();
71
+ appStream = appTransformStream.readable;
72
+ appWriter.write(rendered);
73
+ appWriter.close();
95
74
  }
96
- renderResponseToStream();
97
- return requestRouter.html(stream.readable, {
98
- headers,
99
- status: 200
100
- });
101
- async function renderResponseToStream() {
102
- const app = typeof getApp === 'function' ? await getApp() : getApp;
103
- const renderDetails = await serverRenderDetailsForApp(app, {
104
- extract,
105
- cacheKey,
106
- url: request.url,
107
- headers: request.headers
108
- });
109
- const content = await renderAppDetailsToHtmlString(renderDetails, {
110
- request,
111
- context,
112
- assets: assets$1,
113
- html: htmlOptions
114
- });
115
- const encoder = new TextEncoder();
116
- const writer = stream.writable.getWriter();
117
- await writer.write(encoder.encode(content));
118
- await writer.close();
75
+ if (appStream == null) {
76
+ const appTransformStream = new TransformStream();
77
+ appStream = appTransformStream.readable;
78
+ const renderAppStream = async function renderAppStream() {
79
+ const appWriter = appTransformStream.writable.getWriter();
80
+ if (element != null) {
81
+ const rendered = await server$3.extract(element, {
82
+ decorate(element) {
83
+ return /*#__PURE__*/jsxRuntime.jsx(ServerContext.ServerContext, {
84
+ http: http,
85
+ html: html,
86
+ url: baseUrl,
87
+ assets: assetsManager,
88
+ children: element
89
+ });
90
+ }
91
+ });
92
+ appWriter.write(rendered);
93
+ }
94
+ appWriter.close();
95
+ };
96
+ waitUntil(renderAppStream());
119
97
  }
120
- }
121
- async function serverRenderDetailsForApp(app, {
122
- url,
123
- headers,
124
- cacheKey,
125
- extract: extractOptions
126
- } = {}) {
127
- const html = new server.HtmlManager();
128
- const http = new server$1.HttpManager({
98
+ const {
99
+ headers,
100
+ body
101
+ } = await renderToHTMLStream(appStream);
102
+ return new requestRouter.HTMLResponse(body, {
103
+ status: responseStatus,
129
104
  headers
130
105
  });
131
- const assets = new server$2.AssetsManager({
132
- cacheKey
133
- });
134
- const {
135
- decorate,
136
- ...rest
137
- } = extractOptions ?? {};
138
- const rendered = app ? await server$3.extract(app, {
139
- decorate(app) {
140
- return /*#__PURE__*/jsxRuntime.jsx(ServerContext.ServerContext, {
141
- http: http,
142
- html: html,
143
- url: url,
144
- assets: assets,
145
- children: decorate?.(app) ?? app
106
+ async function renderToHTMLStream(content) {
107
+ const headers = new Headers(appHeaders);
108
+ const [synchronousAssets, preloadAssets] = await Promise.all([assets$1?.entry({
109
+ cacheKey,
110
+ modules: assetsManager.usedModules({
111
+ timing: 'load'
112
+ })
113
+ }), assets$1?.modules(assetsManager.usedModules({
114
+ timing: 'preload'
115
+ }), {
116
+ cacheKey
117
+ })]);
118
+ if (synchronousAssets) {
119
+ for (const style of synchronousAssets.styles) {
120
+ headers.append('Link', preloadHeader(assets.styleAssetPreloadAttributes(style)));
121
+ }
122
+ for (const script of synchronousAssets.scripts) {
123
+ headers.append('Link', preloadHeader(assets.scriptAssetPreloadAttributes(script)));
124
+ }
125
+ }
126
+ if (renderHTML) {
127
+ const body = await renderHTML(content, {
128
+ manager: html,
129
+ assets: synchronousAssets,
130
+ preloadAssets
146
131
  });
147
- },
148
- ...rest
149
- }) : undefined;
150
- return {
151
- rendered,
152
- http,
153
- html,
154
- assets
155
- };
156
- }
157
- async function renderAppDetailsToHtmlString(details, {
158
- request,
159
- context,
160
- assets,
161
- html: htmlOptions
162
- }) {
163
- const {
164
- http,
165
- rendered,
166
- html: htmlManager,
167
- assets: assetsManager
168
- } = details;
169
- const cacheKey = assetsManager.cacheKey;
170
- const usedModules = assetsManager.usedModules({
171
- timing: 'load'
172
- });
173
- const [entryAssets, preloadAssets] = assets ? await Promise.all([assets.entry({
174
- modules: usedModules,
175
- cacheKey
176
- }), assets.modules(assetsManager.usedModules({
177
- timing: 'preload'
178
- }), {
179
- cacheKey
180
- })]) : [];
181
- let renderHtml;
182
- let rootElement;
183
- if (typeof htmlOptions === 'function') {
184
- renderHtml = htmlOptions;
185
- } else {
186
- rootElement = htmlOptions?.rootElement;
187
- renderHtml = defaultRenderHtml;
132
+ return {
133
+ headers,
134
+ body
135
+ };
136
+ }
137
+ const responseStream = new TextEncoderStream();
138
+ const body = responseStream.readable;
139
+ const renderFullHTML = async function renderFullHTML() {
140
+ const writer = responseStream.writable.getWriter();
141
+ writer.write(`<!DOCTYPE html>`);
142
+ const {
143
+ htmlAttributes,
144
+ bodyAttributes,
145
+ ...headProps
146
+ } = html.state;
147
+ const htmlContent = server$4.renderToStaticMarkup(
148
+ /*#__PURE__*/
149
+ // eslint-disable-next-line jsx-a11y/html-has-lang
150
+ jsxRuntime.jsxs("html", {
151
+ ...htmlAttributes,
152
+ children: [/*#__PURE__*/jsxRuntime.jsxs("head", {
153
+ children: [/*#__PURE__*/jsxRuntime.jsx(server.Head, {
154
+ ...headProps
155
+ }), synchronousAssets?.scripts.map(script => /*#__PURE__*/jsxRuntime.jsx(server.Script, {
156
+ asset: script,
157
+ baseUrl: baseUrl
158
+ }, script.source)), synchronousAssets?.styles.map(style => /*#__PURE__*/jsxRuntime.jsx(server.Style, {
159
+ asset: style,
160
+ baseUrl: baseUrl
161
+ }, style.source)), preloadAssets?.styles.map(style => /*#__PURE__*/jsxRuntime.jsx(server.StylePreload, {
162
+ asset: style,
163
+ baseUrl: baseUrl
164
+ }, style.source)), preloadAssets?.scripts.map(script => /*#__PURE__*/jsxRuntime.jsx(server.ScriptPreload, {
165
+ asset: script,
166
+ baseUrl: baseUrl
167
+ }, script.source))]
168
+ }), /*#__PURE__*/jsxRuntime.jsx("body", {
169
+ ...bodyAttributes,
170
+ dangerouslySetInnerHTML: {
171
+ __html: '%%CONTENT%%'
172
+ }
173
+ })]
174
+ }));
175
+ const [firstChunk, secondChunk] = htmlContent.split('%%CONTENT%%');
176
+ writer.write(firstChunk);
177
+ if (element != null) writer.write(`<div id="app">`);
178
+ const reader = content.getReader();
179
+
180
+ // eslint-disable-next-line no-constant-condition
181
+ while (true) {
182
+ const {
183
+ done,
184
+ value
185
+ } = await reader.read();
186
+ if (done) {
187
+ break;
188
+ }
189
+ writer.write(value);
190
+ }
191
+ if (element != null) writer.write(`</div>`);
192
+ const [newSynchronousAssets, newPreloadAssets] = await Promise.all([assets$1?.entry({
193
+ cacheKey,
194
+ modules: assetsManager.usedModules({
195
+ timing: 'load'
196
+ })
197
+ }), assets$1?.modules(assetsManager.usedModules({
198
+ timing: 'preload'
199
+ }), {
200
+ cacheKey
201
+ })]);
202
+ if (newSynchronousAssets) {
203
+ const diffedSynchronousAssets = diffBrowserAssetsEntries(newSynchronousAssets, synchronousAssets);
204
+ const diffedPreloadAssets = diffBrowserAssetsEntries(newPreloadAssets, preloadAssets);
205
+ const additionalAssetsContent = server$4.renderToStaticMarkup( /*#__PURE__*/jsxRuntime.jsxs(jsxRuntime.Fragment, {
206
+ children: [diffedSynchronousAssets.scripts.map(script => /*#__PURE__*/jsxRuntime.jsx(server.Script, {
207
+ asset: script,
208
+ baseUrl: baseUrl
209
+ }, script.source)), diffedSynchronousAssets.styles.map(style => /*#__PURE__*/jsxRuntime.jsx(server.Style, {
210
+ asset: style,
211
+ baseUrl: baseUrl
212
+ }, style.source)), diffedPreloadAssets.styles.map(style => /*#__PURE__*/jsxRuntime.jsx(server.StylePreload, {
213
+ asset: style,
214
+ baseUrl: baseUrl
215
+ }, style.source)), diffedPreloadAssets.scripts.map(script => /*#__PURE__*/jsxRuntime.jsx(server.ScriptPreload, {
216
+ asset: script,
217
+ baseUrl: baseUrl
218
+ }, script.source))]
219
+ }));
220
+ writer.write(additionalAssetsContent);
221
+ }
222
+ writer.write(secondChunk);
223
+ writer.close();
224
+ };
225
+ waitUntil(renderFullHTML());
226
+ return {
227
+ headers,
228
+ body
229
+ };
188
230
  }
189
- const htmlElement = await renderHtml(rendered, {
190
- request,
191
- context,
192
- html: htmlManager,
193
- http,
194
- assets: entryAssets,
195
- preloadAssets,
196
- rootElement
197
- });
198
- return server.renderHtmlToString(htmlElement);
199
231
  }
200
- const defaultRenderHtml = function defaultRenderHtml(content, {
201
- request,
202
- html,
203
- assets: assets$1,
204
- preloadAssets,
205
- rootElement
206
- }) {
207
- const baseUrl = new URL(request.url);
208
- return /*#__PURE__*/jsxRuntime.jsx(server.Html, {
209
- manager: html,
210
- rootElement: rootElement,
211
- headEndContent: /*#__PURE__*/jsxRuntime.jsxs(jsxRuntime.Fragment, {
212
- children: [assets$1 && assets$1.styles.map(style => {
213
- const attributes = assets.styleAssetAttributes(style, {
214
- baseUrl
215
- });
216
- return /*#__PURE__*/jsxRuntime.jsx("link", {
217
- ...attributes
218
- }, style.source);
219
- }), assets$1 && assets$1.scripts.map(script => {
220
- const isModule = script.attributes?.type === 'module';
221
- const attributes = assets.scriptAssetAttributes(script, {
222
- baseUrl
223
- });
224
- if (isModule) {
225
- return /*#__PURE__*/jsxRuntime.jsxs(react.Fragment, {
226
- children: [/*#__PURE__*/jsxRuntime.jsx("link", {
227
- ...assets.scriptAssetPreloadAttributes(script)
228
- }), /*#__PURE__*/jsxRuntime.jsx("script", {
229
- ...attributes,
230
- async: true
231
- })]
232
- }, script.source);
233
- }
234
- return /*#__PURE__*/jsxRuntime.jsx("script", {
235
- ...attributes,
236
- defer: true
237
- }, script.source);
238
- }), preloadAssets && preloadAssets.styles.map(style => {
239
- const attributes = assets.styleAssetPreloadAttributes(style, {
240
- baseUrl
241
- });
242
- return /*#__PURE__*/jsxRuntime.jsx("link", {
243
- ...attributes
244
- }, style.source);
245
- }), preloadAssets && preloadAssets.scripts.map(script => {
246
- const attributes = assets.scriptAssetPreloadAttributes(script, {
247
- baseUrl
248
- });
249
- return /*#__PURE__*/jsxRuntime.jsx("link", {
250
- ...attributes
251
- }, script.source);
252
- })]
253
- }),
254
- children: content
255
- });
256
- };
257
232
  function preloadHeader(attributes) {
258
233
  const {
259
234
  as,
@@ -273,7 +248,16 @@ function preloadHeader(attributes) {
273
248
  }
274
249
  return header;
275
250
  }
251
+ function diffBrowserAssetsEntries(newList, oldList) {
252
+ const oldStyles = new Set(oldList.styles.map(style => style.source));
253
+ const oldScripts = new Set(oldList.scripts.map(script => script.source));
254
+ return {
255
+ styles: newList.styles.filter(style => !oldStyles.has(style.source)),
256
+ scripts: newList.scripts.filter(script => !oldScripts.has(script.source))
257
+ };
258
+ }
259
+ function noop(..._args) {
260
+ // noop
261
+ }
276
262
 
277
- exports.createServerRender = createServerRender;
278
- exports.renderAppToResponse = renderAppToResponse;
279
- exports.renderAppToStreamedResponse = renderAppToStreamedResponse;
263
+ exports.renderToResponse = renderToResponse;