astro 2.10.1 → 2.10.2

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.
@@ -168,13 +168,18 @@ const { fallback = 'animate' } = Astro.props as Props;
168
168
 
169
169
  // Trigger the animations
170
170
  document.documentElement.dataset.astroTransitionFallback = 'old';
171
- doc.documentElement.dataset.astroTransitionFallback = 'new';
171
+ const fallbackSwap = () => {
172
+ removeEventListener('animationend', fallbackSwap);
173
+ clearTimeout(timeout);
174
+ swap();
175
+ document.documentElement.dataset.astroTransitionFallback = 'new';
176
+ };
172
177
  // If there are any animations, want for the animationend event.
173
- addEventListener('animationend', swap, { once: true });
178
+ addEventListener('animationend', fallbackSwap, { once: true });
174
179
  // If there are no animations, go ahead and swap on next tick
175
180
  // This is necessary because we do not know if there are animations.
176
181
  // The setTimeout is a fallback in case there are none.
177
- setTimeout(() => !isAnimating && swap());
182
+ let timeout = setTimeout(() => !isAnimating && fallbackSwap());
178
183
  } else {
179
184
  swap();
180
185
  }
@@ -1216,15 +1216,18 @@ export interface AstroUserConfig {
1216
1216
  * - "page-ssr": Injected into the frontmatter of every Astro page. Processed & resolved by Vite.
1217
1217
  */
1218
1218
  export type InjectedScriptStage = 'before-hydration' | 'head-inline' | 'page' | 'page-ssr';
1219
- /**
1220
- * Resolved Astro Config
1221
- * Config with user settings along with all defaults filled in.
1222
- */
1223
1219
  export interface InjectedRoute {
1224
1220
  pattern: string;
1225
1221
  entryPoint: string;
1226
1222
  prerender?: boolean;
1227
1223
  }
1224
+ export interface ResolvedInjectedRoute extends InjectedRoute {
1225
+ resolvedEntryPoint?: URL;
1226
+ }
1227
+ /**
1228
+ * Resolved Astro Config
1229
+ * Config with user settings along with all defaults filled in.
1230
+ */
1228
1231
  export interface AstroConfig extends z.output<typeof AstroConfigSchema> {
1229
1232
  integrations: AstroIntegration[];
1230
1233
  }
@@ -1304,6 +1307,7 @@ export interface AstroSettings {
1304
1307
  config: AstroConfig;
1305
1308
  adapter: AstroAdapter | undefined;
1306
1309
  injectedRoutes: InjectedRoute[];
1310
+ resolvedInjectedRoutes: ResolvedInjectedRoute[];
1307
1311
  pageExtensions: string[];
1308
1312
  contentEntryTypes: ContentEntryType[];
1309
1313
  dataEntryTypes: DataEntryType[];
@@ -3,8 +3,8 @@ import { cyan } from "kleur/colors";
3
3
  import * as path from "node:path";
4
4
  import { fileURLToPath, pathToFileURL } from "node:url";
5
5
  import { normalizePath } from "vite";
6
- import { AstroErrorData } from "../core/errors/errors-data.js";
7
6
  import { AstroError } from "../core/errors/errors.js";
7
+ import { AstroErrorData } from "../core/errors/index.js";
8
8
  import { info, warn } from "../core/logger/core.js";
9
9
  import { isRelativePath } from "../core/path.js";
10
10
  import { CONTENT_TYPES_FILE, VIRTUAL_MODULE_ID } from "./consts.js";
@@ -1,8 +1,8 @@
1
1
  import * as devalue from "devalue";
2
2
  import { extname } from "node:path";
3
3
  import { pathToFileURL } from "node:url";
4
- import { AstroErrorData } from "../core/errors/errors-data.js";
5
4
  import { AstroError } from "../core/errors/errors.js";
5
+ import { AstroErrorData } from "../core/errors/index.js";
6
6
  import { escapeViteEnvReferences } from "../vite-plugin-utils/index.js";
7
7
  import { CONTENT_FLAG, DATA_FLAG } from "./consts.js";
8
8
  import {
@@ -277,6 +277,7 @@ function stringifyEntryData(data) {
277
277
  });
278
278
  } else {
279
279
  throw new AstroError({
280
+ name: "PluginContentImportsError",
280
281
  message: "Unexpected error processing content collection data."
281
282
  });
282
283
  }
@@ -116,7 +116,7 @@ class App {
116
116
  routeData = this.match(request);
117
117
  }
118
118
  if (!routeData) {
119
- return this.#renderError(request, { routeData, status: 404 });
119
+ return this.#renderError(request, { status: 404 });
120
120
  }
121
121
  Reflect.set(request, clientLocalsSymbol, locals ?? {});
122
122
  const defaultStatus = this.#getDefaultStatusCode(routeData.route);
@@ -141,12 +141,11 @@ class App {
141
141
  );
142
142
  } catch (err) {
143
143
  error(this.#logging, "ssr", err.stack || err.message || String(err));
144
- return this.#renderError(request, { routeData, status: 500 });
144
+ return this.#renderError(request, { status: 500 });
145
145
  }
146
146
  if (isResponse(response, routeData.type)) {
147
147
  if (STATUS_CODES.has(response.status)) {
148
148
  return this.#renderError(request, {
149
- routeData,
150
149
  response,
151
150
  status: response.status
152
151
  });
@@ -157,7 +156,6 @@ class App {
157
156
  if (response.type === "response") {
158
157
  if (response.response.headers.get("X-Astro-Response") === "Not-Found") {
159
158
  return this.#renderError(request, {
160
- routeData,
161
159
  response: response.response,
162
160
  status: 404
163
161
  });
@@ -239,7 +237,7 @@ class App {
239
237
  * If it is a known error code, try sending the according page (e.g. 404.astro / 500.astro).
240
238
  * This also handles pre-rendered /404 or /500 routes
241
239
  */
242
- async #renderError(request, { routeData, status, response: originalResponse }) {
240
+ async #renderError(request, { status, response: originalResponse }) {
243
241
  const errorRouteData = matchRoute("/" + status, this.#manifestData);
244
242
  const url = new URL(request.url);
245
243
  if (errorRouteData) {
@@ -248,13 +246,12 @@ class App {
248
246
  const response2 = await fetch(statusURL.toString());
249
247
  return this.#mergeResponses(response2, originalResponse);
250
248
  }
251
- const finalRouteData = routeData ?? errorRouteData;
252
249
  const mod = await this.#getModuleForRoute(errorRouteData);
253
250
  try {
254
251
  const newRenderContext = await this.#createRenderContext(
255
252
  url,
256
253
  request,
257
- finalRouteData,
254
+ errorRouteData,
258
255
  mod,
259
256
  status
260
257
  );
@@ -328,20 +328,9 @@ async function ssrMoveAssets(opts) {
328
328
  }
329
329
  function makeAstroPageEntryPointFileName(prefix, facadeModuleId, routes) {
330
330
  const pageModuleId = facadeModuleId.replace(prefix, "").replace(ASTRO_PAGE_EXTENSION_POST_PATTERN, ".");
331
- let route = routes.find((routeData) => {
332
- return routeData.route === pageModuleId;
333
- });
334
- let name = pageModuleId;
335
- if (route) {
336
- name = route.route;
337
- }
338
- if (name.endsWith("/"))
339
- name += "index";
340
- const fileName = `${name.replaceAll("[", "_").replaceAll("]", "_").replaceAll("...", "---")}.mjs`;
341
- if (name.startsWith("..")) {
342
- return `pages${fileName}`;
343
- }
344
- return fileName;
331
+ const route = routes.find((routeData) => routeData.component === pageModuleId);
332
+ const name = (route == null ? void 0 : route.route) ?? pageModuleId;
333
+ return `pages${name.replace(/\/$/, "/index").replaceAll(/[\[\]]/g, "_").replaceAll("...", "---")}.astro.mjs`;
345
334
  }
346
335
  function makeSplitEntryPointFileName(facadeModuleId, routes) {
347
336
  const filePath = `${makeAstroPageEntryPointFileName(
@@ -58,6 +58,7 @@ function handleCompileResultErrors(result, cssTransformErrors) {
58
58
  const compilerError = result.diagnostics.find((diag) => diag.severity === 1);
59
59
  if (compilerError) {
60
60
  throw new CompilerError({
61
+ name: "CompilerError",
61
62
  message: compilerError.text,
62
63
  location: {
63
64
  line: compilerError.location.line,
@@ -68,6 +68,7 @@ function enhanceCSSError(err, filename, cssContent) {
68
68
  const errorPosition = positionAt(styleTagBeginning, fileContent);
69
69
  errorPosition.line += 1;
70
70
  return new CSSError({
71
+ name: "CSSError",
71
72
  message: err.message,
72
73
  location: {
73
74
  file: filename,
@@ -20,5 +20,11 @@ interface ResolveConfigResult {
20
20
  userConfig: AstroUserConfig;
21
21
  astroConfig: AstroConfig;
22
22
  }
23
+ /**
24
+ * Resolves the Astro config with a given inline config.
25
+ *
26
+ * @param inlineConfig An inline config that takes highest priority when merging and resolving the final config.
27
+ * @param command The running command that uses this config. Usually 'dev' or 'build'.
28
+ */
23
29
  export declare function resolveConfig(inlineConfig: AstroInlineConfig, command: string, fsMod?: typeof fs): Promise<ResolveConfigResult>;
24
30
  export {};
@@ -163,6 +163,9 @@ function splitInlineConfig(inlineConfig) {
163
163
  async function resolveConfig(inlineConfig, command, fsMod = fs) {
164
164
  const root = resolveRoot(inlineConfig.root);
165
165
  const { inlineUserConfig, inlineOnlyConfig } = splitInlineConfig(inlineConfig);
166
+ if (inlineConfig.root) {
167
+ inlineUserConfig.root = root;
168
+ }
166
169
  const userConfig = await loadConfig(root, inlineOnlyConfig.configFile, fsMod);
167
170
  const mergedConfig = mergeConfig(userConfig, inlineUserConfig);
168
171
  const astroConfig = await validateConfig(mergedConfig, root, command);
@@ -18,6 +18,7 @@ function createBaseSettings(config) {
18
18
  tsConfigPath: void 0,
19
19
  adapter: void 0,
20
20
  injectedRoutes: [],
21
+ resolvedInjectedRoutes: [],
21
22
  pageExtensions: [".astro", ".html", ...SUPPORTED_MARKDOWN_FILE_EXTENSIONS],
22
23
  contentEntryTypes: [markdownContentEntryType],
23
24
  dataEntryTypes: [
@@ -1,4 +1,4 @@
1
- const ASTRO_VERSION = "2.10.1";
1
+ const ASTRO_VERSION = "2.10.2";
2
2
  const SUPPORTED_MARKDOWN_FILE_EXTENSIONS = [
3
3
  ".markdown",
4
4
  ".mdown",
@@ -23,7 +23,7 @@ async function dev(inlineConfig) {
23
23
  base: restart.container.settings.config.base
24
24
  })
25
25
  );
26
- const currentVersion = "2.10.1";
26
+ const currentVersion = "2.10.2";
27
27
  if (currentVersion.includes("-")) {
28
28
  warn(logging, null, msg.prerelease({ currentVersion }));
29
29
  }
@@ -1,7 +1,7 @@
1
1
  import * as fs from "node:fs";
2
2
  import { fileURLToPath } from "node:url";
3
3
  import { getHighlighter } from "shiki";
4
- import { AstroErrorData } from "../errors-data.js";
4
+ import { FailedToLoadModuleSSR, InvalidGlob, MdxIntegrationMissingError } from "../errors-data.js";
5
5
  import { AstroError } from "../errors.js";
6
6
  import { createSafeError } from "../utils.js";
7
7
  import { renderErrorMarkdown } from "./utils.js";
@@ -25,10 +25,10 @@ function enhanceViteSSRError({
25
25
  const lns = content.split("\n");
26
26
  let importName;
27
27
  if (importName = (_a = safeError.message.match(/Failed to load url (.*?) \(resolved id:/)) == null ? void 0 : _a[1]) {
28
- safeError.title = AstroErrorData.FailedToLoadModuleSSR.title;
28
+ safeError.title = FailedToLoadModuleSSR.title;
29
29
  safeError.name = "FailedToLoadModuleSSR";
30
- safeError.message = AstroErrorData.FailedToLoadModuleSSR.message(importName);
31
- safeError.hint = AstroErrorData.FailedToLoadModuleSSR.hint;
30
+ safeError.message = FailedToLoadModuleSSR.message(importName);
31
+ safeError.hint = FailedToLoadModuleSSR.hint;
32
32
  const line = lns.findIndex((ln) => ln.includes(importName));
33
33
  if (line !== -1) {
34
34
  const column = (_b = lns[line]) == null ? void 0 : _b.indexOf(importName);
@@ -42,8 +42,8 @@ function enhanceViteSSRError({
42
42
  const fileId = safeError.id ?? ((_c = safeError.loc) == null ? void 0 : _c.file);
43
43
  if (!(renderers == null ? void 0 : renderers.find((r) => r.name === "@astrojs/mdx")) && safeError.message.match(/Syntax error/) && (fileId == null ? void 0 : fileId.match(/\.mdx$/))) {
44
44
  safeError = new AstroError({
45
- ...AstroErrorData.MdxIntegrationMissingError,
46
- message: AstroErrorData.MdxIntegrationMissingError.message(JSON.stringify(fileId)),
45
+ ...MdxIntegrationMissingError,
46
+ message: MdxIntegrationMissingError.message(JSON.stringify(fileId)),
47
47
  location: safeError.loc,
48
48
  stack: safeError.stack
49
49
  });
@@ -51,10 +51,10 @@ function enhanceViteSSRError({
51
51
  if (/Invalid glob/.test(safeError.message)) {
52
52
  const globPattern = (_d = safeError.message.match(/glob: "(.+)" \(/)) == null ? void 0 : _d[1];
53
53
  if (globPattern) {
54
- safeError.message = AstroErrorData.InvalidGlob.message(globPattern);
54
+ safeError.message = InvalidGlob.message(globPattern);
55
55
  safeError.name = "InvalidGlob";
56
- safeError.hint = AstroErrorData.InvalidGlob.hint;
57
- safeError.title = AstroErrorData.InvalidGlob.title;
56
+ safeError.hint = InvalidGlob.hint;
57
+ safeError.title = InvalidGlob.title;
58
58
  const line = lns.findIndex((ln) => ln.includes(globPattern));
59
59
  if (line !== -1) {
60
60
  const column = (_e = lns[line]) == null ? void 0 : _e.indexOf(globPattern);
@@ -79,7 +79,7 @@ async function getViteErrorPayload(err) {
79
79
  }
80
80
  const message = renderErrorMarkdown(err.message.trim(), "html");
81
81
  const hint = err.hint ? renderErrorMarkdown(err.hint.trim(), "html") : void 0;
82
- const hasDocs = err.name in AstroErrorData;
82
+ const hasDocs = !!err.name;
83
83
  const docslink = hasDocs ? `https://docs.astro.build/en/reference/errors/${getKebabErrorName(err.name)}/` : void 0;
84
84
  const highlighter = await getHighlighter({ theme: "css-variables" });
85
85
  let highlighterLang = (_b = (_a = err.loc) == null ? void 0 : _a.file) == null ? void 0 : _b.split(".").pop();