astro 5.7.5 → 5.7.7

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 (74) hide show
  1. package/components/image.css +5 -12
  2. package/dist/assets/fonts/config.d.ts +9 -9
  3. package/dist/assets/fonts/config.js +3 -4
  4. package/dist/assets/fonts/constants.d.ts +3 -73
  5. package/dist/assets/fonts/constants.js +16 -68
  6. package/dist/assets/fonts/definitions.d.ts +73 -0
  7. package/dist/assets/fonts/definitions.js +0 -0
  8. package/dist/assets/fonts/implementations/css-renderer.d.ts +9 -0
  9. package/dist/assets/fonts/implementations/css-renderer.js +42 -0
  10. package/dist/assets/fonts/implementations/data-collector.d.ts +3 -0
  11. package/dist/assets/fonts/implementations/data-collector.js +21 -0
  12. package/dist/assets/fonts/implementations/error-handler.d.ts +2 -0
  13. package/dist/assets/fonts/implementations/error-handler.js +33 -0
  14. package/dist/assets/fonts/implementations/font-fetcher.d.ts +8 -0
  15. package/dist/assets/fonts/implementations/font-fetcher.js +34 -0
  16. package/dist/assets/fonts/implementations/font-metrics-resolver.d.ts +5 -0
  17. package/dist/assets/fonts/implementations/font-metrics-resolver.js +60 -0
  18. package/dist/assets/fonts/implementations/font-type-extractor.d.ts +4 -0
  19. package/dist/assets/fonts/implementations/font-type-extractor.js +22 -0
  20. package/dist/assets/fonts/implementations/hasher.d.ts +2 -0
  21. package/dist/assets/fonts/implementations/hasher.js +14 -0
  22. package/dist/assets/fonts/implementations/local-provider-url-resolver.d.ts +5 -0
  23. package/dist/assets/fonts/implementations/local-provider-url-resolver.js +17 -0
  24. package/dist/assets/fonts/implementations/remote-font-provider-mod-resolver.d.ts +6 -0
  25. package/dist/assets/fonts/implementations/remote-font-provider-mod-resolver.js +20 -0
  26. package/dist/assets/fonts/implementations/remote-font-provider-resolver.d.ts +6 -0
  27. package/dist/assets/fonts/implementations/remote-font-provider-resolver.js +47 -0
  28. package/dist/assets/fonts/implementations/storage.d.ts +4 -0
  29. package/dist/assets/fonts/implementations/storage.js +14 -0
  30. package/dist/assets/fonts/implementations/system-fallbacks-provider.d.ts +11 -0
  31. package/dist/assets/fonts/implementations/system-fallbacks-provider.js +74 -0
  32. package/dist/assets/fonts/implementations/url-proxy-content-resolver.d.ts +5 -0
  33. package/dist/assets/fonts/implementations/url-proxy-content-resolver.js +28 -0
  34. package/dist/assets/fonts/implementations/url-proxy.d.ts +8 -0
  35. package/dist/assets/fonts/implementations/url-proxy.js +26 -0
  36. package/dist/assets/fonts/logic/extract-unifont-providers.d.ts +10 -0
  37. package/dist/assets/fonts/logic/extract-unifont-providers.js +28 -0
  38. package/dist/assets/fonts/logic/normalize-remote-font-faces.d.ts +6 -0
  39. package/dist/assets/fonts/logic/normalize-remote-font-faces.js +36 -0
  40. package/dist/assets/fonts/logic/optimize-fallbacks.d.ts +17 -0
  41. package/dist/assets/fonts/logic/optimize-fallbacks.js +47 -0
  42. package/dist/assets/fonts/logic/resolve-families.d.ts +17 -0
  43. package/dist/assets/fonts/logic/resolve-families.js +67 -0
  44. package/dist/assets/fonts/orchestrate.d.ts +37 -0
  45. package/dist/assets/fonts/orchestrate.js +125 -0
  46. package/dist/assets/fonts/providers/local.d.ts +6 -7
  47. package/dist/assets/fonts/providers/local.js +26 -29
  48. package/dist/assets/fonts/types.d.ts +32 -2
  49. package/dist/assets/fonts/utils.d.ts +17 -87
  50. package/dist/assets/fonts/utils.js +21 -183
  51. package/dist/assets/fonts/vite-plugin-fonts.js +98 -80
  52. package/dist/assets/internal.js +0 -2
  53. package/dist/assets/layout.js +4 -4
  54. package/dist/assets/types.d.ts +4 -4
  55. package/dist/content/content-layer.js +3 -3
  56. package/dist/core/config/schemas/base.d.ts +19 -19
  57. package/dist/core/config/schemas/base.js +1 -1
  58. package/dist/core/config/schemas/relative.d.ts +25 -25
  59. package/dist/core/constants.js +1 -1
  60. package/dist/core/dev/dev.js +1 -1
  61. package/dist/core/errors/errors-data.d.ts +2 -1
  62. package/dist/core/errors/errors-data.js +2 -1
  63. package/dist/core/messages.js +2 -2
  64. package/dist/core/routing/manifest/create.js +4 -1
  65. package/dist/types/public/config.d.ts +19 -22
  66. package/dist/vite-plugin-markdown/images.js +4 -4
  67. package/package.json +4 -4
  68. package/types/content.d.ts +11 -4
  69. package/dist/assets/fonts/load.d.ts +0 -20
  70. package/dist/assets/fonts/load.js +0 -162
  71. package/dist/assets/fonts/metrics.d.ts +0 -10
  72. package/dist/assets/fonts/metrics.js +0 -55
  73. package/dist/assets/fonts/providers/utils.d.ts +0 -9
  74. package/dist/assets/fonts/providers/utils.js +0 -37
@@ -3,48 +3,38 @@ import { readFile } from "node:fs/promises";
3
3
  import { isAbsolute } from "node:path";
4
4
  import { fileURLToPath } from "node:url";
5
5
  import { removeTrailingForwardSlash } from "@astrojs/internal-helpers/path";
6
- import { createStorage } from "unstorage";
7
- import fsLiteDriver from "unstorage/drivers/fs-lite";
8
- import xxhash from "xxhash-wasm";
9
6
  import { collectErrorMetadata } from "../../core/errors/dev/utils.js";
10
7
  import { AstroError, AstroErrorData, isAstroError } from "../../core/errors/index.js";
11
8
  import { formatErrorMessage } from "../../core/messages.js";
12
9
  import { getClientOutputDirectory } from "../../prerender/utils.js";
13
10
  import {
14
11
  CACHE_DIR,
12
+ DEFAULTS,
15
13
  RESOLVED_VIRTUAL_MODULE_ID,
16
14
  URL_PREFIX,
17
15
  VIRTUAL_MODULE_ID
18
16
  } from "./constants.js";
19
- import { loadFonts } from "./load.js";
20
- import { generateFallbackFontFace, readMetrics } from "./metrics.js";
17
+ import { createMinifiableCssRenderer } from "./implementations/css-renderer.js";
18
+ import { createDataCollector } from "./implementations/data-collector.js";
19
+ import { createAstroErrorHandler } from "./implementations/error-handler.js";
20
+ import { createCachedFontFetcher } from "./implementations/font-fetcher.js";
21
+ import { createCapsizeFontMetricsResolver } from "./implementations/font-metrics-resolver.js";
22
+ import { createFontTypeExtractor } from "./implementations/font-type-extractor.js";
23
+ import { createXxHasher } from "./implementations/hasher.js";
24
+ import { createRequireLocalProviderUrlResolver } from "./implementations/local-provider-url-resolver.js";
21
25
  import {
22
- cache,
23
- extractFontType,
24
- resolveFontFamily,
25
- sortObjectByKey,
26
- withoutQuotes
27
- } from "./utils.js";
28
- async function fetchFont(url) {
29
- try {
30
- if (isAbsolute(url)) {
31
- return await readFile(url);
32
- }
33
- const response = await fetch(url);
34
- if (!response.ok) {
35
- throw new Error(`Response was not successful, received status code ${response.status}`);
36
- }
37
- return Buffer.from(await response.arrayBuffer());
38
- } catch (cause) {
39
- throw new AstroError(
40
- {
41
- ...AstroErrorData.CannotFetchFontFile,
42
- message: AstroErrorData.CannotFetchFontFile.message(url)
43
- },
44
- { cause }
45
- );
46
- }
47
- }
26
+ createBuildRemoteFontProviderModResolver,
27
+ createDevServerRemoteFontProviderModResolver
28
+ } from "./implementations/remote-font-provider-mod-resolver.js";
29
+ import { createRemoteFontProviderResolver } from "./implementations/remote-font-provider-resolver.js";
30
+ import { createFsStorage } from "./implementations/storage.js";
31
+ import { createSystemFallbacksProvider } from "./implementations/system-fallbacks-provider.js";
32
+ import {
33
+ createLocalUrlProxyContentResolver,
34
+ createRemoteUrlProxyContentResolver
35
+ } from "./implementations/url-proxy-content-resolver.js";
36
+ import { createUrlProxy } from "./implementations/url-proxy.js";
37
+ import { orchestrate } from "./orchestrate.js";
48
38
  function fontsPlugin({ settings, sync, logger }) {
49
39
  if (!settings.config.experimental.fonts) {
50
40
  return {
@@ -64,49 +54,75 @@ function fontsPlugin({ settings, sync, logger }) {
64
54
  };
65
55
  }
66
56
  const baseUrl = removeTrailingForwardSlash(settings.config.base) + URL_PREFIX;
67
- let resolvedMap = null;
68
- let hashToUrlMap = null;
57
+ let fontFileDataMap = null;
58
+ let consumableMap = null;
69
59
  let isBuild;
70
- let storage = null;
60
+ let fontFetcher = null;
61
+ let fontTypeExtractor = null;
71
62
  const cleanup = () => {
72
- resolvedMap = null;
73
- hashToUrlMap = null;
74
- storage = null;
63
+ consumableMap = null;
64
+ fontFileDataMap = null;
65
+ fontFetcher = null;
75
66
  };
76
- async function initialize({ resolveMod, base }) {
77
- const { h64ToString } = await xxhash();
78
- storage = createStorage({
79
- // Types are weirly exported
80
- driver: fsLiteDriver({
81
- base: fileURLToPath(base)
82
- })
67
+ async function initialize({
68
+ cacheDir,
69
+ modResolver,
70
+ cssRenderer
71
+ }) {
72
+ const { root } = settings.config;
73
+ const hasher = await createXxHasher();
74
+ const errorHandler = createAstroErrorHandler();
75
+ const remoteFontProviderResolver = createRemoteFontProviderResolver({
76
+ root,
77
+ modResolver,
78
+ errorHandler
83
79
  });
84
- hashToUrlMap = /* @__PURE__ */ new Map();
85
- resolvedMap = /* @__PURE__ */ new Map();
86
- const families = [];
87
- for (const family of settings.config.experimental.fonts) {
88
- families.push(
89
- await resolveFontFamily({
90
- family,
91
- root: settings.config.root,
92
- resolveMod,
93
- generateNameWithHash: (_family) => `${withoutQuotes(_family.name)}-${h64ToString(JSON.stringify(sortObjectByKey(_family)))}`
94
- })
95
- );
96
- }
97
- await loadFonts({
98
- base: baseUrl,
99
- families,
80
+ const pathsToWarn = /* @__PURE__ */ new Set();
81
+ const localProviderUrlResolver = createRequireLocalProviderUrlResolver({
82
+ root,
83
+ intercept: (path) => {
84
+ if (path.startsWith(fileURLToPath(settings.config.publicDir))) {
85
+ if (pathsToWarn.has(path)) {
86
+ return;
87
+ }
88
+ pathsToWarn.add(path);
89
+ logger.warn(
90
+ "assets",
91
+ `Found a local font file ${JSON.stringify(path)} in the \`public/\` folder. To avoid duplicated files in the build output, move this file into \`src/\``
92
+ );
93
+ }
94
+ }
95
+ });
96
+ const storage = createFsStorage({ base: cacheDir });
97
+ const systemFallbacksProvider = createSystemFallbacksProvider();
98
+ fontFetcher = createCachedFontFetcher({ storage, errorHandler, fetch, readFile });
99
+ const fontMetricsResolver = createCapsizeFontMetricsResolver({ fontFetcher, cssRenderer });
100
+ fontTypeExtractor = createFontTypeExtractor({ errorHandler });
101
+ const res = await orchestrate({
102
+ families: settings.config.experimental.fonts,
103
+ hasher,
104
+ remoteFontProviderResolver,
105
+ localProviderUrlResolver,
100
106
  storage,
101
- hashToUrlMap,
102
- resolvedMap,
103
- hashString: h64ToString,
104
- generateFallbackFontFace,
105
- getMetricsForFamily: async (name, font) => {
106
- return await readMetrics(name, await cache(storage, font.hash, () => fetchFont(font.url)));
107
+ cssRenderer,
108
+ systemFallbacksProvider,
109
+ fontMetricsResolver,
110
+ fontTypeExtractor,
111
+ createUrlProxy: ({ local, ...params }) => {
112
+ const dataCollector = createDataCollector(params);
113
+ const contentResolver = local ? createLocalUrlProxyContentResolver({ errorHandler }) : createRemoteUrlProxyContentResolver();
114
+ return createUrlProxy({
115
+ base: baseUrl,
116
+ contentResolver,
117
+ hasher,
118
+ dataCollector,
119
+ fontTypeExtractor
120
+ });
107
121
  },
108
- log: (message) => logger.info("assets", message)
122
+ defaults: DEFAULTS
109
123
  });
124
+ fontFileDataMap = res.fontFileDataMap;
125
+ consumableMap = res.consumableMap;
110
126
  }
111
127
  return {
112
128
  name: "astro:fonts",
@@ -116,18 +132,20 @@ function fontsPlugin({ settings, sync, logger }) {
116
132
  async buildStart() {
117
133
  if (isBuild) {
118
134
  await initialize({
119
- resolveMod: (id) => import(id),
120
- base: new URL(CACHE_DIR, settings.config.cacheDir)
135
+ cacheDir: new URL(CACHE_DIR, settings.config.cacheDir),
136
+ modResolver: createBuildRemoteFontProviderModResolver(),
137
+ cssRenderer: createMinifiableCssRenderer({ minify: true })
121
138
  });
122
139
  }
123
140
  },
124
141
  async configureServer(server) {
125
142
  await initialize({
126
- resolveMod: (id) => server.ssrLoadModule(id),
127
143
  // In dev, we cache fonts data in .astro so it can be easily inspected and cleared
128
- base: new URL(CACHE_DIR, settings.dotAstroDir)
144
+ cacheDir: new URL(CACHE_DIR, settings.dotAstroDir),
145
+ modResolver: createDevServerRemoteFontProviderModResolver({ server }),
146
+ cssRenderer: createMinifiableCssRenderer({ minify: false })
129
147
  });
130
- const localPaths = [...hashToUrlMap.values()].filter((url) => isAbsolute(url));
148
+ const localPaths = [...fontFileDataMap.values()].filter(({ url }) => isAbsolute(url)).map((v) => v.url);
131
149
  server.watcher.on("change", (path) => {
132
150
  if (localPaths.includes(path)) {
133
151
  logger.info("assets", "Font file updated");
@@ -147,17 +165,17 @@ function fontsPlugin({ settings, sync, logger }) {
147
165
  return next();
148
166
  }
149
167
  const hash = req.url.slice(1);
150
- const url = hashToUrlMap?.get(hash);
151
- if (!url) {
168
+ const associatedData = fontFileDataMap?.get(hash);
169
+ if (!associatedData) {
152
170
  return next();
153
171
  }
154
172
  res.setHeader("Cache-Control", "no-store, no-cache, must-revalidate, max-age=0");
155
173
  res.setHeader("Pragma", "no-cache");
156
174
  res.setHeader("Expires", 0);
157
175
  try {
158
- const data = await cache(storage, hash, () => fetchFont(url));
176
+ const data = await fontFetcher.fetch({ hash, ...associatedData });
159
177
  res.setHeader("Content-Length", data.length);
160
- res.setHeader("Content-Type", `font/${extractFontType(hash)}`);
178
+ res.setHeader("Content-Type", `font/${fontTypeExtractor.extract(hash)}`);
161
179
  res.end(data);
162
180
  } catch (err) {
163
181
  logger.error("assets", "Cannot download font file");
@@ -180,7 +198,7 @@ function fontsPlugin({ settings, sync, logger }) {
180
198
  load(id) {
181
199
  if (id === RESOLVED_VIRTUAL_MODULE_ID) {
182
200
  return {
183
- code: `export const fontsData = new Map(${JSON.stringify(Array.from(resolvedMap?.entries() ?? []))})`
201
+ code: `export const fontsData = new Map(${JSON.stringify(Array.from(consumableMap?.entries() ?? []))})`
184
202
  };
185
203
  }
186
204
  },
@@ -197,11 +215,11 @@ function fontsPlugin({ settings, sync, logger }) {
197
215
  } catch (cause) {
198
216
  throw new AstroError(AstroErrorData.UnknownFilesystemError, { cause });
199
217
  }
200
- if (hashToUrlMap) {
218
+ if (fontFileDataMap) {
201
219
  logger.info("assets", "Copying fonts...");
202
220
  await Promise.all(
203
- Array.from(hashToUrlMap.entries()).map(async ([hash, url]) => {
204
- const data = await cache(storage, hash, () => fetchFont(url));
221
+ Array.from(fontFileDataMap.entries()).map(async ([hash, associatedData]) => {
222
+ const data = await fontFetcher.fetch({ hash, ...associatedData });
205
223
  try {
206
224
  writeFileSync(new URL(hash, fontsDir), data);
207
225
  } catch (cause) {
@@ -112,8 +112,6 @@ async function getImage(options, imageConfig) {
112
112
  if (layout !== "none") {
113
113
  resolvedOptions.style = addCSSVarsToStyle(
114
114
  {
115
- w: String(resolvedOptions.width),
116
- h: String(resolvedOptions.height),
117
115
  fit: cssFitValues.includes(resolvedOptions.fit ?? "") && resolvedOptions.fit,
118
116
  pos: resolvedOptions.position
119
117
  },
@@ -66,7 +66,7 @@ const getWidths = ({
66
66
  if (layout === "fixed") {
67
67
  return originalWidth && width > originalWidth ? [originalWidth] : [width, maxSize];
68
68
  }
69
- if (layout === "responsive") {
69
+ if (layout === "constrained") {
70
70
  return [
71
71
  // Always include the image at 1x and 2x the specified width
72
72
  width,
@@ -86,13 +86,13 @@ const getSizesAttribute = ({
86
86
  switch (layout) {
87
87
  // If screen is wider than the max size then image width is the max size,
88
88
  // otherwise it's the width of the screen
89
- case `responsive`:
89
+ case "constrained":
90
90
  return `(min-width: ${width}px) ${width}px, 100vw`;
91
91
  // Image is always the same width, whatever the size of the screen
92
- case `fixed`:
92
+ case "fixed":
93
93
  return `${width}px`;
94
94
  // Image is always the width of the screen
95
- case `full-width`:
95
+ case "full-width":
96
96
  return `100vw`;
97
97
  case "none":
98
98
  default:
@@ -5,7 +5,7 @@ export type ImageQualityPreset = 'low' | 'mid' | 'high' | 'max' | (string & {});
5
5
  export type ImageQuality = ImageQualityPreset | number;
6
6
  export type ImageInputFormat = (typeof VALID_INPUT_FORMATS)[number];
7
7
  export type ImageOutputFormat = (typeof VALID_OUTPUT_FORMATS)[number] | (string & {});
8
- export type ImageLayout = 'responsive' | 'fixed' | 'full-width' | 'none';
8
+ export type ImageLayout = 'constrained' | 'fixed' | 'full-width' | 'none';
9
9
  export type ImageFit = 'fill' | 'contain' | 'cover' | 'none' | 'scale-down' | (string & {});
10
10
  export type AssetsGlobalStaticImagesList = Map<string, {
11
11
  originalSrcPath: string | undefined;
@@ -140,15 +140,15 @@ type ImageSharedProps<T> = T & {
140
140
  /**
141
141
  * The layout type for responsive images. Requires the `experimental.responsiveImages` flag to be enabled in the Astro config.
142
142
  *
143
- * Allowed values are `responsive`, `fixed`, `full-width` or `none`. Defaults to value of `image.experimentalLayout`.
143
+ * Allowed values are `constrained`, `fixed`, `full-width` or `none`. Defaults to value of `image.experimentalLayout`.
144
144
  *
145
- * - `responsive` - The image will scale to fit the container, maintaining its aspect ratio, but will not exceed the specified dimensions.
145
+ * - `constrained` - The image will scale to fit the container, maintaining its aspect ratio, but will not exceed the specified dimensions.
146
146
  * - `fixed` - The image will maintain its original dimensions.
147
147
  * - `full-width` - The image will scale to fit the container, maintaining its aspect ratio, even if that means the image will exceed its original dimensions.
148
148
  *
149
149
  * **Example**:
150
150
  * ```astro
151
- * <Image src={...} layout="responsive" alt="..." />
151
+ * <Image src={...} layout="constrained" alt="..." />
152
152
  * ```
153
153
  */
154
154
  layout?: ImageLayout;
@@ -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.5") {
156
+ if (previousAstroVersion && previousAstroVersion !== "5.7.7") {
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.5") {
165
- await this.#store.metaStore().set("astro-version", "5.7.5");
164
+ if ("5.7.7") {
165
+ await this.#store.metaStore().set("astro-version", "5.7.7");
166
166
  }
167
167
  if (currentConfigDigest) {
168
168
  await this.#store.metaStore().set("content-config-digest", currentConfigDigest);
@@ -240,7 +240,7 @@ export declare const AstroConfigSchema: z.ZodObject<{
240
240
  hostname?: string | undefined;
241
241
  pathname?: string | undefined;
242
242
  }>, "many">>;
243
- experimentalLayout: z.ZodOptional<z.ZodEnum<["responsive", "fixed", "full-width", "none"]>>;
243
+ experimentalLayout: z.ZodOptional<z.ZodEnum<["constrained", "fixed", "full-width", "none"]>>;
244
244
  experimentalObjectFit: z.ZodOptional<z.ZodString>;
245
245
  experimentalObjectPosition: z.ZodOptional<z.ZodString>;
246
246
  experimentalBreakpoints: z.ZodOptional<z.ZodArray<z.ZodNumber, "many">>;
@@ -260,7 +260,7 @@ export declare const AstroConfigSchema: z.ZodObject<{
260
260
  hostname?: string | undefined;
261
261
  pathname?: string | undefined;
262
262
  }[];
263
- experimentalLayout?: "none" | "fixed" | "responsive" | "full-width" | undefined;
263
+ experimentalLayout?: "none" | "fixed" | "constrained" | "full-width" | undefined;
264
264
  experimentalObjectFit?: string | undefined;
265
265
  experimentalObjectPosition?: string | undefined;
266
266
  experimentalBreakpoints?: number[] | undefined;
@@ -280,7 +280,7 @@ export declare const AstroConfigSchema: z.ZodObject<{
280
280
  hostname?: string | undefined;
281
281
  pathname?: string | undefined;
282
282
  }[] | undefined;
283
- experimentalLayout?: "none" | "fixed" | "responsive" | "full-width" | undefined;
283
+ experimentalLayout?: "none" | "fixed" | "constrained" | "full-width" | undefined;
284
284
  experimentalObjectFit?: string | undefined;
285
285
  experimentalObjectPosition?: string | undefined;
286
286
  experimentalBreakpoints?: number[] | undefined;
@@ -728,7 +728,7 @@ export declare const AstroConfigSchema: z.ZodObject<{
728
728
  name: z.ZodString;
729
729
  cssVariable: z.ZodString;
730
730
  }, {
731
- fallbacks: z.ZodOptional<z.ZodArray<z.ZodString, "atleastone">>;
731
+ fallbacks: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
732
732
  optimizedFallbacks: z.ZodOptional<z.ZodBoolean>;
733
733
  }>, {
734
734
  provider: z.ZodLiteral<"local">;
@@ -817,7 +817,7 @@ export declare const AstroConfigSchema: z.ZodObject<{
817
817
  featureSettings?: string | undefined;
818
818
  variationSettings?: string | undefined;
819
819
  }[]];
820
- fallbacks?: [string, ...string[]] | undefined;
820
+ fallbacks?: string[] | undefined;
821
821
  optimizedFallbacks?: boolean | undefined;
822
822
  }, {
823
823
  name: string;
@@ -854,7 +854,7 @@ export declare const AstroConfigSchema: z.ZodObject<{
854
854
  featureSettings?: string | undefined;
855
855
  variationSettings?: string | undefined;
856
856
  }[]];
857
- fallbacks?: [string, ...string[]] | undefined;
857
+ fallbacks?: string[] | undefined;
858
858
  optimizedFallbacks?: boolean | undefined;
859
859
  }>, z.ZodObject<z.objectUtil.extendShape<z.objectUtil.extendShape<z.objectUtil.extendShape<{
860
860
  name: z.ZodString;
@@ -868,7 +868,7 @@ export declare const AstroConfigSchema: z.ZodObject<{
868
868
  featureSettings: z.ZodOptional<z.ZodString>;
869
869
  variationSettings: z.ZodOptional<z.ZodString>;
870
870
  }, "style" | "weight">>, {
871
- fallbacks: z.ZodOptional<z.ZodArray<z.ZodString, "atleastone">>;
871
+ fallbacks: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
872
872
  optimizedFallbacks: z.ZodOptional<z.ZodBoolean>;
873
873
  }>, {
874
874
  provider: z.ZodObject<{
@@ -891,7 +891,7 @@ export declare const AstroConfigSchema: z.ZodObject<{
891
891
  entrypoint: string | URL;
892
892
  config?: Record<string, any> | undefined;
893
893
  };
894
- fallbacks?: [string, ...string[]] | undefined;
894
+ fallbacks?: string[] | undefined;
895
895
  optimizedFallbacks?: boolean | undefined;
896
896
  display?: "fallback" | "auto" | "optional" | "block" | "swap" | undefined;
897
897
  unicodeRange?: [string, ...string[]] | undefined;
@@ -908,7 +908,7 @@ export declare const AstroConfigSchema: z.ZodObject<{
908
908
  entrypoint: string | URL;
909
909
  config?: Record<string, any> | undefined;
910
910
  };
911
- fallbacks?: [string, ...string[]] | undefined;
911
+ fallbacks?: string[] | undefined;
912
912
  optimizedFallbacks?: boolean | undefined;
913
913
  display?: "fallback" | "auto" | "optional" | "block" | "swap" | undefined;
914
914
  unicodeRange?: [string, ...string[]] | undefined;
@@ -960,7 +960,7 @@ export declare const AstroConfigSchema: z.ZodObject<{
960
960
  featureSettings?: string | undefined;
961
961
  variationSettings?: string | undefined;
962
962
  }[]];
963
- fallbacks?: [string, ...string[]] | undefined;
963
+ fallbacks?: string[] | undefined;
964
964
  optimizedFallbacks?: boolean | undefined;
965
965
  } | {
966
966
  name: string;
@@ -969,7 +969,7 @@ export declare const AstroConfigSchema: z.ZodObject<{
969
969
  entrypoint: string | URL;
970
970
  config?: Record<string, any> | undefined;
971
971
  };
972
- fallbacks?: [string, ...string[]] | undefined;
972
+ fallbacks?: string[] | undefined;
973
973
  optimizedFallbacks?: boolean | undefined;
974
974
  display?: "fallback" | "auto" | "optional" | "block" | "swap" | undefined;
975
975
  unicodeRange?: [string, ...string[]] | undefined;
@@ -1021,7 +1021,7 @@ export declare const AstroConfigSchema: z.ZodObject<{
1021
1021
  featureSettings?: string | undefined;
1022
1022
  variationSettings?: string | undefined;
1023
1023
  }[]];
1024
- fallbacks?: [string, ...string[]] | undefined;
1024
+ fallbacks?: string[] | undefined;
1025
1025
  optimizedFallbacks?: boolean | undefined;
1026
1026
  } | {
1027
1027
  name: string;
@@ -1030,7 +1030,7 @@ export declare const AstroConfigSchema: z.ZodObject<{
1030
1030
  entrypoint: string | URL;
1031
1031
  config?: Record<string, any> | undefined;
1032
1032
  };
1033
- fallbacks?: [string, ...string[]] | undefined;
1033
+ fallbacks?: string[] | undefined;
1034
1034
  optimizedFallbacks?: boolean | undefined;
1035
1035
  display?: "fallback" | "auto" | "optional" | "block" | "swap" | undefined;
1036
1036
  unicodeRange?: [string, ...string[]] | undefined;
@@ -1106,7 +1106,7 @@ export declare const AstroConfigSchema: z.ZodObject<{
1106
1106
  hostname?: string | undefined;
1107
1107
  pathname?: string | undefined;
1108
1108
  }[];
1109
- experimentalLayout?: "none" | "fixed" | "responsive" | "full-width" | undefined;
1109
+ experimentalLayout?: "none" | "fixed" | "constrained" | "full-width" | undefined;
1110
1110
  experimentalObjectFit?: string | undefined;
1111
1111
  experimentalObjectPosition?: string | undefined;
1112
1112
  experimentalBreakpoints?: number[] | undefined;
@@ -1221,7 +1221,7 @@ export declare const AstroConfigSchema: z.ZodObject<{
1221
1221
  featureSettings?: string | undefined;
1222
1222
  variationSettings?: string | undefined;
1223
1223
  }[]];
1224
- fallbacks?: [string, ...string[]] | undefined;
1224
+ fallbacks?: string[] | undefined;
1225
1225
  optimizedFallbacks?: boolean | undefined;
1226
1226
  } | {
1227
1227
  name: string;
@@ -1230,7 +1230,7 @@ export declare const AstroConfigSchema: z.ZodObject<{
1230
1230
  entrypoint: string | URL;
1231
1231
  config?: Record<string, any> | undefined;
1232
1232
  };
1233
- fallbacks?: [string, ...string[]] | undefined;
1233
+ fallbacks?: string[] | undefined;
1234
1234
  optimizedFallbacks?: boolean | undefined;
1235
1235
  display?: "fallback" | "auto" | "optional" | "block" | "swap" | undefined;
1236
1236
  unicodeRange?: [string, ...string[]] | undefined;
@@ -1338,7 +1338,7 @@ export declare const AstroConfigSchema: z.ZodObject<{
1338
1338
  hostname?: string | undefined;
1339
1339
  pathname?: string | undefined;
1340
1340
  }[] | undefined;
1341
- experimentalLayout?: "none" | "fixed" | "responsive" | "full-width" | undefined;
1341
+ experimentalLayout?: "none" | "fixed" | "constrained" | "full-width" | undefined;
1342
1342
  experimentalObjectFit?: string | undefined;
1343
1343
  experimentalObjectPosition?: string | undefined;
1344
1344
  experimentalBreakpoints?: number[] | undefined;
@@ -1480,7 +1480,7 @@ export declare const AstroConfigSchema: z.ZodObject<{
1480
1480
  featureSettings?: string | undefined;
1481
1481
  variationSettings?: string | undefined;
1482
1482
  }[]];
1483
- fallbacks?: [string, ...string[]] | undefined;
1483
+ fallbacks?: string[] | undefined;
1484
1484
  optimizedFallbacks?: boolean | undefined;
1485
1485
  } | {
1486
1486
  name: string;
@@ -1489,7 +1489,7 @@ export declare const AstroConfigSchema: z.ZodObject<{
1489
1489
  entrypoint: string | URL;
1490
1490
  config?: Record<string, any> | undefined;
1491
1491
  };
1492
- fallbacks?: [string, ...string[]] | undefined;
1492
+ fallbacks?: string[] | undefined;
1493
1493
  optimizedFallbacks?: boolean | undefined;
1494
1494
  display?: "fallback" | "auto" | "optional" | "block" | "swap" | undefined;
1495
1495
  unicodeRange?: [string, ...string[]] | undefined;
@@ -146,7 +146,7 @@ const AstroConfigSchema = z.object({
146
146
  pathname: z.string().optional()
147
147
  })
148
148
  ).default([]),
149
- experimentalLayout: z.enum(["responsive", "fixed", "full-width", "none"]).optional(),
149
+ experimentalLayout: z.enum(["constrained", "fixed", "full-width", "none"]).optional(),
150
150
  experimentalObjectFit: z.string().optional(),
151
151
  experimentalObjectPosition: z.string().optional(),
152
152
  experimentalBreakpoints: z.array(z.number()).optional()