-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathstate.ts
36 lines (29 loc) · 850 Bytes
/
state.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
import * as fs from 'fs';
import * as path from 'path';
const projectPath = path.join(process.cwd(), process.argv[1]);
const stateFilePath = path.join(projectPath, 'state.json');
interface State {
save():void;
}
function loadState():State {
try {
return JSON.parse(fs.readFileSync(stateFilePath, 'utf8'));
} catch (err) {
return {} as State;
}
}
export const state = loadState();
let saving:Promise<void>|null = null;
let saveRequest = false;
Object.setPrototypeOf(state, {
save():Promise<void> {
saveRequest = true;
if (saving !== null) return saving;
return saving = (async()=>{
while (saveRequest) {
saveRequest = false;
await fs.promises.writeFile(stateFilePath, JSON.stringify(state, null, 4));
}
})();
},
});