-
-
Notifications
You must be signed in to change notification settings - Fork 601
/
resolve.ts
83 lines (66 loc) · 2.16 KB
/
resolve.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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
import { IJSCodeshift, INode } from "../types/NodePath";
/**
*
* Transform which consolidates the `resolve.root` configuration option into the `resolve.modules` array
*
* @param {Object} j - jscodeshift top-level import
* @param {Node} ast - jscodeshift ast to transform
* @returns {Node} ast - jscodeshift ast
*/
export default function transformer(j: IJSCodeshift, ast: INode): INode {
const getRootVal = (p: INode): INode => {
return p.node.value.properties.filter((prop: INode): boolean => prop.key.name === "root")[0];
};
const getRootIndex = (p: INode): number => {
return p.node.value.properties.reduce((rootIndex: number, prop: INode, index: number): number => {
return prop.key.name === "root" ? index : rootIndex;
}, -1);
};
const isModulePresent = (p: INode): INode | false => {
const modules: INode[] = p.node.value.properties.filter(
(prop: INode): boolean => prop.key.name === "modules",
);
return modules.length > 0 && modules[0];
};
/**
*
* Add a `modules` property to the `resolve` object or update the existing one
* based on what is already in `resolve.root`
*
* @param {Node} p - ast node that represents the `resolve` property
* @returns {Node} ast - ast node
*/
const createModuleArray = (p: INode): INode => {
const rootVal: INode = getRootVal(p);
let modulesVal: INode[] = null;
if (rootVal.value.type === "ArrayExpression") {
modulesVal = rootVal.value.elements;
} else {
modulesVal = [rootVal.value];
}
let module: INode | false = isModulePresent(p);
if (!module) {
module = j.property(
"init",
j.identifier("modules"),
j.arrayExpression(modulesVal),
);
p.node.value.properties = p.node.value.properties.concat([module]);
} else {
module.value.elements = module.value.elements.concat(modulesVal);
}
const rootIndex: number = getRootIndex(p);
p.node.value.properties.splice(rootIndex, 1);
return p;
};
return ast
.find(j.Property)
.filter((p: INode): boolean => {
return (
p.node.key.name === "resolve" &&
p.node.value.properties.filter((prop: INode): boolean => prop.key.name === "root")
.length === 1
);
})
.forEach(createModuleArray);
}