1 |
|
2 |
|
3 | import type {MutableAsset, AST, PluginOptions} from '@parcel/types';
|
4 |
|
5 | import invariant from 'assert';
|
6 | import * as babel from '@babel/core';
|
7 | import {relativeUrl} from '@parcel/utils';
|
8 |
|
9 | import packageJson from '../package.json';
|
10 |
|
11 | const transformerVersion: mixed = packageJson.version;
|
12 | invariant(typeof transformerVersion === 'string');
|
13 |
|
14 | export default async function babel7(
|
15 | asset: MutableAsset,
|
16 | options: PluginOptions,
|
17 | babelOptions: any,
|
18 | additionalPlugins: Array<any> = [],
|
19 | ): Promise<?AST> {
|
20 | let config = {
|
21 | ...babelOptions.config,
|
22 | plugins: additionalPlugins.concat(babelOptions.config.plugins),
|
23 | code: false,
|
24 | ast: true,
|
25 | filename: asset.filePath,
|
26 | babelrc: false,
|
27 | configFile: false,
|
28 | parserOpts: {
|
29 | ...babelOptions.config.parserOpts,
|
30 | sourceFilename: relativeUrl(options.projectRoot, asset.filePath),
|
31 | allowReturnOutsideFunction: true,
|
32 | strictMode: false,
|
33 | sourceType: 'module',
|
34 | },
|
35 | caller: {
|
36 | name: 'parcel',
|
37 | version: transformerVersion,
|
38 | targets: JSON.stringify(babelOptions.targets),
|
39 | outputFormat: asset.env.outputFormat,
|
40 | },
|
41 | };
|
42 |
|
43 | let ast = await asset.getAST();
|
44 | let res;
|
45 | if (ast) {
|
46 | res = await babel.transformFromAstAsync(
|
47 | ast.program,
|
48 | asset.isASTDirty() ? undefined : await asset.getCode(),
|
49 | config,
|
50 | );
|
51 | } else {
|
52 | res = await babel.transformAsync(await asset.getCode(), config);
|
53 | }
|
54 |
|
55 | if (res.ast) {
|
56 | asset.setAST({
|
57 | type: 'babel',
|
58 | version: '7.0.0',
|
59 | program: res.ast,
|
60 | });
|
61 | }
|
62 | }
|