UNPKG

d2-ui

Version:
507 lines (384 loc) 14.6 kB
"use strict"; exports.__esModule = true; var _stringify = require("babel-runtime/core-js/json/stringify"); var _stringify2 = _interopRequireDefault(_stringify); var _assign = require("babel-runtime/core-js/object/assign"); var _assign2 = _interopRequireDefault(_assign); var _getIterator2 = require("babel-runtime/core-js/get-iterator"); var _getIterator3 = _interopRequireDefault(_getIterator2); var _typeof2 = require("babel-runtime/helpers/typeof"); var _typeof3 = _interopRequireDefault(_typeof2); var _classCallCheck2 = require("babel-runtime/helpers/classCallCheck"); var _classCallCheck3 = _interopRequireDefault(_classCallCheck2); var _node = require("../../../api/node"); var context = _interopRequireWildcard(_node); var _plugin2 = require("../../plugin"); var _plugin3 = _interopRequireDefault(_plugin2); var _babelMessages = require("babel-messages"); var messages = _interopRequireWildcard(_babelMessages); var _index = require("./index"); var _resolve = require("../../../helpers/resolve"); var _resolve2 = _interopRequireDefault(_resolve); var _json = require("json5"); var _json2 = _interopRequireDefault(_json); var _pathIsAbsolute = require("path-is-absolute"); var _pathIsAbsolute2 = _interopRequireDefault(_pathIsAbsolute); var _pathExists = require("path-exists"); var _pathExists2 = _interopRequireDefault(_pathExists); var _cloneDeepWith = require("lodash/cloneDeepWith"); var _cloneDeepWith2 = _interopRequireDefault(_cloneDeepWith); var _clone = require("lodash/clone"); var _clone2 = _interopRequireDefault(_clone); var _merge = require("../../../helpers/merge"); var _merge2 = _interopRequireDefault(_merge); var _config = require("./config"); var _config2 = _interopRequireDefault(_config); var _removed = require("./removed"); var _removed2 = _interopRequireDefault(_removed); var _path = require("path"); var _path2 = _interopRequireDefault(_path); var _fs = require("fs"); var _fs2 = _interopRequireDefault(_fs); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var existsCache = {}; /* eslint max-len: 0 */ var jsonCache = {}; var BABELIGNORE_FILENAME = ".babelignore"; var BABELRC_FILENAME = ".babelrc"; var PACKAGE_FILENAME = "package.json"; function exists(filename) { var cached = existsCache[filename]; if (cached == null) { return existsCache[filename] = _pathExists2.default.sync(filename); } else { return cached; } } var OptionManager = function () { function OptionManager(log) { (0, _classCallCheck3.default)(this, OptionManager); this.resolvedConfigs = []; this.options = OptionManager.createBareOptions(); this.log = log; } OptionManager.memoisePluginContainer = function memoisePluginContainer(fn, loc, i, alias) { for (var _iterator = OptionManager.memoisedPlugins, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : (0, _getIterator3.default)(_iterator);;) { var _ref; if (_isArray) { if (_i >= _iterator.length) break; _ref = _iterator[_i++]; } else { _i = _iterator.next(); if (_i.done) break; _ref = _i.value; } var cache = _ref; if (cache.container === fn) return cache.plugin; } var obj = void 0; if (typeof fn === "function") { obj = fn(context); } else { obj = fn; } if ((typeof obj === "undefined" ? "undefined" : (0, _typeof3.default)(obj)) === "object") { var _plugin = new _plugin3.default(obj, alias); OptionManager.memoisedPlugins.push({ container: fn, plugin: _plugin }); return _plugin; } else { throw new TypeError(messages.get("pluginNotObject", loc, i, typeof obj === "undefined" ? "undefined" : (0, _typeof3.default)(obj)) + loc + i); } }; OptionManager.createBareOptions = function createBareOptions() { var opts = {}; for (var _key in _config2.default) { var opt = _config2.default[_key]; opts[_key] = (0, _clone2.default)(opt.default); } return opts; }; OptionManager.normalisePlugin = function normalisePlugin(plugin, loc, i, alias) { plugin = plugin.__esModule ? plugin.default : plugin; if (!(plugin instanceof _plugin3.default)) { // allow plugin containers to be specified so they don't have to manually require if (typeof plugin === "function" || (typeof plugin === "undefined" ? "undefined" : (0, _typeof3.default)(plugin)) === "object") { plugin = OptionManager.memoisePluginContainer(plugin, loc, i, alias); } else { throw new TypeError(messages.get("pluginNotFunction", loc, i, typeof plugin === "undefined" ? "undefined" : (0, _typeof3.default)(plugin))); } } plugin.init(loc, i); return plugin; }; OptionManager.normalisePlugins = function normalisePlugins(loc, dirname, plugins) { return plugins.map(function (val, i) { var plugin = void 0, options = void 0; if (!val) { throw new TypeError("Falsy value found in plugins"); } // destructure plugins if (Array.isArray(val)) { plugin = val[0]; options = val[1]; } else { plugin = val; } var alias = typeof plugin === "string" ? plugin : loc + "$" + i; // allow plugins to be specified as strings if (typeof plugin === "string") { var pluginLoc = (0, _resolve2.default)("babel-plugin-" + plugin, dirname) || (0, _resolve2.default)(plugin, dirname); if (pluginLoc) { plugin = require(pluginLoc); } else { throw new ReferenceError(messages.get("pluginUnknown", plugin, loc, i, dirname)); } } plugin = OptionManager.normalisePlugin(plugin, loc, i, alias); return [plugin, options]; }); }; OptionManager.prototype.addConfig = function addConfig(loc, key) { var json = arguments.length <= 2 || arguments[2] === undefined ? _json2.default : arguments[2]; if (this.resolvedConfigs.indexOf(loc) >= 0) { return false; } var content = _fs2.default.readFileSync(loc, "utf8"); var opts = void 0; try { opts = jsonCache[content] = jsonCache[content] || json.parse(content); if (key) opts = opts[key]; } catch (err) { err.message = loc + ": Error while parsing JSON - " + err.message; throw err; } this.mergeOptions({ options: opts, alias: loc, dirname: _path2.default.dirname(loc) }); this.resolvedConfigs.push(loc); return !!opts; }; /** * This is called when we want to merge the input `opts` into the * base options (passed as the `extendingOpts`: at top-level it's the * main options, at presets level it's presets options). * * - `alias` is used to output pretty traces back to the original source. * - `loc` is used to point to the original config. * - `dirname` is used to resolve plugins relative to it. */ OptionManager.prototype.mergeOptions = function mergeOptions(_ref2) { var _this = this; var rawOpts = _ref2.options; var extendingOpts = _ref2.extending; var alias = _ref2.alias; var loc = _ref2.loc; var dirname = _ref2.dirname; alias = alias || "foreign"; if (!rawOpts) return; // if ((typeof rawOpts === "undefined" ? "undefined" : (0, _typeof3.default)(rawOpts)) !== "object" || Array.isArray(rawOpts)) { this.log.error("Invalid options type for " + alias, TypeError); } // var opts = (0, _cloneDeepWith2.default)(rawOpts, function (val) { if (val instanceof _plugin3.default) { return val; } }); // dirname = dirname || process.cwd(); loc = loc || alias; for (var _key2 in opts) { var option = _config2.default[_key2]; // check for an unknown option if (!option && this.log) { var pluginOptsInfo = "Check out http://babeljs.io/docs/usage/options/ for more info"; if (_removed2.default[_key2]) { this.log.error("Using removed Babel 5 option: " + alias + "." + _key2 + " - " + _removed2.default[_key2].message, ReferenceError); } else { this.log.error("Unknown option: " + alias + "." + _key2 + ". " + pluginOptsInfo, ReferenceError); } } } // normalise options (0, _index.normaliseOptions)(opts); // resolve plugins if (opts.plugins) { opts.plugins = OptionManager.normalisePlugins(loc, dirname, opts.plugins); } // add extends clause if (opts.extends) { var extendsLoc = (0, _resolve2.default)(opts.extends, dirname); if (extendsLoc) { this.addConfig(extendsLoc); } else { if (this.log) this.log.error("Couldn't resolve extends clause of " + opts.extends + " in " + alias); } delete opts.extends; } // resolve presets if (opts.presets) { // If we're in the "pass per preset" mode, we resolve the presets // and keep them for further execution to calculate the options. if (opts.passPerPreset) { opts.presets = this.resolvePresets(opts.presets, dirname, function (preset, presetLoc) { _this.mergeOptions({ options: preset, extending: preset, alias: presetLoc, loc: presetLoc, dirname: dirname }); }); } else { // Otherwise, just merge presets options into the main options. this.mergePresets(opts.presets, dirname); delete opts.presets; } } // env var envOpts = void 0; var envKey = process.env.BABEL_ENV || process.env.NODE_ENV || "development"; if (opts.env) { envOpts = opts.env[envKey]; delete opts.env; } // Merge them into current extending options in case of top-level // options. In case of presets, just re-assign options which are got // normalized during the `mergeOptions`. if (rawOpts === extendingOpts) { (0, _assign2.default)(extendingOpts, opts); } else { (0, _merge2.default)(extendingOpts || this.options, opts); } // merge in env options this.mergeOptions({ options: envOpts, extending: extendingOpts, alias: alias + ".env." + envKey, dirname: dirname }); }; /** * Merges all presets into the main options in case we are not in the * "pass per preset" mode. Otherwise, options are calculated per preset. */ OptionManager.prototype.mergePresets = function mergePresets(presets, dirname) { var _this2 = this; this.resolvePresets(presets, dirname, function (presetOpts, presetLoc) { _this2.mergeOptions({ options: presetOpts, alias: presetLoc, loc: presetLoc, dirname: _path2.default.dirname(presetLoc || "") }); }); }; /** * Resolves presets options which can be either direct object data, * or a module name to require. */ OptionManager.prototype.resolvePresets = function resolvePresets(presets, dirname, onResolve) { return presets.map(function (val) { if (typeof val === "string") { var presetLoc = (0, _resolve2.default)("babel-preset-" + val, dirname) || (0, _resolve2.default)(val, dirname); if (presetLoc) { var _val = require(presetLoc); onResolve && onResolve(_val, presetLoc); return _val; } else { throw new Error("Couldn't find preset " + (0, _stringify2.default)(val) + " relative to directory " + (0, _stringify2.default)(dirname)); } } else if ((typeof val === "undefined" ? "undefined" : (0, _typeof3.default)(val)) === "object") { onResolve && onResolve(val); return val; } else { throw new Error("Unsupported preset format: " + val + "."); } }); }; OptionManager.prototype.addIgnoreConfig = function addIgnoreConfig(loc) { var file = _fs2.default.readFileSync(loc, "utf8"); var lines = file.split("\n"); lines = lines.map(function (line) { return line.replace(/#(.*?)$/, "").trim(); }).filter(function (line) { return !!line; }); this.mergeOptions({ options: { ignore: lines }, loc: loc }); }; OptionManager.prototype.findConfigs = function findConfigs(loc) { if (!loc) return; if (!(0, _pathIsAbsolute2.default)(loc)) { loc = _path2.default.join(process.cwd(), loc); } var foundConfig = false; var foundIgnore = false; while (loc !== (loc = _path2.default.dirname(loc))) { if (!foundConfig) { var configLoc = _path2.default.join(loc, BABELRC_FILENAME); if (exists(configLoc)) { this.addConfig(configLoc); foundConfig = true; } var pkgLoc = _path2.default.join(loc, PACKAGE_FILENAME); if (!foundConfig && exists(pkgLoc)) { foundConfig = this.addConfig(pkgLoc, "babel", JSON); } } if (!foundIgnore) { var ignoreLoc = _path2.default.join(loc, BABELIGNORE_FILENAME); if (exists(ignoreLoc)) { this.addIgnoreConfig(ignoreLoc); foundIgnore = true; } } if (foundIgnore && foundConfig) return; } }; OptionManager.prototype.normaliseOptions = function normaliseOptions() { var opts = this.options; for (var _key3 in _config2.default) { var option = _config2.default[_key3]; var val = opts[_key3]; // optional if (!val && option.optional) continue; // aliases if (option.alias) { opts[option.alias] = opts[option.alias] || val; } else { opts[_key3] = val; } } }; OptionManager.prototype.init = function init() { var opts = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0]; var filename = opts.filename; // resolve all .babelrc files if (opts.babelrc !== false) { this.findConfigs(filename); } // merge in base options this.mergeOptions({ options: opts, alias: "base", dirname: filename && _path2.default.dirname(filename) }); // normalise this.normaliseOptions(opts); return this.options; }; return OptionManager; }(); exports.default = OptionManager; OptionManager.memoisedPlugins = []; module.exports = exports["default"];