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.
- package/dist/actions/handler.d.ts +6 -12
- package/dist/actions/handler.js +30 -40
- package/dist/actions/load.d.ts +12 -0
- package/dist/actions/load.js +55 -0
- package/dist/actions/runtime/entrypoints/server.js +5 -4
- package/dist/actions/runtime/server.js +8 -6
- package/dist/assets/fonts/providers/index.d.ts +1 -1
- package/dist/assets/fonts/providers/index.js +2 -12
- package/dist/cli/infra/build-time-astro-version-provider.js +1 -1
- package/dist/container/environment.d.ts +20 -0
- package/dist/container/environment.js +106 -0
- package/dist/container/index.js +65 -32
- package/dist/content/content-layer.js +3 -3
- package/dist/content/data-store-writer.d.ts +7 -10
- package/dist/content/data-store-writer.js +62 -27
- package/dist/content/data-store.d.ts +20 -3
- package/dist/content/data-store.js +28 -7
- package/dist/content/mutable-data-store.js +15 -10
- package/dist/content/runtime.d.ts +3 -2
- package/dist/content/runtime.js +43 -26
- package/dist/core/app/app.d.ts +0 -2
- package/dist/core/app/app.js +0 -7
- package/dist/core/app/base.d.ts +32 -20
- package/dist/core/app/base.js +76 -66
- package/dist/core/app/dev-facade.d.ts +27 -0
- package/dist/core/app/dev-facade.js +51 -0
- package/dist/core/app/entrypoints/index.d.ts +0 -1
- package/dist/core/app/entrypoints/index.js +0 -2
- package/dist/core/app/entrypoints/virtual/dev.js +24 -19
- package/dist/core/app/node.js +13 -14
- package/dist/core/app/prepare-response.d.ts +1 -1
- package/dist/core/app/validate-headers.js +7 -3
- package/dist/core/build/app.d.ts +31 -6
- package/dist/core/build/app.js +31 -13
- package/dist/core/build/environment.d.ts +25 -0
- package/dist/core/build/environment.js +157 -0
- package/dist/core/cache/handler.d.ts +13 -7
- package/dist/core/cache/handler.js +55 -51
- package/dist/core/cache/provider.d.ts +4 -0
- package/dist/core/cache/provider.js +15 -0
- package/dist/core/constants.d.ts +0 -11
- package/dist/core/constants.js +1 -5
- package/dist/core/dev/dev.js +1 -1
- package/dist/core/environment/dev-nonrunnable.d.ts +6 -0
- package/dist/core/environment/dev-nonrunnable.js +170 -0
- package/dist/core/environment/index.d.ts +90 -0
- package/dist/core/environment/index.js +12 -0
- package/dist/core/environment/production.d.ts +6 -0
- package/dist/core/environment/production.js +117 -0
- package/dist/core/errors/build-handler.d.ts +5 -10
- package/dist/core/errors/build-handler.js +11 -17
- package/dist/core/errors/default-handler.d.ts +4 -9
- package/dist/core/errors/default-handler.js +92 -107
- package/dist/core/errors/dev-handler.d.ts +7 -11
- package/dist/core/errors/dev-handler.js +71 -69
- package/dist/core/errors/errors-data.d.ts +18 -0
- package/dist/core/errors/errors-data.js +7 -0
- package/dist/core/errors/handler.d.ts +22 -3
- package/dist/core/errors/handler.js +25 -0
- package/dist/core/fetch/default-handler.d.ts +15 -8
- package/dist/core/fetch/default-handler.js +12 -34
- package/dist/core/fetch/features.d.ts +23 -0
- package/dist/core/fetch/features.js +27 -0
- package/dist/core/fetch/fetch-state.d.ts +52 -7
- package/dist/core/fetch/fetch-state.js +92 -81
- package/dist/core/fetch/index.d.ts +9 -2
- package/dist/core/fetch/index.js +18 -79
- package/dist/core/fetch/vite-plugin.js +2 -1
- package/dist/core/i18n/handler.d.ts +28 -13
- package/dist/core/i18n/handler.js +100 -100
- package/dist/core/logger/manifest-logger.d.ts +31 -0
- package/dist/core/logger/manifest-logger.js +37 -0
- package/dist/core/manifest/ambient-source.d.ts +2 -0
- package/dist/core/manifest/ambient-source.js +4 -0
- package/dist/core/manifest/ambient.d.ts +16 -0
- package/dist/core/manifest/ambient.js +22 -0
- package/dist/core/manifest/derived.d.ts +3 -0
- package/dist/core/manifest/derived.js +10 -0
- package/dist/core/manifest/memo.d.ts +31 -0
- package/dist/core/manifest/memo.js +47 -0
- package/dist/core/messages/runtime.js +1 -1
- package/dist/core/middleware/astro-middleware.d.ts +25 -35
- package/dist/core/middleware/astro-middleware.js +61 -81
- package/dist/core/middleware/load.d.ts +19 -0
- package/dist/core/middleware/load.js +36 -0
- package/dist/core/middleware/sequence.js +15 -7
- package/dist/core/pages/handler.d.ts +18 -25
- package/dist/core/pages/handler.js +68 -84
- package/dist/core/redirects/render.js +3 -8
- package/dist/core/render/index.d.ts +0 -1
- package/dist/core/render/index.js +0 -2
- package/dist/core/render/route-cache.d.ts +6 -1
- package/dist/core/render/route-cache.js +11 -1
- package/dist/core/rewrites/handler.d.ts +4 -6
- package/dist/core/rewrites/handler.js +19 -20
- package/dist/core/routing/default.d.ts +2 -0
- package/dist/core/routing/default.js +7 -1
- package/dist/core/routing/dev.d.ts +1 -3
- package/dist/core/routing/dev.js +12 -5
- package/dist/core/routing/handler.d.ts +6 -16
- package/dist/core/routing/handler.js +126 -164
- package/dist/core/routing/helpers.d.ts +7 -1
- package/dist/core/routing/helpers.js +21 -0
- package/dist/core/routing/match-request.d.ts +10 -0
- package/dist/core/routing/match-request.js +57 -0
- package/dist/core/routing/route-table.d.ts +34 -0
- package/dist/core/routing/route-table.js +41 -0
- package/dist/core/routing/trailing-slash-handler.d.ts +4 -14
- package/dist/core/routing/trailing-slash-handler.js +39 -50
- package/dist/core/server-islands/mappings.d.ts +6 -0
- package/dist/core/server-islands/mappings.js +12 -0
- package/dist/core/session/driver.d.ts +4 -0
- package/dist/core/session/driver.js +14 -0
- package/dist/core/session/handler.d.ts +1 -1
- package/dist/core/session/handler.js +8 -8
- package/dist/core/session/provider-disabled.js +2 -2
- package/dist/entrypoints/prerender.js +5 -1
- package/dist/i18n/middleware.d.ts +4 -4
- package/dist/i18n/middleware.js +3 -3
- package/dist/manifest/serialized.d.ts +1 -0
- package/dist/manifest/serialized.js +9 -2
- package/dist/runtime/prerender/static-paths.d.ts +14 -2
- package/dist/runtime/prerender/static-paths.js +4 -3
- package/dist/types/public/config.d.ts +433 -241
- package/dist/vite-plugin-app/createAstroServerApp.js +22 -18
- package/dist/vite-plugin-app/environment.d.ts +18 -0
- package/dist/vite-plugin-app/environment.js +210 -0
- package/dist/vite-plugin-app/handle-request.d.ts +30 -0
- package/dist/vite-plugin-app/handle-request.js +129 -0
- package/dist/vite-plugin-app/index.d.ts +1 -1
- package/dist/vite-plugin-app/index.js +1 -1
- package/package.json +14 -7
- package/src/core/README.md +37 -0
- package/src/core/manifest/ambient-source.ts +9 -0
- package/src/types/README.md +5 -0
- package/dist/container/pipeline.d.ts +0 -14
- package/dist/container/pipeline.js +0 -78
- package/dist/core/app/dev/app.d.ts +0 -31
- package/dist/core/app/dev/app.js +0 -80
- package/dist/core/app/dev/pipeline.d.ts +0 -17
- package/dist/core/app/dev/pipeline.js +0 -133
- package/dist/core/app/pipeline.d.ts +0 -14
- package/dist/core/app/pipeline.js +0 -123
- package/dist/core/base-pipeline.d.ts +0 -183
- package/dist/core/base-pipeline.js +0 -293
- package/dist/core/build/pipeline.d.ts +0 -38
- package/dist/core/build/pipeline.js +0 -202
- package/dist/vite-plugin-app/app.d.ts +0 -62
- package/dist/vite-plugin-app/app.js +0 -237
- package/dist/vite-plugin-app/pipeline.d.ts +0 -25
- 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 {
|
|
2
|
-
import type {
|
|
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
|
|
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 `
|
|
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
|
|
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 {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
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
|
-
|
|
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
|
-
|
|
15
|
+
renderBuildError
|
|
22
16
|
};
|
|
@@ -1,14 +1,9 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import type {
|
|
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
|
|
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
|
|
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 {
|
|
6
|
-
import {
|
|
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
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
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
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
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
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
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
|
-
|
|
168
|
+
renderDefaultError
|
|
184
169
|
};
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import type {
|
|
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
|
|
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
|
|
15
|
-
*
|
|
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
|
|
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 {
|
|
3
|
-
import {
|
|
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
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
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
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
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
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
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
|
-
|
|
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
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
return renderRoute(
|
|
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
|
-
|
|
93
|
+
renderDevError
|
|
92
94
|
};
|