-
Notifications
You must be signed in to change notification settings - Fork 87
Expand file tree
/
Copy pathgenerator.ts
More file actions
122 lines (107 loc) · 3.14 KB
/
generator.ts
File metadata and controls
122 lines (107 loc) · 3.14 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
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
import * as fs from "fs";
import { createSourceFile, ScriptTarget, SyntaxKind } from "typescript";
import { getAST } from "../../parsers/oracle/parser";
import { transform } from "../../transformers/do/transformer";
import { getDir,printFile } from "../lib/helper";
interface FunctionData {
functionName: string;
SDKFunctionName: string;
params: param[];
}
interface param {
name: string;
type: string;
typeName: string;
}
interface ClassData {
className: string;
functions: FunctionData[];
serviceName: string;
}
const dummyFile = process.cwd() + "/dummyClasses/do.js";
const dummyAst = createSourceFile(
dummyFile,
fs.readFileSync(dummyFile).toString(),
ScriptTarget.Latest,
true
);
export function extractSDKData(sdkClassAst, serviceClass) {
let methods: FunctionData[] = [];
const functions = [];
Object.keys(serviceClass).map((key, index) => {
functions.push(serviceClass[key].split(" ")[1]);
});
sdkClassAst.members.map(method => {
if (method.name && functions.includes(method.name.text)) {
let name;
Object.keys(serviceClass).map((key, index) => {
if (serviceClass[key].split(" ")[1] === method.name.text) {
name = key;
}
});
const parameters = [];
method.parameters.map(param => {
if (param.name.text !== "callback") {
const parameter = {
name: param.name.text,
optional: param.questionToken ? true : false,
type: SyntaxKind[param.type.kind],
typeName: null
};
if (parameter.type === "TypeReference" && param.type.typeName) {
parameter.typeName = param.type.typeName.text;
}
parameters.push(parameter);
}
});
methods.push({
functionName: name.toString(),
SDKFunctionName: method.name.text.toString(),
params: parameters
});
}
});
const classData: ClassData = {
className: sdkClassAst.name.text,
functions: methods,
serviceName: null
};
return classData;
}
export function generateOracleClass(serviceClass, serviceName) {
const sdkFile = serviceClass[Object.keys(serviceClass)[0]].split(" ")[0];
getAST(sdkFile).then(async result => {
const sdkClassAst = result;
try {
const classData: ClassData = extractSDKData(sdkClassAst, serviceClass);
classData.serviceName = serviceName;
const output = await transform(dummyAst, classData);
let filePath;
const dir = getDir(serviceName);
if (!fs.existsSync(process.cwd() + "/generatedClasses/DO/" + dir)) {
fs.mkdirSync(process.cwd() + "/generatedClasses/DO/" + dir);
}
if (/^[A-Z]*$/.test(serviceName)) {
filePath =
process.cwd() +
"/generatedClasses/DO/" +
dir +
"/do-" +
serviceName +
".js";
} else {
filePath =
process.cwd() +
"/generatedClasses/DO/" +
dir +
"/do-" +
serviceName.charAt(0).toLowerCase() +
serviceName.slice(1) +
".js";
}
printFile(filePath, output);
} catch (e) {
console.error(e);
}
});
}