@quilted/quilt 0.6.13 → 0.6.15

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 (58) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/build/esm/assets.mjs +0 -1
  3. package/build/esm/async.mjs +2 -2
  4. package/build/esm/browser.mjs +2 -0
  5. package/build/esm/globals.mjs +3 -3
  6. package/build/esm/navigate.mjs +1 -1
  7. package/build/esm/server/ServerContext.mjs +10 -22
  8. package/build/esm/server/request-router.mjs +53 -95
  9. package/build/esm/server.mjs +1 -5
  10. package/build/esm/signals.mjs +1 -2
  11. package/build/esnext/assets.esnext +0 -1
  12. package/build/esnext/async.esnext +2 -2
  13. package/build/esnext/browser.esnext +2 -0
  14. package/build/esnext/globals.esnext +3 -3
  15. package/build/esnext/navigate.esnext +1 -1
  16. package/build/esnext/server/ServerContext.esnext +8 -17
  17. package/build/esnext/server/request-router.esnext +59 -86
  18. package/build/esnext/server.esnext +1 -5
  19. package/build/esnext/signals.esnext +1 -2
  20. package/build/tsconfig.tsbuildinfo +1 -1
  21. package/build/typescript/assets.d.ts +0 -1
  22. package/build/typescript/assets.d.ts.map +1 -1
  23. package/build/typescript/async.d.ts +2 -4
  24. package/build/typescript/async.d.ts.map +1 -1
  25. package/build/typescript/browser.d.ts +3 -0
  26. package/build/typescript/browser.d.ts.map +1 -0
  27. package/build/typescript/globals.d.ts +2 -2
  28. package/build/typescript/globals.d.ts.map +1 -1
  29. package/build/typescript/navigate.d.ts +1 -1
  30. package/build/typescript/server/ServerContext.d.ts +3 -8
  31. package/build/typescript/server/ServerContext.d.ts.map +1 -1
  32. package/build/typescript/server/request-router.d.ts +9 -8
  33. package/build/typescript/server/request-router.d.ts.map +1 -1
  34. package/build/typescript/server.d.ts +1 -7
  35. package/build/typescript/server.d.ts.map +1 -1
  36. package/build/typescript/signals.d.ts +1 -2
  37. package/build/typescript/signals.d.ts.map +1 -1
  38. package/package.json +27 -32
  39. package/source/assets.ts +0 -1
  40. package/source/async.ts +13 -12
  41. package/source/browser.ts +5 -0
  42. package/source/globals.ts +4 -7
  43. package/source/navigate.ts +1 -1
  44. package/source/server/ServerContext.tsx +17 -38
  45. package/source/server/request-router.tsx +81 -110
  46. package/source/server.ts +1 -33
  47. package/source/signals.ts +1 -12
  48. package/tsconfig.json +1 -4
  49. package/build/esm/html/HTML.mjs +0 -19
  50. package/build/esm/html.mjs +0 -3
  51. package/build/esm/http.mjs +0 -1
  52. package/build/esnext/html/HTML.esnext +0 -16
  53. package/build/esnext/html.esnext +0 -3
  54. package/build/esnext/http.esnext +0 -1
  55. package/source/html/HTML.tsx +0 -22
  56. package/source/html.ts +0 -40
  57. package/source/http.ts +0 -37
  58. package/source/routing.ts +0 -24
@@ -1,12 +1,9 @@
1
1
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
2
  import { isValidElement } from 'react';
3
- import { renderToStaticMarkup } from 'react-dom/server';
3
+ import { renderToStringAsync, renderToStaticMarkup } from 'preact-render-to-string';
4
4
  import { styleAssetPreloadAttributes, scriptAssetPreloadAttributes } from '@quilted/assets';
5
- import { AssetsManager } from '@quilted/react-assets/server';
6
- import { HttpManager } from '@quilted/react-http/server';
7
- import { HTMLManager, Head, Script, Style, StylePreload, ScriptPreload } from '@quilted/react-html/server';
8
- import { extract } from '@quilted/react-server-render/server';
9
- import { RedirectResponse, HTMLResponse } from '@quilted/request-router';
5
+ import { BrowserResponse, ScriptAsset, StyleAsset, StyleAssetPreload, ScriptAssetPreload } from '@quilted/react-browser/server';
6
+ import { HTMLResponse } from '@quilted/request-router';
10
7
  import { ServerContext } from './ServerContext.esnext';
11
8
 
12
9
  async function renderToResponse(optionsOrElement, definitelyOptions) {
@@ -21,55 +18,28 @@ async function renderToResponse(optionsOrElement, definitelyOptions) {
21
18
  const {
22
19
  request,
23
20
  assets,
21
+ status: explicitStatus,
24
22
  cacheKey: explicitCacheKey,
25
23
  headers: explicitHeaders,
24
+ serializations: explicitSerializations,
26
25
  waitUntil = noop,
27
26
  stream: shouldStream = false,
28
27
  renderHTML = true
29
28
  } = options;
30
- const baseUrl = request.URL ?? new URL(request.url);
29
+ const baseURL = request.URL ?? new URL(request.url);
31
30
  const cacheKey = explicitCacheKey ?? (await assets?.cacheKey?.(request) ?? {});
32
- const html = new HTMLManager();
33
- const http = new HttpManager({ headers: request.headers });
34
- const assetsManager = new AssetsManager({ cacheKey });
35
- let responseStatus = 200;
31
+ const browserResponse = new BrowserResponse({
32
+ request,
33
+ cacheKey,
34
+ status: explicitStatus,
35
+ headers: new Headers(explicitHeaders),
36
+ serializations: explicitSerializations
37
+ });
36
38
  let appStream;
37
- const headers = new Headers(explicitHeaders);
38
39
  if (shouldStream === false && element != null) {
39
- const rendered = await extract(element, {
40
- decorate(element2) {
41
- return /* @__PURE__ */ jsx(
42
- ServerContext,
43
- {
44
- http,
45
- html,
46
- url: baseUrl,
47
- assets: assetsManager,
48
- children: element2
49
- }
50
- );
51
- }
52
- });
53
- const { headers: appHeaders, statusCode = 200, redirectUrl } = http.state;
54
- const hasSetCookieHeader = typeof appHeaders.getSetCookie === "function";
55
- if (hasSetCookieHeader) {
56
- for (const cookie of appHeaders.getSetCookie()) {
57
- headers.append("Set-Cookie", cookie);
58
- }
59
- }
60
- for (const [header, value] of appHeaders.entries()) {
61
- if (hasSetCookieHeader && header.toLowerCase() === "set-cookie")
62
- continue;
63
- headers.set(header, value);
64
- }
65
- if (redirectUrl) {
66
- return new RedirectResponse(redirectUrl, {
67
- status: statusCode,
68
- headers,
69
- request
70
- });
71
- }
72
- responseStatus = statusCode;
40
+ const rendered = await renderToStringAsync(
41
+ /* @__PURE__ */ jsx(ServerContext, { browser: browserResponse, children: element })
42
+ );
73
43
  const appTransformStream = new TransformStream();
74
44
  const appWriter = appTransformStream.writable.getWriter();
75
45
  appStream = appTransformStream.readable;
@@ -82,20 +52,9 @@ async function renderToResponse(optionsOrElement, definitelyOptions) {
82
52
  const renderAppStream = async function renderAppStream2() {
83
53
  const appWriter = appTransformStream.writable.getWriter();
84
54
  if (element != null) {
85
- const rendered = await extract(element, {
86
- decorate(element2) {
87
- return /* @__PURE__ */ jsx(
88
- ServerContext,
89
- {
90
- http,
91
- html,
92
- url: baseUrl,
93
- assets: assetsManager,
94
- children: element2
95
- }
96
- );
97
- }
98
- });
55
+ const rendered = await renderToStringAsync(
56
+ /* @__PURE__ */ jsx(ServerContext, { browser: browserResponse, children: element })
57
+ );
99
58
  appWriter.write(rendered);
100
59
  }
101
60
  appWriter.close();
@@ -104,28 +63,28 @@ async function renderToResponse(optionsOrElement, definitelyOptions) {
104
63
  }
105
64
  const body = await renderToHTMLBody(appStream);
106
65
  return new HTMLResponse(body, {
107
- status: responseStatus,
108
- headers
66
+ status: browserResponse.status.value,
67
+ headers: browserResponse.headers
109
68
  });
110
69
  async function renderToHTMLBody(content) {
111
70
  const [synchronousAssets, preloadAssets] = await Promise.all([
112
71
  assets?.entry({
113
72
  cacheKey,
114
- modules: assetsManager.usedModules({ timing: "load" })
73
+ modules: browserResponse.assets.get({ timing: "load" })
115
74
  }),
116
- assets?.modules(assetsManager.usedModules({ timing: "preload" }), {
75
+ assets?.modules(browserResponse.assets.get({ timing: "preload" }), {
117
76
  cacheKey
118
77
  })
119
78
  ]);
120
79
  if (synchronousAssets) {
121
80
  for (const style of synchronousAssets.styles) {
122
- headers.append(
81
+ browserResponse.headers.append(
123
82
  "Link",
124
83
  preloadHeader(styleAssetPreloadAttributes(style))
125
84
  );
126
85
  }
127
86
  for (const script of synchronousAssets.scripts) {
128
- headers.append(
87
+ browserResponse.headers.append(
129
88
  "Link",
130
89
  preloadHeader(scriptAssetPreloadAttributes(script))
131
90
  );
@@ -133,8 +92,7 @@ async function renderToResponse(optionsOrElement, definitelyOptions) {
133
92
  }
134
93
  if (typeof renderHTML === "function") {
135
94
  const body3 = await renderHTML(content, {
136
- manager: html,
137
- headers,
95
+ response: browserResponse,
138
96
  assets: synchronousAssets,
139
97
  preloadAssets
140
98
  });
@@ -147,26 +105,34 @@ async function renderToResponse(optionsOrElement, definitelyOptions) {
147
105
  const renderFullHTML = async function renderFullHTML2() {
148
106
  const writer = responseStream.writable.getWriter();
149
107
  writer.write(`<!DOCTYPE html>`);
150
- const { htmlAttributes, bodyAttributes, ...headProps } = html.state;
151
108
  const htmlContent = renderToStaticMarkup(
152
- /* @__PURE__ */ jsxs("html", { ...htmlAttributes, children: [
109
+ /* @__PURE__ */ jsxs("html", { ...browserResponse.htmlAttributes.value, children: [
153
110
  /* @__PURE__ */ jsxs("head", { children: [
154
- /* @__PURE__ */ jsx(Head, { ...headProps }),
155
- synchronousAssets?.scripts.map((script) => /* @__PURE__ */ jsx(Script, { asset: script, baseUrl }, script.source)),
156
- synchronousAssets?.styles.map((style) => /* @__PURE__ */ jsx(Style, { asset: style, baseUrl }, style.source)),
111
+ browserResponse.title.value && /* @__PURE__ */ jsx("title", { children: browserResponse.title.value }),
112
+ browserResponse.links.value.map((link, index) => /* @__PURE__ */ jsx("link", { ...link }, index)),
113
+ browserResponse.metas.value.map((meta, index) => /* @__PURE__ */ jsx("meta", { ...meta }, index)),
114
+ synchronousAssets?.scripts.map((script) => /* @__PURE__ */ jsx(
115
+ ScriptAsset,
116
+ {
117
+ asset: script,
118
+ baseURL
119
+ },
120
+ script.source
121
+ )),
122
+ synchronousAssets?.styles.map((style) => /* @__PURE__ */ jsx(StyleAsset, { asset: style, baseURL }, style.source)),
157
123
  preloadAssets?.styles.map((style) => /* @__PURE__ */ jsx(
158
- StylePreload,
124
+ StyleAssetPreload,
159
125
  {
160
126
  asset: style,
161
- baseUrl
127
+ baseURL
162
128
  },
163
129
  style.source
164
130
  )),
165
131
  preloadAssets?.scripts.map((script) => /* @__PURE__ */ jsx(
166
- ScriptPreload,
132
+ ScriptAssetPreload,
167
133
  {
168
134
  asset: script,
169
- baseUrl
135
+ baseURL
170
136
  },
171
137
  script.source
172
138
  ))
@@ -174,7 +140,7 @@ async function renderToResponse(optionsOrElement, definitelyOptions) {
174
140
  /* @__PURE__ */ jsx(
175
141
  "body",
176
142
  {
177
- ...bodyAttributes,
143
+ ...browserResponse.bodyAttributes.value,
178
144
  dangerouslySetInnerHTML: { __html: "%%CONTENT%%" }
179
145
  }
180
146
  )
@@ -197,9 +163,9 @@ async function renderToResponse(optionsOrElement, definitelyOptions) {
197
163
  const [newSynchronousAssets, newPreloadAssets] = await Promise.all([
198
164
  assets?.entry({
199
165
  cacheKey,
200
- modules: assetsManager.usedModules({ timing: "load" })
166
+ modules: browserResponse.assets.get({ timing: "load" })
201
167
  }),
202
- assets?.modules(assetsManager.usedModules({ timing: "preload" }), {
168
+ assets?.modules(browserResponse.assets.get({ timing: "preload" }), {
203
169
  cacheKey
204
170
  })
205
171
  ]);
@@ -214,21 +180,28 @@ async function renderToResponse(optionsOrElement, definitelyOptions) {
214
180
  );
215
181
  const additionalAssetsContent = renderToStaticMarkup(
216
182
  /* @__PURE__ */ jsxs(Fragment, { children: [
217
- diffedSynchronousAssets.scripts.map((script) => /* @__PURE__ */ jsx(Script, { asset: script, baseUrl }, script.source)),
218
- diffedSynchronousAssets.styles.map((style) => /* @__PURE__ */ jsx(Style, { asset: style, baseUrl }, style.source)),
183
+ diffedSynchronousAssets.scripts.map((script) => /* @__PURE__ */ jsx(
184
+ ScriptAsset,
185
+ {
186
+ asset: script,
187
+ baseURL
188
+ },
189
+ script.source
190
+ )),
191
+ diffedSynchronousAssets.styles.map((style) => /* @__PURE__ */ jsx(StyleAsset, { asset: style, baseURL }, style.source)),
219
192
  diffedPreloadAssets.styles.map((style) => /* @__PURE__ */ jsx(
220
- StylePreload,
193
+ StyleAssetPreload,
221
194
  {
222
195
  asset: style,
223
- baseUrl
196
+ baseURL
224
197
  },
225
198
  style.source
226
199
  )),
227
200
  diffedPreloadAssets.scripts.map((script) => /* @__PURE__ */ jsx(
228
- ScriptPreload,
201
+ ScriptAssetPreload,
229
202
  {
230
203
  asset: script,
231
- baseUrl
204
+ baseURL
232
205
  },
233
206
  script.source
234
207
  ))
@@ -1,9 +1,5 @@
1
- export { HTMLContext, HTMLManager, SERVER_ACTION_ID as HTML_SERVER_ACTION_ID, Head, Serialize } from '@quilted/react-html/server';
2
- export { ServerRenderManager, ServerRenderManagerContext, extract } from '@quilted/react-server-render/server';
1
+ export * from '@quilted/react-browser/server';
3
2
  export { BrowserAssetsFromManifests, createBrowserAssetsEntryFromManifest, scriptAssetAttributes, scriptAssetPreloadAttributes, styleAssetAttributes, styleAssetPreloadAttributes } from '@quilted/assets';
4
- export { SERVER_ACTION_ID as ASSETS_SERVER_ACTION_ID, AssetsContext, AssetsManager, useAssetsCacheKey, useModuleAssets } from '@quilted/react-assets/server';
5
3
  export { parseAcceptLanguageHeader } from '@quilted/react-localize';
6
4
  export { createRequestRouterLocalization } from '@quilted/react-localize/request-router';
7
- export { ServerAction, useServerAction, useServerContext } from '@quilted/react-server-render';
8
- export { ServerContext } from './server/ServerContext.esnext';
9
5
  export { renderToResponse } from './server/request-router.esnext';
@@ -1,2 +1 @@
1
- export { Signal, batch, computed, effect, isSignal, resolveSignalOrValue, signal, signalToIterator } from '@quilted/signals';
2
- export { useComputed, useSignal, useSignalEffect } from '@quilted/react-signals';
1
+ export * from '@quilted/react-signals';