-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathparser.js
52 lines (43 loc) · 1.61 KB
/
parser.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
var babel = require("@babel/core");
var babelParser = require("@babel/parser");
var fs = require('fs');
module.exports = function parseFile(path) {
var originalCode = fs.readFileSync(path).toString();
var ast = babelParser.parse(originalCode, { sourceType: "module" });
var metaInfo = {};
var exportnode = {};
ast.program.body = ast.program.body.filter((node)=>{
if(node.type === 'VariableDeclaration') {
var isMetaNode = !node.declarations.reduce((previous, declaration) => {
if(declaration.id.name === 'meta') {
metaInfo = node;
return false;
};
return previous;
}, true)
}
var isExportNode = node.type == 'ExportNamedDeclaration'
if(isExportNode) exportnode = node;
return !isMetaNode && !isExportNode;
});
const { code } = babel.transformFromAstSync(ast,'', { } )
if(!metaInfo || !exportnode) {
throw('Meta information or export information not found');
}
ast.program.body = [metaInfo, exportnode]
var info = babel.transformFromAstSync(ast,'', { } )
var commonjsInfo = babel.transform(info.code, {
plugins: ["transform-es2015-modules-commonjs"]
});
var Module = require('module');
var parent = module.parent;
var m = new Module(path, parent);
m.filename = path;
m.paths = [];
m._compile(commonjsInfo.code, path);
var meta = m.exports.meta;
if(!meta.name) { console.log(meta);throw('Name missing in indicator meta ')}
return {
code, meta
}
}