Skip to content

Commit

Permalink
support es6 module #2
Browse files Browse the repository at this point in the history
  • Loading branch information
army8735 committed Jul 3, 2014
1 parent 58237df commit 1c814e5
Show file tree
Hide file tree
Showing 6 changed files with 134 additions and 55 deletions.
51 changes: 28 additions & 23 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
## A converter between CommonJS/AMD/CMD/other
# A converter between CommonJS/AMD/CMD/other

ranma取自同名动漫人物乱马,意指同一个事物的不同形式。

[![NPM version](https://badge.fury.io/js/ranma.png)](https://npmjs.org/package/ranma)
[![Build Status](https://travis-ci.org/army8735/ranma.svg?branch=master)](https://travis-ci.org/army8735/ranma)
[![Coverage Status](https://coveralls.io/repos/army8735/ranma/badge.png)](https://coveralls.io/r/army8735/ranma)
[![Dependency Status](https://david-dm.org/army8735/ranma.png)](https://david-dm.org/army8735/ranma)

为满足所写的代码能同时运行于server环境和web环境,而不需手动修改,所以做了个转换方法,使得几者之间的模块能够互相等价转化。
<br/>需要注意的是AMD模块的写法应遵守文件和模块一对一的原则。

ranma取自同名动漫人物乱马,意指同一个事物的不同形式
需要注意的是AMD模块的写法应遵守文件和模块一对一的原则

## INSTALL

Expand All @@ -18,33 +19,37 @@ npm install ranma

## API

* ranma.cjsify(code:String):String
<br/>将代码转换为CommonJS
<br/>对于AMD和CMD,会将define的factory提取,改写return为module.exports并删除define,如果define父语句有if判断也会删除
<br/>对于普通文件,会将全局声明的变量作为exports,全局使用的未声明变量作为require
* cjsify(code:String):String
* 将代码转换为`CommonJS`
* 对于`AMD``CMD`,会将define的factory提取,改写return为module.exports并删除define,如果define父语句有if判断也会删除
* 对于`es6 module`,会将module和import变为require,export变为exports,export default变为module.exports
* 对于普通文件,会将全局声明的变量作为exports,全局使用的未声明变量作为require

* ranma.amdify(code:String):String
<br/>将代码转换为AMD
<br/>在cjsify的基础上进行define包裹
<br/>如果代码是CMD不做修改,因为AMD兼容这种写法
* amdify(code:String):String
* 将代码转换为`AMD`
* 在cjsify的基础上进行define包裹
* 如果代码是`CMD`不做修改,因为`AMD`兼容这种写法

* ranma.cmdify(code:String):String
<br/>将代码转换为CMD
<br/>在cjsify的基础上进行define包裹
<br/>如果code是AMD类型,会进行依赖转化——即将factory的参数改为CMD的require, exports, module固定参数,同时依赖变为require变量声明
* cmdify(code:String):String
* 将代码转换为`CMD`
* 在cjsify的基础上进行define包裹
* 如果code是`AMD`类型,会进行依赖转化——即将factory的参数改为`CMD`的require, exports, module固定参数,同时依赖变为require变量声明

* ranma.type.isCommonJS(code:String):Boolean
<br/>code是否是CommonJS
* type.isCommonJS(code:String):Boolean
* code是否是`CommonJS`

* ranma.type.isAMD(code:String):Boolean
<br/>code是否是AMD
* type.isAMD(code:String):Boolean
* code是否是`AMD`

* ranma.type.isCMD(code:String):Boolean
<br/>code是否是CMD
* type.isCMD(code:String):Boolean
* code是否是`CMD`

* type.isModule(code:String):Boolean
* code是否是`es6 module`

#### AMD和CMD的区分依据
* 是否出现define.amd的判断
* factory的参数是否为固定的require, exports, module
* 是否出现`define.amd`的判断
* factory的参数是否为固定的`require, exports, module`

## License

Expand Down
6 changes: 6 additions & 0 deletions cjsify.js
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,12 @@ exports.convert = function(code, tp) {
if(tp.isCommonJS) {
return code;
}
else if(tp.isModule) {
return tp.code;
}
else if(tp.es6) {
return exports.convert(tp.code);
}
else if(tp.isAMD) {
var res = cmdify.convert(code, tp);
return exports.convert(res);
Expand Down
6 changes: 6 additions & 0 deletions cmdify.js
Original file line number Diff line number Diff line change
Expand Up @@ -198,6 +198,12 @@ exports.convert = function(code, tp) {
else if(tp.isCommonJS) {
return 'define(function(require, exports, module) {' + code + '});';
}
else if(tp.isModule) {
return 'define(function(require, exports, module) {' + tp.code + '});';
}
else if(tp.es6) {
return 'define(function(require, exports, module) {' + cjsify.convert(tp.code) + '});';
}
else {
return 'define(function(require, exports, module) {' + cjsify.convert(code, tp) + '});';
}
Expand Down
14 changes: 9 additions & 5 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "ranma",
"version": "0.1.0",
"version": "0.2.0",
"description": "A converter between CommonJS/AMD/CMD/other",
"maintainers": [
{
Expand All @@ -13,12 +13,14 @@
},
"config": {
"blanket": {
"pattern": ["ranma/amdify.js",
"pattern": [
"ranma/amdify.js",
"ranma/cmdify.js",
"ranma/cjsify.js",
"ranma/index.js",
"ranma/type.js",
"ranma/exist.js"]
"ranma/exist.js"
]
}
},
"repository": {
Expand All @@ -29,12 +31,14 @@
"convert",
"commonjs",
"amd",
"cmd"
"cmd",
"es6 module"
],
"author": "army8735",
"license": "MIT",
"dependencies": {
"homunculus": "^0.2.3"
"homunculus": "^0.3.7",
"jsdc": "^0.4.2"
},
"main": "./index",
"spm": {
Expand Down
62 changes: 50 additions & 12 deletions tests/test.js
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,27 @@ describe('simple test', function() {
expect(type.isAMD).to.not.ok();
expect(type.isCMD).to.ok();
});
it('es6 module', function() {
var type = ranma.type.analyse('module a from "a"');
expect(type.isCommonJS).to.not.ok();
expect(type.isAMD).to.not.ok();
expect(type.isCMD).to.not.ok();
expect(type.isModule).to.ok();
});
it('es6 export', function() {
var type = ranma.type.analyse('export var a = 1');
expect(type.isCommonJS).to.not.ok();
expect(type.isAMD).to.not.ok();
expect(type.isCMD).to.not.ok();
expect(type.isModule).to.ok();
});
it('es6 import', function() {
var type = ranma.type.analyse('import a from "a"');
expect(type.isCommonJS).to.not.ok();
expect(type.isAMD).to.not.ok();
expect(type.isCMD).to.not.ok();
expect(type.isModule).to.ok();
});
it('#isCommonJs', function() {
expect(ranma.type.isCommonJS('exports.a = 1;')).to.be.ok();
});
Expand All @@ -129,6 +150,9 @@ describe('simple test', function() {
it('#isCMD', function() {
expect(ranma.type.isCMD('define(1);')).to.be.ok();
});
it('#isModule', function() {
expect(ranma.type.isModule('export default a')).to.be.ok();
});
});
describe('cjsify', function() {
it('define outer wrap', function() {
Expand Down Expand Up @@ -235,6 +259,26 @@ describe('simple test', function() {
var res = ranma.cjsify('~function(){this.a = 1;window.b = 2;}()');
expect(res).to.eql('~function(){this.a = 1;window.b = 2;}();exports["a"] = this.a;;exports["b"] = this.b;');
});
it('commonjs', function() {
var res = ranma.cjsify('module.exports = a;');
expect(res).to.eql('module.exports = a;');
});
it('cmd', function() {
var res = ranma.cjsify('define(function(require, exports, module) {module.exports = a;});');
expect(res).to.eql('module.exports = a;;');
});
it('cmd with deps', function() {
var res = ranma.cjsify('define(["b"], function(require, exports, module) {var b = require("b");module.exports = a;});');
expect(res).to.eql('var b = require("b");module.exports = a;;');
});
it('es6 module', function() {
var res = ranma.cjsify('module a from "a"');
expect(res).to.eql('var a=require("a");');
});
it('es6 not module', function() {
var res = ranma.cjsify('var [a] = [1]');
expect(res).to.eql('var a;!function(){var _0_= [1];a=_0_[0]}();module.exports = a;');
});
});
describe('cmdify', function() {
it('define.amd', function() {
Expand All @@ -261,19 +305,13 @@ describe('simple test', function() {
var res = ranma.cmdify('define(function(require, exports, module) {module.exports = a;});');
expect(res).to.eql('define(function(require, exports, module) {module.exports = a;});');
});
});
describe('cjsify', function() {
it('commonjs', function() {
var res = ranma.cjsify('module.exports = a;');
expect(res).to.eql('module.exports = a;');
it('es6 module', function() {
var res = ranma.cmdify('module a from "a"');
expect(res).to.eql('define(function(require, exports, module) {var a=require("a");});');
});
it('cmd', function() {
var res = ranma.cjsify('define(function(require, exports, module) {module.exports = a;});');
expect(res).to.eql('module.exports = a;;');
});
it('cmd with deps', function() {
var res = ranma.cjsify('define(["b"], function(require, exports, module) {var b = require("b");module.exports = a;});');
expect(res).to.eql('var b = require("b");module.exports = a;;');
it('es6 not module', function() {
var res = ranma.cmdify('var [a] = [1]');
expect(res).to.eql('define(function(require, exports, module) {var a;!function(){var _0_= [1];a=_0_[0]}();module.exports = a;});');
});
});
describe('amdify', function() {
Expand Down
50 changes: 35 additions & 15 deletions type.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,16 @@
var homunculus = require('homunculus');
var Token = homunculus.getClass('token');
var JsNode = homunculus.getClass('node', 'js');
var Es6Node = homunculus.getClass('node', 'es6');

var jsdc = require('jsdc');

var exist = require('./exist');

var isCommonJS;
var isAMD;
var isCMD;
var isModule;

function analyse(context) {
if(!isCommonJS) {
Expand Down Expand Up @@ -79,38 +83,54 @@ exports.analyse = function(code) {
isCommonJS = false;
isAMD = false;
isCMD = false;
isModule = false;

var context = homunculus.getContext('js');
context.parse(code);
//分析上下文
analyse(context);
var ast;
jsdc.reset();
var es6 = jsdc.parse(code);
//jsdc编译不会动es5部分,只要有修改就是es6语法
if(code && es6 != code) {
ast = jsdc.ast();
if(ast.first() && ast.first().name() == Es6Node.MODULEBODY) {
isModule = true;
}
}
else {
var context = homunculus.getContext('js');
context.parse(code);
//分析上下文
analyse(context);
ast = context.parser.ast();
}

return {
'code': es6,
'es6': code && es6 != code,
'isCommonJS': isCommonJS,
'isAMD': isAMD,
'isCMD': isCMD,
'context': context,
'ast': context.parser.ast()
'isModule': isModule,
'context': context || null,
'ast': ast
};
};

exports.isCommonJS = function(code) {
if(code) {
exports.analyse(code);
}
exports.analyse(code || '');
return isCommonJS;
};

exports.isAMD = function(code) {
if(code) {
exports.analyse(code);
}
exports.analyse(code || '');
return isAMD;
};

exports.isCMD = function(code) {
if(code) {
exports.analyse(code);
}
exports.analyse(code || '');
return isCMD;
};

exports.isModule = function(code) {
exports.analyse(code || '');
return isModule;
};

0 comments on commit 1c814e5

Please sign in to comment.