astro 4.9.2 → 4.10.0
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/client.d.ts +8 -0
- package/components/Picture.astro +2 -1
- package/config.d.ts +6 -0
- package/config.mjs +1 -0
- package/dist/@types/astro.d.ts +124 -0
- package/dist/assets/utils/proxy.js +1 -1
- package/dist/cli/add/babel.d.ts +1 -1
- package/dist/cli/install-package.d.ts +1 -1
- package/dist/cli/install-package.js +1 -1
- package/dist/config/index.js +2 -2
- package/dist/container/index.d.ts +11 -15
- package/dist/container/index.js +29 -27
- package/dist/container/pipeline.d.ts +1 -0
- package/dist/container/pipeline.js +8 -1
- package/dist/content/types-generator.js +5 -5
- package/dist/content/utils.d.ts +2 -3
- package/dist/content/utils.js +3 -4
- package/dist/content/vite-plugin-content-virtual-mod.d.ts +1 -1
- package/dist/core/app/pipeline.d.ts +2 -1
- package/dist/core/app/pipeline.js +44 -19
- package/dist/core/app/types.d.ts +1 -0
- package/dist/core/base-pipeline.d.ts +15 -3
- package/dist/core/base-pipeline.js +10 -1
- package/dist/core/build/generate.js +14 -4
- package/dist/core/build/pipeline.d.ts +2 -1
- package/dist/core/build/pipeline.js +31 -19
- package/dist/core/build/plugins/plugin-content.js +2 -1
- package/dist/core/build/plugins/plugin-manifest.js +2 -1
- package/dist/core/config/config.js +1 -1
- package/dist/core/config/schema.d.ts +644 -0
- package/dist/core/config/schema.js +5 -1
- package/dist/core/config/settings.js +1 -0
- package/dist/core/constants.d.ts +1 -1
- package/dist/core/constants.js +2 -2
- package/dist/core/create-vite.js +2 -0
- package/dist/core/dev/dev.js +1 -1
- package/dist/core/errors/errors-data.d.ts +61 -1
- package/dist/core/errors/errors-data.js +39 -0
- package/dist/core/logger/core.d.ts +1 -1
- package/dist/core/messages.js +2 -2
- package/dist/core/render-context.d.ts +1 -0
- package/dist/core/render-context.js +74 -57
- package/dist/core/routing/astro-designed-error-pages.d.ts +8 -1
- package/dist/core/routing/astro-designed-error-pages.js +29 -12
- package/dist/env/config.d.ts +9 -0
- package/dist/env/config.js +17 -0
- package/dist/env/constants.d.ts +11 -0
- package/dist/env/constants.js +21 -0
- package/dist/env/runtime.d.ts +6 -0
- package/dist/env/runtime.js +21 -0
- package/dist/env/schema.d.ts +387 -0
- package/dist/env/schema.js +113 -0
- package/dist/env/validators.d.ts +13 -0
- package/dist/env/validators.js +57 -0
- package/dist/env/vite-plugin-env.d.ts +11 -0
- package/dist/env/vite-plugin-env.js +174 -0
- package/dist/integrations/features-validation.js +9 -1
- package/dist/jsx/server.js +2 -1
- package/dist/runtime/server/render/astro/render.js +15 -1
- package/dist/runtime/server/util.js +1 -1
- package/dist/virtual-modules/container.d.ts +16 -0
- package/dist/virtual-modules/container.js +18 -0
- package/dist/virtual-modules/env-setup.d.ts +1 -0
- package/dist/virtual-modules/env-setup.js +4 -0
- package/dist/vite-plugin-astro-server/pipeline.d.ts +3 -2
- package/dist/vite-plugin-astro-server/pipeline.js +34 -20
- package/dist/vite-plugin-astro-server/plugin.js +1 -0
- package/dist/vite-plugin-astro-server/response.d.ts +0 -6
- package/dist/vite-plugin-astro-server/response.js +0 -13
- package/dist/vite-plugin-astro-server/route.js +2 -1
- package/dist/vite-plugin-inject-env-ts/index.js +46 -38
- package/package.json +19 -20
- package/templates/env/module.mjs +18 -0
- package/templates/env/types.d.ts +20 -0
- /package/{content-module.template.mjs → templates/content/module.mjs} +0 -0
- /package/{content-types.template.d.ts → templates/content/types.d.ts} +0 -0
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
import { fileURLToPath } from "node:url";
|
|
2
|
+
import { loadEnv } from "vite";
|
|
3
|
+
import { AstroError, AstroErrorData } from "../core/errors/index.js";
|
|
4
|
+
import {
|
|
5
|
+
ENV_TYPES_FILE,
|
|
6
|
+
MODULE_TEMPLATE_URL,
|
|
7
|
+
TYPES_TEMPLATE_URL,
|
|
8
|
+
VIRTUAL_MODULES_IDS,
|
|
9
|
+
VIRTUAL_MODULES_IDS_VALUES,
|
|
10
|
+
VIRTUAL_MODULE_SETUP_ID
|
|
11
|
+
} from "./constants.js";
|
|
12
|
+
import { getEnvFieldType, validateEnvVariable } from "./validators.js";
|
|
13
|
+
function astroEnv({
|
|
14
|
+
settings,
|
|
15
|
+
mode,
|
|
16
|
+
fs
|
|
17
|
+
}) {
|
|
18
|
+
if (!settings.config.experimental.env) {
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
const schema = settings.config.experimental.env.schema ?? {};
|
|
22
|
+
let templates = null;
|
|
23
|
+
return {
|
|
24
|
+
name: "astro-env-plugin",
|
|
25
|
+
enforce: "pre",
|
|
26
|
+
buildStart() {
|
|
27
|
+
const loadedEnv = loadEnv(
|
|
28
|
+
mode === "dev" ? "development" : "production",
|
|
29
|
+
fileURLToPath(settings.config.root),
|
|
30
|
+
""
|
|
31
|
+
);
|
|
32
|
+
const validatedVariables = validatePublicVariables({ schema, loadedEnv });
|
|
33
|
+
const clientTemplates = getClientTemplates({ validatedVariables });
|
|
34
|
+
const serverTemplates = getServerTemplates({ validatedVariables, schema, fs });
|
|
35
|
+
templates = {
|
|
36
|
+
client: clientTemplates.module,
|
|
37
|
+
server: serverTemplates.module,
|
|
38
|
+
internal: `export const schema = ${JSON.stringify(schema)};`
|
|
39
|
+
};
|
|
40
|
+
generateDts({
|
|
41
|
+
settings,
|
|
42
|
+
fs,
|
|
43
|
+
content: getDts({
|
|
44
|
+
fs,
|
|
45
|
+
clientPublic: clientTemplates.types,
|
|
46
|
+
serverPublic: serverTemplates.types.public,
|
|
47
|
+
serverSecret: serverTemplates.types.secret
|
|
48
|
+
})
|
|
49
|
+
});
|
|
50
|
+
},
|
|
51
|
+
buildEnd() {
|
|
52
|
+
templates = null;
|
|
53
|
+
},
|
|
54
|
+
resolveId(id) {
|
|
55
|
+
if (VIRTUAL_MODULES_IDS_VALUES.has(id)) {
|
|
56
|
+
return resolveVirtualModuleId(id);
|
|
57
|
+
}
|
|
58
|
+
if (id === VIRTUAL_MODULE_SETUP_ID) {
|
|
59
|
+
return this.resolve("astro/virtual-modules/env-setup.js");
|
|
60
|
+
}
|
|
61
|
+
},
|
|
62
|
+
load(id, options) {
|
|
63
|
+
if (id === resolveVirtualModuleId(VIRTUAL_MODULES_IDS.client)) {
|
|
64
|
+
return templates.client;
|
|
65
|
+
}
|
|
66
|
+
if (id === resolveVirtualModuleId(VIRTUAL_MODULES_IDS.server)) {
|
|
67
|
+
if (options?.ssr) {
|
|
68
|
+
return templates.server;
|
|
69
|
+
}
|
|
70
|
+
throw new AstroError({
|
|
71
|
+
...AstroErrorData.ServerOnlyModule,
|
|
72
|
+
message: AstroErrorData.ServerOnlyModule.message(VIRTUAL_MODULES_IDS.server)
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
if (id === resolveVirtualModuleId(VIRTUAL_MODULES_IDS.internal)) {
|
|
76
|
+
return templates.internal;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
function resolveVirtualModuleId(id) {
|
|
82
|
+
return `\0${id}`;
|
|
83
|
+
}
|
|
84
|
+
function generateDts({
|
|
85
|
+
content,
|
|
86
|
+
settings,
|
|
87
|
+
fs
|
|
88
|
+
}) {
|
|
89
|
+
fs.mkdirSync(settings.dotAstroDir, { recursive: true });
|
|
90
|
+
fs.writeFileSync(new URL(ENV_TYPES_FILE, settings.dotAstroDir), content, "utf-8");
|
|
91
|
+
}
|
|
92
|
+
function validatePublicVariables({
|
|
93
|
+
schema,
|
|
94
|
+
loadedEnv
|
|
95
|
+
}) {
|
|
96
|
+
const valid = [];
|
|
97
|
+
const invalid = [];
|
|
98
|
+
for (const [key, options] of Object.entries(schema)) {
|
|
99
|
+
if (options.access !== "public") {
|
|
100
|
+
continue;
|
|
101
|
+
}
|
|
102
|
+
const variable = loadedEnv[key];
|
|
103
|
+
const result = validateEnvVariable(variable === "" ? void 0 : variable, options);
|
|
104
|
+
if (result.ok) {
|
|
105
|
+
valid.push({ key, value: result.value, type: result.type, context: options.context });
|
|
106
|
+
} else {
|
|
107
|
+
invalid.push({ key, type: result.type });
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
if (invalid.length > 0) {
|
|
111
|
+
throw new AstroError({
|
|
112
|
+
...AstroErrorData.EnvInvalidVariables,
|
|
113
|
+
message: AstroErrorData.EnvInvalidVariables.message(
|
|
114
|
+
invalid.map(({ key, type }) => `Variable ${key} is not of type: ${type}.`).join("\n")
|
|
115
|
+
)
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
return valid;
|
|
119
|
+
}
|
|
120
|
+
function getDts({
|
|
121
|
+
clientPublic,
|
|
122
|
+
serverPublic,
|
|
123
|
+
serverSecret,
|
|
124
|
+
fs
|
|
125
|
+
}) {
|
|
126
|
+
const template = fs.readFileSync(TYPES_TEMPLATE_URL, "utf-8");
|
|
127
|
+
return template.replace("// @@CLIENT@@", clientPublic).replace("// @@SERVER@@", serverPublic).replace("// @@SECRET_VALUES@@", serverSecret);
|
|
128
|
+
}
|
|
129
|
+
function getClientTemplates({
|
|
130
|
+
validatedVariables
|
|
131
|
+
}) {
|
|
132
|
+
let module = "";
|
|
133
|
+
let types = "";
|
|
134
|
+
for (const { key, type, value } of validatedVariables.filter((e) => e.context === "client")) {
|
|
135
|
+
module += `export const ${key} = ${JSON.stringify(value)};`;
|
|
136
|
+
types += `export const ${key}: ${type};
|
|
137
|
+
`;
|
|
138
|
+
}
|
|
139
|
+
return {
|
|
140
|
+
module,
|
|
141
|
+
types
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
function getServerTemplates({
|
|
145
|
+
validatedVariables,
|
|
146
|
+
schema,
|
|
147
|
+
fs
|
|
148
|
+
}) {
|
|
149
|
+
let module = fs.readFileSync(MODULE_TEMPLATE_URL, "utf-8");
|
|
150
|
+
let publicTypes = "";
|
|
151
|
+
let secretTypes = "";
|
|
152
|
+
for (const { key, type, value } of validatedVariables.filter((e) => e.context === "server")) {
|
|
153
|
+
module += `export const ${key} = ${JSON.stringify(value)};`;
|
|
154
|
+
publicTypes += `export const ${key}: ${type};
|
|
155
|
+
`;
|
|
156
|
+
}
|
|
157
|
+
for (const [key, options] of Object.entries(schema)) {
|
|
158
|
+
if (!(options.context === "server" && options.access === "secret")) {
|
|
159
|
+
continue;
|
|
160
|
+
}
|
|
161
|
+
secretTypes += `${key}: ${getEnvFieldType(options)};
|
|
162
|
+
`;
|
|
163
|
+
}
|
|
164
|
+
return {
|
|
165
|
+
module,
|
|
166
|
+
types: {
|
|
167
|
+
public: publicTypes,
|
|
168
|
+
secret: secretTypes
|
|
169
|
+
}
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
export {
|
|
173
|
+
astroEnv
|
|
174
|
+
};
|
|
@@ -13,7 +13,8 @@ function validateSupportedFeatures(adapterName, featureMap, config, adapterFeatu
|
|
|
13
13
|
serverOutput = UNSUPPORTED,
|
|
14
14
|
staticOutput = UNSUPPORTED,
|
|
15
15
|
hybridOutput = UNSUPPORTED,
|
|
16
|
-
i18nDomains = UNSUPPORTED
|
|
16
|
+
i18nDomains = UNSUPPORTED,
|
|
17
|
+
envGetSecret = UNSUPPORTED
|
|
17
18
|
} = featureMap;
|
|
18
19
|
const validationResult = {};
|
|
19
20
|
validationResult.staticOutput = validateSupportKind(
|
|
@@ -55,6 +56,13 @@ function validateSupportedFeatures(adapterName, featureMap, config, adapterFeatu
|
|
|
55
56
|
);
|
|
56
57
|
}
|
|
57
58
|
}
|
|
59
|
+
validationResult.envGetSecret = validateSupportKind(
|
|
60
|
+
envGetSecret,
|
|
61
|
+
adapterName,
|
|
62
|
+
logger,
|
|
63
|
+
"astro:env getSecret",
|
|
64
|
+
() => config?.experimental?.env !== void 0
|
|
65
|
+
);
|
|
58
66
|
return validationResult;
|
|
59
67
|
}
|
|
60
68
|
function validateSupportKind(supportKind, adapterName, logger, featureName, hasCorrectConfig) {
|
package/dist/jsx/server.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { AstroError } from "../core/errors/errors.js";
|
|
1
|
+
import { AstroError, AstroUserError } from "../core/errors/errors.js";
|
|
2
2
|
import { AstroJSX, jsx } from "../jsx-runtime/index.js";
|
|
3
3
|
import { renderJSX } from "../runtime/server/jsx.js";
|
|
4
4
|
const slotName = (str) => str.trim().replace(/[-_]([a-z])/g, (_, w) => w.toUpperCase());
|
|
@@ -34,6 +34,7 @@ async function renderToStaticMarkup(Component, props = {}, { default: children =
|
|
|
34
34
|
}
|
|
35
35
|
function throwEnhancedErrorIfMdxComponent(error, Component) {
|
|
36
36
|
if (Component[Symbol.for("mdx-component")]) {
|
|
37
|
+
if (AstroUserError.is(error)) return;
|
|
37
38
|
throw new AstroError({
|
|
38
39
|
message: error.message,
|
|
39
40
|
title: error.name,
|
|
@@ -90,6 +90,20 @@ async function callComponentAsTemplateResultOrResponse(result, componentFactory,
|
|
|
90
90
|
const factoryResult = await componentFactory(result, props, children);
|
|
91
91
|
if (factoryResult instanceof Response) {
|
|
92
92
|
return factoryResult;
|
|
93
|
+
} else if (isHeadAndContent(factoryResult)) {
|
|
94
|
+
if (!isRenderTemplateResult(factoryResult.content)) {
|
|
95
|
+
throw new AstroError({
|
|
96
|
+
...AstroErrorData.OnlyResponseCanBeReturned,
|
|
97
|
+
message: AstroErrorData.OnlyResponseCanBeReturned.message(
|
|
98
|
+
route?.route,
|
|
99
|
+
typeof factoryResult
|
|
100
|
+
),
|
|
101
|
+
location: {
|
|
102
|
+
file: route?.component
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
return factoryResult.content;
|
|
93
107
|
} else if (!isRenderTemplateResult(factoryResult)) {
|
|
94
108
|
throw new AstroError({
|
|
95
109
|
...AstroErrorData.OnlyResponseCanBeReturned,
|
|
@@ -99,7 +113,7 @@ async function callComponentAsTemplateResultOrResponse(result, componentFactory,
|
|
|
99
113
|
}
|
|
100
114
|
});
|
|
101
115
|
}
|
|
102
|
-
return
|
|
116
|
+
return factoryResult;
|
|
103
117
|
}
|
|
104
118
|
async function bufferHeadContent(result) {
|
|
105
119
|
const iterator = result._metadata.propagators.values();
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
function isPromise(value) {
|
|
2
|
-
return !!value && typeof value === "object" && typeof value.then === "function";
|
|
2
|
+
return !!value && typeof value === "object" && "then" in value && typeof value.then === "function";
|
|
3
3
|
}
|
|
4
4
|
async function* streamAsyncIterator(stream) {
|
|
5
5
|
const reader = stream.getReader();
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { AstroRenderer, SSRLoadedRenderer } from '../@types/astro.js';
|
|
2
|
+
/**
|
|
3
|
+
* Use this function to provide renderers to the `AstroContainer`:
|
|
4
|
+
*
|
|
5
|
+
* ```js
|
|
6
|
+
* import { getContainerRenderer } from "@astrojs/react";
|
|
7
|
+
* import { experimental_AstroContainer as AstroContainer } from "astro/container";
|
|
8
|
+
* import { loadRenderers } from "astro:container"; // use this only when using vite/vitest
|
|
9
|
+
*
|
|
10
|
+
* const renderers = await loadRenderers([ getContainerRenderer ]);
|
|
11
|
+
* const container = await AstroContainer.create({ renderers });
|
|
12
|
+
*
|
|
13
|
+
* ```
|
|
14
|
+
* @param renderers
|
|
15
|
+
*/
|
|
16
|
+
export declare function loadRenderers(renderers: AstroRenderer[]): Promise<SSRLoadedRenderer[]>;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
async function loadRenderers(renderers) {
|
|
2
|
+
const loadedRenderers = await Promise.all(
|
|
3
|
+
renderers.map(async (renderer) => {
|
|
4
|
+
const mod = await import(renderer.serverEntrypoint);
|
|
5
|
+
if (typeof mod.default !== "undefined") {
|
|
6
|
+
return {
|
|
7
|
+
...renderer,
|
|
8
|
+
ssr: mod.default
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
return void 0;
|
|
12
|
+
})
|
|
13
|
+
);
|
|
14
|
+
return loadedRenderers.filter((r) => Boolean(r));
|
|
15
|
+
}
|
|
16
|
+
export {
|
|
17
|
+
loadRenderers
|
|
18
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { setGetEnv, type GetEnv } from '../env/runtime.js';
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { AstroSettings, ComponentInstance, ManifestData, RewritePayload, RouteData, SSRLoadedRenderer, SSRManifest } from '../@types/astro.js';
|
|
2
|
-
import type
|
|
2
|
+
import { type HeadElements } from '../core/base-pipeline.js';
|
|
3
3
|
import type { Logger } from '../core/logger/core.js';
|
|
4
4
|
import type { ModuleLoader } from '../core/module-loader/index.js';
|
|
5
5
|
import { Pipeline } from '../core/render/index.js';
|
|
@@ -19,6 +19,7 @@ export declare class DevPipeline extends Pipeline {
|
|
|
19
19
|
preload(routeData: RouteData, filePath: URL): Promise<ComponentInstance>;
|
|
20
20
|
clearRouteCache(): void;
|
|
21
21
|
getComponentByRoute(routeData: RouteData): Promise<ComponentInstance>;
|
|
22
|
-
tryRewrite(payload: RewritePayload, request: Request): Promise<[RouteData, ComponentInstance]>;
|
|
22
|
+
tryRewrite(payload: RewritePayload, request: Request, sourceRoute: RouteData): Promise<[RouteData, ComponentInstance]>;
|
|
23
23
|
setManifestData(manifestData: ManifestData): void;
|
|
24
|
+
rewriteKnownRoute(route: string, sourceRoute: RouteData): ComponentInstance;
|
|
24
25
|
}
|
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
import { fileURLToPath } from "node:url";
|
|
2
2
|
import { getInfoOutput } from "../cli/info/index.js";
|
|
3
|
+
import {} from "../core/base-pipeline.js";
|
|
3
4
|
import { ASTRO_VERSION, DEFAULT_404_COMPONENT } from "../core/constants.js";
|
|
4
5
|
import { enhanceViteSSRError } from "../core/errors/dev/index.js";
|
|
5
|
-
import {
|
|
6
|
+
import { InvalidRewrite404, RewriteEncounteredAnError } from "../core/errors/errors-data.js";
|
|
6
7
|
import { AggregateError, AstroError, CSSError, MarkdownError } from "../core/errors/index.js";
|
|
7
8
|
import { Pipeline, loadRenderer } from "../core/render/index.js";
|
|
9
|
+
import { DEFAULT_404_ROUTE, default404Page } from "../core/routing/astro-designed-error-pages.js";
|
|
8
10
|
import { isPage, isServerLikeOutput, resolveIdToUrl, viteID } from "../core/util.js";
|
|
9
11
|
import { PAGE_SCRIPT_ID } from "../vite-plugin-scripts/index.js";
|
|
10
12
|
import { getStylesForURL } from "./css.js";
|
|
11
13
|
import { getComponentMetadata } from "./metadata.js";
|
|
12
14
|
import { createResolve } from "./resolve.js";
|
|
13
|
-
import { default404Page } from "./response.js";
|
|
14
15
|
import { getScriptsForURL } from "./scripts.js";
|
|
15
16
|
class DevPipeline extends Pipeline {
|
|
16
17
|
constructor(loader, logger, manifest, settings, config = settings.config) {
|
|
@@ -132,41 +133,54 @@ class DevPipeline extends Pipeline {
|
|
|
132
133
|
return await this.preload(routeData, filePath);
|
|
133
134
|
}
|
|
134
135
|
}
|
|
135
|
-
async tryRewrite(payload, request) {
|
|
136
|
+
async tryRewrite(payload, request, sourceRoute) {
|
|
136
137
|
let foundRoute;
|
|
137
138
|
if (!this.manifestData) {
|
|
138
139
|
throw new Error("Missing manifest data. This is an internal error, please file an issue.");
|
|
139
140
|
}
|
|
140
141
|
for (const route of this.manifestData.routes) {
|
|
142
|
+
let finalUrl = void 0;
|
|
141
143
|
if (payload instanceof URL) {
|
|
142
|
-
|
|
143
|
-
foundRoute = route;
|
|
144
|
-
break;
|
|
145
|
-
}
|
|
144
|
+
finalUrl = payload;
|
|
146
145
|
} else if (payload instanceof Request) {
|
|
147
|
-
|
|
148
|
-
if (route.pattern.test(url.pathname)) {
|
|
149
|
-
foundRoute = route;
|
|
150
|
-
break;
|
|
151
|
-
}
|
|
146
|
+
finalUrl = new URL(payload.url);
|
|
152
147
|
} else {
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
148
|
+
finalUrl = new URL(payload, new URL(request.url).origin);
|
|
149
|
+
}
|
|
150
|
+
if (route.pattern.test(decodeURI(finalUrl.pathname))) {
|
|
151
|
+
foundRoute = route;
|
|
152
|
+
break;
|
|
153
|
+
} else if (finalUrl.pathname === "/404") {
|
|
154
|
+
foundRoute = DEFAULT_404_ROUTE;
|
|
155
|
+
break;
|
|
158
156
|
}
|
|
159
157
|
}
|
|
160
158
|
if (foundRoute) {
|
|
161
|
-
|
|
162
|
-
|
|
159
|
+
if (foundRoute.pathname === "/404") {
|
|
160
|
+
const componentInstance = this.rewriteKnownRoute(foundRoute.pathname, sourceRoute);
|
|
161
|
+
return [foundRoute, componentInstance];
|
|
162
|
+
} else {
|
|
163
|
+
const componentInstance = await this.getComponentByRoute(foundRoute);
|
|
164
|
+
return [foundRoute, componentInstance];
|
|
165
|
+
}
|
|
163
166
|
} else {
|
|
164
|
-
throw new AstroError(
|
|
167
|
+
throw new AstroError({
|
|
168
|
+
...RewriteEncounteredAnError,
|
|
169
|
+
message: RewriteEncounteredAnError.message(payload.toString())
|
|
170
|
+
});
|
|
165
171
|
}
|
|
166
172
|
}
|
|
167
173
|
setManifestData(manifestData) {
|
|
168
174
|
this.manifestData = manifestData;
|
|
169
175
|
}
|
|
176
|
+
rewriteKnownRoute(route, sourceRoute) {
|
|
177
|
+
if (isServerLikeOutput(this.config) && sourceRoute.prerender) {
|
|
178
|
+
if (route === "/404") {
|
|
179
|
+
return { default: default404Page };
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
throw new AstroError(InvalidRewrite404);
|
|
183
|
+
}
|
|
170
184
|
}
|
|
171
185
|
export {
|
|
172
186
|
DevPipeline
|
|
@@ -115,6 +115,7 @@ function createDevelopmentManifest(settings) {
|
|
|
115
115
|
i18n: i18nManifest,
|
|
116
116
|
checkOrigin: settings.config.security?.checkOrigin ?? false,
|
|
117
117
|
rewritingEnabled: settings.config.experimental.rewriting,
|
|
118
|
+
experimentalEnvGetSecretEnabled: false,
|
|
118
119
|
middleware(_, next) {
|
|
119
120
|
return next();
|
|
120
121
|
}
|
|
@@ -3,12 +3,6 @@ import type http from 'node:http';
|
|
|
3
3
|
import type { ErrorWithMetadata } from '../core/errors/index.js';
|
|
4
4
|
import type { ModuleLoader } from '../core/module-loader/index.js';
|
|
5
5
|
export declare function handle404Response(origin: string, req: http.IncomingMessage, res: http.ServerResponse): Promise<void>;
|
|
6
|
-
export declare function default404Page({ pathname }: {
|
|
7
|
-
pathname: string;
|
|
8
|
-
}): Promise<Response>;
|
|
9
|
-
export declare namespace default404Page {
|
|
10
|
-
var isAstroComponentFactory: boolean;
|
|
11
|
-
}
|
|
12
6
|
export declare function handle500Response(loader: ModuleLoader, res: http.ServerResponse, err: ErrorWithMetadata): Promise<void>;
|
|
13
7
|
export declare function writeHtmlResponse(res: http.ServerResponse, statusCode: number, html: string): void;
|
|
14
8
|
export declare function writeWebResponse(res: http.ServerResponse, webResponse: Response): Promise<void>;
|
|
@@ -12,18 +12,6 @@ async function handle404Response(origin, req, res) {
|
|
|
12
12
|
});
|
|
13
13
|
writeHtmlResponse(res, 404, html);
|
|
14
14
|
}
|
|
15
|
-
async function default404Page({ pathname }) {
|
|
16
|
-
return new Response(
|
|
17
|
-
notFoundTemplate({
|
|
18
|
-
statusCode: 404,
|
|
19
|
-
title: "Not found",
|
|
20
|
-
tabTitle: "404: Not Found",
|
|
21
|
-
pathname
|
|
22
|
-
}),
|
|
23
|
-
{ status: 404, headers: { "Content-Type": "text/html; charset=utf-8" } }
|
|
24
|
-
);
|
|
25
|
-
}
|
|
26
|
-
default404Page.isAstroComponentFactory = true;
|
|
27
15
|
async function handle500Response(loader, res, err) {
|
|
28
16
|
res.on(
|
|
29
17
|
"close",
|
|
@@ -92,7 +80,6 @@ async function writeSSRResult(webRequest, webResponse, res) {
|
|
|
92
80
|
return writeWebResponse(res, webResponse);
|
|
93
81
|
}
|
|
94
82
|
export {
|
|
95
|
-
default404Page,
|
|
96
83
|
handle404Response,
|
|
97
84
|
handle500Response,
|
|
98
85
|
writeHtmlResponse,
|
|
@@ -9,10 +9,11 @@ import { loadMiddleware } from "../core/middleware/loadMiddleware.js";
|
|
|
9
9
|
import { RenderContext } from "../core/render-context.js";
|
|
10
10
|
import { getProps } from "../core/render/index.js";
|
|
11
11
|
import { createRequest } from "../core/request.js";
|
|
12
|
+
import { default404Page } from "../core/routing/astro-designed-error-pages.js";
|
|
12
13
|
import { matchAllRoutes } from "../core/routing/index.js";
|
|
13
14
|
import { normalizeTheLocale } from "../i18n/index.js";
|
|
14
15
|
import { getSortedPreloadedMatches } from "../prerender/routing.js";
|
|
15
|
-
import {
|
|
16
|
+
import { handle404Response, writeSSRResult, writeWebResponse } from "./response.js";
|
|
16
17
|
function isLoggedRequest(url) {
|
|
17
18
|
return url !== "/favicon.ico";
|
|
18
19
|
}
|
|
@@ -4,8 +4,8 @@ import { bold } from "kleur/colors";
|
|
|
4
4
|
import { normalizePath } from "vite";
|
|
5
5
|
import { ACTIONS_TYPES_FILE } from "../actions/consts.js";
|
|
6
6
|
import { CONTENT_TYPES_FILE } from "../content/consts.js";
|
|
7
|
-
import { getContentPaths } from "../content/index.js";
|
|
8
7
|
import {} from "../core/logger/core.js";
|
|
8
|
+
import { ENV_TYPES_FILE } from "../env/constants.js";
|
|
9
9
|
function getEnvTsPath({ srcDir }) {
|
|
10
10
|
return new URL("env.d.ts", srcDir);
|
|
11
11
|
}
|
|
@@ -24,62 +24,70 @@ function astroInjectEnvTsPlugin({
|
|
|
24
24
|
}
|
|
25
25
|
};
|
|
26
26
|
}
|
|
27
|
+
function getDotAstroTypeReference({
|
|
28
|
+
settings,
|
|
29
|
+
filename
|
|
30
|
+
}) {
|
|
31
|
+
const relativePath = normalizePath(
|
|
32
|
+
path.relative(
|
|
33
|
+
fileURLToPath(settings.config.srcDir),
|
|
34
|
+
fileURLToPath(new URL(filename, settings.dotAstroDir))
|
|
35
|
+
)
|
|
36
|
+
);
|
|
37
|
+
return `/// <reference path=${JSON.stringify(relativePath)} />`;
|
|
38
|
+
}
|
|
27
39
|
async function setUpEnvTs({
|
|
28
40
|
settings,
|
|
29
41
|
logger,
|
|
30
42
|
fs
|
|
31
43
|
}) {
|
|
32
44
|
const envTsPath = getEnvTsPath(settings.config);
|
|
33
|
-
const
|
|
34
|
-
const dotAstroTypeReferences = getDotAstroTypeReferences({
|
|
35
|
-
root: settings.config.root,
|
|
36
|
-
srcDir: settings.config.srcDir,
|
|
37
|
-
fs
|
|
38
|
-
});
|
|
39
|
-
const envTsPathRelativeToRoot = normalizePath(
|
|
45
|
+
const envTsPathRelativetoRoot = normalizePath(
|
|
40
46
|
path.relative(fileURLToPath(settings.config.root), fileURLToPath(envTsPath))
|
|
41
47
|
);
|
|
48
|
+
const injectedTypes = [
|
|
49
|
+
{
|
|
50
|
+
filename: CONTENT_TYPES_FILE,
|
|
51
|
+
meetsCondition: () => fs.existsSync(new URL(CONTENT_TYPES_FILE, settings.dotAstroDir))
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
filename: ACTIONS_TYPES_FILE,
|
|
55
|
+
meetsCondition: () => fs.existsSync(new URL(ACTIONS_TYPES_FILE, settings.dotAstroDir))
|
|
56
|
+
}
|
|
57
|
+
];
|
|
58
|
+
if (settings.config.experimental.env) {
|
|
59
|
+
injectedTypes.push({
|
|
60
|
+
filename: ENV_TYPES_FILE
|
|
61
|
+
});
|
|
62
|
+
}
|
|
42
63
|
if (fs.existsSync(envTsPath)) {
|
|
43
64
|
let typesEnvContents = await fs.promises.readFile(envTsPath, "utf-8");
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
65
|
+
for (const injectedType of injectedTypes) {
|
|
66
|
+
if (!injectedType.meetsCondition || await injectedType.meetsCondition?.()) {
|
|
67
|
+
const expectedTypeReference = getDotAstroTypeReference({
|
|
68
|
+
settings,
|
|
69
|
+
filename: injectedType.filename
|
|
70
|
+
});
|
|
71
|
+
if (!typesEnvContents.includes(expectedTypeReference)) {
|
|
72
|
+
typesEnvContents = `${expectedTypeReference}
|
|
48
73
|
${typesEnvContents}`;
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
}
|
|
52
|
-
if (addedTypes) {
|
|
53
|
-
logger.info("types", `Added ${bold(envTsPathRelativeToRoot)} type declarations`);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
54
76
|
}
|
|
77
|
+
logger.info("types", `Added ${bold(envTsPathRelativetoRoot)} type declarations.`);
|
|
78
|
+
await fs.promises.writeFile(envTsPath, typesEnvContents, "utf-8");
|
|
55
79
|
} else {
|
|
56
80
|
let referenceDefs = [];
|
|
57
81
|
referenceDefs.push('/// <reference types="astro/client" />');
|
|
58
|
-
|
|
59
|
-
|
|
82
|
+
for (const injectedType of injectedTypes) {
|
|
83
|
+
if (!injectedType.meetsCondition || await injectedType.meetsCondition?.()) {
|
|
84
|
+
referenceDefs.push(getDotAstroTypeReference({ settings, filename: injectedType.filename }));
|
|
85
|
+
}
|
|
60
86
|
}
|
|
61
87
|
await fs.promises.mkdir(settings.config.srcDir, { recursive: true });
|
|
62
88
|
await fs.promises.writeFile(envTsPath, referenceDefs.join("\n"), "utf-8");
|
|
63
|
-
logger.info("types", `Added ${bold(
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
function getDotAstroTypeReferences({
|
|
67
|
-
fs,
|
|
68
|
-
root,
|
|
69
|
-
srcDir
|
|
70
|
-
}) {
|
|
71
|
-
const { cacheDir } = getContentPaths({ root, srcDir });
|
|
72
|
-
let referenceDefs = [];
|
|
73
|
-
const typesFiles = [CONTENT_TYPES_FILE, ACTIONS_TYPES_FILE];
|
|
74
|
-
for (const typesFile of typesFiles) {
|
|
75
|
-
const url = new URL(typesFile, cacheDir);
|
|
76
|
-
if (!fs.existsSync(url)) continue;
|
|
77
|
-
const typesRelativeToSrcDir = normalizePath(
|
|
78
|
-
path.relative(fileURLToPath(srcDir), fileURLToPath(url))
|
|
79
|
-
);
|
|
80
|
-
referenceDefs.push(`/// <reference path=${JSON.stringify(typesRelativeToSrcDir)} />`);
|
|
89
|
+
logger.info("types", `Added ${bold(envTsPathRelativetoRoot)} type declarations`);
|
|
81
90
|
}
|
|
82
|
-
return referenceDefs;
|
|
83
91
|
}
|
|
84
92
|
export {
|
|
85
93
|
astroInjectEnvTsPlugin,
|