-
-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathcli.ts
135 lines (112 loc) · 3.96 KB
/
cli.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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
import {program as commander} from 'commander';
import * as fs from 'fs-extra';
import * as path from 'path';
import {SchemaGenerator} from './';
import {FileSettings, SchemaGeneratorOptions} from './interfaces';
const {
description,
name,
version,
}: {
description: string;
name: string;
version: string;
} = require('../package.json');
commander.name(name).version(version).description(description);
const commanderOptions: {settings?: string; sourceDir?: string} = commander.opts();
commander
.option('-s, --settings <file>', 'Specify a settings file', 'settings.json')
.option('-d, --source-dir <dir>', 'Specify a source dir (will disable cloning)');
const settingsFile = commanderOptions.settings
? path.resolve(commanderOptions.settings)
: path.join(__dirname, '../settings.json');
commander
.command('update')
.option('-f, --force', 'Force re-generating schema(s)', false)
.option('-k, --schema [schema]', 'Select single schema to update')
.action(async (updateOptions: {force?: boolean; schema?: string}) => {
try {
const settings: FileSettings = await fs.readJSON(settingsFile);
await update({
...settings,
...(commanderOptions.sourceDir && {source: commanderOptions.sourceDir}),
...(updateOptions.schema && {schema: updateOptions.schema}),
force: !!updateOptions.force,
});
} catch (error) {
console.error(error);
process.exit(1);
}
});
commander.command('check-disabled').action(async () => {
try {
const settings = await fs.readJSON(settingsFile);
await checkDisabled({...settings});
} catch (error) {
console.error(error);
process.exit(1);
}
});
commander.command('check-versions').action(async () => {
try {
const fileSettings = await fs.readJSON(settingsFile);
const generator = new SchemaGenerator({...fileSettings});
await generator.checkHashsums();
await generator.checkVersions();
} catch (error) {
console.error(error);
process.exit(1);
}
});
commander.command('fix-lockfile').action(async () => {
try {
const fileSettings = await fs.readJSON(settingsFile);
const generator = new SchemaGenerator({...fileSettings});
await generator.checkHashsums();
await generator.fixLockfile();
} catch (error) {
console.error(error);
process.exit(1);
}
});
commander.parse(process.argv);
if (!commander.args.length) {
commander.outputHelp();
process.exit();
}
async function update(
settings: SchemaGeneratorOptions & Required<Pick<SchemaGeneratorOptions, 'disabledSchemas'>>
): Promise<{sourceDir: string}> {
const generator = new SchemaGenerator(settings);
await generator.checkVersions();
await generator.checkHashsums();
const {disabledSchemas: newDisabledSchemas, generatedSchemas} = await generator.generateAll();
if (generatedSchemas.length) {
console.info('Generated schemas:', generatedSchemas);
} else {
console.info('No schemas generated.');
}
if (newDisabledSchemas.length) {
console.info('These schemas will be disabled:', newDisabledSchemas);
settings.disabledSchemas = settings.disabledSchemas.concat(newDisabledSchemas).sort();
delete settings.force;
delete settings.source;
await fs.writeFile(settingsFile, `${JSON.stringify(settings, null, 2)}\n`);
}
return {sourceDir: generator.options.source};
}
async function checkDisabled(settings: FileSettings, versionCheck = true): Promise<void> {
const generator = new SchemaGenerator(settings);
if (versionCheck) {
await generator.checkVersions();
await generator.checkHashsums();
}
const {enabledSchemas} = await generator.checkDisabled();
if (enabledSchemas.length) {
const enabledSchemaFiles = enabledSchemas.map(schema => `${schema}.json`);
settings.disabledSchemas = settings.disabledSchemas.filter(schema => !enabledSchemaFiles.includes(schema)).sort();
await fs.writeFile(settingsFile, `${JSON.stringify(settings, null, 2)}\n`);
} else {
console.info('No schemas generated.');
}
}