forked from Yonava/magic-graphs
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtypeSync.mjs
More file actions
63 lines (49 loc) · 1.56 KB
/
typeSync.mjs
File metadata and controls
63 lines (49 loc) · 1.56 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
import fs from 'fs';
import path from 'path';
const CLIENT_DIR = './client/src';
const OUTPUT_FILE = './server/src/clientTypes.ts';
function extractInterfaces(fileContent) {
const interfaces = [];
const regex = /^((export type )|(export interface )|(type ))/gm;
const lines = fileContent.split('\n');
for (let i = 0; i < lines.length; i++) {
const isLineMatched = regex.test(lines[i]);
if (isLineMatched) {
const interfaceDef = [];
interfaceDef.push(lines[i]);
i++;
if (!lines[i]?.trim()) {
interfaces.push(interfaceDef.join('\n'));
continue;
}
while (lines[i] !== '}' && lines[i] !== undefined) {
interfaceDef.push(lines[i]);
i++;
}
if (lines[i] === '}') {
interfaceDef.push('}');
}
interfaces.push(interfaceDef.join('\n'));
}
}
return interfaces;
}
const allInterfaces = [];
function processDirectory(dir) {
fs.readdirSync(dir).forEach((file) => {
const filePath = path.join(dir, file);
const stat = fs.statSync(filePath);
if (stat.isDirectory()) {
processDirectory(filePath);
} else if (filePath.endsWith('.ts')) {
const fileContent = fs.readFileSync(filePath, 'utf8');
const interfacesInFile = extractInterfaces(fileContent);
allInterfaces.push(...interfacesInFile);
}
});
}
processDirectory(CLIENT_DIR);
const allContents = allInterfaces.map((content) => content.trim());
const outputContent = allContents.join('\n\n');
fs.writeFileSync(OUTPUT_FILE, outputContent, 'utf-8');
console.info('All synced up!');