diff --git a/.changeset/loud-emus-look.md b/.changeset/loud-emus-look.md new file mode 100644 index 0000000000..ec07dec9c1 --- /dev/null +++ b/.changeset/loud-emus-look.md @@ -0,0 +1,5 @@ +--- +'astro': patch +--- + +Remove all assets created from the server build diff --git a/packages/astro/src/core/build/index.ts b/packages/astro/src/core/build/index.ts index bcc7fb96d5..2988575163 100644 --- a/packages/astro/src/core/build/index.ts +++ b/packages/astro/src/core/build/index.ts @@ -205,7 +205,7 @@ class AstroBuilder { key: keyPromise, }; - const { internals, ssrOutputChunkNames, ssrOutputAssetNames, contentFileNames } = + const { internals, ssrOutputChunkNames, contentFileNames } = await viteBuild(opts); const hasServerIslands = this.settings.serverIslandNameMap.size > 0; @@ -214,7 +214,7 @@ class AstroBuilder { throw new AstroError(AstroErrorData.NoAdapterInstalledServerIslands); } - await staticBuild(opts, internals, ssrOutputChunkNames, ssrOutputAssetNames, contentFileNames); + await staticBuild(opts, internals, ssrOutputChunkNames, contentFileNames); // Write any additionally generated assets to disk. this.timer.assetsStart = performance.now(); diff --git a/packages/astro/src/core/build/static-build.ts b/packages/astro/src/core/build/static-build.ts index 242822613b..5a86992b2b 100644 --- a/packages/astro/src/core/build/static-build.ts +++ b/packages/astro/src/core/build/static-build.ts @@ -104,26 +104,21 @@ export async function viteBuild(opts: StaticBuildOptions) { // For static builds, the SSR output won't be needed anymore after page generation. // We keep track of the names here so we only remove these specific files when finished. const ssrOutputChunkNames: string[] = []; - const ssrOutputAssetNames: string[] = []; for (const output of ssrOutputs) { for (const chunk of output.output) { if (chunk.type === 'chunk') { ssrOutputChunkNames.push(chunk.fileName); } - if (chunk.type === 'asset') { - ssrOutputAssetNames.push(chunk.fileName); - } } } - return { internals, ssrOutputChunkNames, ssrOutputAssetNames, contentFileNames }; + return { internals, ssrOutputChunkNames, contentFileNames }; } export async function staticBuild( opts: StaticBuildOptions, internals: BuildInternals, ssrOutputChunkNames: string[], - ssrOutputAssetNames: string[], contentFileNames?: string[], ) { const { settings } = opts; @@ -136,7 +131,7 @@ export async function staticBuild( settings.timer.start('Server generate'); await generatePages(opts, internals); await cleanStaticOutput(opts, internals); - await ssrMoveAssets(opts, ssrOutputAssetNames); + await ssrMoveAssets(opts); settings.timer.end('Server generate'); } } @@ -417,21 +412,28 @@ export async function copyFiles(fromFolder: URL, toFolder: URL, includeDotfiles ); } -async function ssrMoveAssets(opts: StaticBuildOptions, ssrOutputAssetNames: string[]) { +async function ssrMoveAssets(opts: StaticBuildOptions) { opts.logger.info('build', 'Rearranging server assets...'); const serverRoot = opts.settings.buildOutput === 'static' ? opts.settings.config.build.client : opts.settings.config.build.server; const clientRoot = opts.settings.config.build.client; - if (ssrOutputAssetNames.length > 0) { + const assets = opts.settings.config.build.assets; + const serverAssets = new URL(`./${assets}/`, appendForwardSlash(serverRoot.toString())); + const clientAssets = new URL(`./${assets}/`, appendForwardSlash(clientRoot.toString())); + const files = await glob(`**/*`, { + cwd: fileURLToPath(serverAssets), + }); + + if (files.length > 0) { await Promise.all( - ssrOutputAssetNames.map(async function moveAsset(filename) { - const currentUrl = new URL(filename, appendForwardSlash(serverRoot.toString())); - const clientUrl = new URL(filename, appendForwardSlash(clientRoot.toString())); + files.map(async function moveAsset(filename) { + const currentUrl = new URL(filename, appendForwardSlash(serverAssets.toString())); + const clientUrl = new URL(filename, appendForwardSlash(clientAssets.toString())); const dir = new URL(path.parse(clientUrl.href).dir); // It can't find this file because the user defines a custom path - // that includes the folder paths in `assetFileNames` + // that includes the folder paths in `assetFileNames if (!fs.existsSync(dir)) await fs.promises.mkdir(dir, { recursive: true }); return fs.promises.rename(currentUrl, clientUrl); }), diff --git a/packages/astro/test/custom-assets-name.test.js b/packages/astro/test/custom-assets-name.test.js index 67fef15510..63cd3eb171 100644 --- a/packages/astro/test/custom-assets-name.test.js +++ b/packages/astro/test/custom-assets-name.test.js @@ -2,7 +2,7 @@ import assert from 'node:assert/strict'; import { before, describe, it } from 'node:test'; import { loadFixture } from './test-utils.js'; -describe('custom assets name function', () => { +describe('custom the assets name function', () => { /** @type {import('./test-utils').Fixture} */ let fixture; @@ -14,15 +14,9 @@ describe('custom assets name function', () => { await fixture.build(); }); - it('should load CSS file from custom client assets path', async () => { - const files = await fixture.readdir('/client/assets/css'); - const cssFile = files.find((file) => file === 'a.css'); - assert.ok(cssFile, 'Expected CSS file to exist at client/assets/css/a.css'); - }); - - it('should load image file from custom client assets path', async () => { - const files = await fixture.readdir('/client/imgAssets'); - const imgFile = files.find((file) => file === 'penguin1.jpg'); - assert.ok(imgFile, 'Expected image file to exist at client/imgAssets/penguin1.jpg'); + it('It cant find this file cause the node throws an error if the users custom a path that includes the folder path', async () => { + const csslength = await fixture.readFile('client/assets/css/a.css'); + /** @type {Set} */ + assert.equal(!!csslength, true); }); }); diff --git a/packages/astro/test/fixtures/custom-assets-name/astro.config.mjs b/packages/astro/test/fixtures/custom-assets-name/astro.config.mjs index 866a05044c..cfcddecc5b 100644 --- a/packages/astro/test/fixtures/custom-assets-name/astro.config.mjs +++ b/packages/astro/test/fixtures/custom-assets-name/astro.config.mjs @@ -18,14 +18,14 @@ export default defineConfig({ const { ext, dir, base } = path.parse(option.name); if (ext == ".css") return path.join(dir, "assets/css", 'a.css'); - return "imgAssets/[name].[ext]"; + return "assets/img/[name].[ext]"; } } } } }, build: { - assets: 'assetsDir' + assets: 'assets' }, output: "server", adapter: node({ diff --git a/packages/astro/test/fixtures/custom-assets-name/src/images/penguin1.jpg b/packages/astro/test/fixtures/custom-assets-name/src/images/penguin1.jpg deleted file mode 100644 index 1a8986ac50..0000000000 Binary files a/packages/astro/test/fixtures/custom-assets-name/src/images/penguin1.jpg and /dev/null differ diff --git a/packages/astro/test/fixtures/custom-assets-name/src/pages/index.astro b/packages/astro/test/fixtures/custom-assets-name/src/pages/index.astro index 507d236d99..250233e1e1 100644 --- a/packages/astro/test/fixtures/custom-assets-name/src/pages/index.astro +++ b/packages/astro/test/fixtures/custom-assets-name/src/pages/index.astro @@ -1,6 +1,5 @@ --- const title = 'My App'; -import p1Url from '../images/penguin1.jpg'; --- @@ -9,7 +8,6 @@ import p1Url from '../images/penguin1.jpg';

{title}

-