1 | #!/usr/bin/env node
|
2 |
|
3 | const parseArgs = require('minimist')
|
4 |
|
5 | const argv = parseArgs(process.argv.slice(2), {
|
6 | alias: {
|
7 | t: 'theme',
|
8 | m: 'mode',
|
9 | T: 'target',
|
10 | A: 'arch',
|
11 | b: 'bundler',
|
12 | d: 'debug',
|
13 | h: 'help'
|
14 | },
|
15 | boolean: ['h', 'd'],
|
16 | string: ['t', 'm', 'T'],
|
17 | default: {
|
18 | t: 'mat',
|
19 | m: 'spa'
|
20 | }
|
21 | })
|
22 |
|
23 | if (argv.help) {
|
24 | console.log(`
|
25 | Description
|
26 | Builds distributables of your app.
|
27 | Usage
|
28 | $ quasar build -p <port number>
|
29 | Options
|
30 | --theme, -t App theme (default: mat)
|
31 | --mode, -m App mode [spa|ssr|pwa|cordova|electron] (default: spa)
|
32 | --target, -T App target
|
33 | - Cordova (default: all installed)
|
34 | [android|ios|blackberry10|browser|osx|ubuntu|webos|windows]
|
35 | - Electron with default "electron-packager" bundler (default: yours)
|
36 | [darwin|win32|linux|mas|all]
|
37 | - Electron with "electron-builder" bundler (default: yours)
|
38 | [darwin|mac|win32|win|linux|all]
|
39 | --debug, -d Build for debugging purposes
|
40 | --help, -h Displays this message
|
41 |
|
42 | ONLY for Electron mode:
|
43 | --bundler, -b Bundler (electron-packager or electron-builder)
|
44 | [packager|builder]
|
45 | --arch, -A App architecture (default: yours)
|
46 | - with default "electron-packager" bundler:
|
47 | [ia32|x64|armv7l|arm64|mips64el|all]
|
48 | - with "electron-builder" bundler:
|
49 | [ia32|x64|armv7l|arm64|all]
|
50 | `)
|
51 | process.exit(0)
|
52 | }
|
53 |
|
54 | const chalk = require('chalk')
|
55 |
|
56 | const
|
57 | logger = require('../lib/helpers/logger')
|
58 | log = logger('app:build')
|
59 | warn = logger('app:build', 'red'),
|
60 | banner = require('../lib/helpers/banner')
|
61 |
|
62 | require('../lib/helpers/ensure-argv')(argv, 'build')
|
63 | banner(argv, 'build')
|
64 |
|
65 | if (argv.mode !== 'spa') {
|
66 | require('../lib/mode/install-missing')(argv.mode, argv.target)
|
67 | }
|
68 |
|
69 | const
|
70 | path = require('path'),
|
71 | webpack = require('webpack')
|
72 |
|
73 | const
|
74 | appPaths = require('../lib/app-paths'),
|
75 | QuasarConfig = require('../lib/quasar-config'),
|
76 | Generator = require('../lib/generator'),
|
77 | artifacts = require('../lib/artifacts'),
|
78 | ensureDeps = require('../lib/helpers/ensure-deps')
|
79 |
|
80 | function parseWebpackConfig (webpackConfig, mode) {
|
81 | if (mode === 'ssr') {
|
82 | return [ webpackConfig.server, webpackConfig.client ]
|
83 | }
|
84 | if (mode === 'electron') {
|
85 | return [ webpackConfig.renderer, webpackConfig.main ]
|
86 | }
|
87 | return webpackConfig
|
88 | }
|
89 |
|
90 | function finalize (mode, quasarConfig) {
|
91 | if (mode === 'cordova') {
|
92 | return require('../lib/cordova').build(quasarConfig)
|
93 | }
|
94 | if (mode === 'electron') {
|
95 | return require('../lib/electron').build(quasarConfig)
|
96 | }
|
97 |
|
98 | return Promise.resolve()
|
99 | }
|
100 |
|
101 | async function build () {
|
102 | const quasarConfig = new QuasarConfig({
|
103 | theme: argv.theme,
|
104 | mode: argv.mode,
|
105 | target: argv.target,
|
106 | arch: argv.arch,
|
107 | bundler: argv.bundler,
|
108 | debug: argv.debug,
|
109 | prod: true
|
110 | })
|
111 |
|
112 | try {
|
113 | await quasarConfig.prepare()
|
114 | }
|
115 | catch (e) {
|
116 | console.log(e)
|
117 | warn(`⚠️ [FAIL] quasar.conf.js has JS errors`)
|
118 | process.exit(1)
|
119 | }
|
120 |
|
121 | quasarConfig.compile()
|
122 |
|
123 | const
|
124 | generator = new Generator(quasarConfig),
|
125 | webpackConfig = quasarConfig.getWebpackConfig(),
|
126 | buildConfig = quasarConfig.getBuildConfig(),
|
127 | mode = argv.mode.toUpperCase(),
|
128 | outputFolder = buildConfig.build.packagedElectronDist || buildConfig.build.distDir
|
129 |
|
130 | artifacts.clean(outputFolder)
|
131 | generator.prepare()
|
132 | generator.build()
|
133 |
|
134 | log(chalk.bold(`Building...`))
|
135 |
|
136 | webpack(parseWebpackConfig(webpackConfig, argv.mode), (err, stats) => {
|
137 | if (err) { throw err }
|
138 |
|
139 | artifacts.add(outputFolder)
|
140 |
|
141 | statsArray = stats.stats || [ stats ]
|
142 | statsArray.forEach(stat => {
|
143 | process.stdout.write('\n\n' + stat.toString({
|
144 | colors: true,
|
145 | performance: false,
|
146 | hash: false,
|
147 | assets: true,
|
148 | chunks: false,
|
149 | chunkModules: false,
|
150 | chunkOrigins: false,
|
151 | modules: false,
|
152 | nestedModules: false,
|
153 | moduleAssets: false,
|
154 | children: false
|
155 | }) + '\n\n')
|
156 | })
|
157 |
|
158 | statsArray.forEach(stat => {
|
159 | if (stat.hasErrors()) {
|
160 | warn()
|
161 | warn(chalk.red('[FAIL] Build failed with errors. Check log above.'))
|
162 | warn()
|
163 |
|
164 | process.exit(1)
|
165 | }
|
166 | })
|
167 |
|
168 | finalize(argv.mode, quasarConfig).then(() => {
|
169 | banner(argv, 'build', {
|
170 | outputFolder: argv.mode === 'cordova'
|
171 | ? path.join(outputFolder, '..')
|
172 | : outputFolder
|
173 | })
|
174 | })
|
175 | })
|
176 | }
|
177 |
|
178 | ensureDeps()
|
179 | build()
|