UNPKG

1.55 kBJavaScriptView Raw
1// @flow
2
3import type {MutableAsset, AST, PluginOptions} from '@parcel/types';
4
5import invariant from 'assert';
6import * as babel from '@babel/core';
7import {relativeUrl} from '@parcel/utils';
8
9import packageJson from '../package.json';
10
11const transformerVersion: mixed = packageJson.version;
12invariant(typeof transformerVersion === 'string');
13
14export 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}