astro 6.0.0-beta.2 → 6.0.0-beta.4
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.
- package/bin/astro.mjs +1 -1
- package/components/Code.astro +2 -3
- package/components/Font.astro +4 -4
- package/dist/assets/fonts/config.d.ts +10 -95
- package/dist/assets/fonts/config.js +30 -58
- package/dist/assets/fonts/constants.d.ts +0 -1
- package/dist/assets/fonts/constants.js +0 -2
- package/dist/assets/fonts/core/collect-component-data.d.ts +9 -0
- package/dist/assets/fonts/core/collect-component-data.js +47 -0
- package/dist/assets/fonts/core/collect-font-assets-from-faces.d.ts +17 -0
- package/dist/assets/fonts/core/collect-font-assets-from-faces.js +71 -0
- package/dist/assets/fonts/core/collect-font-data.d.ts +4 -0
- package/dist/assets/fonts/core/collect-font-data.js +23 -0
- package/dist/assets/fonts/core/compute-font-families-assets.d.ts +20 -0
- package/dist/assets/fonts/core/compute-font-families-assets.js +67 -0
- package/dist/assets/fonts/core/filter-and-transform-font-faces.d.ts +20 -0
- package/dist/assets/fonts/core/filter-and-transform-font-faces.js +39 -0
- package/dist/assets/fonts/core/get-or-create-font-family-assets.d.ts +8 -0
- package/dist/assets/fonts/core/get-or-create-font-family-assets.js +34 -0
- package/dist/assets/fonts/core/optimize-fallbacks.d.ts +2 -3
- package/dist/assets/fonts/core/optimize-fallbacks.js +2 -3
- package/dist/assets/fonts/core/resolve-family.d.ts +6 -0
- package/dist/assets/fonts/core/resolve-family.js +23 -0
- package/dist/assets/fonts/definitions.d.ts +6 -28
- package/dist/assets/fonts/infra/build-font-file-id-generator.d.ts +13 -0
- package/dist/assets/fonts/infra/{build-url-proxy-hash-resolver.js → build-font-file-id-generator.js} +3 -6
- package/dist/assets/fonts/infra/build-url-resolver.d.ts +1 -1
- package/dist/assets/fonts/infra/build-url-resolver.js +4 -4
- package/dist/assets/fonts/infra/cached-font-fetcher.d.ts +1 -1
- package/dist/assets/fonts/infra/cached-font-fetcher.js +11 -3
- package/dist/assets/fonts/infra/capsize-font-metrics-resolver.d.ts +2 -2
- package/dist/assets/fonts/infra/dev-font-file-id-generator.d.ts +16 -0
- package/dist/assets/fonts/infra/{dev-url-proxy-hash-resolver.js → dev-font-file-id-generator.js} +8 -8
- package/dist/assets/fonts/infra/dev-url-resolver.d.ts +1 -1
- package/dist/assets/fonts/infra/dev-url-resolver.js +2 -2
- package/dist/assets/fonts/infra/fs-font-file-content-resolver.d.ts +10 -0
- package/dist/assets/fonts/infra/fs-font-file-content-resolver.js +21 -0
- package/dist/assets/fonts/infra/minifiable-css-renderer.d.ts +2 -1
- package/dist/assets/fonts/infra/{font-type-extractor.d.ts → node-font-type-extractor.d.ts} +1 -1
- package/dist/assets/fonts/infra/{font-type-extractor.js → node-font-type-extractor.js} +2 -2
- package/dist/assets/fonts/infra/unifont-font-resolver.d.ts +5 -3
- package/dist/assets/fonts/infra/unifont-font-resolver.js +14 -17
- package/dist/assets/fonts/providers/index.d.ts +6 -1
- package/dist/assets/fonts/providers/index.js +9 -1
- package/dist/assets/fonts/providers/local.d.ts +41 -8
- package/dist/assets/fonts/providers/local.js +65 -48
- package/dist/assets/fonts/runtime/client.d.ts +1 -1
- package/dist/assets/fonts/runtime/client.js +1 -1
- package/dist/assets/fonts/runtime/server.d.ts +1 -1
- package/dist/assets/fonts/runtime/server.js +1 -1
- package/dist/assets/fonts/types.d.ts +63 -113
- package/dist/assets/fonts/utils.d.ts +1 -7
- package/dist/assets/fonts/utils.js +1 -15
- package/dist/assets/fonts/vite-plugin-fonts.js +151 -142
- package/dist/cli/add/index.js +39 -0
- package/dist/cli/infra/build-time-astro-version-provider.js +1 -1
- package/dist/config/index.d.ts +1 -2
- package/dist/content/content-layer.js +3 -3
- package/dist/core/config/schemas/base.d.ts +6 -77
- package/dist/core/config/schemas/base.js +2 -2
- package/dist/core/config/schemas/relative.d.ts +18 -183
- package/dist/core/constants.js +1 -1
- package/dist/core/dev/dev.js +1 -1
- package/dist/core/errors/errors-data.d.ts +1 -1
- package/dist/core/errors/errors-data.js +1 -1
- package/dist/core/messages.js +2 -2
- package/dist/types/public/config.d.ts +3 -4
- package/dist/vite-plugin-astro-server/plugin.js +5 -0
- package/dist/vite-plugin-astro-server/route-guard.d.ts +10 -0
- package/dist/vite-plugin-astro-server/route-guard.js +54 -0
- package/dist/vite-plugin-css/index.d.ts +1 -1
- package/dist/vite-plugin-css/index.js +1 -4
- package/dist/vite-plugin-utils/index.js +2 -2
- package/package.json +11 -12
- package/dist/assets/fonts/core/normalize-remote-font-faces.d.ts +0 -7
- package/dist/assets/fonts/core/normalize-remote-font-faces.js +0 -41
- package/dist/assets/fonts/core/resolve-families.d.ts +0 -16
- package/dist/assets/fonts/core/resolve-families.js +0 -63
- package/dist/assets/fonts/infra/build-url-proxy-hash-resolver.d.ts +0 -15
- package/dist/assets/fonts/infra/data-collector.d.ts +0 -10
- package/dist/assets/fonts/infra/data-collector.js +0 -35
- package/dist/assets/fonts/infra/dev-url-proxy-hash-resolver.d.ts +0 -15
- package/dist/assets/fonts/infra/local-url-proxy-content-resolver.d.ts +0 -4
- package/dist/assets/fonts/infra/local-url-proxy-content-resolver.js +0 -14
- package/dist/assets/fonts/infra/remote-url-proxy-content-resolver.d.ts +0 -4
- package/dist/assets/fonts/infra/remote-url-proxy-content-resolver.js +0 -9
- package/dist/assets/fonts/infra/require-local-provider-url-resolver.d.ts +0 -9
- package/dist/assets/fonts/infra/require-local-provider-url-resolver.js +0 -30
- package/dist/assets/fonts/infra/url-proxy.d.ts +0 -16
- package/dist/assets/fonts/infra/url-proxy.js +0 -50
- package/dist/assets/fonts/orchestrate.d.ts +0 -42
- package/dist/assets/fonts/orchestrate.js +0 -173
- package/dist/core/shiki.d.ts +0 -2
- 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.
|
|
15
|
+
const engines = IS_STACKBLITZ ? '>=20.19.1' : '>=22.12.0';
|
|
16
16
|
const skipSemverCheckIfAbove = IS_STACKBLITZ ? 21 : 23;
|
|
17
17
|
|
|
18
18
|
/** `astro *` */
|
package/components/Code.astro
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
---
|
|
2
|
-
import type
|
|
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
|
|
97
|
+
const highlighter = await createShikiHighlighter({
|
|
99
98
|
langs: [
|
|
100
99
|
typeof lang === 'string'
|
|
101
100
|
? Object.keys(bundledLanguages).includes(lang)
|
package/components/Font.astro
CHANGED
|
@@ -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 {
|
|
8
|
-
if (!
|
|
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 =
|
|
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.
|
|
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
|
-
|
|
3
|
-
export declare const
|
|
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
|
|
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
|
|
16
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
3
|
-
const
|
|
4
|
-
const
|
|
5
|
-
const
|
|
6
|
-
const
|
|
7
|
-
const
|
|
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
|
-
})
|
|
47
|
-
const
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
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([
|
|
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
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
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,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;
|