-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathjavaScriptCodemod.ts
More file actions
42 lines (35 loc) · 1.25 KB
/
javaScriptCodemod.ts
File metadata and controls
42 lines (35 loc) · 1.25 KB
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
import {File} from '@babel/types';
import {parse, print} from 'recast';
import {parse as babelParser} from 'recast/parsers/babel-ts.js';
import {Codemod, CodemodOptions, ResultCode} from '@/application/project/code/transformation/codemod';
import {Language} from '@/application/project/code/transformation/javascript/utils/parse';
export type Configuration<O extends CodemodOptions> = {
codemod: Codemod<File, O>,
languages: Language[],
};
export class JavaScriptCodemod<O extends CodemodOptions> implements Codemod<string, O> {
private readonly codemod: Codemod<File, O>;
public constructor(configuration: Configuration<O>) {
this.codemod = configuration.codemod;
}
public async apply(input: string, options?: O): Promise<ResultCode<string>> {
const ast = parse(input, {
parser: {
parse: babelParser,
},
});
const result = await this.codemod.apply(ast, options);
if (!result.modified) {
return {
modified: false,
result: input,
};
}
return {
modified: true,
result: print(result.result, {
reuseWhitespace: false,
}).code,
};
}
}