diff --git a/packages/uni-migration/__tests__/demo.js b/packages/uni-migration/__tests__/demo.js
index c0d4cc08e3ad2486fd7cb6d46dea6aa27fdfbdb1..6e934ae49e1b55d327f8007882d1c551df1a554b 100644
--- a/packages/uni-migration/__tests__/demo.js
+++ b/packages/uni-migration/__tests__/demo.js
@@ -1,4 +1,17 @@
const migrate = require('../lib/index')
-migrate('/Users/fxy/Documents/demo/my-v3-mp/src/wxcomponents',
- '/Users/fxy/Documents/demo/my-v3-mp/src/wxcomponents-vue')
+migrate('/Users/fxy/Downloads/wa-vantui_1.1/wxcomponents/vant',
+ '/Users/fxy/Downloads/wa-vantui_1.1/vant')
+
+// const {
+// parse
+// } = require('mustache')
+// console.log(parse('{{ !item.loading }}'))
+
+// const {
+// transformTemplate
+// } = require('../lib/mp-weixin/transform/template-transformer')
+
+// console.log(transformTemplate(
+// ``
+// ))
diff --git a/packages/uni-migration/__tests__/wxml.spec.js b/packages/uni-migration/__tests__/wxml.spec.js
new file mode 100644
index 0000000000000000000000000000000000000000..5789471ad7c398b274075d463eacc5b0afde757a
--- /dev/null
+++ b/packages/uni-migration/__tests__/wxml.spec.js
@@ -0,0 +1,39 @@
+const {
+ transformTemplate
+} = require('../lib/mp-weixin/transform/template-transformer')
+
+function assertCodegen(wxmlCode, vueCode) {
+ expect(transformTemplate(wxmlCode)[0]).toBe(vueCode)
+}
+describe('wxml:compiler', () => {
+ it('generate v-if', () => {
+ assertCodegen(
+ '{{ item.name }}',
+ `{{ item.name }}`
+ )
+ })
+ it('generate v-for', () => {
+ assertCodegen(
+ '',
+ ``
+ )
+ })
+ it('generate root element', () => {
+ assertCodegen(
+ '',
+ ``
+ )
+
+ assertCodegen(
+ `
+`,
+ ``
+ )
+
+
+ assertCodegen(
+ '',
+ ``
+ )
+ })
+})
diff --git a/packages/uni-migration/lib/index.js b/packages/uni-migration/lib/index.js
index 1cd004a0ef16b7f49052b89286585897b84d87e4..0ce4c3090d865a6aece1b679ee6534769598b1f6 100644
--- a/packages/uni-migration/lib/index.js
+++ b/packages/uni-migration/lib/index.js
@@ -1,4 +1,6 @@
+const path = require('path')
const fs = require('fs-extra')
+
const validate = require('./validate')
const migraters = {
@@ -15,9 +17,16 @@ module.exports = function migrate(input, out, options = {
if (!validate(input, out, options)) {
return
}
- migrater.transform(input, out, options).forEach(file => {
- console.log(`写入: ${file.path}`)
- console.log(`${file.content}`)
- // fs.outputFileSync(file.path, file.content)
+ const [files, assets] = migrater.transform(input, out, options)
+ files.forEach(file => {
+ console.log(`write: ${file.path}`)
+ fs.outputFileSync(file.path, file.content)
+ })
+ const styleExtname = options.extname.style
+ assets.forEach(asset => {
+ const src = path.resolve(input, asset)
+ const dest = path.resolve(out, asset.replace(styleExtname, '.css'))
+ console.log(`copy: ${dest}`)
+ fs.copySync(src, dest)
})
}
diff --git a/packages/uni-migration/lib/mp-weixin/index.js b/packages/uni-migration/lib/mp-weixin/index.js
index cc21afbdf0fdd0e86cf3788c27e86f9eb10dd378..d04a23d5331194123d94fee8dc6d905c72fa71e4 100644
--- a/packages/uni-migration/lib/mp-weixin/index.js
+++ b/packages/uni-migration/lib/mp-weixin/index.js
@@ -1,7 +1,8 @@
module.exports = {
options: {
- file: {
- extname: '.wxml'
+ extname: {
+ template: '.wxml',
+ style: '.wxss'
}
},
transform: require('./transform')
diff --git a/packages/uni-migration/lib/mp-weixin/transform/file-transformer.js b/packages/uni-migration/lib/mp-weixin/transform/file-transformer.js
index 63e85ee782aecd5671518a14da5b76977e02708e..05f71be7ff82abb0806ab0e11b0a6270bc11e0ba 100644
--- a/packages/uni-migration/lib/mp-weixin/transform/file-transformer.js
+++ b/packages/uni-migration/lib/mp-weixin/transform/file-transformer.js
@@ -1,20 +1,37 @@
-const transformJson = require('./json-transformer')
-const transformWxml = require('./wxml-transformer')
-const transformWxss = require('./wxss-transformer')
-const transformJs = require('./js-transformer')
+const {
+ transformJsonFile
+} = require('./json-transformer')
+const {
+ transformTemplateFile
+} = require('./template-transformer')
+const {
+ transformStyleFile
+} = require('./style-transformer')
+const {
+ transformScriptFile
+} = require('./script-transformer')
-module.exports = function transformFile(input, out, options) {
- const filepath = input.replace('.wxml', '')
+module.exports = function transformFile(input, options) {
- const [usingComponentsCode] = transformJson(filepath + '.json')
+ const {
+ template: templateExtname,
+ style: styleExtname
+ } = options.extname
- const [templateCode, wxsCode = ''] = transformWxml(filepath + '.wxml')
+ const filepath = input.replace(templateExtname, '')
+ const deps = [
+ filepath + templateExtname
+ ]
- const styleCode = transformWxss(filepath + '.wxss') || ''
- const scriptCode = transformJs(filepath + '.js', usingComponentsCode, options)
+ const [usingComponentsCode] = transformJsonFile(filepath + '.json', deps)
- return `
-
+ const [templateCode, wxsCode = ''] = transformTemplateFile(filepath + templateExtname)
+
+ const styleCode = transformStyleFile(filepath + styleExtname, options, deps) || ''
+ const scriptCode = transformScriptFile(filepath + '.js', usingComponentsCode, options, deps)
+
+ return [
+ `
${templateCode}
${wxsCode}
@@ -23,6 +40,7 @@ ${scriptCode}
-`
+`,
+ deps
+ ]
}
diff --git a/packages/uni-migration/lib/mp-weixin/transform/index.js b/packages/uni-migration/lib/mp-weixin/transform/index.js
index 4f81786af5562bfa1570b1adcb116eafbc9818f9..f2ef7c74d813dfd8a232e74cedda03afd8717ce6 100644
--- a/packages/uni-migration/lib/mp-weixin/transform/index.js
+++ b/packages/uni-migration/lib/mp-weixin/transform/index.js
@@ -3,41 +3,62 @@ const glob = require('glob')
const transformFile = require('./file-transformer')
function generateVueFile(input, out, options) {
- const content = transformFile(input, out, options)
+ const [content, deps] = transformFile(input, options)
return {
- path: path.resolve(out, path.basename(input).replace(options.extname, '.vue')),
- content
+ path: path.resolve(out, path.basename(input).replace(options.extname.template, '.vue')),
+ content,
+ deps
}
}
function generateVueFolder(input, out, options) {
- return glob.sync('**/*.wxml', {
- cwd: input
- }).map(wxmlFile => {
- return generateVueFile(
- path.resolve(input, wxmlFile),
- path.dirname(path.resolve(out, wxmlFile)),
- options
- )
+ const extname = options.extname.template
+ const files = []
+ const assets = []
+ const deps = []
+ glob.sync('**/*', {
+ cwd: input,
+ nodir: true
+ }).map(file => {
+ if (path.extname(file) === extname) {
+ const vueFile = generateVueFile(
+ path.resolve(input, file),
+ path.dirname(path.resolve(out, file)),
+ options
+ )
+ files.push(vueFile)
+ deps.push(...vueFile.deps)
+ } else {
+ assets.push(file)
+ }
})
+ return [files, assets.filter(asset => {
+ return !deps.includes(path.resolve(input, asset))
+ })]
}
function generateVueApp(input, out, options) {
console.error(`暂不支持转换整个 App`)
+ return [
+ [],
+ []
+ ]
}
module.exports = function transform(input, out, options) {
- const ret = []
switch (options.target) {
case 'file':
- ret.push(generateVueFile(input, out, options))
- break
+ return [
+ [generateVueFile(input, out, options)],
+ []
+ ]
case 'folder':
- ret.push(...generateVueFolder(input, out, options))
- break
+ return generateVueFolder(input, out, options)
case 'app':
- ret.push(...generateVueApp(input, out, options))
- break
+ return generateVueApp(input, out, options)
}
- return ret
+ return [
+ [],
+ []
+ ]
}
diff --git a/packages/uni-migration/lib/mp-weixin/transform/js-transformer.js b/packages/uni-migration/lib/mp-weixin/transform/js-transformer.js
deleted file mode 100644
index 84d6b0bea0d895701fd016179286bd2414f4d93a..0000000000000000000000000000000000000000
--- a/packages/uni-migration/lib/mp-weixin/transform/js-transformer.js
+++ /dev/null
@@ -1,29 +0,0 @@
-const fs = require('fs')
-const path = require('path')
-
-const {
- normalizePath
-} = require('../util')
-
-module.exports = function transformJs(filepath, usingComponentsCode, options) {
- let jsCode = ''
- if (!fs.existsSync(filepath)) {
- jsCode = `
-Component({})
-`
- } else {
- jsCode = fs.readFileSync(filepath, 'utf8')
- }
-
- let route = normalizePath(filepath)
- if (options.base) {
- route = normalizePath(path.relative(options.base, filepath))
- }
- route = route.replace('.js', '')
- return `
-global['__wxRoute'] = '${route}'
-global['__wxUsingComponents'] = ${usingComponentsCode}
-${jsCode}
-export default global['__wxComponents']['${route}']
- `
-}
diff --git a/packages/uni-migration/lib/mp-weixin/transform/json-transformer.js b/packages/uni-migration/lib/mp-weixin/transform/json-transformer.js
index 3b89f853e8915504b48e600b9890643e47a69106..d87f5f7c88ca917126c5ce7834850fc4ac51dfcd 100644
--- a/packages/uni-migration/lib/mp-weixin/transform/json-transformer.js
+++ b/packages/uni-migration/lib/mp-weixin/transform/json-transformer.js
@@ -1,22 +1,29 @@
const fs = require('fs')
-module.exports = function transformJson(filepath) {
- if (!fs.existsSync(filepath)) {
- return ['{}']
- }
-
+function transformJson(content) {
const {
usingComponents
- } = require(filepath)
+ } = JSON.parse(content)
if (!usingComponents) {
return ['{}']
}
const usingComponentsCode = []
Object.keys(usingComponents).forEach(name => {
- usingComponentsCode.push(`'${name}': require('${usingComponents[name]}').default`)
+ usingComponentsCode.push(`'${name}': require('${usingComponents[name]}.vue').default`)
})
return [`{
-${usingComponentsCode.join(',')}
+${usingComponentsCode.join(',\n')}
}`]
+}
+
+module.exports = {
+ transformJson,
+ transformJsonFile(filepath, deps) {
+ if (!fs.existsSync(filepath)) {
+ return ['{}']
+ }
+ deps.push(filepath)
+ return transformJson(fs.readFileSync(filepath, 'utf8').toString().trim())
+ }
}
diff --git a/packages/uni-migration/lib/mp-weixin/transform/script-transformer.js b/packages/uni-migration/lib/mp-weixin/transform/script-transformer.js
new file mode 100644
index 0000000000000000000000000000000000000000..014dcbbbffb71aae3a0442f00795f0ac53e7db99
--- /dev/null
+++ b/packages/uni-migration/lib/mp-weixin/transform/script-transformer.js
@@ -0,0 +1,34 @@
+const fs = require('fs')
+const path = require('path')
+
+const {
+ normalizePath
+} = require('../util')
+
+function transformScript(content, route, usingComponentsCode) {
+ return `global['__wxRoute'].push('${route}')
+global['__wxUsingComponents'] = ${usingComponentsCode}
+${content}
+export default global['__wxComponents']['${route}']`
+}
+
+module.exports = {
+ transformScript,
+ transformScriptFile(filepath, usingComponentsCode, options, deps) {
+ let content = ''
+ if (!fs.existsSync(filepath)) {
+ content = `
+Component({})
+`
+ } else {
+ content = fs.readFileSync(filepath, 'utf8').toString().trim()
+ deps.push(filepath)
+ }
+ let route = normalizePath(filepath)
+ if (options.base) {
+ route = normalizePath(path.relative(options.base, filepath))
+ }
+ route = route.replace('.js', '')
+ return transformScript(content, route, usingComponentsCode, options)
+ }
+}
diff --git a/packages/uni-migration/lib/mp-weixin/transform/style-transformer.js b/packages/uni-migration/lib/mp-weixin/transform/style-transformer.js
new file mode 100644
index 0000000000000000000000000000000000000000..89ac355f76fbcaa578db38f7c8de9e8b425e4891
--- /dev/null
+++ b/packages/uni-migration/lib/mp-weixin/transform/style-transformer.js
@@ -0,0 +1,16 @@
+const fs = require('fs')
+
+function transformStyle(content, options) {
+ return content.replace(new RegExp(`\\${options.extname.style}`, 'g'), '.css')
+}
+
+module.exports = {
+ transformStyle,
+ transformStyleFile(filepath, options, deps) {
+ if (!fs.existsSync(filepath)) {
+ return ''
+ }
+ deps.push(filepath)
+ return transformStyle(fs.readFileSync(filepath, 'utf8').toString().trim(), options)
+ }
+}
diff --git a/packages/uni-migration/lib/mp-weixin/transform/template-transformer/index.js b/packages/uni-migration/lib/mp-weixin/transform/template-transformer/index.js
new file mode 100644
index 0000000000000000000000000000000000000000..89073b07339d153ea02a5684454490571bd4350c
--- /dev/null
+++ b/packages/uni-migration/lib/mp-weixin/transform/template-transformer/index.js
@@ -0,0 +1,16 @@
+const fs = require('fs')
+const path = require('path')
+
+const parse = require('./parser')
+const transform = require('./transform')
+
+function transformTemplate(content) {
+ return transform(parse(content))
+}
+
+module.exports = {
+ transformTemplate,
+ transformTemplateFile(filepath) {
+ return transformTemplate(fs.readFileSync(filepath, 'utf8').toString().trim())
+ }
+}
diff --git a/packages/uni-migration/lib/mp-weixin/transform/wxml-transformer/parser.js b/packages/uni-migration/lib/mp-weixin/transform/template-transformer/parser.js
similarity index 100%
rename from packages/uni-migration/lib/mp-weixin/transform/wxml-transformer/parser.js
rename to packages/uni-migration/lib/mp-weixin/transform/template-transformer/parser.js
diff --git a/packages/uni-migration/lib/mp-weixin/transform/template-transformer/transform/generate.js b/packages/uni-migration/lib/mp-weixin/transform/template-transformer/transform/generate.js
new file mode 100644
index 0000000000000000000000000000000000000000..9cc56f05b32c8118483f8aec874ce9a734fc477a
--- /dev/null
+++ b/packages/uni-migration/lib/mp-weixin/transform/template-transformer/transform/generate.js
@@ -0,0 +1,62 @@
+const BOOL_ATTRS = [
+ 'v-else'
+]
+
+function genAttrs(node) {
+ const attribs = node.attribs
+ const attribsArr = Object.keys(attribs).map(name => {
+ if (BOOL_ATTRS.includes(name)) {
+ return name
+ }
+ return `${name}="${attribs[name]}"`
+ })
+ if (!attribsArr.length) {
+ return ''
+ }
+ return ' ' + attribsArr.join(' ')
+}
+
+function genChildren(node) {
+ if (!node.children) {
+ return ''
+ }
+ return node.children.map(childNode => genElement(childNode)).join('')
+}
+
+function genElement(node) {
+ if (node.type === 'text') {
+ return node.data
+ } else if (node.type === 'tag') {
+ const name = node.name
+ return `<${name}${genAttrs(node)}>${genChildren(node)}${name}>`
+ }
+ return ''
+}
+
+function genWxs(wxs) {
+ return wxs.map(wxsNode => genElement(wxsNode)).join('').trim()
+}
+
+function shouldWrapper(node) {
+ node.children = node.children.filter(child => { // remove \n
+ if (child.type === 'text' && !child.data.trim()) {
+ return false
+ }
+ return true
+ })
+ if (node.children.length > 1) { // multi root
+ return true
+ }
+ const rootNode = node.children[0]
+ if (rootNode && rootNode.name === 'slot') { // slot root
+ return true
+ }
+ return false
+}
+
+module.exports = function generate(node, state) {
+ if (shouldWrapper(node)) {
+ return [`${genChildren(node).trim()}`, genWxs(state.wxs)]
+ }
+ return [genChildren(node).trim(), genWxs(state.wxs)]
+}
diff --git a/packages/uni-migration/lib/mp-weixin/transform/wxml-transformer/transform/index.js b/packages/uni-migration/lib/mp-weixin/transform/template-transformer/transform/index.js
similarity index 100%
rename from packages/uni-migration/lib/mp-weixin/transform/wxml-transformer/transform/index.js
rename to packages/uni-migration/lib/mp-weixin/transform/template-transformer/transform/index.js
diff --git a/packages/uni-migration/lib/mp-weixin/transform/wxml-transformer/transform/traverse.js b/packages/uni-migration/lib/mp-weixin/transform/template-transformer/transform/traverse.js
similarity index 65%
rename from packages/uni-migration/lib/mp-weixin/transform/wxml-transformer/transform/traverse.js
rename to packages/uni-migration/lib/mp-weixin/transform/template-transformer/transform/traverse.js
index f7f4969ef6e8925bccc2c313eb2c9303fabfba8b..4d241edbb255c60dc370f1c35f3d01eca672f21e 100644
--- a/packages/uni-migration/lib/mp-weixin/transform/wxml-transformer/transform/traverse.js
+++ b/packages/uni-migration/lib/mp-weixin/transform/template-transformer/transform/traverse.js
@@ -8,12 +8,32 @@ const ATTRS = {
'wx:else': 'v-else'
}
-function parseMustache(expr) {
+const FOR = {
+ for: 'wx:for',
+ item: 'wx:for-item',
+ index: 'wx:for-index',
+ key: 'wx:key'
+}
+
+const FOR_DEFAULT = {
+ item: 'item',
+ index: 'index'
+}
+
+function parseMustache(expr, identifier = false) {
+ if (!expr) {
+ return ''
+ }
const tokens = parse(expr)
const isIdentifier = tokens.length === 1
return tokens.map(token => {
if (token[0] === 'text') {
+ if (identifier) {
+ return token[1]
+ }
return `'${token[1]}'`
+ } else if (token[0] === '!') { // {{ !loading }}
+ return `!${token[1]}`
} else if (token[0] === 'name') {
if (isIdentifier) {
return token[1]
@@ -31,6 +51,24 @@ function transformDirective(name, value, attribs) {
}
}
+function transformFor(attribs) {
+ const vFor = attribs[FOR.for]
+ if (!vFor) {
+ return
+ }
+ const vKey = parseMustache(attribs[FOR.key], true) // TODO
+ const vItem = parseMustache(attribs[FOR.item], true) || FOR_DEFAULT.item
+ const vIndex = parseMustache(attribs[FOR.index], true) || FOR_DEFAULT.index
+
+ attribs['v-for'] = `(${vItem},${vIndex}) in (${parseMustache(vFor)})`
+ vKey && (attribs[':key'] = vKey)
+
+ delete attribs[FOR.for]
+ delete attribs[FOR.item]
+ delete attribs[FOR.index]
+ delete attribs[FOR.key]
+}
+
const bindRE = /bind:?/
const catchRE = /catch:?/
const captureBindRE = /capture-bind:?/
@@ -55,6 +93,12 @@ function transformEvent(name, value, attribs) {
function transformAttr(name, value, attribs) {
+ if (
+ name.indexOf('v-') === 0 ||
+ name.indexOf(':') === 0
+ ) { // 已提前处理
+ return
+ }
delete attribs[name]
if (transformDirective(name, value, attribs)) {
return
@@ -74,6 +118,7 @@ function transformAttrs(node, state) {
if (!attribs) {
return
}
+ transformFor(attribs)
Object.keys(attribs).forEach(name => {
transformAttr(name, attribs[name], attribs)
})
diff --git a/packages/uni-migration/lib/mp-weixin/transform/wxml-transformer/index.js b/packages/uni-migration/lib/mp-weixin/transform/wxml-transformer/index.js
deleted file mode 100644
index 86eec369a585513a10480b860dae67d947e419b9..0000000000000000000000000000000000000000
--- a/packages/uni-migration/lib/mp-weixin/transform/wxml-transformer/index.js
+++ /dev/null
@@ -1,8 +0,0 @@
-const fs = require('fs')
-const path = require('path')
-
-const parse = require('./parser')
-const transform = require('./transform')
-module.exports = function transformWxml(filepath) {
- return transform(parse(fs.readFileSync(filepath, 'utf8')))
-}
diff --git a/packages/uni-migration/lib/mp-weixin/transform/wxml-transformer/transform/generate.js b/packages/uni-migration/lib/mp-weixin/transform/wxml-transformer/transform/generate.js
deleted file mode 100644
index 0382607d1a49e0dff593045f6c4aaa7ab4fff7f5..0000000000000000000000000000000000000000
--- a/packages/uni-migration/lib/mp-weixin/transform/wxml-transformer/transform/generate.js
+++ /dev/null
@@ -1,41 +0,0 @@
-function genAttrs(node) {
- const attribs = node.attribs
- const attribsArr = Object.keys(attribs).map(name => `${name}="${attribs[name]}"`)
- if (!attribsArr.length) {
- return ''
- }
- return ' ' + attribsArr.join(' ')
-}
-
-function genChildren(node) {
- if (!node.children) {
- return ''
- }
- return node.children.map(childNode => genElement(childNode)).join('')
-}
-
-function genElement(node) {
- if (node.type === 'text') {
- return node.data
- } else if (node.type === 'tag') {
- const name = node.name
- return `<${name}${genAttrs(node)}>${genChildren(node)}${name}>`
- }
- return ''
-}
-
-function genWxs(wxs) {
- return wxs.map(wxsNode => genElement(wxsNode)).join('')
-}
-
-module.exports = function generate(node, state) {
- if (node.children.length > 1) {
- return [genChildren({
- type: 'tag',
- name: 'view',
- attribs: {},
- children: node.children
- }), genWxs(state.wxs)]
- }
- return [genChildren(node), genWxs(state.wxs)]
-}
diff --git a/packages/uni-migration/lib/mp-weixin/transform/wxs-transformer.js b/packages/uni-migration/lib/mp-weixin/transform/wxs-transformer.js
deleted file mode 100644
index 8bb17d56d2a2c6fe93f86261997c8aec3f4fad0b..0000000000000000000000000000000000000000
--- a/packages/uni-migration/lib/mp-weixin/transform/wxs-transformer.js
+++ /dev/null
@@ -1,3 +0,0 @@
-module.exports = function transofrmWxs(filepath) {
-
-}
diff --git a/packages/uni-migration/lib/mp-weixin/transform/wxss-transformer.js b/packages/uni-migration/lib/mp-weixin/transform/wxss-transformer.js
deleted file mode 100644
index 1bd5d5e28611c73ee2466aaf32491ad55f518e0c..0000000000000000000000000000000000000000
--- a/packages/uni-migration/lib/mp-weixin/transform/wxss-transformer.js
+++ /dev/null
@@ -1,3 +0,0 @@
-module.exports = function transformWxss(filepath) {
-
-}
diff --git a/packages/uni-migration/lib/validate.js b/packages/uni-migration/lib/validate.js
index 0827abe0f732718b28310943b11e901953b99dab..c42b45f86ca9c27bdd53d4bbf04ffe6ba7f6a724 100644
--- a/packages/uni-migration/lib/validate.js
+++ b/packages/uni-migration/lib/validate.js
@@ -12,12 +12,13 @@ module.exports = function validate(input, out, options) {
}
const platformOptions = migraters[options.platform]
- options.extname = platformOptions.file.extname
+ options.extname = platformOptions.extname
+ const templateExtname = options.extname.template
const stat = fs.lstatSync(input)
if (stat.isFile()) {
- if (path.extname(input) !== options.extname) {
- return console.error(`错误: 单文件转换需要传入 ${options.extname.substr(1)} 文件地址`)
+ if (path.extname(input) !== templateExtname) {
+ return console.error(`错误: 单文件转换需要传入 ${templateExtname.substr(1)} 文件地址`)
}
options.target = 'file'
} else if (stat.isDirectory()) {
diff --git a/packages/uni-mp-weixin/dist/mp.js b/packages/uni-mp-weixin/dist/mp.js
index 491373bec0a75c8bc6bb2843bffdd8f529b04e5e..6df77e8925de371b6a7d7e1c6e746ad34347168e 100644
--- a/packages/uni-mp-weixin/dist/mp.js
+++ b/packages/uni-mp-weixin/dist/mp.js
@@ -34,7 +34,10 @@ function parseProperty (name, property, watch) {
type.push(...property.optionalTypes);
}
const prop = Object.create(null);
- prop.type = type;
+ prop.type = type.filter(sType => sType !== null); // remove null
+ if (!prop.type.length) {
+ delete prop.type;
+ }
if (hasOwn(property, 'value')) {
prop['default'] = property.value;
}
@@ -267,14 +270,37 @@ var polyfill = {
}
};
+/**
+ * wxs getRegExp
+ */
+function getRegExp () {
+ const args = Array.prototype.slice.call(arguments);
+ args.unshift(RegExp);
+ return new (Function.prototype.bind.apply(RegExp, args))()
+}
+
+/**
+ * wxs getDate
+ */
+function getDate () {
+ const args = Array.prototype.slice.call(arguments);
+ args.unshift(Date);
+ return new (Function.prototype.bind.apply(Date, args))()
+}
+
+global['__wxRoute'] = [];
+
function Component (options) {
const componentOptions = parseComponent(options);
componentOptions.mixins.unshift(polyfill);
- global['__wxComponents'][global['__wxRoute']] = componentOptions;
+ if (!global['__wxComponents']) {
+ global['__wxComponents'] = Object.create(null);
+ }
+ global['__wxComponents'][global['__wxRoute'].pop()] = componentOptions;
}
function Behavior (options) {
return options
}
-export { Behavior, Component };
+export { Behavior, Component, getDate, getRegExp };
diff --git a/packages/vue-cli-plugin-hbuilderx/packages/webpack-uni-nvue-loader/lib/templateLoader.js b/packages/vue-cli-plugin-hbuilderx/packages/webpack-uni-nvue-loader/lib/templateLoader.js
index f820630a524bf0f0871737b0422b4ddf926edf9c..198263d0a7d98d16d8458cf8c709f9e4df700045 100644
--- a/packages/vue-cli-plugin-hbuilderx/packages/webpack-uni-nvue-loader/lib/templateLoader.js
+++ b/packages/vue-cli-plugin-hbuilderx/packages/webpack-uni-nvue-loader/lib/templateLoader.js
@@ -64,13 +64,13 @@ module.exports = function (source) {
const frame = compiler.generateCodeFrame(source, start, end)
return ` ${msg}\n\n${pad(frame)}`
}).join(`\n\n`) +
- '\n'
+ '\n at ' + finalOptions.filename + ':0' // fixed by xxxxxx
)
} else {
loaderContext.emitError(
`\n Error compiling template:\n${pad(compiled.source)}\n` +
compiled.errors.map(e => ` - ${e}`).join('\n') +
- '\n'
+ '\n at ' + finalOptions.filename + ':0' // fixed by xxxxxx
)
}
}
diff --git a/packages/vue-cli-plugin-uni/lib/app-plus/index.js b/packages/vue-cli-plugin-uni/lib/app-plus/index.js
index 72da53a435155d7e31ec48bf378ef99d09795f1f..a2932fa7de65a280cd776963bed7601144110574 100644
--- a/packages/vue-cli-plugin-uni/lib/app-plus/index.js
+++ b/packages/vue-cli-plugin-uni/lib/app-plus/index.js
@@ -16,17 +16,24 @@ const {
// createTemplateCacheLoader
// } = require('../cache-loader')
+const runtimePath = '@dcloudio/uni-mp-weixin/dist/mp.js'
+
function getProvides () {
return {
'__f__': [path.resolve(__dirname, '../format-log.js'), 'default'],
- 'Behavior': ['@dcloudio/uni-mp-weixin/dist/mp.js', 'Behavior'],
- 'Component': ['@dcloudio/uni-mp-weixin/dist/mp.js', 'Component']
+ 'Behavior': [runtimePath, 'Behavior'],
+ 'Component': [runtimePath, 'Component'],
+ 'getDate': [runtimePath, 'getDate'],
+ 'getRegExp': [runtimePath, 'getRegExp']
}
}
const v3 = {
vueConfig: {
- parallel: false
+ parallel: false,
+ transpileDependencies: [
+ runtimePath
+ ]
},
webpackConfig (webpackConfig, vueOptions, api) {
const isAppService = !!vueOptions.pluginOptions['uni-app-plus']['service']
diff --git a/src/core/runtime/mp/index.js b/src/core/runtime/mp/index.js
index 4da8fa92dbade9943b104cf8935294eeca8d809b..5ac475b5ab809abc1b19e5a4543dcc43774f58ee 100644
--- a/src/core/runtime/mp/index.js
+++ b/src/core/runtime/mp/index.js
@@ -4,10 +4,17 @@ import {
import polyfill from './polyfill'
+export * from './wxs'
+
+global['__wxRoute'] = []
+
export function Component (options) {
const componentOptions = parseComponent(options)
componentOptions.mixins.unshift(polyfill)
- global['__wxComponents'][global['__wxRoute']] = componentOptions
+ if (!global['__wxComponents']) {
+ global['__wxComponents'] = Object.create(null)
+ }
+ global['__wxComponents'][global['__wxRoute'].pop()] = componentOptions
}
export function Behavior (options) {
diff --git a/src/core/runtime/mp/parser/properties-parser.js b/src/core/runtime/mp/parser/properties-parser.js
index 9d1f4c35115246a55d76bb1664469ac7748d38ba..b237b7a92758d752cffa05d51b1604c66a6f62d6 100644
--- a/src/core/runtime/mp/parser/properties-parser.js
+++ b/src/core/runtime/mp/parser/properties-parser.js
@@ -14,7 +14,10 @@ function parseProperty (name, property, watch) {
type.push(...property.optionalTypes)
}
const prop = Object.create(null)
- prop.type = type
+ prop.type = type.filter(sType => sType !== null) // remove null
+ if (!prop.type.length) {
+ delete prop.type
+ }
if (hasOwn(property, 'value')) {
prop['default'] = property.value
}
diff --git a/src/core/runtime/mp/wxs.js b/src/core/runtime/mp/wxs.js
new file mode 100644
index 0000000000000000000000000000000000000000..be07ff83e335c62a3c1ddb57cff1890329b1daee
--- /dev/null
+++ b/src/core/runtime/mp/wxs.js
@@ -0,0 +1,17 @@
+/**
+ * wxs getRegExp
+ */
+export function getRegExp () {
+ const args = Array.prototype.slice.call(arguments)
+ args.unshift(RegExp)
+ return new (Function.prototype.bind.apply(RegExp, args))()
+}
+
+/**
+ * wxs getDate
+ */
+export function getDate () {
+ const args = Array.prototype.slice.call(arguments)
+ args.unshift(Date)
+ return new (Function.prototype.bind.apply(Date, args))()
+}