@@ -50,6 +50,21 @@ export function createViteBuildConfig(opts: CreateViteBuildConfigOptions): vite.
5050 const { settings, viteConfig, routes, plugins, builder, isRolldownInput } = opts ;
5151 const legacyAdapter = ! settings . adapter || isLegacyAdapter ( settings . adapter ) ;
5252
53+ // Separate Astro-managed environment keys from user-defined ones so that the
54+ // managed environments always appear last (and in a fixed order) in the object.
55+ // Vite's `configResolved` fires per environment in key-insertion order, and the
56+ // `astro:resolve-input` plugin relies on `ssr` being resolved last so its
57+ // rolldown input value is the one that persists. If a user-defined
58+ // `environments.ssr` is spread first, its key position would place SSR earlier
59+ // in the iteration order, causing later environments to overwrite the saved
60+ // input. See https://github.com/withastro/astro/issues/17760
61+ const {
62+ [ ASTRO_VITE_ENVIRONMENT_NAMES . ssr ] : userSsr ,
63+ [ ASTRO_VITE_ENVIRONMENT_NAMES . prerender ] : userPrerender ,
64+ [ ASTRO_VITE_ENVIRONMENT_NAMES . client ] : userClient ,
65+ ...userEnvironments
66+ } = viteConfig . environments ?? { } ;
67+
5368 return {
5469 ...viteConfig ,
5570 logLevel : viteConfig . logLevel ?? 'error' ,
@@ -143,8 +158,9 @@ export function createViteBuildConfig(opts: CreateViteBuildConfigOptions): vite.
143158 envPrefix : viteConfig . envPrefix ?? 'PUBLIC_' ,
144159 base : settings . config . base ,
145160 environments : {
146- ...( viteConfig . environments ?? { } ) ,
161+ ...userEnvironments ,
147162 [ ASTRO_VITE_ENVIRONMENT_NAMES . prerender ] : {
163+ ...userPrerender ,
148164 build : {
149165 emitAssets : true ,
150166 outDir : fileURLToPath ( getPrerenderOutputDirectory ( settings ) ) ,
@@ -157,24 +173,21 @@ export function createViteBuildConfig(opts: CreateViteBuildConfigOptions): vite.
157173 output : {
158174 entryFileNames : `${ PRERENDER_ENTRY_FILENAME_PREFIX } .[hash].mjs` ,
159175 format : 'esm' ,
160- ...viteConfig . environments ?. prerender ?. build ?. rolldownOptions ?. output ,
176+ ...userPrerender ?. build ?. rolldownOptions ?. output ,
161177 } ,
162178 } ,
163179 ssr : true ,
164180 } ,
165181 } ,
166182 [ ASTRO_VITE_ENVIRONMENT_NAMES . client ] : {
183+ ...userClient ,
167184 build : {
168185 emitAssets : true ,
169186 target : 'esnext' ,
170187 outDir : fileURLToPath ( getClientOutputDirectory ( settings ) ) ,
171188 copyPublicDir : true ,
172- sourcemap :
173- viteConfig . environments ?. client ?. build ?. sourcemap ??
174- viteConfig . build ?. sourcemap ??
175- false ,
176- minify :
177- viteConfig . environments ?. client ?. build ?. minify ?? viteConfig . build ?. minify ?? true ,
189+ sourcemap : userClient ?. build ?. sourcemap ?? viteConfig . build ?. sourcemap ?? false ,
190+ minify : userClient ?. build ?. minify ?? viteConfig . build ?. minify ?? true ,
178191 rolldownOptions : {
179192 preserveEntrySignatures : 'exports-only' ,
180193 output : {
@@ -199,17 +212,18 @@ export function createViteBuildConfig(opts: CreateViteBuildConfigOptions): vite.
199212 }
200213 return `${ settings . config . build . assets } /[name].[hash][extname]` ;
201214 } ,
202- ...viteConfig . environments ?. client ?. build ?. rolldownOptions ?. output ,
215+ ...userClient ?. build ?. rolldownOptions ?. output ,
203216 } ,
204217 } ,
205218 } ,
206219 } ,
207220 [ ASTRO_VITE_ENVIRONMENT_NAMES . ssr ] : {
221+ ...userSsr ,
208222 build : {
209223 outDir : fileURLToPath ( getServerOutputDirectory ( settings ) ) ,
210224 rolldownOptions : {
211225 output : {
212- ...viteConfig . environments ?. ssr ?. build ?. rolldownOptions ?. output ,
226+ ...userSsr ?. build ?. rolldownOptions ?. output ,
213227 } ,
214228 } ,
215229 } ,
0 commit comments