@shijiu/jsview-vue 0.9.246 → 0.9.254

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 (173) hide show
  1. package/dom/bin/package.json +11 -11
  2. package/dom/browser-root-style.css +21 -21
  3. package/loader/jsview-main.js +41 -41
  4. package/loader/jsview.config.default.js +37 -37
  5. package/loader/jsview.default.config.js +37 -37
  6. package/package.json +6 -6
  7. package/patches/node_modules/@babel/preset-env/lib/available-plugins.js +218 -218
  8. package/patches/node_modules/@vue/cli-plugin-typescript/index.js +100 -100
  9. package/patches/node_modules/@vue/cli-service/lib/commands/serve.js +395 -395
  10. package/patches/node_modules/@vue/cli-service/lib/config/app.js +272 -272
  11. package/patches/node_modules/@vue/cli-service/lib/config/assets.js +70 -70
  12. package/patches/node_modules/@vue/cli-service/lib/config/base.js +212 -212
  13. package/patches/node_modules/postcss-js/objectifier.js +90 -90
  14. package/patches/node_modules/vue-loader/dist/resolveScript.js +70 -70
  15. package/samples/AdvanceMetroWidget/App.vue +122 -122
  16. package/samples/AdvanceMetroWidget/Frame.vue +100 -100
  17. package/samples/AdvanceMetroWidget/Item.vue +57 -57
  18. package/samples/AdvanceMetroWidget/data.js +136 -136
  19. package/samples/AnimPicture/App.vue +223 -223
  20. package/samples/Basic/App.vue +128 -128
  21. package/samples/Basic/components/TitleBar.vue +28 -28
  22. package/samples/Basic/components/anim/AnimGroup.vue +67 -67
  23. package/samples/Basic/components/anim/AnimKeyframeBasic.vue +101 -101
  24. package/samples/Basic/components/anim/AnimKeyframeComposite.vue +52 -52
  25. package/samples/Basic/components/anim/AnimTransition.vue +116 -116
  26. package/samples/Basic/components/div/DivBackground.vue +14 -14
  27. package/samples/Basic/components/div/DivClip.vue +80 -80
  28. package/samples/Basic/components/div/DivCssScoped.vue +26 -26
  29. package/samples/Basic/components/div/DivCssVar.vue +49 -49
  30. package/samples/Basic/components/div/DivGroup1.vue +32 -32
  31. package/samples/Basic/components/div/DivGroup2.vue +40 -40
  32. package/samples/Basic/components/div/DivLayout.vue +11 -11
  33. package/samples/Basic/components/div/DivRadius.vue +46 -46
  34. package/samples/Basic/components/text/TextAlign.vue +47 -47
  35. package/samples/Basic/components/text/TextFontStyle.vue +57 -57
  36. package/samples/Basic/components/text/TextGroup.vue +31 -31
  37. package/samples/Basic/components/text/TextOverflow.vue +77 -77
  38. package/samples/BasicFocusControl/App.vue +124 -124
  39. package/samples/BasicFocusControl/components/BaseBlock.vue +50 -50
  40. package/samples/BasicFocusControl/components/MainArea.vue +97 -97
  41. package/samples/BasicFocusControl/components/MainAreaLeftBlock.vue +20 -20
  42. package/samples/BasicFocusControl/components/MainAreaRightBlock.vue +29 -29
  43. package/samples/BasicFocusControl/components/SideBar.vue +72 -72
  44. package/samples/BasicFocusControl/components/SideBarBlock.vue +29 -29
  45. package/samples/ClassNameDemo/App.vue +119 -119
  46. package/samples/ClassNameDemo/components/ContentItem.vue +252 -252
  47. package/samples/ClassNameDemo/components/LoadingView.vue +43 -43
  48. package/samples/ClassNameDemo/components/TitleView.vue +24 -24
  49. package/samples/ClassNameDemo/data.js +24 -24
  50. package/samples/ColorSpace/App.vue +134 -134
  51. package/samples/DemoHomepage/App.vue +31 -31
  52. package/samples/DemoHomepage/components/BodyFrame.vue +81 -81
  53. package/samples/DemoHomepage/components/Dialog.vue +93 -93
  54. package/samples/DemoHomepage/components/Item.vue +76 -76
  55. package/samples/DemoHomepage/components/TabFrame.vue +86 -86
  56. package/samples/DemoHomepage/router.js +132 -132
  57. package/samples/DemoHomepage/views/Homepage.vue +186 -186
  58. package/samples/FlipCard/App.vue +80 -80
  59. package/samples/FlipCard/FlipCard.vue +123 -123
  60. package/samples/FlipCard/data.js +12 -12
  61. package/samples/FlowMultiWidget/App.vue +90 -90
  62. package/samples/FlowMultiWidget/components/Block.vue +106 -106
  63. package/samples/FlowMultiWidget/components/FlowPage.vue +59 -59
  64. package/samples/FlowMultiWidget/components/Item.vue +102 -102
  65. package/samples/FlowMultiWidget/components/MenuItem.vue +71 -71
  66. package/samples/FlowMultiWidget/components/MyMenu.vue +89 -89
  67. package/samples/FlowMultiWidget/data.js +446 -446
  68. package/samples/HashHistory/App.vue +124 -124
  69. package/samples/HashHistory/components/HorizontalButtonList.vue +113 -113
  70. package/samples/HashHistory/components/Item.vue +73 -73
  71. package/samples/HashHistory/router.js +29 -29
  72. package/samples/HashHistory/views/BasePage.vue +18 -18
  73. package/samples/HashHistory/views/MainPage.vue +67 -67
  74. package/samples/HashHistory/views/SubPage.vue +78 -78
  75. package/samples/HashHistory/views/SubPageFirst.vue +9 -9
  76. package/samples/HashHistory/views/SubPageSecond.vue +9 -9
  77. package/samples/LongImage/App.vue +96 -96
  78. package/samples/LongImage/Button.vue +153 -153
  79. package/samples/LongImage/LongImageScroll.vue +126 -126
  80. package/samples/LongImage/Scroll.vue +15 -15
  81. package/samples/LongText/App.vue +111 -111
  82. package/samples/LongText/Button.vue +153 -153
  83. package/samples/LongText/LongTextScroll.vue +224 -224
  84. package/samples/LongText/Scroll.vue +15 -15
  85. package/samples/Preload/App.vue +145 -145
  86. package/samples/Preload/data.js +22 -22
  87. package/samples/Preload/preloadItem.vue +21 -21
  88. package/samples/QrcodeDemo/App.vue +72 -72
  89. package/samples/SimpleWidgetDemo/App.vue +203 -203
  90. package/samples/SimpleWidgetDemo/Item.vue +82 -82
  91. package/samples/SimpleWidgetDemo/components/ContentItem.vue +411 -411
  92. package/samples/SimpleWidgetDemo/components/MyTab.vue +116 -116
  93. package/samples/SimpleWidgetDemo/data.js +110 -110
  94. package/samples/SprayView/App.vue +269 -269
  95. package/samples/SpriteImage/App.vue +174 -174
  96. package/samples/SpriteImage/images/egg_break.json +116 -116
  97. package/samples/TextBox/App.vue +178 -178
  98. package/samples/TextBox/RenderCenter.vue +108 -108
  99. package/samples/TextBox/RenderLeft.vue +108 -108
  100. package/samples/TextBox/RenderOneLine.vue +119 -119
  101. package/samples/TextBox/RenderRight.vue +106 -106
  102. package/samples/TextShadowDemo/App.vue +97 -97
  103. package/samples/TextureSize/App.vue +141 -141
  104. package/samples/ThrowMoveDemo/AccelerateDemo.vue +117 -117
  105. package/samples/ThrowMoveDemo/App.vue +113 -113
  106. package/samples/ThrowMoveDemo/LRParabolicDemo.vue +115 -115
  107. package/samples/ThrowMoveDemo/TargetDemo.vue +116 -116
  108. package/samples/ThrowMoveDemo/UDParabolicDemo.vue +121 -121
  109. package/samples/TransitPage/App.vue +40 -40
  110. package/samples/VideoDemo/App.vue +137 -137
  111. package/samples/VideoDemo/components/Button.vue +68 -68
  112. package/samples/VideoDemo/components/Controllor.vue +195 -195
  113. package/samples/VideoDemo/components/VideoFrame.vue +152 -152
  114. package/scripts/common.js +115 -92
  115. package/scripts/deploy-fast-pack.js +17 -0
  116. package/scripts/deploy-fast-publish.js +44 -0
  117. package/scripts/{git-commit-empty.js → deploy-git-commit-empty.js} +21 -21
  118. package/scripts/{pre-pack.js → deploy-prepare.js} +56 -39
  119. package/scripts/{install-local-packages.js → jsview-install-local-packages.js} +73 -73
  120. package/scripts/{post-build.js → jsview-post-build.js} +127 -127
  121. package/scripts/{post-install.js → jsview-post-install.js} +78 -78
  122. package/scripts/{run-android.js → jsview-run-android.js} +64 -64
  123. package/scripts/make-js.sh +181 -181
  124. package/utils/JsViewEngineWidget/bin/index.js +1 -1
  125. package/utils/JsViewEngineWidget/bin/package.json +11 -11
  126. package/utils/JsViewVueTools/JsvHashHistory.js +111 -111
  127. package/utils/JsViewVueTools/JsvRuntimeBridge.js +417 -417
  128. package/utils/JsViewVueWidget/BrowserDebugWidget/BrowserPreload.vue +80 -80
  129. package/utils/JsViewVueWidget/BrowserDebugWidget/BrowserQrcode.vue +147 -147
  130. package/utils/JsViewVueWidget/BrowserDebugWidget/BrowserSpray.vue +54 -54
  131. package/utils/JsViewVueWidget/BrowserDebugWidget/JsvApic/ApicDataBase.js +28 -28
  132. package/utils/JsViewVueWidget/BrowserDebugWidget/JsvApic/BrowserApic.vue +123 -123
  133. package/utils/JsViewVueWidget/BrowserDebugWidget/JsvApic/GifData.js +83 -83
  134. package/utils/JsViewVueWidget/BrowserDebugWidget/JsvApic/LoopToolBase.js +25 -25
  135. package/utils/JsViewVueWidget/BrowserDebugWidget/JsvApic/NormalLoopTool.js +61 -61
  136. package/utils/JsViewVueWidget/BrowserDebugWidget/JsvApic/PartLoopTool.js +119 -119
  137. package/utils/JsViewVueWidget/BrowserDebugWidget/JsvApic/Viewer.js +106 -106
  138. package/utils/JsViewVueWidget/BrowserDebugWidget/JsvApic/WebpData.js +141 -141
  139. package/utils/JsViewVueWidget/BrowserDebugWidget/WidgetLoader.js +20 -20
  140. package/utils/JsViewVueWidget/JsvActorMove/ActorControlBase.js +204 -204
  141. package/utils/JsViewVueWidget/JsvActorMove/JsvActorMove.vue +63 -63
  142. package/utils/JsViewVueWidget/JsvActorMove/JsvActorMoveControl.js +426 -426
  143. package/utils/JsViewVueWidget/JsvActorMove/index.js +12 -12
  144. package/utils/JsViewVueWidget/JsvApic/JsvApic.vue +178 -178
  145. package/utils/JsViewVueWidget/JsvApic/index.js +17 -17
  146. package/utils/JsViewVueWidget/JsvMarquee.vue +196 -196
  147. package/utils/JsViewVueWidget/JsvNinePatch.vue +76 -76
  148. package/utils/JsViewVueWidget/JsvPreload/JsvPreload.vue +350 -350
  149. package/utils/JsViewVueWidget/JsvPreload/index.js +21 -21
  150. package/utils/JsViewVueWidget/JsvQrcode/JsvQrcode.vue +140 -140
  151. package/utils/JsViewVueWidget/JsvQrcode/index.js +18 -18
  152. package/utils/JsViewVueWidget/JsvSpray/JsvSpray.vue +139 -139
  153. package/utils/JsViewVueWidget/JsvSpray/index.js +14 -14
  154. package/utils/JsViewVueWidget/JsvSpriteAnim/JsvSpriteAnim.vue +447 -447
  155. package/utils/JsViewVueWidget/JsvSpriteAnim/SpriteController.js +56 -56
  156. package/utils/JsViewVueWidget/JsvSpriteAnim/index.js +6 -6
  157. package/utils/JsViewVueWidget/JsvSwiper/Indicator.vue +34 -34
  158. package/utils/JsViewVueWidget/JsvSwiper/JsvSwiper.vue +494 -494
  159. package/utils/JsViewVueWidget/JsvSwiper/index.js +9 -9
  160. package/utils/JsViewVueWidget/JsvSwiper3D/Indicator.vue +34 -34
  161. package/utils/JsViewVueWidget/JsvSwiper3D/JsvSwiper.vue +403 -403
  162. package/utils/JsViewVueWidget/JsvSwiper3D/index.js +9 -9
  163. package/utils/JsViewVueWidget/JsvTextBox.vue +110 -110
  164. package/utils/JsViewVueWidget/JsvVideo.vue +35 -35
  165. package/vetur.config.js +5 -5
  166. package/.gitmodules +0 -6
  167. package/README.md +0 -15
  168. package/doc/IMPORT_CHANGE_LOG.txt +0 -3
  169. package/doc/about-project-postinstall.md +0 -0
  170. package/doc/git_commit.md +0 -15
  171. package/doc/test_version_up.txt +0 -1
  172. package/scripts/update-version.js +0 -32
  173. package/shijiu-jsview-vue-0.9.246.tgz +0 -0
@@ -1,272 +1,272 @@
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
- }
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
+ }