forked from angular/angular-cli
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbuild-schema.ts
77 lines (67 loc) · 2.37 KB
/
build-schema.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
/**
* @license
* Copyright Google LLC All Rights Reserved.
*
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://angular.io/license
*/
import { logging } from '@angular-devkit/core';
import * as fs from 'fs';
import glob from 'glob';
import * as path from 'path';
export default async function (argv: {}, logger: logging.Logger) {
const allJsonFiles = glob.sync('packages/**/*.json', {
ignore: ['**/node_modules/**', '**/files/**', '**/*-files/**', '**/package.json'],
});
const dist = path.join(__dirname, '../dist-schema');
const quicktypeRunner = require('../tools/quicktype_runner');
logger.info('Removing dist-schema/...');
// The below should be removed and replace with just `rmSync` when support for Node.Js 12 is removed.
const { rmSync, rmdirSync } = fs as typeof fs & {
rmSync?: (
path: fs.PathLike,
options?: {
force?: boolean;
maxRetries?: number;
recursive?: boolean;
retryDelay?: number;
},
) => void;
};
if (rmSync) {
rmSync(dist, { force: true, recursive: true, maxRetries: 3 });
} else {
rmdirSync(dist, { recursive: true, maxRetries: 3 });
}
logger.info('Generating JSON Schema....');
for (const fileName of allJsonFiles) {
if (
fs.existsSync(fileName.replace(/\.json$/, '.ts')) ||
fs.existsSync(fileName.replace(/\.json$/, '.d.ts'))
) {
// Skip files that already exist.
continue;
}
const content = fs.readFileSync(fileName, 'utf-8');
let json;
try {
json = JSON.parse(content);
if (typeof json.$schema !== 'string' || !json.$schema.startsWith('http://json-schema.org/')) {
// Skip non-schema files.
continue;
}
} catch {
// malformed or JSON5
continue;
}
const tsContent = await quicktypeRunner.generate(fileName);
const tsPath = path.join(dist, fileName.replace(/\.json$/, '.ts'));
fs.mkdirSync(path.dirname(tsPath), { recursive: true });
fs.writeFileSync(tsPath, tsContent, 'utf-8');
}
// Angular CLI config schema
const cliJsonSchema = require('../tools/ng_cli_schema_generator');
const inputPath = 'packages/angular/cli/lib/config/workspace-schema.json';
const outputPath = path.join(dist, inputPath.replace('workspace-schema.json', 'schema.json'));
cliJsonSchema.generate(inputPath, outputPath);
}