astro 6.0.0-beta.2 → 6.0.0-beta.3

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 (88) hide show
  1. package/bin/astro.mjs +1 -1
  2. package/components/Code.astro +2 -3
  3. package/components/Font.astro +4 -4
  4. package/dist/assets/fonts/config.d.ts +10 -95
  5. package/dist/assets/fonts/config.js +30 -58
  6. package/dist/assets/fonts/constants.d.ts +0 -1
  7. package/dist/assets/fonts/constants.js +0 -2
  8. package/dist/assets/fonts/core/collect-component-data.d.ts +9 -0
  9. package/dist/assets/fonts/core/collect-component-data.js +47 -0
  10. package/dist/assets/fonts/core/collect-font-assets-from-faces.d.ts +17 -0
  11. package/dist/assets/fonts/core/collect-font-assets-from-faces.js +71 -0
  12. package/dist/assets/fonts/core/collect-font-data.d.ts +4 -0
  13. package/dist/assets/fonts/core/collect-font-data.js +23 -0
  14. package/dist/assets/fonts/core/compute-font-families-assets.d.ts +20 -0
  15. package/dist/assets/fonts/core/compute-font-families-assets.js +67 -0
  16. package/dist/assets/fonts/core/filter-and-transform-font-faces.d.ts +20 -0
  17. package/dist/assets/fonts/core/filter-and-transform-font-faces.js +39 -0
  18. package/dist/assets/fonts/core/get-or-create-font-family-assets.d.ts +8 -0
  19. package/dist/assets/fonts/core/get-or-create-font-family-assets.js +34 -0
  20. package/dist/assets/fonts/core/optimize-fallbacks.d.ts +2 -3
  21. package/dist/assets/fonts/core/optimize-fallbacks.js +2 -3
  22. package/dist/assets/fonts/core/resolve-family.d.ts +6 -0
  23. package/dist/assets/fonts/core/resolve-family.js +23 -0
  24. package/dist/assets/fonts/definitions.d.ts +6 -28
  25. package/dist/assets/fonts/infra/build-font-file-id-generator.d.ts +13 -0
  26. package/dist/assets/fonts/infra/{build-url-proxy-hash-resolver.js → build-font-file-id-generator.js} +3 -6
  27. package/dist/assets/fonts/infra/build-url-resolver.d.ts +1 -1
  28. package/dist/assets/fonts/infra/build-url-resolver.js +4 -4
  29. package/dist/assets/fonts/infra/cached-font-fetcher.d.ts +1 -1
  30. package/dist/assets/fonts/infra/cached-font-fetcher.js +11 -3
  31. package/dist/assets/fonts/infra/capsize-font-metrics-resolver.d.ts +2 -2
  32. package/dist/assets/fonts/infra/dev-font-file-id-generator.d.ts +16 -0
  33. package/dist/assets/fonts/infra/{dev-url-proxy-hash-resolver.js → dev-font-file-id-generator.js} +8 -8
  34. package/dist/assets/fonts/infra/dev-url-resolver.d.ts +1 -1
  35. package/dist/assets/fonts/infra/dev-url-resolver.js +2 -2
  36. package/dist/assets/fonts/infra/fs-font-file-content-resolver.d.ts +10 -0
  37. package/dist/assets/fonts/infra/fs-font-file-content-resolver.js +21 -0
  38. package/dist/assets/fonts/infra/minifiable-css-renderer.d.ts +2 -1
  39. package/dist/assets/fonts/infra/{font-type-extractor.d.ts → node-font-type-extractor.d.ts} +1 -1
  40. package/dist/assets/fonts/infra/{font-type-extractor.js → node-font-type-extractor.js} +2 -2
  41. package/dist/assets/fonts/infra/unifont-font-resolver.d.ts +5 -3
  42. package/dist/assets/fonts/infra/unifont-font-resolver.js +14 -17
  43. package/dist/assets/fonts/providers/index.d.ts +6 -1
  44. package/dist/assets/fonts/providers/index.js +9 -1
  45. package/dist/assets/fonts/providers/local.d.ts +41 -8
  46. package/dist/assets/fonts/providers/local.js +65 -48
  47. package/dist/assets/fonts/runtime/client.d.ts +1 -1
  48. package/dist/assets/fonts/runtime/client.js +1 -1
  49. package/dist/assets/fonts/runtime/server.d.ts +1 -1
  50. package/dist/assets/fonts/runtime/server.js +1 -1
  51. package/dist/assets/fonts/types.d.ts +63 -113
  52. package/dist/assets/fonts/utils.d.ts +1 -7
  53. package/dist/assets/fonts/utils.js +1 -15
  54. package/dist/assets/fonts/vite-plugin-fonts.js +151 -142
  55. package/dist/cli/add/index.js +39 -0
  56. package/dist/cli/infra/build-time-astro-version-provider.js +1 -1
  57. package/dist/config/index.d.ts +1 -2
  58. package/dist/content/content-layer.js +3 -3
  59. package/dist/core/config/schemas/base.d.ts +6 -77
  60. package/dist/core/config/schemas/base.js +2 -2
  61. package/dist/core/config/schemas/relative.d.ts +18 -183
  62. package/dist/core/constants.js +1 -1
  63. package/dist/core/dev/dev.js +1 -1
  64. package/dist/core/errors/errors-data.d.ts +1 -1
  65. package/dist/core/errors/errors-data.js +1 -1
  66. package/dist/core/messages.js +2 -2
  67. package/dist/types/public/config.d.ts +3 -4
  68. package/package.json +3 -3
  69. package/dist/assets/fonts/core/normalize-remote-font-faces.d.ts +0 -7
  70. package/dist/assets/fonts/core/normalize-remote-font-faces.js +0 -41
  71. package/dist/assets/fonts/core/resolve-families.d.ts +0 -16
  72. package/dist/assets/fonts/core/resolve-families.js +0 -63
  73. package/dist/assets/fonts/infra/build-url-proxy-hash-resolver.d.ts +0 -15
  74. package/dist/assets/fonts/infra/data-collector.d.ts +0 -10
  75. package/dist/assets/fonts/infra/data-collector.js +0 -35
  76. package/dist/assets/fonts/infra/dev-url-proxy-hash-resolver.d.ts +0 -15
  77. package/dist/assets/fonts/infra/local-url-proxy-content-resolver.d.ts +0 -4
  78. package/dist/assets/fonts/infra/local-url-proxy-content-resolver.js +0 -14
  79. package/dist/assets/fonts/infra/remote-url-proxy-content-resolver.d.ts +0 -4
  80. package/dist/assets/fonts/infra/remote-url-proxy-content-resolver.js +0 -9
  81. package/dist/assets/fonts/infra/require-local-provider-url-resolver.d.ts +0 -9
  82. package/dist/assets/fonts/infra/require-local-provider-url-resolver.js +0 -30
  83. package/dist/assets/fonts/infra/url-proxy.d.ts +0 -16
  84. package/dist/assets/fonts/infra/url-proxy.js +0 -50
  85. package/dist/assets/fonts/orchestrate.d.ts +0 -42
  86. package/dist/assets/fonts/orchestrate.js +0 -173
  87. package/dist/core/shiki.d.ts +0 -2
  88. package/dist/core/shiki.js +0 -16
package/bin/astro.mjs CHANGED
@@ -12,7 +12,7 @@ const CI_INSTRUCTIONS = {
12
12
  const IS_STACKBLITZ = !!process.versions.webcontainer;
13
13
 
14
14
  // Hardcode supported Node.js version so we don't have to read differently in CJS & ESM.
15
- const engines = IS_STACKBLITZ ? '>=20.19.5' : '>=22.12.0';
15
+ const engines = IS_STACKBLITZ ? '>=20.19.1' : '>=22.12.0';
16
16
  const skipSemverCheckIfAbove = IS_STACKBLITZ ? 21 : 23;
17
17
 
18
18
  /** `astro *` */
@@ -1,8 +1,7 @@
1
1
  ---
2
- import type { ThemePresets } from '@astrojs/markdown-remark';
2
+ import { type ThemePresets, createShikiHighlighter } from '@astrojs/markdown-remark';
3
3
  import type { ShikiTransformer, ThemeRegistration, ThemeRegistrationRaw } from 'shiki';
4
4
  import { bundledLanguages } from 'shiki/langs';
5
- import { getCachedHighlighter } from '../dist/core/shiki.js';
6
5
  import type { CodeLanguage } from '../dist/types/public/common.js';
7
6
  import type { HTMLAttributes } from '../types.js';
8
7
 
@@ -95,7 +94,7 @@ if (typeof lang === 'object') {
95
94
  }
96
95
  }
97
96
 
98
- const highlighter = await getCachedHighlighter({
97
+ const highlighter = await createShikiHighlighter({
99
98
  langs: [
100
99
  typeof lang === 'string'
101
100
  ? Object.keys(bundledLanguages).includes(lang)
@@ -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>
@@ -1,107 +1,23 @@
1
1
  import * as z from 'zod/v4';
2
- export declare const weightSchema: z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>;
3
- export declare const styleSchema: z.ZodEnum<{
2
+ import type { FontProvider } from './types.js';
3
+ export declare const WeightSchema: z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>;
4
+ export declare const StyleSchema: z.ZodEnum<{
4
5
  normal: "normal";
5
6
  italic: "italic";
6
7
  oblique: "oblique";
7
8
  }>;
8
- export declare const displaySchema: z.ZodEnum<{
9
+ export declare const DisplaySchema: z.ZodEnum<{
9
10
  optional: "optional";
10
11
  auto: "auto";
11
12
  block: "block";
12
13
  swap: "swap";
13
14
  fallback: "fallback";
14
15
  }>;
15
- export declare const localFontFamilySchema: z.ZodObject<{
16
- provider: z.ZodLiteral<"local">;
17
- variants: z.ZodTuple<[z.ZodObject<{
18
- src: z.ZodTuple<[z.ZodUnion<readonly [z.ZodUnion<readonly [z.ZodString, z.ZodCustom<URL, URL>]>, z.ZodObject<{
19
- url: z.ZodUnion<readonly [z.ZodString, z.ZodCustom<URL, URL>]>;
20
- tech: z.ZodOptional<z.ZodString>;
21
- }, z.core.$strict>]>], z.ZodUnion<readonly [z.ZodUnion<readonly [z.ZodString, z.ZodCustom<URL, URL>]>, z.ZodObject<{
22
- url: z.ZodUnion<readonly [z.ZodString, z.ZodCustom<URL, URL>]>;
23
- tech: z.ZodOptional<z.ZodString>;
24
- }, z.core.$strict>]>>;
25
- weight: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>;
26
- style: z.ZodOptional<z.ZodEnum<{
27
- normal: "normal";
28
- italic: "italic";
29
- oblique: "oblique";
30
- }>>;
31
- display: z.ZodOptional<z.ZodEnum<{
32
- optional: "optional";
33
- auto: "auto";
34
- block: "block";
35
- swap: "swap";
36
- fallback: "fallback";
37
- }>>;
38
- stretch: z.ZodOptional<z.ZodString>;
39
- featureSettings: z.ZodOptional<z.ZodString>;
40
- variationSettings: z.ZodOptional<z.ZodString>;
41
- unicodeRange: z.ZodOptional<z.ZodTuple<[z.ZodString], z.ZodString>>;
42
- }, z.core.$strict>], z.ZodObject<{
43
- src: z.ZodTuple<[z.ZodUnion<readonly [z.ZodUnion<readonly [z.ZodString, z.ZodCustom<URL, URL>]>, z.ZodObject<{
44
- url: z.ZodUnion<readonly [z.ZodString, z.ZodCustom<URL, URL>]>;
45
- tech: z.ZodOptional<z.ZodString>;
46
- }, z.core.$strict>]>], z.ZodUnion<readonly [z.ZodUnion<readonly [z.ZodString, z.ZodCustom<URL, URL>]>, z.ZodObject<{
47
- url: z.ZodUnion<readonly [z.ZodString, z.ZodCustom<URL, URL>]>;
48
- tech: z.ZodOptional<z.ZodString>;
49
- }, z.core.$strict>]>>;
50
- weight: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>;
51
- style: z.ZodOptional<z.ZodEnum<{
52
- normal: "normal";
53
- italic: "italic";
54
- oblique: "oblique";
55
- }>>;
56
- display: z.ZodOptional<z.ZodEnum<{
57
- optional: "optional";
58
- auto: "auto";
59
- block: "block";
60
- swap: "swap";
61
- fallback: "fallback";
62
- }>>;
63
- stretch: z.ZodOptional<z.ZodString>;
64
- featureSettings: z.ZodOptional<z.ZodString>;
65
- variationSettings: z.ZodOptional<z.ZodString>;
66
- unicodeRange: z.ZodOptional<z.ZodTuple<[z.ZodString], z.ZodString>>;
67
- }, z.core.$strict>>;
68
- fallbacks: z.ZodOptional<z.ZodArray<z.ZodString>>;
69
- optimizedFallbacks: z.ZodOptional<z.ZodBoolean>;
16
+ export declare const FontProviderSchema: z.ZodCustom<FontProvider<never>, FontProvider<never>>;
17
+ export declare const FontFamilySchema: z.ZodObject<{
70
18
  name: z.ZodString;
71
19
  cssVariable: z.ZodString;
72
- }, z.core.$strict>;
73
- export declare const fontProviderSchema: z.ZodObject<{
74
- name: z.ZodString;
75
- config: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
76
- init: z.ZodOptional<z.ZodCustom<((context: import("./types.js").FontProviderInitContext) => void | Promise<void>) | undefined, ((context: import("./types.js").FontProviderInitContext) => void | Promise<void>) | undefined>>;
77
- resolveFont: z.ZodCustom<(options: import("./types.js").ResolveFontOptions<never>) => {
78
- fonts: Array<import("unifont").FontFaceData>;
79
- } | Promise<{
80
- fonts: Array<import("unifont").FontFaceData>;
81
- } | undefined> | undefined, (options: import("./types.js").ResolveFontOptions<never>) => {
82
- fonts: Array<import("unifont").FontFaceData>;
83
- } | Promise<{
84
- fonts: Array<import("unifont").FontFaceData>;
85
- } | undefined> | undefined>;
86
- listFonts: z.ZodOptional<z.ZodCustom<(() => string[] | Promise<string[] | undefined> | undefined) | undefined, (() => string[] | Promise<string[] | undefined> | undefined) | undefined>>;
87
- }, z.core.$strict>;
88
- export declare const remoteFontFamilySchema: z.ZodObject<{
89
- provider: z.ZodObject<{
90
- name: z.ZodString;
91
- config: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
92
- init: z.ZodOptional<z.ZodCustom<((context: import("./types.js").FontProviderInitContext) => void | Promise<void>) | undefined, ((context: import("./types.js").FontProviderInitContext) => void | Promise<void>) | undefined>>;
93
- resolveFont: z.ZodCustom<(options: import("./types.js").ResolveFontOptions<never>) => {
94
- fonts: Array<import("unifont").FontFaceData>;
95
- } | Promise<{
96
- fonts: Array<import("unifont").FontFaceData>;
97
- } | undefined> | undefined, (options: import("./types.js").ResolveFontOptions<never>) => {
98
- fonts: Array<import("unifont").FontFaceData>;
99
- } | Promise<{
100
- fonts: Array<import("unifont").FontFaceData>;
101
- } | undefined> | undefined>;
102
- listFonts: z.ZodOptional<z.ZodCustom<(() => string[] | Promise<string[] | undefined> | undefined) | undefined, (() => string[] | Promise<string[] | undefined> | undefined) | undefined>>;
103
- }, z.core.$strict>;
104
- options: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
20
+ provider: z.ZodCustom<FontProvider<never>, FontProvider<never>>;
105
21
  weights: z.ZodOptional<z.ZodTuple<[z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>], z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>>;
106
22
  styles: z.ZodOptional<z.ZodTuple<[z.ZodEnum<{
107
23
  normal: "normal";
@@ -126,6 +42,8 @@ export declare const remoteFontFamilySchema: z.ZodObject<{
126
42
  ttf: "ttf";
127
43
  eot: "eot";
128
44
  }>>>;
45
+ fallbacks: z.ZodOptional<z.ZodArray<z.ZodString>>;
46
+ optimizedFallbacks: z.ZodOptional<z.ZodBoolean>;
129
47
  display: z.ZodOptional<z.ZodEnum<{
130
48
  optional: "optional";
131
49
  auto: "auto";
@@ -137,8 +55,5 @@ export declare const remoteFontFamilySchema: z.ZodObject<{
137
55
  featureSettings: z.ZodOptional<z.ZodString>;
138
56
  variationSettings: z.ZodOptional<z.ZodString>;
139
57
  unicodeRange: z.ZodOptional<z.ZodTuple<[z.ZodString], z.ZodString>>;
140
- fallbacks: z.ZodOptional<z.ZodArray<z.ZodString>>;
141
- optimizedFallbacks: z.ZodOptional<z.ZodBoolean>;
142
- name: z.ZodString;
143
- cssVariable: z.ZodString;
58
+ options: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
144
59
  }, z.core.$strict>;
@@ -1,68 +1,40 @@
1
1
  import * as z from "zod/v4";
2
- import { FONT_TYPES, LOCAL_PROVIDER_NAME } from "./constants.js";
3
- const weightSchema = z.union([z.string(), z.number()]);
4
- const styleSchema = z.enum(["normal", "italic", "oblique"]);
5
- const displaySchema = z.enum(["auto", "block", "swap", "fallback", "optional"]);
6
- const formatSchema = z.enum(FONT_TYPES);
7
- const familyPropertiesSchema = z.object({
8
- weight: weightSchema.optional(),
9
- style: styleSchema.optional(),
10
- display: displaySchema.optional(),
11
- stretch: z.string().optional(),
12
- featureSettings: z.string().optional(),
13
- variationSettings: z.string().optional(),
14
- unicodeRange: z.tuple([z.string()], z.string()).optional()
15
- });
16
- const fallbacksSchema = z.object({
17
- fallbacks: z.array(z.string()).optional(),
18
- optimizedFallbacks: z.boolean().optional()
19
- });
20
- const requiredFamilyAttributesSchema = z.object({
21
- name: z.string(),
22
- cssVariable: z.string()
23
- });
24
- const entrypointSchema = z.union([z.string(), z.instanceof(URL)]);
25
- const srcSchema = z.union([
26
- entrypointSchema,
27
- z.object({ url: entrypointSchema, tech: z.string().optional() }).strict()
28
- ]);
29
- const variantSchema = z.object({
30
- ...familyPropertiesSchema.shape,
31
- src: z.tuple([srcSchema], srcSchema)
32
- // TODO: find a way to support subsets (through fontkit?)
33
- }).strict();
34
- const localFontFamilySchema = z.object({
35
- ...requiredFamilyAttributesSchema.shape,
36
- ...fallbacksSchema.shape,
37
- provider: z.literal(LOCAL_PROVIDER_NAME),
38
- variants: z.tuple([variantSchema], variantSchema)
39
- }).strict();
40
- const fontProviderSchema = z.object({
2
+ import { FONT_TYPES } from "./constants.js";
3
+ const WeightSchema = z.union([z.string(), z.number()]);
4
+ const StyleSchema = z.enum(["normal", "italic", "oblique"]);
5
+ const DisplaySchema = z.enum(["auto", "block", "swap", "fallback", "optional"]);
6
+ const FormatSchema = z.enum(FONT_TYPES);
7
+ const _FontProviderSchema = z.strictObject({
41
8
  name: z.string(),
42
9
  config: z.record(z.string(), z.any()).optional(),
43
10
  init: z.custom((v) => typeof v === "function").optional(),
44
11
  resolveFont: z.custom((v) => typeof v === "function"),
45
12
  listFonts: z.custom((v) => typeof v === "function").optional()
46
- }).strict();
47
- const remoteFontFamilySchema = z.object({
48
- ...requiredFamilyAttributesSchema.shape,
49
- ...fallbacksSchema.shape,
50
- ...familyPropertiesSchema.omit({
51
- weight: true,
52
- style: true
53
- }).shape,
54
- provider: fontProviderSchema,
55
- options: z.record(z.string(), z.any()).optional(),
56
- weights: z.tuple([weightSchema], weightSchema).optional(),
57
- styles: z.tuple([styleSchema], styleSchema).optional(),
13
+ });
14
+ const FontProviderSchema = z.custom((v) => {
15
+ return _FontProviderSchema.safeParse(v).success;
16
+ }, "Invalid FontProvider object");
17
+ const FontFamilySchema = z.object({
18
+ name: z.string(),
19
+ cssVariable: z.string(),
20
+ provider: FontProviderSchema,
21
+ weights: z.tuple([WeightSchema], WeightSchema).optional(),
22
+ styles: z.tuple([StyleSchema], StyleSchema).optional(),
58
23
  subsets: z.tuple([z.string()], z.string()).optional(),
59
- formats: z.tuple([formatSchema], formatSchema).optional()
24
+ formats: z.tuple([FormatSchema], FormatSchema).optional(),
25
+ fallbacks: z.array(z.string()).optional(),
26
+ optimizedFallbacks: z.boolean().optional(),
27
+ display: DisplaySchema.optional(),
28
+ stretch: z.string().optional(),
29
+ featureSettings: z.string().optional(),
30
+ variationSettings: z.string().optional(),
31
+ unicodeRange: z.tuple([z.string()], z.string()).optional(),
32
+ options: z.record(z.string(), z.any()).optional()
60
33
  }).strict();
61
34
  export {
62
- displaySchema,
63
- fontProviderSchema,
64
- localFontFamilySchema,
65
- remoteFontFamilySchema,
66
- styleSchema,
67
- weightSchema
35
+ DisplaySchema,
36
+ FontFamilySchema,
37
+ FontProviderSchema,
38
+ StyleSchema,
39
+ WeightSchema
68
40
  };
@@ -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;