@mpxjs/webpack-plugin 2.6.115 → 2.7.0-alpha

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 (129) hide show
  1. package/LICENSE +433 -0
  2. package/README.md +1 -1
  3. package/lib/config.js +14 -0
  4. package/lib/dependencies/AddEntryDependency.js +24 -0
  5. package/lib/dependencies/AppEntryDependency.js +58 -0
  6. package/lib/dependencies/CommonJsAsyncDependency.js +51 -0
  7. package/lib/dependencies/CommonJsVariableDependency.js +81 -0
  8. package/lib/dependencies/DynamicEntryDependency.js +171 -0
  9. package/lib/dependencies/FlagPluginDependency.js +24 -0
  10. package/lib/dependencies/InjectDependency.js +43 -0
  11. package/lib/dependencies/RecordGlobalComponentsDependency.js +50 -0
  12. package/lib/dependencies/RecordIndependentDependency.js +44 -0
  13. package/lib/dependencies/RecordResourceMapDependency.js +62 -0
  14. package/lib/dependencies/RemoveEntryDependency.js +40 -0
  15. package/lib/{dependency → dependencies}/ReplaceDependency.js +19 -2
  16. package/lib/dependencies/ResolveDependency.js +88 -0
  17. package/lib/extractor.js +82 -178
  18. package/lib/file-loader.js +7 -19
  19. package/lib/helpers.js +39 -334
  20. package/lib/independent-loader.js +52 -0
  21. package/lib/index.js +889 -525
  22. package/lib/json-compiler/helper.js +156 -0
  23. package/lib/json-compiler/index.js +245 -451
  24. package/lib/json-compiler/plugin.js +150 -0
  25. package/lib/json-compiler/{theme-loader.js → theme.js} +5 -3
  26. package/lib/loader.js +178 -241
  27. package/lib/native-loader.js +71 -133
  28. package/lib/parser.js +1 -2
  29. package/lib/partial-compile/index.js +35 -0
  30. package/lib/platform/json/wx/index.js +1 -1
  31. package/lib/platform/template/normalize-component-rules.js +2 -3
  32. package/lib/platform/template/wx/component-config/button.js +14 -2
  33. package/lib/platform/template/wx/component-config/image.js +4 -0
  34. package/lib/platform/template/wx/component-config/input.js +4 -0
  35. package/lib/platform/template/wx/component-config/rich-text.js +4 -0
  36. package/lib/platform/template/wx/component-config/scroll-view.js +4 -0
  37. package/lib/platform/template/wx/component-config/switch.js +4 -0
  38. package/lib/platform/template/wx/component-config/text.js +4 -0
  39. package/lib/platform/template/wx/component-config/textarea.js +5 -0
  40. package/lib/platform/template/wx/component-config/view.js +4 -0
  41. package/lib/platform/template/wx/index.js +149 -3
  42. package/lib/record-loader.js +11 -0
  43. package/lib/resolve-loader.js +6 -0
  44. package/lib/resolver/AddEnvPlugin.js +4 -3
  45. package/lib/resolver/AddModePlugin.js +4 -3
  46. package/lib/resolver/FixDescriptionInfoPlugin.js +28 -0
  47. package/lib/resolver/PackageEntryPlugin.js +23 -36
  48. package/lib/runtime/base.styl +5 -0
  49. package/lib/runtime/components/tenon/getInnerListeners.js +317 -0
  50. package/lib/runtime/components/tenon/tenon-button.vue +305 -0
  51. package/lib/runtime/components/tenon/tenon-image.vue +61 -0
  52. package/lib/runtime/components/tenon/tenon-input.vue +99 -0
  53. package/lib/runtime/components/tenon/tenon-rich-text.vue +21 -0
  54. package/lib/runtime/components/tenon/tenon-scroll-view.vue +124 -0
  55. package/lib/runtime/components/tenon/tenon-switch.vue +91 -0
  56. package/lib/runtime/components/tenon/tenon-text-area.vue +64 -0
  57. package/lib/runtime/components/tenon/tenon-text.vue +64 -0
  58. package/lib/runtime/components/tenon/tenon-view.vue +93 -0
  59. package/lib/runtime/components/tenon/util.js +44 -0
  60. package/lib/runtime/components/web/getInnerListeners.js +1 -3
  61. package/lib/runtime/components/web/mpx-image.vue +20 -5
  62. package/lib/runtime/components/web/mpx-movable-view.vue +6 -2
  63. package/lib/runtime/components/web/mpx-swiper.vue +18 -3
  64. package/lib/runtime/i18n.wxs +31 -11
  65. package/lib/runtime/optionProcessor.js +48 -3
  66. package/lib/runtime/optionProcessor.tenon.js +386 -0
  67. package/lib/selector.js +29 -10
  68. package/lib/style-compiler/index.js +16 -24
  69. package/lib/style-compiler/load-postcss-config.js +3 -1
  70. package/lib/style-compiler/plugins/conditional-strip.js +68 -65
  71. package/lib/style-compiler/plugins/hm.js +20 -0
  72. package/lib/style-compiler/plugins/rpx.js +43 -37
  73. package/lib/style-compiler/plugins/scope-id.js +79 -72
  74. package/lib/style-compiler/plugins/trans-special.js +25 -18
  75. package/lib/style-compiler/plugins/trim.js +13 -7
  76. package/lib/style-compiler/plugins/vw.js +22 -16
  77. package/lib/template-compiler/compiler.js +106 -199
  78. package/lib/template-compiler/index.js +52 -139
  79. package/lib/template-compiler/trans-dynamic-class-expr.js +18 -13
  80. package/lib/tenon/index.js +105 -0
  81. package/lib/tenon/processJSON.js +356 -0
  82. package/lib/tenon/processScript.js +261 -0
  83. package/lib/tenon/processStyles.js +21 -0
  84. package/lib/tenon/processTemplate.js +133 -0
  85. package/lib/url-loader.js +11 -29
  86. package/lib/utils/add-query.js +1 -1
  87. package/lib/utils/const.js +10 -0
  88. package/lib/utils/emit-file.js +10 -0
  89. package/lib/utils/eval-json-js.js +31 -0
  90. package/lib/utils/get-entry-name.js +13 -0
  91. package/lib/utils/get-json-content.js +42 -0
  92. package/lib/utils/get-relative-path.js +25 -0
  93. package/lib/utils/is-url-request.js +10 -1
  94. package/lib/utils/match-condition.js +4 -1
  95. package/lib/utils/normalize.js +4 -15
  96. package/lib/utils/parse-request.js +3 -3
  97. package/lib/utils/resolve.js +13 -0
  98. package/lib/utils/set.js +47 -0
  99. package/lib/utils/stringify-loaders-resource.js +25 -0
  100. package/lib/utils/stringify-query.js +4 -0
  101. package/lib/web/processJSON.js +113 -144
  102. package/lib/web/processScript.js +47 -34
  103. package/lib/web/processTemplate.js +57 -40
  104. package/lib/wxml/{wxml-loader.js → loader.js} +21 -62
  105. package/lib/wxs/WxsModuleIdsPlugin.js +29 -0
  106. package/lib/wxs/WxsParserPlugin.js +2 -2
  107. package/lib/wxs/WxsPlugin.js +4 -8
  108. package/lib/wxs/WxsTemplatePlugin.js +46 -92
  109. package/lib/wxs/{wxs-i18n-loader.js → i18n-loader.js} +5 -4
  110. package/lib/wxs/loader.js +142 -0
  111. package/lib/wxs/{wxs-pre-loader.js → pre-loader.js} +20 -5
  112. package/lib/wxss/loader.js +31 -43
  113. package/lib/wxss/localsLoader.js +1 -5
  114. package/lib/wxss/processCss.js +107 -103
  115. package/package.json +21 -18
  116. package/lib/built-in-loader.js +0 -49
  117. package/lib/content-loader.js +0 -13
  118. package/lib/dependency/ChildCompileDependency.js +0 -24
  119. package/lib/dependency/InjectDependency.js +0 -26
  120. package/lib/dependency/RemovedModuleDependency.js +0 -23
  121. package/lib/dependency/ResolveDependency.js +0 -49
  122. package/lib/path-loader.js +0 -3
  123. package/lib/plugin-loader.js +0 -287
  124. package/lib/staticConfig.js +0 -4
  125. package/lib/utils/get-main-compilation.js +0 -6
  126. package/lib/utils/read-json-for-src.js +0 -34
  127. package/lib/utils/try-require.js +0 -16
  128. package/lib/wxs/wxs-loader.js +0 -117
  129. package/lib/wxss/getImportPrefix.js +0 -30
@@ -10,7 +10,7 @@ const normalize = require('../../../utils/normalize')
10
10
 
11
11
  module.exports = function getSpec ({ warn, error }) {
12
12
  const spec = {
13
- supportedModes: ['ali', 'swan', 'qq', 'tt', 'web', 'qa', 'jd', 'dd'],
13
+ supportedModes: ['ali', 'swan', 'qq', 'tt', 'web', 'qa', 'jd', 'dd', 'tenon'],
14
14
  // props预处理
15
15
  preProps: [],
16
16
  // props后处理
@@ -24,6 +24,15 @@ module.exports = function getSpec ({ warn, error }) {
24
24
  value: parsed.result
25
25
  }
26
26
  }
27
+ },
28
+ tenon ({ name, value }) {
29
+ const parsed = parseMustache(value)
30
+ if (parsed.hasBinding) {
31
+ return {
32
+ name: name === 'animation' ? 'v-' + name : ':' + name,
33
+ value: parsed.result
34
+ }
35
+ }
27
36
  }
28
37
  }
29
38
  ],
@@ -86,6 +95,16 @@ module.exports = function getSpec ({ warn, error }) {
86
95
  name: 'v-for',
87
96
  value: `(${itemName}, ${indexName}) in ${parsed.result}`
88
97
  }
98
+ },
99
+ tenon ({ value }, { el }) {
100
+ const parsed = parseMustache(value)
101
+ const attrsMap = el.attrsMap
102
+ const itemName = attrsMap['wx:for-item'] || 'item'
103
+ const indexName = attrsMap['wx:for-index'] || 'index'
104
+ return {
105
+ name: 'v-for',
106
+ value: `(${itemName}, ${indexName}) in ${parsed.result}`
107
+ }
89
108
  }
90
109
  },
91
110
  {
@@ -111,6 +130,25 @@ module.exports = function getSpec ({ warn, error }) {
111
130
  name: ':key',
112
131
  value
113
132
  }
133
+ },
134
+ tenon ({ value }, { el }) {
135
+ // vue的template中不能包含key,对应于小程序中的block
136
+ if (el.tag === 'block') return false
137
+ const itemName = el.attrsMap['wx:for-item'] || 'item'
138
+ const keyName = value
139
+ if (value === '*this') {
140
+ value = itemName
141
+ } else {
142
+ if (isValidIdentifierStr(keyName)) {
143
+ value = `${itemName}.${keyName}`
144
+ } else {
145
+ value = `${itemName}['${keyName}']`
146
+ }
147
+ }
148
+ return {
149
+ name: ':key',
150
+ value
151
+ }
114
152
  }
115
153
  },
116
154
  {
@@ -121,6 +159,9 @@ module.exports = function getSpec ({ warn, error }) {
121
159
  },
122
160
  web () {
123
161
  return false
162
+ },
163
+ tenon () {
164
+ return false
124
165
  }
125
166
  },
126
167
  {
@@ -163,6 +204,49 @@ module.exports = function getSpec ({ warn, error }) {
163
204
  }
164
205
  ]
165
206
  }
207
+ },
208
+ tenon ({ value }, { el }) {
209
+ el.hasEvent = true
210
+ const attrsMap = el.attrsMap
211
+ const tagRE = /\{\{((?:.|\n|\r)+?)\}\}(?!})/
212
+ const stringify = JSON.stringify
213
+ const match = tagRE.exec(value)
214
+ if (match) {
215
+ const modelProp = attrsMap['wx:model-prop'] || 'value'
216
+ const modelEvent = attrsMap['wx:model-event'] || 'input'
217
+ const modelValuePathRaw = attrsMap['wx:model-value-path']
218
+ const modelValuePath = modelValuePathRaw === undefined ? 'value' : modelValuePathRaw
219
+ const modelFilter = attrsMap['wx:model-filter']
220
+ let modelValuePathArr
221
+ try {
222
+ modelValuePathArr = JSON5.parse(modelValuePath)
223
+ } catch (e) {
224
+ if (modelValuePath === '') {
225
+ modelValuePathArr = []
226
+ } else {
227
+ modelValuePathArr = modelValuePath.split('.')
228
+ }
229
+ }
230
+ let modelValue = match[1].trim()
231
+ return [
232
+ {
233
+ name: ':' + modelProp,
234
+ value: modelValue
235
+ },
236
+ {
237
+ name: 'mpxModelEvent',
238
+ value: modelEvent
239
+ },
240
+ {
241
+ name: 'mpxModelEventId',
242
+ value: Math.random().toString(36).substr(3, 8)
243
+ },
244
+ {
245
+ name: '@mpxModel',
246
+ value: `__model(${stringifyWithResolveComputed(modelValue)}, $event, ${stringify(modelValuePathArr)}, ${stringify(modelFilter)})`
247
+ }
248
+ ]
249
+ }
166
250
  }
167
251
  },
168
252
  {
@@ -181,10 +265,44 @@ module.exports = function getSpec ({ warn, error }) {
181
265
  }
182
266
  }
183
267
  },
268
+ {
269
+ // style样式绑定
270
+ test: /^(style|wx:style)$/,
271
+ web ({ value }, { el }) {
272
+ if (el.isStyleParsed) {
273
+ return false
274
+ }
275
+ let styleBinding = []
276
+ el.isStyleParsed = true
277
+ el.attrsList.map((item, index) => {
278
+ const parsed = parseMustache(item.value)
279
+ if (item.name === 'style') {
280
+ if (parsed.hasBinding || parsed.result.indexOf('rpx') > -1) {
281
+ styleBinding.push(parseMustache(item.value).result)
282
+ } else {
283
+ styleBinding.push(JSON.stringify(item.value))
284
+ }
285
+ } else if (item.name === 'wx:style') {
286
+ styleBinding.push(parseMustache(item.value).result)
287
+ }
288
+ })
289
+ return {
290
+ name: ':style',
291
+ value: `[${styleBinding}] | transRpxStyle`
292
+ }
293
+ }
294
+ },
184
295
  {
185
296
  // 样式类名绑定
186
- test: /^wx:(class|style)$/,
187
- web ({ name, value }) {
297
+ test: /^wx:(class)$/,
298
+ web ({ value }) {
299
+ const parsed = parseMustache(value)
300
+ return {
301
+ name: ':class',
302
+ value: parsed.result
303
+ }
304
+ },
305
+ tenon ({ name, value }) {
188
306
  const dir = this.test.exec(name)[1]
189
307
  const parsed = parseMustache(value)
190
308
  return {
@@ -248,6 +366,17 @@ module.exports = function getSpec ({ warn, error }) {
248
366
  name: 'v-' + dir,
249
367
  value: parsed.result
250
368
  }
369
+ },
370
+ tenon ({ name, value }) {
371
+ let dir = this.test.exec(name)[1]
372
+ const parsed = parseMustache(value)
373
+ if (dir === 'elif') {
374
+ dir = 'else-if'
375
+ }
376
+ return {
377
+ name: 'v-' + dir,
378
+ value: parsed.result
379
+ }
251
380
  }
252
381
  },
253
382
  // 事件
@@ -288,6 +417,23 @@ module.exports = function getSpec ({ warn, error }) {
288
417
  name: rPrefix + rEventName + meta.modifierStr,
289
418
  value
290
419
  }
420
+ },
421
+ tenon ({ name, value }, { eventRules, el }) {
422
+ const match = this.test.exec(name)
423
+ const prefix = match[1]
424
+ const eventName = match[2]
425
+ const modifierStr = match[3] || ''
426
+ const meta = {
427
+ modifierStr
428
+ }
429
+ // 记录event监听信息用于后续判断是否需要使用内置基础组件
430
+ el.hasEvent = true
431
+ const rPrefix = runRules(spec.event.prefix, prefix, { mode: 'web', meta })
432
+ const rEventName = runRules(eventRules, eventName, { mode: 'web' })
433
+ return {
434
+ name: rPrefix + rEventName + meta.modifierStr,
435
+ value
436
+ }
291
437
  }
292
438
  },
293
439
  // 无障碍
@@ -0,0 +1,11 @@
1
+ const parseRequest = require('./utils/parse-request')
2
+ const RecordResourceMapDependency = require('./dependencies/RecordResourceMapDependency')
3
+
4
+ module.exports = function (source) {
5
+ const mpx = this.getMpx()
6
+ const { resourcePath, queryObj } = parseRequest(this.resource)
7
+ const file = mpx.getExtractedFile(this.resource)
8
+ const packageRoot = queryObj.packageRoot || ''
9
+ this._module.addPresentationalDependency(new RecordResourceMapDependency(resourcePath, 'staticResource', file, packageRoot))
10
+ return source
11
+ }
@@ -0,0 +1,6 @@
1
+ module.exports = function () {
2
+ return `
3
+ var currentURL = global.currentPagePath
4
+ var getRelativePath = require('@mpxjs/webpack-plugin/lib/utils/get-relative-path').getRelativePath
5
+ module.exports = __mpx_resolve_path__(${JSON.stringify(this.resource)})`
6
+ }
@@ -2,7 +2,8 @@ const path = require('path')
2
2
  const stringifyQuery = require('../utils/stringify-query')
3
3
  const parseQuery = require('loader-utils').parseQuery
4
4
  const addInfix = require('../utils/add-infix')
5
- const matchCondition = require('../utils/match-condition')
5
+ const { matchCondition } = require('../utils/match-condition')
6
+ const { JSON_JS_EXT } = require('../utils/const')
6
7
 
7
8
  module.exports = class AddEnvPlugin {
8
9
  constructor (source, env, fileConditionRules, target) {
@@ -24,8 +25,8 @@ module.exports = class AddEnvPlugin {
24
25
  }
25
26
  const resourcePath = request.path
26
27
  let extname = ''
27
- if (resourcePath.endsWith('.json.js')) {
28
- extname = '.json.js'
28
+ if (resourcePath.endsWith(JSON_JS_EXT)) {
29
+ extname = JSON_JS_EXT
29
30
  } else {
30
31
  extname = path.extname(resourcePath)
31
32
  }
@@ -1,8 +1,9 @@
1
1
  const path = require('path')
2
2
  const stringifyQuery = require('../utils/stringify-query')
3
3
  const parseQuery = require('loader-utils').parseQuery
4
- const matchCondition = require('../utils/match-condition')
4
+ const { matchCondition } = require('../utils/match-condition')
5
5
  const addInfix = require('../utils/add-infix')
6
+ const { JSON_JS_EXT } = require('../utils/const')
6
7
 
7
8
  module.exports = class AddModePlugin {
8
9
  constructor (source, mode, fileConditionRules, target) {
@@ -24,8 +25,8 @@ module.exports = class AddModePlugin {
24
25
  }
25
26
  const resourcePath = request.path
26
27
  let extname = ''
27
- if (resourcePath.endsWith('.json.js')) {
28
- extname = '.json.js'
28
+ if (resourcePath.endsWith(JSON_JS_EXT)) {
29
+ extname = JSON_JS_EXT
29
30
  } else {
30
31
  extname = path.extname(resourcePath)
31
32
  }
@@ -0,0 +1,28 @@
1
+ const path = require('path')
2
+
3
+ module.exports = class FixDescriptionInfoPlugin {
4
+ apply (resolver) {
5
+ resolver.hooks.result.tap('FixDescriptionInfoPlugin', (request) => {
6
+ const { path: resourcePath } = request
7
+ const segments = resourcePath.split(path.sep)
8
+ let rootIndex = -1
9
+ for (let i = segments.length - 1; i >= 0; i--) {
10
+ const segment = segments[i]
11
+ if (segment === 'node_modules') {
12
+ rootIndex = segments[i + 1].startsWith('@') ? i + 2 : i + 1
13
+ break
14
+ }
15
+ }
16
+ if (rootIndex !== -1) {
17
+ const descriptionFileRoot = segments.slice(0, rootIndex + 1).join(path.sep)
18
+ const descriptionFilePath = path.join(descriptionFileRoot, 'package.json')
19
+ if (descriptionFilePath !== request.descriptionFilePath) {
20
+ Object.assign(request, {
21
+ descriptionFileRoot,
22
+ descriptionFilePath
23
+ })
24
+ }
25
+ }
26
+ })
27
+ }
28
+ }
@@ -1,55 +1,42 @@
1
1
  const path = require('path')
2
- /**
3
- * @desc 获取小程序npm包资源入口目录
4
- */
5
- const getEntry = (name, miniprogram) => {
6
- return path.join(name, miniprogram)
7
- }
2
+ const toPosix = require('../utils/to-posix')
8
3
 
9
4
  module.exports = class PackageEntryPlugin {
10
- constructor (source, miniNpmPackage, target) {
5
+ constructor (source, miniNpmPackages, target) {
11
6
  this.source = source
12
7
  this.target = target
13
- this.miniNpmPackage = miniNpmPackage
8
+ this.miniNpmPackages = miniNpmPackages
14
9
  }
15
10
 
16
11
  /**
17
12
  * 判断是否需要更改innerRequest
18
13
  * 小程序发布npm包约束: package.json配置miniprogram 或默认 miniprogram_dist目录
19
- * 0. 前提: request中含有package.json中name字段
20
14
  * 1. package.json中配置了miniprogram, 且request中不含miniprogram,尝试拼接
21
- * 2. 用户配置miniNpmPackage说明是小程序npm包,如果package.json中没配置miniprogram字段,则尝试拼接默认miniprogram_dist目录
15
+ * 2. 用户配置miniNpmPackages说明是小程序npm包,如果package.json中没配置miniprogram字段,则尝试拼接默认miniprogram_dist目录
22
16
  */
23
17
  apply (resolver) {
24
18
  const target = resolver.ensureHook(this.target)
25
- resolver.getHook(this.source).tapAsync('PackagePlugin', (request, resolveContext, callback) => {
26
- const innerRequest = request.request || request.path
27
- if (!innerRequest || request.miniprogram) return callback()
19
+ resolver.getHook(this.source).tapAsync('PackageEntryPlugin', (request, resolveContext, callback) => {
20
+ if (request.miniprogram) return callback()
21
+ let { path: resourcePath, descriptionFileData, descriptionFileRoot } = request
22
+ if (request.miniprogram || !descriptionFileData) return callback()
23
+
24
+ let { name, miniprogram } = descriptionFileData
25
+ if (!miniprogram && this.miniNpmPackages.includes(name)) miniprogram = 'miniprogram_dist'
26
+ if (!miniprogram) return callback()
27
+
28
+ let relativePath = path.relative(descriptionFileRoot, resourcePath)
29
+ if (relativePath.startsWith(miniprogram)) return callback()
30
+
31
+ relativePath = path.join(miniprogram, relativePath)
28
32
 
29
- const descriptionFileData = request.descriptionFileData || {}
30
- const { name = '', miniprogram } = descriptionFileData
31
- let newEntry = ''
32
- // request.path和系统环境有关:windows和linux
33
- let normalizedName = path.normalize(name)
34
- if (innerRequest.indexOf(normalizedName) === -1) {
35
- return callback()
36
- }
37
- if (miniprogram) {
38
- newEntry = getEntry(normalizedName, miniprogram)
39
- } else if (this.miniNpmPackage.includes(name)) {
40
- newEntry = getEntry(normalizedName, 'miniprogram_dist')
41
- }
33
+ const obj = Object.assign({}, request, {
34
+ path: path.join(descriptionFileRoot, relativePath),
35
+ relativePath: './' + toPosix(relativePath),
36
+ miniprogram: true
37
+ })
42
38
 
43
- if (newEntry) {
44
- const newRequest = innerRequest.replace(normalizedName, newEntry)
45
- const obj = Object.assign({}, request, {
46
- request: newRequest,
47
- miniprogram: true
48
- })
49
- resolver.doResolve(target, obj, `change request ${innerRequest} to :` + newRequest, resolveContext, callback)
50
- } else {
51
- callback()
52
- }
39
+ resolver.doResolve(target, obj, 'add miniprogram dist: ' + miniprogram, resolveContext, callback)
53
40
  })
54
41
  }
55
42
  }
@@ -120,3 +120,8 @@ html, body, .app {
120
120
  font-family "weui"
121
121
  src url('data:application/octet-stream;base64,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') format('truetype')
122
122
  }
123
+
124
+ .mpx-root-view {
125
+ display: inline
126
+ line-height: normal
127
+ }