@quilted/quilt 0.0.0-Simpler-Quilt-app-context-component-20220421223224

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 (191) hide show
  1. package/CHANGELOG.md +189 -0
  2. package/build/cjs/AppContext.cjs +22 -0
  3. package/build/cjs/email.cjs +32 -0
  4. package/build/cjs/env.cjs +7 -0
  5. package/build/cjs/global.cjs +5 -0
  6. package/build/cjs/html.cjs +112 -0
  7. package/build/cjs/http-handlers/index.cjs +14 -0
  8. package/build/cjs/http-handlers/node.cjs +14 -0
  9. package/build/cjs/http.cjs +108 -0
  10. package/build/cjs/index.cjs +187 -0
  11. package/build/cjs/matchers.cjs +5 -0
  12. package/build/cjs/polyfills/base.cjs +4 -0
  13. package/build/cjs/polyfills/crypto.cjs +4 -0
  14. package/build/cjs/polyfills/fetch.cjs +4 -0
  15. package/build/cjs/polyfills/noop.cjs +4 -0
  16. package/build/cjs/react/index.cjs +22 -0
  17. package/build/cjs/react/jsx-runtime.cjs +14 -0
  18. package/build/cjs/react/server.cjs +14 -0
  19. package/build/cjs/react/test-utils.cjs +14 -0
  20. package/build/cjs/server/ServerContext.cjs +22 -0
  21. package/build/cjs/server/http-handler.cjs +87 -0
  22. package/build/cjs/server/index.cjs +89 -0
  23. package/build/cjs/server/render.cjs +46 -0
  24. package/build/cjs/static/StaticContext.cjs +22 -0
  25. package/build/cjs/static/index.cjs +306 -0
  26. package/build/cjs/static/render.cjs +46 -0
  27. package/build/cjs/testing.cjs +42 -0
  28. package/build/cjs/utilities/react.cjs +14 -0
  29. package/build/cjs/workers/index.cjs +14 -0
  30. package/build/cjs/workers/worker.cjs +14 -0
  31. package/build/esm/AppContext.mjs +18 -0
  32. package/build/esm/email.mjs +1 -0
  33. package/build/esm/env.mjs +3 -0
  34. package/build/esm/global.mjs +3 -0
  35. package/build/esm/html.mjs +1 -0
  36. package/build/esm/http-handlers/index.mjs +1 -0
  37. package/build/esm/http-handlers/node.mjs +1 -0
  38. package/build/esm/http.mjs +1 -0
  39. package/build/esm/index.mjs +11 -0
  40. package/build/esm/matchers.mjs +2 -0
  41. package/build/esm/polyfills/base.mjs +1 -0
  42. package/build/esm/polyfills/crypto.mjs +1 -0
  43. package/build/esm/polyfills/fetch.mjs +1 -0
  44. package/build/esm/polyfills/noop.mjs +1 -0
  45. package/build/esm/react/index.mjs +2 -0
  46. package/build/esm/react/jsx-runtime.mjs +1 -0
  47. package/build/esm/react/server.mjs +1 -0
  48. package/build/esm/react/test-utils.mjs +1 -0
  49. package/build/esm/server/ServerContext.mjs +18 -0
  50. package/build/esm/server/http-handler.mjs +81 -0
  51. package/build/esm/server/index.mjs +9 -0
  52. package/build/esm/server/render.mjs +42 -0
  53. package/build/esm/static/StaticContext.mjs +18 -0
  54. package/build/esm/static/index.mjs +284 -0
  55. package/build/esm/static/render.mjs +42 -0
  56. package/build/esm/testing.mjs +3 -0
  57. package/build/esm/utilities/react.mjs +10 -0
  58. package/build/esm/workers/index.mjs +1 -0
  59. package/build/esm/workers/worker.mjs +1 -0
  60. package/build/esnext/AppContext.esnext +18 -0
  61. package/build/esnext/email.esnext +1 -0
  62. package/build/esnext/env.esnext +3 -0
  63. package/build/esnext/global.esnext +3 -0
  64. package/build/esnext/html.esnext +1 -0
  65. package/build/esnext/http-handlers/index.esnext +1 -0
  66. package/build/esnext/http-handlers/node.esnext +1 -0
  67. package/build/esnext/http.esnext +1 -0
  68. package/build/esnext/index.esnext +11 -0
  69. package/build/esnext/matchers.esnext +2 -0
  70. package/build/esnext/polyfills/base.esnext +1 -0
  71. package/build/esnext/polyfills/crypto.esnext +1 -0
  72. package/build/esnext/polyfills/fetch.esnext +1 -0
  73. package/build/esnext/polyfills/noop.esnext +1 -0
  74. package/build/esnext/react/index.esnext +2 -0
  75. package/build/esnext/react/jsx-runtime.esnext +1 -0
  76. package/build/esnext/react/server.esnext +1 -0
  77. package/build/esnext/react/test-utils.esnext +1 -0
  78. package/build/esnext/server/ServerContext.esnext +18 -0
  79. package/build/esnext/server/http-handler.esnext +81 -0
  80. package/build/esnext/server/index.esnext +9 -0
  81. package/build/esnext/server/render.esnext +40 -0
  82. package/build/esnext/static/StaticContext.esnext +18 -0
  83. package/build/esnext/static/index.esnext +280 -0
  84. package/build/esnext/static/render.esnext +40 -0
  85. package/build/esnext/testing.esnext +3 -0
  86. package/build/esnext/utilities/react.esnext +10 -0
  87. package/build/esnext/workers/index.esnext +1 -0
  88. package/build/esnext/workers/worker.esnext +1 -0
  89. package/build/tsconfig.tsbuildinfo +1 -0
  90. package/build/typescript/App.d.ts +15 -0
  91. package/build/typescript/App.d.ts.map +1 -0
  92. package/build/typescript/AppContext.d.ts +8 -0
  93. package/build/typescript/AppContext.d.ts.map +1 -0
  94. package/build/typescript/email.d.ts +3 -0
  95. package/build/typescript/email.d.ts.map +1 -0
  96. package/build/typescript/env.d.ts +5 -0
  97. package/build/typescript/env.d.ts.map +1 -0
  98. package/build/typescript/global.d.ts +2 -0
  99. package/build/typescript/global.d.ts.map +1 -0
  100. package/build/typescript/html.d.ts +3 -0
  101. package/build/typescript/html.d.ts.map +1 -0
  102. package/build/typescript/http-handlers/index.d.ts +2 -0
  103. package/build/typescript/http-handlers/index.d.ts.map +1 -0
  104. package/build/typescript/http-handlers/node.d.ts +2 -0
  105. package/build/typescript/http-handlers/node.d.ts.map +1 -0
  106. package/build/typescript/http.d.ts +2 -0
  107. package/build/typescript/http.d.ts.map +1 -0
  108. package/build/typescript/index.d.ts +21 -0
  109. package/build/typescript/index.d.ts.map +1 -0
  110. package/build/typescript/magic/app.d.ts +4 -0
  111. package/build/typescript/magic/app.d.ts.map +1 -0
  112. package/build/typescript/magic/asset-loader.d.ts +6 -0
  113. package/build/typescript/magic/asset-loader.d.ts.map +1 -0
  114. package/build/typescript/magic/http-handler.d.ts +4 -0
  115. package/build/typescript/magic/http-handler.d.ts.map +1 -0
  116. package/build/typescript/matchers.d.ts +3 -0
  117. package/build/typescript/matchers.d.ts.map +1 -0
  118. package/build/typescript/polyfills/base.d.ts +2 -0
  119. package/build/typescript/polyfills/base.d.ts.map +1 -0
  120. package/build/typescript/polyfills/crypto.d.ts +2 -0
  121. package/build/typescript/polyfills/crypto.d.ts.map +1 -0
  122. package/build/typescript/polyfills/fetch.d.ts +2 -0
  123. package/build/typescript/polyfills/fetch.d.ts.map +1 -0
  124. package/build/typescript/polyfills/noop.d.ts +2 -0
  125. package/build/typescript/polyfills/noop.d.ts.map +1 -0
  126. package/build/typescript/react/index.d.ts +3 -0
  127. package/build/typescript/react/index.d.ts.map +1 -0
  128. package/build/typescript/react/jsx-runtime.d.ts +2 -0
  129. package/build/typescript/react/jsx-runtime.d.ts.map +1 -0
  130. package/build/typescript/react/server.d.ts +2 -0
  131. package/build/typescript/react/server.d.ts.map +1 -0
  132. package/build/typescript/react/test-utils.d.ts +2 -0
  133. package/build/typescript/react/test-utils.d.ts.map +1 -0
  134. package/build/typescript/server/ServerContext.d.ts +13 -0
  135. package/build/typescript/server/ServerContext.d.ts.map +1 -0
  136. package/build/typescript/server/http-handler.d.ts +15 -0
  137. package/build/typescript/server/http-handler.d.ts.map +1 -0
  138. package/build/typescript/server/index.d.ts +13 -0
  139. package/build/typescript/server/index.d.ts.map +1 -0
  140. package/build/typescript/server/render.d.ts +17 -0
  141. package/build/typescript/server/render.d.ts.map +1 -0
  142. package/build/typescript/static/StaticContext.d.ts +13 -0
  143. package/build/typescript/static/StaticContext.d.ts.map +1 -0
  144. package/build/typescript/static/index.d.ts +22 -0
  145. package/build/typescript/static/index.d.ts.map +1 -0
  146. package/build/typescript/static/render.d.ts +17 -0
  147. package/build/typescript/static/render.d.ts.map +1 -0
  148. package/build/typescript/testing.d.ts +4 -0
  149. package/build/typescript/testing.d.ts.map +1 -0
  150. package/build/typescript/utilities/react.d.ts +3 -0
  151. package/build/typescript/utilities/react.d.ts.map +1 -0
  152. package/build/typescript/workers/index.d.ts +2 -0
  153. package/build/typescript/workers/index.d.ts.map +1 -0
  154. package/build/typescript/workers/worker.d.ts +2 -0
  155. package/build/typescript/workers/worker.d.ts.map +1 -0
  156. package/package.json +282 -0
  157. package/quilt.project.ts +48 -0
  158. package/source/AppContext.tsx +21 -0
  159. package/source/email.ts +9 -0
  160. package/source/env.ts +5 -0
  161. package/source/global.ts +3 -0
  162. package/source/html.ts +29 -0
  163. package/source/http-handlers/index.ts +1 -0
  164. package/source/http-handlers/node.ts +1 -0
  165. package/source/http.ts +27 -0
  166. package/source/index.ts +103 -0
  167. package/source/magic/app.ts +5 -0
  168. package/source/magic/asset-loader.ts +5 -0
  169. package/source/magic/http-handler.ts +5 -0
  170. package/source/matchers.ts +2 -0
  171. package/source/polyfills/README.md +3 -0
  172. package/source/polyfills/base.ts +1 -0
  173. package/source/polyfills/crypto.ts +1 -0
  174. package/source/polyfills/fetch.ts +1 -0
  175. package/source/polyfills/noop.ts +1 -0
  176. package/source/react/index.ts +4 -0
  177. package/source/react/jsx-runtime.ts +2 -0
  178. package/source/react/server.ts +2 -0
  179. package/source/react/test-utils.ts +2 -0
  180. package/source/server/ServerContext.tsx +42 -0
  181. package/source/server/http-handler.tsx +101 -0
  182. package/source/server/index.ts +45 -0
  183. package/source/server/render.tsx +43 -0
  184. package/source/static/StaticContext.tsx +42 -0
  185. package/source/static/index.tsx +307 -0
  186. package/source/static/render.tsx +43 -0
  187. package/source/testing.ts +7 -0
  188. package/source/utilities/react.tsx +13 -0
  189. package/source/workers/index.ts +1 -0
  190. package/source/workers/worker.ts +1 -0
  191. package/tsconfig.json +30 -0
@@ -0,0 +1,103 @@
1
+ export {createAsyncLoader} from '@quilted/async';
2
+ export type {AsyncLoader} from '@quilted/async';
3
+ export {
4
+ useAsync,
5
+ useAsyncAsset,
6
+ usePreload,
7
+ createAsyncComponent,
8
+ } from '@quilted/react-async';
9
+ export type {
10
+ NoOptions,
11
+ AssetLoadTiming,
12
+ HydrationTiming,
13
+ RenderTiming,
14
+ AsyncComponentType,
15
+ Preloadable,
16
+ } from '@quilted/react-async';
17
+ export {
18
+ GraphQLContext,
19
+ createGraphQL,
20
+ createGraphQLHttpFetch,
21
+ useQuery,
22
+ useGraphQL,
23
+ useMutation,
24
+ } from '@quilted/react-graphql';
25
+ export type {
26
+ GraphQL,
27
+ GraphQLResult,
28
+ GraphQLFetch,
29
+ GraphQLData,
30
+ GraphQLVariables,
31
+ GraphQLRequest,
32
+ GraphQLRequestContext,
33
+ GraphQLOperation,
34
+ GraphQLOperationType,
35
+ GraphQLDeepPartialData,
36
+ GraphQLHttpFetchContext,
37
+ GraphQLHttpFetchOptions,
38
+ PickGraphQLType,
39
+ GraphQLVariableOptions,
40
+ GraphQLQueryOptions,
41
+ GraphQLMutationOptions,
42
+ } from '@quilted/react-graphql';
43
+ export {useIdleCallback} from '@quilted/react-idle';
44
+ export {ServerAction, useServerAction} from '@quilted/react-server-render';
45
+ export type {
46
+ ServerActionKind,
47
+ ServerActionOptions,
48
+ ServerActionPerform,
49
+ ServerRenderPass,
50
+ } from '@quilted/react-server-render';
51
+ export {
52
+ Localization,
53
+ useLocale,
54
+ useLocaleFromEnvironment,
55
+ useLocalizedFormatting,
56
+ } from '@quilted/react-localize';
57
+ export type {
58
+ LocalizedFormatting,
59
+ LocalizedFormattingCache,
60
+ LocalizedNumberFormatOptions,
61
+ LocalizedDateTimeFormatOptions,
62
+ } from '@quilted/react-localize';
63
+ export {
64
+ PerformanceContext,
65
+ usePerformance,
66
+ usePerformanceNavigation,
67
+ } from '@quilted/react-performance';
68
+ export type {
69
+ Performance,
70
+ PerformanceNavigation,
71
+ PerformanceInflightNavigation,
72
+ } from '@quilted/react-performance';
73
+ export {
74
+ Link,
75
+ Redirect,
76
+ Router,
77
+ Preloader,
78
+ NavigationBlock,
79
+ useCurrentUrl,
80
+ useInitialUrl,
81
+ useRouter,
82
+ useRoutes,
83
+ useMatch,
84
+ useNavigate,
85
+ useRedirect,
86
+ useNavigationBlock,
87
+ useScrollRestoration,
88
+ useRouteChangeFocusRef,
89
+ } from '@quilted/react-router';
90
+ export type {NavigateTo, RouteDefinition} from '@quilted/react-router';
91
+ export {
92
+ useWorker,
93
+ createWorker,
94
+ createCallableWorker,
95
+ } from '@quilted/react-workers';
96
+ export type {
97
+ BasicWorkerCreator,
98
+ CallableWorkerCreator,
99
+ } from '@quilted/react-workers';
100
+ export {useCookie, useCookies, CookieContext} from '@quilted/react-http';
101
+ export type {PropsWithChildren} from '@quilted/useful-react-types';
102
+
103
+ export {AppContext} from './AppContext';
@@ -0,0 +1,5 @@
1
+ import type {ComponentType} from 'react';
2
+
3
+ declare const App: ComponentType<Record<string, unknown>>;
4
+
5
+ export default App;
@@ -0,0 +1,5 @@
1
+ import type {AssetLoader} from '@quilted/async/server';
2
+
3
+ declare const assets: AssetLoader<{userAgent?: string}>;
4
+
5
+ export default assets;
@@ -0,0 +1,5 @@
1
+ import type {HttpHandler} from '@quilted/http-handlers';
2
+
3
+ declare const handler: HttpHandler;
4
+
5
+ export default handler;
@@ -0,0 +1,2 @@
1
+ import '@quilted/react-testing/matchers';
2
+ import '@quilted/graphql/matchers';
@@ -0,0 +1,3 @@
1
+ # `@quilted/quilt/polyfills/*`
2
+
3
+ This directory re-exports the polyfills provided by `@quilted/polyfills`. This is done because most consumers will have a dependency only on `@quilted/quilt`, not `@quilted/polyfills`, but we need to insert imports for polyfills into “app code”. Strict package managers, like `pnpm`, will then install `@quilted/polyfills` in such a way that imports of that package fail to resolve. To fix this, we re-export all the entry points that can be inserted in app code from `@quilted/quilt/polyfills/*`.
@@ -0,0 +1 @@
1
+ import '@quilted/polyfills/base';
@@ -0,0 +1 @@
1
+ import '@quilted/polyfills/crypto';
@@ -0,0 +1 @@
1
+ import '@quilted/polyfills/fetch';
@@ -0,0 +1 @@
1
+ import '@quilted/polyfills/noop';
@@ -0,0 +1,4 @@
1
+ // @ts-expect-error This module is not imported for types
2
+ export * from '@quilted/react';
3
+ // @ts-expect-error This module is not imported for types
4
+ export {default} from '@quilted/react';
@@ -0,0 +1,2 @@
1
+ // @ts-expect-error This module is not imported for types
2
+ export * from '@quilted/react/jsx-runtime';
@@ -0,0 +1,2 @@
1
+ // @ts-expect-error This module is never imported for types
2
+ export * from '@quilted/react/server';
@@ -0,0 +1,2 @@
1
+ // @ts-expect-error This module is not imported for types
2
+ export * from '@quilted/react/test-utils';
@@ -0,0 +1,42 @@
1
+ import type {PropsWithChildren} from 'react';
2
+
3
+ import {InitialUrlContext} from '@quilted/react-router';
4
+ import {HtmlContext} from '@quilted/react-html/server';
5
+ import type {HtmlManager} from '@quilted/react-html/server';
6
+ import {AsyncAssetContext} from '@quilted/react-async/server';
7
+ import type {AsyncAssetManager} from '@quilted/react-async/server';
8
+ import {HttpServerContext} from '@quilted/react-http/server';
9
+ import type {HttpManager} from '@quilted/react-http/server';
10
+
11
+ import {maybeWrapContext} from '../utilities/react';
12
+
13
+ interface Props {
14
+ url?: string | URL;
15
+ html?: HtmlManager;
16
+ http?: HttpManager;
17
+ asyncAssets?: AsyncAssetManager;
18
+ }
19
+
20
+ export function ServerContext({
21
+ url,
22
+ html,
23
+ http,
24
+ asyncAssets,
25
+ children,
26
+ }: PropsWithChildren<Props>) {
27
+ const normalizedUrl = typeof url === 'string' ? new URL(url) : url;
28
+
29
+ return maybeWrapContext(
30
+ AsyncAssetContext,
31
+ asyncAssets,
32
+ maybeWrapContext(
33
+ HttpServerContext,
34
+ http,
35
+ maybeWrapContext(
36
+ HtmlContext,
37
+ html,
38
+ maybeWrapContext(InitialUrlContext, normalizedUrl, children),
39
+ ),
40
+ ),
41
+ );
42
+ }
@@ -0,0 +1,101 @@
1
+ import type {ComponentType, ReactElement} from 'react';
2
+
3
+ import type {AssetLoader} from '@quilted/async/server';
4
+ import {render as renderToString, Html} from '@quilted/react-html/server';
5
+ import type {Options as ExtractOptions} from '@quilted/react-server-render/server';
6
+
7
+ import {createHttpHandler, html, redirect} from '@quilted/http-handlers';
8
+ import type {
9
+ Request,
10
+ HttpHandler,
11
+ RequestHandler,
12
+ } from '@quilted/http-handlers';
13
+
14
+ import {renderApp} from './render';
15
+
16
+ export interface Options<Props = Record<string, never>> extends ExtractOptions {
17
+ assets?: AssetLoader<unknown>;
18
+ handler?: HttpHandler;
19
+ renderProps?(options: {request: Request}): Props;
20
+ }
21
+
22
+ export function createServerRenderingHttpHandler<Props>(
23
+ App: ComponentType<Props>,
24
+ {handler = createHttpHandler(), ...options}: Options<Props>,
25
+ ) {
26
+ handler.get(createServerRenderingRequestHandler(App, options));
27
+ return handler;
28
+ }
29
+
30
+ export function createServerRenderingRequestHandler<Props>(
31
+ App: ComponentType<Props>,
32
+ {renderProps, ...options}: Omit<Options<Props>, 'handler'> = {},
33
+ ): RequestHandler {
34
+ return (request) => {
35
+ return renderToResponse(
36
+ <App {...(renderProps?.({request}) as any)} />,
37
+ request,
38
+ options,
39
+ );
40
+ };
41
+ }
42
+
43
+ export async function renderToResponse<Props>(
44
+ element: ReactElement<Props>,
45
+ request: Request,
46
+ {assets, ...options}: Omit<Options<Props>, 'handler' | 'renderProps'> = {},
47
+ ) {
48
+ const accepts = request.headers.get('Accept');
49
+
50
+ if (accepts != null && !accepts.includes('text/html')) return;
51
+
52
+ const {
53
+ html: htmlManager,
54
+ http,
55
+ markup,
56
+ asyncAssets,
57
+ } = await renderApp(element, {
58
+ ...options,
59
+ url: request.url,
60
+ headers: request.headers,
61
+ });
62
+
63
+ const {headers, statusCode = 200, redirectUrl} = http.state;
64
+
65
+ if (redirectUrl) {
66
+ return redirect(redirectUrl, {
67
+ status: statusCode as 301,
68
+ headers,
69
+ });
70
+ }
71
+
72
+ const usedAssets = asyncAssets.used({timing: 'load'});
73
+ const assetOptions = {userAgent: request.headers.get('User-Agent')};
74
+
75
+ const [styles, scripts, preload] = assets
76
+ ? await Promise.all([
77
+ assets.styles({async: usedAssets, options: assetOptions}),
78
+ assets.scripts({async: usedAssets, options: assetOptions}),
79
+ assets.asyncAssets(asyncAssets.used({timing: 'preload'}), {
80
+ options: assetOptions,
81
+ }),
82
+ ])
83
+ : [];
84
+
85
+ return html(
86
+ renderToString(
87
+ <Html
88
+ manager={htmlManager}
89
+ styles={styles}
90
+ scripts={scripts}
91
+ preloadAssets={preload}
92
+ >
93
+ {markup}
94
+ </Html>,
95
+ ),
96
+ {
97
+ headers,
98
+ status: statusCode,
99
+ },
100
+ );
101
+ }
@@ -0,0 +1,45 @@
1
+ export {
2
+ render,
3
+ Html,
4
+ Serialize,
5
+ HtmlManager,
6
+ HtmlContext,
7
+ SERVER_ACTION_ID as HTML_SERVER_ACTION_ID,
8
+ } from '@quilted/react-html/server';
9
+ export {
10
+ ServerAction,
11
+ useServerAction,
12
+ ServerRenderManager,
13
+ ServerRenderContext,
14
+ extract,
15
+ } from '@quilted/react-server-render/server';
16
+ export {createAssetLoader} from '@quilted/async/server';
17
+ export type {
18
+ Asset,
19
+ AssetLoader,
20
+ AssetSelector,
21
+ AssetManifest,
22
+ AssetManifestEntry,
23
+ } from '@quilted/async/server';
24
+ export {
25
+ AsyncAssetContext,
26
+ AsyncAssetManager,
27
+ SERVER_ACTION_ID as ASYNC_ASSETS_SERVER_ACTION_ID,
28
+ } from '@quilted/react-async/server';
29
+ export type {
30
+ ServerActionKind,
31
+ ServerActionOptions,
32
+ ServerActionPerform,
33
+ ServerRenderPass,
34
+ } from '@quilted/react-server-render/server';
35
+ export {renderEmail} from '@quilted/react-email/server';
36
+ export type {HttpState} from '@quilted/react-http/server';
37
+ export {createHttpHandler} from '@quilted/http-handlers';
38
+
39
+ export {renderApp} from './render';
40
+ export {ServerContext} from './ServerContext';
41
+ export {
42
+ createServerRenderingRequestHandler,
43
+ createServerRenderingHttpHandler,
44
+ renderToResponse,
45
+ } from './http-handler';
@@ -0,0 +1,43 @@
1
+ import type {ReactElement} from 'react';
2
+
3
+ import {extract} from '@quilted/react-server-render/server';
4
+ import type {Options as ExtractOptions} from '@quilted/react-server-render/server';
5
+ import {HtmlManager} from '@quilted/react-html/server';
6
+ import {HttpManager} from '@quilted/react-http/server';
7
+ import {AsyncAssetManager} from '@quilted/react-async/server';
8
+
9
+ import {ServerContext} from './ServerContext';
10
+
11
+ interface Options extends ExtractOptions {
12
+ url?: string | URL;
13
+ headers?: NonNullable<
14
+ ConstructorParameters<typeof HttpManager>[0]
15
+ >['headers'];
16
+ }
17
+
18
+ export async function renderApp(
19
+ app: ReactElement<any>,
20
+ {decorate, url, headers, ...rest}: Options = {},
21
+ ) {
22
+ const html = new HtmlManager();
23
+ const asyncAssets = new AsyncAssetManager();
24
+ const http = new HttpManager({headers});
25
+
26
+ const markup = await extract(app, {
27
+ decorate(app) {
28
+ return (
29
+ <ServerContext
30
+ asyncAssets={asyncAssets}
31
+ http={http}
32
+ html={html}
33
+ url={url}
34
+ >
35
+ {decorate?.(app) ?? app}
36
+ </ServerContext>
37
+ );
38
+ },
39
+ ...rest,
40
+ });
41
+
42
+ return {markup, http, html, asyncAssets};
43
+ }
@@ -0,0 +1,42 @@
1
+ import type {PropsWithChildren} from 'react';
2
+
3
+ import {InitialUrlContext} from '@quilted/react-router';
4
+ import {HtmlContext} from '@quilted/react-html/server';
5
+ import type {HtmlManager} from '@quilted/react-html/server';
6
+ import {AsyncAssetContext} from '@quilted/react-async/server';
7
+ import type {AsyncAssetManager} from '@quilted/react-async/server';
8
+ import {HttpServerContext} from '@quilted/react-http/server';
9
+ import type {HttpManager} from '@quilted/react-http/server';
10
+
11
+ import {maybeWrapContext} from '../utilities/react';
12
+
13
+ interface Props {
14
+ url?: string | URL;
15
+ html?: HtmlManager;
16
+ http?: HttpManager;
17
+ asyncAssets?: AsyncAssetManager;
18
+ }
19
+
20
+ export function StaticContext({
21
+ url,
22
+ html,
23
+ http,
24
+ asyncAssets,
25
+ children,
26
+ }: PropsWithChildren<Props>) {
27
+ const normalizedUrl = typeof url === 'string' ? new URL(url) : url;
28
+
29
+ return maybeWrapContext(
30
+ AsyncAssetContext,
31
+ asyncAssets,
32
+ maybeWrapContext(
33
+ HttpServerContext,
34
+ http,
35
+ maybeWrapContext(
36
+ HtmlContext,
37
+ html,
38
+ maybeWrapContext(InitialUrlContext, normalizedUrl, children),
39
+ ),
40
+ ),
41
+ );
42
+ }