From ce292735f538556996540d764e4024fcb9dc9ac7 Mon Sep 17 00:00:00 2001 From: vwkd <33468089+vwkd@users.noreply.github.com> Date: Sat, 11 Sep 2021 21:33:46 +0300 Subject: [PATCH] fix: compute getPkgName only when used (#4729) --- .../vite/src/node/__tests__/build.spec.ts | 43 +++++++++++++++++-- .../node/__tests__/packages/name/package.json | 3 ++ .../__tests__/packages/noname/package.json | 1 + packages/vite/src/node/build.ts | 25 ++++++----- 4 files changed, 58 insertions(+), 14 deletions(-) create mode 100644 packages/vite/src/node/__tests__/packages/name/package.json create mode 100644 packages/vite/src/node/__tests__/packages/noname/package.json diff --git a/packages/vite/src/node/__tests__/build.spec.ts b/packages/vite/src/node/__tests__/build.spec.ts index 15bca18c91bfc4..b3ef37e64fd28e 100644 --- a/packages/vite/src/node/__tests__/build.spec.ts +++ b/packages/vite/src/node/__tests__/build.spec.ts @@ -1,4 +1,5 @@ import { resolveLibFilename } from '../build' +import { resolve } from 'path' describe('resolveLibFilename', () => { test('custom filename function', () => { @@ -8,7 +9,7 @@ describe('resolveLibFilename', () => { entry: 'mylib.js' }, 'es', - 'mylib' + resolve(__dirname, 'packages/name') ) expect(filename).toBe('custom-filename-function.es.js') @@ -16,17 +17,51 @@ describe('resolveLibFilename', () => { test('custom filename string', () => { const filename = resolveLibFilename( - { fileName: 'custom-filename', entry: 'mylib.js' }, + { + fileName: 'custom-filename', + entry: 'mylib.js' + }, 'es', - 'mylib' + resolve(__dirname, 'packages/name') ) expect(filename).toBe('custom-filename.es.js') }) test('package name as filename', () => { - const filename = resolveLibFilename({ entry: 'mylib.js' }, 'es', 'mylib') + const filename = resolveLibFilename( + { + entry: 'mylib.js' + }, + 'es', + resolve(__dirname, 'packages/name') + ) expect(filename).toBe('mylib.es.js') }) + + test('custom filename and no package name', () => { + const filename = resolveLibFilename( + { + fileName: 'custom-filename', + entry: 'mylib.js' + }, + 'es', + resolve(__dirname, 'packages/noname') + ) + + expect(filename).toBe('custom-filename.es.js') + }) + + test('missing filename', () => { + expect(() => { + resolveLibFilename( + { + entry: 'mylib.js' + }, + 'es', + resolve(__dirname, 'packages/noname') + ) + }).toThrow() + }) }) diff --git a/packages/vite/src/node/__tests__/packages/name/package.json b/packages/vite/src/node/__tests__/packages/name/package.json new file mode 100644 index 00000000000000..43a1356dae608f --- /dev/null +++ b/packages/vite/src/node/__tests__/packages/name/package.json @@ -0,0 +1,3 @@ +{ + "name": "mylib" +} diff --git a/packages/vite/src/node/__tests__/packages/noname/package.json b/packages/vite/src/node/__tests__/packages/noname/package.json new file mode 100644 index 00000000000000..0967ef424bce67 --- /dev/null +++ b/packages/vite/src/node/__tests__/packages/noname/package.json @@ -0,0 +1 @@ +{} diff --git a/packages/vite/src/node/build.ts b/packages/vite/src/node/build.ts index a9f7796d7767d0..da1a80664c7e8e 100644 --- a/packages/vite/src/node/build.ts +++ b/packages/vite/src/node/build.ts @@ -422,8 +422,6 @@ async function doBuild( } try { - const pkgName = libOptions && getPkgName(config.root) - const buildOutputOptions = (output: OutputOptions = {}): OutputOptions => { return { dir: outDir, @@ -434,7 +432,7 @@ async function doBuild( entryFileNames: ssr ? `[name].js` : libOptions - ? resolveLibFilename(libOptions, output.format || 'es', pkgName) + ? resolveLibFilename(libOptions, output.format || 'es', config.root) : path.posix.join(options.assetsDir, `[name].[hash].js`), chunkFileNames: libOptions ? `[name].js` @@ -576,9 +574,7 @@ function prepareOutDir( function getPkgName(root: string) { const { name } = JSON.parse(lookupFile(root, ['package.json']) || `{}`) - if (!name) throw new Error('no name found in package.json') - - return name.startsWith('@') ? name.split('/')[1] : name + return name?.startsWith('@') ? name.split('/')[1] : name } function createMoveToVendorChunkFn(config: ResolvedConfig): GetManualChunk { @@ -633,11 +629,20 @@ function staticImportedByEntry( export function resolveLibFilename( libOptions: LibraryOptions, format: ModuleFormat, - pkgName: string + root: string ): string { - return typeof libOptions.fileName === 'function' - ? libOptions.fileName(format) - : `${libOptions.fileName || pkgName}.${format}.js` + if (typeof libOptions.fileName === 'function') { + return libOptions.fileName(format) + } + + const name = libOptions.fileName || getPkgName(root) + + if (!name) + throw new Error( + 'Name in package.json is required if option "build.lib.fileName" is not provided.' + ) + + return `${name}.${format}.js` } function resolveBuildOutputs(