astro 5.7.12 → 5.7.13

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.
@@ -1,10 +1,12 @@
1
1
  ---
2
+ import * as mod from 'virtual:astro:assets/fonts/internal';
2
3
  import { AstroError, AstroErrorData } from '../dist/core/errors/index.js';
3
4
 
4
- // TODO: remove dynamic import when fonts are stabilized
5
- const { fontsData } = await import('virtual:astro:assets/fonts/internal').catch(() => {
5
+ // TODO: remove check when fonts are stabilized
6
+ const { fontsData } = mod;
7
+ if (!fontsData) {
6
8
  throw new AstroError(AstroErrorData.ExperimentalFontsNotEnabled);
7
- });
9
+ }
8
10
 
9
11
  interface Props {
10
12
  /** The `cssVariable` registered in your Astro configuration. */
@@ -13,7 +15,7 @@ interface Props {
13
15
  preload?: boolean;
14
16
  }
15
17
 
16
- const { cssVariable, preload = false } = Astro.props;
18
+ const { cssVariable, preload = false } = Astro.props as Props;
17
19
  const data = fontsData.get(cssVariable);
18
20
  if (!data) {
19
21
  throw new AstroError({
@@ -54,6 +54,7 @@ if (useResponsive) {
54
54
 
55
55
  for (const key in props) {
56
56
  if (key.startsWith('data-astro-cid')) {
57
+ // @ts-expect-error This is for island props so they're not properly typed
57
58
  pictureAttributes[key] = props[key];
58
59
  }
59
60
  }
@@ -0,0 +1,2 @@
1
+ /// <reference path="../client.d.ts" />
2
+ /// <reference path="../dev-only.d.ts" />
@@ -3,7 +3,7 @@ export declare const LOCAL_PROVIDER_NAME = "local";
3
3
  export declare const DEFAULTS: Defaults;
4
4
  export declare const VIRTUAL_MODULE_ID = "virtual:astro:assets/fonts/internal";
5
5
  export declare const RESOLVED_VIRTUAL_MODULE_ID: string;
6
- export declare const URL_PREFIX = "/_astro/fonts/";
6
+ export declare const ASSETS_DIR = "fonts";
7
7
  export declare const CACHE_DIR = "./fonts/";
8
8
  export declare const FONT_TYPES: readonly ["woff2", "woff", "otf", "ttf", "eot"];
9
9
  export declare const FONT_FORMATS: Array<{
@@ -9,7 +9,7 @@ const DEFAULTS = {
9
9
  };
10
10
  const VIRTUAL_MODULE_ID = "virtual:astro:assets/fonts/internal";
11
11
  const RESOLVED_VIRTUAL_MODULE_ID = "\0" + VIRTUAL_MODULE_ID;
12
- const URL_PREFIX = "/_astro/fonts/";
12
+ const ASSETS_DIR = "fonts";
13
13
  const CACHE_DIR = "./fonts/";
14
14
  const FONT_TYPES = ["woff2", "woff", "otf", "ttf", "eot"];
15
15
  const FONT_FORMATS = [
@@ -36,6 +36,7 @@ const GENERIC_FALLBACK_NAMES = [
36
36
  ];
37
37
  const FONTS_TYPES_FILE = "fonts.d.ts";
38
38
  export {
39
+ ASSETS_DIR,
39
40
  CACHE_DIR,
40
41
  DEFAULTS,
41
42
  FONTS_TYPES_FILE,
@@ -44,6 +45,5 @@ export {
44
45
  GENERIC_FALLBACK_NAMES,
45
46
  LOCAL_PROVIDER_NAME,
46
47
  RESOLVED_VIRTUAL_MODULE_ID,
47
- URL_PREFIX,
48
48
  VIRTUAL_MODULE_ID
49
49
  };
@@ -40,6 +40,9 @@ export interface UrlProxy {
40
40
  data: Partial<unifont.FontFaceData>;
41
41
  }) => string;
42
42
  }
43
+ export interface UrlResolver {
44
+ resolve: (hash: string) => string;
45
+ }
43
46
  export interface UrlProxyContentResolver {
44
47
  resolve: (url: string) => string;
45
48
  }
@@ -1,7 +1,7 @@
1
- import type { DataCollector, Hasher, UrlProxy, UrlProxyContentResolver } from '../definitions.js';
2
- export declare function createUrlProxy({ base, contentResolver, hasher, dataCollector, }: {
3
- base: string;
1
+ import type { DataCollector, Hasher, UrlProxy, UrlProxyContentResolver, UrlResolver } from '../definitions.js';
2
+ export declare function createUrlProxy({ contentResolver, hasher, dataCollector, urlResolver, }: {
4
3
  contentResolver: UrlProxyContentResolver;
5
4
  hasher: Hasher;
6
5
  dataCollector: DataCollector;
6
+ urlResolver: UrlResolver;
7
7
  }): UrlProxy;
@@ -1,13 +1,13 @@
1
1
  function createUrlProxy({
2
- base,
3
2
  contentResolver,
4
3
  hasher,
5
- dataCollector
4
+ dataCollector,
5
+ urlResolver
6
6
  }) {
7
7
  return {
8
8
  proxy({ url: originalUrl, type, data, collectPreload, init }) {
9
9
  const hash = `${hasher.hashString(contentResolver.resolve(originalUrl))}.${type}`;
10
- const url = base + hash;
10
+ const url = urlResolver.resolve(hash);
11
11
  dataCollector.collect({
12
12
  url: originalUrl,
13
13
  hash,
@@ -0,0 +1,9 @@
1
+ import type { AssetsPrefix } from '../../../types/public/index.js';
2
+ import type { UrlResolver } from '../definitions.js';
3
+ export declare function createDevUrlResolver({ base }: {
4
+ base: string;
5
+ }): UrlResolver;
6
+ export declare function createBuildUrlResolver({ base, assetsPrefix, }: {
7
+ base: string;
8
+ assetsPrefix: AssetsPrefix;
9
+ }): UrlResolver;
@@ -0,0 +1,27 @@
1
+ import { fileExtension, joinPaths, prependForwardSlash } from "../../../core/path.js";
2
+ import { getAssetsPrefix } from "../../utils/getAssetsPrefix.js";
3
+ function createDevUrlResolver({ base }) {
4
+ return {
5
+ resolve(hash) {
6
+ return prependForwardSlash(joinPaths(base, hash));
7
+ }
8
+ };
9
+ }
10
+ function createBuildUrlResolver({
11
+ base,
12
+ assetsPrefix
13
+ }) {
14
+ return {
15
+ resolve(hash) {
16
+ const prefix = assetsPrefix ? getAssetsPrefix(fileExtension(hash), assetsPrefix) : void 0;
17
+ if (prefix) {
18
+ return joinPaths(prefix, base, hash);
19
+ }
20
+ return prependForwardSlash(joinPaths(base, hash));
21
+ }
22
+ };
23
+ }
24
+ export {
25
+ createBuildUrlResolver,
26
+ createDevUrlResolver
27
+ };
@@ -2,16 +2,16 @@ import { mkdirSync, writeFileSync } from "node:fs";
2
2
  import { readFile } from "node:fs/promises";
3
3
  import { isAbsolute } from "node:path";
4
4
  import { fileURLToPath } from "node:url";
5
- import { removeTrailingForwardSlash } from "@astrojs/internal-helpers/path";
6
5
  import { collectErrorMetadata } from "../../core/errors/dev/utils.js";
7
6
  import { AstroError, AstroErrorData, isAstroError } from "../../core/errors/index.js";
8
7
  import { formatErrorMessage } from "../../core/messages.js";
8
+ import { appendForwardSlash, joinPaths, prependForwardSlash } from "../../core/path.js";
9
9
  import { getClientOutputDirectory } from "../../prerender/utils.js";
10
10
  import {
11
+ ASSETS_DIR,
11
12
  CACHE_DIR,
12
13
  DEFAULTS,
13
14
  RESOLVED_VIRTUAL_MODULE_ID,
14
- URL_PREFIX,
15
15
  VIRTUAL_MODULE_ID
16
16
  } from "./constants.js";
17
17
  import { createMinifiableCssRenderer } from "./implementations/css-renderer.js";
@@ -35,6 +35,7 @@ import {
35
35
  createRemoteUrlProxyContentResolver
36
36
  } from "./implementations/url-proxy-content-resolver.js";
37
37
  import { createUrlProxy } from "./implementations/url-proxy.js";
38
+ import { createBuildUrlResolver, createDevUrlResolver } from "./implementations/url-resolver.js";
38
39
  import { orchestrate } from "./orchestrate.js";
39
40
  function fontsPlugin({ settings, sync, logger }) {
40
41
  if (!settings.config.experimental.fonts) {
@@ -54,7 +55,10 @@ function fontsPlugin({ settings, sync, logger }) {
54
55
  }
55
56
  };
56
57
  }
57
- const baseUrl = removeTrailingForwardSlash(settings.config.base) + URL_PREFIX;
58
+ const assetsDir = prependForwardSlash(
59
+ appendForwardSlash(joinPaths(settings.config.build.assets, ASSETS_DIR))
60
+ );
61
+ const baseUrl = joinPaths(settings.config.base, assetsDir);
58
62
  let fontFileDataMap = null;
59
63
  let consumableMap = null;
60
64
  let isBuild;
@@ -68,7 +72,8 @@ function fontsPlugin({ settings, sync, logger }) {
68
72
  async function initialize({
69
73
  cacheDir,
70
74
  modResolver,
71
- cssRenderer
75
+ cssRenderer,
76
+ urlResolver
72
77
  }) {
73
78
  const { root } = settings.config;
74
79
  const hasher = await createXxHasher();
@@ -116,7 +121,7 @@ function fontsPlugin({ settings, sync, logger }) {
116
121
  const dataCollector = createDataCollector(params);
117
122
  const contentResolver = local ? createLocalUrlProxyContentResolver({ errorHandler }) : createRemoteUrlProxyContentResolver();
118
123
  return createUrlProxy({
119
- base: baseUrl,
124
+ urlResolver,
120
125
  contentResolver,
121
126
  hasher,
122
127
  dataCollector
@@ -137,7 +142,11 @@ function fontsPlugin({ settings, sync, logger }) {
137
142
  await initialize({
138
143
  cacheDir: new URL(CACHE_DIR, settings.config.cacheDir),
139
144
  modResolver: createBuildRemoteFontProviderModResolver(),
140
- cssRenderer: createMinifiableCssRenderer({ minify: true })
145
+ cssRenderer: createMinifiableCssRenderer({ minify: true }),
146
+ urlResolver: createBuildUrlResolver({
147
+ base: baseUrl,
148
+ assetsPrefix: settings.config.build.assetsPrefix
149
+ })
141
150
  });
142
151
  }
143
152
  },
@@ -146,7 +155,8 @@ function fontsPlugin({ settings, sync, logger }) {
146
155
  // In dev, we cache fonts data in .astro so it can be easily inspected and cleared
147
156
  cacheDir: new URL(CACHE_DIR, settings.dotAstroDir),
148
157
  modResolver: createDevServerRemoteFontProviderModResolver({ server }),
149
- cssRenderer: createMinifiableCssRenderer({ minify: false })
158
+ cssRenderer: createMinifiableCssRenderer({ minify: false }),
159
+ urlResolver: createDevUrlResolver({ base: baseUrl })
150
160
  });
151
161
  const localPaths = [...fontFileDataMap.values()].filter(({ url }) => isAbsolute(url)).map((v) => v.url);
152
162
  server.watcher.on("change", (path) => {
@@ -163,7 +173,7 @@ function fontsPlugin({ settings, sync, logger }) {
163
173
  );
164
174
  }
165
175
  });
166
- server.middlewares.use(URL_PREFIX, async (req, res, next) => {
176
+ server.middlewares.use(assetsDir, async (req, res, next) => {
167
177
  if (!req.url) {
168
178
  return next();
169
179
  }
@@ -212,7 +222,7 @@ function fontsPlugin({ settings, sync, logger }) {
212
222
  }
213
223
  try {
214
224
  const dir = getClientOutputDirectory(settings);
215
- const fontsDir = new URL("." + baseUrl, dir);
225
+ const fontsDir = new URL(`.${assetsDir}`, dir);
216
226
  try {
217
227
  mkdirSync(fontsDir, { recursive: true });
218
228
  } catch (cause) {
@@ -76,7 +76,17 @@ const sharpService = {
76
76
  quality = transform.quality in qualityTable ? qualityTable[transform.quality] : void 0;
77
77
  }
78
78
  }
79
- result.toFormat(transform.format, { quality });
79
+ const isGifInput = inputBuffer[0] === 71 && // 'G'
80
+ inputBuffer[1] === 73 && // 'I'
81
+ inputBuffer[2] === 70 && // 'F'
82
+ inputBuffer[3] === 56 && // '8'
83
+ (inputBuffer[4] === 57 || inputBuffer[4] === 55) && // '9' or '7'
84
+ inputBuffer[5] === 97;
85
+ if (transform.format === "webp" && isGifInput) {
86
+ result.webp({ quality: typeof quality === "number" ? quality : void 0, loop: 0 });
87
+ } else {
88
+ result.toFormat(transform.format, { quality });
89
+ }
80
90
  }
81
91
  const { data, info } = await result.toBuffer({ resolveWithObject: true });
82
92
  return {
@@ -153,7 +153,7 @@ ${contentConfig.error.message}`);
153
153
  logger.info("Content config changed");
154
154
  shouldClear = true;
155
155
  }
156
- if (previousAstroVersion && previousAstroVersion !== "5.7.12") {
156
+ if (previousAstroVersion && previousAstroVersion !== "5.7.13") {
157
157
  logger.info("Astro version changed");
158
158
  shouldClear = true;
159
159
  }
@@ -161,8 +161,8 @@ ${contentConfig.error.message}`);
161
161
  logger.info("Clearing content store");
162
162
  this.#store.clearAll();
163
163
  }
164
- if ("5.7.12") {
165
- await this.#store.metaStore().set("astro-version", "5.7.12");
164
+ if ("5.7.13") {
165
+ await this.#store.metaStore().set("astro-version", "5.7.13");
166
166
  }
167
167
  if (currentConfigDigest) {
168
168
  await this.#store.metaStore().set("content-config-digest", currentConfigDigest);
@@ -1,14 +1,12 @@
1
1
  import { promises as fs, existsSync } from "node:fs";
2
2
  import { fileURLToPath } from "node:url";
3
3
  import yaml from "js-yaml";
4
+ import { FileGlobNotSupported, FileParserNotFound } from "../../core/errors/errors-data.js";
4
5
  import { AstroError } from "../../core/errors/index.js";
5
6
  import { posixRelative } from "../utils.js";
6
7
  function file(fileName, options) {
7
8
  if (fileName.includes("*")) {
8
- throw new AstroError({
9
- name: "Glob Pattern Error",
10
- message: "Glob patterns are not supported in `file` loader. Use `glob` loader instead."
11
- });
9
+ throw new AstroError(FileGlobNotSupported);
12
10
  }
13
11
  let parse = null;
14
12
  const ext = fileName.split(".").at(-1);
@@ -22,8 +20,8 @@ function file(fileName, options) {
22
20
  if (options?.parser) parse = options.parser;
23
21
  if (parse === null) {
24
22
  throw new AstroError({
25
- name: "Parser Not Found",
26
- message: `No parser found for file '${fileName}'. Try passing a parser to the \`file\` loader.`
23
+ ...FileParserNotFound,
24
+ message: FileParserNotFound.message(fileName)
27
25
  });
28
26
  }
29
27
  async function syncData(filePath, { logger, parseData, store, config }) {
@@ -160,7 +160,7 @@ async function generatePage(pageData, ssrEntry, builtPaths, pipeline) {
160
160
  const path = paths[i];
161
161
  promises.push(limit(() => generatePathWithLogs(path, route, i, paths, true)));
162
162
  }
163
- await Promise.allSettled(promises);
163
+ await Promise.all(promises);
164
164
  } else {
165
165
  for (let i = 0; i < paths.length; i++) {
166
166
  const path = paths[i];
@@ -1,4 +1,4 @@
1
- const ASTRO_VERSION = "5.7.12";
1
+ const ASTRO_VERSION = "5.7.13";
2
2
  const REROUTE_DIRECTIVE_HEADER = "X-Astro-Reroute";
3
3
  const REWRITE_DIRECTIVE_HEADER_KEY = "X-Astro-Rewrite";
4
4
  const REWRITE_DIRECTIVE_HEADER_VALUE = "yes";
@@ -22,7 +22,7 @@ async function dev(inlineConfig) {
22
22
  await telemetry.record([]);
23
23
  const restart = await createContainerWithAutomaticRestart({ inlineConfig, fs });
24
24
  const logger = restart.container.logger;
25
- const currentVersion = "5.7.12";
25
+ const currentVersion = "5.7.13";
26
26
  const isPrerelease = currentVersion.includes("-");
27
27
  if (!isPrerelease) {
28
28
  try {
@@ -1170,7 +1170,7 @@ export declare const CannotExtractFontType: {
1170
1170
  /**
1171
1171
  * @docs
1172
1172
  * @description
1173
- * Cannot determine weight and style from font file.
1173
+ * Cannot determine weight and style from font file, update your family config and set `weight` and `style` manually instead.
1174
1174
  * @message
1175
1175
  * An error occured while determining the weight and style from the local font file.
1176
1176
  */
@@ -1601,6 +1601,31 @@ export declare const UnsupportedConfigTransformError: {
1601
1601
  message: (parseError: string) => string;
1602
1602
  hint: string;
1603
1603
  };
1604
+ /**
1605
+ * @docs
1606
+ * @see
1607
+ * - [Passing a `parser` to the `file` loader](https://docs.astro.build/en/guides/content-collections/#parser-function)
1608
+ * @description
1609
+ * The `file` loader can’t determine which parser to use. Please provide a custom parser (e.g. `toml.parse` or `csv-parse`) to create a collection from your file type.
1610
+ */
1611
+ export declare const FileParserNotFound: {
1612
+ name: string;
1613
+ title: string;
1614
+ message: (fileName: string) => string;
1615
+ };
1616
+ /**
1617
+ * @docs
1618
+ * @see
1619
+ * - [Astro's built-in loaders](https://docs.astro.build/en/guides/content-collections/#built-in-loaders)
1620
+ * @description
1621
+ * The `file` loader must be passed a single local file. Glob patterns are not supported. Use the built-in `glob` loader to create entries from patterns of multiple local files.
1622
+ */
1623
+ export declare const FileGlobNotSupported: {
1624
+ name: string;
1625
+ title: string;
1626
+ message: string;
1627
+ hint: string;
1628
+ };
1604
1629
  /**
1605
1630
  * @docs
1606
1631
  * @kind heading
@@ -640,6 +640,17 @@ const UnsupportedConfigTransformError = {
640
640
  Full error: ${parseError}`,
641
641
  hint: "See the devalue library for all supported types: https://github.com/rich-harris/devalue"
642
642
  };
643
+ const FileParserNotFound = {
644
+ name: "FileParserNotFound",
645
+ title: "File parser not found",
646
+ message: (fileName) => `No parser was found for '${fileName}'. Pass a parser function (e.g. \`parser: csv\`) to the \`file\` loader.`
647
+ };
648
+ const FileGlobNotSupported = {
649
+ name: "FileGlobNotSupported",
650
+ title: "Glob patterns are not supported in the file loader",
651
+ message: "Glob patterns are not supported in the `file` loader. Use the `glob` loader instead.",
652
+ hint: `See Astro's built-in file and glob loaders https://docs.astro.build/en/guides/content-collections/#built-in-loaders for supported usage.`
653
+ };
643
654
  const ActionsWithoutServerOutputError = {
644
655
  name: "ActionsWithoutServerOutputError",
645
656
  title: "Actions must be used with server output.",
@@ -736,6 +747,8 @@ export {
736
747
  FailedToFetchRemoteImageDimensions,
737
748
  FailedToFindPageMapSSR,
738
749
  FailedToLoadModuleSSR,
750
+ FileGlobNotSupported,
751
+ FileParserNotFound,
739
752
  FontFamilyNotFound,
740
753
  ForbiddenRewrite,
741
754
  GenerateContentTypesError,
@@ -37,7 +37,7 @@ function serverStart({
37
37
  host,
38
38
  base
39
39
  }) {
40
- const version = "5.7.12";
40
+ const version = "5.7.13";
41
41
  const localPrefix = `${dim("\u2503")} Local `;
42
42
  const networkPrefix = `${dim("\u2503")} Network `;
43
43
  const emptyPrefix = " ".repeat(11);
@@ -274,7 +274,7 @@ function printHelp({
274
274
  message.push(
275
275
  linebreak(),
276
276
  ` ${bgGreen(black(` ${commandName} `))} ${green(
277
- `v${"5.7.12"}`
277
+ `v${"5.7.13"}`
278
278
  )} ${headline}`
279
279
  );
280
280
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "astro",
3
- "version": "5.7.12",
3
+ "version": "5.7.13",
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",
@@ -80,7 +80,7 @@
80
80
  "astro": "astro.js"
81
81
  },
82
82
  "files": [
83
- "components",
83
+ "components/*.{astro,css,ts}",
84
84
  "tsconfigs",
85
85
  "dist",
86
86
  "types",
@@ -194,6 +194,7 @@
194
194
  "remark-code-titles": "^0.1.2",
195
195
  "rollup": "^4.37.0",
196
196
  "sass": "^1.86.0",
197
+ "typescript": "^5.8.3",
197
198
  "undici": "^7.5.0",
198
199
  "unified": "^11.0.5",
199
200
  "vitest": "^3.0.9",
@@ -213,7 +214,7 @@
213
214
  },
214
215
  "scripts": {
215
216
  "prebuild": "astro-scripts prebuild --to-string \"src/runtime/server/astro-island.ts\" \"src/runtime/client/{idle,load,media,only,visible}.ts\"",
216
- "build": "pnpm run prebuild && astro-scripts build \"src/**/*.{ts,js}\" --copy-wasm && tsc",
217
+ "build": "pnpm run prebuild && astro-scripts build \"src/**/*.{ts,js}\" --copy-wasm && tsc && astro-check --root ./components",
217
218
  "build:ci": "pnpm run prebuild && astro-scripts build \"src/**/*.{ts,js}\" --copy-wasm",
218
219
  "dev": "astro-scripts dev --copy-wasm --prebuild \"src/runtime/server/astro-island.ts\" --prebuild \"src/runtime/client/{idle,load,media,only,visible}.ts\" \"src/**/*.{ts,js}\"",
219
220
  "test": "pnpm run test:unit && pnpm run test:integration && pnpm run test:types",