diff --git a/packages/babel-plugin-chameleon-import/src/Plugin.js b/packages/babel-plugin-chameleon-import/src/Plugin.js
index dac965cc3cac2800a6bbf59068ca3a8e5dbfcd92..fdb1e9f5198a9a79e312a64a7ebffa69c54b146a 100644
--- a/packages/babel-plugin-chameleon-import/src/Plugin.js
+++ b/packages/babel-plugin-chameleon-import/src/Plugin.js
@@ -188,7 +188,13 @@ class Plugin {
if (pluginState.libraryObjs[node.object.name]) {
// antd.Button -> _Button
- path.replaceWith(this.importMethod(node.property.name, file, pluginState));
+ if (node.property.type === 'Identifier') {
+ //antd.Button
+ path.replaceWith(this.importMethod(node.property.name, file, pluginState));
+ } else if (node.property.type === 'Literal') {
+ //antd['Button']
+ path.replaceWith(this.importMethod(node.property.value, file, pluginState));
+ }
} else if (pluginState.specified[node.object.name]) {
node.object = this.importMethod(pluginState.specified[node.object.name], file, pluginState);
}
diff --git a/packages/chameleon-css-loader/handler/lines.js b/packages/chameleon-css-loader/handler/lines.js
new file mode 100644
index 0000000000000000000000000000000000000000..9e4d8707ad4e7ea9aafc8715317a8c2c4458b4d0
--- /dev/null
+++ b/packages/chameleon-css-loader/handler/lines.js
@@ -0,0 +1,6 @@
+// 静态编译和运行时 web和小程序端对lines属性特殊处理
+
+module.exports = function(linesNumber) {
+ // 作为一个属性注意最后不能添加分号
+ return `display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: ${linesNumber}; overflow: hidden`
+}
diff --git a/packages/chameleon-css-loader/parser/miniapp.js b/packages/chameleon-css-loader/parser/miniapp.js
index cd1629aa828ece22f35a0d1c1602ef467b98301b..9b3dbffad7db2d3e7a6ed832f203255ef433b4c6 100644
--- a/packages/chameleon-css-loader/parser/miniapp.js
+++ b/packages/chameleon-css-loader/parser/miniapp.js
@@ -1,6 +1,10 @@
const cpx = require('../postcss/cpx.js');
+const weexPlus = require('../postcss/weex-plus');
+const postcss = require('postcss');
+
module.exports = function(source, options = {}) {
options.cpxType = 'rpx';
- return cpx(source, options);
+ return postcss([cpx(options), weexPlus()]).process(source).css;
+
}
diff --git a/packages/chameleon-css-loader/parser/web.js b/packages/chameleon-css-loader/parser/web.js
index 2b4db3083efa51dea773cbdf50d77667027335cc..440b7703a8321eace2af8ad8cc369caa68afa696 100644
--- a/packages/chameleon-css-loader/parser/web.js
+++ b/packages/chameleon-css-loader/parser/web.js
@@ -1,11 +1,13 @@
-const rem = require('../postcss/rem.js');
const cpx = require('../postcss/cpx.js');
+const postcss = require('postcss');
+const px2rem = require('postcss-plugin-px2rem');
+const weexPlus = require('../postcss/weex-plus');
module.exports = function(source, options = {}) {
if (options.rem === true) {
- return rem(source, options);
+ return postcss([px2rem(options.remOptions), weexPlus()]).process(source).css;
} else {
options.cpxType = 'scale';
- return cpx(source, options);
+ return postcss([cpx(options), weexPlus()]).process(source).css;
}
}
diff --git a/packages/chameleon-css-loader/postcss/autoprefix.js b/packages/chameleon-css-loader/postcss/autoprefix.js
deleted file mode 100644
index 9592f20e47f31ffbbfb4d43ed03efe8f076cba88..0000000000000000000000000000000000000000
--- a/packages/chameleon-css-loader/postcss/autoprefix.js
+++ /dev/null
@@ -1,7 +0,0 @@
-
-const autoprefixer = require('autoprefixer');
-const postcss = require('postcss');
-module.exports = function (content, options) {
- let ret = postcss(autoprefixer(options.autoprefixOptions)).process(content).css;
- return ret;
-}
diff --git a/packages/chameleon-css-loader/postcss/cpx.js b/packages/chameleon-css-loader/postcss/cpx.js
index da7ab77e7b25325b5801c40504bb6b26c84664a8..6bdf1eae94e2dedb357b14937a5acae55d2f4ba0 100644
--- a/packages/chameleon-css-loader/postcss/cpx.js
+++ b/packages/chameleon-css-loader/postcss/cpx.js
@@ -1,6 +1,6 @@
const postcss = require('postcss');
// 非rem的cpx处理,rem的利用postcss-plugin-px2rem插件即可实现
-let scalePlugin = postcss.plugin('postcss-plugin-cpx-scale', function (options) {
+module.exports = postcss.plugin('postcss-plugin-cpx', function (options) {
// parseType 参数决定cpx的转换
let { unitPrecision = 5, scale = 1, cpxType = 'scale'} = options;
const pxRegex = /(\d*\.?\d+)cpx/gi;
@@ -40,8 +40,3 @@ let scalePlugin = postcss.plugin('postcss-plugin-cpx-scale', function (options)
});
};
});
-
-module.exports = function (content, options) {
- let ret = postcss(scalePlugin(options)).process(content).css;
- return ret;
-}
diff --git a/packages/chameleon-css-loader/postcss/rem.js b/packages/chameleon-css-loader/postcss/rem.js
deleted file mode 100644
index eaa4095fdae1082b91c7aaefbcc6194d41eddfdc..0000000000000000000000000000000000000000
--- a/packages/chameleon-css-loader/postcss/rem.js
+++ /dev/null
@@ -1,7 +0,0 @@
-
-const pxtorem = require('postcss-plugin-px2rem');
-const postcss = require('postcss');
-module.exports = function (content, options) {
- let ret = postcss(pxtorem(options.remOptions)).process(content).css;
- return ret;
-}
diff --git a/packages/chameleon-css-loader/postcss/weex-plus.js b/packages/chameleon-css-loader/postcss/weex-plus.js
new file mode 100644
index 0000000000000000000000000000000000000000..7031471bae581991b54d981b0019e37c30d051ed
--- /dev/null
+++ b/packages/chameleon-css-loader/postcss/weex-plus.js
@@ -0,0 +1,21 @@
+// 为web和小程序提供编译weex为标准的特殊样式
+
+const postcss = require('postcss');
+
+module.exports = postcss.plugin('postcss-weex-plus', function(options) {
+ return (root, result) => {
+ root.walkDecls((decl, i) => {
+ if (decl.prop === 'lines') {
+ const decllist = [
+ postcss.decl({prop: 'overflow', value: 'hidden'}),
+ postcss.decl({prop: 'text-overflow', value: 'ellipsis'}),
+ postcss.decl({prop: 'display', value: '-webkit-box'}),
+ postcss.decl({prop: '-webkit-line-clamp', value: decl.value}),
+ postcss.decl({prop: '-webkit-box-orient', value: 'vertical'})
+ ];
+ decl.parent.append(...decllist)
+ }
+ // decl.parent.removeChild(decl);
+ })
+ }
+})
diff --git a/packages/chameleon-css-loader/proxy/proxyMiniapp.js b/packages/chameleon-css-loader/proxy/proxyMiniapp.js
index 8ab39a4d771d4e4dd3dfb6889517e7e6c6174244..25a7dbd2915fdd82caadcc8bb7e1a4b35f992fc0 100644
--- a/packages/chameleon-css-loader/proxy/proxyMiniapp.js
+++ b/packages/chameleon-css-loader/proxy/proxyMiniapp.js
@@ -1,5 +1,5 @@
const utils = require('../utils');
-
+const lines = require('../handler/lines');
// 运行时的cpx2rpx不能使用postcss处理,因为$cmlStyle方法用到了该方法,在运行时使用postcss 会出现Cannot find module "fs"的错误
module.exports = function(content) {
content = utils.disappearCssComment(content);
@@ -16,6 +16,9 @@ module.exports = function(content) {
};
})
.map(declaration => {
+ if (declaration.property === 'lines') {
+ return lines(declaration.value);
+ }
declaration.value = handle(declaration.value);
return declaration.property + ':' + declaration.value;
})
diff --git a/packages/chameleon-css-loader/proxy/proxyWeb.js b/packages/chameleon-css-loader/proxy/proxyWeb.js
index ffd5d4cb1585ba9eb1b09548d7fd0aa233012183..415653605b126ffc7a1b7f3bbb594dd53e286ba0 100644
--- a/packages/chameleon-css-loader/proxy/proxyWeb.js
+++ b/packages/chameleon-css-loader/proxy/proxyWeb.js
@@ -1,7 +1,8 @@
/** 提供编译时样式处理的方法 */
// 运行时不能使用postcss 体积过大
-
+const lines = require('../handler/lines');
const utils = require('../utils');
+
module.exports = function(content, options) {
if (typeof options === 'string') {
options = JSON.parse(utils.singlequot2doublequot(options))
@@ -24,6 +25,9 @@ module.exports = function(content, options) {
};
})
.map(declaration => {
+ if (declaration.property === 'lines') {
+ return lines(declaration.value);
+ }
declaration.value = handle(declaration.value, options);
return declaration.property + ':' + declaration.value;
})
diff --git a/packages/chameleon-css-loader/test/parser-test/weex.test.js b/packages/chameleon-css-loader/test/parser-test/weex.test.js
index 10f08acbcd33b478a36e8aee20e574ac93dd815f..8c61782269e263399267a8a358dadd2d6a33b93c 100644
--- a/packages/chameleon-css-loader/test/parser-test/weex.test.js
+++ b/packages/chameleon-css-loader/test/parser-test/weex.test.js
@@ -17,4 +17,97 @@ describe('parse/weex', function() {
})
+describe('parse/weex', function() {
+ let css = `
+ .a {
+ border: solid 1px red;
+ }
+ .b {
+ border: dotted 0 rgb(255,255, 255);
+ }
+ .c {
+ border-left: solid 1px #ccc;
+ }
+
+`;
+
+ it('border', function() {
+
+ let result = parseCss(css);// body {width:1rem;}
+ console.log(result);
+ expect(result).to.equal(`.a {\n border-style: solid;\n border-width: 1px;\n border-color: #ff0000;\n}\n\n.b {\n border-style: dotted;\n border-width: 0;\n border-color: rgb(255,255,255);\n}\n\n.c {\n border-left-style: solid;\n border-left-width: 1px;\n border-left-color: #ccc;\n}`);
+ })
+
+})
+
+
+describe('parse/weex', function() {
+ let css = `
+ .a {
+ margin-left: 10px;
+ }
+ .b {
+ margin: 10px;
+ }
+ .c {
+ margin: 10px 20px;
+ }
+ .d {
+ margin: 10px 20px 10px;
+ }
+ .e {
+ margin: 10px 20px 5px 15px;
+ }
+`;
+
+ it('margin', function() {
+
+ let result = parseCss(css);// body {width:1rem;}
+ console.log(result);
+ expect(result).to.equal(`.a {\n margin-left: 10px;\n}\n\n.b {\n margin-top: 10px;\n margin-right: 10px;\n margin-bottom: 10px;\n margin-left: 10px;\n}\n\n.c {\n margin-top: 10px;\n margin-right: 20px;\n margin-bottom: 10px;\n margin-left: 20px;\n}\n\n.d {\n margin-top: 10px;\n margin-right: 20px;\n margin-bottom: 10px;\n margin-left: 20px;\n}\n\n.e {\n margin-top: 10px;\n margin-right: 20px;\n margin-bottom: 5px;\n margin-left: 15px;\n}`);
+ })
+
+})
+
+describe('parse/weex', function() {
+ let css = `
+ .a {
+ padding-left: 10px;
+ }
+ .b {
+ padding: 10px;
+ }
+ `;
+ it('padding', function() {
+ let result = parseCss(css);// body {width:1rem;}
+ console.log(result);
+ expect(result).to.equal(`.a {\n padding-left: 10px;\n}\n\n.b {\n padding-top: 10px;\n padding-right: 10px;\n padding-bottom: 10px;\n padding-left: 10px;\n}`);
+ })
+
+})
+
+
+describe('parse/weex', function() {
+ let css = `
+ .a {
+ background: #ccc
+ url(img.png)
+ no-repeat
+ scroll
+ center center / 50%
+ content-box border-box;
+
+ }
+ .b {
+ background: url(img.png) #ccc;
+ }
+`;
+
+ it('background', function() {
+ let result = parseCss(css);// body {width:1rem;}
+ console.log(result);
+ expect(result).to.equal(`.a {\n background-color: #ccc;\n background-position: center center;\n background-size: 50%;\n background-repeat: no-repeat;\n background-origin: content-box;\n background-clip: border-box;\n background-attachment: scroll;\n background-image: url(img.png);\n}\n\n.b {\n background-color: #ccc;\n background-image: url(img.png);\n}`);
+ })
+
+})
diff --git a/packages/chameleon-css-loader/test/postcss-test/rem.test.js b/packages/chameleon-css-loader/test/postcss-test/rem.test.js
deleted file mode 100644
index ed33e6cefc68315e596c3a2ace8335729b96affe..0000000000000000000000000000000000000000
--- a/packages/chameleon-css-loader/test/postcss-test/rem.test.js
+++ /dev/null
@@ -1,24 +0,0 @@
-const parseCss = require('../../postcss/rem.js');
-const expect = require('chai').expect;
-
-let source = `width:75cpx;font-size:26cpx;/* height:200cpx; */`;
-
-
-describe('postcss/rem', function() {
- it('web-cssvalue : if options.rem to be truthy ,parse cpx to rem', function() {
- let options = {
- rem: true,
- scale: 0.5,
- remOptions: {
- // base on 750px standard.
- rootValue: {cpx: 75},
- // to leave 1px alone.
- minPixelValue: 1.01
- }
- }
- let result = parseCss(source, options);
- expect(/1rem/.test(result)).to.be.ok;
- })
-})
-
-
diff --git a/packages/chameleon-css-loader/test/postcss-test/weex-plus.test.js b/packages/chameleon-css-loader/test/postcss-test/weex-plus.test.js
new file mode 100644
index 0000000000000000000000000000000000000000..ba76755f128f760ed89d3291fa1f029178b993a3
--- /dev/null
+++ b/packages/chameleon-css-loader/test/postcss-test/weex-plus.test.js
@@ -0,0 +1,17 @@
+var postcss = require('postcss');
+var weexPlus = require('../../postcss/weex-plus');
+var content = `
+.class1 {
+ lines: 1;
+}
+`
+const expect = require('chai').expect;
+
+describe('postcss/weex-plus', function() {
+ it('convert lines', function() {
+
+ let ret = postcss(weexPlus()).process(content).css;
+ console.log(ret)
+ expect(ret).to.equal(`\n.class1 {\n lines: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n display: -webkit-box;\n -webkit-line-clamp: 1;\n -webkit-box-orient: vertical;\n}\n`);
+ })
+})
diff --git a/packages/chameleon-css-loader/test/proxy-test/proxyMiniapp.test.js b/packages/chameleon-css-loader/test/proxy-test/proxyMiniapp.test.js
index 61b4c8f826d0e3d6a3b9e3d6620b332cc13ebee8..c006a54ef947685d1b7da55b058de6f531047db7 100644
--- a/packages/chameleon-css-loader/test/proxy-test/proxyMiniapp.test.js
+++ b/packages/chameleon-css-loader/test/proxy-test/proxyMiniapp.test.js
@@ -7,6 +7,11 @@ describe('proxy/miniapp', function() {
let result = parseCss(source);
expect(/75rpx/.test(result)).to.be.ok;
})
+
+ it('lines', function() {
+ let result = parseCss('lines:1;');
+ expect(result).to.equal('display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 1; overflow: hidden');
+ })
})
diff --git a/packages/chameleon-css-loader/test/proxy-test/proxyWeb.test.js b/packages/chameleon-css-loader/test/proxy-test/proxyWeb.test.js
index d3052adea21390eecf72063ff16b02b04395a11c..6292e4861cfe9555c42325651b0174054a624ae8 100644
--- a/packages/chameleon-css-loader/test/proxy-test/proxyWeb.test.js
+++ b/packages/chameleon-css-loader/test/proxy-test/proxyWeb.test.js
@@ -31,6 +31,12 @@ describe('parse/web', function() {
expect(/1rem/.test(result1)).to.be.ok;
expect(/37.5px/.test(result2)).to.be.ok;
})
+
+
+ it('lines', function() {
+ let result = parseCss('lines:1;');
+ expect(result).to.equal('display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 1; overflow: hidden');
+ })
})
diff --git a/packages/chameleon-css-loader/test/transform/weex.test.js b/packages/chameleon-css-loader/test/transform/weex.test.js
index adf6d58d72aca68a7529451ecea1cc06b403f006..cf87276a8d7a18dfebc819d3ccb4574966eef572 100644
--- a/packages/chameleon-css-loader/test/transform/weex.test.js
+++ b/packages/chameleon-css-loader/test/transform/weex.test.js
@@ -1,16 +1,13 @@
const parseCss = require('../../transform/weex.js');
const expect = require('chai').expect;
-
let source = `width:75cpx;border:1cpx solid red;`;
describe('parse/weex', function() {
it('if options.rem to be truthy ,parse px to rem,else multiply the px value by options.scale', function() {
-
let result = parseCss.parse(source);// body {width:1rem;}
console.log(result);
expect(/75px/.test(result)).to.be.ok;
expect(/1px/.test(result)).to.be.ok;
})
-
})
diff --git a/packages/chameleon-template-parse/src/common/process-template.js b/packages/chameleon-template-parse/src/common/process-template.js
index cac1e796beb7abbf9b7c266237065a63ae98a9c0..241b29851bc7e94c68a7648f09bb36ce740e281b 100644
--- a/packages/chameleon-template-parse/src/common/process-template.js
+++ b/packages/chameleon-template-parse/src/common/process-template.js
@@ -73,7 +73,7 @@ exports.preParseGtLt = function(content) {
return exports._operationGtLt(match);
})
}
-
+// 预处理 标签内的 {{item.id}} 这种语法jsx无法识别,转化为 _cml{item.id}lmc_
exports.preParseMustache = function (content) {
let reg = />([\s\S]*?)<[a-zA-Z\/\-_]+?/g;
return content.replace(reg, function (match, key) {
@@ -103,8 +103,8 @@ exports.preParseAnimation = function(source, type) {
traverse(ast, {
enter(path) {
let node = path.node;
- if (t.isJSXAttribute(node) && node.name.name === 'c-animation') {
- let value = utils.trimCurly(node.value.value);
+ if (t.isJSXAttribute(node) && (node.name.name === 'c-animation' || node.name.name === 'v-animation')) {
+ let value = utils.trimCurly(node.value.value).trim();
path.insertAfter(t.jsxAttribute(t.jsxIdentifier(`c-bind:transitionend`), t.stringLiteral(`_animationCb('${value}',$event)`)))
}
}
diff --git a/packages/chameleon-template-parse/src/common/utils.js b/packages/chameleon-template-parse/src/common/utils.js
index f18ccd6e9fd3ab734aa4b7d8e6c8ee1cef5128c7..adfc7c735097d2b925832fa68342d6118b4e1811 100644
--- a/packages/chameleon-template-parse/src/common/utils.js
+++ b/packages/chameleon-template-parse/src/common/utils.js
@@ -163,15 +163,18 @@ _.transformWxDynamicStyleCpxToRpx = function(value) {
return value;
}
_.transformNotInMustacheCpxToRpx = function(value) {
- // 第一步
- let isNotMustacheCpxToRpxReg = /}}[^{}]*?(cpx)/g;
- return value.replace(isNotMustacheCpxToRpxReg, (match, key) => {
- if (key === 'cpx') {
- return match.replace(/cpx/, 'rpx')
+ let isNotMustacheCpxToRpxReg = /([^{}]+)?(\{\{[^{}]+\}\})?/g;
+ let temp = '';
+ const matches = value.match(isNotMustacheCpxToRpxReg);
+ value.replace(isNotMustacheCpxToRpxReg, (match, $1, $2, $3) => {
+ if ($1) {
+ temp += $1.replace(/cpx/g, 'rpx');
+ }
+ if ($2) {
+ temp += $2;
}
- return match;
});
-
+ return temp
}
_.transformMustacheCpxToRpx = function(source) {
const ast = babylon.parse(source, {
diff --git a/packages/chameleon-template-parse/src/parser/index.js b/packages/chameleon-template-parse/src/parser/index.js
index 388bec5623917a478646fbbe159d08bb4fe43209..fd1547639d08b398d352fc0e5ee7bd5420efb49d 100644
--- a/packages/chameleon-template-parse/src/parser/index.js
+++ b/packages/chameleon-template-parse/src/parser/index.js
@@ -105,10 +105,10 @@ exports.parseTextContentStatement = function parseTextContentStatement(path, typ
// parseTextContent.call({path,type,node})
// }
}
-exports.parseRefStatement = function parseRefStatement(path, type) {
+exports.parseRefStatement = function parseRefStatement(path, type, options) {
let node = path.node;
- if (t.isJSXAttribute(node) && node.name.name === 'ref') {
- parseRef.call({path, type, node});
+ if (t.isJSXAttribute(node) && (node.name.name === 'ref' || node.name.name.name === 'ref')) {
+ parseRef.call({path, type, node, options});
}
}
// web weex wx ...只处理cml语法 c-if c-else-if c-else
diff --git a/packages/chameleon-template-parse/src/parser/parse-condition.js b/packages/chameleon-template-parse/src/parser/parse-condition.js
index 622ccae36aa26e87b5aa8fda6736537338e2d05c..3e185a2094260badfa7be21ff4574c6aa6437fb3 100644
--- a/packages/chameleon-template-parse/src/parser/parse-condition.js
+++ b/packages/chameleon-template-parse/src/parser/parse-condition.js
@@ -37,7 +37,7 @@ parseCondition.tap('baidu', (args) => {
let targetCondition = conditionMap[currentCondition] && conditionMap[currentCondition][type];
if (targetCondition && currentCondition !== targetCondition) {
node.name.name = targetCondition;
- node.value.value = utils.trimCurly(node.value.value);
+ node.value && t.isStringLiteral(node.value) && (node.value.value = utils.trimCurly(node.value.value));
}
}
})
diff --git a/packages/chameleon-template-parse/src/parser/parse-ref.js b/packages/chameleon-template-parse/src/parser/parse-ref.js
index f485de41acbaa92439a80f26a9bab8a9b89d9033..156bab253a4de2ac076b470a9cb45ce64d6d6880 100644
--- a/packages/chameleon-template-parse/src/parser/parse-ref.js
+++ b/packages/chameleon-template-parse/src/parser/parse-ref.js
@@ -3,9 +3,9 @@ const t = require('@babel/types');
const { SyncHook } = require("tapable");
let parseRef = new SyncHook(['args'])
-parseRef.tap('wx', (args) => {
- let { path, type } = args;
- if (type === 'wx' || type === 'alipay' || type === 'baidu') {
+parseRef.tap('wx-cml', (args) => {
+ let { path, type, options: { lang } } = args;
+ if (lang === 'cml' && (type === 'wx' || type === 'alipay' || type === 'baidu')) {
let parentPath = path.parentPath;
let attributes = parentPath.node.attributes;
let idNode = attributes.find((attr) => attr.name.name === 'id');
@@ -23,6 +23,34 @@ parseRef.tap('wx', (args) => {
}
+ path.remove();
+ }
+
+});
+parseRef.tap('wx-vue', (args) => {
+ let { path, type, options: { lang } } = args;
+ if (lang === 'vue' && (type === 'wx' || type === 'alipay' || type === 'baidu')) {
+ debugger;
+ let parentPath = path.parentPath;
+ let attributes = parentPath.node.attributes;
+ let idNode = attributes.find((attr) => attr.name.name === 'id');
+ let refNode = attributes.find((attr) => (attr.name.name === 'ref' || attr.name.name.name === 'ref'));
+ let isDynamicRef = t.isJSXNamespacedName(refNode.name);
+ let refNodeValue = isDynamicRef ? `{{${refNode.value.value}}}` : refNode.value.value
+ let classNode = attributes.find((attr) => attr.name.name === 'class');
+ if (idNode) {
+
+ idNode.value.value = refNodeValue;
+ } else {
+ attributes.push(t.jsxAttribute(t.jsxIdentifier('id'), t.stringLiteral(refNodeValue)))
+ }
+ if (!classNode) { // 不存在class节点
+ attributes.push(t.jsxAttribute(t.jsxIdentifier('class'), t.stringLiteral('_cml_ref_lmc_')))
+ } else {
+ classNode.value.value = `${classNode.value.value} _cml_ref_lmc_`
+ }
+
+
path.remove();
}
diff --git a/packages/chameleon-template-parse/test/common/process-template.test.js b/packages/chameleon-template-parse/test/common/process-template.test.js
index 083b595fa7c7f10bc6c92d1e98cf1d44745d9f4e..98b678f1a82fc68bb6e457e81ba327f58497f458 100644
--- a/packages/chameleon-template-parse/test/common/process-template.test.js
+++ b/packages/chameleon-template-parse/test/common/process-template.test.js
@@ -29,7 +29,7 @@ describe('process-template', function() {
// preParseAnimation
describe('preParseAnimation', function() {
it(`preParse Animation add c-bind:transitionend="_animationCb(...)"`, function() {
- expect(processTemplate.preParseAnimation(`click;`))
+ expect(processTemplate.preParseAnimation(`click`)).to.equal(`click;`)
})
});
describe('postParseMustache', function() {
@@ -47,4 +47,15 @@ describe('process-template', function() {
expect(processTemplate.postParseUnicode(`\\u`)).to.equal(`%u`)
})
});
+ describe('postParseOriginTag', function() {
+ it('transform to ', function() {
+ expect(processTemplate.postParseOriginTag(``)).to.equal(`;`)
+ })
+ });
+ describe('analyzeTemplate', function() {
+ it('collect which build-in-tag is used in template', function() {
+ let options = {buildInComponents: {button: "cml-buildin-button"}};
+ expect(processTemplate.analyzeTemplate(``, options)).to.include.keys('usedBuildInTagMap')
+ })
+ });
})
diff --git a/packages/chameleon-template-parse/test/common/utils.test.js b/packages/chameleon-template-parse/test/common/utils.test.js
index 1a9ec6e51befeade740ea44c92ee8817359b3e88..6975b0f18cbe90310e793e16d9e215edb1993e2f 100644
--- a/packages/chameleon-template-parse/test/common/utils.test.js
+++ b/packages/chameleon-template-parse/test/common/utils.test.js
@@ -57,19 +57,39 @@ describe('utils', function() {
expect(utils.isOnlySpaceContent(' ')).to.be.ok;
})
});
+ describe('getReactiveValue', function() {
+ it('getReactiveValue for vue:such as {{value}} to (value)', function() {
+ expect(utils.getReactiveValue(`{{value1+value2}}`)).to.equal(`(value1+value2)`);
+ })
+ });
+ describe('getReactiveValue', function() {
+ it(`getReactiveValue for vue:such as main-{{index}} to 'main-'+(value)`, function() {
+ expect(utils.getReactiveValue(`main-{{value1+value2}}`)).to.equal(`'main-'+(value1+value2)`);
+ })
+ });
describe('getStaticValueFromMixinValue', function() {
it('getStaticValueFromMixinValue for cml', function() {
let result = utils.getStaticValueFromMixinValue(`a b{{true? 'cls1':'cls2'}} {{variable}}b c `);
- console.log('result', result)
expect(result).to.equal(`a b b c `);
})
});
describe('getDynamicValuefromMixinValue', function() {
it('getDynamicValuefromMixinValue for cml', function() {
let result = utils.getDynamicValuefromMixinValue(`a b{{true? 'cls1':'cls2'}} {{variable}}b c `);
- console.log('result', result)
expect(result).to.equal(`{{true? 'cls1':'cls2'}}{{variable}}`);
})
});
+ describe('transformWxDynamicStyleCpxToRpx', function() {
+ it('cml-syanx:transformWxDynamicStyleCpxToRpx for wx dynamic style', function() {
+ let result = utils.transformWxDynamicStyleCpxToRpx(`height:100cpx;{{'width:'+cpx+'cpx;'+'height:'+cpx2+'cpx;background-color:red;'}}height:200cpx;width:100cpx;`);
+ expect(result).to.equal(`height:100rpx;{{'width:' + cpx + 'rpx;' + 'height:' + cpx2 + 'rpx;background-color:red;'}}height:200rpx;width:100rpx;`);
+ })
+ });
+ describe('transformWxDynamicStyleCpxToRpx', function() {
+ it('vue-syanx:ransformWxDynamicStyleCpxToRpx for wx dynamic style', function() {
+ let result = utils.transformWxDynamicStyleCpxToRpx(`{{'width:'+cpx+'cpx;'+'height:'+cpx2+'cpx;background-color:red'}}`);
+ expect(result).to.equal(`{{'width:' + cpx + 'rpx;' + 'height:' + cpx2 + 'rpx;background-color:red'}}`);
+ })
+ });
})
diff --git a/packages/chameleon-template-parse/test/parser/cml.test.js b/packages/chameleon-template-parse/test/parser/cml.test.js
new file mode 100644
index 0000000000000000000000000000000000000000..4d38e6d3d9c1bff02e0a74c6e578d80677e51f30
--- /dev/null
+++ b/packages/chameleon-template-parse/test/parser/cml.test.js
@@ -0,0 +1,202 @@
+// cml 或者vue语法整体单元测试
+const compileTemplate = require('../../src/index.js');
+const expect = require('chai').expect;
+
+let options = {lang: 'cml',
+ buildInComponents: {button: "cml-buildin-button"},
+ cmss: {
+ rem: true,
+ scale: 0.5,
+ remOptions: {
+ // base on 750px standard.
+ rootValue: 75,
+ // to leave 1px alone.
+ minPixelValue: 1.01
+ },
+ autoprefixOptions: {
+ browsers: ['> 0.1%', 'ios >= 8', 'not ie < 12']
+ }
+ },
+ usingComponents: [{
+ tagName: 'thirdComp1',
+ refUrl: '/path/to/ref1',
+ filePath: 'path/to/real1',
+ isNative: true
+ }, {
+ tagName: 'thirdComp2',
+ refUrl: '/path/to/ref2',
+ filePath: 'path/to/real2',
+ isNative: false
+ }]
+};
+describe('parse-template-cml-all', function() {
+ // parseTag
+ describe('parse-tag-transform', function() {
+ let source = ``;
+ it('test-tag-transform', function() {
+ expect(compileTemplate(source, 'web', options).source).to.equal(`
`);
+ expect(compileTemplate(source, 'wx', options).source).to.equal(``)
+ });
+ });
+ // directive
+ describe('parse-directive-transform', function() {
+ let source = `
+
+
+
+
+
+
+
+
+ `;
+ it('test-directive-transform-web', function() {
+ expect(compileTemplate(source, 'web', options).source).to.equal(`\n
\n
{{value3}}\n
\n
\n
\n
\n
\n
{{value6}}
\n
`);
+ });
+ it('test-directive-transform-weex', function() {
+ expect(compileTemplate(source, 'weex', options).source).to.equal(`\n
\n
{{value3}}\n
\n
\n
\n
\n
\n
{{value6}}
\n
`)
+ });
+ it('test-directive-transform-wx', function() {
+ expect(compileTemplate(source, 'wx', options).source).to.equal(`\n \n {{value3}}\n \n \n \n \n \n {{value6}}\n `)
+ });
+ it('test-directive-transform-alipay', function() {
+ expect(compileTemplate(source, 'alipay', options).source).to.equal(`\n \n {{value3}}\n \n \n \n \n \n {{value6}}\n `)
+ });
+ it('test-directive-transform-baidu', function() {
+ expect(compileTemplate(source, 'baidu', options).source).to.equal(`\n \n {{value3}}\n \n \n \n \n \n {{value6}}\n `)
+ });
+ });
+ // parseEvent
+ describe('parse-event-transform', function() {
+ let source = ``;
+ it('test-event-transform-web', function() {
+ expect(compileTemplate(source, 'web', options).source).to.equal(`
`);
+ });
+ it('test-event-transform-weex', function() {
+ expect(compileTemplate(source, 'weex', options).source).to.equal(`
`);
+ });
+ it('test-event-transform-wx', function() {
+ expect(compileTemplate(source, 'wx', options).source).to.equal(``);
+ });
+ it('test-event-transform-alipay', function() {
+ expect(compileTemplate(source, 'alipay', options).source).to.equal(``);
+ });
+ it('test-event-transform-baidu', function() {
+ expect(compileTemplate(source, 'baidu', options).source).to.equal(``);
+ });
+ });
+ // class
+ describe('parse-class-transform', function() {
+ let source = ``;
+ it('parse-class-web', function() {
+ expect(compileTemplate(source, 'web', options).source).to.equal(`
`);
+ });
+ it('parse-class-weex', function() {
+ expect(compileTemplate(source, 'weex', options).source).to.equal(`
`);
+ });
+ // wx baidu alipay
+ it('parse-class-miniapp', function() {
+ expect(compileTemplate(source, 'wx', options).source).to.equal(``);
+ });
+ });
+ // style 以及 miniappp端cpx动态测试
+ describe('parse-style-transform', function() {
+ let source = ``;
+ it('parse-style-web', function() {
+ expect(compileTemplate(source, 'web', options).source).to.equal(`
`);
+ });
+ it('parse-style-weex', function() {
+ expect(compileTemplate(source, 'weex', options).source).to.equal(`
`);
+ });
+ // wx baidu alipay
+ it('parse-style-miniapp', function() {
+ expect(compileTemplate(source, 'wx', options).source).to.equal(``);
+ });
+ });
+ // ref 动态
+ describe('parse-ref-transform', function() {
+ let source = ``;
+ it('test-ref-transform-web', function() {
+ expect(compileTemplate(source, 'web', options).source).to.equal(``);
+ });
+ it('test-ref-transform-weex', function() {
+ expect(compileTemplate(source, 'weex', options).source).to.equal(``);
+ });
+ it('test-ref-transform-miniapp', function() {
+ expect(compileTemplate(source, 'wx', options).source).to.equal(``);
+ });
+ });
+ // ref 静态
+ describe('parse-ref-transform', function() {
+ let source = ``;
+ it('test-ref-transform-web', function() {
+ expect(compileTemplate(source, 'web', options).source).to.equal(``);
+ });
+ it('test-ref-transform-weex', function() {
+ expect(compileTemplate(source, 'weex', options).source).to.equal(``);
+ });
+ it('test-ref-transform-miniapp', function() {
+ expect(compileTemplate(source, 'wx', options).source).to.equal(``);
+ });
+ });
+ // component is
+ describe('parse-component-is-transform', function() {
+ let source = ``;
+ it('test-component-is-transform-web', function() {
+ expect(compileTemplate(source, 'web', options).source).to.equal(``);
+ });
+ it('test-component-is-transform-weex', function() {
+ expect(compileTemplate(source, 'weex', options).source).to.equal(``);
+ });
+ it('test-component-is-transform-miniapp', function() {
+ expect(compileTemplate(source, 'wx', options).source).to.equal(`;\n`);
+ });
+ });
+
+ // animation
+ describe('parse-c-animation-transform', function() {
+ let source = ``;
+ it('test-c-animation-transform-web', function() {
+ expect(compileTemplate(source, 'web', options).source).to.equal(``);
+ });
+ it('test-c-animation-transform-weex', function() {
+ expect(compileTemplate(source, 'weex', options).source).to.equal(``);
+ });
+ it('test-c-animation-transform-wx', function() {
+ expect(compileTemplate(source, 'wx', options).source).to.equal(``);
+ });
+ it('test-c-animation-transform-baidu', function() {
+ expect(compileTemplate(source, 'baidu', options).source).to.equal(``);
+ });
+ it('test-c-animation-transform-alipay', function() {
+ expect(compileTemplate(source, 'alipay', options).source).to.equal(``);
+ });
+ });
+ // attribute
+ describe('parse-attribute-transform', function() {
+ let source = ``;
+ it('test-attribute-transform-web', function() {
+ expect(compileTemplate(source, 'web', options).source).to.equal(``);
+ });
+ it('test-attribute-transform-weex', function() {
+ expect(compileTemplate(source, 'weex', options).source).to.equal(``);
+ });
+ it('test-attribute-transform-miniapp', function() {
+ expect(compileTemplate(source, 'wx', options).source).to.equal(``);
+ });
+ })
+ // 各种 < > 的转化
+ describe('parse-gtlt-transform', function() {
+ let source = `{{ 5 > 6 ? 'this is 5':'this is 6'}}`;
+ it('test-gtlt-transform-web', function() {
+ expect(compileTemplate(source, 'web', options).source).to.equal(`{{5 > 6 ? \'this is 5\' : \'this is 6\'}}
`);
+ });
+ it('test-gtlt-transform-weex', function() {
+ expect(compileTemplate(source, 'weex', options).source).to.equal(`{{5 > 6 ? \'this is 5\' : \'this is 6\'}}
`);
+ });
+ it('test-gtlt-transform-miniapp', function() {
+ expect(compileTemplate(source, 'wx', options).source).to.equal(`{{5 > 6 ? \'this is 5\' : \'this is 6\'}}`);
+ });
+ })
+
+})
diff --git a/packages/chameleon-template-parse/test/parser/index.cml.test.js b/packages/chameleon-template-parse/test/parser/index.cml.test.js
index 56092b9732b94fc6339a7ce7cd8f8f36aa184ed6..33e66e8005bef1cbc906201860be1f876ed50a15 100644
--- a/packages/chameleon-template-parse/test/parser/index.cml.test.js
+++ b/packages/chameleon-template-parse/test/parser/index.cml.test.js
@@ -1,5 +1,5 @@
-// cml语法的单元测试
+// cml单个语法的单元测试
const babylon = require('babylon');
@@ -37,6 +37,35 @@ describe('parse-template-cml', function() {
expect(result).to.equal(``)
});
});
+ describe('afterParseTag', function() { // 各个端的标签转化单元测试不做全覆盖,逻辑相对简单
+ let source = ``;
+ let options = {lang: 'cml'};
+ let callback = parseTemplate.afterParseTag;
+ it('test-after-tag-transform-web-weex', function() {
+ expect(compileTemplate(source, 'web', options, callback)).to.equal(``)
+ });
+ it('test-after-tag-transform-miniapp', function() {
+ expect(compileTemplate(source, 'wx', options, callback)).to.equal(``)
+ });
+ });
+ describe('parseBuildTag', function() { // 各个端的标签转化单元测试不做全覆盖,逻辑相对简单
+ let source = ``;
+ let options = {lang: 'cml', buildInComponents: {button: "cml-buildin-button"} };
+ let callback = parseTemplate.parseBuildTag;
+ let result = compileTemplate(source, 'web', options, callback);
+ it('test-build-tag-transform', function() {
+ expect(result).to.equal(``)
+ });
+ });
+ describe('parseTagForSlider', function() {
+ let source = ``;
+ let options = {lang: 'cml'};
+ let callback = parseTemplate.parseTagForSlider;
+ let result = compileTemplate(source, 'wx', options, callback);
+ it('parseTagForSlider for wx', function() {
+ expect(result).to.equal(``)
+ });
+ });
// parseRefStatement:仅在所有的小程序端进行处理
describe('parseRefStatement-wx-alipay-baidu', function() {
let source = ``;
@@ -49,68 +78,120 @@ describe('parse-template-cml', function() {
});
// parseConditionalStatement
describe('parseConditionalStatement-web-weex', function() {
- let source = ``;
+ let source = ``;
let options = {lang: 'cml'};
let callback = parseTemplate.parseConditionalStatement;
let result = compileTemplate(source, 'web', options, callback);
it('test-condition-web-transform', function() {
- expect(result).to.equal(``)
+ expect(result).to.equal(``)
});
});
describe('parseConditionalStatement-wx', function() {
- let source = ``;
+ let source = ``;
let options = {lang: 'cml'};
let callback = parseTemplate.parseConditionalStatement;
let result = compileTemplate(source, 'wx', options, callback);
it('test-condition-wx-transform', function() {
- expect(result).to.equal(``)
+ expect(result).to.equal(``)
});
});
describe('parseConditionalStatement-alipay', function() {
- let source = ``;
+ let source = ``;
let options = {lang: 'cml'};
let callback = parseTemplate.parseConditionalStatement;
let result = compileTemplate(source, 'alipay', options, callback);
it('test-condition-alipay-transform', function() {
- expect(result).to.equal(``)
+ expect(result).to.equal(``)
});
});
describe('parseConditionalStatement-baidu', function() {
- let source = ``;
+ let source = ``;
let options = {lang: 'cml'};
let callback = parseTemplate.parseConditionalStatement;
let result = compileTemplate(source, 'baidu', options, callback);
it('test-condition-baidu-transform', function() {
- expect(result).to.equal(``)
+ expect(result).to.equal(``)
});
});
// parseEventListener
describe('parseEventListener-web-weex', function() {
let source = ``;
- let options = {lang: 'cml'};
+ let originSource = ` `
+ let options = {lang: 'cml',
+ buildInComponents: {button: "cml-buildin-button"},
+ usingComponents: [{
+ tagName: 'thirdComp1',
+ refUrl: '/path/to/ref1',
+ filePath: 'path/to/real1',
+ isNative: true
+ }, {
+ tagName: 'thirdComp2',
+ refUrl: '/path/to/ref2',
+ filePath: 'path/to/real2',
+ isNative: false
+ }]
+ };
let callback = parseTemplate.parseEventListener;
let result = compileTemplate(source, 'web', options, callback);
it('test-event-transform', function() {
expect(result).to.equal(``)
});
+ // 原生组件事件不进行代理
+ it('test-origin-tag-event-transform', function() {
+ expect(compileTemplate(originSource, 'web', options, callback)).to.equal(``)
+ });
});
describe('parseEventListener-wx-baidu', function() {
let source = ``;
- let options = {lang: 'cml'};
+ let originSource = ` `
+ let options = {lang: 'cml',
+ buildInComponents: {button: "cml-buildin-button"},
+ usingComponents: [{
+ tagName: 'thirdComp1',
+ refUrl: '/path/to/ref1',
+ filePath: 'path/to/real1',
+ isNative: true
+ }, {
+ tagName: 'thirdComp2',
+ refUrl: '/path/to/ref2',
+ filePath: 'path/to/real2',
+ isNative: false
+ }]
+ };
let callback = parseTemplate.parseEventListener;
let result = compileTemplate(source, 'wx', options, callback);
it('test-event-transform', function() {
expect(result).to.equal(``)
});
+ it('test-origin-tag-event-transform', function() {
+ expect(compileTemplate(originSource, 'wx', options, callback)).to.equal(``)
+ });
});
describe('parseEventListener-alipay', function() {
let source = ``;
- let options = {lang: 'cml'};
+ let originSource = ` `
+ let options = {lang: 'cml',
+ buildInComponents: {button: "cml-buildin-button"},
+ usingComponents: [{
+ tagName: 'thirdComp1',
+ refUrl: '/path/to/ref1',
+ filePath: 'path/to/real1',
+ isNative: true
+ }, {
+ tagName: 'thirdComp2',
+ refUrl: '/path/to/ref2',
+ filePath: 'path/to/real2',
+ isNative: false
+ }]
+ };
let callback = parseTemplate.parseEventListener;
let result = compileTemplate(source, 'alipay', options, callback);
it('test-event-transform', function() {
expect(result).to.equal(``)
});
+ it('test-origin-tag-event-transform', function() {
+ expect(compileTemplate(originSource, 'alipay', options, callback)).to.equal(``)
+ });
});
// parseIterationStatement
describe('parseIterationStatement-web-weex', function() {
@@ -122,14 +203,21 @@ describe('parse-template-cml', function() {
expect(result).to.equal(``)
});
});
- describe('parseIterationStatement-wx-alipay', function() {
+ describe('parseIterationStatement-wx', function() {
let source = ``;
let options = {lang: 'cml'};
let callback = parseTemplate.parseIterationStatement;
let result1 = compileTemplate(source, 'wx', options, callback);
- let result2 = compileTemplate(source, 'alipay', options, callback);
it('test-Iteration-transform', function() {
expect(result1).to.equal(``)
+ });
+ });
+ describe('parseIterationStatement-alipay', function() {
+ let source = ``;
+ let options = {lang: 'cml'};
+ let callback = parseTemplate.parseIterationStatement;
+ let result2 = compileTemplate(source, 'alipay', options, callback);
+ it('test-Iteration-transform', function() {
expect(result2).to.equal(``)
});
});
@@ -142,6 +230,43 @@ describe('parse-template-cml', function() {
expect(result).to.equal(``)
});
});
+ // parseIterationStatement c-for-inde c-for-item c-key的测试
+ describe('parseIterationStatement-web-weex', function() {
+ let source = ``;
+ let options = {lang: 'cml'};
+ let callback = parseTemplate.parseIterationStatement;
+ let result = compileTemplate(source, 'web', options, callback);
+ it('test-Iteration-transform', function() {
+ expect(result).to.equal(``)
+ });
+ });
+ describe('parseIterationStatement-wx', function() {
+ let source = ``;
+ let options = {lang: 'cml'};
+ let callback = parseTemplate.parseIterationStatement;
+ let result1 = compileTemplate(source, 'wx', options, callback);
+ it('test-Iteration-transform', function() {
+ expect(result1).to.equal(``)
+ });
+ });
+ describe('parseIterationStatement-alipay', function() {
+ let source = ``;
+ let options = {lang: 'cml'};
+ let callback = parseTemplate.parseIterationStatement;
+ let result2 = compileTemplate(source, 'alipay', options, callback);
+ it('test-Iteration-transform', function() {
+ expect(result2).to.equal(``)
+ });
+ });
+ describe('parseIterationStatement-baidu', function() {
+ let source = ``;
+ let options = {lang: 'cml'};
+ let callback = parseTemplate.parseIterationStatement;
+ let result = compileTemplate(source, 'baidu', options, callback);
+ it('test-Iteration-transform', function() {
+ expect(result).to.equal(``)
+ });
+ });
// parseAttributeStatement
describe('parseAttributeStatement-web-weex', function() {
let source = ``;
@@ -278,7 +403,7 @@ describe('parse-template-cml', function() {
});
// parseDirectiveStatement:c-model
describe('parseDirectiveStatement-web-weex', function() {
- let source = ``;
+ let source = ``;
let options = {lang: 'cml'};
let callback = parseTemplate.parseDirectiveStatement;
let result = compileTemplate(source, 'web', options, callback);
@@ -328,13 +453,27 @@ describe('parse-template-cml', function() {
let result_baidu = compileTemplate(source, 'baidu', options, callback);
let result_alipay = compileTemplate(source, 'alipay', options, callback);
- it('test-class-transform', function() {
+ it('test-c-show-transform', function() {
expect(result_wx).to.equal(``)
expect(result_baidu).to.equal(``)
expect(result_alipay).to.equal(``)
});
});
-
+ // c-text
+ describe('parseDirectiveStatement-web-miniapp', function() {
+ let source = `everything will be replaced`;
+ let options = {lang: 'cml'};
+ let callback = parseTemplate.parseDirectiveStatement;
+ it('test-c-text-transform', function() {
+ expect(compileTemplate(source, 'web', options, callback)).to.equal(`{{value1}}`)
+ });
+ it('test-c-text-transform', function() {
+ expect(compileTemplate(source, 'wx', options, callback)).to.equal(`{{value1}}`)
+ });
+ it('test-c-text-transform', function() {
+ expect(compileTemplate(source, 'weex', options, callback)).to.equal(`{{value1}}`)
+ });
+ });
describe('parse-vue2wx-wx', function() {
let source = ``;
let options = {lang: 'cml'};
diff --git a/packages/chameleon-template-parse/test/parser/index.vue.test.js b/packages/chameleon-template-parse/test/parser/index.vue.test.js
index cd7eac2f36602fe648c8b6cba47bbd3194182bf3..f9b9b07c427a792298532bcd04ed683ce778104a 100644
--- a/packages/chameleon-template-parse/test/parser/index.vue.test.js
+++ b/packages/chameleon-template-parse/test/parser/index.vue.test.js
@@ -1,5 +1,5 @@
-// vue语法的单元测试
+// vue单个语法的单元测试
const babylon = require('babylon');
const t = require('@babel/types');
const traverse = require('@babel/traverse')["default"];
@@ -25,6 +25,44 @@ function compileTemplate(source, type, options, callback) {
}
// cml语法的单元测试
describe('parse-template-vue', function() {
+ describe('parseTag', function() { // 各个端的标签转化单元测试不做全覆盖,逻辑相对简单
+ let source = ``;
+ let options = {lang: 'vue'};
+ let callback = parseTemplate.parseTag;
+ let result = compileTemplate(source, 'web', options, callback);
+ it('test-tag-transform', function() {
+ expect(result).to.equal(``)
+ });
+ });
+ describe('afterParseTag', function() { // 各个端的标签转化单元测试不做全覆盖,逻辑相对简单
+ let source = ``;
+ let options = {lang: 'vue'};
+ let callback = parseTemplate.afterParseTag;
+ it('test-after-tag-transform-web-weex', function() {
+ expect(compileTemplate(source, 'web', options, callback)).to.equal(``)
+ });
+ it('test-after-tag-transform-miniapp', function() {
+ expect(compileTemplate(source, 'wx', options, callback)).to.equal(``)
+ });
+ });
+ describe('parseBuildTag', function() { // 各个端的标签转化单元测试不做全覆盖,逻辑相对简单
+ let source = ``;
+ let options = {lang: 'vue', buildInComponents: {button: "cml-buildin-button"} };
+ let callback = parseTemplate.parseBuildTag;
+ let result = compileTemplate(source, 'web', options, callback);
+ it('test-build-tag-transform', function() {
+ expect(result).to.equal(``)
+ });
+ });
+ describe('parseTagForSlider', function() {
+ let source = ``;
+ let options = {lang: 'vue'};
+ let callback = parseTemplate.parseTagForSlider;
+ let result = compileTemplate(source, 'wx', options, callback);
+ it('parseTagForSlider for wx', function() {
+ expect(result).to.equal(``)
+ });
+ });
// parseRefStatement:仅在所有的小程序端进行处理
describe('parseRefStatement-miniapp', function() {
let source = ``;
@@ -50,19 +88,52 @@ describe('parse-template-vue', function() {
});
});
// parseVue2WxStatement:测试v-for语法转化为小程序
- describe('parseVue2WxStatement-miniapp', function() {
- let source = ``;
+ describe('parseVue2WxStatement-web', function() {
+ let source = ``;
let options = {lang: 'vue'};
let callback = parseTemplate.parseVue2WxStatement;
- let result_wx = compileTemplate(source, 'wx', options, callback);
- let result_alipay = compileTemplate(source, 'alipay', options, callback);
- let result_baidu = compileTemplate(source, 'baidu', options, callback);
+ let result = compileTemplate(source, 'web', options, callback);
+ it('test-Iteration-transform', function() {
+ expect(result).to.equal(``)
+ });
+ });
+ describe('parseVue2WxStatement-weex', function() {
+ let source = ``;
+ let options = {lang: 'vue'};
+ let callback = parseTemplate.parseVue2WxStatement;
+ let result = compileTemplate(source, 'weex', options, callback);
it('test-Iteration-transform', function() {
- expect(result_wx).to.equal(``)
- expect(result_alipay).to.equal(``)
- expect(result_baidu).to.equal(``)
+ expect(result).to.equal(``)
});
});
+ describe('parseVue2WxStatement-wx', function() {
+ let source = ``;
+ let options = {lang: 'vue'};
+ let callback = parseTemplate.parseVue2WxStatement;
+ let result = compileTemplate(source, 'wx', options, callback);
+ it('test-Iteration-transform', function() {
+ expect(result).to.equal(``)
+ });
+ });
+ describe('parseVue2WxStatement-alipay', function() {
+ let source = ``;
+ let options = {lang: 'vue'};
+ let callback = parseTemplate.parseVue2WxStatement;
+ let result = compileTemplate(source, 'alipay', options, callback);
+ it('test-Iteration-transform', function() {
+ expect(result).to.equal(``)
+ });
+ });
+ describe('parseVue2WxStatement-baidu', function() {
+ let source = ``;
+ let options = {lang: 'vue'};
+ let callback = parseTemplate.parseVue2WxStatement;
+ let result = compileTemplate(source, 'baidu', options, callback);
+ it('test-Iteration-transform', function() {
+ expect(result).to.equal(``)
+ });
+ });
+
// parseVue2WxStatement:测试 v-bind转化为小程序端的响应值
describe('parseVue2WxStatement-miniapp', function() {
let source = ``;
@@ -77,6 +148,15 @@ describe('parse-template-vue', function() {
expect(result_baidu).to.equal(``)
});
});
+ describe('parseAttributeStatement-web-weex', function() {
+ let source = ``;
+ let options = {lang: 'vue'};
+ let callback = parseTemplate.parseAttributeStatement;
+ let result = compileTemplate(source, 'web', options, callback);
+ it('test-attribute-transform', function() {
+ expect(result).to.equal(``)
+ });
+ });
// vue语法下style只支持一个style;parseStyleStatement
describe('parseStyleStatement-web', function() {
let source = ``;
@@ -176,7 +256,7 @@ describe('parse-template-vue', function() {
});
// parseDirectiveStatement
describe('parseDirectiveStatement-web-weex', function() {
- let source = ``;
+ let source = ``;
let options = {lang: 'vue'};
let callback = parseTemplate.parseDirectiveStatement;
let result = compileTemplate(source, 'web', options, callback);
@@ -185,16 +265,16 @@ describe('parse-template-vue', function() {
});
});
describe('parseDirectiveStatement-wx-alipay-baidu', function() {
- let source = ``;
+ let source = ``;
let options = {lang: 'vue'};
let callback = parseTemplate.parseDirectiveStatement;
let result_wx = compileTemplate(source, 'wx', options, callback);
let result_baidu = compileTemplate(source, 'baidu', options, callback);
let result_alipay = compileTemplate(source, 'alipay', options, callback);
- it('test-class-transform', function() {
- expect(result_wx).to.equal(``)
- expect(result_baidu).to.equal(``)
- expect(result_alipay).to.equal(``)
+ it('test-v-model', function() {
+ expect(result_wx).to.equal(``)
+ expect(result_baidu).to.equal(``)
+ expect(result_alipay).to.equal(``)
});
});
// c-show
@@ -208,7 +288,21 @@ describe('parse-template-vue', function() {
expect(result).to.equal(``)
});
});
-
+ // c-text
+ describe('parseDirectiveStatement-web-miniapp', function() {
+ let source = `everything will be replaced`;
+ let options = {lang: 'vue'};
+ let callback = parseTemplate.parseDirectiveStatement;
+ it('test-c-text-transform', function() {
+ expect(compileTemplate(source, 'web', options, callback)).to.equal(`{{value1}}`)
+ });
+ it('test-c-text-transform', function() {
+ expect(compileTemplate(source, 'wx', options, callback)).to.equal(`{{value1}}`)
+ });
+ it('test-c-text-transform', function() {
+ expect(compileTemplate(source, 'weex', options, callback)).to.equal(`{{value1}}`)
+ });
+ });
describe('parseDirectiveStatement-weex', function() {
let source = ``;
let options = {lang: 'vue'};
diff --git a/packages/chameleon-template-parse/test/parser/vue.test.js b/packages/chameleon-template-parse/test/parser/vue.test.js
new file mode 100644
index 0000000000000000000000000000000000000000..262115b9b94fab00ab106109ca4b71c7834a2bf5
--- /dev/null
+++ b/packages/chameleon-template-parse/test/parser/vue.test.js
@@ -0,0 +1,201 @@
+// cml 或者vue语法整体单元测试
+const compileTemplate = require('../../src/index.js');
+const expect = require('chai').expect;
+let options = {lang: 'vue',
+ buildInComponents: {button: "cml-buildin-button"},
+ cmss: {
+ rem: true,
+ scale: 0.5,
+ remOptions: {
+ // base on 750px standard.
+ rootValue: 75,
+ // to leave 1px alone.
+ minPixelValue: 1.01
+ },
+ autoprefixOptions: {
+ browsers: ['> 0.1%', 'ios >= 8', 'not ie < 12']
+ }
+ },
+ usingComponents: [{
+ tagName: 'thirdComp1',
+ refUrl: '/path/to/ref1',
+ filePath: 'path/to/real1',
+ isNative: true
+ }, {
+ tagName: 'thirdComp2',
+ refUrl: '/path/to/ref2',
+ filePath: 'path/to/real2',
+ isNative: false
+ }]
+};
+describe('parse-template-vue-all', function() {
+ // parseTag
+ describe('parse-tag-transform', function() {
+ let source = ``;
+ it('test-tag-transform', function() {
+ expect(compileTemplate(source, 'web', options).source).to.equal(`
`);
+ expect(compileTemplate(source, 'wx', options).source).to.equal(``)
+ });
+ });
+ // directive
+ describe('parse-directive-transform', function() {
+ let source = `
+
+
+
+
+
+
+
+
+ `;
+ it('test-directive-transform-web', function() {
+ expect(compileTemplate(source, 'web', options).source).to.equal(`\n
\n
{{value3}}\n
\n
\n
\n
\n
\n
{{value6}}
\n
`);
+ });
+ it('test-directive-transform-weex', function() {
+ expect(compileTemplate(source, 'weex', options).source).to.equal(`\n
\n
{{value3}}\n
\n
\n
\n
\n
\n
{{value6}}
\n
`)
+ });
+ it('test-directive-transform-wx', function() {
+ expect(compileTemplate(source, 'wx', options).source).to.equal(`\n \n {{value3}}\n \n \n \n \n \n {{value6}}\n `)
+ });
+ it('test-directive-transform-alipay', function() {
+ expect(compileTemplate(source, 'alipay', options).source).to.equal(`\n \n {{value3}}\n \n \n \n \n \n {{value6}}\n `)
+ });
+ it('test-directive-transform-baidu', function() {
+ expect(compileTemplate(source, 'baidu', options).source).to.equal(`\n \n {{value3}}\n \n \n \n \n \n {{value6}}\n `)
+ });
+ });
+ // parseEvent
+ describe('parse-event-transform', function() {
+ let source = ``;
+ it('test-event-transform-web', function() {
+ expect(compileTemplate(source, 'web', options).source).to.equal(`
`);
+ });
+ it('test-event-transform-weex', function() {
+ expect(compileTemplate(source, 'weex', options).source).to.equal(`
`);
+ });
+ it('test-event-transform-wx', function() {
+ expect(compileTemplate(source, 'wx', options).source).to.equal(``);
+ });
+ it('test-event-transform-alipay', function() {
+ expect(compileTemplate(source, 'alipay', options).source).to.equal(``);
+ });
+ it('test-event-transform-baidu', function() {
+ expect(compileTemplate(source, 'baidu', options).source).to.equal(``);
+ });
+ });
+ // class
+ describe('parse-class-transform', function() {
+ let source = ``;
+ it('parse-class-web', function() {
+ expect(compileTemplate(source, 'web', options).source).to.equal(`
`);
+ });
+ it('parse-class-weex', function() {
+ expect(compileTemplate(source, 'weex', options).source).to.equal(`
`);
+ });
+ // wx baidu alipay
+ it('parse-class-miniapp', function() {
+ expect(compileTemplate(source, 'wx', options).source).to.equal(``);
+ });
+ });
+ // style 以及 miniappp端cpx动态测试
+ describe('parse-style-transform', function() {
+ let source = ``;
+ it('parse-style-web', function() {
+ expect(compileTemplate(source, 'web', options).source).to.equal(`
`);
+ });
+ it('parse-style-weex', function() {
+ expect(compileTemplate(source, 'weex', options).source).to.equal(`
`);
+ });
+ // wx baidu alipay
+ it('parse-style-miniapp', function() {
+ expect(compileTemplate(source, 'wx', options).source).to.equal(``);
+ });
+ });
+ // ref 动态
+ describe('parse-ref-transform', function() {
+ let source = ``;
+ it('test-ref-transform-web', function() {
+ expect(compileTemplate(source, 'web', options).source).to.equal(``);
+ });
+ it('test-ref-transform-weex', function() {
+ expect(compileTemplate(source, 'weex', options).source).to.equal(``);
+ });
+ it('test-ref-transform-miniapp', function() {
+ expect(compileTemplate(source, 'wx', options).source).to.equal(``);
+ });
+ });
+ // ref 静态
+ describe('parse-ref-transform', function() {
+ let source = ``;
+ it('test-ref-transform-web', function() {
+ expect(compileTemplate(source, 'web', options).source).to.equal(``);
+ });
+ it('test-ref-transform-weex', function() {
+ expect(compileTemplate(source, 'weex', options).source).to.equal(``);
+ });
+ it('test-ref-transform-miniapp', function() {
+ expect(compileTemplate(source, 'wx', options).source).to.equal(``);
+ });
+ });
+ // // component is
+ describe('parse-component-is-transform', function() {
+ let source = ``;
+ it('test-component-is-transform-web', function() {
+ expect(compileTemplate(source, 'web', options).source).to.equal(``);
+ });
+ it('test-component-is-transform-weex', function() {
+ expect(compileTemplate(source, 'weex', options).source).to.equal(``);
+ });
+ it('test-component-is-transform-miniapp', function() {
+ expect(compileTemplate(source, 'wx', options).source).to.equal(`;\n`);
+ });
+ });
+
+ // // animation
+ describe('parse-v-animation-transform', function() {
+ let source = ``;
+ it('test-c-animation-transform-web', function() {
+ expect(compileTemplate(source, 'web', options).source).to.equal(``);
+ });
+ it('test-c-animation-transform-weex', function() {
+ expect(compileTemplate(source, 'weex', options).source).to.equal(``);
+ });
+ it('test-c-animation-transform-wx', function() {
+ expect(compileTemplate(source, 'wx', options).source).to.equal(``);
+ });
+ it('test-c-animation-transform-baidu', function() {
+ expect(compileTemplate(source, 'baidu', options).source).to.equal(``);
+ });
+ it('test-c-animation-transform-alipay', function() {
+ expect(compileTemplate(source, 'alipay', options).source).to.equal(``);
+ });
+ });
+ // // attribute
+ describe('parse-attribute-transform', function() {
+ let source = ``;
+ it('test-attribute-transform-web', function() {
+ expect(compileTemplate(source, 'web', options).source).to.equal(``);
+ });
+ it('test-attribute-transform-weex', function() {
+ expect(compileTemplate(source, 'weex', options).source).to.equal(``);
+ });
+ it('test-attribute-transform-miniapp', function() {
+ expect(compileTemplate(source, 'wx', options).source).to.equal(``);
+ });
+ })
+ // //各种 < > 的转化
+ describe('parse-gtlt-transform', function() {
+ let source = `{{ 5 > 6 ? 'this is 5':'this is 6'}}`;
+ it('test-gtlt-transform-web', function() {
+ expect(compileTemplate(source, 'web', options).source).to.equal(`{{5 > 6 ? \'this is 5\' : \'this is 6\'}}
`);
+ });
+ it('test-gtlt-transform-weex', function() {
+ expect(compileTemplate(source, 'weex', options).source).to.equal(`{{5 > 6 ? \'this is 5\' : \'this is 6\'}}
`);
+ });
+ it('test-gtlt-transform-miniapp', function() {
+ expect(compileTemplate(source, 'wx', options).source).to.equal(`{{5 > 6 ? \'this is 5\' : \'this is 6\'}}`);
+ });
+ })
+
+})
diff --git a/packages/chameleon-tool-utils/package.json b/packages/chameleon-tool-utils/package.json
index ac5e3e5361620030237914899eed08d55aa4aa5c..2108738c022cd281f4879027f9b79f563254befd 100644
--- a/packages/chameleon-tool-utils/package.json
+++ b/packages/chameleon-tool-utils/package.json
@@ -36,4 +36,4 @@
"break-test": "./node_modules/.bin/mocha --inspect-brk --recursive --reporter spec"
},
"version": "0.0.15-alpha.0"
-}
\ No newline at end of file
+}
diff --git a/packages/chameleon-tool-utils/src/index.js b/packages/chameleon-tool-utils/src/index.js
index 5671f5fa5c0a140abef2e35ba1b47ce9fbc529df..fa257b15cb4468c723a7225e600573623a8c6db4 100644
--- a/packages/chameleon-tool-utils/src/index.js
+++ b/packages/chameleon-tool-utils/src/index.js
@@ -215,6 +215,8 @@ _.isDirectory = function (filePath) {
}
}
+
+
/**
* @param {String} filePath cml文件位置 已经不再支持json文件
* @param {String} confType 获取的类型 wx|web|weex
diff --git a/packages/chameleon-tool/commanders/utils.js b/packages/chameleon-tool/commanders/utils.js
index 798e5e77ea6b53eba8ce0bfe4e4423aa21eae58b..115e1c790a2424f07a0f804a3fef8b9338843cd0 100644
--- a/packages/chameleon-tool/commanders/utils.js
+++ b/packages/chameleon-tool/commanders/utils.js
@@ -5,7 +5,7 @@ const {startServer: startWeexLiveLoad, broadcast} = require('./weex/socket-serve
const previewSocket = require('./web/web-socket.js');
const cmlLinter = require('chameleon-linter');
const watch = require('glob-watcher');
-
+const fse = require('fs-extra');
/**
* 非web端构建
@@ -15,7 +15,24 @@ const watch = require('glob-watcher');
exports.getBuildPromise = async function (media, type) {
let options = exports.getOptions(media, type);
- let webpackConfig = await getConfig(options)
+ let webpackConfig = await getConfig(options);
+ if (~['wx', 'baidu', 'alipay'].indexOf(type)) {
+ // 异步删除output目录
+ var outputpath = webpackConfig.output.path;
+ await new Promise(function(resolve, reject) {
+ fse.remove(outputpath, function(err) {
+ if (err) {
+ reject(err);
+ }
+ resolve();
+ })
+ })["catch"](e => {
+ let message = `clear file error! please remove direction ${outputpath} by yourself!`
+ cml.log.error(message);
+ throw new Error(e)
+ })
+
+ }
return new Promise(function(resolve, reject) {
// watch模式
if (media === 'dev') {
@@ -43,7 +60,7 @@ exports.getBuildPromise = async function (media, type) {
if (err) {
reject(err);
}
- resolve();
+ resolve();
});
}
})
diff --git a/packages/chameleon-tool/configs/component_export/export-loader.js b/packages/chameleon-tool/configs/component_export/export-loader.js
index dbdf3770c1ea2e92a015de3df3d9b1e3ac8b3cec..52ce1a2e0dccfe387b75e3c82b9642a2c3476125 100644
--- a/packages/chameleon-tool/configs/component_export/export-loader.js
+++ b/packages/chameleon-tool/configs/component_export/export-loader.js
@@ -89,7 +89,6 @@ function replaceCmlPath(content, filename, options) {
}
function replaceCmss(content, options) {
- debugger
let style = cml.utils.splitParts({
content
}).style;
diff --git a/packages/chameleon-tool/configs/getMiniAppCommonConfig.js b/packages/chameleon-tool/configs/getMiniAppCommonConfig.js
index 0dc1b748b78af3686ba06b18b2a4e982066add50..c23a000a991152c31d2410ee88d024f7de0b0ad3 100644
--- a/packages/chameleon-tool/configs/getMiniAppCommonConfig.js
+++ b/packages/chameleon-tool/configs/getMiniAppCommonConfig.js
@@ -1,7 +1,6 @@
var ExtractTextPlugin = require('extract-text-webpack-plugin')
var utils = require('./utils.js');
var path = require('path');
-const CleanWebpackPlugin = require('clean-webpack-plugin')
var webpack = require('webpack')
var merge = require('webpack-merge')
const getCommonConfig = require('./getCommonConfig');
@@ -78,7 +77,6 @@ module.exports = function (options) {
filename: `[name].${targetObj.css}`,
allChunks: true
}),
- new CleanWebpackPlugin(['./*'], {root: outputPath, verbose: false}),
new webpack.optimize.CommonsChunkPlugin({
name: ['common', 'manifest'],
filename: 'static/js/[name].js',
diff --git a/packages/chameleon-tool/configs/postcss/web/.postcssrc.js b/packages/chameleon-tool/configs/postcss/web/.postcssrc.js
index cda2bf688cd0a8b9c1499202a98cf924f4328dd6..cd15f2c195f24be1be0cd9513cd3d26a6f4f71a7 100644
--- a/packages/chameleon-tool/configs/postcss/web/.postcssrc.js
+++ b/packages/chameleon-tool/configs/postcss/web/.postcssrc.js
@@ -3,7 +3,6 @@ let defaultConfig = {
"plugins": {
// to edit target browsers: use "browserslist" field in package.json
"postcss-import": {},
- "postcss-plugin-weex":{},
"autoprefixer": cml.config.get().cmss.autoprefixOptions
}
}
diff --git a/packages/chameleon-tool/configs/preview.html b/packages/chameleon-tool/configs/preview.html
index e766f4606c29c2133a5b8b44bbcbb80e4878524a..3cdfd18c387195335c214e8396200e34573b3113 100644
--- a/packages/chameleon-tool/configs/preview.html
+++ b/packages/chameleon-tool/configs/preview.html
@@ -539,7 +539,7 @@
未启动Weex端构建
-
+
@@ -558,12 +558,12 @@
未启动web端构建
-
+
-
-
+
+
-
@@ -635,8 +634,8 @@
var jsbundle = '';
var routerConfig = {
mode: 'history',
- routes:[],
- };
+ routes:[]
+ };
var activeIndex = 0;
var routeListDom;
var selectInput = document.getElementById('routes-select');
@@ -648,16 +647,16 @@
jsbundle = params.jsbundle;
}
function activeBuildType(params){
- let buildType = params.buildType;
- if (buildType.includes('weex')) {
+ var buildType = params.buildType;
+ if (~buildType.indexOf('weex')) {
Array.isArray(buildType) && buildType.push('sfc');
};
- if (buildType.includes('web')) {
+ if (~buildType.indexOf('web')) {
Array.isArray(buildType) && buildType.push('h5');
};
- buildType.forEach((type) => {
- var activeDom = document.getElementById(`${type}-dev`);
- var hideDom = document.getElementById(`${type}-no-dev`);
+ buildType.forEach(function (type) {
+ var activeDom = document.getElementById(type + '-dev');
+ var hideDom = document.getElementById(type + '-no-dev');
if(activeDom){
activeDom.style.display = 'block';
}
@@ -683,7 +682,7 @@
QR.addData(url)
QR.make()
$QR.innerHTML = QR.createImgTag(6, 12)
-
+
}
//创建beatles的二维码
@@ -696,7 +695,7 @@
pageUrl += subpath
}
var beatlesUrl = pageUrl + '?wx_addr=' +
- encodeURIComponent(`${url}?t=` + Date.now());
+ encodeURIComponent(url + '?t=' + Date.now());
if (path) {
beatlesUrl += '&path=' + encodeURIComponent(path);
@@ -761,12 +760,12 @@
if (routes) {
var fragment = document.createDocumentFragment();
routeListDom = document.createElement('ul');
-
+
routeListDom.setAttribute('id','routeList')
for (var i = 0; i < routes.length; i++) {
var li = document.createElement('li');
li.setAttribute('index', i);
- li.innerHTML = `${routes[i].url}`
+ li.innerHTML = '' + routes[i].url+ '';
routeListDom.appendChild(li);
}
fragment.appendChild(routeListDom)
@@ -793,9 +792,11 @@
routeListDom.children[0] && routeListDom.children[0].children[1].click();
}
};
+
function createWS() {
+
// const ws = new WebSocket(`ws://${location.hostname}:${webport}`);
- const ws = new WebSocket(`ws://${location.host}`);
+ var ws = new WebSocket('ws://' + location.host);
ws.onopen = function () {
console.log('@open');
};
@@ -823,4 +824,4 @@