astro 5.7.5 → 5.7.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/components/image.css +5 -12
  2. package/dist/assets/fonts/config.d.ts +9 -9
  3. package/dist/assets/fonts/config.js +3 -4
  4. package/dist/assets/fonts/constants.d.ts +3 -73
  5. package/dist/assets/fonts/constants.js +16 -68
  6. package/dist/assets/fonts/definitions.d.ts +73 -0
  7. package/dist/assets/fonts/definitions.js +0 -0
  8. package/dist/assets/fonts/implementations/css-renderer.d.ts +9 -0
  9. package/dist/assets/fonts/implementations/css-renderer.js +42 -0
  10. package/dist/assets/fonts/implementations/data-collector.d.ts +3 -0
  11. package/dist/assets/fonts/implementations/data-collector.js +21 -0
  12. package/dist/assets/fonts/implementations/error-handler.d.ts +2 -0
  13. package/dist/assets/fonts/implementations/error-handler.js +33 -0
  14. package/dist/assets/fonts/implementations/font-fetcher.d.ts +8 -0
  15. package/dist/assets/fonts/implementations/font-fetcher.js +34 -0
  16. package/dist/assets/fonts/implementations/font-metrics-resolver.d.ts +5 -0
  17. package/dist/assets/fonts/implementations/font-metrics-resolver.js +60 -0
  18. package/dist/assets/fonts/implementations/font-type-extractor.d.ts +4 -0
  19. package/dist/assets/fonts/implementations/font-type-extractor.js +22 -0
  20. package/dist/assets/fonts/implementations/hasher.d.ts +2 -0
  21. package/dist/assets/fonts/implementations/hasher.js +14 -0
  22. package/dist/assets/fonts/implementations/local-provider-url-resolver.d.ts +5 -0
  23. package/dist/assets/fonts/implementations/local-provider-url-resolver.js +17 -0
  24. package/dist/assets/fonts/implementations/remote-font-provider-mod-resolver.d.ts +6 -0
  25. package/dist/assets/fonts/implementations/remote-font-provider-mod-resolver.js +20 -0
  26. package/dist/assets/fonts/implementations/remote-font-provider-resolver.d.ts +6 -0
  27. package/dist/assets/fonts/implementations/remote-font-provider-resolver.js +47 -0
  28. package/dist/assets/fonts/implementations/storage.d.ts +4 -0
  29. package/dist/assets/fonts/implementations/storage.js +14 -0
  30. package/dist/assets/fonts/implementations/system-fallbacks-provider.d.ts +11 -0
  31. package/dist/assets/fonts/implementations/system-fallbacks-provider.js +74 -0
  32. package/dist/assets/fonts/implementations/url-proxy-content-resolver.d.ts +5 -0
  33. package/dist/assets/fonts/implementations/url-proxy-content-resolver.js +28 -0
  34. package/dist/assets/fonts/implementations/url-proxy.d.ts +8 -0
  35. package/dist/assets/fonts/implementations/url-proxy.js +26 -0
  36. package/dist/assets/fonts/logic/extract-unifont-providers.d.ts +10 -0
  37. package/dist/assets/fonts/logic/extract-unifont-providers.js +28 -0
  38. package/dist/assets/fonts/logic/normalize-remote-font-faces.d.ts +6 -0
  39. package/dist/assets/fonts/logic/normalize-remote-font-faces.js +36 -0
  40. package/dist/assets/fonts/logic/optimize-fallbacks.d.ts +17 -0
  41. package/dist/assets/fonts/logic/optimize-fallbacks.js +47 -0
  42. package/dist/assets/fonts/logic/resolve-families.d.ts +17 -0
  43. package/dist/assets/fonts/logic/resolve-families.js +67 -0
  44. package/dist/assets/fonts/orchestrate.d.ts +37 -0
  45. package/dist/assets/fonts/orchestrate.js +125 -0
  46. package/dist/assets/fonts/providers/local.d.ts +6 -7
  47. package/dist/assets/fonts/providers/local.js +26 -29
  48. package/dist/assets/fonts/types.d.ts +32 -2
  49. package/dist/assets/fonts/utils.d.ts +17 -87
  50. package/dist/assets/fonts/utils.js +21 -183
  51. package/dist/assets/fonts/vite-plugin-fonts.js +98 -80
  52. package/dist/assets/internal.js +0 -2
  53. package/dist/assets/layout.js +4 -4
  54. package/dist/assets/types.d.ts +4 -4
  55. package/dist/content/content-layer.js +3 -3
  56. package/dist/core/config/schemas/base.d.ts +19 -19
  57. package/dist/core/config/schemas/base.js +1 -1
  58. package/dist/core/config/schemas/relative.d.ts +25 -25
  59. package/dist/core/constants.js +1 -1
  60. package/dist/core/dev/dev.js +1 -1
  61. package/dist/core/errors/errors-data.d.ts +2 -1
  62. package/dist/core/errors/errors-data.js +2 -1
  63. package/dist/core/messages.js +2 -2
  64. package/dist/core/routing/manifest/create.js +4 -1
  65. package/dist/types/public/config.d.ts +19 -22
  66. package/dist/vite-plugin-markdown/images.js +4 -4
  67. package/package.json +4 -4
  68. package/types/content.d.ts +11 -4
  69. package/dist/assets/fonts/load.d.ts +0 -20
  70. package/dist/assets/fonts/load.js +0 -162
  71. package/dist/assets/fonts/metrics.d.ts +0 -10
  72. package/dist/assets/fonts/metrics.js +0 -55
  73. package/dist/assets/fonts/providers/utils.d.ts +0 -9
  74. package/dist/assets/fonts/providers/utils.js +0 -37
@@ -1,162 +0,0 @@
1
- import { readFileSync } from "node:fs";
2
- import * as unifont from "unifont";
3
- import { AstroError, AstroErrorData } from "../../core/errors/index.js";
4
- import { DEFAULTS, LOCAL_PROVIDER_NAME } from "./constants.js";
5
- import { resolveLocalFont } from "./providers/local.js";
6
- import {
7
- familiesToUnifontProviders,
8
- generateFallbacksCSS,
9
- generateFontFace,
10
- proxyURL
11
- } from "./utils.js";
12
- async function loadFonts({
13
- base,
14
- families,
15
- storage,
16
- hashToUrlMap,
17
- resolvedMap,
18
- hashString,
19
- generateFallbackFontFace,
20
- getMetricsForFamily,
21
- log
22
- }) {
23
- const extractedProvidersResult = familiesToUnifontProviders({ families, hashString });
24
- families = extractedProvidersResult.families;
25
- const { resolveFont } = await unifont.createUnifont(extractedProvidersResult.providers, {
26
- storage
27
- });
28
- for (const family of families) {
29
- const preloadData = [];
30
- let css = "";
31
- const fallbacks = family.fallbacks ?? DEFAULTS.fallbacks;
32
- const fallbackFontData = [];
33
- const collect = ({ hash, type, value, data }, collectPreload) => {
34
- const url = base + hash;
35
- if (!hashToUrlMap.has(hash)) {
36
- hashToUrlMap.set(hash, value);
37
- if (collectPreload) {
38
- preloadData.push({ url, type });
39
- }
40
- }
41
- if (fallbacks && fallbacks.length > 0 && // If the same data has already been sent for this family, we don't want to have duplicate fallbacks
42
- // Such scenario can occur with unicode ranges
43
- !fallbackFontData.some((f) => JSON.stringify(f.data) === JSON.stringify(data))) {
44
- fallbackFontData.push({
45
- hash,
46
- url: value,
47
- data
48
- });
49
- }
50
- return url;
51
- };
52
- let fonts;
53
- if (family.provider === LOCAL_PROVIDER_NAME) {
54
- const result = resolveLocalFont({
55
- family,
56
- proxyURL: ({ value, data }) => {
57
- return proxyURL({
58
- value,
59
- // We hash based on the filepath and the contents, since the user could replace
60
- // a given font file with completely different contents.
61
- hashString: (v) => {
62
- let content;
63
- try {
64
- content = readFileSync(value, "utf-8");
65
- } catch (e) {
66
- throw new AstroError(AstroErrorData.UnknownFilesystemError, { cause: e });
67
- }
68
- return hashString(v + content);
69
- },
70
- collect: (input) => collect({ ...input, data }, true)
71
- });
72
- }
73
- });
74
- fonts = result.fonts;
75
- } else {
76
- const result = await resolveFont(
77
- family.name,
78
- // We do not merge the defaults, we only provide defaults as a fallback
79
- {
80
- weights: family.weights ?? DEFAULTS.weights,
81
- styles: family.styles ?? DEFAULTS.styles,
82
- subsets: family.subsets ?? DEFAULTS.subsets,
83
- fallbacks: family.fallbacks ?? DEFAULTS.fallbacks
84
- },
85
- // By default, unifont goes through all providers. We use a different approach
86
- // where we specify a provider per font.
87
- // Name has been set while extracting unifont providers from families (inside familiesToUnifontProviders)
88
- [family.provider.name]
89
- );
90
- fonts = result.fonts.filter(
91
- (font) => typeof font.meta?.priority === "number" ? font.meta.priority === 0 : true
92
- ).map((font) => {
93
- let index = 0;
94
- return {
95
- ...font,
96
- src: font.src.map((source) => {
97
- if ("name" in source) {
98
- return source;
99
- }
100
- const proxied = {
101
- ...source,
102
- originalURL: source.url,
103
- url: proxyURL({
104
- value: source.url,
105
- // We only use the url for hashing since the service returns urls with a hash already
106
- hashString,
107
- // We only collect the first URL to avoid preloading fallback sources (eg. we only
108
- // preload woff2 if woff is available)
109
- collect: (data) => collect(
110
- {
111
- ...data,
112
- data: {
113
- weight: font.weight,
114
- style: font.style
115
- }
116
- },
117
- index === 0
118
- )
119
- })
120
- };
121
- index++;
122
- return proxied;
123
- })
124
- };
125
- });
126
- }
127
- for (const data of fonts) {
128
- css += generateFontFace(family.nameWithHash, {
129
- src: data.src,
130
- display: data.display ?? family.provider === LOCAL_PROVIDER_NAME ? void 0 : family.display,
131
- unicodeRange: data.unicodeRange ?? family.provider === LOCAL_PROVIDER_NAME ? void 0 : family.unicodeRange,
132
- weight: data.weight,
133
- style: data.style,
134
- stretch: data.stretch ?? family.provider === LOCAL_PROVIDER_NAME ? void 0 : family.stretch,
135
- featureSettings: data.featureSettings ?? family.provider === LOCAL_PROVIDER_NAME ? void 0 : family.featureSettings,
136
- variationSettings: data.variationSettings ?? family.provider === LOCAL_PROVIDER_NAME ? void 0 : family.variationSettings
137
- });
138
- }
139
- const fallbackData = await generateFallbacksCSS({
140
- family,
141
- font: fallbackFontData,
142
- fallbacks,
143
- metrics: family.optimizedFallbacks ?? DEFAULTS.optimizedFallbacks ? {
144
- getMetricsForFamily,
145
- generateFontFace: generateFallbackFontFace
146
- } : null
147
- });
148
- const cssVarValues = [family.nameWithHash];
149
- if (fallbackData) {
150
- if (fallbackData.css) {
151
- css += fallbackData.css;
152
- }
153
- cssVarValues.push(...fallbackData.fallbacks);
154
- }
155
- css += `:root { ${family.cssVariable}: ${cssVarValues.join(", ")}; }`;
156
- resolvedMap.set(family.cssVariable, { preloadData, css });
157
- }
158
- log("Fonts initialized");
159
- }
160
- export {
161
- loadFonts
162
- };
@@ -1,10 +0,0 @@
1
- import { type Font } from '@capsizecss/unpack';
2
- export type FontFaceMetrics = Pick<Font, 'ascent' | 'descent' | 'lineGap' | 'unitsPerEm' | 'xWidthAvg'>;
3
- export declare function readMetrics(family: string, buffer: Buffer): Promise<FontFaceMetrics>;
4
- export declare function generateFallbackFontFace({ metrics, fallbackMetrics, name: fallbackName, font: fallbackFontName, properties, }: {
5
- metrics: FontFaceMetrics;
6
- fallbackMetrics: FontFaceMetrics;
7
- name: string;
8
- font: string;
9
- properties: Record<string, string | undefined>;
10
- }): string;
@@ -1,55 +0,0 @@
1
- import { fromBuffer } from "@capsizecss/unpack";
2
- import { renderFontFace, renderFontSrc } from "./utils.js";
3
- const metricCache = {};
4
- function filterRequiredMetrics({
5
- ascent,
6
- descent,
7
- lineGap,
8
- unitsPerEm,
9
- xWidthAvg
10
- }) {
11
- return {
12
- ascent,
13
- descent,
14
- lineGap,
15
- unitsPerEm,
16
- xWidthAvg
17
- };
18
- }
19
- async function readMetrics(family, buffer) {
20
- const metrics = await fromBuffer(buffer);
21
- metricCache[family] = filterRequiredMetrics(metrics);
22
- return metricCache[family];
23
- }
24
- function toPercentage(value, fractionDigits = 4) {
25
- const percentage = value * 100;
26
- return `${+percentage.toFixed(fractionDigits)}%`;
27
- }
28
- function generateFallbackFontFace({
29
- metrics,
30
- fallbackMetrics,
31
- name: fallbackName,
32
- font: fallbackFontName,
33
- properties
34
- }) {
35
- const preferredFontXAvgRatio = metrics.xWidthAvg / metrics.unitsPerEm;
36
- const fallbackFontXAvgRatio = fallbackMetrics.xWidthAvg / fallbackMetrics.unitsPerEm;
37
- const sizeAdjust = preferredFontXAvgRatio / fallbackFontXAvgRatio;
38
- const adjustedEmSquare = metrics.unitsPerEm * sizeAdjust;
39
- const ascentOverride = metrics.ascent / adjustedEmSquare;
40
- const descentOverride = Math.abs(metrics.descent) / adjustedEmSquare;
41
- const lineGapOverride = metrics.lineGap / adjustedEmSquare;
42
- return renderFontFace({
43
- "font-family": fallbackName,
44
- src: renderFontSrc([{ name: fallbackFontName }]),
45
- "size-adjust": toPercentage(sizeAdjust),
46
- "ascent-override": toPercentage(ascentOverride),
47
- "descent-override": toPercentage(descentOverride),
48
- "line-gap-override": toPercentage(lineGapOverride),
49
- ...properties
50
- });
51
- }
52
- export {
53
- generateFallbackFontFace,
54
- readMetrics
55
- };
@@ -1,9 +0,0 @@
1
- import type { AstroFontProvider, ResolvedFontProvider } from '../types.js';
2
- export declare function validateMod(mod: any, entrypoint: string): Pick<ResolvedFontProvider, 'provider'>;
3
- export type ResolveMod = (id: string) => Promise<any>;
4
- export interface ResolveProviderOptions {
5
- root: URL;
6
- provider: AstroFontProvider;
7
- resolveMod: ResolveMod;
8
- }
9
- export declare function resolveProvider({ root, provider: { entrypoint, config }, resolveMod, }: ResolveProviderOptions): Promise<ResolvedFontProvider>;
@@ -1,37 +0,0 @@
1
- import { AstroError, AstroErrorData } from "../../../core/errors/index.js";
2
- import { resolveEntrypoint } from "../utils.js";
3
- function validateMod(mod, entrypoint) {
4
- try {
5
- if (typeof mod !== "object" || mod === null) {
6
- throw new Error(`Expected an object for the module, but received ${typeof mod}.`);
7
- }
8
- if (typeof mod.provider !== "function") {
9
- throw new Error(`Invalid provider export in module, expected a function.`);
10
- }
11
- return {
12
- provider: mod.provider
13
- };
14
- } catch (cause) {
15
- throw new AstroError(
16
- {
17
- ...AstroErrorData.CannotLoadFontProvider,
18
- message: AstroErrorData.CannotLoadFontProvider.message(entrypoint)
19
- },
20
- { cause }
21
- );
22
- }
23
- }
24
- async function resolveProvider({
25
- root,
26
- provider: { entrypoint, config },
27
- resolveMod
28
- }) {
29
- const id = resolveEntrypoint(root, entrypoint.toString()).href;
30
- const mod = await resolveMod(id);
31
- const { provider } = validateMod(mod, id);
32
- return { config, provider };
33
- }
34
- export {
35
- resolveProvider,
36
- validateMod
37
- };