Projekt

Obecné

Profil

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

    
3
exports.__esModule = true;
4
exports.File = undefined;
5

    
6
var _getIterator2 = require("babel-runtime/core-js/get-iterator");
7

    
8
var _getIterator3 = _interopRequireDefault(_getIterator2);
9

    
10
var _create = require("babel-runtime/core-js/object/create");
11

    
12
var _create2 = _interopRequireDefault(_create);
13

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

    
16
var _assign2 = _interopRequireDefault(_assign);
17

    
18
var _classCallCheck2 = require("babel-runtime/helpers/classCallCheck");
19

    
20
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
21

    
22
var _possibleConstructorReturn2 = require("babel-runtime/helpers/possibleConstructorReturn");
23

    
24
var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
25

    
26
var _inherits2 = require("babel-runtime/helpers/inherits");
27

    
28
var _inherits3 = _interopRequireDefault(_inherits2);
29

    
30
var _babelHelpers = require("babel-helpers");
31

    
32
var _babelHelpers2 = _interopRequireDefault(_babelHelpers);
33

    
34
var _metadata = require("./metadata");
35

    
36
var metadataVisitor = _interopRequireWildcard(_metadata);
37

    
38
var _convertSourceMap = require("convert-source-map");
39

    
40
var _convertSourceMap2 = _interopRequireDefault(_convertSourceMap);
41

    
42
var _optionManager = require("./options/option-manager");
43

    
44
var _optionManager2 = _interopRequireDefault(_optionManager);
45

    
46
var _pluginPass = require("../plugin-pass");
47

    
48
var _pluginPass2 = _interopRequireDefault(_pluginPass);
49

    
50
var _babelTraverse = require("babel-traverse");
51

    
52
var _babelTraverse2 = _interopRequireDefault(_babelTraverse);
53

    
54
var _babelGenerator = require("babel-generator");
55

    
56
var _babelGenerator2 = _interopRequireDefault(_babelGenerator);
57

    
58
var _babelCodeFrame = require("babel-code-frame");
59

    
60
var _babelCodeFrame2 = _interopRequireDefault(_babelCodeFrame);
61

    
62
var _defaults = require("lodash/defaults");
63

    
64
var _defaults2 = _interopRequireDefault(_defaults);
65

    
66
var _logger = require("./logger");
67

    
68
var _logger2 = _interopRequireDefault(_logger);
69

    
70
var _store = require("../../store");
71

    
72
var _store2 = _interopRequireDefault(_store);
73

    
74
var _babylon = require("babylon");
75

    
76
var _util = require("../../util");
77

    
78
var util = _interopRequireWildcard(_util);
79

    
80
var _path = require("path");
81

    
82
var _path2 = _interopRequireDefault(_path);
83

    
84
var _babelTypes = require("babel-types");
85

    
86
var t = _interopRequireWildcard(_babelTypes);
87

    
88
var _mergeMap = require("./merge-map");
89

    
90
var _mergeMap2 = _interopRequireDefault(_mergeMap);
91

    
92
var _resolve = require("../../helpers/resolve");
93

    
94
var _resolve2 = _interopRequireDefault(_resolve);
95

    
96
var _blockHoist = require("../internal-plugins/block-hoist");
97

    
98
var _blockHoist2 = _interopRequireDefault(_blockHoist);
99

    
100
var _shadowFunctions = require("../internal-plugins/shadow-functions");
101

    
102
var _shadowFunctions2 = _interopRequireDefault(_shadowFunctions);
103

    
104
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; } }
105

    
106
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
107

    
108
var shebangRegex = /^#!.*/;
109

    
110
var INTERNAL_PLUGINS = [[_blockHoist2.default], [_shadowFunctions2.default]];
111

    
112
var errorVisitor = {
113
  enter: function enter(path, state) {
114
    var loc = path.node.loc;
115
    if (loc) {
116
      state.loc = loc;
117
      path.stop();
118
    }
119
  }
120
};
121

    
122
var File = function (_Store) {
123
  (0, _inherits3.default)(File, _Store);
124

    
125
  function File() {
126
    var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
127
    var pipeline = arguments[1];
128
    (0, _classCallCheck3.default)(this, File);
129

    
130
    var _this = (0, _possibleConstructorReturn3.default)(this, _Store.call(this));
131

    
132
    _this.pipeline = pipeline;
133

    
134
    _this.log = new _logger2.default(_this, opts.filename || "unknown");
135
    _this.opts = _this.initOptions(opts);
136

    
137
    _this.parserOpts = {
138
      sourceType: _this.opts.sourceType,
139
      sourceFileName: _this.opts.filename,
140
      plugins: []
141
    };
142

    
143
    _this.pluginVisitors = [];
144
    _this.pluginPasses = [];
145

    
146
    _this.buildPluginsForOptions(_this.opts);
147

    
148
    if (_this.opts.passPerPreset) {
149
      _this.perPresetOpts = [];
150
      _this.opts.presets.forEach(function (presetOpts) {
151
        var perPresetOpts = (0, _assign2.default)((0, _create2.default)(_this.opts), presetOpts);
152
        _this.perPresetOpts.push(perPresetOpts);
153
        _this.buildPluginsForOptions(perPresetOpts);
154
      });
155
    }
156

    
157
    _this.metadata = {
158
      usedHelpers: [],
159
      marked: [],
160
      modules: {
161
        imports: [],
162
        exports: {
163
          exported: [],
164
          specifiers: []
165
        }
166
      }
167
    };
168

    
169
    _this.dynamicImportTypes = {};
170
    _this.dynamicImportIds = {};
171
    _this.dynamicImports = [];
172
    _this.declarations = {};
173
    _this.usedHelpers = {};
174

    
175
    _this.path = null;
176
    _this.ast = {};
177

    
178
    _this.code = "";
179
    _this.shebang = "";
180

    
181
    _this.hub = new _babelTraverse.Hub(_this);
182
    return _this;
183
  }
184

    
185
  File.prototype.getMetadata = function getMetadata() {
186
    var has = false;
187
    for (var _iterator = this.ast.program.body, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : (0, _getIterator3.default)(_iterator);;) {
188
      var _ref;
189

    
190
      if (_isArray) {
191
        if (_i >= _iterator.length) break;
192
        _ref = _iterator[_i++];
193
      } else {
194
        _i = _iterator.next();
195
        if (_i.done) break;
196
        _ref = _i.value;
197
      }
198

    
199
      var node = _ref;
200

    
201
      if (t.isModuleDeclaration(node)) {
202
        has = true;
203
        break;
204
      }
205
    }
206
    if (has) {
207
      this.path.traverse(metadataVisitor, this);
208
    }
209
  };
210

    
211
  File.prototype.initOptions = function initOptions(opts) {
212
    opts = new _optionManager2.default(this.log, this.pipeline).init(opts);
213

    
214
    if (opts.inputSourceMap) {
215
      opts.sourceMaps = true;
216
    }
217

    
218
    if (opts.moduleId) {
219
      opts.moduleIds = true;
220
    }
221

    
222
    opts.basename = _path2.default.basename(opts.filename, _path2.default.extname(opts.filename));
223

    
224
    opts.ignore = util.arrayify(opts.ignore, util.regexify);
225

    
226
    if (opts.only) opts.only = util.arrayify(opts.only, util.regexify);
227

    
228
    (0, _defaults2.default)(opts, {
229
      moduleRoot: opts.sourceRoot
230
    });
231

    
232
    (0, _defaults2.default)(opts, {
233
      sourceRoot: opts.moduleRoot
234
    });
235

    
236
    (0, _defaults2.default)(opts, {
237
      filenameRelative: opts.filename
238
    });
239

    
240
    var basenameRelative = _path2.default.basename(opts.filenameRelative);
241

    
242
    (0, _defaults2.default)(opts, {
243
      sourceFileName: basenameRelative,
244
      sourceMapTarget: basenameRelative
245
    });
246

    
247
    return opts;
248
  };
249

    
250
  File.prototype.buildPluginsForOptions = function buildPluginsForOptions(opts) {
251
    if (!Array.isArray(opts.plugins)) {
252
      return;
253
    }
254

    
255
    var plugins = opts.plugins.concat(INTERNAL_PLUGINS);
256
    var currentPluginVisitors = [];
257
    var currentPluginPasses = [];
258

    
259
    for (var _iterator2 = plugins, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : (0, _getIterator3.default)(_iterator2);;) {
260
      var _ref2;
261

    
262
      if (_isArray2) {
263
        if (_i2 >= _iterator2.length) break;
264
        _ref2 = _iterator2[_i2++];
265
      } else {
266
        _i2 = _iterator2.next();
267
        if (_i2.done) break;
268
        _ref2 = _i2.value;
269
      }
270

    
271
      var ref = _ref2;
272
      var plugin = ref[0],
273
          pluginOpts = ref[1];
274

    
275

    
276
      currentPluginVisitors.push(plugin.visitor);
277
      currentPluginPasses.push(new _pluginPass2.default(this, plugin, pluginOpts));
278

    
279
      if (plugin.manipulateOptions) {
280
        plugin.manipulateOptions(opts, this.parserOpts, this);
281
      }
282
    }
283

    
284
    this.pluginVisitors.push(currentPluginVisitors);
285
    this.pluginPasses.push(currentPluginPasses);
286
  };
287

    
288
  File.prototype.getModuleName = function getModuleName() {
289
    var opts = this.opts;
290
    if (!opts.moduleIds) {
291
      return null;
292
    }
293

    
294
    if (opts.moduleId != null && !opts.getModuleId) {
295
      return opts.moduleId;
296
    }
297

    
298
    var filenameRelative = opts.filenameRelative;
299
    var moduleName = "";
300

    
301
    if (opts.moduleRoot != null) {
302
      moduleName = opts.moduleRoot + "/";
303
    }
304

    
305
    if (!opts.filenameRelative) {
306
      return moduleName + opts.filename.replace(/^\//, "");
307
    }
308

    
309
    if (opts.sourceRoot != null) {
310
      var sourceRootRegEx = new RegExp("^" + opts.sourceRoot + "\/?");
311
      filenameRelative = filenameRelative.replace(sourceRootRegEx, "");
312
    }
313

    
314
    filenameRelative = filenameRelative.replace(/\.(\w*?)$/, "");
315

    
316
    moduleName += filenameRelative;
317

    
318
    moduleName = moduleName.replace(/\\/g, "/");
319

    
320
    if (opts.getModuleId) {
321
      return opts.getModuleId(moduleName) || moduleName;
322
    } else {
323
      return moduleName;
324
    }
325
  };
326

    
327
  File.prototype.resolveModuleSource = function resolveModuleSource(source) {
328
    var resolveModuleSource = this.opts.resolveModuleSource;
329
    if (resolveModuleSource) source = resolveModuleSource(source, this.opts.filename);
330
    return source;
331
  };
332

    
333
  File.prototype.addImport = function addImport(source, imported) {
334
    var name = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : imported;
335

    
336
    var alias = source + ":" + imported;
337
    var id = this.dynamicImportIds[alias];
338

    
339
    if (!id) {
340
      source = this.resolveModuleSource(source);
341
      id = this.dynamicImportIds[alias] = this.scope.generateUidIdentifier(name);
342

    
343
      var specifiers = [];
344

    
345
      if (imported === "*") {
346
        specifiers.push(t.importNamespaceSpecifier(id));
347
      } else if (imported === "default") {
348
        specifiers.push(t.importDefaultSpecifier(id));
349
      } else {
350
        specifiers.push(t.importSpecifier(id, t.identifier(imported)));
351
      }
352

    
353
      var declar = t.importDeclaration(specifiers, t.stringLiteral(source));
354
      declar._blockHoist = 3;
355

    
356
      this.path.unshiftContainer("body", declar);
357
    }
358

    
359
    return id;
360
  };
361

    
362
  File.prototype.addHelper = function addHelper(name) {
363
    var declar = this.declarations[name];
364
    if (declar) return declar;
365

    
366
    if (!this.usedHelpers[name]) {
367
      this.metadata.usedHelpers.push(name);
368
      this.usedHelpers[name] = true;
369
    }
370

    
371
    var generator = this.get("helperGenerator");
372
    var runtime = this.get("helpersNamespace");
373
    if (generator) {
374
      var res = generator(name);
375
      if (res) return res;
376
    } else if (runtime) {
377
      return t.memberExpression(runtime, t.identifier(name));
378
    }
379

    
380
    var ref = (0, _babelHelpers2.default)(name);
381
    var uid = this.declarations[name] = this.scope.generateUidIdentifier(name);
382

    
383
    if (t.isFunctionExpression(ref) && !ref.id) {
384
      ref.body._compact = true;
385
      ref._generated = true;
386
      ref.id = uid;
387
      ref.type = "FunctionDeclaration";
388
      this.path.unshiftContainer("body", ref);
389
    } else {
390
      ref._compact = true;
391
      this.scope.push({
392
        id: uid,
393
        init: ref,
394
        unique: true
395
      });
396
    }
397

    
398
    return uid;
399
  };
400

    
401
  File.prototype.addTemplateObject = function addTemplateObject(helperName, strings, raw) {
402
    var stringIds = raw.elements.map(function (string) {
403
      return string.value;
404
    });
405
    var name = helperName + "_" + raw.elements.length + "_" + stringIds.join(",");
406

    
407
    var declar = this.declarations[name];
408
    if (declar) return declar;
409

    
410
    var uid = this.declarations[name] = this.scope.generateUidIdentifier("templateObject");
411

    
412
    var helperId = this.addHelper(helperName);
413
    var init = t.callExpression(helperId, [strings, raw]);
414
    init._compact = true;
415
    this.scope.push({
416
      id: uid,
417
      init: init,
418
      _blockHoist: 1.9 });
419
    return uid;
420
  };
421

    
422
  File.prototype.buildCodeFrameError = function buildCodeFrameError(node, msg) {
423
    var Error = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : SyntaxError;
424

    
425
    var loc = node && (node.loc || node._loc);
426

    
427
    var err = new Error(msg);
428

    
429
    if (loc) {
430
      err.loc = loc.start;
431
    } else {
432
      (0, _babelTraverse2.default)(node, errorVisitor, this.scope, err);
433

    
434
      err.message += " (This is an error on an internal node. Probably an internal error";
435

    
436
      if (err.loc) {
437
        err.message += ". Location has been estimated.";
438
      }
439

    
440
      err.message += ")";
441
    }
442

    
443
    return err;
444
  };
445

    
446
  File.prototype.mergeSourceMap = function mergeSourceMap(map) {
447
    var inputMap = this.opts.inputSourceMap;
448

    
449
    if (inputMap && map) {
450
      return (0, _mergeMap2.default)(inputMap, map);
451
    } else {
452
      return map;
453
    }
454
  };
455

    
456
  File.prototype.parse = function parse(code) {
457
    var parseCode = _babylon.parse;
458
    var parserOpts = this.opts.parserOpts;
459

    
460
    if (parserOpts) {
461
      parserOpts = (0, _assign2.default)({}, this.parserOpts, parserOpts);
462

    
463
      if (parserOpts.parser) {
464
        if (typeof parserOpts.parser === "string") {
465
          var dirname = _path2.default.dirname(this.opts.filename) || process.cwd();
466
          var parser = (0, _resolve2.default)(parserOpts.parser, dirname);
467
          if (parser) {
468
            parseCode = require(parser).parse;
469
          } else {
470
            throw new Error("Couldn't find parser " + parserOpts.parser + " with \"parse\" method " + ("relative to directory " + dirname));
471
          }
472
        } else {
473
          parseCode = parserOpts.parser;
474
        }
475

    
476
        parserOpts.parser = {
477
          parse: function parse(source) {
478
            return (0, _babylon.parse)(source, parserOpts);
479
          }
480
        };
481
      }
482
    }
483

    
484
    this.log.debug("Parse start");
485
    var ast = parseCode(code, parserOpts || this.parserOpts);
486
    this.log.debug("Parse stop");
487
    return ast;
488
  };
489

    
490
  File.prototype._addAst = function _addAst(ast) {
491
    this.path = _babelTraverse.NodePath.get({
492
      hub: this.hub,
493
      parentPath: null,
494
      parent: ast,
495
      container: ast,
496
      key: "program"
497
    }).setContext();
498
    this.scope = this.path.scope;
499
    this.ast = ast;
500
    this.getMetadata();
501
  };
502

    
503
  File.prototype.addAst = function addAst(ast) {
504
    this.log.debug("Start set AST");
505
    this._addAst(ast);
506
    this.log.debug("End set AST");
507
  };
508

    
509
  File.prototype.transform = function transform() {
510
    for (var i = 0; i < this.pluginPasses.length; i++) {
511
      var pluginPasses = this.pluginPasses[i];
512
      this.call("pre", pluginPasses);
513
      this.log.debug("Start transform traverse");
514

    
515
      var visitor = _babelTraverse2.default.visitors.merge(this.pluginVisitors[i], pluginPasses, this.opts.wrapPluginVisitorMethod);
516
      (0, _babelTraverse2.default)(this.ast, visitor, this.scope);
517

    
518
      this.log.debug("End transform traverse");
519
      this.call("post", pluginPasses);
520
    }
521

    
522
    return this.generate();
523
  };
524

    
525
  File.prototype.wrap = function wrap(code, callback) {
526
    code = code + "";
527

    
528
    try {
529
      if (this.shouldIgnore()) {
530
        return this.makeResult({ code: code, ignored: true });
531
      } else {
532
        return callback();
533
      }
534
    } catch (err) {
535
      if (err._babel) {
536
        throw err;
537
      } else {
538
        err._babel = true;
539
      }
540

    
541
      var message = err.message = this.opts.filename + ": " + err.message;
542

    
543
      var loc = err.loc;
544
      if (loc) {
545
        err.codeFrame = (0, _babelCodeFrame2.default)(code, loc.line, loc.column + 1, this.opts);
546
        message += "\n" + err.codeFrame;
547
      }
548

    
549
      if (process.browser) {
550
        err.message = message;
551
      }
552

    
553
      if (err.stack) {
554
        var newStack = err.stack.replace(err.message, message);
555
        err.stack = newStack;
556
      }
557

    
558
      throw err;
559
    }
560
  };
561

    
562
  File.prototype.addCode = function addCode(code) {
563
    code = (code || "") + "";
564
    code = this.parseInputSourceMap(code);
565
    this.code = code;
566
  };
567

    
568
  File.prototype.parseCode = function parseCode() {
569
    this.parseShebang();
570
    var ast = this.parse(this.code);
571
    this.addAst(ast);
572
  };
573

    
574
  File.prototype.shouldIgnore = function shouldIgnore() {
575
    var opts = this.opts;
576
    return util.shouldIgnore(opts.filename, opts.ignore, opts.only);
577
  };
578

    
579
  File.prototype.call = function call(key, pluginPasses) {
580
    for (var _iterator3 = pluginPasses, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : (0, _getIterator3.default)(_iterator3);;) {
581
      var _ref3;
582

    
583
      if (_isArray3) {
584
        if (_i3 >= _iterator3.length) break;
585
        _ref3 = _iterator3[_i3++];
586
      } else {
587
        _i3 = _iterator3.next();
588
        if (_i3.done) break;
589
        _ref3 = _i3.value;
590
      }
591

    
592
      var pass = _ref3;
593

    
594
      var plugin = pass.plugin;
595
      var fn = plugin[key];
596
      if (fn) fn.call(pass, this);
597
    }
598
  };
599

    
600
  File.prototype.parseInputSourceMap = function parseInputSourceMap(code) {
601
    var opts = this.opts;
602

    
603
    if (opts.inputSourceMap !== false) {
604
      var inputMap = _convertSourceMap2.default.fromSource(code);
605
      if (inputMap) {
606
        opts.inputSourceMap = inputMap.toObject();
607
        code = _convertSourceMap2.default.removeComments(code);
608
      }
609
    }
610

    
611
    return code;
612
  };
613

    
614
  File.prototype.parseShebang = function parseShebang() {
615
    var shebangMatch = shebangRegex.exec(this.code);
616
    if (shebangMatch) {
617
      this.shebang = shebangMatch[0];
618
      this.code = this.code.replace(shebangRegex, "");
619
    }
620
  };
621

    
622
  File.prototype.makeResult = function makeResult(_ref4) {
623
    var code = _ref4.code,
624
        map = _ref4.map,
625
        ast = _ref4.ast,
626
        ignored = _ref4.ignored;
627

    
628
    var result = {
629
      metadata: null,
630
      options: this.opts,
631
      ignored: !!ignored,
632
      code: null,
633
      ast: null,
634
      map: map || null
635
    };
636

    
637
    if (this.opts.code) {
638
      result.code = code;
639
    }
640

    
641
    if (this.opts.ast) {
642
      result.ast = ast;
643
    }
644

    
645
    if (this.opts.metadata) {
646
      result.metadata = this.metadata;
647
    }
648

    
649
    return result;
650
  };
651

    
652
  File.prototype.generate = function generate() {
653
    var opts = this.opts;
654
    var ast = this.ast;
655

    
656
    var result = { ast: ast };
657
    if (!opts.code) return this.makeResult(result);
658

    
659
    var gen = _babelGenerator2.default;
660
    if (opts.generatorOpts.generator) {
661
      gen = opts.generatorOpts.generator;
662

    
663
      if (typeof gen === "string") {
664
        var dirname = _path2.default.dirname(this.opts.filename) || process.cwd();
665
        var generator = (0, _resolve2.default)(gen, dirname);
666
        if (generator) {
667
          gen = require(generator).print;
668
        } else {
669
          throw new Error("Couldn't find generator " + gen + " with \"print\" method relative " + ("to directory " + dirname));
670
        }
671
      }
672
    }
673

    
674
    this.log.debug("Generation start");
675

    
676
    var _result = gen(ast, opts.generatorOpts ? (0, _assign2.default)(opts, opts.generatorOpts) : opts, this.code);
677
    result.code = _result.code;
678
    result.map = _result.map;
679

    
680
    this.log.debug("Generation end");
681

    
682
    if (this.shebang) {
683
      result.code = this.shebang + "\n" + result.code;
684
    }
685

    
686
    if (result.map) {
687
      result.map = this.mergeSourceMap(result.map);
688
    }
689

    
690
    if (opts.sourceMaps === "inline" || opts.sourceMaps === "both") {
691
      result.code += "\n" + _convertSourceMap2.default.fromObject(result.map).toComment();
692
    }
693

    
694
    if (opts.sourceMaps === "inline") {
695
      result.map = null;
696
    }
697

    
698
    return this.makeResult(result);
699
  };
700

    
701
  return File;
702
}(_store2.default);
703

    
704
exports.default = File;
705
exports.File = File;
(1-1/4)