Skip to content

Commit 34df307

Browse files
authoredMay 5, 2022
fix(lib): use proper extension (#6827)
1 parent b5c3709 commit 34df307

File tree

12 files changed

+95
-29
lines changed

12 files changed

+95
-29
lines changed
 

‎docs/config/index.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -241,7 +241,7 @@ export default defineConfig(({ command, mode }) => {
241241
{
242242
"exports": {
243243
".": {
244-
"import": "./index.esm.js",
244+
"import": "./index.esm.mjs",
245245
"require": "./index.cjs.js"
246246
}
247247
}

‎docs/guide/build.md

+5-4
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,8 @@ module.exports = defineConfig({
127127
lib: {
128128
entry: path.resolve(__dirname, 'lib/main.js'),
129129
name: 'MyLib',
130-
fileName: (format) => `my-lib.${format}.js`
130+
// the proper extensions will be added
131+
fileName: 'my-lib'
131132
},
132133
rollupOptions: {
133134
// make sure to externalize deps that shouldn't be bundled
@@ -159,7 +160,7 @@ Running `vite build` with this config uses a Rollup preset that is oriented towa
159160
```
160161
$ vite build
161162
building for production...
162-
[write] my-lib.es.js 0.08kb, brotli: 0.07kb
163+
[write] my-lib.es.mjs 0.08kb, brotli: 0.07kb
163164
[write] my-lib.umd.js 0.30kb, brotli: 0.16kb
164165
```
165166

@@ -170,10 +171,10 @@ Recommended `package.json` for your lib:
170171
"name": "my-lib",
171172
"files": ["dist"],
172173
"main": "./dist/my-lib.umd.js",
173-
"module": "./dist/my-lib.es.js",
174+
"module": "./dist/my-lib.es.mjs",
174175
"exports": {
175176
".": {
176-
"import": "./dist/my-lib.es.js",
177+
"import": "./dist/my-lib.es.mjs",
177178
"require": "./dist/my-lib.umd.js"
178179
}
179180
}

‎packages/create-vite/template-lit-ts/package.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22
"name": "vite-lit-ts-starter",
33
"private": true,
44
"version": "0.0.0",
5-
"main": "dist/my-element.es.js",
5+
"main": "dist/my-element.es.mjs",
66
"exports": {
7-
".": "./dist/my-element.es.js"
7+
".": "./dist/my-element.es.mjs"
88
},
99
"types": "types/my-element.d.ts",
1010
"files": [

‎packages/create-vite/template-lit/package.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22
"name": "vite-lit-starter",
33
"private": true,
44
"version": "0.0.0",
5-
"main": "dist/my-element.es.js",
5+
"main": "dist/my-element.es.mjs",
66
"exports": {
7-
".": "./dist/my-element.es.js"
7+
".": "./dist/my-element.es.mjs"
88
},
99
"files": [
1010
"dist"

‎packages/playground/lib/index.dist.html

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<div class="dynamic-import-message"></div>
66

77
<script type="module">
8-
import myLib from './my-lib-custom-filename.es.js'
8+
import myLib from './my-lib-custom-filename.es.mjs'
99

1010
myLib('.es')
1111
</script>

‎packages/playground/lib/vite.config.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ module.exports = {
1010
entry: path.resolve(__dirname, 'src/main.js'),
1111
name: 'MyLib',
1212
formats: ['es', 'umd', 'iife'],
13-
fileName: (format) => `my-lib-custom-filename.${format}.js`
13+
fileName: 'my-lib-custom-filename'
1414
}
1515
},
1616
plugins: [

‎packages/playground/resolve-config/__tests__/resolve-config.spec.ts

+13-10
Original file line numberDiff line numberDiff line change
@@ -10,42 +10,45 @@ const fromTestDir = (...p: string[]) => path.resolve(testDir, ...p)
1010
const build = (configName: string) => {
1111
commandSync(`${viteBin} build`, { cwd: fromTestDir(configName) })
1212
}
13-
const getDistFile = (configName: string) => {
14-
return fs.readFileSync(fromTestDir(`${configName}/dist/index.es.js`), 'utf8')
13+
const getDistFile = (configName: string, extension: string) => {
14+
return fs.readFileSync(
15+
fromTestDir(`${configName}/dist/index.es.${extension}`),
16+
'utf8'
17+
)
1518
}
1619

1720
if (isBuild) {
1821
it('loads vite.config.js', () => {
1922
build('js')
20-
expect(getDistFile('js')).toContain('console.log(true)')
23+
expect(getDistFile('js', 'mjs')).toContain('console.log(true)')
2124
})
2225
it('loads vite.config.js with package#type module', () => {
2326
build('js-module')
24-
expect(getDistFile('js-module')).toContain('console.log(true)')
27+
expect(getDistFile('js-module', 'js')).toContain('console.log(true)')
2528
})
2629
it('loads vite.config.cjs', () => {
2730
build('cjs')
28-
expect(getDistFile('cjs')).toContain('console.log(true)')
31+
expect(getDistFile('cjs', 'mjs')).toContain('console.log(true)')
2932
})
3033
it('loads vite.config.cjs with package#type module', () => {
3134
build('cjs-module')
32-
expect(getDistFile('cjs-module')).toContain('console.log(true)')
35+
expect(getDistFile('cjs-module', 'js')).toContain('console.log(true)')
3336
})
3437
it('loads vite.config.mjs', () => {
3538
build('mjs')
36-
expect(getDistFile('mjs')).toContain('console.log(true)')
39+
expect(getDistFile('mjs', 'mjs')).toContain('console.log(true)')
3740
})
3841
it('loads vite.config.mjs with package#type module', () => {
3942
build('mjs-module')
40-
expect(getDistFile('mjs-module')).toContain('console.log(true)')
43+
expect(getDistFile('mjs-module', 'js')).toContain('console.log(true)')
4144
})
4245
it('loads vite.config.ts', () => {
4346
build('ts')
44-
expect(getDistFile('ts')).toContain('console.log(true)')
47+
expect(getDistFile('ts', 'mjs')).toContain('console.log(true)')
4548
})
4649
it('loads vite.config.ts with package#type module', () => {
4750
build('ts-module')
48-
expect(getDistFile('ts-module')).toContain('console.log(true)')
51+
expect(getDistFile('ts-module', 'js')).toContain('console.log(true)')
4952
})
5053
} else {
5154
// this test doesn't support serve mode

‎packages/playground/vue-lib/vite.config.lib.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ export default defineConfig({
1010
entry: path.resolve(__dirname, 'src-lib/index.ts'),
1111
name: 'MyVueLib',
1212
formats: ['es'],
13-
fileName: (format) => `my-vue-lib.${format}.js`
13+
fileName: 'my-vue-lib'
1414
},
1515
rollupOptions: {
1616
external: ['vue'],

‎packages/vite/src/node/__tests__/build.spec.ts

+48-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,13 @@
1+
import type { LibraryFormats, LibraryOptions } from '../build'
12
import { resolveLibFilename } from '../build'
23
import { resolve } from 'path'
34

5+
type FormatsToFileNames = [LibraryFormats, string][]
6+
const baseLibOptions: LibraryOptions = {
7+
fileName: 'my-lib',
8+
entry: 'mylib.js'
9+
}
10+
411
describe('resolveLibFilename', () => {
512
test('custom filename function', () => {
613
const filename = resolveLibFilename(
@@ -25,7 +32,7 @@ describe('resolveLibFilename', () => {
2532
resolve(__dirname, 'packages/name')
2633
)
2734

28-
expect(filename).toBe('custom-filename.es.js')
35+
expect(filename).toBe('custom-filename.es.mjs')
2936
})
3037

3138
test('package name as filename', () => {
@@ -37,7 +44,7 @@ describe('resolveLibFilename', () => {
3744
resolve(__dirname, 'packages/name')
3845
)
3946

40-
expect(filename).toBe('mylib.es.js')
47+
expect(filename).toBe('mylib.es.mjs')
4148
})
4249

4350
test('custom filename and no package name', () => {
@@ -50,7 +57,7 @@ describe('resolveLibFilename', () => {
5057
resolve(__dirname, 'packages/noname')
5158
)
5259

53-
expect(filename).toBe('custom-filename.es.js')
60+
expect(filename).toBe('custom-filename.es.mjs')
5461
})
5562

5663
test('missing filename', () => {
@@ -64,4 +71,42 @@ describe('resolveLibFilename', () => {
6471
)
6572
}).toThrow()
6673
})
74+
75+
test('commonjs package extensions', () => {
76+
const formatsToFilenames: FormatsToFileNames = [
77+
['es', 'my-lib.es.mjs'],
78+
['umd', 'my-lib.umd.js'],
79+
['cjs', 'my-lib.cjs.js'],
80+
['iife', 'my-lib.iife.js']
81+
]
82+
83+
for (const [format, expectedFilename] of formatsToFilenames) {
84+
const filename = resolveLibFilename(
85+
baseLibOptions,
86+
format,
87+
resolve(__dirname, 'packages/noname')
88+
)
89+
90+
expect(filename).toBe(expectedFilename)
91+
}
92+
})
93+
94+
test('module package extensions', () => {
95+
const formatsToFilenames: FormatsToFileNames = [
96+
['es', 'my-lib.es.js'],
97+
['umd', 'my-lib.umd.cjs'],
98+
['cjs', 'my-lib.cjs.cjs'],
99+
['iife', 'my-lib.iife.js']
100+
]
101+
102+
for (const [format, expectedFilename] of formatsToFilenames) {
103+
const filename = resolveLibFilename(
104+
baseLibOptions,
105+
format,
106+
resolve(__dirname, 'packages/module')
107+
)
108+
109+
expect(filename).toBe(expectedFilename)
110+
}
111+
})
67112
})
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"type": "module"
3+
}

‎packages/vite/src/node/build.ts

+16-4
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ import type { DepOptimizationMetadata } from './optimizer'
3838
import { getDepsCacheDir, findKnownImports } from './optimizer'
3939
import { assetImportMetaUrlPlugin } from './plugins/assetImportMetaUrl'
4040
import { loadFallbackPlugin } from './plugins/loadFallback'
41+
import type { PackageData } from './packages'
4142
import { watchPackageDataPlugin } from './packages'
4243
import { ensureWatchPlugin } from './plugins/ensureWatch'
4344

@@ -563,9 +564,11 @@ function prepareOutDir(
563564
}
564565
}
565566

566-
function getPkgName(root: string) {
567-
const { name } = JSON.parse(lookupFile(root, ['package.json']) || `{}`)
567+
function getPkgJson(root: string): PackageData['data'] {
568+
return JSON.parse(lookupFile(root, ['package.json']) || `{}`)
569+
}
568570

571+
function getPkgName(name: string) {
569572
return name?.startsWith('@') ? name.split('/')[1] : name
570573
}
571574

@@ -578,14 +581,23 @@ export function resolveLibFilename(
578581
return libOptions.fileName(format)
579582
}
580583

581-
const name = libOptions.fileName || getPkgName(root)
584+
const packageJson = getPkgJson(root)
585+
const name = libOptions.fileName || getPkgName(packageJson.name)
582586

583587
if (!name)
584588
throw new Error(
585589
'Name in package.json is required if option "build.lib.fileName" is not provided.'
586590
)
587591

588-
return `${name}.${format}.js`
592+
let extension: string
593+
594+
if (packageJson?.type === 'module') {
595+
extension = format === 'cjs' || format === 'umd' ? 'cjs' : 'js'
596+
} else {
597+
extension = format === 'es' ? 'mjs' : 'js'
598+
}
599+
600+
return `${name}.${format}.${extension}`
589601
}
590602

591603
function resolveBuildOutputs(

‎packages/vite/src/node/packages.ts

+2
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ export interface PackageData {
2222
getResolvedCache: (key: string, targetWeb: boolean) => string | undefined
2323
data: {
2424
[field: string]: any
25+
name: string
26+
type: string
2527
version: string
2628
main: string
2729
module: string

0 commit comments

Comments
 (0)
Please sign in to comment.