ecmascript-version-detector
Version:
ecmascript version detector
71 lines (67 loc) • 2.39 kB
JavaScript
// LICENSE : MIT
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.parse = parse;
var babylon = require("babylon");
var ASTQ = require("astq");
var ObjectAssign = require("object.assign");
var astq = new ASTQ();
var types = require("../data/index.json");
/**
* @param {string} code
* @param {Object} [babylonOptions]
* @returns {Object[]}
*/
function parseCode(code, babylonOptions) {
var defaultOption = {
sourceType: "module",
plugins: ["jsx", "flow", "asyncFunctions", "classConstructorCall", "doExpressions", "trailingFunctionCommas", "objectRestSpread", "decorators", "classProperties", "exportExtensions", "exponentiationOperator", "asyncGenerators", "functionBind", "functionSent"]
};
return require("babylon").parse(code, babylonOptions || defaultOption);
}
/**
* parse `code` and return `results`.
* Sometimes, the `parse` function throw parse error.
* @param {string} code
* @param {{babylonOptions: Object}} [options]
* @returns {{selector:string, version:string, node: Object, en: Object}[]} results
* @throws
*/
function parse(code) {
var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
var babylonOptions = options.babylonOptions;
var AST = parseCode(code, babylonOptions);
var infoList = [];
// ignore to add duplicated range
var canPushInfo = function canPushInfo(type, match) {
var start = match.start;
var end = match.end;
var sameRangeInfo = infoList.find(function (targetInfo) {
return targetInfo.node.start === start && targetInfo.node.end === end;
});
if (!sameRangeInfo) {
return true;
}
// Specificity - prefer detail selector
return type.selector.length > sameRangeInfo.selector.length;
};
types.forEach(function (type) {
var selector = type.selector;
var results = astq.query(AST, selector);
if (results.length === 0) {
return false;
}
results.forEach(function (match) {
if (!canPushInfo(type, match)) {
return;
}
var result = ObjectAssign({}, type, { node: match });
infoList.push(result);
});
return true;
});
return infoList;
}
//# sourceMappingURL=ecmascript-version-detector.js.map