Skip to content

Commit 5dbd59b

Browse files
Merge branch 'main' into next
2 parents 1a1bd9b + 8d7ee36 commit 5dbd59b

File tree

13 files changed

+523
-460
lines changed

13 files changed

+523
-460
lines changed

.changeset/dark-chicken-sleep.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'astro': patch
3+
---
4+
5+
Fixes a case where build's `process.env` would be inlined in the server output

.changeset/rich-tips-kick.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'astro': patch
3+
---
4+
5+
Improves fallbacks generation when using the experimental Fonts API

packages/astro/src/assets/fonts/implementations/font-metrics-resolver.ts

Lines changed: 33 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,14 @@ function filterRequiredMetrics({
2020
};
2121
}
2222

23-
// Source: https://github.com/unjs/fontaine/blob/f00f84032c5d5da72c8798eae4cd68d3ddfbf340/src/css.ts#L7
24-
function toPercentage(value: number, fractionDigits = 4) {
25-
const percentage = value * 100;
26-
return `${+percentage.toFixed(fractionDigits)}%`;
23+
// Source: https://github.com/seek-oss/capsize/blob/b752693428b45994442433f7e3476ca4e3e3c507/packages/core/src/round.ts
24+
function round(value: number) {
25+
return parseFloat(value.toFixed(4));
26+
}
27+
28+
// Source: https://github.com/seek-oss/capsize/blob/b752693428b45994442433f7e3476ca4e3e3c507/packages/core/src/createFontStack.ts#L5
29+
function toPercentString(value: number) {
30+
return `${round(value * 100)}%`;
2731
}
2832

2933
export function createCapsizeFontMetricsResolver({
@@ -40,7 +44,8 @@ export function createCapsizeFontMetricsResolver({
4044
cache[name] ??= filterRequiredMetrics(await fromBuffer(await fontFetcher.fetch(input)));
4145
return cache[name];
4246
},
43-
// Source: https://github.com/unjs/fontaine/blob/f00f84032c5d5da72c8798eae4cd68d3ddfbf340/src/css.ts#L170
47+
// Adapted from Capsize
48+
// Source: https://github.com/seek-oss/capsize/blob/b752693428b45994442433f7e3476ca4e3e3c507/packages/core/src/createFontStack.ts
4449
generateFontFace({
4550
metrics,
4651
fallbackMetrics,
@@ -51,7 +56,11 @@ export function createCapsizeFontMetricsResolver({
5156
// Calculate size adjust
5257
const preferredFontXAvgRatio = metrics.xWidthAvg / metrics.unitsPerEm;
5358
const fallbackFontXAvgRatio = fallbackMetrics.xWidthAvg / fallbackMetrics.unitsPerEm;
54-
const sizeAdjust = preferredFontXAvgRatio / fallbackFontXAvgRatio;
59+
60+
const sizeAdjust =
61+
preferredFontXAvgRatio && fallbackFontXAvgRatio
62+
? preferredFontXAvgRatio / fallbackFontXAvgRatio
63+
: 1;
5564

5665
const adjustedEmSquare = metrics.unitsPerEm * sizeAdjust;
5766

@@ -60,13 +69,27 @@ export function createCapsizeFontMetricsResolver({
6069
const descentOverride = Math.abs(metrics.descent) / adjustedEmSquare;
6170
const lineGapOverride = metrics.lineGap / adjustedEmSquare;
6271

72+
// Calculate metric overrides for fallback font
73+
const fallbackAscentOverride = fallbackMetrics.ascent / adjustedEmSquare;
74+
const fallbackDescentOverride = Math.abs(fallbackMetrics.descent) / adjustedEmSquare;
75+
const fallbackLineGapOverride = fallbackMetrics.lineGap / adjustedEmSquare;
76+
6377
return cssRenderer.generateFontFace(fallbackName, {
6478
...properties,
6579
src: renderFontSrc([{ name: fallbackFontName }]),
66-
'size-adjust': toPercentage(sizeAdjust),
67-
'ascent-override': toPercentage(ascentOverride),
68-
'descent-override': toPercentage(descentOverride),
69-
'line-gap-override': toPercentage(lineGapOverride),
80+
'size-adjust': sizeAdjust && sizeAdjust !== 1 ? toPercentString(sizeAdjust) : undefined,
81+
'ascent-override':
82+
ascentOverride && ascentOverride !== fallbackAscentOverride
83+
? toPercentString(ascentOverride)
84+
: undefined,
85+
'descent-override':
86+
descentOverride && descentOverride !== fallbackDescentOverride
87+
? toPercentString(descentOverride)
88+
: undefined,
89+
'line-gap-override':
90+
lineGapOverride !== fallbackLineGapOverride
91+
? toPercentString(lineGapOverride)
92+
: undefined,
7093
});
7194
},
7295
};

packages/astro/src/env/vite-plugin-env.ts

Lines changed: 61 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -24,49 +24,14 @@ interface AstroEnvPluginParams {
2424

2525
export function astroEnv({ settings, sync, envLoader }: AstroEnvPluginParams): Plugin {
2626
const { schema, validateSecrets } = settings.config.env;
27-
let isDev: boolean;
28-
29-
let templates: { client: string; server: string; internal: string } | null = null;
30-
31-
function ensureTemplateAreLoaded() {
32-
if (templates !== null) {
33-
return;
34-
}
35-
36-
const loadedEnv = envLoader.get();
37-
38-
if (!isDev) {
39-
for (const [key, value] of Object.entries(loadedEnv)) {
40-
if (value !== undefined) {
41-
process.env[key] = value;
42-
}
43-
}
44-
}
45-
46-
const validatedVariables = validatePublicVariables({
47-
schema,
48-
loadedEnv,
49-
validateSecrets,
50-
sync,
51-
});
52-
53-
templates = {
54-
...getTemplates(schema, validatedVariables, isDev ? loadedEnv : null),
55-
internal: `export const schema = ${JSON.stringify(schema)};`,
56-
};
57-
}
27+
let isBuild: boolean;
28+
let populated = false;
5829

5930
return {
6031
name: 'astro-env-plugin',
6132
enforce: 'pre',
6233
config(_, { command }) {
63-
isDev = command !== 'build';
64-
},
65-
buildStart() {
66-
ensureTemplateAreLoaded();
67-
},
68-
buildEnd() {
69-
templates = null;
34+
isBuild = command === 'build';
7035
},
7136
resolveId(id) {
7237
if (id === CLIENT_VIRTUAL_MODULE_ID) {
@@ -80,28 +45,62 @@ export function astroEnv({ settings, sync, envLoader }: AstroEnvPluginParams): P
8045
}
8146
},
8247
load(id, options) {
83-
if (id === RESOLVED_CLIENT_VIRTUAL_MODULE_ID) {
84-
ensureTemplateAreLoaded();
85-
return { code: templates!.client };
48+
if (id === RESOLVED_INTERNAL_VIRTUAL_MODULE_ID) {
49+
return { code: `export const schema = ${JSON.stringify(schema)};` };
8650
}
87-
if (id === RESOLVED_SERVER_VIRTUAL_MODULE_ID) {
88-
if (options?.ssr) {
89-
ensureTemplateAreLoaded();
90-
return { code: templates!.server };
91-
}
51+
52+
if (id === RESOLVED_SERVER_VIRTUAL_MODULE_ID && !options?.ssr) {
9253
throw new AstroError({
9354
...AstroErrorData.ServerOnlyModule,
9455
message: AstroErrorData.ServerOnlyModule.message(SERVER_VIRTUAL_MODULE_ID),
9556
});
9657
}
97-
if (id === RESOLVED_INTERNAL_VIRTUAL_MODULE_ID) {
98-
ensureTemplateAreLoaded();
99-
return { code: templates!.internal };
58+
59+
if (id === RESOLVED_CLIENT_VIRTUAL_MODULE_ID || id === RESOLVED_SERVER_VIRTUAL_MODULE_ID) {
60+
const loadedEnv = envLoader.get();
61+
62+
// During the build, we populate process.env so that secrets can work
63+
if (isBuild && !populated) {
64+
for (const [key, value] of Object.entries(loadedEnv)) {
65+
if (value !== undefined) {
66+
process.env[key] = value;
67+
}
68+
}
69+
populated = true;
70+
}
71+
72+
const validatedVariables = validatePublicVariables({
73+
schema,
74+
loadedEnv,
75+
validateSecrets,
76+
sync,
77+
});
78+
const { client, server } = getTemplates({
79+
schema,
80+
validatedVariables,
81+
// In dev, we inline process.env to avoid freezing it
82+
loadedEnv: isBuild ? null : loadedEnv,
83+
});
84+
85+
if (id === RESOLVED_CLIENT_VIRTUAL_MODULE_ID) {
86+
return { code: client };
87+
}
88+
89+
if (id === RESOLVED_SERVER_VIRTUAL_MODULE_ID) {
90+
return { code: server };
91+
}
10092
}
10193
},
10294
};
10395
}
10496

97+
interface ValidVariable {
98+
key: string;
99+
value: any;
100+
type: string;
101+
context: 'server' | 'client';
102+
}
103+
105104
function validatePublicVariables({
106105
schema,
107106
loadedEnv,
@@ -113,7 +112,7 @@ function validatePublicVariables({
113112
validateSecrets: boolean;
114113
sync: boolean;
115114
}) {
116-
const valid: Array<{ key: string; value: any; type: string; context: 'server' | 'client' }> = [];
115+
const valid: Array<ValidVariable> = [];
117116
const invalid: Array<InvalidVariable> = [];
118117

119118
for (const [key, options] of Object.entries(schema)) {
@@ -143,13 +142,19 @@ function validatePublicVariables({
143142
return valid;
144143
}
145144

146-
function getTemplates(
147-
schema: EnvSchema,
148-
validatedVariables: ReturnType<typeof validatePublicVariables>,
149-
loadedEnv: Record<string, string> | null,
150-
) {
145+
let cachedServerTemplate: string | undefined;
146+
147+
function getTemplates({
148+
schema,
149+
validatedVariables,
150+
loadedEnv,
151+
}: {
152+
schema: EnvSchema;
153+
validatedVariables: Array<ValidVariable>;
154+
loadedEnv: Record<string, string> | null;
155+
}) {
151156
let client = '';
152-
let server = readFileSync(MODULE_TEMPLATE_URL, 'utf-8');
157+
let server = (cachedServerTemplate ??= readFileSync(MODULE_TEMPLATE_URL, 'utf-8'));
153158
let onSetGetEnv = '';
154159

155160
for (const { key, value, context } of validatedVariables) {

packages/integrations/cloudflare/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,10 @@
3838
"dependencies": {
3939
"@astrojs/internal-helpers": "workspace:*",
4040
"@astrojs/underscore-redirects": "workspace:*",
41-
"@cloudflare/workers-types": "^4.20251014.0",
41+
"@cloudflare/workers-types": "^4.20251106.1",
4242
"tinyglobby": "^0.2.15",
4343
"vite": "^7.1.7",
44-
"wrangler": "4.45.3"
44+
"wrangler": "4.46.0"
4545
},
4646
"peerDependencies": {
4747
"astro": "^5.7.0"

packages/integrations/cloudflare/test/fixtures/astro-dev-platform/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,6 @@
77
"astro": "workspace:*"
88
},
99
"devDependencies": {
10-
"wrangler": "4.45.3"
10+
"wrangler": "4.46.0"
1111
}
1212
}

packages/integrations/cloudflare/test/fixtures/astro-env/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,6 @@
77
"astro": "workspace:*"
88
},
99
"devDependencies": {
10-
"wrangler": "4.45.3"
10+
"wrangler": "4.46.0"
1111
}
1212
}

packages/integrations/cloudflare/test/fixtures/sessions/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
},
88
"devDependencies": {
99
"astro": "workspace:*",
10-
"wrangler": "4.45.3"
10+
"wrangler": "4.46.0"
1111
},
1212
"scripts": {
1313
"build": "astro build",

packages/integrations/cloudflare/test/fixtures/with-solid-js/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
"private": true,
55
"dependencies": {
66
"@astrojs/cloudflare": "workspace:*",
7-
"@astrojs/solid-js": "^5.1.2",
7+
"@astrojs/solid-js": "^5.1.3",
88
"astro": "workspace:*",
99
"solid-js": "^1.9.10"
1010
}

packages/integrations/cloudflare/test/fixtures/with-svelte/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@
44
"private": true,
55
"dependencies": {
66
"@astrojs/cloudflare": "workspace:*",
7-
"@astrojs/svelte": "^7.2.1",
7+
"@astrojs/svelte": "^7.2.2",
88
"astro": "workspace:*",
9-
"svelte": "^5.43.2"
9+
"svelte": "^5.43.4"
1010
}
1111
}

0 commit comments

Comments
 (0)