Skip to content

Commit 2b236e0

Browse files
dhenscheyyx990803
authored andcommitted
fix(build-wc): honor custom component name for single file wc builds (#1182)
Fixes issue that prevented single entry wc builds from honoring the `--name` argument. fix #1146
1 parent 81d29ab commit 2b236e0

File tree

2 files changed

+31
-14
lines changed

2 files changed

+31
-14
lines changed

packages/@vue/cli-service/lib/commands/build/resolveWcConfig.js

+8-4
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ module.exports = (api, { target, entry, name }) => {
1818

1919
// generate dynamic entry based on glob files
2020
const resolvedFiles = require('globby').sync([entry], { cwd: api.resolve('.') })
21+
2122
if (!resolvedFiles.length) {
2223
abort(`entry pattern "${entry}" did not match any files.`)
2324
}
@@ -38,7 +39,7 @@ module.exports = (api, { target, entry, name }) => {
3839
}
3940
}
4041

41-
const dynamicEntry = resolveEntry(prefix, resolvedFiles, isAsync)
42+
const dynamicEntry = resolveEntry(prefix, libName, resolvedFiles, isAsync)
4243

4344
function genConfig (minify, genHTML) {
4445
const config = api.resolveChainableWebpackConfig()
@@ -85,9 +86,12 @@ module.exports = (api, { target, entry, name }) => {
8586
inject: false,
8687
filename: 'demo.html',
8788
libName,
88-
components: resolvedFiles.map(file => {
89-
return fileToComponentName(prefix, file).kebabName
90-
})
89+
components:
90+
prefix === ''
91+
? [libName]
92+
: resolvedFiles.map(file => {
93+
return fileToComponentName(prefix, file).kebabName
94+
})
9195
}])
9296
}
9397

packages/@vue/cli-service/lib/commands/build/resolveWcEntry.js

+23-10
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,22 @@ const hyphenate = str => {
1111
return str.replace(hyphenateRE, '-$1').toLowerCase()
1212
}
1313

14+
/**
15+
* Creates the script to add the component to the custom elements
16+
* @param {string} prefix The prefix for the component library
17+
* @param {string} component The component name for single entry builds, component file for multi-entry builds
18+
* @param {string} file The file for the component
19+
* @param {boolean} async Whether to load component async or not
20+
*/
21+
const createElement = (prefix, component, file, async) => {
22+
const { camelName, kebabName } = exports.fileToComponentName(prefix, component)
23+
24+
return async
25+
? `window.customElements.define('${kebabName}', wrap(Vue, () => import('~root/${file}')))\n`
26+
: `import ${camelName} from '~root/${file}'\n` +
27+
`window.customElements.define('${kebabName}', wrap(Vue, ${camelName}))\n`
28+
}
29+
1430
exports.fileToComponentName = (prefix, file) => {
1531
const basename = path.basename(file).replace(/\.(jsx?|vue)$/, '')
1632
const camelName = camelize(basename)
@@ -22,8 +38,13 @@ exports.fileToComponentName = (prefix, file) => {
2238
}
2339
}
2440

25-
exports.resolveEntry = (prefix, files, async) => {
41+
exports.resolveEntry = (prefix, libName, files, async) => {
2642
const filePath = path.resolve(__dirname, 'entry-wc.js')
43+
const elements =
44+
prefix === ''
45+
? [createElement('', libName, files[0])]
46+
: files.map(file => createElement(prefix, file, file, async)).join('\n')
47+
2748
const content = `
2849
import Vue from 'vue'
2950
import wrap from '@vue/web-component-wrapper'
@@ -40,15 +61,7 @@ import 'vue-loader/lib/runtime/component-normalizer'
4061
}
4162
})()
4263
43-
${files.map(file => {
44-
const { camelName, kebabName } = exports.fileToComponentName(prefix, file)
45-
return async
46-
? `window.customElements.define('${kebabName}', wrap(Vue, () => import('~root/${file}')))\n`
47-
: (
48-
`import ${camelName} from '~root/${file}'\n` +
49-
`window.customElements.define('${kebabName}', wrap(Vue, ${camelName}))\n`
50-
)
51-
}).join('\n')}`.trim()
64+
${elements}`.trim()
5265
fs.writeFileSync(filePath, content)
5366
return filePath
5467
}

0 commit comments

Comments
 (0)