diff --git a/.changeset/moody-points-reflect.md b/.changeset/moody-points-reflect.md new file mode 100644 index 000000000000..44b16a18f30a --- /dev/null +++ b/.changeset/moody-points-reflect.md @@ -0,0 +1,5 @@ +--- +'astro': patch +--- + +Correctly generate directories for assets when users customise the output via rollup options. diff --git a/packages/astro/src/core/build/static-build.ts b/packages/astro/src/core/build/static-build.ts index cb11a5fa06f2..b99890b829bb 100644 --- a/packages/astro/src/core/build/static-build.ts +++ b/packages/astro/src/core/build/static-build.ts @@ -3,6 +3,7 @@ import * as eslexer from 'es-module-lexer'; import glob from 'fast-glob'; import fs from 'fs'; import { bgGreen, bgMagenta, black, dim } from 'kleur/colors'; +import path from 'path'; import { fileURLToPath } from 'url'; import * as vite from 'vite'; import { @@ -384,12 +385,15 @@ async function ssrMoveAssets(opts: StaticBuildOptions) { }); if (files.length > 0) { - // Make the directory - await fs.promises.mkdir(clientAssets, { recursive: true }); + await Promise.all( files.map(async (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 + 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 new file mode 100644 index 000000000000..345a9d2a7eee --- /dev/null +++ b/packages/astro/test/custom-assets-name.test.js @@ -0,0 +1,21 @@ +import { expect } from 'chai'; +import { loadFixture } from './test-utils.js'; + +describe('custom the assets name function', () => { + /** @type {import('./test-utils').Fixture} */ + let fixture; + + before(async () => { + fixture = await loadFixture({ + root: './fixtures/custom-assets-name/', + output: 'server', + }); + await fixture.build(); + }); + + 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} */ + expect(!!csslength).to.equal(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 new file mode 100644 index 000000000000..c4a75e4ebc81 --- /dev/null +++ b/packages/astro/test/fixtures/custom-assets-name/astro.config.mjs @@ -0,0 +1,34 @@ +import { defineConfig } from 'astro/config'; +import path from "path"; + +// https://astro.build/config +import node from "@astrojs/node"; + +// https://astro.build/config +export default defineConfig({ + vite: { + build: { + cssCodeSplit: false, + assetsInlineLimit: 0, + rollupOptions: { + output: { + + entryFileNames: 'assets/script/a.[hash].js', + assetFileNames: (option) => { + const { ext, dir, base } = path.parse(option.name); + + if (ext == ".css") return path.join(dir, "assets/css", 'a.css'); + return "assets/img/[name].[ext]"; + } + } + } + } + }, + build: { + assets: 'assets' + }, + output: "server", + adapter: node({ + mode: "standalone" + }) +}); diff --git a/packages/astro/test/fixtures/custom-assets-name/package.json b/packages/astro/test/fixtures/custom-assets-name/package.json new file mode 100644 index 000000000000..00237fbddfdc --- /dev/null +++ b/packages/astro/test/fixtures/custom-assets-name/package.json @@ -0,0 +1,9 @@ +{ + "name": "@test/custom-assets-name", + "version": "0.0.0", + "private": true, + "dependencies": { + "astro": "workspace:*", + "@astrojs/node": "workspace:*" + } +} 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 new file mode 100644 index 000000000000..250233e1e15f --- /dev/null +++ b/packages/astro/test/fixtures/custom-assets-name/src/pages/index.astro @@ -0,0 +1,18 @@ +--- +const title = 'My App'; +--- + + + + {title} + + +

{title}

+ + + + diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5789d3ae190a..f830bbe27278 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1971,6 +1971,14 @@ importers: dependencies: astro: link:../../.. + packages/astro/test/fixtures/custom-assets-name: + specifiers: + '@astrojs/node': workspace:* + astro: workspace:* + dependencies: + '@astrojs/node': link:../../../../integrations/node + astro: link:../../.. + packages/astro/test/fixtures/custom-elements: specifiers: '@test/custom-element-renderer': workspace:*