astro 7.2.2 → 7.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (151) hide show
  1. package/dist/actions/handler.d.ts +6 -12
  2. package/dist/actions/handler.js +30 -40
  3. package/dist/actions/load.d.ts +12 -0
  4. package/dist/actions/load.js +55 -0
  5. package/dist/actions/runtime/entrypoints/server.js +5 -4
  6. package/dist/actions/runtime/server.js +8 -6
  7. package/dist/assets/fonts/providers/index.d.ts +1 -1
  8. package/dist/assets/fonts/providers/index.js +2 -12
  9. package/dist/cli/infra/build-time-astro-version-provider.js +1 -1
  10. package/dist/container/environment.d.ts +20 -0
  11. package/dist/container/environment.js +106 -0
  12. package/dist/container/index.js +65 -32
  13. package/dist/content/content-layer.js +3 -3
  14. package/dist/content/data-store-writer.d.ts +7 -10
  15. package/dist/content/data-store-writer.js +62 -27
  16. package/dist/content/data-store.d.ts +20 -3
  17. package/dist/content/data-store.js +28 -7
  18. package/dist/content/mutable-data-store.js +15 -10
  19. package/dist/content/runtime.d.ts +3 -2
  20. package/dist/content/runtime.js +43 -26
  21. package/dist/core/app/app.d.ts +0 -2
  22. package/dist/core/app/app.js +0 -7
  23. package/dist/core/app/base.d.ts +32 -20
  24. package/dist/core/app/base.js +76 -66
  25. package/dist/core/app/dev-facade.d.ts +27 -0
  26. package/dist/core/app/dev-facade.js +51 -0
  27. package/dist/core/app/entrypoints/index.d.ts +0 -1
  28. package/dist/core/app/entrypoints/index.js +0 -2
  29. package/dist/core/app/entrypoints/virtual/dev.js +24 -19
  30. package/dist/core/app/node.js +13 -14
  31. package/dist/core/app/prepare-response.d.ts +1 -1
  32. package/dist/core/app/validate-headers.js +7 -3
  33. package/dist/core/build/app.d.ts +31 -6
  34. package/dist/core/build/app.js +31 -13
  35. package/dist/core/build/environment.d.ts +25 -0
  36. package/dist/core/build/environment.js +157 -0
  37. package/dist/core/cache/handler.d.ts +13 -7
  38. package/dist/core/cache/handler.js +55 -51
  39. package/dist/core/cache/provider.d.ts +4 -0
  40. package/dist/core/cache/provider.js +15 -0
  41. package/dist/core/constants.d.ts +0 -11
  42. package/dist/core/constants.js +1 -5
  43. package/dist/core/dev/dev.js +1 -1
  44. package/dist/core/environment/dev-nonrunnable.d.ts +6 -0
  45. package/dist/core/environment/dev-nonrunnable.js +170 -0
  46. package/dist/core/environment/index.d.ts +90 -0
  47. package/dist/core/environment/index.js +12 -0
  48. package/dist/core/environment/production.d.ts +6 -0
  49. package/dist/core/environment/production.js +117 -0
  50. package/dist/core/errors/build-handler.d.ts +5 -10
  51. package/dist/core/errors/build-handler.js +11 -17
  52. package/dist/core/errors/default-handler.d.ts +4 -9
  53. package/dist/core/errors/default-handler.js +92 -107
  54. package/dist/core/errors/dev-handler.d.ts +7 -11
  55. package/dist/core/errors/dev-handler.js +71 -69
  56. package/dist/core/errors/errors-data.d.ts +18 -0
  57. package/dist/core/errors/errors-data.js +7 -0
  58. package/dist/core/errors/handler.d.ts +22 -3
  59. package/dist/core/errors/handler.js +25 -0
  60. package/dist/core/fetch/default-handler.d.ts +15 -8
  61. package/dist/core/fetch/default-handler.js +12 -34
  62. package/dist/core/fetch/features.d.ts +23 -0
  63. package/dist/core/fetch/features.js +27 -0
  64. package/dist/core/fetch/fetch-state.d.ts +52 -7
  65. package/dist/core/fetch/fetch-state.js +92 -81
  66. package/dist/core/fetch/index.d.ts +9 -2
  67. package/dist/core/fetch/index.js +18 -79
  68. package/dist/core/fetch/vite-plugin.js +2 -1
  69. package/dist/core/i18n/handler.d.ts +28 -13
  70. package/dist/core/i18n/handler.js +100 -100
  71. package/dist/core/logger/manifest-logger.d.ts +31 -0
  72. package/dist/core/logger/manifest-logger.js +37 -0
  73. package/dist/core/manifest/ambient-source.d.ts +2 -0
  74. package/dist/core/manifest/ambient-source.js +4 -0
  75. package/dist/core/manifest/ambient.d.ts +16 -0
  76. package/dist/core/manifest/ambient.js +22 -0
  77. package/dist/core/manifest/derived.d.ts +3 -0
  78. package/dist/core/manifest/derived.js +10 -0
  79. package/dist/core/manifest/memo.d.ts +31 -0
  80. package/dist/core/manifest/memo.js +47 -0
  81. package/dist/core/messages/runtime.js +1 -1
  82. package/dist/core/middleware/astro-middleware.d.ts +25 -35
  83. package/dist/core/middleware/astro-middleware.js +61 -81
  84. package/dist/core/middleware/load.d.ts +19 -0
  85. package/dist/core/middleware/load.js +36 -0
  86. package/dist/core/middleware/sequence.js +15 -7
  87. package/dist/core/pages/handler.d.ts +18 -25
  88. package/dist/core/pages/handler.js +68 -84
  89. package/dist/core/redirects/render.js +3 -8
  90. package/dist/core/render/index.d.ts +0 -1
  91. package/dist/core/render/index.js +0 -2
  92. package/dist/core/render/route-cache.d.ts +6 -1
  93. package/dist/core/render/route-cache.js +11 -1
  94. package/dist/core/rewrites/handler.d.ts +4 -6
  95. package/dist/core/rewrites/handler.js +19 -20
  96. package/dist/core/routing/default.d.ts +2 -0
  97. package/dist/core/routing/default.js +7 -1
  98. package/dist/core/routing/dev.d.ts +1 -3
  99. package/dist/core/routing/dev.js +12 -5
  100. package/dist/core/routing/handler.d.ts +6 -16
  101. package/dist/core/routing/handler.js +126 -164
  102. package/dist/core/routing/helpers.d.ts +7 -1
  103. package/dist/core/routing/helpers.js +21 -0
  104. package/dist/core/routing/match-request.d.ts +10 -0
  105. package/dist/core/routing/match-request.js +57 -0
  106. package/dist/core/routing/route-table.d.ts +34 -0
  107. package/dist/core/routing/route-table.js +41 -0
  108. package/dist/core/routing/trailing-slash-handler.d.ts +4 -14
  109. package/dist/core/routing/trailing-slash-handler.js +39 -50
  110. package/dist/core/server-islands/mappings.d.ts +6 -0
  111. package/dist/core/server-islands/mappings.js +12 -0
  112. package/dist/core/session/driver.d.ts +4 -0
  113. package/dist/core/session/driver.js +14 -0
  114. package/dist/core/session/handler.d.ts +1 -1
  115. package/dist/core/session/handler.js +8 -8
  116. package/dist/core/session/provider-disabled.js +2 -2
  117. package/dist/entrypoints/prerender.js +5 -1
  118. package/dist/i18n/middleware.d.ts +4 -4
  119. package/dist/i18n/middleware.js +3 -3
  120. package/dist/manifest/serialized.d.ts +1 -0
  121. package/dist/manifest/serialized.js +9 -2
  122. package/dist/runtime/prerender/static-paths.d.ts +14 -2
  123. package/dist/runtime/prerender/static-paths.js +4 -3
  124. package/dist/types/public/config.d.ts +433 -241
  125. package/dist/vite-plugin-app/createAstroServerApp.js +22 -18
  126. package/dist/vite-plugin-app/environment.d.ts +18 -0
  127. package/dist/vite-plugin-app/environment.js +210 -0
  128. package/dist/vite-plugin-app/handle-request.d.ts +30 -0
  129. package/dist/vite-plugin-app/handle-request.js +129 -0
  130. package/dist/vite-plugin-app/index.d.ts +1 -1
  131. package/dist/vite-plugin-app/index.js +1 -1
  132. package/package.json +14 -7
  133. package/src/core/README.md +37 -0
  134. package/src/core/manifest/ambient-source.ts +9 -0
  135. package/src/types/README.md +5 -0
  136. package/dist/container/pipeline.d.ts +0 -14
  137. package/dist/container/pipeline.js +0 -78
  138. package/dist/core/app/dev/app.d.ts +0 -31
  139. package/dist/core/app/dev/app.js +0 -80
  140. package/dist/core/app/dev/pipeline.d.ts +0 -17
  141. package/dist/core/app/dev/pipeline.js +0 -133
  142. package/dist/core/app/pipeline.d.ts +0 -14
  143. package/dist/core/app/pipeline.js +0 -123
  144. package/dist/core/base-pipeline.d.ts +0 -183
  145. package/dist/core/base-pipeline.js +0 -293
  146. package/dist/core/build/pipeline.d.ts +0 -38
  147. package/dist/core/build/pipeline.js +0 -202
  148. package/dist/vite-plugin-app/app.d.ts +0 -62
  149. package/dist/vite-plugin-app/app.js +0 -237
  150. package/dist/vite-plugin-app/pipeline.d.ts +0 -25
  151. package/dist/vite-plugin-app/pipeline.js +0 -189
@@ -1,5 +1,5 @@
1
1
  import { manifest } from "virtual:astro:manifest";
2
- import { routes } from "virtual:astro:routes";
2
+ import { clearActions } from "../actions/load.js";
3
3
  import { getPackageManager } from "../cli/info/core/get-package-manager.js";
4
4
  import { DevDebugInfoProvider } from "../cli/info/infra/dev-debug-info-provider.js";
5
5
  import { ProcessNodeVersionProvider } from "../cli/info/infra/process-node-version-provider.js";
@@ -9,11 +9,17 @@ import { BuildTimeAstroVersionProvider } from "../cli/infra/build-time-astro-ver
9
9
  import { PassthroughTextStyler } from "../cli/infra/passthrough-text-styler.js";
10
10
  import { ProcessOperatingSystemProvider } from "../cli/infra/process-operating-system-provider.js";
11
11
  import { TinyexecCommandExecutor } from "../cli/infra/tinyexec-command-executor.js";
12
- import { AstroServerApp } from "./app.js";
12
+ import { DevFacadeApp } from "../core/app/dev-facade.js";
13
+ import { setEnvironment } from "../core/environment/index.js";
13
14
  import { createNodeLoggerFromFlags } from "../core/logger/impls/node.js";
15
+ import { setLogger } from "../core/logger/manifest-logger.js";
16
+ import { clearMiddleware } from "../core/middleware/load.js";
17
+ import { getRouteCache } from "../core/render/route-cache.js";
18
+ import { updateRouteTable } from "../core/routing/route-table.js";
19
+ import { createRunnableEnvironment } from "./environment.js";
20
+ import { handleDevRequest } from "./handle-request.js";
14
21
  async function createAstroServerApp(controller, settings, loader, logger) {
15
22
  const actualLogger = logger ?? createNodeLoggerFromFlags({});
16
- const routesList = { routes: routes.map((r) => r.routeData) };
17
23
  const debugInfoProvider = new DevDebugInfoProvider({
18
24
  config: settings.config,
19
25
  astroVersionProvider: new BuildTimeAstroVersionProvider(),
@@ -28,22 +34,21 @@ async function createAstroServerApp(controller, settings, loader, logger) {
28
34
  textStyler: new PassthroughTextStyler()
29
35
  });
30
36
  const debugInfo = debugInfoFormatter.format(await debugInfoProvider.get());
31
- const app = await AstroServerApp.create(
37
+ setLogger(manifest, actualLogger);
38
+ setEnvironment(
32
39
  manifest,
33
- routesList,
34
- actualLogger,
35
- loader,
36
- settings,
37
- async () => debugInfo
40
+ createRunnableEnvironment({ loader, settings, getDebugInfo: async () => debugInfo })
38
41
  );
42
+ const app = new DevFacadeApp(manifest, true);
43
+ const deps = { loader, settings, controller };
39
44
  if (import.meta.hot) {
40
45
  import.meta.hot.on("astro:routes-updated", async () => {
41
46
  try {
42
47
  const { routes: newRoutes } = await import("virtual:astro:routes");
43
- const newRoutesList = {
44
- routes: newRoutes.map((r) => r.routeData)
45
- };
46
- app.updateRoutes(newRoutesList);
48
+ updateRouteTable(
49
+ manifest,
50
+ newRoutes.map((r) => r.routeData)
51
+ );
47
52
  actualLogger.debug("router", "Routes updated via HMR");
48
53
  } catch (e) {
49
54
  actualLogger.error("router", `Failed to update routes via HMR:
@@ -51,22 +56,21 @@ async function createAstroServerApp(controller, settings, loader, logger) {
51
56
  }
52
57
  });
53
58
  import.meta.hot.on("astro:content-changed", () => {
54
- app.clearRouteCache();
59
+ getRouteCache(manifest).clearAll();
55
60
  actualLogger.debug("router", "Route cache cleared due to content change");
56
61
  });
57
62
  import.meta.hot.on("astro:middleware-updated", () => {
58
- app.clearMiddleware();
63
+ clearMiddleware(manifest);
59
64
  actualLogger.debug("router", "Middleware cache cleared due to file change");
60
65
  });
61
66
  import.meta.hot.on("astro:actions-updated", () => {
62
- app.clearActions();
67
+ clearActions(manifest);
63
68
  actualLogger.debug("router", "Actions cache cleared due to file change");
64
69
  });
65
70
  }
66
71
  return {
67
72
  handler(incomingRequest, incomingResponse, options) {
68
- return app.handleRequest({
69
- controller,
73
+ return handleDevRequest(app, deps, {
70
74
  incomingRequest,
71
75
  incomingResponse,
72
76
  isHttps: loader?.isHttps() ?? false,
@@ -0,0 +1,18 @@
1
+ import type { RenderEnvironment } from '../core/environment/index.js';
2
+ import type { ModuleLoader } from '../core/module-loader/index.js';
3
+ import type { AstroSettings } from '../types/astro.js';
4
+ import type { SSRLoadedRenderer, SSRManifest } from '../types/public/internal.js';
5
+ export declare function getDevRenderers(manifest: SSRManifest): SSRLoadedRenderer[];
6
+ export declare function setDevRenderers(manifest: SSRManifest, renderers: SSRLoadedRenderer[]): void;
7
+ export interface RunnableEnvironmentOptions {
8
+ loader: ModuleLoader;
9
+ settings: AstroSettings;
10
+ getDebugInfo: () => Promise<string>;
11
+ }
12
+ /**
13
+ * The runnable dev environment (the Vite SSR environment can load modules at
14
+ * runtime). The ModuleLoader and AstroSettings are captured in this closure at
15
+ * composition time (`createAstroServerApp`) and are unreachable from
16
+ * requests/states by design — only the environment functions close over them.
17
+ */
18
+ export declare function createRunnableEnvironment({ loader, settings, getDebugInfo, }: RunnableEnvironmentOptions): RenderEnvironment;
@@ -0,0 +1,210 @@
1
+ import { fileURLToPath } from "node:url";
2
+ import { ASTRO_VERSION } from "../core/constants.js";
3
+ import { enhanceViteSSRError } from "../core/errors/dev/index.js";
4
+ import { AggregateError, CSSError, MarkdownError } from "../core/errors/index.js";
5
+ import { getLogger } from "../core/logger/manifest-logger.js";
6
+ import { req } from "../core/messages/runtime.js";
7
+ import {
8
+ RedirectComponentInstance,
9
+ RedirectSinglePageBuiltModule
10
+ } from "../core/redirects/index.js";
11
+ import { loadRenderer } from "../core/render/index.js";
12
+ import { getDefaultRoutes } from "../core/routing/default.js";
13
+ import { routeIsRedirect } from "../core/routing/helpers.js";
14
+ import { findRouteToRewrite } from "../core/routing/rewrite.js";
15
+ import { getRouteTable } from "../core/routing/route-table.js";
16
+ import { isPage } from "../core/util.js";
17
+ import { resolveIdToUrl } from "../core/viteUtils.js";
18
+ import { stringifyForScript } from "../runtime/server/escape.js";
19
+ import { getComponentMetadata } from "../vite-plugin-astro-server/metadata.js";
20
+ import { PAGE_SCRIPT_ID } from "../vite-plugin-scripts/index.js";
21
+ const devRenderers = /* @__PURE__ */ new WeakMap();
22
+ function getDevRenderers(manifest) {
23
+ return devRenderers.get(manifest) ?? [];
24
+ }
25
+ function setDevRenderers(manifest, renderers) {
26
+ devRenderers.set(manifest, renderers);
27
+ }
28
+ async function getModuleForRoute(manifest, route) {
29
+ for (const defaultRoute of getDefaultRoutes(manifest)) {
30
+ if (route.component === defaultRoute.component) {
31
+ return {
32
+ page: () => Promise.resolve(defaultRoute.instance)
33
+ };
34
+ }
35
+ }
36
+ if (route.type === "redirect") {
37
+ return RedirectSinglePageBuiltModule;
38
+ } else {
39
+ if (manifest.pageMap) {
40
+ const importComponentInstance = manifest.pageMap.get(route.component);
41
+ if (!importComponentInstance) {
42
+ throw new Error(
43
+ `Unexpectedly unable to find a component instance for route ${route.route}`
44
+ );
45
+ }
46
+ return await importComponentInstance();
47
+ } else if (manifest.pageModule) {
48
+ return manifest.pageModule;
49
+ }
50
+ throw new Error(
51
+ "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."
52
+ );
53
+ }
54
+ }
55
+ function createRunnableEnvironment({
56
+ loader,
57
+ settings,
58
+ getDebugInfo
59
+ }) {
60
+ async function getComponentByRoute(manifest, routeData) {
61
+ if (routeIsRedirect(routeData)) {
62
+ return RedirectComponentInstance;
63
+ }
64
+ const filePath = new URL(`${routeData.component}`, manifest.rootDir);
65
+ for (const route of getDefaultRoutes(manifest)) {
66
+ if (route.matchesComponent(filePath)) {
67
+ return route.instance;
68
+ }
69
+ }
70
+ if (settings) {
71
+ const renderers__ = settings.renderers.map((r) => loadRenderer(r, loader));
72
+ const renderers_ = await Promise.all(renderers__);
73
+ setDevRenderers(
74
+ manifest,
75
+ renderers_.filter((r) => Boolean(r))
76
+ );
77
+ }
78
+ try {
79
+ return await loader.import(filePath.toString());
80
+ } catch (error) {
81
+ if (MarkdownError.is(error) || CSSError.is(error) || AggregateError.is(error)) {
82
+ throw error;
83
+ }
84
+ throw enhanceViteSSRError({ error, filePath, loader });
85
+ }
86
+ }
87
+ return {
88
+ name: "dev-runnable",
89
+ runtimeMode: "development",
90
+ // Dev always streams.
91
+ defaultStreaming: () => true,
92
+ resolve(manifest, specifier) {
93
+ return resolveIdToUrl(loader, specifier, manifest.rootDir);
94
+ },
95
+ async headElements(manifest, routeData) {
96
+ const filePath = new URL(`${routeData.component}`, manifest.rootDir);
97
+ const scripts = /* @__PURE__ */ new Set();
98
+ if (settings) {
99
+ if (isPage(filePath, settings)) {
100
+ scripts.add({
101
+ props: { type: "module", src: "/@vite/client" },
102
+ children: ""
103
+ });
104
+ if (manifest.devToolbar.enabled) {
105
+ scripts.add({
106
+ props: {
107
+ type: "module",
108
+ src: "/@id/astro/runtime/client/dev-toolbar/entrypoint.js"
109
+ },
110
+ children: ""
111
+ });
112
+ const additionalMetadata = {
113
+ root: fileURLToPath(settings.config.root),
114
+ version: ASTRO_VERSION,
115
+ latestAstroVersion: settings.latestAstroVersion,
116
+ // TODO: Currently the debug info is always fetched, which slows things down.
117
+ // We should look into not loading it if the dev toolbar is disabled. And when
118
+ // enabled, it would nice to request the debug info through import.meta.hot
119
+ // when the button is click to defer execution as much as possible
120
+ debugInfo: await getDebugInfo(),
121
+ placement: settings.config.devToolbar.placement
122
+ };
123
+ const children = `window.__astro_dev_toolbar__ = ${stringifyForScript(additionalMetadata)}`;
124
+ scripts.add({ props: {}, children });
125
+ }
126
+ }
127
+ for (const script of settings.scripts) {
128
+ if (script.stage === "head-inline") {
129
+ scripts.add({
130
+ props: {},
131
+ children: script.content
132
+ });
133
+ } else if (script.stage === "page" && isPage(filePath, settings)) {
134
+ scripts.add({
135
+ props: { type: "module", src: `/@id/${PAGE_SCRIPT_ID}` },
136
+ children: ""
137
+ });
138
+ }
139
+ }
140
+ }
141
+ const { devCSSMap } = await import("virtual:astro:dev-css-all");
142
+ const importer = devCSSMap.get(routeData.component);
143
+ let css = /* @__PURE__ */ new Set();
144
+ if (importer) {
145
+ const cssModule = await importer();
146
+ css = cssModule.css;
147
+ } else {
148
+ getLogger(manifest).warn(
149
+ "assets",
150
+ `Unable to find CSS for ${routeData.component}. This is likely a bug in Astro.`
151
+ );
152
+ }
153
+ const links = /* @__PURE__ */ new Set();
154
+ const styles = /* @__PURE__ */ new Set();
155
+ for (const { id, url: src, content } of css) {
156
+ scripts.add({ props: { type: "module", src }, children: "" });
157
+ styles.add({ props: { "data-vite-dev-id": id }, children: content });
158
+ }
159
+ return { scripts, styles, links };
160
+ },
161
+ componentMetadata(manifest, routeData) {
162
+ const filePath = new URL(`${routeData.component}`, manifest.rootDir);
163
+ return getComponentMetadata(filePath, loader);
164
+ },
165
+ getComponentByRoute,
166
+ getModuleForRoute,
167
+ async tryRewrite(manifest, payload, request) {
168
+ const { routeData, pathname, newUrl } = findRouteToRewrite({
169
+ payload,
170
+ request,
171
+ // The single fresh route table: HMR route updates are visible
172
+ // to rewrites at the same instant as every other consumer.
173
+ routes: getRouteTable(manifest).routes,
174
+ trailingSlash: manifest.trailingSlash,
175
+ buildFormat: manifest.buildFormat,
176
+ base: manifest.base,
177
+ outDir: manifest.outDir
178
+ });
179
+ const componentInstance = await getComponentByRoute(manifest, routeData);
180
+ return { newUrl, pathname, componentInstance, routeData };
181
+ },
182
+ getRenderers(manifest) {
183
+ return getDevRenderers(manifest);
184
+ },
185
+ errorStrategy: "dev",
186
+ injectCspMetaTagsOnErrorPages: true,
187
+ logRequest(manifest, payload) {
188
+ const { pathname, method, statusCode, isRewrite, timeStart } = payload;
189
+ if (pathname === "/favicon.ico") {
190
+ return;
191
+ }
192
+ const reqTime = performance.now() - timeStart;
193
+ getLogger(manifest).info(
194
+ null,
195
+ req({
196
+ url: pathname,
197
+ method,
198
+ statusCode,
199
+ isRewrite,
200
+ reqTime
201
+ })
202
+ );
203
+ }
204
+ };
205
+ }
206
+ export {
207
+ createRunnableEnvironment,
208
+ getDevRenderers,
209
+ setDevRenderers
210
+ };
@@ -0,0 +1,30 @@
1
+ import type http from 'node:http';
2
+ import type { DevFacadeApp } from '../core/app/dev-facade.js';
3
+ import type { ModuleLoader } from '../core/module-loader/index.js';
4
+ import type { AstroSettings } from '../types/astro.js';
5
+ import type { DevServerController } from '../vite-plugin-astro-server/controller.js';
6
+ /** Composition-time dependencies closed over by `createAstroServerApp`. */
7
+ export interface DevRequestDeps {
8
+ loader: ModuleLoader;
9
+ settings: AstroSettings;
10
+ controller: DevServerController;
11
+ }
12
+ export interface DevRequestIO {
13
+ incomingRequest: http.IncomingMessage;
14
+ incomingResponse: http.ServerResponse;
15
+ isHttps: boolean;
16
+ /** When true, only handle prerendered routes. Returns false for SSR routes. */
17
+ prerenderOnly?: boolean;
18
+ }
19
+ /**
20
+ * Handle a dev-server request: the HTTP glue that drives the `DevFacadeApp`
21
+ * the way an adapter does — it sits outside the functional core, like the
22
+ * node adapter's `serve-app.ts`. The ModuleLoader and AstroSettings are
23
+ * closed over at composition time in `createAstroServerApp` and passed as
24
+ * `deps`.
25
+ *
26
+ * @returns Whether or not the request was handled by this handler. If the
27
+ * result is not `true`, then the request has not been handled yet and other
28
+ * handlers can be run.
29
+ */
30
+ export declare function handleDevRequest(app: DevFacadeApp, deps: DevRequestDeps, { incomingRequest, incomingResponse, isHttps, prerenderOnly }: DevRequestIO): Promise<boolean>;
@@ -0,0 +1,129 @@
1
+ import { removeTrailingForwardSlash } from "@astrojs/internal-helpers/path";
2
+ import { shouldAppendForwardSlash } from "../core/build/util.js";
3
+ import { clientLocalsSymbol } from "../core/constants.js";
4
+ import { getEnvironment, setEnvironment } from "../core/environment/index.js";
5
+ import { createSafeError } from "../core/errors/index.js";
6
+ import { setLogger } from "../core/logger/manifest-logger.js";
7
+ import { createRequest } from "../core/request.js";
8
+ import { SERIALIZED_MANIFEST_ID } from "../manifest/serialized.js";
9
+ import { recordServerError } from "../vite-plugin-astro-server/error.js";
10
+ import { runWithErrorHandling } from "../vite-plugin-astro-server/index.js";
11
+ import { handle500Response, writeSSRResult } from "../vite-plugin-astro-server/response.js";
12
+ const runnerManifests = /* @__PURE__ */ new WeakMap();
13
+ async function loadFetchHandler(app, loader) {
14
+ try {
15
+ const { manifest } = await loader.import(SERIALIZED_MANIFEST_ID);
16
+ if (manifest && manifest !== runnerManifests.get(loader) && manifest !== app.manifest) {
17
+ setEnvironment(manifest, getEnvironment(app.manifest));
18
+ setLogger(manifest, app.logger);
19
+ runnerManifests.set(loader, manifest);
20
+ }
21
+ } catch {
22
+ }
23
+ try {
24
+ const mod = await loader.import("virtual:astro:fetchable");
25
+ if (mod?.default && !mod.isDefaultFetchHandler) {
26
+ app.setFetchHandler(mod.default);
27
+ }
28
+ } catch {
29
+ }
30
+ }
31
+ async function handleDevRequest(app, deps, { incomingRequest, incomingResponse, isHttps, prerenderOnly }) {
32
+ const { loader, settings, controller } = deps;
33
+ const manifest = app.manifest;
34
+ const protocol = isHttps ? "https" : "http";
35
+ const host = incomingRequest.headers[":authority"] ?? incomingRequest.headers.host;
36
+ const origin = `${protocol}://${host}`;
37
+ const url = new URL(origin + incomingRequest.url);
38
+ let pathname;
39
+ if (manifest.trailingSlash === "never" && !incomingRequest.url) {
40
+ pathname = "";
41
+ } else {
42
+ pathname = decodeURI(url.pathname);
43
+ }
44
+ url.pathname = removeTrailingForwardSlash(manifest.base) + url.pathname;
45
+ if (url.pathname.endsWith("/") && !shouldAppendForwardSlash(manifest.trailingSlash, manifest.buildFormat)) {
46
+ url.pathname = url.pathname.slice(0, -1);
47
+ }
48
+ await loadFetchHandler(app, loader);
49
+ let handled = true;
50
+ await runWithErrorHandling({
51
+ controller,
52
+ pathname,
53
+ async run() {
54
+ const matchedRoute = await app.devMatch(pathname, { prerenderOnly });
55
+ if (!matchedRoute) {
56
+ if (prerenderOnly) {
57
+ handled = false;
58
+ return;
59
+ }
60
+ throw new Error("No route matched, and default 404 route was not found.");
61
+ }
62
+ if (prerenderOnly && !matchedRoute.routeData.prerender) {
63
+ handled = false;
64
+ return;
65
+ }
66
+ let body = void 0;
67
+ if (!(incomingRequest.method === "GET" || incomingRequest.method === "HEAD")) {
68
+ let bytes = [];
69
+ await new Promise((resolve, reject) => {
70
+ incomingRequest.on("data", (part) => {
71
+ bytes.push(part);
72
+ });
73
+ incomingRequest.on("end", resolve);
74
+ incomingRequest.on("error", reject);
75
+ });
76
+ body = Buffer.concat(bytes);
77
+ }
78
+ const abortController = new AbortController();
79
+ const socket = incomingRequest.socket;
80
+ const onSocketClose = () => {
81
+ if (!abortController.signal.aborted) {
82
+ abortController.abort();
83
+ }
84
+ };
85
+ if (socket.destroyed) {
86
+ onSocketClose();
87
+ } else {
88
+ socket.on("close", onSocketClose);
89
+ }
90
+ try {
91
+ const request = createRequest({
92
+ url,
93
+ headers: incomingRequest.headers,
94
+ method: incomingRequest.method,
95
+ body,
96
+ logger: app.logger,
97
+ isPrerendered: matchedRoute.routeData.prerender,
98
+ routePattern: matchedRoute.routeData.component,
99
+ init: { signal: abortController.signal }
100
+ });
101
+ const locals = Reflect.get(incomingRequest, clientLocalsSymbol);
102
+ for (const [name, value] of Object.entries(settings.config.server.headers ?? {})) {
103
+ if (value) incomingResponse.setHeader(name, value);
104
+ }
105
+ const clientAddress = incomingRequest.socket.remoteAddress;
106
+ const response = await app.render(request, {
107
+ locals,
108
+ routeData: matchedRoute.routeData,
109
+ clientAddress
110
+ });
111
+ await writeSSRResult(request, response, incomingResponse);
112
+ } finally {
113
+ socket.off("close", onSocketClose);
114
+ }
115
+ },
116
+ onError(_err) {
117
+ const error = createSafeError(_err);
118
+ if (loader) {
119
+ const { errorWithMetadata } = recordServerError(loader, manifest, app.logger, error);
120
+ handle500Response(loader, incomingResponse, errorWithMetadata);
121
+ }
122
+ return error;
123
+ }
124
+ });
125
+ return handled;
126
+ }
127
+ export {
128
+ handleDevRequest
129
+ };
@@ -1,3 +1,3 @@
1
1
  import type * as vite from 'vite';
2
- export declare const ASTRO_DEV_SERVER_APP_ID = "astro:server-app";
2
+ export declare const ASTRO_DEV_SERVER_APP_ID = "virtual:astro:server-app";
3
3
  export declare function vitePluginApp(): vite.Plugin[];
@@ -1,6 +1,6 @@
1
1
  const ASTRO_APP_ID = "virtual:astro:app";
2
2
  const RESOLVED_ASTRO_APP_ID = "\0" + ASTRO_APP_ID;
3
- const ASTRO_DEV_SERVER_APP_ID = "astro:server-app";
3
+ const ASTRO_DEV_SERVER_APP_ID = "virtual:astro:server-app";
4
4
  function vitePluginApp() {
5
5
  let command;
6
6
  return [
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "astro",
3
- "version": "7.2.2",
3
+ "version": "7.2.3",
4
4
  "description": "Astro is a modern site builder with web best practices, performance, and DX front-of-mind.",
5
5
  "type": "module",
6
6
  "author": "withastro",
@@ -78,6 +78,12 @@
78
78
  "./logger/compose": "./dist/core/logger/impls/compose.js",
79
79
  "./logger/console": "./dist/core/logger/impls/console.js"
80
80
  },
81
+ "imports": {
82
+ "#astro-internal/ambient-manifest": {
83
+ "types": "./src/core/manifest/ambient-source.ts",
84
+ "default": "./dist/core/manifest/ambient-source.js"
85
+ }
86
+ },
81
87
  "bin": {
82
88
  "astro": "./bin/astro.mjs"
83
89
  },
@@ -86,6 +92,7 @@
86
92
  "tsconfigs",
87
93
  "dist",
88
94
  "types",
95
+ "src/core/manifest/ambient-source.ts",
89
96
  "bin",
90
97
  "env.d.ts",
91
98
  "client.d.ts",
@@ -139,22 +146,22 @@
139
146
  "tinyexec": "^1.0.4",
140
147
  "tinyglobby": "^0.2.15",
141
148
  "ultrahtml": "^1.6.0",
142
- "unifont": "~0.7.4",
149
+ "unifont": "~0.7.5",
143
150
  "unstorage": "^1.17.5",
144
151
  "vite": "^8.0.13",
145
152
  "vitefu": "^1.1.2",
146
153
  "xxhash-wasm": "^1.1.0",
147
154
  "yargs-parser": "^22.0.0",
148
155
  "zod": "^4.3.6",
149
- "@astrojs/telemetry": "3.3.3",
150
- "@astrojs/markdown-satteri": "0.3.5",
151
- "@astrojs/internal-helpers": "0.10.2"
156
+ "@astrojs/internal-helpers": "0.10.3",
157
+ "@astrojs/markdown-satteri": "0.3.6",
158
+ "@astrojs/telemetry": "3.3.3"
152
159
  },
153
160
  "optionalDependencies": {
154
161
  "sharp": "^0.34.0 || ^0.35.0"
155
162
  },
156
163
  "peerDependencies": {
157
- "@astrojs/markdown-remark": "7.2.2"
164
+ "@astrojs/markdown-remark": "7.2.3"
158
165
  },
159
166
  "peerDependenciesMeta": {
160
167
  "@astrojs/markdown-remark": {
@@ -186,8 +193,8 @@
186
193
  "typescript": "^6.0.3",
187
194
  "undici": "^7.22.0",
188
195
  "vitest": "^4.1.0",
189
- "@astrojs/markdown-remark": "7.2.2",
190
196
  "@astrojs/check": "0.9.10",
197
+ "@astrojs/markdown-remark": "7.2.3",
191
198
  "astro-scripts": "0.0.14"
192
199
  },
193
200
  "engines": {
@@ -0,0 +1,37 @@
1
+ # `core/`
2
+
3
+ Code that executes directly on Node (not processed by vite). Contains the main Astro logic for the `build`, `dev`, `preview`, and `sync` commands, and also manages the lifecycle of the Vite server.
4
+
5
+ The `core/index.ts` module exports the CLI commands as functions and is the main entrypoint of the `astro` package.
6
+
7
+ ```ts
8
+ import { dev, build, preview, sync } from 'astro';
9
+ ```
10
+
11
+ [See CONTRIBUTING.md](../../../../CONTRIBUTING.md) for a code overview.
12
+
13
+ ## Request handling: the functional core
14
+
15
+ Server-side request handling is a **purely functional core** keyed off the
16
+ `SSRManifest` — the one allowed ambient source of truth, exposed to bundled
17
+ code as the `virtual:astro:manifest` virtual module. There are no stateful
18
+ app/pipeline god objects: behavior lives in plain functions that read static
19
+ data from the manifest plus per-request state.
20
+
21
+ - **Owning modules** hold per-manifest derived/mutable state in WeakMaps and
22
+ expose accessors: `routing/route-table.ts` (`getRouteTable`, `matchRoute`,
23
+ `updateRouteTable`), `middleware/load.ts`, `../actions/load.ts`,
24
+ `session/driver.ts`, `cache/provider.ts`, `render/route-cache.ts`,
25
+ `routing/default.ts`, `logger/manifest-logger.ts`, `fetch/features.ts`,
26
+ `manifest/ambient.ts`.
27
+ - **`environment/`** expresses what genuinely varies between rendering
28
+ environments (production SSR, the two dev paths, build/prerender, the
29
+ container) as a stateless `RenderEnvironment` record registered per manifest
30
+ via `setEnvironment`; production is the unregistered default.
31
+ - **`fetch/`** owns the per-request `FetchState` (constructible from a bare
32
+ `Request`, resolving the ambient manifest) and the handler functions
33
+ (`handleRequest` and the middleware/pages/error stages) that drive a request
34
+ through the chain.
35
+ - **Facades**: `App` (`core/app/`) and `NodeApp` (`core/app/node.ts`) survive
36
+ as thin public compatibility shells — every method delegates to the
37
+ functional core.
@@ -0,0 +1,9 @@
1
+ import type { SSRManifest } from '../app/types.js';
2
+
3
+ // This module is the NON-VITE fallback for the '#astro-internal/ambient-manifest'
4
+ // specifier (mapped here by the package.json `imports` field). In every
5
+ // Vite-processed server environment the serialized-manifest plugin resolves that
6
+ // specifier to `virtual:astro:manifest` instead, so this file is never loaded
7
+ // there. In plain Node (unit tests, embedders) the ambient manifest is simply
8
+ // absent until `setAmbientManifest()` registers one.
9
+ export const manifest: SSRManifest | undefined = undefined;
@@ -0,0 +1,5 @@
1
+ # `types/`
2
+
3
+ In this folder rest the types that are used throughout Astro. Typically folders for corresponding features will have a corresponding `types.ts` file in their folder. For example, the `src/assets/types.ts` contain the types for `astro:assets`. However this folder can be useful for types that are used across multiple features, or generally don't fit in any other folder.
4
+
5
+ This folder additionally contain a `public` folder, which contains types that are exposed to users one way or another. Remember that these types are part of the public API, and as such follow the same semver contract as the rest of Astro.
@@ -1,14 +0,0 @@
1
- import { type HeadElements, Pipeline, type TryRewriteResult } from '../core/base-pipeline.js';
2
- import type { ComponentInstance } from '../types/astro.js';
3
- import type { RewritePayload } from '../types/public/common.js';
4
- import type { RouteData, SSRResult } from '../types/public/internal.js';
5
- export declare class ContainerPipeline extends Pipeline {
6
- #private;
7
- getName(): string;
8
- static create({ logger, manifest, renderers, resolve, streaming, }: Pick<ContainerPipeline, 'logger' | 'manifest' | 'renderers' | 'resolve' | 'streaming'>): ContainerPipeline;
9
- componentMetadata(_routeData: RouteData): Promise<SSRResult['componentMetadata']> | void;
10
- headElements(routeData: RouteData): Promise<HeadElements> | HeadElements;
11
- tryRewrite(payload: RewritePayload, request: Request): Promise<TryRewriteResult>;
12
- insertRoute(route: RouteData, componentInstance: ComponentInstance): void;
13
- getComponentByRoute(routeData: RouteData): Promise<ComponentInstance>;
14
- }