This repository was archived by the owner on Sep 27, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 70
/
Copy pathformatGeneratedModule.ts
103 lines (93 loc) · 2.57 KB
/
formatGeneratedModule.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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
import { FormatModule } from "relay-compiler";
import * as ts from "typescript";
import addAnyTypeCast from "./addAnyTypeCast";
const createRequireRegex = () => /require\('(.*)'\)/g;
function getModuleName(path: string) {
const [moduleName] = path.replace("./", "").split(".");
return moduleName;
}
// collects all require calls and converts them top-level imports
const requireToImport = (content: string): string => {
const requireRegex = createRequireRegex();
// collect all require paths (unique)
const requirePaths = new Set<string>();
while (true) {
const res = requireRegex.exec(content);
if (res === null) {
break;
}
requirePaths.add(res[1]);
}
// replace all require paths
Array.from(requirePaths).forEach((requirePath) => {
content = content.replace(
`require('${requirePath}')`,
getModuleName(requirePath)
);
});
// create top-level imports
const topLevelImports = Array.from(requirePaths)
.sort()
.map(
(requirePath) =>
`import ${getModuleName(requirePath)} from "${requirePath.replace(
".ts",
""
)}";`
);
// add top-level imports
content = `${topLevelImports.join("\n")}
${content}`;
return content;
};
type FormatContentOptions = {
replaceRequire: boolean;
};
function formatContent(
rawContent: string,
options: FormatContentOptions
): string {
if (!options.replaceRequire) {
return rawContent;
}
return requireToImport(rawContent);
}
export const formatterFactory =
(compilerOptions: ts.CompilerOptions = {}): FormatModule =>
({
moduleName,
documentType,
docText,
concreteText,
typeText,
hash,
sourceHash,
}) => {
const { noImplicitAny, module = -1 } = compilerOptions;
const documentTypeImport = documentType
? `import { ${documentType} } from "relay-runtime";`
: "";
const docTextComment = docText ? "\n/*\n" + docText.trim() + "\n*/\n" : "";
let nodeStatement = `const node: ${
documentType || "never"
} = ${concreteText};`;
if (noImplicitAny) {
nodeStatement = addAnyTypeCast(nodeStatement).trim();
}
const rawContent = `${typeText || ""}
${docTextComment}
${nodeStatement}
(node as any).hash = '${sourceHash}';
export default node;
`;
const banner = compilerOptions.banner ? compilerOptions.banner + "\n" : "";
const content = `${banner}/* tslint:disable */
/* eslint-disable */
// @ts-nocheck
${hash ? `/* ${hash} */\n` : ""}
${documentTypeImport}
${formatContent(rawContent, {
replaceRequire: module >= ts.ModuleKind.ES2015,
})}`;
return content;
};