Projekt

Obecné

Profil

Stáhnout (5.22 KB) Statistiky
| Větev: | Revize:
1
"use strict";
2

    
3
exports.__esModule = true;
4

    
5
var _assign = require("babel-runtime/core-js/object/assign");
6

    
7
var _assign2 = _interopRequireDefault(_assign);
8

    
9
var _classCallCheck2 = require("babel-runtime/helpers/classCallCheck");
10

    
11
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
12

    
13
exports.default = buildConfigChain;
14

    
15
var _resolve = require("../../../helpers/resolve");
16

    
17
var _resolve2 = _interopRequireDefault(_resolve);
18

    
19
var _json = require("json5");
20

    
21
var _json2 = _interopRequireDefault(_json);
22

    
23
var _pathIsAbsolute = require("path-is-absolute");
24

    
25
var _pathIsAbsolute2 = _interopRequireDefault(_pathIsAbsolute);
26

    
27
var _path = require("path");
28

    
29
var _path2 = _interopRequireDefault(_path);
30

    
31
var _fs = require("fs");
32

    
33
var _fs2 = _interopRequireDefault(_fs);
34

    
35
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
36

    
37
var existsCache = {};
38
var jsonCache = {};
39

    
40
var BABELIGNORE_FILENAME = ".babelignore";
41
var BABELRC_FILENAME = ".babelrc";
42
var PACKAGE_FILENAME = "package.json";
43

    
44
function exists(filename) {
45
  var cached = existsCache[filename];
46
  if (cached == null) {
47
    return existsCache[filename] = _fs2.default.existsSync(filename);
48
  } else {
49
    return cached;
50
  }
51
}
52

    
53
function buildConfigChain() {
54
  var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
55
  var log = arguments[1];
56

    
57
  var filename = opts.filename;
58
  var builder = new ConfigChainBuilder(log);
59

    
60
  if (opts.babelrc !== false) {
61
    builder.findConfigs(filename);
62
  }
63

    
64
  builder.mergeConfig({
65
    options: opts,
66
    alias: "base",
67
    dirname: filename && _path2.default.dirname(filename)
68
  });
69

    
70
  return builder.configs;
71
}
72

    
73
var ConfigChainBuilder = function () {
74
  function ConfigChainBuilder(log) {
75
    (0, _classCallCheck3.default)(this, ConfigChainBuilder);
76

    
77
    this.resolvedConfigs = [];
78
    this.configs = [];
79
    this.log = log;
80
  }
81

    
82
  ConfigChainBuilder.prototype.findConfigs = function findConfigs(loc) {
83
    if (!loc) return;
84

    
85
    if (!(0, _pathIsAbsolute2.default)(loc)) {
86
      loc = _path2.default.join(process.cwd(), loc);
87
    }
88

    
89
    var foundConfig = false;
90
    var foundIgnore = false;
91

    
92
    while (loc !== (loc = _path2.default.dirname(loc))) {
93
      if (!foundConfig) {
94
        var configLoc = _path2.default.join(loc, BABELRC_FILENAME);
95
        if (exists(configLoc)) {
96
          this.addConfig(configLoc);
97
          foundConfig = true;
98
        }
99

    
100
        var pkgLoc = _path2.default.join(loc, PACKAGE_FILENAME);
101
        if (!foundConfig && exists(pkgLoc)) {
102
          foundConfig = this.addConfig(pkgLoc, "babel", JSON);
103
        }
104
      }
105

    
106
      if (!foundIgnore) {
107
        var ignoreLoc = _path2.default.join(loc, BABELIGNORE_FILENAME);
108
        if (exists(ignoreLoc)) {
109
          this.addIgnoreConfig(ignoreLoc);
110
          foundIgnore = true;
111
        }
112
      }
113

    
114
      if (foundIgnore && foundConfig) return;
115
    }
116
  };
117

    
118
  ConfigChainBuilder.prototype.addIgnoreConfig = function addIgnoreConfig(loc) {
119
    var file = _fs2.default.readFileSync(loc, "utf8");
120
    var lines = file.split("\n");
121

    
122
    lines = lines.map(function (line) {
123
      return line.replace(/#(.*?)$/, "").trim();
124
    }).filter(function (line) {
125
      return !!line;
126
    });
127

    
128
    if (lines.length) {
129
      this.mergeConfig({
130
        options: { ignore: lines },
131
        alias: loc,
132
        dirname: _path2.default.dirname(loc)
133
      });
134
    }
135
  };
136

    
137
  ConfigChainBuilder.prototype.addConfig = function addConfig(loc, key) {
138
    var json = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _json2.default;
139

    
140
    if (this.resolvedConfigs.indexOf(loc) >= 0) {
141
      return false;
142
    }
143

    
144
    this.resolvedConfigs.push(loc);
145

    
146
    var content = _fs2.default.readFileSync(loc, "utf8");
147
    var options = void 0;
148

    
149
    try {
150
      options = jsonCache[content] = jsonCache[content] || json.parse(content);
151
      if (key) options = options[key];
152
    } catch (err) {
153
      err.message = loc + ": Error while parsing JSON - " + err.message;
154
      throw err;
155
    }
156

    
157
    this.mergeConfig({
158
      options: options,
159
      alias: loc,
160
      dirname: _path2.default.dirname(loc)
161
    });
162

    
163
    return !!options;
164
  };
165

    
166
  ConfigChainBuilder.prototype.mergeConfig = function mergeConfig(_ref) {
167
    var options = _ref.options,
168
        alias = _ref.alias,
169
        loc = _ref.loc,
170
        dirname = _ref.dirname;
171

    
172
    if (!options) {
173
      return false;
174
    }
175

    
176
    options = (0, _assign2.default)({}, options);
177

    
178
    dirname = dirname || process.cwd();
179
    loc = loc || alias;
180

    
181
    if (options.extends) {
182
      var extendsLoc = (0, _resolve2.default)(options.extends, dirname);
183
      if (extendsLoc) {
184
        this.addConfig(extendsLoc);
185
      } else {
186
        if (this.log) this.log.error("Couldn't resolve extends clause of " + options.extends + " in " + alias);
187
      }
188
      delete options.extends;
189
    }
190

    
191
    this.configs.push({
192
      options: options,
193
      alias: alias,
194
      loc: loc,
195
      dirname: dirname
196
    });
197

    
198
    var envOpts = void 0;
199
    var envKey = process.env.BABEL_ENV || process.env.NODE_ENV || "development";
200
    if (options.env) {
201
      envOpts = options.env[envKey];
202
      delete options.env;
203
    }
204

    
205
    this.mergeConfig({
206
      options: envOpts,
207
      alias: alias + ".env." + envKey,
208
      dirname: dirname
209
    });
210
  };
211

    
212
  return ConfigChainBuilder;
213
}();
214

    
215
module.exports = exports["default"];
(1-1/6)