add amd2module test
This commit is contained in:
@@ -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
71
node/generated.js
Normal 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;
|
||||
|
||||
}
|
||||
@@ -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
81
node/testcase-define.js
Normal 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;
|
||||
}
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user