forked from angular/angular-cli
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbuild-schema.ts
86 lines (74 loc) · 2.38 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
78
79
80
81
82
83
84
85
86
/**
* @license
* Copyright Google Inc. 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
*/
// tslint:disable:no-implicit-dependencies
import { logging } from '@angular-devkit/core';
import * as fs from 'fs';
import * as glob from 'glob';
import * as path from 'path';
function _mkdirp(p: string) {
// Create parent folder if necessary.
if (!fs.existsSync(path.dirname(p))) {
_mkdirp(path.dirname(p));
}
if (!fs.existsSync(p)) {
fs.mkdirSync(p);
}
}
function _rimraf(p: string) {
glob.sync(path.join(p, '**/*'), { dot: true, nodir: true })
.forEach(p => fs.unlinkSync(p));
glob.sync(path.join(p, '**/*'), { dot: true })
.sort((a, b) => b.length - a.length)
.forEach(p => fs.rmdirSync(p));
}
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/...');
_rimraf(dist);
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'));
_mkdirp(path.dirname(tsPath));
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);
}