Skip to content

Commit 4fb6239

Browse files
committedNov 11, 2023
Increase readability of module.exports visitor
1 parent 6f0e939 commit 4fb6239

File tree

1 file changed

+25
-30
lines changed

1 file changed

+25
-30
lines changed
 

‎src/typescript/visitors/exports/moduleExportsAccessExpression.ts

+25-30
Original file line numberDiff line numberDiff line change
@@ -4,48 +4,43 @@ import { stripQuotes } from '../../ast-helpers.js';
44
import { isJS } from '../helpers.js';
55
import { exportVisitor as visit } from '../index.js';
66

7+
const isModuleExportsAccess = (node: ts.PropertyAccessExpression) =>
8+
ts.isIdentifier(node.expression) && node.expression.escapedText === 'module' && node.name.escapedText === 'exports';
9+
710
export default visit(isJS, node => {
811
if (ts.isExpressionStatement(node)) {
912
if (ts.isBinaryExpression(node.expression)) {
10-
if (
11-
ts.isPropertyAccessExpression(node.expression.left) &&
12-
ts.isPropertyAccessExpression(node.expression.left.expression) &&
13-
ts.isIdentifier(node.expression.left.expression.expression) &&
14-
node.expression.left.expression.expression.escapedText === 'module' &&
15-
node.expression.left.expression.name.escapedText === 'exports'
16-
) {
17-
// Pattern: module.exports.NAME
18-
const identifier = node.expression.left.name.getText();
19-
const pos = node.expression.left.name.pos;
20-
return { node, identifier, type: SymbolType.UNKNOWN, pos };
13+
if (ts.isPropertyAccessExpression(node.expression.left)) {
14+
if (
15+
ts.isPropertyAccessExpression(node.expression.left.expression) &&
16+
isModuleExportsAccess(node.expression.left.expression)
17+
) {
18+
// Pattern: module.exports.NAME
19+
const identifier = node.expression.left.name.getText();
20+
const pos = node.expression.left.name.pos;
21+
return { node, identifier, type: SymbolType.UNKNOWN, pos };
22+
} else if (isModuleExportsAccess(node.expression.left)) {
23+
const expr = node.expression.right;
24+
if (ts.isObjectLiteralExpression(expr) && expr.properties.every(ts.isShorthandPropertyAssignment)) {
25+
// Pattern: module.exports = { identifier, identifier2 }
26+
return expr.properties.map(node => {
27+
return { node, identifier: node.getText(), type: SymbolType.UNKNOWN, pos: node.pos };
28+
});
29+
} else {
30+
// Pattern: module.exports = any
31+
return { node, identifier: 'default', type: SymbolType.UNKNOWN, pos: expr.pos };
32+
}
33+
}
2134
} else if (
2235
ts.isElementAccessExpression(node.expression.left) &&
2336
ts.isPropertyAccessExpression(node.expression.left.expression) &&
2437
ts.isIdentifier(node.expression.left.expression.name) &&
25-
ts.isIdentifier(node.expression.left.expression.expression) &&
26-
node.expression.left.expression.expression.escapedText === 'module' &&
27-
node.expression.left.expression.name.escapedText === 'exports'
38+
isModuleExportsAccess(node.expression.left.expression)
2839
) {
2940
// Pattern: module.exports['NAME']
3041
const identifier = stripQuotes(node.expression.left.argumentExpression.getText());
3142
const pos = node.expression.left.argumentExpression.pos;
3243
return { node, identifier, type: SymbolType.UNKNOWN, pos };
33-
} else if (
34-
ts.isPropertyAccessExpression(node.expression.left) &&
35-
ts.isIdentifier(node.expression.left.expression) &&
36-
node.expression.left.expression.escapedText === 'module' &&
37-
node.expression.left.name.escapedText === 'exports'
38-
) {
39-
const expr = node.expression.right;
40-
if (ts.isObjectLiteralExpression(expr) && expr.properties.every(ts.isShorthandPropertyAssignment)) {
41-
// Pattern: module.exports = { identifier, identifier2 }
42-
return expr.properties.map(node => {
43-
return { node, identifier: node.getText(), type: SymbolType.UNKNOWN, pos: node.pos };
44-
});
45-
} else {
46-
// Pattern: module.exports = any
47-
return { node, identifier: 'default', type: SymbolType.UNKNOWN, pos: expr.pos };
48-
}
4944
}
5045
}
5146
}

0 commit comments

Comments
 (0)
Please sign in to comment.