astro 5.16.13 → 5.16.14

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 (84) hide show
  1. package/components/Font.astro +4 -4
  2. package/dist/assets/fonts/config.d.ts +15 -145
  3. package/dist/assets/fonts/config.js +3 -22
  4. package/dist/assets/fonts/constants.d.ts +0 -1
  5. package/dist/assets/fonts/constants.js +0 -2
  6. package/dist/assets/fonts/core/collect-component-data.d.ts +9 -0
  7. package/dist/assets/fonts/core/collect-component-data.js +47 -0
  8. package/dist/assets/fonts/core/collect-font-assets-from-faces.d.ts +17 -0
  9. package/dist/assets/fonts/core/collect-font-assets-from-faces.js +71 -0
  10. package/dist/assets/fonts/core/collect-font-data.d.ts +4 -0
  11. package/dist/assets/fonts/core/collect-font-data.js +23 -0
  12. package/dist/assets/fonts/core/compute-font-families-assets.d.ts +20 -0
  13. package/dist/assets/fonts/core/compute-font-families-assets.js +67 -0
  14. package/dist/assets/fonts/core/filter-and-transform-font-faces.d.ts +20 -0
  15. package/dist/assets/fonts/core/filter-and-transform-font-faces.js +39 -0
  16. package/dist/assets/fonts/core/get-or-create-font-family-assets.d.ts +8 -0
  17. package/dist/assets/fonts/core/get-or-create-font-family-assets.js +34 -0
  18. package/dist/assets/fonts/core/optimize-fallbacks.d.ts +2 -3
  19. package/dist/assets/fonts/core/optimize-fallbacks.js +2 -3
  20. package/dist/assets/fonts/core/resolve-family.d.ts +6 -0
  21. package/dist/assets/fonts/core/resolve-family.js +23 -0
  22. package/dist/assets/fonts/definitions.d.ts +6 -28
  23. package/dist/assets/fonts/infra/build-font-file-id-generator.d.ts +13 -0
  24. package/dist/assets/fonts/infra/{build-url-proxy-hash-resolver.js → build-font-file-id-generator.js} +3 -6
  25. package/dist/assets/fonts/infra/build-url-resolver.d.ts +1 -1
  26. package/dist/assets/fonts/infra/build-url-resolver.js +4 -4
  27. package/dist/assets/fonts/infra/cached-font-fetcher.d.ts +1 -1
  28. package/dist/assets/fonts/infra/cached-font-fetcher.js +11 -3
  29. package/dist/assets/fonts/infra/capsize-font-metrics-resolver.d.ts +2 -2
  30. package/dist/assets/fonts/infra/dev-font-file-id-generator.d.ts +16 -0
  31. package/dist/assets/fonts/infra/{dev-url-proxy-hash-resolver.js → dev-font-file-id-generator.js} +8 -8
  32. package/dist/assets/fonts/infra/dev-url-resolver.d.ts +1 -1
  33. package/dist/assets/fonts/infra/dev-url-resolver.js +2 -2
  34. package/dist/assets/fonts/infra/fs-font-file-content-resolver.d.ts +10 -0
  35. package/dist/assets/fonts/infra/fs-font-file-content-resolver.js +21 -0
  36. package/dist/assets/fonts/infra/minifiable-css-renderer.d.ts +2 -1
  37. package/dist/assets/fonts/infra/{font-type-extractor.d.ts → node-font-type-extractor.d.ts} +1 -1
  38. package/dist/assets/fonts/infra/{font-type-extractor.js → node-font-type-extractor.js} +2 -2
  39. package/dist/assets/fonts/infra/unifont-font-resolver.d.ts +5 -3
  40. package/dist/assets/fonts/infra/unifont-font-resolver.js +14 -17
  41. package/dist/assets/fonts/providers/index.d.ts +6 -1
  42. package/dist/assets/fonts/providers/index.js +9 -1
  43. package/dist/assets/fonts/providers/local.d.ts +41 -8
  44. package/dist/assets/fonts/providers/local.js +65 -48
  45. package/dist/assets/fonts/runtime/client.d.ts +1 -1
  46. package/dist/assets/fonts/runtime/client.js +1 -1
  47. package/dist/assets/fonts/runtime/server.d.ts +1 -1
  48. package/dist/assets/fonts/runtime/server.js +1 -1
  49. package/dist/assets/fonts/types.d.ts +61 -110
  50. package/dist/assets/fonts/utils.d.ts +1 -7
  51. package/dist/assets/fonts/utils.js +1 -15
  52. package/dist/assets/fonts/vite-plugin-fonts.js +149 -141
  53. package/dist/cli/add/index.js +39 -0
  54. package/dist/cli/infra/build-time-astro-version-provider.js +1 -1
  55. package/dist/config/index.d.ts +1 -2
  56. package/dist/content/content-layer.js +3 -3
  57. package/dist/core/config/schemas/base.d.ts +60 -337
  58. package/dist/core/config/schemas/base.js +2 -2
  59. package/dist/core/config/schemas/relative.d.ts +80 -431
  60. package/dist/core/constants.js +1 -1
  61. package/dist/core/dev/dev.js +1 -1
  62. package/dist/core/errors/errors-data.d.ts +1 -1
  63. package/dist/core/errors/errors-data.js +1 -1
  64. package/dist/core/messages.js +2 -2
  65. package/dist/types/public/config.d.ts +3 -4
  66. package/package.json +5 -5
  67. package/dist/assets/fonts/core/normalize-remote-font-faces.d.ts +0 -7
  68. package/dist/assets/fonts/core/normalize-remote-font-faces.js +0 -41
  69. package/dist/assets/fonts/core/resolve-families.d.ts +0 -16
  70. package/dist/assets/fonts/core/resolve-families.js +0 -63
  71. package/dist/assets/fonts/infra/build-url-proxy-hash-resolver.d.ts +0 -15
  72. package/dist/assets/fonts/infra/data-collector.d.ts +0 -10
  73. package/dist/assets/fonts/infra/data-collector.js +0 -35
  74. package/dist/assets/fonts/infra/dev-url-proxy-hash-resolver.d.ts +0 -15
  75. package/dist/assets/fonts/infra/local-url-proxy-content-resolver.d.ts +0 -4
  76. package/dist/assets/fonts/infra/local-url-proxy-content-resolver.js +0 -14
  77. package/dist/assets/fonts/infra/remote-url-proxy-content-resolver.d.ts +0 -4
  78. package/dist/assets/fonts/infra/remote-url-proxy-content-resolver.js +0 -9
  79. package/dist/assets/fonts/infra/require-local-provider-url-resolver.d.ts +0 -9
  80. package/dist/assets/fonts/infra/require-local-provider-url-resolver.js +0 -30
  81. package/dist/assets/fonts/infra/url-proxy.d.ts +0 -16
  82. package/dist/assets/fonts/infra/url-proxy.js +0 -50
  83. package/dist/assets/fonts/orchestrate.d.ts +0 -42
  84. package/dist/assets/fonts/orchestrate.js +0 -173
@@ -4,8 +4,8 @@ import { filterPreloads } from '../dist/assets/fonts/core/filter-preloads.js';
4
4
  import { AstroError, AstroErrorData } from '../dist/core/errors/index.js';
5
5
 
6
6
  // TODO: remove check when fonts are stabilized
7
- const { internalConsumableMap } = mod;
8
- if (!internalConsumableMap) {
7
+ const { componentDataByCssVariable } = mod;
8
+ if (!componentDataByCssVariable) {
9
9
  throw new AstroError(AstroErrorData.ExperimentalFontsNotEnabled);
10
10
  }
11
11
 
@@ -17,7 +17,7 @@ interface Props {
17
17
  }
18
18
 
19
19
  const { cssVariable, preload = false } = Astro.props as Props;
20
- const data = internalConsumableMap.get(cssVariable);
20
+ const data = componentDataByCssVariable.get(cssVariable);
21
21
  if (!data) {
22
22
  throw new AstroError({
23
23
  ...AstroErrorData.FontFamilyNotFound,
@@ -25,7 +25,7 @@ if (!data) {
25
25
  });
26
26
  }
27
27
 
28
- const filteredPreloadData = filterPreloads(data.preloadData, preload);
28
+ const filteredPreloadData = filterPreloads(data.preloads, preload);
29
29
  ---
30
30
 
31
31
  <style set:html={data.css}></style>
@@ -2,136 +2,6 @@ import { z } from 'zod';
2
2
  export declare const weightSchema: z.ZodUnion<[z.ZodString, z.ZodNumber]>;
3
3
  export declare const styleSchema: z.ZodEnum<["normal", "italic", "oblique"]>;
4
4
  export declare const displaySchema: z.ZodEnum<["auto", "block", "swap", "fallback", "optional"]>;
5
- export declare const localFontFamilySchema: z.ZodObject<{
6
- provider: z.ZodLiteral<"local">;
7
- variants: z.ZodArray<z.ZodObject<{
8
- src: z.ZodArray<z.ZodUnion<[z.ZodUnion<[z.ZodString, z.ZodType<URL, z.ZodTypeDef, URL>]>, z.ZodObject<{
9
- url: z.ZodUnion<[z.ZodString, z.ZodType<URL, z.ZodTypeDef, URL>]>;
10
- tech: z.ZodOptional<z.ZodString>;
11
- }, "strict", z.ZodTypeAny, {
12
- url: string | URL;
13
- tech?: string | undefined;
14
- }, {
15
- url: string | URL;
16
- tech?: string | undefined;
17
- }>]>, "atleastone">;
18
- weight: z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodNumber]>>;
19
- style: z.ZodOptional<z.ZodEnum<["normal", "italic", "oblique"]>>;
20
- display: z.ZodOptional<z.ZodEnum<["auto", "block", "swap", "fallback", "optional"]>>;
21
- stretch: z.ZodOptional<z.ZodString>;
22
- featureSettings: z.ZodOptional<z.ZodString>;
23
- variationSettings: z.ZodOptional<z.ZodString>;
24
- unicodeRange: z.ZodOptional<z.ZodArray<z.ZodString, "atleastone">>;
25
- }, "strict", z.ZodTypeAny, {
26
- src: [string | URL | {
27
- url: string | URL;
28
- tech?: string | undefined;
29
- }, ...(string | URL | {
30
- url: string | URL;
31
- tech?: string | undefined;
32
- })[]];
33
- weight?: string | number | undefined;
34
- style?: "normal" | "italic" | "oblique" | undefined;
35
- display?: "auto" | "block" | "swap" | "fallback" | "optional" | undefined;
36
- stretch?: string | undefined;
37
- featureSettings?: string | undefined;
38
- variationSettings?: string | undefined;
39
- unicodeRange?: [string, ...string[]] | undefined;
40
- }, {
41
- src: [string | URL | {
42
- url: string | URL;
43
- tech?: string | undefined;
44
- }, ...(string | URL | {
45
- url: string | URL;
46
- tech?: string | undefined;
47
- })[]];
48
- weight?: string | number | undefined;
49
- style?: "normal" | "italic" | "oblique" | undefined;
50
- display?: "auto" | "block" | "swap" | "fallback" | "optional" | undefined;
51
- stretch?: string | undefined;
52
- featureSettings?: string | undefined;
53
- variationSettings?: string | undefined;
54
- unicodeRange?: [string, ...string[]] | undefined;
55
- }>, "atleastone">;
56
- fallbacks: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
57
- optimizedFallbacks: z.ZodOptional<z.ZodBoolean>;
58
- name: z.ZodString;
59
- cssVariable: z.ZodString;
60
- }, "strict", z.ZodTypeAny, {
61
- name: string;
62
- cssVariable: string;
63
- provider: "local";
64
- variants: [{
65
- src: [string | URL | {
66
- url: string | URL;
67
- tech?: string | undefined;
68
- }, ...(string | URL | {
69
- url: string | URL;
70
- tech?: string | undefined;
71
- })[]];
72
- weight?: string | number | undefined;
73
- style?: "normal" | "italic" | "oblique" | undefined;
74
- display?: "auto" | "block" | "swap" | "fallback" | "optional" | undefined;
75
- stretch?: string | undefined;
76
- featureSettings?: string | undefined;
77
- variationSettings?: string | undefined;
78
- unicodeRange?: [string, ...string[]] | undefined;
79
- }, ...{
80
- src: [string | URL | {
81
- url: string | URL;
82
- tech?: string | undefined;
83
- }, ...(string | URL | {
84
- url: string | URL;
85
- tech?: string | undefined;
86
- })[]];
87
- weight?: string | number | undefined;
88
- style?: "normal" | "italic" | "oblique" | undefined;
89
- display?: "auto" | "block" | "swap" | "fallback" | "optional" | undefined;
90
- stretch?: string | undefined;
91
- featureSettings?: string | undefined;
92
- variationSettings?: string | undefined;
93
- unicodeRange?: [string, ...string[]] | undefined;
94
- }[]];
95
- fallbacks?: string[] | undefined;
96
- optimizedFallbacks?: boolean | undefined;
97
- }, {
98
- name: string;
99
- cssVariable: string;
100
- provider: "local";
101
- variants: [{
102
- src: [string | URL | {
103
- url: string | URL;
104
- tech?: string | undefined;
105
- }, ...(string | URL | {
106
- url: string | URL;
107
- tech?: string | undefined;
108
- })[]];
109
- weight?: string | number | undefined;
110
- style?: "normal" | "italic" | "oblique" | undefined;
111
- display?: "auto" | "block" | "swap" | "fallback" | "optional" | undefined;
112
- stretch?: string | undefined;
113
- featureSettings?: string | undefined;
114
- variationSettings?: string | undefined;
115
- unicodeRange?: [string, ...string[]] | undefined;
116
- }, ...{
117
- src: [string | URL | {
118
- url: string | URL;
119
- tech?: string | undefined;
120
- }, ...(string | URL | {
121
- url: string | URL;
122
- tech?: string | undefined;
123
- })[]];
124
- weight?: string | number | undefined;
125
- style?: "normal" | "italic" | "oblique" | undefined;
126
- display?: "auto" | "block" | "swap" | "fallback" | "optional" | undefined;
127
- stretch?: string | undefined;
128
- featureSettings?: string | undefined;
129
- variationSettings?: string | undefined;
130
- unicodeRange?: [string, ...string[]] | undefined;
131
- }[]];
132
- fallbacks?: string[] | undefined;
133
- optimizedFallbacks?: boolean | undefined;
134
- }>;
135
5
  export declare const fontProviderSchema: z.ZodObject<{
136
6
  name: z.ZodString;
137
7
  config: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
@@ -167,7 +37,7 @@ export declare const fontProviderSchema: z.ZodObject<{
167
37
  init?: ((context: import("./types.js").FontProviderInitContext) => void | Promise<void>) | undefined;
168
38
  listFonts?: (() => string[] | Promise<string[] | undefined> | undefined) | undefined;
169
39
  }>;
170
- export declare const remoteFontFamilySchema: z.ZodObject<{
40
+ export declare const fontFamilySchema: z.ZodObject<{
171
41
  provider: z.ZodObject<{
172
42
  name: z.ZodString;
173
43
  config: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
@@ -231,18 +101,18 @@ export declare const remoteFontFamilySchema: z.ZodObject<{
231
101
  init?: ((context: import("./types.js").FontProviderInitContext) => void | Promise<void>) | undefined;
232
102
  listFonts?: (() => string[] | Promise<string[] | undefined> | undefined) | undefined;
233
103
  };
234
- options?: Record<string, any> | undefined;
104
+ weights?: [string | number, ...(string | number)[]] | undefined;
105
+ styles?: ["normal" | "italic" | "oblique", ...("normal" | "italic" | "oblique")[]] | undefined;
106
+ subsets?: [string, ...string[]] | undefined;
107
+ fallbacks?: string[] | undefined;
108
+ optimizedFallbacks?: boolean | undefined;
109
+ formats?: ["woff2" | "woff" | "otf" | "ttf" | "eot", ...("woff2" | "woff" | "otf" | "ttf" | "eot")[]] | undefined;
235
110
  display?: "auto" | "block" | "swap" | "fallback" | "optional" | undefined;
236
111
  stretch?: string | undefined;
237
112
  featureSettings?: string | undefined;
238
113
  variationSettings?: string | undefined;
239
114
  unicodeRange?: [string, ...string[]] | undefined;
240
- fallbacks?: string[] | undefined;
241
- optimizedFallbacks?: boolean | undefined;
242
- weights?: [string | number, ...(string | number)[]] | undefined;
243
- styles?: ["normal" | "italic" | "oblique", ...("normal" | "italic" | "oblique")[]] | undefined;
244
- subsets?: [string, ...string[]] | undefined;
245
- formats?: ["woff2" | "woff" | "otf" | "ttf" | "eot", ...("woff2" | "woff" | "otf" | "ttf" | "eot")[]] | undefined;
115
+ options?: Record<string, any> | undefined;
246
116
  }, {
247
117
  name: string;
248
118
  cssVariable: string;
@@ -257,16 +127,16 @@ export declare const remoteFontFamilySchema: z.ZodObject<{
257
127
  init?: ((context: import("./types.js").FontProviderInitContext) => void | Promise<void>) | undefined;
258
128
  listFonts?: (() => string[] | Promise<string[] | undefined> | undefined) | undefined;
259
129
  };
260
- options?: Record<string, any> | undefined;
130
+ weights?: [string | number, ...(string | number)[]] | undefined;
131
+ styles?: ["normal" | "italic" | "oblique", ...("normal" | "italic" | "oblique")[]] | undefined;
132
+ subsets?: [string, ...string[]] | undefined;
133
+ fallbacks?: string[] | undefined;
134
+ optimizedFallbacks?: boolean | undefined;
135
+ formats?: ["woff2" | "woff" | "otf" | "ttf" | "eot", ...("woff2" | "woff" | "otf" | "ttf" | "eot")[]] | undefined;
261
136
  display?: "auto" | "block" | "swap" | "fallback" | "optional" | undefined;
262
137
  stretch?: string | undefined;
263
138
  featureSettings?: string | undefined;
264
139
  variationSettings?: string | undefined;
265
140
  unicodeRange?: [string, ...string[]] | undefined;
266
- fallbacks?: string[] | undefined;
267
- optimizedFallbacks?: boolean | undefined;
268
- weights?: [string | number, ...(string | number)[]] | undefined;
269
- styles?: ["normal" | "italic" | "oblique", ...("normal" | "italic" | "oblique")[]] | undefined;
270
- subsets?: [string, ...string[]] | undefined;
271
- formats?: ["woff2" | "woff" | "otf" | "ttf" | "eot", ...("woff2" | "woff" | "otf" | "ttf" | "eot")[]] | undefined;
141
+ options?: Record<string, any> | undefined;
272
142
  }>;
@@ -1,5 +1,5 @@
1
1
  import { z } from "zod";
2
- import { FONT_TYPES, LOCAL_PROVIDER_NAME } from "./constants.js";
2
+ import { FONT_TYPES } from "./constants.js";
3
3
  const weightSchema = z.union([z.string(), z.number()]);
4
4
  const styleSchema = z.enum(["normal", "italic", "oblique"]);
5
5
  const displaySchema = z.enum(["auto", "block", "swap", "fallback", "optional"]);
@@ -20,24 +20,6 @@ const requiredFamilyAttributesSchema = z.object({
20
20
  name: z.string(),
21
21
  cssVariable: z.string()
22
22
  });
23
- const entrypointSchema = z.union([z.string(), z.instanceof(URL)]);
24
- const localFontFamilySchema = z.object({
25
- ...requiredFamilyAttributesSchema.shape,
26
- ...fallbacksSchema.shape,
27
- provider: z.literal(LOCAL_PROVIDER_NAME),
28
- variants: z.array(
29
- z.object({
30
- ...familyPropertiesSchema.shape,
31
- src: z.array(
32
- z.union([
33
- entrypointSchema,
34
- z.object({ url: entrypointSchema, tech: z.string().optional() }).strict()
35
- ])
36
- ).nonempty()
37
- // TODO: find a way to support subsets (through fontkit?)
38
- }).strict()
39
- ).nonempty()
40
- }).strict();
41
23
  const fontProviderSchema = z.object({
42
24
  name: z.string(),
43
25
  config: z.record(z.string(), z.any()).optional(),
@@ -45,7 +27,7 @@ const fontProviderSchema = z.object({
45
27
  resolveFont: z.custom((v) => typeof v === "function"),
46
28
  listFonts: z.custom((v) => typeof v === "function").optional()
47
29
  }).strict();
48
- const remoteFontFamilySchema = z.object({
30
+ const fontFamilySchema = z.object({
49
31
  ...requiredFamilyAttributesSchema.shape,
50
32
  ...fallbacksSchema.shape,
51
33
  ...familyPropertiesSchema.omit({
@@ -61,9 +43,8 @@ const remoteFontFamilySchema = z.object({
61
43
  }).strict();
62
44
  export {
63
45
  displaySchema,
46
+ fontFamilySchema,
64
47
  fontProviderSchema,
65
- localFontFamilySchema,
66
- remoteFontFamilySchema,
67
48
  styleSchema,
68
49
  weightSchema
69
50
  };
@@ -1,5 +1,4 @@
1
1
  import type { Defaults, FontType } from './types.js';
2
- export declare const LOCAL_PROVIDER_NAME = "local";
3
2
  export declare const DEFAULTS: Defaults;
4
3
  export declare const VIRTUAL_MODULE_ID = "virtual:astro:assets/fonts/internal";
5
4
  export declare const RESOLVED_VIRTUAL_MODULE_ID: string;
@@ -1,4 +1,3 @@
1
- const LOCAL_PROVIDER_NAME = "local";
2
1
  const DEFAULTS = {
3
2
  weights: ["400"],
4
3
  styles: ["normal", "italic"],
@@ -49,7 +48,6 @@ export {
49
48
  FONT_FORMATS,
50
49
  FONT_TYPES,
51
50
  GENERIC_FALLBACK_NAMES,
52
- LOCAL_PROVIDER_NAME,
53
51
  RESOLVED_BUFFER_VIRTUAL_MODULE_ID_PREFIX,
54
52
  RESOLVED_RUNTIME_VIRTUAL_MODULE_ID,
55
53
  RESOLVED_VIRTUAL_MODULE_ID,
@@ -0,0 +1,9 @@
1
+ import type { CssRenderer } from '../definitions.js';
2
+ import type { Collaborator, ComponentDataByCssVariable, Defaults, FontFamilyAssets } from '../types.js';
3
+ import type { optimizeFallbacks as _optimizeFallbacks } from './optimize-fallbacks.js';
4
+ export declare function collectComponentData({ fontFamilyAssets, cssRenderer, defaults, optimizeFallbacks, }: {
5
+ fontFamilyAssets: Array<FontFamilyAssets>;
6
+ cssRenderer: CssRenderer;
7
+ defaults: Pick<Defaults, 'fallbacks' | 'optimizedFallbacks'>;
8
+ optimizeFallbacks: Collaborator<typeof _optimizeFallbacks, 'family' | 'fallbacks' | 'collectedFonts'>;
9
+ }): Promise<ComponentDataByCssVariable>;
@@ -0,0 +1,47 @@
1
+ import { unifontFontFaceDataToProperties } from "../utils.js";
2
+ async function collectComponentData({
3
+ fontFamilyAssets,
4
+ cssRenderer,
5
+ defaults,
6
+ optimizeFallbacks
7
+ }) {
8
+ const componentDataByCssVariable = /* @__PURE__ */ new Map();
9
+ for (const { family, fonts, collectedFontsForMetricsByUniqueKey, preloads } of fontFamilyAssets) {
10
+ let css = "";
11
+ for (const data of fonts) {
12
+ css += cssRenderer.generateFontFace(
13
+ family.uniqueName,
14
+ unifontFontFaceDataToProperties({
15
+ src: data.src,
16
+ weight: data.weight,
17
+ style: data.style,
18
+ // User settings override the generated font settings
19
+ display: data.display ?? family.display,
20
+ unicodeRange: data.unicodeRange ?? family.unicodeRange,
21
+ stretch: data.stretch ?? family.stretch,
22
+ featureSettings: data.featureSettings ?? family.featureSettings,
23
+ variationSettings: data.variationSettings ?? family.variationSettings
24
+ })
25
+ );
26
+ }
27
+ const fallbacks = family.fallbacks ?? defaults.fallbacks;
28
+ const cssVarValues = [family.uniqueName];
29
+ const optimizeFallbacksResult = family.optimizedFallbacks ?? defaults.optimizedFallbacks ? await optimizeFallbacks({
30
+ family,
31
+ fallbacks,
32
+ collectedFonts: Array.from(collectedFontsForMetricsByUniqueKey.values())
33
+ }) : null;
34
+ if (optimizeFallbacksResult) {
35
+ css += optimizeFallbacksResult.css;
36
+ cssVarValues.push(...optimizeFallbacksResult.fallbacks);
37
+ } else {
38
+ cssVarValues.push(...fallbacks);
39
+ }
40
+ css += cssRenderer.generateCssVariable(family.cssVariable, cssVarValues);
41
+ componentDataByCssVariable.set(family.cssVariable, { preloads, css });
42
+ }
43
+ return componentDataByCssVariable;
44
+ }
45
+ export {
46
+ collectComponentData
47
+ };
@@ -0,0 +1,17 @@
1
+ import type * as unifont from 'unifont';
2
+ import type { FontFileIdGenerator, Hasher } from '../definitions.js';
3
+ import type { Defaults, FontFileById, PreloadData, ResolvedFontFamily } from '../types.js';
4
+ import type { CollectedFontForMetrics } from './optimize-fallbacks.js';
5
+ export declare function collectFontAssetsFromFaces({ fonts, fontFileIdGenerator, family, fontFilesIds, collectedFontsIds, hasher, defaults, }: {
6
+ fonts: Array<unifont.FontFaceData>;
7
+ fontFileIdGenerator: FontFileIdGenerator;
8
+ family: Pick<ResolvedFontFamily, 'cssVariable' | 'fallbacks'>;
9
+ fontFilesIds: Set<string>;
10
+ collectedFontsIds: Set<string>;
11
+ hasher: Hasher;
12
+ defaults: Pick<Defaults, 'fallbacks'>;
13
+ }): {
14
+ fontFileById: FontFileById;
15
+ preloads: PreloadData[];
16
+ collectedFontsForMetricsByUniqueKey: Map<string, CollectedFontForMetrics>;
17
+ };
@@ -0,0 +1,71 @@
1
+ import { FONT_FORMATS } from "../constants.js";
2
+ import { renderFontWeight } from "../utils.js";
3
+ function collectFontAssetsFromFaces({
4
+ fonts,
5
+ fontFileIdGenerator,
6
+ family,
7
+ fontFilesIds,
8
+ collectedFontsIds,
9
+ hasher,
10
+ defaults
11
+ }) {
12
+ const fontFileById = /* @__PURE__ */ new Map();
13
+ const collectedFontsForMetricsByUniqueKey = /* @__PURE__ */ new Map();
14
+ const preloads = [];
15
+ for (const font of fonts) {
16
+ let index = 0;
17
+ for (const source of font.src) {
18
+ if ("name" in source) {
19
+ continue;
20
+ }
21
+ const format = FONT_FORMATS.find((e) => e.format === source.format);
22
+ const originalUrl = source.originalURL;
23
+ const id = fontFileIdGenerator.generate({
24
+ cssVariable: family.cssVariable,
25
+ font,
26
+ originalUrl,
27
+ type: format.type
28
+ });
29
+ if (!fontFilesIds.has(id) && !fontFileById.has(id)) {
30
+ fontFileById.set(id, { url: originalUrl, init: font.meta?.init });
31
+ if (index === 0) {
32
+ preloads.push({
33
+ style: font.style,
34
+ subset: font.meta?.subset,
35
+ type: format.type,
36
+ url: source.url,
37
+ weight: renderFontWeight(font.weight)
38
+ });
39
+ }
40
+ }
41
+ const collected = {
42
+ id,
43
+ url: originalUrl,
44
+ init: font.meta?.init,
45
+ data: {
46
+ weight: font.weight,
47
+ style: font.style,
48
+ meta: {
49
+ subset: font.meta?.subset
50
+ }
51
+ }
52
+ };
53
+ const collectedKey = hasher.hashObject(collected.data);
54
+ const fallbacks = family.fallbacks ?? defaults.fallbacks;
55
+ if (fallbacks.length > 0 && // If the same data has already been sent for this family, we don't want to have
56
+ // duplicated fallbacks. Such scenario can occur with unicode ranges.
57
+ !collectedFontsIds.has(collectedKey) && !collectedFontsForMetricsByUniqueKey.has(collectedKey)) {
58
+ collectedFontsForMetricsByUniqueKey.set(collectedKey, collected);
59
+ }
60
+ index++;
61
+ }
62
+ }
63
+ return {
64
+ fontFileById,
65
+ preloads,
66
+ collectedFontsForMetricsByUniqueKey
67
+ };
68
+ }
69
+ export {
70
+ collectFontAssetsFromFaces
71
+ };
@@ -0,0 +1,4 @@
1
+ import type { FontDataByCssVariable, FontFamilyAssets } from '../types.js';
2
+ export declare function collectFontData(fontFamilyAssets: Array<Pick<FontFamilyAssets, 'fonts'> & {
3
+ family: Pick<FontFamilyAssets['family'], 'cssVariable'>;
4
+ }>): FontDataByCssVariable;
@@ -0,0 +1,23 @@
1
+ import { renderFontWeight } from "../utils.js";
2
+ function collectFontData(fontFamilyAssets) {
3
+ const fontDataByCssVariable = {};
4
+ for (const { family, fonts } of fontFamilyAssets) {
5
+ const fontData = [];
6
+ for (const data of fonts) {
7
+ fontData.push({
8
+ weight: renderFontWeight(data.weight),
9
+ style: data.style,
10
+ src: data.src.filter((src) => "url" in src).map((src) => ({
11
+ url: src.url,
12
+ format: src.format,
13
+ tech: src.tech
14
+ }))
15
+ });
16
+ }
17
+ fontDataByCssVariable[family.cssVariable] = fontData;
18
+ }
19
+ return fontDataByCssVariable;
20
+ }
21
+ export {
22
+ collectFontData
23
+ };
@@ -0,0 +1,20 @@
1
+ import type { Logger } from '../../../core/logger/core.js';
2
+ import type { FontResolver, StringMatcher } from '../definitions.js';
3
+ import type { Collaborator, Defaults, FontFileById, ResolvedFontFamily } from '../types.js';
4
+ import type { collectFontAssetsFromFaces as _collectFontAssetsFromFaces } from './collect-font-assets-from-faces.js';
5
+ import type { filterAndTransformFontFaces as _filterAndTransformFontFaces } from './filter-and-transform-font-faces.js';
6
+ import type { getOrCreateFontFamilyAssets as _getOrCreateFontFamilyAssets } from './get-or-create-font-family-assets.js';
7
+ export declare function computeFontFamiliesAssets({ resolvedFamilies, fontResolver, logger, bold, defaults, stringMatcher, getOrCreateFontFamilyAssets, collectFontAssetsFromFaces, filterAndTransformFontFaces, }: {
8
+ resolvedFamilies: Array<ResolvedFontFamily>;
9
+ fontResolver: FontResolver;
10
+ logger: Logger;
11
+ bold: (input: string) => string;
12
+ defaults: Defaults;
13
+ stringMatcher: StringMatcher;
14
+ getOrCreateFontFamilyAssets: Collaborator<typeof _getOrCreateFontFamilyAssets, 'family' | 'fontFamilyAssetsByUniqueKey'>;
15
+ filterAndTransformFontFaces: Collaborator<typeof _filterAndTransformFontFaces, 'family' | 'fonts'>;
16
+ collectFontAssetsFromFaces: Collaborator<typeof _collectFontAssetsFromFaces, 'family' | 'fonts' | 'collectedFontsIds' | 'fontFilesIds'>;
17
+ }): Promise<{
18
+ fontFamilyAssets: import("../types.js").FontFamilyAssets[];
19
+ fontFileById: FontFileById;
20
+ }>;
@@ -0,0 +1,67 @@
1
+ async function computeFontFamiliesAssets({
2
+ resolvedFamilies,
3
+ fontResolver,
4
+ logger,
5
+ bold,
6
+ defaults,
7
+ stringMatcher,
8
+ getOrCreateFontFamilyAssets,
9
+ collectFontAssetsFromFaces,
10
+ filterAndTransformFontFaces
11
+ }) {
12
+ const fontFamilyAssetsByUniqueKey = /* @__PURE__ */ new Map();
13
+ const fontFileById = /* @__PURE__ */ new Map();
14
+ for (const family of resolvedFamilies) {
15
+ const fontAssets = getOrCreateFontFamilyAssets({
16
+ fontFamilyAssetsByUniqueKey,
17
+ family
18
+ });
19
+ const _fonts = await fontResolver.resolveFont({
20
+ familyName: family.name,
21
+ provider: family.provider,
22
+ // We do not merge the defaults, we only provide defaults as a fallback
23
+ weights: family.weights ?? defaults.weights,
24
+ styles: family.styles ?? defaults.styles,
25
+ subsets: family.subsets ?? defaults.subsets,
26
+ formats: family.formats ?? defaults.formats,
27
+ options: family.options
28
+ });
29
+ if (_fonts.length === 0) {
30
+ logger.warn(
31
+ "assets",
32
+ `No data found for font family ${bold(family.name)}. Review your configuration`
33
+ );
34
+ const availableFamilies = await fontResolver.listFonts({ provider: family.provider });
35
+ if (availableFamilies && availableFamilies.length > 0 && !availableFamilies.includes(family.name)) {
36
+ logger.warn(
37
+ "assets",
38
+ `${bold(family.name)} font family cannot be retrieved by the provider. Did you mean ${bold(stringMatcher.getClosestMatch(family.name, availableFamilies))}?`
39
+ );
40
+ }
41
+ continue;
42
+ }
43
+ fontAssets.fonts.push(
44
+ ...filterAndTransformFontFaces({
45
+ fonts: _fonts,
46
+ family
47
+ })
48
+ );
49
+ const result = collectFontAssetsFromFaces({
50
+ fonts: fontAssets.fonts,
51
+ family,
52
+ fontFilesIds: new Set(fontFileById.keys()),
53
+ collectedFontsIds: new Set(fontAssets.collectedFontsForMetricsByUniqueKey.keys())
54
+ });
55
+ for (const [key, value] of result.fontFileById.entries()) {
56
+ fontFileById.set(key, value);
57
+ }
58
+ for (const [key, value] of result.collectedFontsForMetricsByUniqueKey.entries()) {
59
+ fontAssets.collectedFontsForMetricsByUniqueKey.set(key, value);
60
+ }
61
+ fontAssets.preloads.push(...result.preloads);
62
+ }
63
+ return { fontFamilyAssets: Array.from(fontFamilyAssetsByUniqueKey.values()), fontFileById };
64
+ }
65
+ export {
66
+ computeFontFamiliesAssets
67
+ };
@@ -0,0 +1,20 @@
1
+ import type * as unifont from 'unifont';
2
+ import type { FontFileIdGenerator, FontTypeExtractor, UrlResolver } from '../definitions.js';
3
+ import type { ResolvedFontFamily } from '../types.js';
4
+ export declare function filterAndTransformFontFaces({ fonts, fontTypeExtractor, fontFileIdGenerator, urlResolver, family, }: {
5
+ fonts: Array<unifont.FontFaceData>;
6
+ fontTypeExtractor: FontTypeExtractor;
7
+ fontFileIdGenerator: FontFileIdGenerator;
8
+ urlResolver: UrlResolver;
9
+ family: Pick<ResolvedFontFamily, 'cssVariable'>;
10
+ }): {
11
+ src: (unifont.LocalFontSource | unifont.RemoteFontSource)[];
12
+ display?: "auto" | "block" | "swap" | "fallback" | "optional";
13
+ weight?: string | number | [number, number];
14
+ stretch?: string;
15
+ style?: string;
16
+ unicodeRange?: string[];
17
+ featureSettings?: string;
18
+ variationSettings?: string;
19
+ meta?: unifont.FontFaceMeta;
20
+ }[];
@@ -0,0 +1,39 @@
1
+ import { FONT_FORMATS } from "../constants.js";
2
+ function filterAndTransformFontFaces({
3
+ fonts,
4
+ fontTypeExtractor,
5
+ fontFileIdGenerator,
6
+ urlResolver,
7
+ family
8
+ }) {
9
+ return fonts.filter((font) => typeof font.meta?.priority === "number" ? font.meta.priority <= 1 : true).map((font) => ({
10
+ ...font,
11
+ src: font.src.map((source) => {
12
+ if ("name" in source) {
13
+ return source;
14
+ }
15
+ const originalUrl = source.url.startsWith("//") ? `https:${source.url}` : source.url;
16
+ let format = FONT_FORMATS.find((e) => e.format === source.format);
17
+ if (!format) {
18
+ format = FONT_FORMATS.find((e) => e.type === fontTypeExtractor.extract(source.url));
19
+ }
20
+ const id = fontFileIdGenerator.generate({
21
+ cssVariable: family.cssVariable,
22
+ font,
23
+ originalUrl,
24
+ type: format.type
25
+ });
26
+ const url = urlResolver.resolve(id);
27
+ const newSource = {
28
+ originalURL: originalUrl,
29
+ url,
30
+ format: format.format,
31
+ tech: source.tech
32
+ };
33
+ return newSource;
34
+ })
35
+ }));
36
+ }
37
+ export {
38
+ filterAndTransformFontFaces
39
+ };
@@ -0,0 +1,8 @@
1
+ import type { Logger } from '../../../core/logger/core.js';
2
+ import type { FontFamilyAssetsByUniqueKey, ResolvedFontFamily } from '../types.js';
3
+ export declare function getOrCreateFontFamilyAssets({ fontFamilyAssetsByUniqueKey, logger, bold, family, }: {
4
+ fontFamilyAssetsByUniqueKey: FontFamilyAssetsByUniqueKey;
5
+ logger: Logger;
6
+ bold: (input: string) => string;
7
+ family: ResolvedFontFamily;
8
+ }): import("../types.js").FontFamilyAssets;
@@ -0,0 +1,34 @@
1
+ function getOrCreateFontFamilyAssets({
2
+ fontFamilyAssetsByUniqueKey,
3
+ logger,
4
+ bold,
5
+ family
6
+ }) {
7
+ const key = `${family.cssVariable}:${family.name}:${family.provider.name}`;
8
+ let fontAssets = fontFamilyAssetsByUniqueKey.get(key);
9
+ if (!fontAssets) {
10
+ if (Array.from(fontFamilyAssetsByUniqueKey.keys()).find(
11
+ (k) => k.startsWith(`${family.cssVariable}:`)
12
+ )) {
13
+ logger.warn(
14
+ "assets",
15
+ `Several font families have been registered for the ${bold(family.cssVariable)} cssVariable but they do not share the same name and provider.`
16
+ );
17
+ logger.warn(
18
+ "assets",
19
+ "These families will not be merged together. The last occurrence will override previous families for this cssVariable. Review your Astro configuration."
20
+ );
21
+ }
22
+ fontAssets = {
23
+ family,
24
+ fonts: [],
25
+ collectedFontsForMetricsByUniqueKey: /* @__PURE__ */ new Map(),
26
+ preloads: []
27
+ };
28
+ fontFamilyAssetsByUniqueKey.set(key, fontAssets);
29
+ }
30
+ return fontAssets;
31
+ }
32
+ export {
33
+ getOrCreateFontFamilyAssets
34
+ };