astro 1.4.7 → 1.5.1
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/astro-jsx.d.ts +8 -6
- package/components/Code.astro +1 -1
- package/config.d.ts +1 -1
- package/dist/@types/astro.d.ts +200 -19
- package/dist/cli/index.js +35 -36
- package/dist/config/index.js +2 -7
- package/dist/core/add/index.js +141 -24
- package/dist/core/app/index.js +45 -43
- package/dist/core/build/generate.js +14 -12
- package/dist/core/build/index.js +3 -3
- package/dist/core/config/config.d.ts +1 -1
- package/dist/core/config/config.js +6 -2
- package/dist/core/config/index.d.ts +1 -1
- package/dist/core/config/index.js +2 -1
- package/dist/core/config/schema.d.ts +139 -1
- package/dist/core/config/schema.js +36 -3
- package/dist/core/config/settings.d.ts +1 -7
- package/dist/core/config/settings.js +7 -4
- package/dist/core/config/tsconfig.d.ts +10 -1
- package/dist/core/config/tsconfig.js +72 -7
- package/dist/core/constants.d.ts +1 -0
- package/dist/core/constants.js +4 -0
- package/dist/core/cookies/cookies.d.ts +1 -1
- package/dist/core/dev/index.js +7 -2
- package/dist/core/endpoint/dev/index.d.ts +2 -1
- package/dist/core/endpoint/dev/index.js +13 -6
- package/dist/core/endpoint/index.d.ts +4 -3
- package/dist/core/endpoint/index.js +57 -9
- package/dist/core/messages.js +2 -2
- package/dist/core/preview/index.d.ts +2 -11
- package/dist/core/preview/index.js +31 -125
- package/dist/core/preview/static-preview-server.d.ts +17 -0
- package/dist/core/preview/static-preview-server.js +127 -0
- package/dist/core/render/context.d.ts +20 -0
- package/dist/core/render/context.js +15 -0
- package/dist/core/render/core.d.ts +4 -24
- package/dist/core/render/core.js +26 -47
- package/dist/core/render/dev/environment.d.ts +9 -0
- package/dist/core/render/dev/environment.js +30 -0
- package/dist/core/render/dev/index.d.ts +22 -5
- package/dist/core/render/dev/index.js +38 -69
- package/dist/core/render/dev/resolve.d.ts +2 -0
- package/dist/core/render/dev/resolve.js +14 -0
- package/dist/core/render/environment.d.ts +29 -0
- package/dist/core/render/environment.js +21 -0
- package/dist/core/render/index.d.ts +6 -0
- package/dist/core/render/index.js +13 -0
- package/dist/core/render/renderer.d.ts +9 -0
- package/dist/core/render/renderer.js +23 -0
- package/dist/core/render/result.js +3 -3
- package/dist/core/routing/manifest/create.js +14 -5
- package/dist/core/routing/manifest/generator.js +8 -3
- package/dist/core/util.d.ts +3 -14
- package/dist/core/util.js +4 -2
- package/dist/events/index.js +1 -1
- package/dist/integrations/index.d.ts +3 -2
- package/dist/integrations/index.js +39 -2
- package/dist/jsx/component.d.ts +1 -0
- package/dist/jsx/component.js +10 -0
- package/dist/jsx/index.d.ts +2 -0
- package/dist/jsx/index.js +6 -0
- package/dist/jsx-runtime/index.js +1 -1
- package/dist/runtime/server/astro-global.js +1 -1
- package/dist/runtime/server/index.d.ts +1 -0
- package/dist/runtime/server/index.js +2 -0
- package/dist/vite-plugin-astro-server/index.js +35 -60
- package/dist/vite-plugin-jsx/index.js +9 -5
- package/dist/vite-plugin-jsx/tag.d.ts +3 -2
- package/dist/vite-plugin-jsx/tag.js +10 -4
- package/env.d.ts +1 -1
- package/package.json +8 -3
|
@@ -1,134 +1,40 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
3
|
-
import
|
|
4
|
-
import sirv from "sirv";
|
|
5
|
-
import { fileURLToPath } from "url";
|
|
6
|
-
import { notFoundTemplate, subpathNotUsedTemplate } from "../../template/4xx.js";
|
|
7
|
-
import { error, info } from "../logger/core.js";
|
|
8
|
-
import * as msg from "../messages.js";
|
|
1
|
+
import { createRequire } from "module";
|
|
2
|
+
import { runHookConfigDone, runHookConfigSetup } from "../../integrations/index.js";
|
|
3
|
+
import createStaticPreviewServer from "./static-preview-server.js";
|
|
9
4
|
import { getResolvedHostForHttpServer } from "./util.js";
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
);
|
|
16
|
-
}
|
|
17
|
-
const startServerTime = performance.now();
|
|
18
|
-
const defaultOrigin = "http://localhost";
|
|
19
|
-
const trailingSlash = settings.config.trailingSlash;
|
|
20
|
-
let baseURL = new URL(settings.config.base, new URL(settings.config.site || "/", defaultOrigin));
|
|
21
|
-
const staticFileServer = sirv(fileURLToPath(settings.config.outDir), {
|
|
22
|
-
dev: true,
|
|
23
|
-
etag: true,
|
|
24
|
-
maxAge: 0
|
|
25
|
-
});
|
|
26
|
-
const server = http.createServer((req, res) => {
|
|
27
|
-
var _a;
|
|
28
|
-
const requestURL = new URL(req.url, defaultOrigin);
|
|
29
|
-
if (!requestURL.pathname.startsWith(baseURL.pathname)) {
|
|
30
|
-
res.statusCode = 404;
|
|
31
|
-
res.end(subpathNotUsedTemplate(baseURL.pathname, requestURL.pathname));
|
|
32
|
-
return;
|
|
33
|
-
}
|
|
34
|
-
const pathname = requestURL.pathname.slice(baseURL.pathname.length - 1);
|
|
35
|
-
const isRoot = pathname === "/";
|
|
36
|
-
const hasTrailingSlash = isRoot || pathname.endsWith("/");
|
|
37
|
-
function sendError(message) {
|
|
38
|
-
res.statusCode = 404;
|
|
39
|
-
res.end(notFoundTemplate(pathname, message));
|
|
40
|
-
}
|
|
41
|
-
switch (true) {
|
|
42
|
-
case (hasTrailingSlash && trailingSlash == "never" && !isRoot):
|
|
43
|
-
sendError('Not Found (trailingSlash is set to "never")');
|
|
44
|
-
return;
|
|
45
|
-
case (!hasTrailingSlash && trailingSlash == "always" && !isRoot && !HAS_FILE_EXTENSION_REGEXP.test(pathname)):
|
|
46
|
-
sendError('Not Found (trailingSlash is set to "always")');
|
|
47
|
-
return;
|
|
48
|
-
default: {
|
|
49
|
-
req.url = "/" + ((_a = req.url) == null ? void 0 : _a.replace(baseURL.pathname, ""));
|
|
50
|
-
staticFileServer(req, res, () => {
|
|
51
|
-
const errorPagePath = fileURLToPath(settings.config.outDir + "/404.html");
|
|
52
|
-
if (fs.existsSync(errorPagePath)) {
|
|
53
|
-
res.statusCode = 404;
|
|
54
|
-
res.setHeader("Content-Type", "text/html;charset=utf-8");
|
|
55
|
-
res.end(fs.readFileSync(errorPagePath));
|
|
56
|
-
} else {
|
|
57
|
-
staticFileServer(req, res, () => {
|
|
58
|
-
sendError("Not Found");
|
|
59
|
-
});
|
|
60
|
-
}
|
|
61
|
-
});
|
|
62
|
-
return;
|
|
63
|
-
}
|
|
64
|
-
}
|
|
5
|
+
async function preview(_settings, { logging }) {
|
|
6
|
+
const settings = await runHookConfigSetup({
|
|
7
|
+
settings: _settings,
|
|
8
|
+
command: "preview",
|
|
9
|
+
logging
|
|
65
10
|
});
|
|
66
|
-
|
|
11
|
+
await runHookConfigDone({ settings, logging });
|
|
67
12
|
const host = getResolvedHostForHttpServer(settings.config.server.host);
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
if (!showedListenMsg) {
|
|
76
|
-
const resolvedUrls = msg.resolveServerUrls({
|
|
77
|
-
address: server.address(),
|
|
78
|
-
host: settings.config.server.host,
|
|
79
|
-
https: false
|
|
80
|
-
});
|
|
81
|
-
info(
|
|
82
|
-
logging,
|
|
83
|
-
null,
|
|
84
|
-
msg.serverStart({
|
|
85
|
-
startupTime: performance.now() - timerStart,
|
|
86
|
-
resolvedUrls,
|
|
87
|
-
host: settings.config.server.host,
|
|
88
|
-
site: baseURL
|
|
89
|
-
})
|
|
90
|
-
);
|
|
91
|
-
}
|
|
92
|
-
showedListenMsg = true;
|
|
93
|
-
resolve();
|
|
94
|
-
});
|
|
95
|
-
httpServer == null ? void 0 : httpServer.on("error", onError);
|
|
96
|
-
};
|
|
97
|
-
const onError = (err) => {
|
|
98
|
-
if (err.code && err.code === "EADDRINUSE") {
|
|
99
|
-
if (!showedPortTakenMsg) {
|
|
100
|
-
info(logging, "astro", msg.portInUse({ port }));
|
|
101
|
-
showedPortTakenMsg = true;
|
|
102
|
-
}
|
|
103
|
-
port++;
|
|
104
|
-
return listen();
|
|
105
|
-
} else {
|
|
106
|
-
error(logging, "astro", err.stack || err.message);
|
|
107
|
-
httpServer == null ? void 0 : httpServer.removeListener("error", onError);
|
|
108
|
-
reject(err);
|
|
109
|
-
}
|
|
110
|
-
};
|
|
111
|
-
listen();
|
|
112
|
-
});
|
|
13
|
+
const { port } = settings.config.server;
|
|
14
|
+
if (settings.config.output === "static") {
|
|
15
|
+
const server2 = await createStaticPreviewServer(settings, { logging, host, port });
|
|
16
|
+
return server2;
|
|
17
|
+
}
|
|
18
|
+
if (!settings.adapter) {
|
|
19
|
+
throw new Error(`[preview] No adapter found.`);
|
|
113
20
|
}
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
return new Promise((resolve, reject) => {
|
|
117
|
-
httpServer.addListener("close", resolve);
|
|
118
|
-
httpServer.addListener("error", reject);
|
|
119
|
-
});
|
|
21
|
+
if (!settings.adapter.previewEntrypoint) {
|
|
22
|
+
throw new Error(`[preview] adapter does not have previewEntrypoint.`);
|
|
120
23
|
}
|
|
121
|
-
|
|
24
|
+
const require2 = createRequire(settings.config.root);
|
|
25
|
+
const previewEntrypoint = require2.resolve(settings.adapter.previewEntrypoint);
|
|
26
|
+
const previewModule = await import(previewEntrypoint);
|
|
27
|
+
if (typeof previewModule.default !== "function") {
|
|
28
|
+
throw new Error(`[preview] ${settings.adapter.name} cannot preview your app.`);
|
|
29
|
+
}
|
|
30
|
+
const server = await previewModule.default({
|
|
31
|
+
outDir: settings.config.outDir,
|
|
32
|
+
client: settings.config.build.client,
|
|
33
|
+
serverEntrypoint: new URL(settings.config.build.serverEntry, settings.config.build.server),
|
|
122
34
|
host,
|
|
123
|
-
port
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
stop: async () => {
|
|
127
|
-
await new Promise((resolve, reject) => {
|
|
128
|
-
httpServer.close((err) => err ? reject(err) : resolve(void 0));
|
|
129
|
-
});
|
|
130
|
-
}
|
|
131
|
-
};
|
|
35
|
+
port
|
|
36
|
+
});
|
|
37
|
+
return server;
|
|
132
38
|
}
|
|
133
39
|
export {
|
|
134
40
|
preview as default
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import type { AstroSettings } from '../../@types/astro';
|
|
3
|
+
import type { LogOptions } from '../logger/core';
|
|
4
|
+
import http from 'http';
|
|
5
|
+
export interface PreviewServer {
|
|
6
|
+
host?: string;
|
|
7
|
+
port: number;
|
|
8
|
+
server: http.Server;
|
|
9
|
+
closed(): Promise<void>;
|
|
10
|
+
stop(): Promise<void>;
|
|
11
|
+
}
|
|
12
|
+
/** The primary dev action */
|
|
13
|
+
export default function createStaticPreviewServer(settings: AstroSettings, { logging, host, port }: {
|
|
14
|
+
logging: LogOptions;
|
|
15
|
+
host: string | undefined;
|
|
16
|
+
port: number;
|
|
17
|
+
}): Promise<PreviewServer>;
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import fs from "fs";
|
|
2
|
+
import http from "http";
|
|
3
|
+
import { performance } from "perf_hooks";
|
|
4
|
+
import sirv from "sirv";
|
|
5
|
+
import { fileURLToPath } from "url";
|
|
6
|
+
import { notFoundTemplate, subpathNotUsedTemplate } from "../../template/4xx.js";
|
|
7
|
+
import { error, info } from "../logger/core.js";
|
|
8
|
+
import * as msg from "../messages.js";
|
|
9
|
+
const HAS_FILE_EXTENSION_REGEXP = /^.*\.[^\\]+$/;
|
|
10
|
+
async function createStaticPreviewServer(settings, { logging, host, port }) {
|
|
11
|
+
const startServerTime = performance.now();
|
|
12
|
+
const defaultOrigin = "http://localhost";
|
|
13
|
+
const trailingSlash = settings.config.trailingSlash;
|
|
14
|
+
let baseURL = new URL(settings.config.base, new URL(settings.config.site || "/", defaultOrigin));
|
|
15
|
+
const staticFileServer = sirv(fileURLToPath(settings.config.outDir), {
|
|
16
|
+
dev: true,
|
|
17
|
+
etag: true,
|
|
18
|
+
maxAge: 0
|
|
19
|
+
});
|
|
20
|
+
const server = http.createServer((req, res) => {
|
|
21
|
+
var _a;
|
|
22
|
+
const requestURL = new URL(req.url, defaultOrigin);
|
|
23
|
+
if (!requestURL.pathname.startsWith(baseURL.pathname)) {
|
|
24
|
+
res.statusCode = 404;
|
|
25
|
+
res.end(subpathNotUsedTemplate(baseURL.pathname, requestURL.pathname));
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
const pathname = requestURL.pathname.slice(baseURL.pathname.length - 1);
|
|
29
|
+
const isRoot = pathname === "/";
|
|
30
|
+
const hasTrailingSlash = isRoot || pathname.endsWith("/");
|
|
31
|
+
function sendError(message) {
|
|
32
|
+
res.statusCode = 404;
|
|
33
|
+
res.end(notFoundTemplate(pathname, message));
|
|
34
|
+
}
|
|
35
|
+
switch (true) {
|
|
36
|
+
case (hasTrailingSlash && trailingSlash == "never" && !isRoot):
|
|
37
|
+
sendError('Not Found (trailingSlash is set to "never")');
|
|
38
|
+
return;
|
|
39
|
+
case (!hasTrailingSlash && trailingSlash == "always" && !isRoot && !HAS_FILE_EXTENSION_REGEXP.test(pathname)):
|
|
40
|
+
sendError('Not Found (trailingSlash is set to "always")');
|
|
41
|
+
return;
|
|
42
|
+
default: {
|
|
43
|
+
req.url = "/" + ((_a = req.url) == null ? void 0 : _a.replace(baseURL.pathname, ""));
|
|
44
|
+
staticFileServer(req, res, () => {
|
|
45
|
+
const errorPagePath = fileURLToPath(settings.config.outDir + "/404.html");
|
|
46
|
+
if (fs.existsSync(errorPagePath)) {
|
|
47
|
+
res.statusCode = 404;
|
|
48
|
+
res.setHeader("Content-Type", "text/html;charset=utf-8");
|
|
49
|
+
res.end(fs.readFileSync(errorPagePath));
|
|
50
|
+
} else {
|
|
51
|
+
staticFileServer(req, res, () => {
|
|
52
|
+
sendError("Not Found");
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
let httpServer;
|
|
61
|
+
function startServer(timerStart) {
|
|
62
|
+
let showedPortTakenMsg = false;
|
|
63
|
+
let showedListenMsg = false;
|
|
64
|
+
return new Promise((resolve, reject) => {
|
|
65
|
+
const listen = () => {
|
|
66
|
+
httpServer = server.listen(port, host, async () => {
|
|
67
|
+
if (!showedListenMsg) {
|
|
68
|
+
const resolvedUrls = msg.resolveServerUrls({
|
|
69
|
+
address: server.address(),
|
|
70
|
+
host: settings.config.server.host,
|
|
71
|
+
https: false
|
|
72
|
+
});
|
|
73
|
+
info(
|
|
74
|
+
logging,
|
|
75
|
+
null,
|
|
76
|
+
msg.serverStart({
|
|
77
|
+
startupTime: performance.now() - timerStart,
|
|
78
|
+
resolvedUrls,
|
|
79
|
+
host: settings.config.server.host,
|
|
80
|
+
site: baseURL
|
|
81
|
+
})
|
|
82
|
+
);
|
|
83
|
+
}
|
|
84
|
+
showedListenMsg = true;
|
|
85
|
+
resolve();
|
|
86
|
+
});
|
|
87
|
+
httpServer == null ? void 0 : httpServer.on("error", onError);
|
|
88
|
+
};
|
|
89
|
+
const onError = (err) => {
|
|
90
|
+
if (err.code && err.code === "EADDRINUSE") {
|
|
91
|
+
if (!showedPortTakenMsg) {
|
|
92
|
+
info(logging, "astro", msg.portInUse({ port }));
|
|
93
|
+
showedPortTakenMsg = true;
|
|
94
|
+
}
|
|
95
|
+
port++;
|
|
96
|
+
return listen();
|
|
97
|
+
} else {
|
|
98
|
+
error(logging, "astro", err.stack || err.message);
|
|
99
|
+
httpServer == null ? void 0 : httpServer.removeListener("error", onError);
|
|
100
|
+
reject(err);
|
|
101
|
+
}
|
|
102
|
+
};
|
|
103
|
+
listen();
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
await startServer(startServerTime);
|
|
107
|
+
function closed() {
|
|
108
|
+
return new Promise((resolve, reject) => {
|
|
109
|
+
httpServer.addListener("close", resolve);
|
|
110
|
+
httpServer.addListener("error", reject);
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
return {
|
|
114
|
+
host,
|
|
115
|
+
port,
|
|
116
|
+
closed,
|
|
117
|
+
server: httpServer,
|
|
118
|
+
stop: async () => {
|
|
119
|
+
await new Promise((resolve, reject) => {
|
|
120
|
+
httpServer.close((err) => err ? reject(err) : resolve(void 0));
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
export {
|
|
126
|
+
createStaticPreviewServer as default
|
|
127
|
+
};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { RouteData, SSRElement } from '../../@types/astro';
|
|
2
|
+
/**
|
|
3
|
+
* The RenderContext represents the parts of rendering that are specific to one request.
|
|
4
|
+
*/
|
|
5
|
+
export interface RenderContext {
|
|
6
|
+
request: Request;
|
|
7
|
+
origin: string;
|
|
8
|
+
pathname: string;
|
|
9
|
+
url: URL;
|
|
10
|
+
scripts?: Set<SSRElement>;
|
|
11
|
+
links?: Set<SSRElement>;
|
|
12
|
+
styles?: Set<SSRElement>;
|
|
13
|
+
route?: RouteData;
|
|
14
|
+
status?: number;
|
|
15
|
+
}
|
|
16
|
+
export declare type CreateRenderContextArgs = Partial<RenderContext> & {
|
|
17
|
+
origin?: string;
|
|
18
|
+
request: RenderContext['request'];
|
|
19
|
+
};
|
|
20
|
+
export declare function createRenderContext(options: CreateRenderContextArgs): RenderContext;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
function createRenderContext(options) {
|
|
2
|
+
const request = options.request;
|
|
3
|
+
const url = new URL(request.url);
|
|
4
|
+
const origin = options.origin ?? url.origin;
|
|
5
|
+
const pathname = options.pathname ?? url.pathname;
|
|
6
|
+
return {
|
|
7
|
+
...options,
|
|
8
|
+
origin,
|
|
9
|
+
pathname,
|
|
10
|
+
url
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
export {
|
|
14
|
+
createRenderContext
|
|
15
|
+
};
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import type { ComponentInstance, Params, Props, RouteData, RuntimeMode, SSRElement, SSRLoadedRenderer } from '../../@types/astro';
|
|
1
|
+
import type { ComponentInstance, Params, Props, RouteData } from '../../@types/astro';
|
|
3
2
|
import type { LogOptions } from '../logger/core.js';
|
|
3
|
+
import type { RenderContext } from './context.js';
|
|
4
|
+
import type { Environment } from './environment.js';
|
|
4
5
|
import { RouteCache } from './route-cache.js';
|
|
5
6
|
interface GetParamsAndPropsOptions {
|
|
6
7
|
mod: ComponentInstance;
|
|
@@ -14,26 +15,5 @@ export declare const enum GetParamsAndPropsError {
|
|
|
14
15
|
NoMatchingStaticPath = 0
|
|
15
16
|
}
|
|
16
17
|
export declare function getParamsAndProps(opts: GetParamsAndPropsOptions): Promise<[Params, Props] | GetParamsAndPropsError>;
|
|
17
|
-
export
|
|
18
|
-
adapterName: string | undefined;
|
|
19
|
-
logging: LogOptions;
|
|
20
|
-
links: Set<SSRElement>;
|
|
21
|
-
styles?: Set<SSRElement>;
|
|
22
|
-
markdown: MarkdownRenderingOptions;
|
|
23
|
-
mod: ComponentInstance;
|
|
24
|
-
mode: RuntimeMode;
|
|
25
|
-
origin: string;
|
|
26
|
-
pathname: string;
|
|
27
|
-
scripts: Set<SSRElement>;
|
|
28
|
-
resolve: (s: string) => Promise<string>;
|
|
29
|
-
renderers: SSRLoadedRenderer[];
|
|
30
|
-
route?: RouteData;
|
|
31
|
-
routeCache: RouteCache;
|
|
32
|
-
site?: string;
|
|
33
|
-
ssr: boolean;
|
|
34
|
-
streaming: boolean;
|
|
35
|
-
request: Request;
|
|
36
|
-
status?: number;
|
|
37
|
-
}
|
|
38
|
-
export declare function render(opts: RenderOptions): Promise<Response>;
|
|
18
|
+
export declare function renderPage(mod: ComponentInstance, ctx: RenderContext, env: Environment): Promise<Response>;
|
|
39
19
|
export {};
|
package/dist/core/render/core.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Fragment, renderPage } from "../../runtime/server/index.js";
|
|
1
|
+
import { Fragment, renderPage as runtimeRenderPage } from "../../runtime/server/index.js";
|
|
2
2
|
import { attachToResponse } from "../cookies/index.js";
|
|
3
3
|
import { getParams } from "../routing/params.js";
|
|
4
4
|
import { createResult } from "./result.js";
|
|
@@ -33,63 +33,42 @@ async function getParamsAndProps(opts) {
|
|
|
33
33
|
}
|
|
34
34
|
return [params, pageProps];
|
|
35
35
|
}
|
|
36
|
-
async function
|
|
37
|
-
const {
|
|
38
|
-
adapterName,
|
|
39
|
-
links,
|
|
40
|
-
styles,
|
|
41
|
-
logging,
|
|
42
|
-
origin,
|
|
43
|
-
markdown,
|
|
44
|
-
mod,
|
|
45
|
-
mode,
|
|
46
|
-
pathname,
|
|
47
|
-
scripts,
|
|
48
|
-
renderers,
|
|
49
|
-
request,
|
|
50
|
-
resolve,
|
|
51
|
-
route,
|
|
52
|
-
routeCache,
|
|
53
|
-
site,
|
|
54
|
-
ssr,
|
|
55
|
-
streaming,
|
|
56
|
-
status = 200
|
|
57
|
-
} = opts;
|
|
36
|
+
async function renderPage(mod, ctx, env) {
|
|
58
37
|
const paramsAndPropsRes = await getParamsAndProps({
|
|
59
|
-
logging,
|
|
38
|
+
logging: env.logging,
|
|
60
39
|
mod,
|
|
61
|
-
route,
|
|
62
|
-
routeCache,
|
|
63
|
-
pathname,
|
|
64
|
-
ssr
|
|
40
|
+
route: ctx.route,
|
|
41
|
+
routeCache: env.routeCache,
|
|
42
|
+
pathname: ctx.pathname,
|
|
43
|
+
ssr: env.ssr
|
|
65
44
|
});
|
|
66
45
|
if (paramsAndPropsRes === 0 /* NoMatchingStaticPath */) {
|
|
67
46
|
throw new Error(
|
|
68
|
-
`[getStaticPath] route pattern matched, but no matching static path found. (${pathname})`
|
|
47
|
+
`[getStaticPath] route pattern matched, but no matching static path found. (${ctx.pathname})`
|
|
69
48
|
);
|
|
70
49
|
}
|
|
71
50
|
const [params, pageProps] = paramsAndPropsRes;
|
|
72
|
-
const Component =
|
|
51
|
+
const Component = mod.default;
|
|
73
52
|
if (!Component)
|
|
74
53
|
throw new Error(`Expected an exported Astro component but received typeof ${typeof Component}`);
|
|
75
54
|
const result = createResult({
|
|
76
|
-
adapterName,
|
|
77
|
-
links,
|
|
78
|
-
styles,
|
|
79
|
-
logging,
|
|
80
|
-
markdown,
|
|
81
|
-
mode,
|
|
82
|
-
origin,
|
|
55
|
+
adapterName: env.adapterName,
|
|
56
|
+
links: ctx.links,
|
|
57
|
+
styles: ctx.styles,
|
|
58
|
+
logging: env.logging,
|
|
59
|
+
markdown: env.markdown,
|
|
60
|
+
mode: env.mode,
|
|
61
|
+
origin: ctx.origin,
|
|
83
62
|
params,
|
|
84
63
|
props: pageProps,
|
|
85
|
-
pathname,
|
|
86
|
-
resolve,
|
|
87
|
-
renderers,
|
|
88
|
-
request,
|
|
89
|
-
site,
|
|
90
|
-
scripts,
|
|
91
|
-
ssr,
|
|
92
|
-
status
|
|
64
|
+
pathname: ctx.pathname,
|
|
65
|
+
resolve: env.resolve,
|
|
66
|
+
renderers: env.renderers,
|
|
67
|
+
request: ctx.request,
|
|
68
|
+
site: env.site,
|
|
69
|
+
scripts: ctx.scripts,
|
|
70
|
+
ssr: env.ssr,
|
|
71
|
+
status: ctx.status ?? 200
|
|
93
72
|
});
|
|
94
73
|
if (typeof mod.components === "object") {
|
|
95
74
|
Object.assign(pageProps, { components: mod.components });
|
|
@@ -99,7 +78,7 @@ async function render(opts) {
|
|
|
99
78
|
components: Object.assign((pageProps == null ? void 0 : pageProps.components) ?? {}, { Fragment })
|
|
100
79
|
});
|
|
101
80
|
}
|
|
102
|
-
const response = await
|
|
81
|
+
const response = await runtimeRenderPage(result, Component, pageProps, null, env.streaming);
|
|
103
82
|
if (result.cookies) {
|
|
104
83
|
attachToResponse(response, result.cookies);
|
|
105
84
|
}
|
|
@@ -108,5 +87,5 @@ async function render(opts) {
|
|
|
108
87
|
export {
|
|
109
88
|
GetParamsAndPropsError,
|
|
110
89
|
getParamsAndProps,
|
|
111
|
-
|
|
90
|
+
renderPage
|
|
112
91
|
};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ViteDevServer } from 'vite';
|
|
2
|
+
import type { AstroSettings } from '../../../@types/astro';
|
|
3
|
+
import type { LogOptions } from '../../logger/core.js';
|
|
4
|
+
import type { Environment } from '../index';
|
|
5
|
+
export declare type DevelopmentEnvironment = Environment & {
|
|
6
|
+
settings: AstroSettings;
|
|
7
|
+
viteServer: ViteDevServer;
|
|
8
|
+
};
|
|
9
|
+
export declare function createDevelopmentEnvironment(settings: AstroSettings, logging: LogOptions, viteServer: ViteDevServer): DevelopmentEnvironment;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { createEnvironment } from "../index.js";
|
|
2
|
+
import { RouteCache } from "../route-cache.js";
|
|
3
|
+
import { createResolve } from "./resolve.js";
|
|
4
|
+
function createDevelopmentEnvironment(settings, logging, viteServer) {
|
|
5
|
+
var _a;
|
|
6
|
+
const mode = "development";
|
|
7
|
+
let env = createEnvironment({
|
|
8
|
+
adapterName: (_a = settings.adapter) == null ? void 0 : _a.name,
|
|
9
|
+
logging,
|
|
10
|
+
markdown: {
|
|
11
|
+
...settings.config.markdown,
|
|
12
|
+
isAstroFlavoredMd: settings.config.legacy.astroFlavoredMarkdown
|
|
13
|
+
},
|
|
14
|
+
mode,
|
|
15
|
+
renderers: [],
|
|
16
|
+
resolve: createResolve(viteServer),
|
|
17
|
+
routeCache: new RouteCache(logging, mode),
|
|
18
|
+
site: settings.config.site,
|
|
19
|
+
ssr: settings.config.output === "server",
|
|
20
|
+
streaming: true
|
|
21
|
+
});
|
|
22
|
+
return {
|
|
23
|
+
...env,
|
|
24
|
+
viteServer,
|
|
25
|
+
settings
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
export {
|
|
29
|
+
createDevelopmentEnvironment
|
|
30
|
+
};
|
|
@@ -2,7 +2,10 @@ import type { ViteDevServer } from 'vite';
|
|
|
2
2
|
import type { AstroSettings, ComponentInstance, RouteData, RuntimeMode, SSRLoadedRenderer } from '../../../@types/astro';
|
|
3
3
|
import { LogOptions } from '../../logger/core.js';
|
|
4
4
|
import { RouteCache } from '../route-cache.js';
|
|
5
|
-
|
|
5
|
+
import type { DevelopmentEnvironment } from './environment';
|
|
6
|
+
export { createDevelopmentEnvironment } from './environment.js';
|
|
7
|
+
export type { DevelopmentEnvironment };
|
|
8
|
+
export interface SSROptionsOld {
|
|
6
9
|
/** an instance of the AstroSettings */
|
|
7
10
|
settings: AstroSettings;
|
|
8
11
|
/** location of file on disk */
|
|
@@ -24,9 +27,23 @@ export interface SSROptions {
|
|
|
24
27
|
/** Request */
|
|
25
28
|
request: Request;
|
|
26
29
|
}
|
|
30
|
+
export interface SSROptions {
|
|
31
|
+
/** The environment instance */
|
|
32
|
+
env: DevelopmentEnvironment;
|
|
33
|
+
/** location of file on disk */
|
|
34
|
+
filePath: URL;
|
|
35
|
+
/** production website */
|
|
36
|
+
origin: string;
|
|
37
|
+
/** the web request (needed for dynamic routes) */
|
|
38
|
+
pathname: string;
|
|
39
|
+
/** The renderers and instance */
|
|
40
|
+
preload: ComponentPreload;
|
|
41
|
+
/** Request */
|
|
42
|
+
request: Request;
|
|
43
|
+
/** optional, in case we need to render something outside of a dev server */
|
|
44
|
+
route?: RouteData;
|
|
45
|
+
}
|
|
27
46
|
export declare type ComponentPreload = [SSRLoadedRenderer[], ComponentInstance];
|
|
28
47
|
export declare function loadRenderers(viteServer: ViteDevServer, settings: AstroSettings): Promise<SSRLoadedRenderer[]>;
|
|
29
|
-
export declare function preload({
|
|
30
|
-
|
|
31
|
-
export declare function render(renderers: SSRLoadedRenderer[], mod: ComponentInstance, ssrOpts: SSROptions): Promise<Response>;
|
|
32
|
-
export declare function ssr(preloadedComponent: ComponentPreload, ssrOpts: SSROptions): Promise<Response>;
|
|
48
|
+
export declare function preload({ env, filePath, }: Pick<SSROptions, 'env' | 'filePath'>): Promise<ComponentPreload>;
|
|
49
|
+
export declare function renderPage(options: SSROptions): Promise<Response>;
|