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.
Files changed (71) hide show
  1. package/astro-jsx.d.ts +8 -6
  2. package/components/Code.astro +1 -1
  3. package/config.d.ts +1 -1
  4. package/dist/@types/astro.d.ts +200 -19
  5. package/dist/cli/index.js +35 -36
  6. package/dist/config/index.js +2 -7
  7. package/dist/core/add/index.js +141 -24
  8. package/dist/core/app/index.js +45 -43
  9. package/dist/core/build/generate.js +14 -12
  10. package/dist/core/build/index.js +3 -3
  11. package/dist/core/config/config.d.ts +1 -1
  12. package/dist/core/config/config.js +6 -2
  13. package/dist/core/config/index.d.ts +1 -1
  14. package/dist/core/config/index.js +2 -1
  15. package/dist/core/config/schema.d.ts +139 -1
  16. package/dist/core/config/schema.js +36 -3
  17. package/dist/core/config/settings.d.ts +1 -7
  18. package/dist/core/config/settings.js +7 -4
  19. package/dist/core/config/tsconfig.d.ts +10 -1
  20. package/dist/core/config/tsconfig.js +72 -7
  21. package/dist/core/constants.d.ts +1 -0
  22. package/dist/core/constants.js +4 -0
  23. package/dist/core/cookies/cookies.d.ts +1 -1
  24. package/dist/core/dev/index.js +7 -2
  25. package/dist/core/endpoint/dev/index.d.ts +2 -1
  26. package/dist/core/endpoint/dev/index.js +13 -6
  27. package/dist/core/endpoint/index.d.ts +4 -3
  28. package/dist/core/endpoint/index.js +57 -9
  29. package/dist/core/messages.js +2 -2
  30. package/dist/core/preview/index.d.ts +2 -11
  31. package/dist/core/preview/index.js +31 -125
  32. package/dist/core/preview/static-preview-server.d.ts +17 -0
  33. package/dist/core/preview/static-preview-server.js +127 -0
  34. package/dist/core/render/context.d.ts +20 -0
  35. package/dist/core/render/context.js +15 -0
  36. package/dist/core/render/core.d.ts +4 -24
  37. package/dist/core/render/core.js +26 -47
  38. package/dist/core/render/dev/environment.d.ts +9 -0
  39. package/dist/core/render/dev/environment.js +30 -0
  40. package/dist/core/render/dev/index.d.ts +22 -5
  41. package/dist/core/render/dev/index.js +38 -69
  42. package/dist/core/render/dev/resolve.d.ts +2 -0
  43. package/dist/core/render/dev/resolve.js +14 -0
  44. package/dist/core/render/environment.d.ts +29 -0
  45. package/dist/core/render/environment.js +21 -0
  46. package/dist/core/render/index.d.ts +6 -0
  47. package/dist/core/render/index.js +13 -0
  48. package/dist/core/render/renderer.d.ts +9 -0
  49. package/dist/core/render/renderer.js +23 -0
  50. package/dist/core/render/result.js +3 -3
  51. package/dist/core/routing/manifest/create.js +14 -5
  52. package/dist/core/routing/manifest/generator.js +8 -3
  53. package/dist/core/util.d.ts +3 -14
  54. package/dist/core/util.js +4 -2
  55. package/dist/events/index.js +1 -1
  56. package/dist/integrations/index.d.ts +3 -2
  57. package/dist/integrations/index.js +39 -2
  58. package/dist/jsx/component.d.ts +1 -0
  59. package/dist/jsx/component.js +10 -0
  60. package/dist/jsx/index.d.ts +2 -0
  61. package/dist/jsx/index.js +6 -0
  62. package/dist/jsx-runtime/index.js +1 -1
  63. package/dist/runtime/server/astro-global.js +1 -1
  64. package/dist/runtime/server/index.d.ts +1 -0
  65. package/dist/runtime/server/index.js +2 -0
  66. package/dist/vite-plugin-astro-server/index.js +35 -60
  67. package/dist/vite-plugin-jsx/index.js +9 -5
  68. package/dist/vite-plugin-jsx/tag.d.ts +3 -2
  69. package/dist/vite-plugin-jsx/tag.js +10 -4
  70. package/env.d.ts +1 -1
  71. package/package.json +8 -3
@@ -1,134 +1,40 @@
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";
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
- const HAS_FILE_EXTENSION_REGEXP = /^.*\.[^\\]+$/;
11
- async function preview(settings, { logging }) {
12
- if (settings.config.output === "server") {
13
- throw new Error(
14
- `[preview] 'output: server' not supported. Use your deploy platform's preview command directly instead, if one exists. (ex: 'netlify dev', 'vercel dev', 'wrangler', etc.)`
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
- let { port } = settings.config.server;
11
+ await runHookConfigDone({ settings, logging });
67
12
  const host = getResolvedHostForHttpServer(settings.config.server.host);
68
- let httpServer;
69
- function startServer(timerStart) {
70
- let showedPortTakenMsg = false;
71
- let showedListenMsg = false;
72
- return new Promise((resolve, reject) => {
73
- const listen = () => {
74
- httpServer = server.listen(port, host, async () => {
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
- await startServer(startServerTime);
115
- function closed() {
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
- return {
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
- closed,
125
- server: httpServer,
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 { MarkdownRenderingOptions } from '@astrojs/markdown-remark';
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 interface RenderOptions {
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 {};
@@ -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 render(opts) {
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 = await mod.default;
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 renderPage(result, Component, pageProps, null, streaming);
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
- render
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
- export interface SSROptions {
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({ settings, filePath, viteServer, }: Pick<SSROptions, 'settings' | 'filePath' | 'viteServer'>): Promise<ComponentPreload>;
30
- /** use Vite to SSR */
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>;