add amd2module test

This commit is contained in:
kekee000
2015-01-28 15:23:42 +08:00
parent 82515c449f
commit 1da142e333
4 changed files with 196 additions and 15 deletions

View File

@@ -63,6 +63,7 @@ function getDefineFactory(defineExpr) {
function getDefineBlock(code) { function getDefineBlock(code) {
var ast = getAst(code); var ast = getAst(code);
var defineList = []; var defineList = [];
var defineBlock;
// require('fs').writeFileSync('ast.json', JSON.stringify(ast)); // require('fs').writeFileSync('ast.json', JSON.stringify(ast));
estraverse.traverse(ast, { estraverse.traverse(ast, {
enter: function (node, parent) { enter: function (node, parent) {
@@ -71,31 +72,57 @@ function getDefineBlock(code) {
&& node.expression.callee.name == 'define' && node.expression.callee.name == 'define'
) { ) {
var defineBlock = {};
defineBlock.defineRange = node.range;
var factory = getDefineFactory(node.expression); var factory = getDefineFactory(node.expression);
// define('xxx', {}) // define('xxx', {})
if (factory.type === SYNTAX.ObjectExpression) { if (factory.type === SYNTAX.ObjectExpression) {
defineBlock.type = 'object'; defineList.push({
defineBlock.factoryRange = factory.range; type: 'object',
defineRange: node.range,
factoryRange: factory.range
});
} }
// define(function() {}) // define(function() {})
else if (factory.type === SYNTAX.FunctionExpression){ else if (factory.type === SYNTAX.FunctionExpression){
defineBlock.type = 'function'; defineBlock = {
type: 'function',
defineRange: node.range,
factoryRange: factory.body.range
};
var body = factory.body.body; var body = factory.body.body;
defineBlock.factoryRange = factory.body.range; var returnRange = defineBlock.returnRange = [];
var returnList = defineBlock.returnRange = [];
// 替换return // 替换return
for (var i = body.length - 1; i >=0; i--) { for (var i = 0, l = body.length; i < l; i++) {
if (body[i].type == SYNTAX.ReturnStatement) { // 直接在函数体里的return
returnList.push(body[i].range); if (body[i].type === SYNTAX.ReturnStatement) {
returnRange.push(body[i].range);
} }
// 在函数内部块里的return
else if (body[i].type !== SYNTAX.FunctionExpression) {
var functionEnter = 0;
estraverse.traverse(body[i], {
enter: function (returnNode) {
if (
returnNode.type === SYNTAX.FunctionExpression
|| returnNode.type === SYNTAX.FunctionDeclaration
) {
this.skip();
}
else if (returnNode.type === SYNTAX.ReturnStatement){
returnRange.push(returnNode.range);
}
}
});
} }
} }
defineList.push(defineBlock); defineList.push(defineBlock);
}
this.skip(); this.skip();
} }
} }
@@ -128,6 +155,8 @@ function replaceDefine(code) {
segments.push(code.slice(range[0] + 6, range[1])); segments.push(code.slice(range[0] + 6, range[1]));
index = range[1]; index = range[1];
}); });
segments.push(code.slice(index, block.factoryRange[1] - 1));
index = block.defineRange[1]; index = block.defineRange[1];
} }
else if (block.type === 'object'){ else if (block.type === 'object'){

71
node/generated.js Normal file
View File

@@ -0,0 +1,71 @@
/**
* @file test-define.js
* @author mengke01(kekee000@gmail.com)
*/
// 测试define函数
module.exports = require('../common/test').test({
test1: 'test1',
test2: 'test2'
});
// 测试 string
module.exports = 'test string';
// 测试commonjs wrapper
module.exports = {
test1: 'test1',
test2: 'test2'
};
// 测试object
module.exports ={
test1: 'test1',
test2: 'test2'
};
// 测试多return
var string = require('../common/string');
if (string.pad) {
module.exports = string.pad;
}
else {
module.exports = function (str) {
return function () {
str;
};
};
}
// 测试 nodejs兼容写法
if (typeof exports !== 'undefined') {
module.exports = exports = require('xmldom').DOMParser;
}
else {
module.exports = window.DOMParser;
}

View File

@@ -6,7 +6,7 @@ var fs = require('fs');
var amd2module = require('./amd2module'); var amd2module = require('./amd2module');
function main() { function main() {
var code = fs.readFileSync('../src/fonteditor/data/online-font.js'); var code = fs.readFileSync('./testcase-define.js');
fs.writeFileSync('./generated.js', amd2module(code, '../')); fs.writeFileSync('./generated.js', amd2module(code, '../'));
} }

81
node/testcase-define.js Normal file
View File

@@ -0,0 +1,81 @@
/**
* @file test-define.js
* @author mengke01(kekee000@gmail.com)
*/
// 测试define函数
define(
function(require) {
return require('common/test').test({
test1: 'test1',
test2: 'test2'
});
}
);
// 测试 string
define(
function(require) {
return 'test string';
}
);
// 测试commonjs wrapper
define('test-module', ['test-module'],
function(require) {
return {
test1: 'test1',
test2: 'test2'
};
}
);
// 测试object
define('test-module', {
test1: 'test1',
test2: 'test2'
});
// 测试多return
define(
function(require) {
var string = require('common/string');
if (string.pad) {
return string.pad;
}
else {
return function (str) {
return function () {
str;
};
};
}
}
);
// 测试 nodejs兼容写法
if (typeof exports !== 'undefined') {
module.exports = exports = require('xmldom').DOMParser;
}
else {
define(
function (require) {
return window.DOMParser;
}
);
}