-
Notifications
You must be signed in to change notification settings - Fork 22
/
replaceFileOption.ts
53 lines (50 loc) · 1.51 KB
/
replaceFileOption.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
import * as ast from "../../../core/ast/index.ts";
import {
Visitor,
visitor as defaultVisitor,
} from "../../../core/visitor/index.ts";
import { parseConstant } from "../../../core/parser/proto.ts";
import { createPrinter } from "../../../core/stringifier/printer.ts";
import {
PollapoRootReplaceFileOption,
PollapoRootReplaceFileOptionItem,
} from "../pollapoYml.ts";
export default function replaceFileOption(
ast: ast.Proto,
config: PollapoRootReplaceFileOption,
): ast.Proto {
return {
...ast,
statements: ast.statements.map((statement) => {
if (statement.type !== "option") return statement;
const optionNameText = trivialToString(statement.optionName);
if (!config[optionNameText]) return statement;
return {
...statement,
constant: replaceConstant(statement.constant, config[optionNameText]),
};
}),
};
}
function replaceConstant(
original: ast.Constant,
{ regex, value }: PollapoRootReplaceFileOptionItem,
): ast.Constant {
const old = trivialToString(original);
return parseConstant(old.replace(new RegExp(regex), value)).ast;
}
function trivialToString(trivial: ast.OptionName | ast.Constant): string {
const printer = createPrinter();
const stringifier: Visitor = {
...defaultVisitor,
visitToken(_, node) {
printer.print(node.text);
},
};
if (trivial.type === "option-name") {
stringifier.visitOptionName(stringifier, trivial);
} else {
stringifier.visitConstant(stringifier, trivial);
}
return printer.done();
}