-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy pathtransform-js-module.ts
63 lines (61 loc) · 2.49 KB
/
transform-js-module.ts
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
/**
* @license
* Copyright (c) 2019 The Polymer Project Authors. All rights reserved.
* This code may only be used under the BSD style license found at
* http://polymer.github.io/LICENSE.txt
* The complete set of authors may be found at
* http://polymer.github.io/AUTHORS.txt
* The complete set of contributors may be found at
* http://polymer.github.io/CONTRIBUTORS.txt
* Code distributed by Google as part of the polymer project is also
* subject to an additional IP rights grant found at
* http://polymer.github.io/PATENTS.txt
*/
import traverse from '@babel/traverse';
import {NodePath} from '@babel/traverse';
import {CallExpression, ExportAllDeclaration, ExportNamedDeclaration, ImportDeclaration, isImport, isStringLiteral, Node, StringLiteral} from '@babel/types';
import {SpecifierTransform} from './koa-module-specifier-transform';
import {Logger} from './support/logger';
export const transformJSModule =
(ast: Node,
url: string,
specifierTransform: SpecifierTransform,
logger: Logger): Node => {
const importExportDeclaration = {
enter(path: NodePath<ImportDeclaration|ExportAllDeclaration|
ExportNamedDeclaration>) {
if (path.node && path.node.source &&
isStringLiteral(path.node.source)) {
const specifier = path.node.source.value;
const transformedSpecifier =
specifierTransform(url, specifier, logger);
if (typeof transformedSpecifier === 'undefined') {
return;
}
path.node.source.value = transformedSpecifier;
}
}
};
traverse(ast, {
ImportDeclaration: importExportDeclaration,
ExportAllDeclaration: importExportDeclaration,
ExportNamedDeclaration: importExportDeclaration,
CallExpression: {
enter(path: NodePath<CallExpression>) {
if (path.node && path.node.callee && isImport(path.node.callee) &&
path.node.arguments.length === 1 &&
isStringLiteral(path.node.arguments[0])) {
const argument = path.node.arguments[0] as StringLiteral;
const specifier = argument.value;
const transformedSpecifier =
specifierTransform(url, specifier, logger);
if (typeof transformedSpecifier === 'undefined') {
return;
}
argument.value = transformedSpecifier;
}
}
}
});
return ast;
};