astro 6.1.10 → 6.2.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.
Files changed (127) hide show
  1. package/client.d.ts +1 -0
  2. package/dist/actions/runtime/types.d.ts +1 -1
  3. package/dist/assets/fonts/constants.d.ts +2 -0
  4. package/dist/assets/fonts/constants.js +4 -0
  5. package/dist/assets/fonts/core/create-get-font-file-url.d.ts +2 -0
  6. package/dist/assets/fonts/core/create-get-font-file-url.js +23 -0
  7. package/dist/assets/fonts/core/font-file-middleware.d.ts +21 -0
  8. package/dist/assets/fonts/core/font-file-middleware.js +59 -0
  9. package/dist/assets/fonts/definitions.d.ts +13 -0
  10. package/dist/assets/fonts/infra/build-url-resolver.d.ts +1 -0
  11. package/dist/assets/fonts/infra/build-url-resolver.js +7 -1
  12. package/dist/assets/fonts/infra/dev-url-resolver.d.ts +1 -0
  13. package/dist/assets/fonts/infra/dev-url-resolver.js +7 -1
  14. package/dist/assets/fonts/infra/remote-runtime-font-file-url-resolver.d.ts +19 -0
  15. package/dist/assets/fonts/infra/remote-runtime-font-file-url-resolver.js +27 -0
  16. package/dist/assets/fonts/infra/ssr-runtime-font-file-url-resolver.d.ts +12 -0
  17. package/dist/assets/fonts/infra/ssr-runtime-font-file-url-resolver.js +25 -0
  18. package/dist/assets/fonts/runtime.d.ts +1 -0
  19. package/dist/assets/fonts/runtime.js +4 -0
  20. package/dist/assets/fonts/vite-plugin-fonts.js +88 -49
  21. package/dist/assets/index.d.ts +1 -1
  22. package/dist/assets/index.js +3 -2
  23. package/dist/assets/svg/config.d.ts +5 -0
  24. package/dist/assets/svg/config.js +8 -0
  25. package/dist/assets/svg/svgo.d.ts +4 -0
  26. package/dist/assets/svg/svgo.js +10 -0
  27. package/dist/assets/svg/types.d.ts +4 -0
  28. package/dist/assets/svg/types.js +0 -0
  29. package/dist/assets/svg/utils.d.ts +3 -0
  30. package/dist/assets/{utils/svg.js → svg/utils.js} +11 -14
  31. package/dist/assets/vite-plugin-assets.js +8 -4
  32. package/dist/cli/flags.js +19 -9
  33. package/dist/cli/help/index.js +2 -1
  34. package/dist/cli/infra/build-time-astro-version-provider.js +1 -1
  35. package/dist/cli/preferences/index.js +3 -2
  36. package/dist/config/entrypoint.d.ts +2 -0
  37. package/dist/config/entrypoint.js +4 -0
  38. package/dist/config/index.js +9 -7
  39. package/dist/container/index.js +4 -7
  40. package/dist/content/content-layer.js +3 -3
  41. package/dist/core/app/base.d.ts +18 -4
  42. package/dist/core/app/base.js +29 -12
  43. package/dist/core/app/dev/app.d.ts +0 -1
  44. package/dist/core/app/dev/app.js +0 -2
  45. package/dist/core/app/entrypoints/index.d.ts +1 -1
  46. package/dist/core/app/entrypoints/index.js +1 -1
  47. package/dist/core/app/entrypoints/virtual/dev.js +1 -1
  48. package/dist/core/app/pipeline.js +2 -2
  49. package/dist/core/app/types.d.ts +10 -3
  50. package/dist/core/base-pipeline.d.ts +9 -2
  51. package/dist/core/base-pipeline.js +17 -0
  52. package/dist/core/build/app.js +2 -1
  53. package/dist/core/build/index.js +13 -2
  54. package/dist/core/build/internal.d.ts +1 -0
  55. package/dist/core/build/internal.js +1 -0
  56. package/dist/core/build/pipeline.js +1 -1
  57. package/dist/core/build/plugins/plugin-manifest.js +6 -1
  58. package/dist/core/cache/types.d.ts +2 -0
  59. package/dist/core/config/schemas/base.d.ts +12 -4
  60. package/dist/core/config/schemas/base.js +11 -4
  61. package/dist/core/config/schemas/relative.d.ts +27 -6
  62. package/dist/core/config/schemas/relative.js +1 -1
  63. package/dist/core/config/settings.js +2 -1
  64. package/dist/core/config/vite-load.js +4 -17
  65. package/dist/core/constants.js +1 -1
  66. package/dist/core/createMinimalViteDevServer.d.ts +8 -0
  67. package/dist/core/createMinimalViteDevServer.js +15 -0
  68. package/dist/core/dev/dev.js +1 -1
  69. package/dist/core/dev/restart.js +2 -2
  70. package/dist/core/errors/errors-data.d.ts +48 -2
  71. package/dist/core/errors/errors-data.js +26 -2
  72. package/dist/core/logger/config.d.ts +6 -0
  73. package/dist/core/logger/config.js +0 -0
  74. package/dist/core/logger/core.d.ts +33 -13
  75. package/dist/core/logger/core.js +50 -5
  76. package/dist/core/logger/handlers.d.ts +60 -0
  77. package/dist/core/logger/handlers.js +81 -0
  78. package/dist/core/logger/impls/compose.d.ts +2 -0
  79. package/dist/core/logger/impls/compose.js +26 -0
  80. package/dist/core/logger/impls/console.d.ts +9 -0
  81. package/dist/core/logger/impls/console.js +38 -0
  82. package/dist/core/logger/impls/json.d.ts +15 -0
  83. package/dist/core/logger/impls/json.js +42 -0
  84. package/dist/core/logger/impls/node.d.ts +7 -0
  85. package/dist/core/logger/impls/node.js +40 -0
  86. package/dist/core/logger/load.d.ts +11 -0
  87. package/dist/core/logger/load.js +88 -0
  88. package/dist/core/logger/node.d.ts +0 -5
  89. package/dist/core/logger/node.js +1 -39
  90. package/dist/core/logger/public.d.ts +17 -0
  91. package/dist/core/logger/public.js +7 -0
  92. package/dist/core/messages/runtime.js +1 -1
  93. package/dist/core/middleware/index.js +2 -1
  94. package/dist/core/preview/index.js +4 -3
  95. package/dist/core/render-context.js +35 -1
  96. package/dist/core/sync/index.js +2 -2
  97. package/dist/core/wait-until.d.ts +1 -0
  98. package/dist/core/wait-until.js +0 -0
  99. package/dist/manifest/serialized.js +6 -1
  100. package/dist/runtime/compiler/index.d.ts +1 -1
  101. package/dist/runtime/compiler/index.js +4 -0
  102. package/dist/runtime/server/astro-global.js +3 -0
  103. package/dist/runtime/server/index.d.ts +1 -0
  104. package/dist/runtime/server/index.js +3 -0
  105. package/dist/runtime/server/render/common.js +16 -0
  106. package/dist/runtime/server/render/instruction.d.ts +7 -1
  107. package/dist/runtime/server/render/template-depth.d.ts +13 -0
  108. package/dist/runtime/server/render/template-depth.js +11 -0
  109. package/dist/types/astro.d.ts +2 -0
  110. package/dist/types/public/common.d.ts +1 -0
  111. package/dist/types/public/config.d.ts +54 -42
  112. package/dist/types/public/context.d.ts +17 -0
  113. package/dist/types/public/index.d.ts +1 -0
  114. package/dist/types/public/internal.d.ts +7 -1
  115. package/dist/types/public/preview.d.ts +5 -0
  116. package/dist/vite-plugin-app/app.d.ts +0 -1
  117. package/dist/vite-plugin-app/app.js +0 -2
  118. package/dist/vite-plugin-app/createAstroServerApp.d.ts +1 -1
  119. package/dist/vite-plugin-app/createAstroServerApp.js +2 -6
  120. package/dist/vite-plugin-load-fallback/index.d.ts +1 -1
  121. package/dist/vite-plugin-load-fallback/index.js +2 -5
  122. package/package.json +12 -7
  123. package/dist/assets/utils/svg.d.ts +0 -3
  124. package/dist/core/app/logging.d.ts +0 -3
  125. package/dist/core/app/logging.js +0 -11
  126. package/dist/core/logger/console.d.ts +0 -2
  127. package/dist/core/logger/console.js +0 -21
@@ -1,23 +1,20 @@
1
- import { optimize } from "svgo";
2
1
  import { ELEMENT_NODE, TEXT_NODE, parse, renderSync } from "ultrahtml";
3
2
  import { AstroError, AstroErrorData } from "../../core/errors/index.js";
4
3
  import { dropAttributes } from "../runtime.js";
5
- function parseSvg({
4
+ async function parseSvg({
6
5
  path,
7
6
  contents,
8
- svgoConfig
7
+ svgOptimizer
9
8
  }) {
10
9
  let processedContents = contents;
11
- if (svgoConfig) {
10
+ if (svgOptimizer) {
12
11
  try {
13
- const config = typeof svgoConfig === "boolean" ? void 0 : svgoConfig;
14
- const result = optimize(contents, config);
15
- processedContents = result.data;
12
+ processedContents = await svgOptimizer.optimize(contents);
16
13
  } catch (cause) {
17
14
  throw new AstroError(
18
15
  {
19
16
  ...AstroErrorData.CannotOptimizeSvg,
20
- message: AstroErrorData.CannotOptimizeSvg.message(path)
17
+ message: AstroErrorData.CannotOptimizeSvg.message(path, svgOptimizer.name)
21
18
  },
22
19
  { cause }
23
20
  );
@@ -43,16 +40,16 @@ function parseSvg({
43
40
  }
44
41
  return { attributes, body, styles };
45
42
  }
46
- function makeSvgComponent(meta, contents, svgoConfig) {
43
+ async function makeSvgComponent(meta, contents, svgOptimizer) {
47
44
  const file = typeof contents === "string" ? contents : contents.toString("utf-8");
48
45
  const {
49
46
  attributes,
50
47
  body: children,
51
48
  styles
52
- } = parseSvg({
49
+ } = await parseSvg({
53
50
  path: meta.fsPath,
54
51
  contents: file,
55
- svgoConfig
52
+ svgOptimizer
56
53
  });
57
54
  const props = {
58
55
  meta,
@@ -63,16 +60,16 @@ function makeSvgComponent(meta, contents, svgoConfig) {
63
60
  return `import { createSvgComponent } from 'astro/assets/runtime';
64
61
  export default createSvgComponent(${JSON.stringify(props)})`;
65
62
  }
66
- function parseSvgComponentData(meta, contents, svgoConfig) {
63
+ async function parseSvgComponentData(meta, contents, svgOptimizer) {
67
64
  const file = typeof contents === "string" ? contents : contents.toString("utf-8");
68
65
  const {
69
66
  attributes,
70
67
  body: children,
71
68
  styles
72
- } = parseSvg({
69
+ } = await parseSvg({
73
70
  path: meta.fsPath,
74
71
  contents: file,
75
- svgoConfig
72
+ svgOptimizer
76
73
  });
77
74
  return { attributes: dropAttributes(attributes), children, styles };
78
75
  }
@@ -31,7 +31,7 @@ import { hashTransform, propsToFilename } from "./utils/hash.js";
31
31
  import { emitImageMetadata } from "./utils/node.js";
32
32
  import { CONTENT_IMAGE_FLAG } from "../content/consts.js";
33
33
  import { getProxyCode } from "./utils/proxy.js";
34
- import { makeSvgComponent, parseSvgComponentData } from "./utils/svg.js";
34
+ import { makeSvgComponent, parseSvgComponentData } from "./svg/utils.js";
35
35
  import { createPlaceholderURL, stringifyPlaceholderURL } from "./utils/url.js";
36
36
  const assetRegex = new RegExp(`\\.(${VALID_INPUT_FORMATS.join("|")})`, "i");
37
37
  const assetRegexEnds = new RegExp(`\\.(${VALID_INPUT_FORMATS.join("|")})$`, "i");
@@ -283,7 +283,11 @@ function assets({ fs, settings, sync, logger }) {
283
283
  encoding: "utf8"
284
284
  });
285
285
  return {
286
- code: makeSvgComponent(imageMetadata, contents, settings.config.experimental.svgo)
286
+ code: await makeSvgComponent(
287
+ imageMetadata,
288
+ contents,
289
+ settings.config.experimental.svgOptimizer
290
+ )
287
291
  };
288
292
  }
289
293
  const isSSROnlyEnvironment = settings.buildOutput === "server" && this.environment.name === ASTRO_VITE_ENVIRONMENT_NAMES.ssr;
@@ -294,10 +298,10 @@ function assets({ fs, settings, sync, logger }) {
294
298
  const contents = await fs.promises.readFile(imageMetadata.fsPath, {
295
299
  encoding: "utf8"
296
300
  });
297
- const svgData = parseSvgComponentData(
301
+ const svgData = await parseSvgComponentData(
298
302
  imageMetadata,
299
303
  contents,
300
- settings.config.experimental.svgo
304
+ settings.config.experimental.svgOptimizer
301
305
  );
302
306
  const metadataWithSvg = { ...imageMetadata, __svgData: svgData };
303
307
  return {
package/dist/cli/flags.js CHANGED
@@ -1,6 +1,7 @@
1
- import { createNodeLogger, nodeLogDestination } from "../core/logger/node.js";
1
+ import { createNodeLoggerFromFlags } from "../core/logger/impls/node.js";
2
+ import { createJsonLoggerFromFlags } from "../core/logger/impls/json.js";
2
3
  function flagsToAstroInlineConfig(flags) {
3
- return {
4
+ const inlineConfig = {
4
5
  // Inline-only configs
5
6
  configFile: typeof flags.config === "string" ? flags.config : void 0,
6
7
  mode: typeof flags.mode === "string" ? flags.mode : void 0,
@@ -18,18 +19,27 @@ function flagsToAstroInlineConfig(flags) {
18
19
  allowedHosts: typeof flags.allowedHosts === "string" ? flags.allowedHosts.split(",") : typeof flags.allowedHosts === "boolean" && flags.allowedHosts === true ? flags.allowedHosts : []
19
20
  }
20
21
  };
22
+ if (flags.experimentalJson) {
23
+ inlineConfig.experimental = {
24
+ logger: {
25
+ entrypoint: "astro/logger/json"
26
+ }
27
+ };
28
+ }
29
+ return inlineConfig;
21
30
  }
22
31
  function createLoggerFromFlags(flags) {
23
- const logging = {
24
- destination: nodeLogDestination,
25
- level: "info"
26
- };
32
+ let logLevel = flags.level;
27
33
  if (flags.verbose) {
28
- logging.level = "debug";
34
+ logLevel = "debug";
29
35
  } else if (flags.silent) {
30
- logging.level = "silent";
36
+ logLevel = "silent";
37
+ }
38
+ if (flags.experimentalJson) {
39
+ return createJsonLoggerFromFlags({ logLevel });
40
+ } else {
41
+ return createNodeLoggerFromFlags({ logLevel });
31
42
  }
32
- return createNodeLogger({ logLevel: logging.level });
33
43
  }
34
44
  export {
35
45
  createLoggerFromFlags,
@@ -25,7 +25,8 @@ const DEFAULT_HELP_PAYLOAD = {
25
25
  ["--verbose", "Enable verbose logging."],
26
26
  ["--silent", "Disable all logging."],
27
27
  ["--version", "Show the version number and exit."],
28
- ["--help", "Show this help message."]
28
+ ["--help", "Show this help message."],
29
+ ["--experimental-json", "Enables JSON logging."]
29
30
  ]
30
31
  }
31
32
  };
@@ -1,6 +1,6 @@
1
1
  class BuildTimeAstroVersionProvider {
2
2
  // Injected during the build through esbuild define
3
- version = "6.1.10";
3
+ version = "6.2.0";
4
4
  }
5
5
  export {
6
6
  BuildTimeAstroVersionProvider
@@ -9,7 +9,8 @@ import * as msg from "../../core/messages/runtime.js";
9
9
  import { DEFAULT_PREFERENCES } from "../../preferences/defaults.js";
10
10
  import dlv from "../../preferences/dlv.js";
11
11
  import { coerce, isValidKey } from "../../preferences/index.js";
12
- import { createLoggerFromFlags, flagsToAstroInlineConfig } from "../flags.js";
12
+ import { flagsToAstroInlineConfig } from "../flags.js";
13
+ import { loadOrCreateNodeLogger } from "../../core/logger/load.js";
13
14
  const { bgGreen, black, bold, dim, yellow } = colors;
14
15
  const PREFERENCES_SUBCOMMANDS = [
15
16
  "get",
@@ -49,8 +50,8 @@ async function preferences(subcommand, key, value, { flags }) {
49
50
  return 0;
50
51
  }
51
52
  const inlineConfig = flagsToAstroInlineConfig(flags);
52
- const logger = createLoggerFromFlags(flags);
53
53
  const { astroConfig } = await resolveConfig(inlineConfig ?? {}, "dev");
54
+ const logger = await loadOrCreateNodeLogger(astroConfig, inlineConfig ?? {});
54
55
  const settings = await createSettings(
55
56
  astroConfig,
56
57
  inlineConfig.logLevel,
@@ -8,6 +8,8 @@ export { validateConfig } from '../core/config/validate.js';
8
8
  export { envField } from '../env/config.js';
9
9
  export { defineConfig, getViteConfig } from './index.js';
10
10
  export { sessionDrivers } from '../core/session/drivers.js';
11
+ export { svgoOptimizer } from '../assets/svg/svgo.js';
12
+ export { logHandlers } from '../core/logger/handlers.js';
11
13
  /**
12
14
  * Return the configuration needed to use the Sharp-based image service
13
15
  */
@@ -4,6 +4,8 @@ import { validateConfig } from "../core/config/validate.js";
4
4
  import { envField } from "../env/config.js";
5
5
  import { defineConfig, getViteConfig } from "./index.js";
6
6
  import { sessionDrivers } from "../core/session/drivers.js";
7
+ import { svgoOptimizer } from "../assets/svg/svgo.js";
8
+ import { logHandlers } from "../core/logger/handlers.js";
7
9
  function sharpImageService(config = {}) {
8
10
  return {
9
11
  entrypoint: "astro/assets/services/sharp",
@@ -28,10 +30,12 @@ export {
28
30
  envField,
29
31
  fontProviders,
30
32
  getViteConfig,
33
+ logHandlers,
31
34
  memoryCache,
32
35
  mergeConfig,
33
36
  passthroughImageService,
34
37
  sessionDrivers,
35
38
  sharpImageService,
39
+ svgoOptimizer,
36
40
  validateConfig
37
41
  };
@@ -1,5 +1,3 @@
1
- import { createRoutesList } from "../core/routing/create-manifest.js";
2
- import { getPrerenderDefault } from "../prerender/utils.js";
3
1
  function defineConfig(config) {
4
2
  return config;
5
3
  }
@@ -8,19 +6,23 @@ function getViteConfig(userViteConfig, inlineAstroConfig = {}) {
8
6
  const cmd = command === "serve" ? "dev" : "build";
9
7
  const [
10
8
  { mergeConfig },
11
- { createNodeLogger },
9
+ { loadOrCreateNodeLogger },
12
10
  { resolveConfig, createSettings },
13
11
  { createVite },
14
- { runHookConfigSetup, runHookConfigDone }
12
+ { runHookConfigSetup, runHookConfigDone },
13
+ { createRoutesList },
14
+ { getPrerenderDefault }
15
15
  ] = await Promise.all([
16
16
  import("vite"),
17
- import("../core/logger/node.js"),
17
+ import("../core/logger/load.js"),
18
18
  import("../core/config/index.js"),
19
19
  import("../core/create-vite.js"),
20
- import("../integrations/hooks.js")
20
+ import("../integrations/hooks.js"),
21
+ import("../core/routing/create-manifest.js"),
22
+ import("../prerender/utils.js")
21
23
  ]);
22
- const logger = createNodeLogger(inlineAstroConfig);
23
24
  const { astroConfig: config } = await resolveConfig(inlineAstroConfig, cmd);
25
+ const logger = await loadOrCreateNodeLogger(config, inlineAstroConfig);
24
26
  let settings = await createSettings(config, inlineAstroConfig.logLevel, userViteConfig.root);
25
27
  settings = await runHookConfigSetup({ settings, command: cmd, logger });
26
28
  const routesList = await createRoutesList(
@@ -3,8 +3,6 @@ import { getDefaultClientDirectives } from "../core/client-directive/index.js";
3
3
  import { ASTRO_CONFIG_DEFAULTS } from "../core/config/schemas/index.js";
4
4
  import { validateConfig } from "../core/config/validate.js";
5
5
  import { createKey } from "../core/encryption.js";
6
- import { AstroLogger } from "../core/logger/core.js";
7
- import { nodeLogDestination } from "../core/logger/node.js";
8
6
  import { NOOP_MIDDLEWARE_FN } from "../core/middleware/noop-middleware.js";
9
7
  import { removeLeadingForwardSlash } from "../core/path.js";
10
8
  import { RenderContext } from "../core/render-context.js";
@@ -13,6 +11,7 @@ import { getPattern } from "../core/routing/pattern.js";
13
11
  import { validateSegment } from "../core/routing/segment.js";
14
12
  import { SlotString } from "../runtime/server/render/slot.js";
15
13
  import { ContainerPipeline } from "./pipeline.js";
14
+ import { createConsoleLogger } from "../core/logger/impls/console.js";
16
15
  function createManifest(manifest, renderers, middleware) {
17
16
  function middlewareInstance() {
18
17
  return {
@@ -64,7 +63,8 @@ function createManifest(manifest, renderers, middleware) {
64
63
  logLevel: "silent",
65
64
  experimentalQueuedRendering: manifest?.experimentalQueuedRendering ?? {
66
65
  enabled: false
67
- }
66
+ },
67
+ experimentalLogger: manifest?.experimentalLogger ?? void 0
68
68
  };
69
69
  }
70
70
  class experimental_AstroContainer {
@@ -82,10 +82,7 @@ class experimental_AstroContainer {
82
82
  astroConfig
83
83
  }) {
84
84
  this.#pipeline = ContainerPipeline.create({
85
- logger: new AstroLogger({
86
- level: "info",
87
- destination: nodeLogDestination
88
- }),
85
+ logger: createConsoleLogger({ level: "error" }),
89
86
  manifest: createManifest(manifest, renderers),
90
87
  streaming,
91
88
  renderers: renderers ?? manifest?.renderers ?? [],
@@ -192,7 +192,7 @@ ${contentConfig.error.message}`
192
192
  logger.info("Content config changed");
193
193
  shouldClear = true;
194
194
  }
195
- if (previousAstroVersion && previousAstroVersion !== "6.1.10") {
195
+ if (previousAstroVersion && previousAstroVersion !== "6.2.0") {
196
196
  logger.info("Astro version changed");
197
197
  shouldClear = true;
198
198
  }
@@ -200,8 +200,8 @@ ${contentConfig.error.message}`
200
200
  logger.info("Clearing content store");
201
201
  this.#store.clearAll();
202
202
  }
203
- if ("6.1.10") {
204
- this.#store.metaStore().set("astro-version", "6.1.10");
203
+ if ("6.2.0") {
204
+ this.#store.metaStore().set("astro-version", "6.2.0");
205
205
  }
206
206
  if (currentConfigDigest) {
207
207
  this.#store.metaStore().set("content-config-digest", currentConfigDigest);
@@ -2,8 +2,9 @@ import type { RoutesList } from '../../types/astro.js';
2
2
  import type { RemotePattern, RouteData } from '../../types/public/index.js';
3
3
  import type { Pipeline } from '../base-pipeline.js';
4
4
  import { getSetCookiesFromResponse } from '../cookies/index.js';
5
- import { AstroIntegrationLogger, AstroLogger } from '../logger/core.js';
5
+ import { AstroIntegrationLogger, type AstroLogger } from '../logger/core.js';
6
6
  import { type CreateRenderContext, RenderContext } from '../render-context.js';
7
+ import type { WaitUntilHook } from '../wait-until.js';
7
8
  import type { AppPipeline } from './pipeline.js';
8
9
  import type { SSRManifest } from './types.js';
9
10
  export interface DevMatch {
@@ -44,6 +45,13 @@ export interface RenderOptions {
44
45
  * @returns {Promise<Response>} A promise resolving to the prerendered response.
45
46
  */
46
47
  prerenderedErrorPageFetch?: (url: ErrorPagePath) => Promise<Response>;
48
+ /**
49
+ * Optional platform hook to keep background work alive after the response is sent.
50
+ *
51
+ * Adapters can pass this through so runtime cache providers can schedule cache writes
52
+ * without blocking the response path.
53
+ */
54
+ waitUntil?: WaitUntilHook;
47
55
  /**
48
56
  * **Advanced API**: you probably do not need to use this.
49
57
  *
@@ -58,6 +66,7 @@ interface ResolvedRenderOptions {
58
66
  prerenderedErrorPageFetch: RequiredRenderOptions['prerenderedErrorPageFetch'] | undefined;
59
67
  locals: RequiredRenderOptions['locals'] | undefined;
60
68
  routeData: RequiredRenderOptions['routeData'] | undefined;
69
+ waitUntil: RequiredRenderOptions['waitUntil'] | undefined;
61
70
  }
62
71
  export interface RenderErrorOptions extends ResolvedRenderOptions {
63
72
  response?: Response;
@@ -77,13 +86,18 @@ export declare abstract class BaseApp<P extends Pipeline = AppPipeline> {
77
86
  manifest: SSRManifest;
78
87
  manifestData: RoutesList;
79
88
  pipeline: P;
80
- adapterLogger: AstroIntegrationLogger;
81
89
  baseWithoutTrailingSlash: string;
82
- logger: AstroLogger;
90
+ get logger(): AstroLogger;
91
+ get adapterLogger(): AstroIntegrationLogger;
83
92
  constructor(manifest: SSRManifest, streaming?: boolean, ...args: any[]);
84
93
  abstract isDev(): boolean;
85
94
  createRenderContext(payload: CreateRenderContext): Promise<RenderContext>;
86
95
  getAdapterLogger(): AstroIntegrationLogger;
96
+ /**
97
+ * Resets the cached adapter logger so it picks up a new logger instance.
98
+ * Used by BuildApp when the logger is replaced via setOptions().
99
+ */
100
+ protected resetAdapterLogger(): void;
87
101
  getAllowedDomains(): Partial<RemotePattern>[] | undefined;
88
102
  protected matchesAllowedDomains(forwardedHost: string, protocol?: string): boolean;
89
103
  static validateForwardedHost(forwardedHost: string, allowedDomains?: Partial<RemotePattern>[], protocol?: string): boolean;
@@ -124,7 +138,7 @@ export declare abstract class BaseApp<P extends Pipeline = AppPipeline> {
124
138
  devMatch(pathname?: string): Promise<DevMatch | undefined> | undefined;
125
139
  private computePathnameFromDomain;
126
140
  private redirectTrailingSlash;
127
- render(request: Request, { addCookieHeader, clientAddress, locals, prerenderedErrorPageFetch, routeData, }?: RenderOptions): Promise<Response>;
141
+ render(request: Request, { addCookieHeader, clientAddress, locals, prerenderedErrorPageFetch, routeData, waitUntil, }?: RenderOptions): Promise<Response>;
128
142
  setCookieHeaders(response: Response): Generator<string, string[], any>;
129
143
  /**
130
144
  * Reads all the cookies written by `Astro.cookie.set()` onto the passed response.
@@ -27,8 +27,7 @@ import {
27
27
  } from "../cookies/index.js";
28
28
  import { getCookiesFromResponse } from "../cookies/response.js";
29
29
  import { AstroError, AstroErrorData } from "../errors/index.js";
30
- import { consoleLogDestination } from "../logger/console.js";
31
- import { AstroIntegrationLogger, AstroLogger } from "../logger/core.js";
30
+ import { AstroIntegrationLogger } from "../logger/core.js";
32
31
  import { RenderContext } from "../render-context.js";
33
32
  import { redirectTemplate } from "../routing/3xx.js";
34
33
  import { ensure404Route } from "../routing/astro-designed-error-pages.js";
@@ -41,20 +40,26 @@ class BaseApp {
41
40
  manifest;
42
41
  manifestData;
43
42
  pipeline;
44
- adapterLogger;
43
+ #adapterLogger;
45
44
  baseWithoutTrailingSlash;
46
- logger;
47
45
  #router;
46
+ get logger() {
47
+ return this.pipeline.logger;
48
+ }
49
+ get adapterLogger() {
50
+ if (!this.#adapterLogger) {
51
+ this.#adapterLogger = new AstroIntegrationLogger(
52
+ this.logger.options,
53
+ this.manifest.adapterName
54
+ );
55
+ }
56
+ return this.#adapterLogger;
57
+ }
48
58
  constructor(manifest, streaming = true, ...args) {
49
59
  this.manifest = manifest;
50
60
  this.manifestData = { routes: manifest.routes.map((route) => route.routeData) };
51
61
  this.baseWithoutTrailingSlash = removeTrailingForwardSlash(manifest.base);
52
62
  this.pipeline = this.createPipeline(streaming, manifest, ...args);
53
- this.logger = new AstroLogger({
54
- destination: consoleLogDestination,
55
- level: manifest.logLevel
56
- });
57
- this.adapterLogger = new AstroIntegrationLogger(this.logger.options, manifest.adapterName);
58
63
  ensure404Route(this.manifestData);
59
64
  this.#router = this.createRouter(this.manifestData);
60
65
  }
@@ -64,6 +69,13 @@ class BaseApp {
64
69
  getAdapterLogger() {
65
70
  return this.adapterLogger;
66
71
  }
72
+ /**
73
+ * Resets the cached adapter logger so it picks up a new logger instance.
74
+ * Used by BuildApp when the logger is replaced via setOptions().
75
+ */
76
+ resetAdapterLogger() {
77
+ this.#adapterLogger = void 0;
78
+ }
67
79
  getAllowedDomains() {
68
80
  return this.manifest.allowedDomains;
69
81
  }
@@ -228,8 +240,10 @@ class BaseApp {
228
240
  clientAddress = Reflect.get(request, clientAddressSymbol),
229
241
  locals,
230
242
  prerenderedErrorPageFetch = fetch,
231
- routeData
243
+ routeData,
244
+ waitUntil
232
245
  } = {}) {
246
+ await this.pipeline.getLogger();
233
247
  const timeStart = performance.now();
234
248
  const url = new URL(request.url);
235
249
  const redirect = this.redirectTrailingSlash(url.pathname);
@@ -266,7 +280,8 @@ class BaseApp {
266
280
  clientAddress,
267
281
  prerenderedErrorPageFetch,
268
282
  locals,
269
- routeData
283
+ routeData,
284
+ waitUntil
270
285
  };
271
286
  if (locals) {
272
287
  if (typeof locals !== "object") {
@@ -334,7 +349,8 @@ class BaseApp {
334
349
  response = await cacheProvider.onRequest(
335
350
  {
336
351
  request,
337
- url: new URL(request.url)
352
+ url: new URL(request.url),
353
+ waitUntil: resolvedRenderOptions.waitUntil
338
354
  },
339
355
  async () => {
340
356
  const res = await renderContext.render(componentInstance);
@@ -400,6 +416,7 @@ class BaseApp {
400
416
  response.headers.append("set-cookie", setCookieHeaderValue);
401
417
  }
402
418
  }
419
+ this.logger.flush();
403
420
  Reflect.set(response, responseSentSymbol, true);
404
421
  }
405
422
  setCookieHeaders(response) {
@@ -5,7 +5,6 @@ import type { SSRManifest } from '../types.js';
5
5
  import { NonRunnablePipeline } from './pipeline.js';
6
6
  import type { RoutesList } from '../../../types/astro.js';
7
7
  export declare class DevApp extends BaseApp<NonRunnablePipeline> {
8
- logger: AstroLogger;
9
8
  constructor(manifest: SSRManifest, streaming: boolean | undefined, logger: AstroLogger);
10
9
  createPipeline(streaming: boolean, manifest: SSRManifest, logger: AstroLogger): NonRunnablePipeline;
11
10
  isDev(): boolean;
@@ -9,10 +9,8 @@ import { ensure404Route } from "../../routing/astro-designed-error-pages.js";
9
9
  import { matchRoute } from "../../routing/dev.js";
10
10
  import { req } from "../../messages/runtime.js";
11
11
  class DevApp extends BaseApp {
12
- logger;
13
12
  constructor(manifest, streaming = true, logger) {
14
13
  super(manifest, streaming, logger);
15
- this.logger = logger;
16
14
  }
17
15
  createPipeline(streaming, manifest, logger) {
18
16
  return NonRunnablePipeline.create({
@@ -2,6 +2,6 @@ export type { RoutesList } from '../../../types/astro.js';
2
2
  export { App } from '../app.js';
3
3
  export { BaseApp, type RenderErrorOptions, type RenderOptions, type LogRequestPayload, } from '../base.js';
4
4
  export { fromRoutingStrategy, toRoutingStrategy } from '../common.js';
5
- export { createConsoleLogger } from '../logging.js';
5
+ export { createConsoleLogger } from '../../logger/impls/console.js';
6
6
  export { deserializeManifest, deserializeRouteData, deserializeRouteInfo, serializeRouteData, serializeRouteInfo, } from '../manifest.js';
7
7
  export { AppPipeline } from '../pipeline.js';
@@ -3,7 +3,7 @@ import {
3
3
  BaseApp
4
4
  } from "../base.js";
5
5
  import { fromRoutingStrategy, toRoutingStrategy } from "../common.js";
6
- import { createConsoleLogger } from "../logging.js";
6
+ import { createConsoleLogger } from "../../logger/impls/console.js";
7
7
  import {
8
8
  deserializeManifest,
9
9
  deserializeRouteData,
@@ -1,6 +1,6 @@
1
1
  import { manifest } from "virtual:astro:manifest";
2
2
  import { DevApp } from "../../dev/app.js";
3
- import { createConsoleLogger } from "../../logging.js";
3
+ import { createConsoleLogger } from "../../../logger/impls/console.js";
4
4
  let currentDevApp = null;
5
5
  const createApp = ({ streaming } = {}) => {
6
6
  const logger = createConsoleLogger(manifest.logLevel);
@@ -7,7 +7,7 @@ import {
7
7
  } from "../render/ssr-element.js";
8
8
  import { getFallbackRoute, routeIsFallback, routeIsRedirect } from "../routing/helpers.js";
9
9
  import { findRouteToRewrite } from "../routing/rewrite.js";
10
- import { createConsoleLogger } from "./logging.js";
10
+ import { createConsoleLogger } from "../logger/impls/console.js";
11
11
  class AppPipeline extends Pipeline {
12
12
  getName() {
13
13
  return "AppPipeline";
@@ -24,7 +24,7 @@ class AppPipeline extends Pipeline {
24
24
  return createAssetLink(bundlePath, manifest.base, manifest.assetsPrefix);
25
25
  }
26
26
  };
27
- const logger = createConsoleLogger(manifest.logLevel);
27
+ const logger = createConsoleLogger({ level: manifest.logLevel });
28
28
  const pipeline = new AppPipeline(
29
29
  logger,
30
30
  manifest,
@@ -5,13 +5,14 @@ import type { AstroConfig, CspAlgorithm, Locales, RemotePattern } from '../../ty
5
5
  import type { RouteData, SSRComponentMetadata, SSRLoadedRenderer, SSRResult } from '../../types/public/internal.js';
6
6
  import type { SinglePageBuiltModule } from '../build/types.js';
7
7
  import type { CspDirective } from '../csp/config.js';
8
- import type { AstroLoggerLevel } from '../logger/core.js';
8
+ import type { AstroLoggerDestination, AstroLoggerLevel, AstroLoggerMessage } from '../logger/core.js';
9
9
  import type { RoutingStrategies } from './common.js';
10
10
  import type { CacheProviderFactory, SSRManifestCache } from '../cache/types.js';
11
11
  import type { BaseSessionConfig, SessionDriverFactory } from '../session/types.js';
12
12
  import type { DevToolbarPlacement } from '../../types/public/toolbar.js';
13
13
  import type { MiddlewareMode } from '../../types/public/integrations.js';
14
14
  import type { BaseApp } from './base.js';
15
+ import type { LoggerHandlerConfig } from '../logger/config.js';
15
16
  type ComponentPath = string;
16
17
  export type StylesheetAsset = {
17
18
  type: 'inline';
@@ -59,7 +60,7 @@ export type SSRManifest = {
59
60
  userAssetsBase: string | undefined;
60
61
  trailingSlash: AstroConfig['trailingSlash'];
61
62
  buildFormat: NonNullable<AstroConfig['build']>['format'];
62
- compressHTML: boolean;
63
+ compressHTML: boolean | 'jsx';
63
64
  experimentalQueuedRendering: {
64
65
  enabled: boolean;
65
66
  /** Node pool size for memory reuse (default: 1000, set to 0 to disable pooling) */
@@ -96,6 +97,11 @@ export type SSRManifest = {
96
97
  key: Promise<CryptoKey>;
97
98
  i18n: SSRManifestI18n | undefined;
98
99
  middleware?: () => Promise<AstroMiddlewareInstance> | AstroMiddlewareInstance;
100
+ logger?: () => Promise<{
101
+ default: AstroLoggerDestination<AstroLoggerMessage>;
102
+ }> | {
103
+ default: AstroLoggerDestination<AstroLoggerMessage>;
104
+ };
99
105
  actions?: () => Promise<SSRActions> | SSRActions;
100
106
  sessionDriver?: () => Promise<{
101
107
  default: SessionDriverFactory | null;
@@ -139,6 +145,7 @@ export type SSRManifest = {
139
145
  };
140
146
  internalFetchHeaders?: Record<string, string>;
141
147
  logLevel: AstroLoggerLevel;
148
+ experimentalLogger: LoggerHandlerConfig | undefined;
142
149
  };
143
150
  export type SSRActions = {
144
151
  server: Record<string, ActionClient<any, any, any>>;
@@ -167,7 +174,7 @@ export interface SSRManifestSession extends BaseSessionConfig {
167
174
  options?: Record<string, any> | undefined;
168
175
  }
169
176
  /** Public type exposed through the `astro:build:ssr` integration hook */
170
- export type SerializedSSRManifest = Omit<SSRManifest, 'middleware' | 'routes' | 'assets' | 'componentMetadata' | 'inlinedScripts' | 'clientDirectives' | 'serverIslandNameMap' | 'key' | 'rootDir' | 'srcDir' | 'cacheDir' | 'outDir' | 'publicDir' | 'buildClientDir' | 'buildServerDir'> & {
177
+ export type SerializedSSRManifest = Omit<SSRManifest, 'middleware' | 'logger' | 'routes' | 'assets' | 'componentMetadata' | 'inlinedScripts' | 'clientDirectives' | 'serverIslandNameMap' | 'key' | 'rootDir' | 'srcDir' | 'cacheDir' | 'outDir' | 'publicDir' | 'buildClientDir' | 'buildServerDir'> & {
171
178
  rootDir: string;
172
179
  srcDir: string;
173
180
  cacheDir: string;
@@ -23,13 +23,14 @@ import { HTMLStringCache } from '../runtime/server/html-string-cache.js';
23
23
  export declare abstract class Pipeline {
24
24
  readonly internalMiddleware: MiddlewareHandler[];
25
25
  resolvedMiddleware: MiddlewareHandler | undefined;
26
+ resolvedLogger: boolean;
26
27
  resolvedActions: SSRActions | undefined;
27
28
  resolvedSessionDriver: SessionDriverFactory | null | undefined;
28
29
  resolvedCacheProvider: CacheProvider | null | undefined;
29
30
  compiledCacheRoutes: CompiledCacheRoute[] | undefined;
30
31
  nodePool: NodePool | undefined;
31
32
  htmlStringCache: HTMLStringCache | undefined;
32
- readonly logger: AstroLogger;
33
+ logger: AstroLogger;
33
34
  readonly manifest: SSRManifest;
34
35
  /**
35
36
  * "development" or "production" only
@@ -70,7 +71,7 @@ export declare abstract class Pipeline {
70
71
  /**
71
72
  * Used to provide better error messages for `Astro.clientAddress`
72
73
  */
73
- adapterName?: string, clientDirectives?: Map<string, string>, inlinedScripts?: Map<string, string>, compressHTML?: boolean, i18n?: import("./app/types.js").SSRManifestI18n | undefined, middleware?: (() => Promise<import("../types/public/common.js").AstroMiddlewareInstance> | import("../types/public/common.js").AstroMiddlewareInstance) | undefined, routeCache?: RouteCache,
74
+ adapterName?: string, clientDirectives?: Map<string, string>, inlinedScripts?: Map<string, string>, compressHTML?: boolean | "jsx", i18n?: import("./app/types.js").SSRManifestI18n | undefined, middleware?: (() => Promise<import("../types/public/common.js").AstroMiddlewareInstance> | import("../types/public/common.js").AstroMiddlewareInstance) | undefined, routeCache?: RouteCache,
74
75
  /**
75
76
  * Used for `Astro.site`.
76
77
  */
@@ -116,6 +117,12 @@ export declare abstract class Pipeline {
116
117
  * Called via HMR when middleware files change during development.
117
118
  */
118
119
  clearMiddleware(): void;
120
+ /**
121
+ * Resolves the logger destination from the manifest and updates the pipeline logger.
122
+ * If the user configured `experimental.logger`, the bundled logger factory is loaded
123
+ * and replaces the default console destination. This is lazy and only resolves once.
124
+ */
125
+ getLogger(): Promise<AstroLogger>;
119
126
  getActions(): Promise<SSRActions>;
120
127
  getSessionDriver(): Promise<SessionDriverFactory | null>;
121
128
  getCacheProvider(): Promise<CacheProvider | null>;