@shijiu/jsview-vue 0.9.631 → 1.9.628

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. package/dom/bin/jsview-browser-debug-dom.min.js +1 -1
  2. package/dom/bin/jsview-dom.min.js +1 -1
  3. package/dom/{target_core_revision.js → target_core_revision.mjs} +6 -6
  4. package/index.d.ts +1 -0
  5. package/index.js +1 -10
  6. package/loader/jsview-main.js +1 -1
  7. package/loader/loader.js +0 -1
  8. package/package.json +3 -3
  9. package/patches/node_modules/@vue/compiler-sfc/dist/compiler-sfc.cjs.js +17225 -2182
  10. package/patches/node_modules/@vue/compiler-sfc/dist/jsview-css-to-js.js +10 -12
  11. package/patches/node_modules/@vue/compiler-sfc/dist/jsview-style-format.js +5 -1
  12. package/patches/node_modules/@vue/compiler-sfc/dist/jsview-style-types.js +6 -1
  13. package/patches/node_modules/@vue/runtime-core/dist/runtime-core.esm-bundler.js +6972 -7050
  14. package/patches/node_modules/@vue/runtime-dom/dist/runtime-dom.esm-bundler.js +221 -117
  15. package/patches/node_modules/postcss-js/objectifier.js +4 -4
  16. package/samples/Basic/App.vue +2 -2
  17. package/samples/Basic/components/FontStyle.css +1 -1
  18. package/samples/Basic/components/anim/AnimGroup.vue +4 -4
  19. package/samples/Basic/components/div/DivGroup1.vue +4 -4
  20. package/samples/Basic/components/div/DivGroup2.vue +5 -5
  21. package/samples/Basic/components/img/ImageGroup.vue +2 -2
  22. package/samples/Basic/components/panel/Panel1.vue +6 -6
  23. package/samples/Basic/components/panel/Panel2.vue +2 -2
  24. package/samples/Basic/components/text/TextGroup1.vue +4 -4
  25. package/samples/Basic/components/text/TextGroup2.vue +2 -2
  26. package/samples/Basic/components/text/TextOverflow.vue +2 -2
  27. package/samples/DemoHomepage/App.vue +1 -1
  28. package/samples/DemoHomepage/components/BodyFrame.vue +0 -2
  29. package/samples/DemoHomepage/router.js +36 -51
  30. package/samples/DemoHomepage/views/Homepage.vue +9 -5
  31. package/samples/HashHistory/router.js +6 -6
  32. package/samples/Input/App.vue +17 -8
  33. package/samples/Input/InputPanel.vue +11 -18
  34. package/samples/MetroWidgetDemos/PingPong/App.vue +3 -3
  35. package/samples/MetroWidgetDemos/PingPong/AppPage.vue +2 -17
  36. package/samples/MetroWidgetDemos/PingPong/AppTab.vue +10 -3
  37. package/samples/MetroWidgetDemos/PingPong/{TabItem.vue → Item.vue} +10 -2
  38. package/samples/MetroWidgetDemos/PingPong/ViewSwiper.vue +2 -2
  39. package/samples/Preload/App.vue +11 -16
  40. package/samples/SprayView/App.vue +2 -2
  41. package/samples/TextureAnimation/App2.vue +14 -42
  42. package/samples/VideoDemo/App.vue +2 -2
  43. package/samples/VisibleSensorDemo/App.vue +25 -92
  44. package/scripts/jsview-post-install.js +5 -5
  45. package/scripts/jsview-run-android.js +12 -11
  46. package/utils/JsViewEngineWidget/JsvFocusBlock.vue +56 -52
  47. package/utils/JsViewEngineWidget/JsvFocusManager.js +1 -1
  48. package/utils/JsViewPlugin/JsvPlayer/JsvMedia.js +2 -36
  49. package/utils/JsViewPlugin/JsvPlayer/JsvPlayer.vue +0 -14
  50. package/utils/JsViewPlugin/JsvPlayer/index.js +1 -8
  51. package/utils/JsViewPlugin/JsvPlayer/version.js +4 -4
  52. package/utils/JsViewVueTools/JsvHashHistory.js +12 -12
  53. package/utils/JsViewVueTools/index.d.ts +5 -1
  54. package/utils/JsViewVueTools/index.js +1 -2
  55. package/utils/JsViewVueWidget/BrowserDebugWidget/BrowserPreload.vue +1 -11
  56. package/utils/JsViewVueWidget/JsvActorMove/JsvActorMove.vue +2 -2
  57. package/utils/JsViewVueWidget/JsvInput/Cursor.vue +2 -4
  58. package/utils/JsViewVueWidget/JsvInput/JsvInput.vue +12 -13
  59. package/utils/JsViewVueWidget/JsvPreload/JsvPreload.vue +41 -37
  60. package/utils/JsViewVueWidget/JsvTextureAnim/JsvTextureAnim.vue +8 -1
  61. package/utils/JsViewVueWidget/JsvVisibleSensor/JsvVisibleSensor.vue +1 -1
  62. package/utils/index.d.ts +3 -0
  63. package/utils/index.js +10 -0
  64. package/dom/jsv-browser-debug-dom.js_1 +0 -8
  65. package/dom/jsv-dom.js_1 +0 -6
  66. package/dom/jsv-forge-define.js_1 +0 -6
  67. package/patches/node_modules/@babel/preset-env/lib/available-plugins.js +0 -219
  68. package/patches/node_modules/@vue/cli-plugin-typescript/index.js +0 -100
  69. package/patches/node_modules/@vue/cli-service/lib/commands/serve.js +0 -395
  70. package/patches/node_modules/@vue/cli-service/lib/config/app.js +0 -272
  71. package/patches/node_modules/@vue/cli-service/lib/config/assets.js +0 -70
  72. package/patches/node_modules/@vue/cli-service/lib/config/base.js +0 -212
  73. package/patches/node_modules/vue-loader/dist/resolveScript.js +0 -70
  74. package/samples/Collision/App.vue +0 -452
  75. package/samples/ImpactStop/App.vue +0 -435
  76. package/samples/TextureAnimation/assets/light.png +0 -0
  77. package/samples/TextureAnimation/assets/light2.png +0 -0
  78. package/utils/JsViewVueTools/JsvImpactTracer.js +0 -113
@@ -1,395 +0,0 @@
1
- const {
2
- info,
3
- error,
4
- hasProjectYarn,
5
- hasProjectPnpm,
6
- openBrowser,
7
- IpcMessenger
8
- } = require('@vue/cli-shared-utils')
9
-
10
- const defaults = {
11
- host: '0.0.0.0',
12
- port: 8080,
13
- https: false
14
- }
15
-
16
- /** @type {import('@vue/cli-service').ServicePlugin} */
17
- module.exports = (api, options) => {
18
- api.registerCommand('serve', {
19
- description: 'start development server',
20
- usage: 'vue-cli-service serve [options] [entry]',
21
- options: {
22
- '--open': `open browser on server start`,
23
- '--copy': `copy url to clipboard on server start`,
24
- '--stdin': `close when stdin ends`,
25
- '--mode': `specify env mode (default: development)`,
26
- '--host': `specify host (default: ${defaults.host})`,
27
- '--port': `specify port (default: ${defaults.port})`,
28
- '--https': `use https (default: ${defaults.https})`,
29
- '--public': `specify the public network URL for the HMR client`,
30
- '--skip-plugins': `comma-separated list of plugin names to skip for this run`
31
- }
32
- }, async function serve (args) {
33
- info('Starting development server...')
34
-
35
- // although this is primarily a dev server, it is possible that we
36
- // are running it in a mode with a production env, e.g. in E2E tests.
37
- const isInContainer = checkInContainer()
38
- const isProduction = process.env.NODE_ENV === 'production'
39
-
40
- const url = require('url')
41
- const { chalk } = require('@vue/cli-shared-utils')
42
- const webpack = require('webpack')
43
- const WebpackDevServer = require('webpack-dev-server')
44
- const portfinder = require('portfinder')
45
- const prepareURLs = require('../util/prepareURLs')
46
- const prepareProxy = require('../util/prepareProxy')
47
- const launchEditorMiddleware = require('launch-editor-middleware')
48
- const validateWebpackConfig = require('../util/validateWebpackConfig')
49
- const isAbsoluteUrl = require('../util/isAbsoluteUrl')
50
-
51
- // configs that only matters for dev server
52
- api.chainWebpack(webpackConfig => {
53
- if (process.env.NODE_ENV !== 'production' && process.env.NODE_ENV !== 'test') {
54
- if (!webpackConfig.get('devtool')) {
55
- webpackConfig
56
- .devtool('eval-cheap-module-source-map')
57
- }
58
-
59
- webpackConfig
60
- .plugin('hmr')
61
- .use(require('webpack/lib/HotModuleReplacementPlugin'))
62
-
63
- // https://github.com/webpack/webpack/issues/6642
64
- // https://github.com/vuejs/vue-cli/issues/3539
65
- webpackConfig
66
- .output
67
- .globalObject(`(typeof self !== 'undefined' ? self : this)`)
68
-
69
- if (!process.env.VUE_CLI_TEST && options.devServer.progress !== false) {
70
- webpackConfig
71
- .plugin('progress')
72
- .use(webpack.ProgressPlugin)
73
- }
74
- }
75
- })
76
-
77
- // resolve webpack config
78
- const webpackConfig = api.resolveWebpackConfig()
79
-
80
- // check for common config errors
81
- validateWebpackConfig(webpackConfig, api, options)
82
-
83
- // load user devServer options with higher priority than devServer
84
- // in webpack config
85
- const projectDevServerOptions = Object.assign(
86
- webpackConfig.devServer || {},
87
- options.devServer
88
- )
89
-
90
- // expose advanced stats
91
- if (args.dashboard) {
92
- const DashboardPlugin = require('../webpack/DashboardPlugin')
93
- ;(webpackConfig.plugins = webpackConfig.plugins || []).push(new DashboardPlugin({
94
- type: 'serve'
95
- }))
96
- }
97
-
98
- // entry arg
99
- const entry = args._[0]
100
- if (entry) {
101
- webpackConfig.entry = {
102
- app: api.resolve(entry)
103
- }
104
- }
105
-
106
- // resolve server options
107
- const useHttps = args.https || projectDevServerOptions.https || defaults.https
108
- const protocol = useHttps ? 'https' : 'http'
109
- const host = args.host || process.env.HOST || projectDevServerOptions.host || defaults.host
110
- portfinder.basePort = args.port || process.env.PORT || projectDevServerOptions.port || defaults.port
111
- const port = await portfinder.getPortPromise()
112
- const rawPublicUrl = args.public || projectDevServerOptions.public
113
- const publicUrl = rawPublicUrl
114
- ? /^[a-zA-Z]+:\/\//.test(rawPublicUrl)
115
- ? rawPublicUrl
116
- : `${protocol}://${rawPublicUrl}`
117
- : null
118
- const publicHost = publicUrl ? /^[a-zA-Z]+:\/\/([^/?#]+)/.exec(publicUrl)[1] : undefined
119
-
120
- const urls = prepareURLs(
121
- protocol,
122
- host,
123
- port,
124
- isAbsoluteUrl(options.publicPath) ? '/' : options.publicPath
125
- )
126
- const localUrlForBrowser = publicUrl || urls.localUrlForBrowser
127
-
128
- const proxySettings = prepareProxy(
129
- projectDevServerOptions.proxy,
130
- api.resolve('public')
131
- )
132
-
133
- // inject dev & hot-reload middleware entries
134
- if (!isProduction) {
135
- const sockPath = projectDevServerOptions.sockPath || '/sockjs-node'
136
- const sockjsUrl = publicUrl
137
- // explicitly configured via devServer.public
138
- ? `?${publicUrl}&sockPath=${sockPath}`
139
- : isInContainer
140
- // can't infer public network url if inside a container...
141
- // use client-side inference (note this would break with non-root publicPath)
142
- ? ``
143
- // otherwise infer the url
144
- : `?` + url.format({
145
- protocol,
146
- port,
147
- hostname: urls.lanUrlForConfig || 'localhost'
148
- }) + `&sockPath=${sockPath}`
149
- const devClients = [
150
- // dev server client
151
- require.resolve(`webpack-dev-server/client`) + sockjsUrl,
152
- // hmr client
153
- require.resolve(projectDevServerOptions.hotOnly
154
- ? 'webpack/hot/only-dev-server'
155
- : 'webpack/hot/dev-server')
156
- // TODO custom overlay client
157
- // `@vue/cli-overlay/dist/client`
158
- ]
159
- if (process.env.APPVEYOR) {
160
- devClients.push(`webpack/hot/poll?500`)
161
- }
162
- // inject dev/hot client
163
- addDevClientToEntry(webpackConfig, devClients)
164
- }
165
-
166
- // create compiler
167
- const compiler = webpack(webpackConfig)
168
-
169
- // handle compiler error
170
- compiler.hooks.failed.tap('vue-cli-service serve', msg => {
171
- error(msg)
172
- process.exit(1)
173
- })
174
-
175
- // create server
176
- const server = new WebpackDevServer(compiler, Object.assign({
177
- logLevel: 'silent',
178
- clientLogLevel: 'silent',
179
- historyApiFallback: {
180
- disableDotRule: true,
181
- htmlAcceptHeaders: [
182
- 'text/html',
183
- 'application/xhtml+xml'
184
- ],
185
- rewrites: genHistoryApiFallbackRewrites(options.publicPath, options.pages)
186
- },
187
- contentBase: api.resolve('public'),
188
- watchContentBase: !isProduction,
189
- hot: !isProduction,
190
- injectClient: false,
191
- compress: isProduction,
192
- publicPath: options.publicPath,
193
- overlay: isProduction // TODO disable this
194
- ? false
195
- : { warnings: false, errors: true }
196
- }, projectDevServerOptions, {
197
- https: useHttps,
198
- proxy: proxySettings,
199
- public: publicHost,
200
- // eslint-disable-next-line no-shadow
201
- before (app, server) {
202
- // launch editor support.
203
- // this works with vue-devtools & @vue/cli-overlay
204
- app.use('/__open-in-editor', launchEditorMiddleware(() => console.log(
205
- `To specify an editor, specify the EDITOR env variable or ` +
206
- `add "editor" field to your Vue project config.\n`
207
- )))
208
- // allow other plugins to register middlewares, e.g. PWA
209
- api.service.devServerConfigFns.forEach(fn => fn(app, server))
210
- // apply in project middlewares
211
- projectDevServerOptions.before && projectDevServerOptions.before(app, server)
212
- },
213
- // avoid opening browser
214
- open: false
215
- }))
216
-
217
- ;['SIGINT', 'SIGTERM'].forEach(signal => {
218
- process.on(signal, () => {
219
- server.close(() => {
220
- process.exit(0)
221
- })
222
- })
223
- })
224
-
225
- if (args.stdin) {
226
- process.stdin.on('end', () => {
227
- server.close(() => {
228
- process.exit(0)
229
- })
230
- })
231
-
232
- process.stdin.resume()
233
- }
234
-
235
- // on appveyor, killing the process with SIGTERM causes execa to
236
- // throw error
237
- if (process.env.VUE_CLI_TEST) {
238
- process.stdin.on('data', data => {
239
- if (data.toString() === 'close') {
240
- console.log('got close signal!')
241
- server.close(() => {
242
- process.exit(0)
243
- })
244
- }
245
- })
246
- }
247
-
248
- return new Promise((resolve, reject) => {
249
- // log instructions & open browser on first compilation complete
250
- let isFirstCompile = true
251
- compiler.hooks.done.tap('vue-cli-service serve', stats => {
252
- if (stats.hasErrors()) {
253
- return
254
- }
255
-
256
- let copied = ''
257
- if (isFirstCompile && args.copy) {
258
- try {
259
- require('clipboardy').writeSync(localUrlForBrowser)
260
- copied = chalk.dim('(copied to clipboard)')
261
- } catch (_) {
262
- /* catch exception if copy to clipboard isn't supported (e.g. WSL), see issue #3476 */
263
- }
264
- }
265
-
266
- const networkUrl = publicUrl
267
- ? publicUrl.replace(/([^/])$/, '$1/')
268
- : urls.lanUrlForTerminal
269
-
270
- // JsView Added >>>>>
271
- const fs = require('fs-extra')
272
- const path = require('path')
273
- const jsviewCacheDir = path.resolve('node_modules/.cache', 'jsview')
274
- const networkFilePath = path.resolve(jsviewCacheDir, 'network')
275
- fs.ensureDirSync(jsviewCacheDir);
276
- fs.writeFileSync(networkFilePath, `module.exports="${networkUrl}"`)
277
- // JsView Added <<<<<
278
-
279
- console.log()
280
- console.log(` App running at:`)
281
- console.log(` - Local: ${chalk.cyan(urls.localUrlForTerminal)} ${copied}`)
282
- if (!isInContainer) {
283
- console.log(` - Network: ${chalk.cyan(networkUrl)}`)
284
- } else {
285
- console.log()
286
- console.log(chalk.yellow(` It seems you are running Vue CLI inside a container.`))
287
- if (!publicUrl && options.publicPath && options.publicPath !== '/') {
288
- console.log()
289
- console.log(chalk.yellow(` Since you are using a non-root publicPath, the hot-reload socket`))
290
- console.log(chalk.yellow(` will not be able to infer the correct URL to connect. You should`))
291
- console.log(chalk.yellow(` explicitly specify the URL via ${chalk.blue(`devServer.public`)}.`))
292
- console.log()
293
- }
294
- console.log(chalk.yellow(` Access the dev server via ${chalk.cyan(
295
- `${protocol}://localhost:<your container's external mapped port>${options.publicPath}`
296
- )}`))
297
- }
298
- console.log()
299
-
300
- if (isFirstCompile) {
301
- isFirstCompile = false
302
-
303
- if (!isProduction) {
304
- const buildCommand = hasProjectYarn(api.getCwd()) ? `yarn build` : hasProjectPnpm(api.getCwd()) ? `pnpm run build` : `npm run build`
305
- console.log(` Note that the development build is not optimized.`)
306
- console.log(` To create a production build, run ${chalk.cyan(buildCommand)}.`)
307
- } else {
308
- console.log(` App is served in production mode.`)
309
- console.log(` Note this is for preview or E2E testing only.`)
310
- }
311
- console.log()
312
-
313
- if (args.open || projectDevServerOptions.open) {
314
- const pageUri = (projectDevServerOptions.openPage && typeof projectDevServerOptions.openPage === 'string')
315
- ? projectDevServerOptions.openPage
316
- : ''
317
- openBrowser(localUrlForBrowser + pageUri)
318
- }
319
-
320
- // Send final app URL
321
- if (args.dashboard) {
322
- const ipc = new IpcMessenger()
323
- ipc.send({
324
- vueServe: {
325
- url: localUrlForBrowser
326
- }
327
- })
328
- }
329
-
330
- // resolve returned Promise
331
- // so other commands can do api.service.run('serve').then(...)
332
- resolve({
333
- server,
334
- url: localUrlForBrowser
335
- })
336
- } else if (process.env.VUE_CLI_TEST) {
337
- // signal for test to check HMR
338
- console.log('App updated')
339
- }
340
- })
341
-
342
- server.listen(port, host, err => {
343
- if (err) {
344
- reject(err)
345
- }
346
- })
347
- })
348
- })
349
- }
350
-
351
- function addDevClientToEntry (config, devClient) {
352
- const { entry } = config
353
- if (typeof entry === 'object' && !Array.isArray(entry)) {
354
- Object.keys(entry).forEach((key) => {
355
- entry[key] = devClient.concat(entry[key])
356
- })
357
- } else if (typeof entry === 'function') {
358
- config.entry = entry(devClient)
359
- } else {
360
- config.entry = devClient.concat(entry)
361
- }
362
- }
363
-
364
- // https://stackoverflow.com/a/20012536
365
- function checkInContainer () {
366
- if ('CODESANDBOX_SSE' in process.env) {
367
- return true
368
- }
369
- const fs = require('fs')
370
- if (fs.existsSync(`/proc/1/cgroup`)) {
371
- const content = fs.readFileSync(`/proc/1/cgroup`, 'utf-8')
372
- return /:\/(lxc|docker|kubepods(\.slice)?)\//.test(content)
373
- }
374
- }
375
-
376
- function genHistoryApiFallbackRewrites (baseUrl, pages = {}) {
377
- const path = require('path')
378
- const multiPageRewrites = Object
379
- .keys(pages)
380
- // sort by length in reversed order to avoid overrides
381
- // eg. 'page11' should appear in front of 'page1'
382
- .sort((a, b) => b.length - a.length)
383
- .map(name => ({
384
- from: new RegExp(`^/${name}`),
385
- to: path.posix.join(baseUrl, pages[name].filename || `${name}.html`)
386
- }))
387
- return [
388
- ...multiPageRewrites,
389
- { from: /./, to: path.posix.join(baseUrl, 'index.html') }
390
- ]
391
- }
392
-
393
- module.exports.defaultModes = {
394
- serve: 'development'
395
- }
@@ -1,272 +0,0 @@
1
- // config that are specific to --target app
2
- const fs = require('fs')
3
- const path = require('path')
4
-
5
- // ensure the filename passed to html-webpack-plugin is a relative path
6
- // because it cannot correctly handle absolute paths
7
- function ensureRelative (outputDir, _path) {
8
- if (path.isAbsolute(_path)) {
9
- return path.relative(outputDir, _path)
10
- } else {
11
- return _path
12
- }
13
- }
14
-
15
- module.exports = (api, options) => {
16
- api.chainWebpack(webpackConfig => {
17
- // only apply when there's no alternative target
18
- if (process.env.VUE_CLI_BUILD_TARGET && process.env.VUE_CLI_BUILD_TARGET !== 'app') {
19
- return
20
- }
21
-
22
- const isProd = process.env.NODE_ENV === 'production'
23
- const isLegacyBundle = process.env.VUE_CLI_MODERN_MODE && !process.env.VUE_CLI_MODERN_BUILD
24
- const outputDir = api.resolve(options.outputDir)
25
-
26
- const getAssetPath = require('../util/getAssetPath')
27
- const outputFilename = getAssetPath(
28
- options,
29
- `js/[name]${isLegacyBundle ? `-legacy` : ``}${isProd && options.filenameHashing ? '.[contenthash:8]' : ''}.js`
30
- )
31
- webpackConfig
32
- .output
33
- .filename(outputFilename)
34
- .chunkFilename(outputFilename)
35
-
36
- const webpack = require('webpack')
37
- const { semver } = require('@vue/cli-shared-utils')
38
- const webpackMajor = semver.major(webpack.version)
39
- if (webpackMajor !== 4) {
40
- // FIXME: a temporary workaround to get accurate contenthash in `applyLegacy`
41
- // Should use a better fix per discussions at <https://github.com/jantimon/html-webpack-plugin/issues/1554#issuecomment-753653580>
42
- webpackConfig.optimization
43
- .set('realContentHash', false)
44
- }
45
-
46
- // code splitting
47
- // QCode Removed >>>>>
48
- // if (process.env.NODE_ENV !== 'test') {
49
- // webpackConfig.optimization.splitChunks({
50
- // cacheGroups: {
51
- // defaultVendors: {
52
- // name: `chunk-vendors`,
53
- // test: /[\\/]node_modules[\\/]/,
54
- // priority: -10,
55
- // chunks: 'initial'
56
- // },
57
- // common: {
58
- // name: `chunk-common`,
59
- // minChunks: 2,
60
- // priority: -20,
61
- // chunks: 'initial',
62
- // reuseExistingChunk: true
63
- // }
64
- // }
65
- // })
66
- // }
67
- // QCode Removed <<<<<
68
-
69
- // HTML plugin
70
- const resolveClientEnv = require('../util/resolveClientEnv')
71
-
72
- const htmlOptions = {
73
- title: api.service.pkg.name,
74
- scriptLoading: 'defer',
75
- templateParameters: (compilation, assets, assetTags, pluginOptions) => {
76
- // enhance html-webpack-plugin's built in template params
77
- let stats
78
- return Object.assign({
79
- // make stats lazy as it is expensive
80
- // TODO: not sure if it's still needed as of <https://github.com/jantimon/html-webpack-plugin/issues/780#issuecomment-390651831>
81
- get webpack () {
82
- return stats || (stats = compilation.getStats().toJson())
83
- },
84
- compilation: compilation,
85
- webpackConfig: compilation.options,
86
- htmlWebpackPlugin: {
87
- tags: assetTags,
88
- files: assets,
89
- options: pluginOptions
90
- }
91
- }, resolveClientEnv(options, true /* raw */))
92
- }
93
- }
94
-
95
- // handle indexPath
96
- if (options.indexPath !== 'index.html') {
97
- // why not set filename for html-webpack-plugin?
98
- // 1. It cannot handle absolute paths
99
- // 2. Relative paths causes incorrect SW manifest to be generated (#2007)
100
- webpackConfig
101
- .plugin('move-index')
102
- .use(require('../webpack/MovePlugin'), [
103
- path.resolve(outputDir, 'index.html'),
104
- path.resolve(outputDir, options.indexPath)
105
- ])
106
- }
107
-
108
- // resolve HTML file(s)
109
- const HTMLPlugin = require('html-webpack-plugin')
110
- // const PreloadPlugin = require('@vue/preload-webpack-plugin')
111
- const multiPageConfig = options.pages
112
- const htmlPath = api.resolve('public/index.html')
113
- const defaultHtmlPath = path.resolve(__dirname, 'index-default.html')
114
- const publicCopyIgnore = ['**/.DS_Store']
115
-
116
- if (!multiPageConfig) {
117
- // default, single page setup.
118
- htmlOptions.template = fs.existsSync(htmlPath)
119
- ? htmlPath
120
- : defaultHtmlPath
121
-
122
- publicCopyIgnore.push(api.resolve(htmlOptions.template).replace(/\\/g, '/'))
123
-
124
- webpackConfig
125
- .plugin('html')
126
- .use(HTMLPlugin, [htmlOptions])
127
-
128
- // FIXME: need to test out preload plugin's compatibility with html-webpack-plugin 4/5
129
- // if (!isLegacyBundle) {
130
- // // inject preload/prefetch to HTML
131
- // webpackConfig
132
- // .plugin('preload')
133
- // .use(PreloadPlugin, [{
134
- // rel: 'preload',
135
- // include: 'initial',
136
- // fileBlacklist: [/\.map$/, /hot-update\.js$/]
137
- // }])
138
-
139
- // webpackConfig
140
- // .plugin('prefetch')
141
- // .use(PreloadPlugin, [{
142
- // rel: 'prefetch',
143
- // include: 'asyncChunks'
144
- // }])
145
- // }
146
- } else {
147
- // multi-page setup
148
- webpackConfig.entryPoints.clear()
149
-
150
- const pages = Object.keys(multiPageConfig)
151
- const normalizePageConfig = c => typeof c === 'string' ? { entry: c } : c
152
-
153
- pages.forEach(name => {
154
- const pageConfig = normalizePageConfig(multiPageConfig[name])
155
- const {
156
- entry,
157
- template = `public/${name}.html`,
158
- filename = `${name}.html`,
159
- chunks = ['chunk-vendors', 'chunk-common', name]
160
- } = pageConfig
161
-
162
- // Currently Cypress v3.1.0 comes with a very old version of Node,
163
- // which does not support object rest syntax.
164
- // (https://github.com/cypress-io/cypress/issues/2253)
165
- // So here we have to extract the customHtmlOptions manually.
166
- const customHtmlOptions = {}
167
- for (const key in pageConfig) {
168
- if (
169
- !['entry', 'template', 'filename', 'chunks'].includes(key)
170
- ) {
171
- customHtmlOptions[key] = pageConfig[key]
172
- }
173
- }
174
-
175
- // inject entry
176
- const entries = Array.isArray(entry) ? entry : [entry]
177
- webpackConfig.entry(name).merge(entries.map(e => api.resolve(e)))
178
-
179
- // trim inline loader
180
- // * See https://github.com/jantimon/html-webpack-plugin/blob/master/docs/template-option.md#2-setting-a-loader-directly-for-the-template
181
- const templateWithoutLoader = template.replace(/^.+!/, '').replace(/\?.+$/, '')
182
-
183
- // resolve page index template
184
- const hasDedicatedTemplate = fs.existsSync(api.resolve(templateWithoutLoader))
185
- const templatePath = hasDedicatedTemplate
186
- ? template
187
- : fs.existsSync(htmlPath)
188
- ? htmlPath
189
- : defaultHtmlPath
190
-
191
- publicCopyIgnore.push(api.resolve(templateWithoutLoader).replace(/\\/g, '/'))
192
-
193
- // inject html plugin for the page
194
- const pageHtmlOptions = Object.assign(
195
- {},
196
- htmlOptions,
197
- {
198
- chunks,
199
- template: templatePath,
200
- filename: ensureRelative(outputDir, filename)
201
- },
202
- customHtmlOptions
203
- )
204
-
205
- webpackConfig
206
- .plugin(`html-${name}`)
207
- .use(HTMLPlugin, [pageHtmlOptions])
208
- })
209
-
210
- // FIXME: preload plugin is not compatible with webpack 5 / html-webpack-plugin 4 yet
211
- // if (!isLegacyBundle) {
212
- // pages.forEach(name => {
213
- // const filename = ensureRelative(
214
- // outputDir,
215
- // normalizePageConfig(multiPageConfig[name]).filename || `${name}.html`
216
- // )
217
- // webpackConfig
218
- // .plugin(`preload-${name}`)
219
- // .use(PreloadPlugin, [{
220
- // rel: 'preload',
221
- // includeHtmlNames: [filename],
222
- // include: {
223
- // type: 'initial',
224
- // entries: [name]
225
- // },
226
- // fileBlacklist: [/\.map$/, /hot-update\.js$/]
227
- // }])
228
-
229
- // webpackConfig
230
- // .plugin(`prefetch-${name}`)
231
- // .use(PreloadPlugin, [{
232
- // rel: 'prefetch',
233
- // includeHtmlNames: [filename],
234
- // include: {
235
- // type: 'asyncChunks',
236
- // entries: [name]
237
- // }
238
- // }])
239
- // })
240
- // }
241
- }
242
-
243
- // CORS and Subresource Integrity
244
- if (options.crossorigin != null || options.integrity) {
245
- webpackConfig
246
- .plugin('cors')
247
- .use(require('../webpack/CorsPlugin'), [{
248
- crossorigin: options.crossorigin,
249
- integrity: options.integrity,
250
- publicPath: options.publicPath
251
- }])
252
- }
253
-
254
- // copy static assets in public/
255
- const publicDir = api.resolve('public')
256
- if (!isLegacyBundle && fs.existsSync(publicDir)) {
257
- webpackConfig
258
- .plugin('copy')
259
- .use(require('copy-webpack-plugin'), [{
260
- patterns: [{
261
- from: publicDir,
262
- to: outputDir,
263
- toType: 'dir',
264
- noErrorOnMissing: true,
265
- globOptions: {
266
- ignore: publicCopyIgnore
267
- }
268
- }]
269
- }])
270
- }
271
- })
272
- }