From c5eed5e12b157241320e5f70e9354612288b3dcb Mon Sep 17 00:00:00 2001 From: Daniel Roe Date: Wed, 24 Nov 2021 15:42:38 +0000 Subject: [PATCH] fix(vite): don't copy `publicDir` files to `_nuxt` (#2135) --- packages/nitro/src/build.ts | 20 +++++++++++++------- packages/nitro/src/utils/index.ts | 10 +++++++++- packages/vite/src/vite.ts | 1 + 3 files changed, 23 insertions(+), 8 deletions(-) diff --git a/packages/nitro/src/build.ts b/packages/nitro/src/build.ts index 299c3689b7..0d77f52207 100644 --- a/packages/nitro/src/build.ts +++ b/packages/nitro/src/build.ts @@ -4,7 +4,7 @@ import * as rollup from 'rollup' import fse from 'fs-extra' import { printFSTree } from './utils/tree' import { getRollupConfig } from './rollup/config' -import { hl, prettyPath, serializeTemplate, writeFile, isDirectory } from './utils' +import { hl, prettyPath, serializeTemplate, writeFile, isDirectory, readDirRecursively } from './utils' import { NitroContext } from './context' import { scanMiddleware } from './server/middleware' @@ -30,14 +30,20 @@ async function cleanupDir (dir: string) { export async function generate (nitroContext: NitroContext) { consola.start('Generating public...') - const clientDist = resolve(nitroContext._nuxt.buildDir, 'dist/client') - if (await isDirectory(clientDist)) { - await fse.copy(clientDist, join(nitroContext.output.publicDir, nitroContext._nuxt.publicPath)) + const publicDir = nitroContext._nuxt.publicDir + let publicFiles: string[] = [] + if (await isDirectory(publicDir)) { + publicFiles = readDirRecursively(publicDir).map(r => r.replace(publicDir, '')) + await fse.copy(publicDir, nitroContext.output.publicDir) } - const publicDir = nitroContext._nuxt.publicDir - if (await isDirectory(publicDir)) { - await fse.copy(publicDir, nitroContext.output.publicDir) + const clientDist = resolve(nitroContext._nuxt.buildDir, 'dist/client') + if (await isDirectory(clientDist)) { + await fse.copy(clientDist, join(nitroContext.output.publicDir, nitroContext._nuxt.publicPath), { + // TODO: Workaround vite's issue that duplicates public files + // https://github.com/nuxt/framework/issues/1192 + filter: src => !publicFiles.includes(src.replace(clientDist, '')) + }) } consola.success('Generated public ' + prettyPath(nitroContext.output.publicDir)) diff --git a/packages/nitro/src/utils/index.ts b/packages/nitro/src/utils/index.ts index 1639a038f2..bd75ba5eb6 100644 --- a/packages/nitro/src/utils/index.ts +++ b/packages/nitro/src/utils/index.ts @@ -1,5 +1,5 @@ import { createRequire } from 'module' -import { relative, dirname, resolve } from 'pathe' +import { relative, dirname, join, resolve } from 'pathe' import fse from 'fs-extra' import jiti from 'jiti' import defu from 'defu' @@ -148,3 +148,11 @@ export function readPackageJson ( throw error } } + +export function readDirRecursively (dir: string) { + return fse.readdirSync(dir).reduce((files, file) => { + const name = join(dir, file) + const isDirectory = fse.statSync(name).isDirectory() + return isDirectory ? [...files, ...readDirRecursively(name)] : [...files, name] + }, []) +} diff --git a/packages/vite/src/vite.ts b/packages/vite/src/vite.ts index 87e37606bc..ccad9b23f0 100644 --- a/packages/vite/src/vite.ts +++ b/packages/vite/src/vite.ts @@ -49,6 +49,7 @@ export async function bundle (nuxt: Nuxt) { } }, base: nuxt.options.build.publicPath, + publicDir: resolve(nuxt.options.srcDir, nuxt.options.dir.public), // TODO: move to kit schema when it exists vue: { isProduction: !nuxt.options.dev,