astro 7.2.2 → 7.2.3

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 (151) hide show
  1. package/dist/actions/handler.d.ts +6 -12
  2. package/dist/actions/handler.js +30 -40
  3. package/dist/actions/load.d.ts +12 -0
  4. package/dist/actions/load.js +55 -0
  5. package/dist/actions/runtime/entrypoints/server.js +5 -4
  6. package/dist/actions/runtime/server.js +8 -6
  7. package/dist/assets/fonts/providers/index.d.ts +1 -1
  8. package/dist/assets/fonts/providers/index.js +2 -12
  9. package/dist/cli/infra/build-time-astro-version-provider.js +1 -1
  10. package/dist/container/environment.d.ts +20 -0
  11. package/dist/container/environment.js +106 -0
  12. package/dist/container/index.js +65 -32
  13. package/dist/content/content-layer.js +3 -3
  14. package/dist/content/data-store-writer.d.ts +7 -10
  15. package/dist/content/data-store-writer.js +62 -27
  16. package/dist/content/data-store.d.ts +20 -3
  17. package/dist/content/data-store.js +28 -7
  18. package/dist/content/mutable-data-store.js +15 -10
  19. package/dist/content/runtime.d.ts +3 -2
  20. package/dist/content/runtime.js +43 -26
  21. package/dist/core/app/app.d.ts +0 -2
  22. package/dist/core/app/app.js +0 -7
  23. package/dist/core/app/base.d.ts +32 -20
  24. package/dist/core/app/base.js +76 -66
  25. package/dist/core/app/dev-facade.d.ts +27 -0
  26. package/dist/core/app/dev-facade.js +51 -0
  27. package/dist/core/app/entrypoints/index.d.ts +0 -1
  28. package/dist/core/app/entrypoints/index.js +0 -2
  29. package/dist/core/app/entrypoints/virtual/dev.js +24 -19
  30. package/dist/core/app/node.js +13 -14
  31. package/dist/core/app/prepare-response.d.ts +1 -1
  32. package/dist/core/app/validate-headers.js +7 -3
  33. package/dist/core/build/app.d.ts +31 -6
  34. package/dist/core/build/app.js +31 -13
  35. package/dist/core/build/environment.d.ts +25 -0
  36. package/dist/core/build/environment.js +157 -0
  37. package/dist/core/cache/handler.d.ts +13 -7
  38. package/dist/core/cache/handler.js +55 -51
  39. package/dist/core/cache/provider.d.ts +4 -0
  40. package/dist/core/cache/provider.js +15 -0
  41. package/dist/core/constants.d.ts +0 -11
  42. package/dist/core/constants.js +1 -5
  43. package/dist/core/dev/dev.js +1 -1
  44. package/dist/core/environment/dev-nonrunnable.d.ts +6 -0
  45. package/dist/core/environment/dev-nonrunnable.js +170 -0
  46. package/dist/core/environment/index.d.ts +90 -0
  47. package/dist/core/environment/index.js +12 -0
  48. package/dist/core/environment/production.d.ts +6 -0
  49. package/dist/core/environment/production.js +117 -0
  50. package/dist/core/errors/build-handler.d.ts +5 -10
  51. package/dist/core/errors/build-handler.js +11 -17
  52. package/dist/core/errors/default-handler.d.ts +4 -9
  53. package/dist/core/errors/default-handler.js +92 -107
  54. package/dist/core/errors/dev-handler.d.ts +7 -11
  55. package/dist/core/errors/dev-handler.js +71 -69
  56. package/dist/core/errors/errors-data.d.ts +18 -0
  57. package/dist/core/errors/errors-data.js +7 -0
  58. package/dist/core/errors/handler.d.ts +22 -3
  59. package/dist/core/errors/handler.js +25 -0
  60. package/dist/core/fetch/default-handler.d.ts +15 -8
  61. package/dist/core/fetch/default-handler.js +12 -34
  62. package/dist/core/fetch/features.d.ts +23 -0
  63. package/dist/core/fetch/features.js +27 -0
  64. package/dist/core/fetch/fetch-state.d.ts +52 -7
  65. package/dist/core/fetch/fetch-state.js +92 -81
  66. package/dist/core/fetch/index.d.ts +9 -2
  67. package/dist/core/fetch/index.js +18 -79
  68. package/dist/core/fetch/vite-plugin.js +2 -1
  69. package/dist/core/i18n/handler.d.ts +28 -13
  70. package/dist/core/i18n/handler.js +100 -100
  71. package/dist/core/logger/manifest-logger.d.ts +31 -0
  72. package/dist/core/logger/manifest-logger.js +37 -0
  73. package/dist/core/manifest/ambient-source.d.ts +2 -0
  74. package/dist/core/manifest/ambient-source.js +4 -0
  75. package/dist/core/manifest/ambient.d.ts +16 -0
  76. package/dist/core/manifest/ambient.js +22 -0
  77. package/dist/core/manifest/derived.d.ts +3 -0
  78. package/dist/core/manifest/derived.js +10 -0
  79. package/dist/core/manifest/memo.d.ts +31 -0
  80. package/dist/core/manifest/memo.js +47 -0
  81. package/dist/core/messages/runtime.js +1 -1
  82. package/dist/core/middleware/astro-middleware.d.ts +25 -35
  83. package/dist/core/middleware/astro-middleware.js +61 -81
  84. package/dist/core/middleware/load.d.ts +19 -0
  85. package/dist/core/middleware/load.js +36 -0
  86. package/dist/core/middleware/sequence.js +15 -7
  87. package/dist/core/pages/handler.d.ts +18 -25
  88. package/dist/core/pages/handler.js +68 -84
  89. package/dist/core/redirects/render.js +3 -8
  90. package/dist/core/render/index.d.ts +0 -1
  91. package/dist/core/render/index.js +0 -2
  92. package/dist/core/render/route-cache.d.ts +6 -1
  93. package/dist/core/render/route-cache.js +11 -1
  94. package/dist/core/rewrites/handler.d.ts +4 -6
  95. package/dist/core/rewrites/handler.js +19 -20
  96. package/dist/core/routing/default.d.ts +2 -0
  97. package/dist/core/routing/default.js +7 -1
  98. package/dist/core/routing/dev.d.ts +1 -3
  99. package/dist/core/routing/dev.js +12 -5
  100. package/dist/core/routing/handler.d.ts +6 -16
  101. package/dist/core/routing/handler.js +126 -164
  102. package/dist/core/routing/helpers.d.ts +7 -1
  103. package/dist/core/routing/helpers.js +21 -0
  104. package/dist/core/routing/match-request.d.ts +10 -0
  105. package/dist/core/routing/match-request.js +57 -0
  106. package/dist/core/routing/route-table.d.ts +34 -0
  107. package/dist/core/routing/route-table.js +41 -0
  108. package/dist/core/routing/trailing-slash-handler.d.ts +4 -14
  109. package/dist/core/routing/trailing-slash-handler.js +39 -50
  110. package/dist/core/server-islands/mappings.d.ts +6 -0
  111. package/dist/core/server-islands/mappings.js +12 -0
  112. package/dist/core/session/driver.d.ts +4 -0
  113. package/dist/core/session/driver.js +14 -0
  114. package/dist/core/session/handler.d.ts +1 -1
  115. package/dist/core/session/handler.js +8 -8
  116. package/dist/core/session/provider-disabled.js +2 -2
  117. package/dist/entrypoints/prerender.js +5 -1
  118. package/dist/i18n/middleware.d.ts +4 -4
  119. package/dist/i18n/middleware.js +3 -3
  120. package/dist/manifest/serialized.d.ts +1 -0
  121. package/dist/manifest/serialized.js +9 -2
  122. package/dist/runtime/prerender/static-paths.d.ts +14 -2
  123. package/dist/runtime/prerender/static-paths.js +4 -3
  124. package/dist/types/public/config.d.ts +433 -241
  125. package/dist/vite-plugin-app/createAstroServerApp.js +22 -18
  126. package/dist/vite-plugin-app/environment.d.ts +18 -0
  127. package/dist/vite-plugin-app/environment.js +210 -0
  128. package/dist/vite-plugin-app/handle-request.d.ts +30 -0
  129. package/dist/vite-plugin-app/handle-request.js +129 -0
  130. package/dist/vite-plugin-app/index.d.ts +1 -1
  131. package/dist/vite-plugin-app/index.js +1 -1
  132. package/package.json +14 -7
  133. package/src/core/README.md +37 -0
  134. package/src/core/manifest/ambient-source.ts +9 -0
  135. package/src/types/README.md +5 -0
  136. package/dist/container/pipeline.d.ts +0 -14
  137. package/dist/container/pipeline.js +0 -78
  138. package/dist/core/app/dev/app.d.ts +0 -31
  139. package/dist/core/app/dev/app.js +0 -80
  140. package/dist/core/app/dev/pipeline.d.ts +0 -17
  141. package/dist/core/app/dev/pipeline.js +0 -133
  142. package/dist/core/app/pipeline.d.ts +0 -14
  143. package/dist/core/app/pipeline.js +0 -123
  144. package/dist/core/base-pipeline.d.ts +0 -183
  145. package/dist/core/base-pipeline.js +0 -293
  146. package/dist/core/build/pipeline.d.ts +0 -38
  147. package/dist/core/build/pipeline.js +0 -202
  148. package/dist/vite-plugin-app/app.d.ts +0 -62
  149. package/dist/vite-plugin-app/app.js +0 -237
  150. package/dist/vite-plugin-app/pipeline.d.ts +0 -25
  151. package/dist/vite-plugin-app/pipeline.js +0 -189
@@ -0,0 +1,12 @@
1
+ import { productionEnvironment } from "./production.js";
2
+ const environments = /* @__PURE__ */ new WeakMap();
3
+ function setEnvironment(manifest, env) {
4
+ environments.set(manifest, env);
5
+ }
6
+ function getEnvironment(manifest) {
7
+ return environments.get(manifest) ?? productionEnvironment;
8
+ }
9
+ export {
10
+ getEnvironment,
11
+ setEnvironment
12
+ };
@@ -0,0 +1,6 @@
1
+ import type { RenderEnvironment } from './index.js';
2
+ /**
3
+ * The production / bundled environment — the default when nothing is
4
+ * registered. A stateless module constant derived from the manifest alone.
5
+ */
6
+ export declare const productionEnvironment: RenderEnvironment;
@@ -0,0 +1,117 @@
1
+ import { RedirectSinglePageBuiltModule } from "../redirects/index.js";
2
+ import {
3
+ createAssetLink,
4
+ createModuleScriptElement,
5
+ createStylesheetElementSet
6
+ } from "../render/ssr-element.js";
7
+ import { getDefaultRoutes } from "../routing/default.js";
8
+ import { getFallbackRoute, routeIsFallback, routeIsRedirect } from "../routing/helpers.js";
9
+ import { findRouteToRewrite } from "../routing/rewrite.js";
10
+ async function getModuleForRoute(manifest, route) {
11
+ for (const defaultRoute of getDefaultRoutes(manifest)) {
12
+ if (route.component === defaultRoute.component) {
13
+ return {
14
+ page: () => Promise.resolve(defaultRoute.instance)
15
+ };
16
+ }
17
+ }
18
+ let routeToProcess = route;
19
+ if (routeIsRedirect(route)) {
20
+ if (route.redirectRoute) {
21
+ routeToProcess = route.redirectRoute;
22
+ } else {
23
+ return RedirectSinglePageBuiltModule;
24
+ }
25
+ } else if (routeIsFallback(route)) {
26
+ routeToProcess = getFallbackRoute(route, manifest.routes);
27
+ }
28
+ if (manifest.pageMap) {
29
+ const importComponentInstance = manifest.pageMap.get(routeToProcess.component);
30
+ if (!importComponentInstance) {
31
+ throw new Error(`Unexpectedly unable to find a component instance for route ${route.route}`);
32
+ }
33
+ return await importComponentInstance();
34
+ } else if (manifest.pageModule) {
35
+ return manifest.pageModule;
36
+ }
37
+ throw new Error(
38
+ "Astro couldn't find the correct page to render, probably because it wasn't correctly mapped for SSR usage. This is an internal error, please file an issue."
39
+ );
40
+ }
41
+ async function getComponentByRoute(manifest, routeData) {
42
+ const module = await getModuleForRoute(manifest, routeData);
43
+ return module.page();
44
+ }
45
+ const productionEnvironment = {
46
+ name: "production",
47
+ runtimeMode: "production",
48
+ defaultStreaming: () => true,
49
+ async resolve(manifest, specifier) {
50
+ if (!(specifier in manifest.entryModules)) {
51
+ throw new Error(`Unable to resolve [${specifier}]`);
52
+ }
53
+ const bundlePath = manifest.entryModules[specifier];
54
+ if (bundlePath.startsWith("data:") || bundlePath.length === 0) {
55
+ return bundlePath;
56
+ } else {
57
+ return createAssetLink(bundlePath, manifest.base, manifest.assetsPrefix);
58
+ }
59
+ },
60
+ async headElements(manifest, routeData) {
61
+ const { assetsPrefix, base } = manifest;
62
+ const routeInfo = manifest.routes.find((route) => route.routeData.route === routeData.route);
63
+ const links = /* @__PURE__ */ new Set();
64
+ const scripts = /* @__PURE__ */ new Set();
65
+ const styles = createStylesheetElementSet(routeInfo?.styles ?? [], base, assetsPrefix);
66
+ for (const script of routeInfo?.scripts ?? []) {
67
+ if ("stage" in script) {
68
+ if (script.stage === "head-inline") {
69
+ scripts.add({
70
+ props: {},
71
+ children: script.children
72
+ });
73
+ }
74
+ } else {
75
+ scripts.add(createModuleScriptElement(script, base, assetsPrefix));
76
+ }
77
+ }
78
+ return { links, styles, scripts };
79
+ },
80
+ // The manifest's componentMetadata fallback stays in `createResult`.
81
+ componentMetadata() {
82
+ },
83
+ getComponentByRoute,
84
+ getModuleForRoute,
85
+ async tryRewrite(manifest, payload, request) {
86
+ const { newUrl, pathname, routeData } = findRouteToRewrite({
87
+ payload,
88
+ request,
89
+ // RAW manifest routes, NOT the derived route table: production
90
+ // manifests deliberately do not carry
91
+ // the default 404 route (`createRoutesList` ensures it in dev only),
92
+ // and `findRouteToRewrite` gives an existing `/404` list entry
93
+ // precedence over dynamic routes that also match the path — so the
94
+ // ensured table would let the synthetic default-404 entry shadow a
95
+ // catch-all route on an explicit rewrite to `/404`. The no-match
96
+ // fallback already returns `DEFAULT_404_ROUTE`, so the raw list loses
97
+ // nothing.
98
+ routes: manifest.routes.map((r) => r.routeData),
99
+ trailingSlash: manifest.trailingSlash,
100
+ buildFormat: manifest.buildFormat,
101
+ base: manifest.base,
102
+ outDir: manifest.serverLike ? manifest.buildClientDir : manifest.outDir
103
+ });
104
+ const componentInstance = await getComponentByRoute(manifest, routeData);
105
+ return { newUrl, pathname, componentInstance, routeData };
106
+ },
107
+ getRenderers(manifest) {
108
+ return manifest.renderers;
109
+ },
110
+ errorStrategy: "default",
111
+ injectCspMetaTagsOnErrorPages: false,
112
+ logRequest() {
113
+ }
114
+ };
115
+ export {
116
+ productionEnvironment
117
+ };
@@ -1,17 +1,12 @@
1
- import type { BaseApp, RenderErrorOptions } from '../app/base.js';
2
- import type { Pipeline } from '../base-pipeline.js';
3
- import type { ErrorHandler } from './handler.js';
1
+ import type { RenderErrorOptions } from '../app/base.js';
2
+ import type { SSRManifest } from '../app/types.js';
4
3
  /**
5
- * The error handler used during static build / prerendering.
4
+ * The error strategy used during static build / prerendering.
6
5
  *
7
6
  * - For 500 errors, returns the original response if present, otherwise
8
7
  * throws so the build surfaces the underlying error to the developer.
9
- * - For other errors (e.g. 404), delegates to `DefaultErrorHandler` with
8
+ * - For other errors (e.g. 404), delegates to `renderDefaultError` with
10
9
  * `prerenderedErrorPageFetch` cleared (the build pipeline can't fetch
11
10
  * prerendered pages the way production SSR can).
12
11
  */
13
- export declare class BuildErrorHandler implements ErrorHandler {
14
- #private;
15
- constructor(app: BaseApp<Pipeline>);
16
- renderError(request: Request, options: RenderErrorOptions): Promise<Response>;
17
- }
12
+ export declare function renderBuildError(manifest: SSRManifest, request: Request, options: RenderErrorOptions): Promise<Response>;
@@ -1,22 +1,16 @@
1
- import { DefaultErrorHandler } from "./default-handler.js";
2
- class BuildErrorHandler {
3
- #default;
4
- constructor(app) {
5
- this.#default = new DefaultErrorHandler(app);
6
- }
7
- async renderError(request, options) {
8
- if (options.status === 500) {
9
- if (options.response) {
10
- return options.response;
11
- }
12
- throw options.error;
1
+ import { renderDefaultError } from "./default-handler.js";
2
+ async function renderBuildError(manifest, request, options) {
3
+ if (options.status === 500) {
4
+ if (options.response) {
5
+ return options.response;
13
6
  }
14
- return this.#default.renderError(request, {
15
- ...options,
16
- prerenderedErrorPageFetch: void 0
17
- });
7
+ throw options.error;
18
8
  }
9
+ return renderDefaultError(manifest, request, {
10
+ ...options,
11
+ prerenderedErrorPageFetch: void 0
12
+ });
19
13
  }
20
14
  export {
21
- BuildErrorHandler
15
+ renderBuildError
22
16
  };
@@ -1,14 +1,9 @@
1
- import type { BaseApp, RenderErrorOptions } from '../app/base.js';
2
- import type { Pipeline } from '../base-pipeline.js';
3
- import { type ErrorHandler } from './handler.js';
1
+ import type { RenderErrorOptions } from '../app/base.js';
2
+ import type { SSRManifest } from '../app/types.js';
4
3
  /**
5
- * The default error handler used in production SSR. Attempts to render the
4
+ * The default error strategy used in production SSR. Attempts to render the
6
5
  * matching error route (404.astro / 500.astro), falling back to a plain
7
6
  * response with the given status. Handles prerendered error pages via
8
7
  * `prerenderedErrorPageFetch`.
9
8
  */
10
- export declare class DefaultErrorHandler implements ErrorHandler {
11
- #private;
12
- constructor(app: BaseApp<Pipeline>);
13
- renderError(request: Request, { status, response: originalResponse, skipMiddleware, error, pathname, ...resolvedRenderOptions }: RenderErrorOptions): Promise<Response>;
14
- }
9
+ export declare function renderDefaultError(manifest: SSRManifest, request: Request, { status, response: originalResponse, skipMiddleware, error, pathname, ...resolvedRenderOptions }: RenderErrorOptions): Promise<Response>;
@@ -1,125 +1,110 @@
1
+ import { removeTrailingForwardSlash } from "@astrojs/internal-helpers/path";
2
+ import { getEnvironment } from "../environment/index.js";
1
3
  import { FetchState } from "../fetch/fetch-state.js";
2
4
  import { prepareResponse } from "../app/prepare-response.js";
3
5
  import { attachCookiesToResponse } from "../cookies/index.js";
4
6
  import { getCookiesFromResponse } from "../cookies/response.js";
5
- import { AstroMiddleware } from "../middleware/astro-middleware.js";
6
- import { PagesHandler } from "../pages/handler.js";
7
+ import { handleMiddleware } from "../middleware/astro-middleware.js";
8
+ import { handlePages } from "../pages/handler.js";
7
9
  import { matchRoute } from "../routing/match.js";
10
+ import { getRouteTable } from "../routing/route-table.js";
8
11
  import { provideSession } from "../session/provider.js";
9
12
  import { validateHost } from "../app/validate-headers.js";
10
13
  import { getErrorRoutePath } from "../../i18n/error-routes.js";
11
14
  import { getOutputFilename } from "../output-filename.js";
12
15
  import { rewroteToEmptyErrorResponse } from "./handler.js";
13
- class DefaultErrorHandler {
14
- #app;
15
- #astroMiddleware;
16
- #pagesHandler;
17
- constructor(app) {
18
- this.#app = app;
19
- this.#astroMiddleware = new AstroMiddleware(app.pipeline);
20
- this.#pagesHandler = new PagesHandler(app.pipeline);
21
- }
22
- async renderError(request, {
16
+ async function renderDefaultError(manifest, request, {
17
+ status,
18
+ response: originalResponse,
19
+ skipMiddleware = false,
20
+ error,
21
+ pathname,
22
+ ...resolvedRenderOptions
23
+ }) {
24
+ const resolvedPathname = pathname ?? new FetchState(manifest, request).pathname;
25
+ const routeTable = getRouteTable(manifest);
26
+ const errorRoutePath = getErrorRoutePath(
27
+ resolvedPathname,
23
28
  status,
24
- response: originalResponse,
25
- skipMiddleware = false,
26
- error,
27
- pathname,
28
- ...resolvedRenderOptions
29
- }) {
30
- const app = this.#app;
31
- const resolvedPathname = pathname ?? new FetchState(app.pipeline, request).pathname;
32
- const errorRoutePath = getErrorRoutePath(
33
- resolvedPathname,
34
- status,
35
- app.manifestData.routes,
36
- app.manifest.i18n?.locales,
37
- app.manifest.trailingSlash === "always"
38
- );
39
- const errorRouteData = matchRoute(errorRoutePath, app.manifestData);
40
- const url = new URL(request.url);
41
- if (errorRouteData) {
42
- if (errorRouteData.prerender) {
43
- const allowedDomains = app.manifest.allowedDomains;
44
- const validatedHost = validateHost(url.host, url.protocol.replace(":", ""), allowedDomains);
45
- const safeOrigin = validatedHost ? url.origin : `${url.protocol}//localhost`;
46
- const statusURL = new URL(
47
- `${app.baseWithoutTrailingSlash}${getOutputFilename(
48
- app.manifest.buildFormat,
49
- errorRouteData.route,
50
- errorRouteData
51
- )}`,
52
- safeOrigin
53
- );
54
- if (statusURL.toString() !== request.url && resolvedRenderOptions.prerenderedErrorPageFetch) {
55
- try {
56
- const response2 = await resolvedRenderOptions.prerenderedErrorPageFetch(
57
- statusURL.toString()
58
- );
59
- const override = { status, removeContentEncodingHeaders: true };
60
- const newResponse = mergeResponses(response2, originalResponse, override);
61
- prepareResponse(newResponse, resolvedRenderOptions);
62
- return newResponse;
63
- } catch {
64
- const response2 = mergeResponses(new Response(null, { status }), originalResponse);
65
- prepareResponse(response2, resolvedRenderOptions);
66
- return response2;
67
- }
29
+ routeTable.routes,
30
+ manifest.i18n?.locales,
31
+ manifest.trailingSlash === "always"
32
+ );
33
+ const errorRouteData = matchRoute(errorRoutePath, routeTable);
34
+ const url = new URL(request.url);
35
+ if (errorRouteData) {
36
+ if (errorRouteData.prerender) {
37
+ const allowedDomains = manifest.allowedDomains;
38
+ const validatedHost = validateHost(url.host, url.protocol.replace(":", ""), allowedDomains);
39
+ const safeOrigin = validatedHost ? url.origin : `${url.protocol}//localhost`;
40
+ const statusURL = new URL(
41
+ `${removeTrailingForwardSlash(manifest.base)}${getOutputFilename(
42
+ manifest.buildFormat,
43
+ errorRouteData.route,
44
+ errorRouteData
45
+ )}`,
46
+ safeOrigin
47
+ );
48
+ if (statusURL.toString() !== request.url && resolvedRenderOptions.prerenderedErrorPageFetch) {
49
+ try {
50
+ const response2 = await resolvedRenderOptions.prerenderedErrorPageFetch(
51
+ statusURL.toString()
52
+ );
53
+ const override = { status, removeContentEncodingHeaders: true };
54
+ const newResponse = mergeResponses(response2, originalResponse, override);
55
+ prepareResponse(newResponse, resolvedRenderOptions);
56
+ return newResponse;
57
+ } catch {
58
+ const response2 = mergeResponses(new Response(null, { status }), originalResponse);
59
+ prepareResponse(response2, resolvedRenderOptions);
60
+ return response2;
68
61
  }
69
62
  }
70
- const mod = await app.pipeline.getComponentByRoute(errorRouteData);
71
- const errorState = new FetchState(app.pipeline, request);
72
- errorState.skipMiddleware = skipMiddleware;
73
- errorState.clientAddress = resolvedRenderOptions.clientAddress;
74
- errorState.routeData = errorRouteData;
75
- errorState.pathname = resolvedPathname;
76
- errorState.status = status;
77
- errorState.componentInstance = mod;
78
- errorState.locals = resolvedRenderOptions.locals ?? {};
79
- errorState.initialProps = { error };
80
- try {
81
- await provideSession(errorState);
82
- const response2 = await this.#astroMiddleware.handle(
83
- errorState,
84
- this.#pagesHandler.handle.bind(this.#pagesHandler)
85
- );
86
- if (rewroteToEmptyErrorResponse(
87
- skipMiddleware,
88
- errorRouteData,
89
- errorState.routeData,
90
- response2
91
- )) {
92
- return this.renderError(request, {
93
- ...resolvedRenderOptions,
94
- status,
95
- error,
96
- response: originalResponse,
97
- skipMiddleware: true,
98
- pathname: resolvedPathname
99
- });
100
- }
101
- const newResponse = mergeResponses(response2, originalResponse);
102
- prepareResponse(newResponse, resolvedRenderOptions);
103
- return newResponse;
104
- } catch {
105
- if (skipMiddleware === false) {
106
- return this.renderError(request, {
107
- ...resolvedRenderOptions,
108
- status,
109
- error,
110
- response: originalResponse,
111
- skipMiddleware: true,
112
- pathname: resolvedPathname
113
- });
114
- }
115
- } finally {
116
- await errorState.finalizeAll();
63
+ }
64
+ const mod = await getEnvironment(manifest).getComponentByRoute(manifest, errorRouteData);
65
+ const errorState = new FetchState(manifest, request);
66
+ errorState.skipMiddleware = skipMiddleware;
67
+ errorState.clientAddress = resolvedRenderOptions.clientAddress;
68
+ errorState.routeData = errorRouteData;
69
+ errorState.pathname = resolvedPathname;
70
+ errorState.status = status;
71
+ errorState.componentInstance = mod;
72
+ errorState.locals = resolvedRenderOptions.locals ?? {};
73
+ errorState.initialProps = { error };
74
+ try {
75
+ await provideSession(errorState);
76
+ const response2 = await handleMiddleware(errorState, handlePages);
77
+ if (rewroteToEmptyErrorResponse(skipMiddleware, errorRouteData, errorState.routeData, response2)) {
78
+ return renderDefaultError(manifest, request, {
79
+ ...resolvedRenderOptions,
80
+ status,
81
+ error,
82
+ response: originalResponse,
83
+ skipMiddleware: true,
84
+ pathname: resolvedPathname
85
+ });
86
+ }
87
+ const newResponse = mergeResponses(response2, originalResponse);
88
+ prepareResponse(newResponse, resolvedRenderOptions);
89
+ return newResponse;
90
+ } catch {
91
+ if (skipMiddleware === false) {
92
+ return renderDefaultError(manifest, request, {
93
+ ...resolvedRenderOptions,
94
+ status,
95
+ error,
96
+ response: originalResponse,
97
+ skipMiddleware: true,
98
+ pathname: resolvedPathname
99
+ });
117
100
  }
101
+ } finally {
102
+ await errorState.finalizeAll();
118
103
  }
119
- const response = mergeResponses(new Response(null, { status }), originalResponse);
120
- prepareResponse(response, resolvedRenderOptions);
121
- return response;
122
104
  }
105
+ const response = mergeResponses(new Response(null, { status }), originalResponse);
106
+ prepareResponse(response, resolvedRenderOptions);
107
+ return response;
123
108
  }
124
109
  function mergeResponses(newResponse, originalResponse, override) {
125
110
  let newResponseHeaders = newResponse.headers;
@@ -180,5 +165,5 @@ function mergeResponses(newResponse, originalResponse, override) {
180
165
  return mergedResponse;
181
166
  }
182
167
  export {
183
- DefaultErrorHandler
168
+ renderDefaultError
184
169
  };
@@ -1,6 +1,5 @@
1
- import type { BaseApp, RenderErrorOptions } from '../app/base.js';
2
- import type { Pipeline } from '../base-pipeline.js';
3
- import { type ErrorHandler } from './handler.js';
1
+ import type { RenderErrorOptions } from '../app/base.js';
2
+ import type { SSRManifest } from '../app/types.js';
4
3
  export interface DevErrorHandlerOptions {
5
4
  /**
6
5
  * Whether to inject CSP meta tags into the rendered error page response.
@@ -9,13 +8,10 @@ export interface DevErrorHandlerOptions {
9
8
  shouldInjectCspMetaTags: boolean;
10
9
  }
11
10
  /**
12
- * The dev-server error handler. Renders custom 404/500 routes if the user
11
+ * The dev-server error strategy. Renders custom 404/500 routes if the user
13
12
  * has them, otherwise throws so Vite's dev overlay is shown. Shared between
14
- * the Vite dev server (`AstroServerApp`) and the non-runnable dev pipeline
15
- * (`DevApp`); only `shouldInjectCspMetaTags` differs between them.
13
+ * the Vite dev server and the non-runnable dev pipeline; only
14
+ * `shouldInjectCspMetaTags` differs between them (carried by the
15
+ * environment record's `injectCspMetaTagsOnErrorPages` static).
16
16
  */
17
- export declare class DevErrorHandler implements ErrorHandler {
18
- #private;
19
- constructor(app: BaseApp<Pipeline>, options: DevErrorHandlerOptions);
20
- renderError(request: Request, { skipMiddleware, error, status, response: _response, pathname, ...resolvedRenderOptions }: RenderErrorOptions): Promise<Response>;
21
- }
17
+ export declare function renderDevError(manifest: SSRManifest, request: Request, { skipMiddleware, error, status, response: _response, pathname, ...resolvedRenderOptions }: RenderErrorOptions, { shouldInjectCspMetaTags }: DevErrorHandlerOptions): Promise<Response>;
@@ -1,92 +1,94 @@
1
+ import { getEnvironment } from "../environment/index.js";
1
2
  import { FetchState } from "../fetch/fetch-state.js";
2
- import { AstroMiddleware } from "../middleware/astro-middleware.js";
3
- import { PagesHandler } from "../pages/handler.js";
3
+ import { getLogger } from "../logger/manifest-logger.js";
4
+ import { handleMiddleware } from "../middleware/astro-middleware.js";
5
+ import { handlePages } from "../pages/handler.js";
4
6
  import { getCustom404Route, getCustom500Route } from "../routing/helpers.js";
7
+ import { getRouteTable } from "../routing/route-table.js";
5
8
  import { isAstroError } from "./index.js";
6
9
  import { MiddlewareNoDataOrNextCalled, MiddlewareNotAResponse } from "./errors-data.js";
7
10
  import { rewroteToEmptyErrorResponse } from "./handler.js";
8
- class DevErrorHandler {
9
- #app;
10
- #shouldInjectCspMetaTags;
11
- #astroMiddleware;
12
- #pagesHandler;
13
- constructor(app, options) {
14
- this.#app = app;
15
- this.#shouldInjectCspMetaTags = options.shouldInjectCspMetaTags;
16
- this.#astroMiddleware = new AstroMiddleware(app.pipeline);
17
- this.#pagesHandler = new PagesHandler(app.pipeline);
11
+ async function renderDevError(manifest, request, {
12
+ skipMiddleware = false,
13
+ error,
14
+ status,
15
+ response: _response,
16
+ pathname,
17
+ ...resolvedRenderOptions
18
+ }, { shouldInjectCspMetaTags }) {
19
+ if (isAstroError(error) && [MiddlewareNoDataOrNextCalled.name, MiddlewareNotAResponse.name].includes(error.name)) {
20
+ throw error;
18
21
  }
19
- async renderError(request, {
20
- skipMiddleware = false,
21
- error,
22
- status,
23
- response: _response,
24
- pathname,
25
- ...resolvedRenderOptions
26
- }) {
27
- if (isAstroError(error) && [MiddlewareNoDataOrNextCalled.name, MiddlewareNotAResponse.name].includes(error.name)) {
28
- throw error;
29
- }
30
- const app = this.#app;
31
- const shouldInjectCspMetaTags = this.#shouldInjectCspMetaTags;
32
- const resolvedPathname = pathname ?? new FetchState(app.pipeline, request).pathname;
33
- const renderRoute = async (routeData) => {
34
- try {
35
- const preloadedComponent = await app.pipeline.getComponentByRoute(routeData);
36
- const errorState = new FetchState(app.pipeline, request);
37
- errorState.skipMiddleware = skipMiddleware;
38
- errorState.clientAddress = resolvedRenderOptions.clientAddress;
39
- errorState.shouldInjectCspMetaTags = shouldInjectCspMetaTags ? !!app.manifest.csp : false;
40
- errorState.routeData = routeData;
41
- errorState.pathname = resolvedPathname;
42
- errorState.status = status;
43
- errorState.componentInstance = preloadedComponent;
44
- errorState.locals = resolvedRenderOptions.locals ?? {};
45
- errorState.initialProps = { error };
46
- const response = await this.#astroMiddleware.handle(
47
- errorState,
48
- this.#pagesHandler.handle.bind(this.#pagesHandler)
49
- );
50
- if (rewroteToEmptyErrorResponse(skipMiddleware, routeData, errorState.routeData, response)) {
51
- return this.renderError(request, {
22
+ const resolvedPathname = pathname ?? new FetchState(manifest, request).pathname;
23
+ const renderRoute = async (routeData) => {
24
+ try {
25
+ const preloadedComponent = await getEnvironment(manifest).getComponentByRoute(
26
+ manifest,
27
+ routeData
28
+ );
29
+ const errorState = new FetchState(manifest, request);
30
+ errorState.skipMiddleware = skipMiddleware;
31
+ errorState.clientAddress = resolvedRenderOptions.clientAddress;
32
+ errorState.shouldInjectCspMetaTags = shouldInjectCspMetaTags ? !!manifest.csp : false;
33
+ errorState.routeData = routeData;
34
+ errorState.pathname = resolvedPathname;
35
+ errorState.status = status;
36
+ errorState.componentInstance = preloadedComponent;
37
+ errorState.locals = resolvedRenderOptions.locals ?? {};
38
+ errorState.initialProps = { error };
39
+ const response = await handleMiddleware(errorState, handlePages);
40
+ if (rewroteToEmptyErrorResponse(skipMiddleware, routeData, errorState.routeData, response)) {
41
+ return renderDevError(
42
+ manifest,
43
+ request,
44
+ {
52
45
  ...resolvedRenderOptions,
53
46
  status,
54
47
  error,
55
48
  skipMiddleware: true,
56
49
  pathname: resolvedPathname
57
- });
58
- }
59
- if (error) {
60
- app.logger.error("router", error.stack || error.message);
61
- }
62
- return response;
63
- } catch (_err) {
64
- if (skipMiddleware === false) {
65
- return this.renderError(request, {
50
+ },
51
+ { shouldInjectCspMetaTags }
52
+ );
53
+ }
54
+ if (error) {
55
+ getLogger(manifest).error(
56
+ "router",
57
+ error.stack || error.message
58
+ );
59
+ }
60
+ return response;
61
+ } catch (_err) {
62
+ if (skipMiddleware === false) {
63
+ return renderDevError(
64
+ manifest,
65
+ request,
66
+ {
66
67
  ...resolvedRenderOptions,
67
68
  status: 500,
68
69
  skipMiddleware: true,
69
70
  error: _err,
70
71
  pathname: resolvedPathname
71
- });
72
- }
73
- throw _err;
74
- }
75
- };
76
- if (status === 404) {
77
- const custom404 = getCustom404Route(app.manifestData);
78
- if (custom404) {
79
- return renderRoute(custom404);
72
+ },
73
+ { shouldInjectCspMetaTags }
74
+ );
80
75
  }
76
+ throw _err;
81
77
  }
82
- const custom500 = getCustom500Route(app.manifestData);
83
- if (!custom500) {
84
- throw error;
85
- } else {
86
- return renderRoute(custom500);
78
+ };
79
+ if (status === 404) {
80
+ const custom404 = getCustom404Route(getRouteTable(manifest));
81
+ if (custom404) {
82
+ return renderRoute(custom404);
87
83
  }
88
84
  }
85
+ const custom500 = getCustom500Route(getRouteTable(manifest));
86
+ if (!custom500) {
87
+ throw error;
88
+ } else {
89
+ return renderRoute(custom500);
90
+ }
89
91
  }
90
92
  export {
91
- DevErrorHandler
93
+ renderDevError
92
94
  };