diff --git a/packages/uni-migration/__tests__/demo.js b/packages/uni-migration/__tests__/demo.js
index 6e934ae49e1b55d327f8007882d1c551df1a554b..83fec6ba66a3699f0cb8e4e0e9cb5743e8f235e7 100644
--- a/packages/uni-migration/__tests__/demo.js
+++ b/packages/uni-migration/__tests__/demo.js
@@ -13,5 +13,7 @@ migrate('/Users/fxy/Downloads/wa-vantui_1.1/wxcomponents/vant',
// } = require('../lib/mp-weixin/transform/template-transformer')
// console.log(transformTemplate(
-// ``
+// `aasdf`, {
+// filename: 'index'
+// }
// ))
diff --git a/packages/uni-migration/lib/index.js b/packages/uni-migration/lib/index.js
index 0ce4c3090d865a6aece1b679ee6534769598b1f6..4f30face83d2d728e6458862f4436bc294d34c23 100644
--- a/packages/uni-migration/lib/index.js
+++ b/packages/uni-migration/lib/index.js
@@ -7,6 +7,24 @@ const migraters = {
'mp-weixin': require('./mp-weixin')
}
+/**
+ * 先简单的 hack 一下,支持 vant 的 array.wxs
+ * @param {Object} src
+ * @param {Object} dest
+ */
+function hackVant(src, dest) {
+ if (src.indexOf('array.wxs') !== -1) {
+ fs.outputFileSync(
+ dest,
+ fs.readFileSync(src)
+ .toString()
+ .replace(`array.constructor === 'Array'`, 'Array.isArray(array)')
+ )
+ return true
+ }
+ return false
+}
+
module.exports = function migrate(input, out, options = {
platform: 'mp-weixin'
}) {
@@ -24,9 +42,16 @@ module.exports = function migrate(input, out, options = {
})
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)
+ if (typeof asset === 'string') {
+ const src = path.resolve(input, asset)
+ const dest = path.resolve(out, asset.replace(styleExtname, '.css'))
+ console.log(`copy: ${dest}`)
+ if (!hackVant(src, dest)) {
+ fs.copySync(src, dest)
+ }
+ } else {
+ console.log(`write: ${path.resolve(out, asset.path)}`)
+ fs.outputFileSync(path.resolve(out, asset.path), asset.content)
+ }
})
}
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 05f71be7ff82abb0806ab0e11b0a6270bc11e0ba..fb80622690ea2440ae5da92b0a7e3fa6d919085a 100644
--- a/packages/uni-migration/lib/mp-weixin/transform/file-transformer.js
+++ b/packages/uni-migration/lib/mp-weixin/transform/file-transformer.js
@@ -1,3 +1,5 @@
+const path = require('path')
+
const {
transformJsonFile
} = require('./json-transformer')
@@ -23,12 +25,14 @@ module.exports = function transformFile(input, options) {
filepath + templateExtname
]
- const [usingComponentsCode] = transformJsonFile(filepath + '.json', deps)
+ const [jsCode] = transformJsonFile(filepath + '.json', deps)
- const [templateCode, wxsCode = ''] = transformTemplateFile(filepath + templateExtname)
+ const [templateCode, wxsCode = '', wxsFiles = []] = transformTemplateFile(filepath + templateExtname, {
+ filename: path.basename(filepath)
+ })
const styleCode = transformStyleFile(filepath + styleExtname, options, deps) || ''
- const scriptCode = transformScriptFile(filepath + '.js', usingComponentsCode, options, deps)
+ const scriptCode = transformScriptFile(filepath + '.js', jsCode, options, deps)
return [
`
@@ -41,6 +45,7 @@ ${scriptCode}
`,
- deps
+ deps,
+ wxsFiles
]
}
diff --git a/packages/uni-migration/lib/mp-weixin/transform/index.js b/packages/uni-migration/lib/mp-weixin/transform/index.js
index f2ef7c74d813dfd8a232e74cedda03afd8717ce6..e4812b8310ebc11ec2021764adf5dffcca3c5d1e 100644
--- a/packages/uni-migration/lib/mp-weixin/transform/index.js
+++ b/packages/uni-migration/lib/mp-weixin/transform/index.js
@@ -3,11 +3,12 @@ const glob = require('glob')
const transformFile = require('./file-transformer')
function generateVueFile(input, out, options) {
- const [content, deps] = transformFile(input, options)
+ const [content, deps, wxsFiles] = transformFile(input, options)
return {
path: path.resolve(out, path.basename(input).replace(options.extname.template, '.vue')),
content,
- deps
+ deps,
+ wxsFiles
}
}
@@ -28,12 +29,21 @@ function generateVueFolder(input, out, options) {
)
files.push(vueFile)
deps.push(...vueFile.deps)
+
+ const dirname = path.dirname(file)
+ vueFile.wxsFiles.forEach(wxsFile => {
+ wxsFile.path = path.join(dirname, wxsFile.path)
+ assets.push(wxsFile)
+ })
} else {
assets.push(file)
}
})
return [files, assets.filter(asset => {
- return !deps.includes(path.resolve(input, asset))
+ if (typeof asset === 'string') {
+ return !deps.includes(path.resolve(input, asset))
+ }
+ return true
})]
}
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 d87f5f7c88ca917126c5ce7834850fc4ac51dfcd..954dfd9d8b28ddd6fabef733e0536e03b50b373c 100644
--- a/packages/uni-migration/lib/mp-weixin/transform/json-transformer.js
+++ b/packages/uni-migration/lib/mp-weixin/transform/json-transformer.js
@@ -1,27 +1,35 @@
const fs = require('fs')
+const {
+ camelize,
+ capitalize
+} = require('../util')
+
function transformJson(content) {
const {
usingComponents
} = JSON.parse(content)
if (!usingComponents) {
- return ['{}']
+ return ['']
}
- const usingComponentsCode = []
+ const importCode = []
+ const componentsCode = []
Object.keys(usingComponents).forEach(name => {
- usingComponentsCode.push(`'${name}': require('${usingComponents[name]}.vue').default`)
+ const identifier = capitalize(camelize(name))
+ importCode.push(`import ${identifier} from '${usingComponents[name]}.vue'`)
+ componentsCode.push(`'${name}': ${identifier}`)
})
- return [`{
-${usingComponentsCode.join(',\n')}
-}`]
+ return [`${importCode.join('\n')}
+global['__wxVueOptions'] = {components:{${componentsCode.join(',')}}}
+`]
}
module.exports = {
transformJson,
transformJsonFile(filepath, deps) {
if (!fs.existsSync(filepath)) {
- return ['{}']
+ 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
index 147f53e605409566342f0779d8342a086be3e416..26a481905a2e222a84a41710cd522e01092125f5 100644
--- a/packages/uni-migration/lib/mp-weixin/transform/script-transformer.js
+++ b/packages/uni-migration/lib/mp-weixin/transform/script-transformer.js
@@ -5,16 +5,16 @@ const {
normalizePath
} = require('../util')
-function transformScript(content, route, usingComponentsCode) {
- return `global['__wxRoute'].push('${route}')
-global['__wxUsingComponents'].push(${usingComponentsCode})
+function transformScript(content, route, code) {
+ return `${code}
+global['__wxRoute'] = '${route}'
${content}
export default global['__wxComponents']['${route}']`
}
module.exports = {
transformScript,
- transformScriptFile(filepath, usingComponentsCode, options, deps) {
+ transformScriptFile(filepath, code, options, deps) {
let content = ''
if (!fs.existsSync(filepath)) {
content = `
@@ -29,6 +29,6 @@ Component({})
route = normalizePath(path.relative(options.base, filepath))
}
route = route.replace('.js', '')
- return transformScript(content, route, usingComponentsCode, options)
+ return transformScript(content, route, code, 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
index 89073b07339d153ea02a5684454490571bd4350c..9b9738511c4fe7a7793319e5e834a3847dc4bf5d 100644
--- a/packages/uni-migration/lib/mp-weixin/transform/template-transformer/index.js
+++ b/packages/uni-migration/lib/mp-weixin/transform/template-transformer/index.js
@@ -4,13 +4,13 @@ const path = require('path')
const parse = require('./parser')
const transform = require('./transform')
-function transformTemplate(content) {
- return transform(parse(content))
+function transformTemplate(content, options = {}) {
+ return transform(parse(content), options)
}
module.exports = {
transformTemplate,
- transformTemplateFile(filepath) {
- return transformTemplate(fs.readFileSync(filepath, 'utf8').toString().trim())
+ transformTemplateFile(filepath, options = {}) {
+ return transformTemplate(fs.readFileSync(filepath, 'utf8').toString().trim(), options)
}
}
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
index 9cc56f05b32c8118483f8aec874ce9a734fc477a..d0a3a07acd0e1dc189014688a3cf5e5d6fb23f68 100644
--- 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
@@ -33,8 +33,28 @@ function genElement(node) {
return ''
}
-function genWxs(wxs) {
- return wxs.map(wxsNode => genElement(wxsNode)).join('').trim()
+function genWxs(wxs, state) {
+ const wxsCode = []
+ const wxsFiles = []
+ wxs.forEach(wxsNode => {
+ const {
+ src,
+ module
+ } = wxsNode.attribs
+ if (!module) {
+ return
+ }
+ if (!src) {
+ wxsNode.attribs.src = './' + (state.filename ? (state.filename + '-' + module) : module) + '.wxs'
+ wxsFiles.push({
+ path: wxsNode.attribs.src,
+ content: genChildren(wxsNode)
+ })
+ }
+ wxsNode.children.length = 0
+ wxsCode.push(genElement(wxsNode))
+ })
+ return [wxsCode.join('').trim(), wxsFiles]
}
function shouldWrapper(node) {
@@ -56,7 +76,7 @@ function shouldWrapper(node) {
module.exports = function generate(node, state) {
if (shouldWrapper(node)) {
- return [`${genChildren(node).trim()}`, genWxs(state.wxs)]
+ return [`${genChildren(node).trim()}`, ...genWxs(state.wxs, state)]
}
- return [genChildren(node).trim(), genWxs(state.wxs)]
+ return [genChildren(node).trim(), ...genWxs(state.wxs, state)]
}
diff --git a/packages/uni-migration/lib/mp-weixin/transform/template-transformer/transform/index.js b/packages/uni-migration/lib/mp-weixin/transform/template-transformer/transform/index.js
index e164e60bde226d3910ff83f7263214be2b08c16b..9385ce719dfaedd80dbbbadd05c2b69536e66eff 100644
--- a/packages/uni-migration/lib/mp-weixin/transform/template-transformer/transform/index.js
+++ b/packages/uni-migration/lib/mp-weixin/transform/template-transformer/transform/index.js
@@ -1,9 +1,10 @@
const traverse = require('./traverse')
const generate = require('./generate')
-module.exports = function transform(ast) {
+module.exports = function transform(ast, options) {
const state = {
- wxs: []
+ wxs: [],
+ filename: options.filename
}
return generate(traverse(ast, state), state)
}
diff --git a/packages/uni-migration/lib/mp-weixin/util.js b/packages/uni-migration/lib/mp-weixin/util.js
index 1ec88967e39799e80d69b25934fa8e02ac9945b0..1b82bade771a3404707d08391fd2b20ead82e03d 100644
--- a/packages/uni-migration/lib/mp-weixin/util.js
+++ b/packages/uni-migration/lib/mp-weixin/util.js
@@ -1,7 +1,22 @@
const isWin = /^win/.test(process.platform)
-const normalizePath = path => (isWin ? path.replace(/\\/g, '/') : path)
+const normalizePath = path => (isWin ? path.replace(/\\/g, '/') : path)
+
+const camelizeRE = /-(\w)/g
+
+function camelize(str) {
+ return str.replace(camelizeRE, (_, c) => c ? c.toUpperCase() : '')
+}
+
+/**
+ * Capitalize a string.
+ */
+function capitalize(str) {
+ return str.charAt(0).toUpperCase() + str.slice(1)
+}
module.exports = {
+ camelize,
+ capitalize,
normalizePath
}
diff --git a/packages/uni-mp-weixin/dist/mp.js b/packages/uni-mp-weixin/dist/mp.js
index 6df77e8925de371b6a7d7e1c6e746ad34347168e..20327575c6c44ae817db93fadb36584ef9f852dd 100644
--- a/packages/uni-mp-weixin/dist/mp.js
+++ b/packages/uni-mp-weixin/dist/mp.js
@@ -61,6 +61,10 @@ function parseProperties (properties, vueComponentOptions) {
vueComponentOptions.props = props;
}
+function parseComponents (vueComponentOptions) {
+ vueComponentOptions.components = global['__wxVueOptions'].components;
+}
+
function parseOptions (options, vueComponentOptions) {
if (!options) {
return
@@ -72,6 +76,10 @@ function parseMethods (methods, vueComponentOptions) {
if (!methods) {
return
}
+ if (methods.$emit) {
+ console.warn(`Method "$emit" conflicts with an existing Vue instance method`);
+ delete methods.$emit;
+ }
vueComponentOptions.methods = methods;
}
@@ -233,6 +241,8 @@ function parseComponent (mpComponentOptions) {
}
};
+ parseComponents(vueComponentOptions);
+
parseData(data, vueComponentOptions);
parseOptions(options, vueComponentOptions);
parseMethods(methods, vueComponentOptions);
@@ -288,15 +298,14 @@ function getDate () {
return new (Function.prototype.bind.apply(Date, args))()
}
-global['__wxRoute'] = [];
+global['__wxRoute'] = '';
+global['__wxComponents'] = Object.create(null);
+global['__wxVueOptions'] = Object.create(null);
function Component (options) {
const componentOptions = parseComponent(options);
componentOptions.mixins.unshift(polyfill);
- if (!global['__wxComponents']) {
- global['__wxComponents'] = Object.create(null);
- }
- global['__wxComponents'][global['__wxRoute'].pop()] = componentOptions;
+ global['__wxComponents'][global['__wxRoute']] = componentOptions;
}
function Behavior (options) {