Skip to content

Commit 6d9b96e

Browse files
committed
feat!: keep default export by default
1 parent 1c6ef99 commit 6d9b96e

File tree

7 files changed

+87
-35
lines changed

7 files changed

+87
-35
lines changed

README.md

Lines changed: 48 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,11 @@ npm i -D unplugin-vue-named-export
1818
import VueNamedExport from 'unplugin-vue-named-export/vite'
1919

2020
export default defineConfig({
21-
plugins: [VueNamedExport()],
21+
plugins: [
22+
VueNamedExport({
23+
/* options */
24+
}),
25+
],
2226
})
2327
```
2428

@@ -32,7 +36,11 @@ export default defineConfig({
3236
import VueNamedExport from 'unplugin-vue-named-export/rollup'
3337

3438
export default {
35-
plugins: [VueNamedExport()],
39+
plugins: [
40+
VueNamedExport({
41+
/* options */
42+
}),
43+
],
3644
}
3745
```
3846

@@ -46,7 +54,11 @@ export default {
4654
import { build } from 'esbuild'
4755

4856
build({
49-
plugins: [require('unplugin-vue-named-export/esbuild')()],
57+
plugins: [
58+
require('unplugin-vue-named-export/esbuild')({
59+
/* options */
60+
}),
61+
],
5062
})
5163
```
5264

@@ -59,21 +71,11 @@ build({
5971
// webpack.config.js
6072
module.exports = {
6173
/* ... */
62-
plugins: [require('unplugin-vue-named-export/webpack')()],
63-
}
64-
```
65-
66-
<br></details>
67-
68-
<details>
69-
<summary>Vue CLI</summary><br>
70-
71-
```ts
72-
// vue.config.js
73-
module.exports = {
74-
configureWebpack: {
75-
plugins: [require('unplugin-vue-named-export/webpack')()],
76-
},
74+
plugins: [
75+
require('unplugin-vue-named-export/webpack')({
76+
/* options */
77+
}),
78+
],
7779
}
7880
```
7981

@@ -89,14 +91,41 @@ import { MyCard } from './my-card.vue'
8991
import { MyFooter } from './my_footer.vue'
9092
```
9193

94+
### Options
95+
96+
```ts
97+
type Options = {
98+
include?: string | RegExp | (string | RegExp)[]
99+
exclude?: string | RegExp | (string | RegExp)[]
100+
101+
/**
102+
* Convert filename to export name
103+
* @default pascalCaseFn
104+
*/
105+
resolveName?(id: string): string | Promise<string>
106+
/**
107+
* Whether to keep default export
108+
* @default false
109+
*/
110+
removeDefault?: boolean
111+
}
112+
```
113+
92114
### Volar
93115
116+
Support only pascal case named export for Volar.
117+
94118
```jsonc
95119
// tsconfig.json
96120
{
97121
// ...
98122
"vueCompilerOptions": {
99-
"plugins": ["unplugin-vue-named-export/volar"]
123+
"plugins": ["unplugin-vue-named-export/volar"],
124+
125+
"namedExport": {
126+
// defaults to false
127+
"removeDefault": false
128+
}
100129
}
101130
}
102131
```

src/core/options.ts

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,24 @@
1-
import type { BaseOptions } from '@vue-macros/common'
1+
import type { BaseOptions, MarkRequired } from '@vue-macros/common'
22

33
export interface Options extends Pick<BaseOptions, 'include' | 'exclude'> {
4+
/**
5+
* Convert filename to export name
6+
* @default pascalCaseFn
7+
*/
48
resolveName?(id: string): string | Promise<string>
9+
/**
10+
* Whether to keep default export
11+
* @default false
12+
*/
13+
removeDefault?: boolean
514
}
615

7-
export type OptionsResolved = Pick<Required<Options>, 'include'> &
8-
Pick<Options, 'exclude' | 'resolveName'>
16+
export type OptionsResolved = MarkRequired<Options, 'include' | 'removeDefault'>
917

1018
export function resolveOption(options: Options): OptionsResolved {
1119
return {
1220
include: [/\.vue$/],
21+
removeDefault: false,
1322
...options,
1423
}
1524
}

src/index.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,10 @@ export default createUnplugin<Options | undefined, false>((rawOptions = {}) => {
4949
`export const ${resolvedName} = `
5050
)
5151

52+
if (!options.removeDefault) {
53+
s.appendLeft(defaultExport.end!, `\nexport default ${resolvedName};`)
54+
}
55+
5256
return generateTransform(s, id)
5357
},
5458
}

src/volar.ts

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,25 @@
11
import { FileKind, type VueLanguagePlugin, replace } from '@vue/language-core'
22
import { resolveName } from './core/utils'
33

4-
const plugin: VueLanguagePlugin = () => {
4+
const plugin: VueLanguagePlugin = ({ vueCompilerOptions }) => {
55
return {
66
name: 'vue-named-export',
77
version: 1,
88
resolveEmbeddedFile(fileName, sfc, embeddedFile) {
99
if (embeddedFile.kind !== FileKind.TypeScriptHostFile) return
1010
const exportedName = resolveName(fileName)
11-
replace(
12-
embeddedFile.content,
13-
'export default ',
14-
`export const ${exportedName} = `
15-
)
11+
// @ts-expect-error
12+
if (vueCompilerOptions.namedExport?.removeDefault)
13+
replace(
14+
embeddedFile.content,
15+
'export default ',
16+
`export const ${exportedName} = `
17+
)
18+
else
19+
replace(embeddedFile.content, /export default .*/, (m) => {
20+
const stmt = m.replace('export default ', '')
21+
return `export const ${exportedName} = ${stmt}\nexport default ${exportedName}`
22+
})
1623
},
1724
}
1825
}

tests/__snapshots__/basic.test.ts.snap

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
1818
1919
const ElCard = /* @__PURE__ */ _export_sfc(_sfc_main, [__FILE__]);
2020
21-
export { ElCard };
21+
export { ElCard, ElCard as default };
2222
"
2323
`;
2424

@@ -37,7 +37,7 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
3737
3838
const UpperCase = /* @__PURE__ */ _export_sfc(_sfc_main, [__FILE__]);
3939
40-
export { UpperCase };
40+
export { UpperCase, UpperCase as default };
4141
"
4242
`;
4343

@@ -59,7 +59,7 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
5959
6060
const Basic = /* @__PURE__ */ _export_sfc(_sfc_main, [__FILE__]);
6161
62-
export { Basic };
62+
export { Basic, Basic as default };
6363
"
6464
`;
6565

@@ -81,7 +81,7 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
8181
8282
const ElButton = /* @__PURE__ */ _export_sfc(_sfc_main, [__FILE__]);
8383
84-
export { ElButton };
84+
export { ElButton, ElButton as default };
8585
"
8686
`;
8787

@@ -103,6 +103,6 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
103103
104104
const MyButton = /* @__PURE__ */ _export_sfc(_sfc_main, [__FILE__]);
105105
106-
export { MyButton };
106+
export { MyButton, MyButton as default };
107107
"
108108
`;

tests/fixtures/main.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
export { Basic } from './basic.vue'
1+
export { Basic, default as BasicDefault } from './basic.vue'
22
export { ElCard } from './ElCard.vue'
33
export { ElButton } from './el-button.vue'
44
export { MyButton } from './my_button.vue'

tsconfig.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,10 @@
1313
"skipLibCheck": true
1414
},
1515
"vueCompilerOptions": {
16-
"plugins": ["./dist/volar.js"]
16+
"plugins": ["./dist/volar.js"],
17+
"namedExport": {
18+
"removeDefault": false
19+
}
1720
},
1821
"include": ["src", "tests"]
1922
}

0 commit comments

Comments
 (0)