1 | import { Node } from 'estree-walker';
|
2 |
|
3 | interface Extractors {
|
4 | [key: string]: (names: Array<string>, param: Node) => void;
|
5 | }
|
6 |
|
7 | const extractors: Extractors = {
|
8 | ArrayPattern(names: Array<string>, param: Node) {
|
9 | for (const element of param.elements) {
|
10 | if (element) extractors[element.type](names, element);
|
11 | }
|
12 | },
|
13 |
|
14 | AssignmentPattern(names: Array<string>, param: Node) {
|
15 | extractors[param.left.type](names, param.left);
|
16 | },
|
17 |
|
18 | Identifier(names: Array<string>, param: Node) {
|
19 | names.push(param.name);
|
20 | },
|
21 |
|
22 | MemberExpression() {},
|
23 |
|
24 | ObjectPattern(names: Array<string>, param: Node) {
|
25 | for (const prop of param.properties) {
|
26 | if (prop.type === 'RestElement') {
|
27 | extractors.RestElement(names, prop);
|
28 | } else {
|
29 | extractors[prop.value.type](names, prop.value);
|
30 | }
|
31 | }
|
32 | },
|
33 |
|
34 | RestElement(names: Array<string>, param: Node) {
|
35 | extractors[param.argument.type](names, param.argument);
|
36 | }
|
37 | };
|
38 |
|
39 | const extractAssignedNames = function extractAssignedNames(param: Node): Array<string> {
|
40 | const names: Array<string> = [];
|
41 |
|
42 | extractors[param.type](names, param);
|
43 | return names;
|
44 | };
|
45 |
|
46 | export { extractAssignedNames as default };
|