1
1
const path = require ( 'path' )
2
2
const {
3
- filesToComponentNames,
4
- generateMultiWebComponentEntry
5
- } = require ( './generateMultiWcEntry' )
3
+ resolveEntry,
4
+ fileToComponentName
5
+ } = require ( './resolveWebComponentEntry' )
6
+
7
+ module . exports = ( api , { target, entry, name, dest } ) => {
8
+ // setting this disables app-only configs
9
+ process . env . VUE_CLI_TARGET = 'web-component'
10
+ // Disable CSS extraction and turn on CSS shadow mode for vue-style-loader
11
+ process . env . VUE_CLI_CSS_SHADOW_MODE = true
6
12
7
- module . exports = ( api , { target, entry, name, dest, prefix } ) => {
8
13
const { log, error } = require ( '@vue/cli-shared-utils' )
9
14
const abort = msg => {
10
15
log ( )
11
16
error ( msg )
12
17
process . exit ( 1 )
13
18
}
14
19
15
- const libName = (
16
- name ||
17
- api . service . pkg . name ||
18
- path . basename ( entry ) . replace ( / \. ( j s x ? | v u e ) $ / , '' )
19
- )
20
- if ( libName . indexOf ( '-' ) < 0 && target !== 'multi-wc' ) {
21
- abort ( `--name must contain a hyphen with --target web-component. (got "${ libName } ")` )
22
- }
20
+ const isAsync = / a s y n c / . test ( target )
23
21
24
- let dynamicEntry
25
- let resolvedFiles
26
- if ( target === 'multi-wc' ) {
27
- if ( ! entry ) {
28
- abort ( `a glob pattern is required with --target multi-web-component.` )
22
+ // generate dynamic entry based on glob files
23
+ const resolvedFiles = require ( 'globby' ) . sync ( [ entry ] , { cwd : api . resolve ( '.' ) } )
24
+ if ( ! resolvedFiles . length ) {
25
+ abort ( `entry pattern "${ entry } " did not match any files.` )
26
+ }
27
+ let libName
28
+ let prefix
29
+ if ( resolvedFiles . length === 1 ) {
30
+ // in single mode, determine the lib name from filename
31
+ libName = name || fileToComponentName ( '' , resolvedFiles [ 0 ] ) . kebabName
32
+ prefix = ''
33
+ if ( libName . indexOf ( '-' ) < 0 ) {
34
+ abort ( `--name must contain a hyphen when building a single web component.` )
29
35
}
30
- // generate dynamic entry based on glob files
31
- resolvedFiles = require ( 'globby' ) . sync ( [ entry ] , { cwd : api . resolve ( '.' ) } )
32
- if ( ! resolvedFiles . length ) {
33
- abort ( `glob pattern "${ entry } " did not match any files.` )
36
+ } else {
37
+ // multi mode
38
+ libName = prefix = ( name || api . service . pkg . name )
39
+ if ( ! libName ) {
40
+ abort ( `--name is required when building multiple web components.` )
34
41
}
35
- dynamicEntry = generateMultiWebComponentEntry ( libName , resolvedFiles )
36
42
}
37
43
38
- // setting this disables app-only configs
39
- process . env . VUE_CLI_TARGET = 'web-component'
40
- // inline all static asset files since there is no publicPath handling
41
- process . env . VUE_CLI_INLINE_LIMIT = Infinity
42
- // Disable CSS extraction and turn on CSS shadow mode for vue-style-loader
43
- process . env . VUE_CLI_CSS_SHADOW_MODE = true
44
+ const dynamicEntry = resolveEntry ( prefix , resolvedFiles , isAsync )
44
45
45
46
function genConfig ( minify , genHTML ) {
46
47
const config = api . resolveChainableWebpackConfig ( )
47
48
48
49
config . entryPoints . clear ( )
50
+ const entryName = `${ libName } ${ minify ? `.min` : `` } `
49
51
50
52
// set proxy entry for *.vue files
51
- if ( target === 'multi-wc' ) {
52
- config
53
- . entry ( `${ libName } ${ minify ? `.min` : `` } ` )
54
- . add ( dynamicEntry )
55
- config . resolve
56
- . alias
57
- . set ( '~root' , api . resolve ( '.' ) )
58
- } else {
59
- config
60
- . entry ( `${ libName } ${ minify ? `.min` : `` } ` )
61
- . add ( require . resolve ( './entry-wc.js' ) )
62
- config . resolve
63
- . alias
64
- . set ( '~entry' , api . resolve ( entry ) )
65
- }
53
+ config
54
+ . entry ( entryName )
55
+ . add ( dynamicEntry )
56
+ config . resolve
57
+ . alias
58
+ . set ( '~root' , api . resolve ( '.' ) )
66
59
67
60
// make sure not to transpile wc-wrapper
68
61
config . module
@@ -77,7 +70,10 @@ module.exports = (api, { target, entry, name, dest, prefix }) => {
77
70
78
71
config . output
79
72
. path ( api . resolve ( dest ) )
80
- . filename ( `[name].js` )
73
+ . filename ( `${ entryName } .js` )
74
+ . chunkFilename ( `${ libName } .[id]${ minify ? `.min` : `` } .js` )
75
+ // use relative publicPath so this can be deployed anywhere
76
+ . publicPath ( './' )
81
77
82
78
// externalize Vue in case user imports it
83
79
config
@@ -106,13 +102,13 @@ module.exports = (api, { target, entry, name, dest, prefix }) => {
106
102
config
107
103
. plugin ( 'demo-html' )
108
104
. use ( require ( 'html-webpack-plugin' ) , [ {
109
- template : path . resolve ( __dirname , `./demo-${ target } .html` ) ,
105
+ template : path . resolve ( __dirname , `./demo-wc .html` ) ,
110
106
inject : false ,
111
107
filename : 'demo.html' ,
112
108
libName,
113
- components : target === 'multi-wc'
114
- ? filesToComponentNames ( libName , resolvedFiles ) . map ( c => c . kebabName )
115
- : null
109
+ components : resolvedFiles . map ( file => {
110
+ return fileToComponentName ( prefix , file ) . kebabName
111
+ } )
116
112
} ] )
117
113
}
118
114
0 commit comments