-
-
Notifications
You must be signed in to change notification settings - Fork 2.3k
/
SyncDynamicImportTransformer.js
84 lines (72 loc) 路 2.08 KB
/
SyncDynamicImportTransformer.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
// @flow
import semver from 'semver';
import {Transformer} from '@parcel/plugin';
import * as babelCore from '@babel/core';
import {relativeUrl} from '@parcel/utils';
import packageJson from '../package.json';
import {generate, parse} from './babel-ast-utils';
import syncDynamicImportPlugin from './babel/babel-plugin-sync-dynamic-import';
const transformerVersion: mixed = packageJson.version;
const IMPORT_RE = /\bimport\b/;
export default (new Transformer({
canReuseAST({ast}) {
return ast.type === 'babel' && semver.satisfies(ast.version, '^7.0.0');
},
async parse({asset, options}) {
let code = await asset.getCode();
if (!IMPORT_RE.test(code)) {
return null;
}
return parse({
asset,
code,
options,
plugins: [
'jsx',
'typescript',
'classProperties',
['moduleAttributes', {version: 'may-2020'}],
],
});
},
async transform({asset, options}) {
let ast = await asset.getAST();
if (!ast) {
return [asset];
}
let code = asset.isASTDirty() ? null : await asset.getCode();
const res = await babelCore.transformFromAstAsync(
ast.program,
code ?? undefined,
{
code: false,
ast: true,
filename: asset.filePath,
babelrc: false,
configFile: false,
parserOpts: {
sourceFilename: relativeUrl(options.projectRoot, asset.filePath),
allowReturnOutsideFunction: true,
strictMode: false,
sourceType: 'module',
},
caller: {
name: 'parcel',
version: transformerVersion,
targets: JSON.stringify({node: 'current'}),
},
// ATLASSIAN: the react-loadable plugin adds some fields to the Loadable calls that are required for hydration
plugins: ['react-loadable/babel', syncDynamicImportPlugin],
},
);
asset.setAST({
type: 'babel',
version: '7.0.0',
program: res.ast,
});
return [asset];
},
generate({asset, ast, options}) {
return generate({asset, ast, options});
},
}): Transformer);