@parcel/transformer-babel 2.0.0-nightly.130 → 2.0.0-nightly.1303

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -5,65 +5,95 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.default = void 0;
7
7
 
8
- var _plugin = require("@parcel/plugin");
8
+ var _babelErrorUtils = require("./babelErrorUtils");
9
9
 
10
- var _sourceMap = _interopRequireDefault(require("@parcel/source-map"));
10
+ function _plugin() {
11
+ const data = require("@parcel/plugin");
11
12
 
12
- var _generator = _interopRequireDefault(require("@babel/generator"));
13
+ _plugin = function () {
14
+ return data;
15
+ };
13
16
 
14
- var _semver = _interopRequireDefault(require("semver"));
17
+ return data;
18
+ }
15
19
 
16
- var _babel = _interopRequireDefault(require("./babel7"));
20
+ function _utils() {
21
+ const data = require("@parcel/utils");
17
22
 
18
- var _utils = require("@parcel/utils");
23
+ _utils = function () {
24
+ return data;
25
+ };
19
26
 
20
- var _config = require("./config");
27
+ return data;
28
+ }
21
29
 
22
- var _babelErrorUtils = require("./babelErrorUtils");
30
+ function _sourceMap() {
31
+ const data = _interopRequireDefault(require("@parcel/source-map"));
32
+
33
+ _sourceMap = function () {
34
+ return data;
35
+ };
36
+
37
+ return data;
38
+ }
39
+
40
+ function _semver() {
41
+ const data = _interopRequireDefault(require("semver"));
42
+
43
+ _semver = function () {
44
+ return data;
45
+ };
46
+
47
+ return data;
48
+ }
49
+
50
+ var _babel = _interopRequireDefault(require("./babel7"));
51
+
52
+ var _config = require("./config");
23
53
 
24
54
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
25
55
 
26
- var _default = new _plugin.Transformer({
27
- async loadConfig({
56
+ var _default = new (_plugin().Transformer)({
57
+ loadConfig({
28
58
  config,
29
59
  options,
30
60
  logger
31
61
  }) {
32
- await (0, _config.load)(config, options, logger);
33
- },
34
-
35
- preSerializeConfig({
36
- config
37
- }) {
38
- return (0, _config.preSerialize)(config);
39
- },
40
-
41
- postDeserializeConfig({
42
- config,
43
- options
44
- }) {
45
- return (0, _config.postDeserialize)(config, options);
62
+ return (0, _config.load)(config, options, logger);
46
63
  },
47
64
 
48
65
  canReuseAST({
49
66
  ast
50
67
  }) {
51
- return ast.type === 'babel' && _semver.default.satisfies(ast.version, '^7.0.0');
68
+ return ast.type === 'babel' && _semver().default.satisfies(ast.version, '^7.0.0');
52
69
  },
53
70
 
54
71
  async transform({
55
72
  asset,
56
73
  config,
57
- options
74
+ logger,
75
+ options,
76
+ tracer
58
77
  }) {
59
- // TODO: come up with a better name
60
78
  try {
61
- if (config === null || config === void 0 ? void 0 : config.config) {
62
- if (asset.meta.babelPlugins && Array.isArray(asset.meta.babelPlugins)) {
63
- // $FlowFixMe
64
- asset.ast = await (0, _babel.default)(asset, options, config, asset.meta.babelPlugins);
79
+ if (config !== null && config !== void 0 && config.config) {
80
+ if (asset.meta.babelPlugins != null && Array.isArray(asset.meta.babelPlugins)) {
81
+ await (0, _babel.default)({
82
+ asset,
83
+ options,
84
+ logger,
85
+ babelOptions: config,
86
+ additionalPlugins: asset.meta.babelPlugins,
87
+ tracer
88
+ });
65
89
  } else {
66
- asset.ast = await (0, _babel.default)(asset, options, config);
90
+ await (0, _babel.default)({
91
+ asset,
92
+ options,
93
+ logger,
94
+ babelOptions: config,
95
+ tracer
96
+ });
67
97
  }
68
98
  }
69
99
 
@@ -75,25 +105,51 @@ var _default = new _plugin.Transformer({
75
105
 
76
106
  async generate({
77
107
  asset,
108
+ ast,
78
109
  options
79
110
  }) {
80
- let sourceFileName = (0, _utils.relativeUrl)(options.projectRoot, asset.filePath);
111
+ let originalSourceMap = await asset.getMap();
112
+ let sourceFileName = (0, _utils().relativeUrl)(options.projectRoot, asset.filePath);
113
+ const babelCorePath = await options.packageManager.resolve('@babel/core', asset.filePath, {
114
+ range: '^7.12.0',
115
+ saveDev: true,
116
+ shouldAutoInstall: options.shouldAutoInstall
117
+ });
118
+ const {
119
+ default: generate
120
+ } = await options.packageManager.require('@babel/generator', babelCorePath.resolved);
121
+ let {
122
+ code,
123
+ rawMappings
124
+ } = generate(ast.program, {
125
+ sourceFileName,
126
+ sourceMaps: !!asset.env.sourceMap,
127
+ comments: true
128
+ });
129
+ let map = new (_sourceMap().default)(options.projectRoot);
130
+
131
+ if (rawMappings) {
132
+ map.addIndexedMappings(rawMappings);
133
+ }
81
134
 
82
- try {
83
- // $FlowFixMe: figure out how to make AST required in generate method
84
- let generated = (0, _generator.default)(asset.ast.program, {
85
- sourceMaps: options.sourceMaps,
86
- sourceFileName: sourceFileName
87
- });
88
- return {
89
- code: generated.code,
90
- map: new _sourceMap.default(generated.rawMappings, {
91
- [sourceFileName]: null
92
- })
93
- };
94
- } catch (e) {
95
- throw await (0, _babelErrorUtils.babelErrorEnhancer)(e, asset);
135
+ if (originalSourceMap) {
136
+ // The babel AST already contains the correct mappings, but not the source contents.
137
+ // We need to copy over the source contents from the original map.
138
+ let sourcesContent = originalSourceMap.getSourcesContentMap();
139
+
140
+ for (let filePath in sourcesContent) {
141
+ let content = sourcesContent[filePath];
142
+
143
+ if (content != null) {
144
+ map.setSourceContent(filePath, content);
145
+ }
146
+ }
96
147
  }
148
+
149
+ return {
150
+ content: code,
151
+ map
152
+ };
97
153
  }
98
154
 
99
155
  });
package/lib/babel7.js CHANGED
@@ -5,65 +5,151 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.default = babel7;
7
7
 
8
- var _assert = _interopRequireDefault(require("assert"));
8
+ function _assert() {
9
+ const data = _interopRequireDefault(require("assert"));
9
10
 
10
- var _constants = require("./constants");
11
+ _assert = function () {
12
+ return data;
13
+ };
11
14
 
12
- var _package = _interopRequireDefault(require("../package.json"));
15
+ return data;
16
+ }
13
17
 
14
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
18
+ function _path() {
19
+ const data = _interopRequireDefault(require("path"));
20
+
21
+ _path = function () {
22
+ return data;
23
+ };
24
+
25
+ return data;
26
+ }
27
+
28
+ function _diagnostic() {
29
+ const data = require("@parcel/diagnostic");
30
+
31
+ _diagnostic = function () {
32
+ return data;
33
+ };
34
+
35
+ return data;
36
+ }
15
37
 
16
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
38
+ function _utils() {
39
+ const data = require("@parcel/utils");
17
40
 
18
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
41
+ _utils = function () {
42
+ return data;
43
+ };
19
44
 
20
- function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
45
+ return data;
46
+ }
47
+
48
+ var _remapAstLocations = require("./remapAstLocations");
49
+
50
+ var _package = _interopRequireDefault(require("../package.json"));
51
+
52
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
21
53
 
22
54
  const transformerVersion = _package.default.version;
23
- (0, _assert.default)(typeof transformerVersion === 'string');
55
+ (0, _assert().default)(typeof transformerVersion === 'string');
24
56
 
25
- async function babel7(asset, options, babelOptions, additionalPlugins = []) {
26
- // If this is an internally generated config, use our internal @babel/core,
27
- // otherwise require a local version from the package we're compiling.
28
- let babel = babelOptions.internal ? require('@babel/core') : await options.packageManager.require('@babel/core', asset.filePath, {
29
- range: _constants.BABEL_RANGE
30
- });
57
+ async function babel7(opts) {
58
+ var _babelOptions$config$, _babelOptions$config$2, _babelOptions$syntaxP;
31
59
 
32
- let config = _objectSpread({}, babelOptions.config, {
60
+ let {
61
+ asset,
62
+ options,
63
+ babelOptions,
64
+ additionalPlugins = [],
65
+ tracer
66
+ } = opts;
67
+ const babelCore = await options.packageManager.require('@babel/core', asset.filePath, {
68
+ range: '^7.12.0',
69
+ saveDev: true,
70
+ shouldAutoInstall: options.shouldAutoInstall
71
+ });
72
+ let config = { ...babelOptions.config,
33
73
  plugins: additionalPlugins.concat(babelOptions.config.plugins),
34
74
  code: false,
35
75
  ast: true,
36
76
  filename: asset.filePath,
37
77
  babelrc: false,
38
78
  configFile: false,
39
- parserOpts: _objectSpread({}, babelOptions.config.parserOpts, {
79
+ parserOpts: { ...babelOptions.config.parserOpts,
80
+ sourceFilename: (0, _utils().relativeUrl)(options.projectRoot, asset.filePath),
40
81
  allowReturnOutsideFunction: true,
41
82
  strictMode: false,
42
83
  sourceType: 'module',
43
- plugins: ['dynamicImport']
44
- }),
84
+ plugins: [...((_babelOptions$config$ = (_babelOptions$config$2 = babelOptions.config.parserOpts) === null || _babelOptions$config$2 === void 0 ? void 0 : _babelOptions$config$2.plugins) !== null && _babelOptions$config$ !== void 0 ? _babelOptions$config$ : []), ...((_babelOptions$syntaxP = babelOptions.syntaxPlugins) !== null && _babelOptions$syntaxP !== void 0 ? _babelOptions$syntaxP : []), // Applied by preset-env
85
+ 'classProperties', 'classPrivateProperties', 'classPrivateMethods', 'exportDefaultFrom' // 'topLevelAwait'
86
+ ]
87
+ },
45
88
  caller: {
46
89
  name: 'parcel',
47
90
  version: transformerVersion,
48
- targets: JSON.stringify(babelOptions.targets)
91
+ targets: JSON.stringify(babelOptions.targets),
92
+ outputFormat: asset.env.outputFormat
49
93
  }
50
- });
94
+ };
95
+
96
+ if (tracer.enabled) {
97
+ config.wrapPluginVisitorMethod = (key, nodeType, fn) => {
98
+ return function () {
99
+ let pluginKey = key;
100
+
101
+ if (pluginKey.startsWith(options.projectRoot)) {
102
+ pluginKey = _path().default.relative(options.projectRoot, pluginKey);
103
+ }
104
+
105
+ const measurement = tracer.createMeasurement(pluginKey, nodeType, _path().default.relative(options.projectRoot, asset.filePath));
106
+ fn.apply(this, arguments);
107
+ measurement && measurement.end();
108
+ };
109
+ };
110
+ }
51
111
 
52
- let code = await asset.getCode();
112
+ let ast = await asset.getAST();
53
113
  let res;
54
114
 
55
- if (asset.ast) {
56
- res = babel.transformFromAstSync(asset.ast.program, code, config);
115
+ if (ast) {
116
+ res = await babelCore.transformFromAstAsync(ast.program, asset.isASTDirty() ? undefined : await asset.getCode(), config);
57
117
  } else {
58
- res = babel.transformSync(code, config);
118
+ res = await babelCore.transformAsync(await asset.getCode(), config);
119
+
120
+ if (res.ast) {
121
+ let map = await asset.getMap();
122
+
123
+ if (map) {
124
+ (0, _remapAstLocations.remapAstLocations)(babelCore.types, res.ast, map);
125
+ }
126
+ }
127
+
128
+ if (res.externalDependencies) {
129
+ for (let f of res.externalDependencies) {
130
+ if (!_path().default.isAbsolute(f)) {
131
+ opts.logger.warn({
132
+ message: (0, _diagnostic().md)`Ignoring non-absolute Babel external dependency: ${f}`,
133
+ hints: ['Please report this to the corresponding Babel plugin and/or to Parcel.']
134
+ });
135
+ } else {
136
+ if (await options.inputFS.exists(f)) {
137
+ asset.invalidateOnFileChange(f);
138
+ } else {
139
+ asset.invalidateOnFileCreate({
140
+ filePath: f
141
+ });
142
+ }
143
+ }
144
+ }
145
+ }
59
146
  }
60
147
 
61
148
  if (res.ast) {
62
- return {
149
+ asset.setAST({
63
150
  type: 'babel',
64
151
  version: '7.0.0',
65
- program: res.ast,
66
- isDirty: true
67
- };
152
+ program: res.ast
153
+ });
68
154
  }
69
155
  }
@@ -7,7 +7,8 @@ exports.babelErrorEnhancer = babelErrorEnhancer;
7
7
 
8
8
  async function babelErrorEnhancer(error, asset) {
9
9
  if (error.loc) {
10
- error.message = error.message.slice(asset.filePath.length + 1, error.message.indexOf('\n')).trim();
10
+ let start = error.message.startsWith(asset.filePath) ? asset.filePath.length + 1 : 0;
11
+ error.message = error.message.slice(start).split('\n')[0].trim();
11
12
  }
12
13
 
13
14
  error.source = await asset.getCode();