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) {
var ast = getAst(code);
var defineList = [];
var defineBlock;
// require('fs').writeFileSync('ast.json', JSON.stringify(ast));
estraverse.traverse(ast, {
enter: function (node, parent) {
@@ -71,31 +72,57 @@ function getDefineBlock(code) {
&& node.expression.callee.name == 'define'
) {
var defineBlock = {};
defineBlock.defineRange = node.range;
var factory = getDefineFactory(node.expression);
// define('xxx', {})
if (factory.type === SYNTAX.ObjectExpression) {
defineBlock.type = 'object';
defineBlock.factoryRange = factory.range;
defineList.push({
type: 'object',
defineRange: node.range,
factoryRange: factory.range
});
}
// define(function() {})
else if (factory.type === SYNTAX.FunctionExpression){
defineBlock.type = 'function';
defineBlock = {
type: 'function',
defineRange: node.range,
factoryRange: factory.body.range
};
var body = factory.body.body;
defineBlock.factoryRange = factory.body.range;
var returnList = defineBlock.returnRange = [];
var returnRange = defineBlock.returnRange = [];
// 替换return
for (var i = body.length - 1; i >=0; i--) {
if (body[i].type == SYNTAX.ReturnStatement) {
returnList.push(body[i].range);
for (var i = 0, l = body.length; i < l; i++) {
// 直接在函数体里的return
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();
}
}
@@ -124,15 +151,17 @@ function replaceDefine(code) {
block.returnRange.forEach(function (range) {
segments.push(code.slice(index, range[0]));
segments.push('module.exports = ');
segments.push('module.exports =');
segments.push(code.slice(range[0] + 6, range[1]));
index = range[1];
});
segments.push(code.slice(index, block.factoryRange[1] - 1));
index = block.defineRange[1];
}
else if (block.type === 'object'){
segments.push(code.slice(index, block.defineRange[0]));
segments.push('module.exports = ');
segments.push('module.exports =');
segments.push(code.slice(block.factoryRange[0], block.factoryRange[1]) + ';');
index = block.defineRange[1];
}

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');
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, '../'));
}

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;
}
);
}