cdk-common 2.0.30 → 2.0.34
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.jsii +4 -4
- package/lib/main.js +1 -1
- package/node_modules/@aws-cdk/assert/LICENSE +1 -1
- package/node_modules/@aws-cdk/assert/NOTICE +1 -1
- package/node_modules/@aws-cdk/assert/package.json +9 -9
- package/node_modules/@aws-cdk/cfnspec/CHANGELOG.md +16 -0
- package/node_modules/@aws-cdk/cfnspec/build-tools/build.js +7 -53
- package/node_modules/@aws-cdk/cfnspec/build-tools/massage-spec.d.ts +0 -4
- package/node_modules/@aws-cdk/cfnspec/build-tools/massage-spec.js +2 -61
- package/node_modules/@aws-cdk/cfnspec/build-tools/patch-set.d.ts +25 -0
- package/node_modules/@aws-cdk/cfnspec/build-tools/patch-set.js +239 -0
- package/node_modules/@aws-cdk/cfnspec/build-tools/report-issues.d.ts +4 -0
- package/node_modules/@aws-cdk/cfnspec/build-tools/report-issues.js +44 -0
- package/node_modules/@aws-cdk/cfnspec/build-tools/split-spec-by-service.d.ts +1 -0
- package/node_modules/@aws-cdk/cfnspec/build-tools/split-spec-by-service.js +86 -0
- package/node_modules/@aws-cdk/cfnspec/build-tools/template/LICENSE +1 -1
- package/node_modules/@aws-cdk/cfnspec/build-tools/template/NOTICE +1 -1
- package/node_modules/@aws-cdk/cfnspec/build-tools/update-metrics.sh +2 -0
- package/node_modules/@aws-cdk/cfnspec/build-tools/update.sh +34 -18
- package/node_modules/@aws-cdk/cfnspec/build-tools/validate-cfn.d.ts +67 -0
- package/node_modules/@aws-cdk/cfnspec/build-tools/validate-cfn.js +285 -0
- package/node_modules/@aws-cdk/cfnspec/coverage/build-tools/index.html +49 -20
- package/node_modules/@aws-cdk/cfnspec/coverage/build-tools/massage-spec.ts.html +12 -166
- package/node_modules/@aws-cdk/cfnspec/coverage/build-tools/patch-set.ts.html +907 -0
- package/node_modules/@aws-cdk/cfnspec/coverage/build-tools/scrutiny.ts.html +1 -2
- package/node_modules/@aws-cdk/cfnspec/coverage/build-tools/validate-cfn.ts.html +1093 -0
- package/node_modules/@aws-cdk/cfnspec/coverage/index.html +34 -35
- package/node_modules/@aws-cdk/cfnspec/coverage/junit.xml +6217 -6177
- package/node_modules/@aws-cdk/cfnspec/coverage/lcov-report/build-tools/index.html +49 -20
- package/node_modules/@aws-cdk/cfnspec/coverage/lcov-report/build-tools/massage-spec.ts.html +12 -166
- package/node_modules/@aws-cdk/cfnspec/coverage/lcov-report/build-tools/patch-set.ts.html +907 -0
- package/node_modules/@aws-cdk/cfnspec/coverage/lcov-report/build-tools/scrutiny.ts.html +1 -2
- package/node_modules/@aws-cdk/cfnspec/coverage/lcov-report/build-tools/validate-cfn.ts.html +1093 -0
- package/node_modules/@aws-cdk/cfnspec/coverage/lcov-report/index.html +34 -35
- package/node_modules/@aws-cdk/cfnspec/coverage/lcov-report/lib/canned-metrics/canned-metrics-schema.ts.html +2 -3
- package/node_modules/@aws-cdk/cfnspec/coverage/lcov-report/lib/canned-metrics/index.html +1 -2
- package/node_modules/@aws-cdk/cfnspec/coverage/lcov-report/lib/canned-metrics.ts.html +22 -23
- package/node_modules/@aws-cdk/cfnspec/coverage/lcov-report/lib/index.html +19 -20
- package/node_modules/@aws-cdk/cfnspec/coverage/lcov-report/lib/index.ts.html +96 -25
- package/node_modules/@aws-cdk/cfnspec/coverage/lcov-report/lib/schema/augmentation.ts.html +5 -6
- package/node_modules/@aws-cdk/cfnspec/coverage/lcov-report/lib/schema/base-types.ts.html +12 -13
- package/node_modules/@aws-cdk/cfnspec/coverage/lcov-report/lib/schema/index.html +7 -8
- package/node_modules/@aws-cdk/cfnspec/coverage/lcov-report/lib/schema/index.ts.html +11 -12
- package/node_modules/@aws-cdk/cfnspec/coverage/lcov-report/lib/schema/property.ts.html +39 -40
- package/node_modules/@aws-cdk/cfnspec/coverage/lcov-report/lib/schema/resource-type.ts.html +20 -21
- package/node_modules/@aws-cdk/cfnspec/coverage/lcov-report/lib/schema/specification.ts.html +2 -3
- package/node_modules/@aws-cdk/cfnspec/coverage/lcov.info +744 -346
- package/node_modules/@aws-cdk/cfnspec/coverage/lib/canned-metrics/canned-metrics-schema.ts.html +2 -3
- package/node_modules/@aws-cdk/cfnspec/coverage/lib/canned-metrics/index.html +1 -2
- package/node_modules/@aws-cdk/cfnspec/coverage/lib/canned-metrics.ts.html +22 -23
- package/node_modules/@aws-cdk/cfnspec/coverage/lib/index.html +19 -20
- package/node_modules/@aws-cdk/cfnspec/coverage/lib/index.ts.html +96 -25
- package/node_modules/@aws-cdk/cfnspec/coverage/lib/schema/augmentation.ts.html +5 -6
- package/node_modules/@aws-cdk/cfnspec/coverage/lib/schema/base-types.ts.html +12 -13
- package/node_modules/@aws-cdk/cfnspec/coverage/lib/schema/index.html +7 -8
- package/node_modules/@aws-cdk/cfnspec/coverage/lib/schema/index.ts.html +11 -12
- package/node_modules/@aws-cdk/cfnspec/coverage/lib/schema/property.ts.html +39 -40
- package/node_modules/@aws-cdk/cfnspec/coverage/lib/schema/resource-type.ts.html +20 -21
- package/node_modules/@aws-cdk/cfnspec/coverage/lib/schema/specification.ts.html +2 -3
- package/node_modules/@aws-cdk/cfnspec/lib/canned-metrics/README.md +6 -1
- package/node_modules/@aws-cdk/cfnspec/lib/canned-metrics/services.json +19997 -10215
- package/node_modules/@aws-cdk/cfnspec/lib/index.d.ts +8 -0
- package/node_modules/@aws-cdk/cfnspec/lib/index.js +25 -2
- package/node_modules/@aws-cdk/cfnspec/lib/schema/docs.d.ts +20 -0
- package/node_modules/@aws-cdk/cfnspec/lib/schema/docs.js +3 -0
- package/node_modules/@aws-cdk/cfnspec/lib/schema/index.d.ts +1 -0
- package/node_modules/@aws-cdk/cfnspec/lib/schema/index.js +2 -1
- package/node_modules/@aws-cdk/cfnspec/package.json +5 -5
- package/node_modules/@aws-cdk/cfnspec/spec/cfn-docs.json +38910 -0
- package/node_modules/@aws-cdk/cfnspec/spec/cfn-lint.json +3 -3
- package/node_modules/@aws-cdk/cfnspec/spec/specification.json +319 -311
- package/node_modules/@aws-cdk/cfnspec/tsconfig.tsbuildinfo +285 -179
- package/node_modules/@aws-cdk/cloudformation-diff/LICENSE +1 -1
- package/node_modules/@aws-cdk/cloudformation-diff/NOTICE +1 -1
- package/node_modules/@aws-cdk/cloudformation-diff/package.json +7 -7
- package/package.json +5 -5
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.writeSorted = exports.applyAndWrite = exports.applyPatchSet = exports.evaluatePatchSet = exports.loadPatchSet = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Apply a JSON patch set into the given target file
|
|
6
|
+
*
|
|
7
|
+
* The sources can be taken from one or more directories.
|
|
8
|
+
*/
|
|
9
|
+
const path = require("path");
|
|
10
|
+
const fastJsonPatch = require("fast-json-patch");
|
|
11
|
+
const fs = require("fs-extra");
|
|
12
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
13
|
+
const sortJson = require('sort-json');
|
|
14
|
+
async function loadPatchSet(sourceDirectory, relativeTo = process.cwd()) {
|
|
15
|
+
const ret = {};
|
|
16
|
+
const files = await fs.readdir(sourceDirectory);
|
|
17
|
+
for (const file of files) {
|
|
18
|
+
const fullFile = path.join(sourceDirectory, file);
|
|
19
|
+
const relName = path.relative(relativeTo, fullFile);
|
|
20
|
+
if ((await fs.stat(fullFile)).isDirectory()) {
|
|
21
|
+
ret[relName] = {
|
|
22
|
+
type: 'set',
|
|
23
|
+
sources: await loadPatchSet(fullFile, sourceDirectory),
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
else if (file.endsWith('.json')) {
|
|
27
|
+
ret[relName] = {
|
|
28
|
+
type: file.indexOf('patch') === -1 ? 'fragment' : 'patch',
|
|
29
|
+
data: await fs.readJson(fullFile),
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return ret;
|
|
34
|
+
}
|
|
35
|
+
exports.loadPatchSet = loadPatchSet;
|
|
36
|
+
function evaluatePatchSet(sources, options = {}) {
|
|
37
|
+
const targetObject = {};
|
|
38
|
+
for (const key of Object.keys(sources).sort()) {
|
|
39
|
+
const value = sources[key];
|
|
40
|
+
switch (value.type) {
|
|
41
|
+
case 'fragment':
|
|
42
|
+
log(key);
|
|
43
|
+
merge(targetObject, value.data, []);
|
|
44
|
+
break;
|
|
45
|
+
case 'patch':
|
|
46
|
+
patch(targetObject, value.data, (m) => log(`${key}: ${m}`));
|
|
47
|
+
break;
|
|
48
|
+
case 'set':
|
|
49
|
+
const evaluated = evaluatePatchSet(value.sources, options);
|
|
50
|
+
log(key);
|
|
51
|
+
merge(targetObject, evaluated, []);
|
|
52
|
+
break;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return targetObject;
|
|
56
|
+
function log(x) {
|
|
57
|
+
if (!options.quiet) {
|
|
58
|
+
// eslint-disable-next-line no-console
|
|
59
|
+
console.log(x);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
exports.evaluatePatchSet = evaluatePatchSet;
|
|
64
|
+
/**
|
|
65
|
+
* Load a patch set from a directory
|
|
66
|
+
*/
|
|
67
|
+
async function applyPatchSet(sourceDirectory, options = {}) {
|
|
68
|
+
const patches = await loadPatchSet(sourceDirectory);
|
|
69
|
+
return evaluatePatchSet(patches, options);
|
|
70
|
+
}
|
|
71
|
+
exports.applyPatchSet = applyPatchSet;
|
|
72
|
+
/**
|
|
73
|
+
* Load a patch set and write it out to a file
|
|
74
|
+
*/
|
|
75
|
+
async function applyAndWrite(targetFile, sourceDirectory, options = {}) {
|
|
76
|
+
const model = await applyPatchSet(sourceDirectory, options);
|
|
77
|
+
await writeSorted(targetFile, model);
|
|
78
|
+
}
|
|
79
|
+
exports.applyAndWrite = applyAndWrite;
|
|
80
|
+
async function writeSorted(targetFile, data) {
|
|
81
|
+
await fs.mkdirp(path.dirname(targetFile));
|
|
82
|
+
await fs.writeJson(targetFile, sortJson(data), { spaces: 2 });
|
|
83
|
+
}
|
|
84
|
+
exports.writeSorted = writeSorted;
|
|
85
|
+
function printSorted(data) {
|
|
86
|
+
process.stdout.write(JSON.stringify(sortJson(data), undefined, 2));
|
|
87
|
+
}
|
|
88
|
+
function merge(target, fragment, jsonPath) {
|
|
89
|
+
if (!fragment) {
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
if (!target || typeof target !== 'object' || Array.isArray(target)) {
|
|
93
|
+
throw new Error(`Expected object, found: '${target}' at '$.${jsonPath.join('.')}'`);
|
|
94
|
+
}
|
|
95
|
+
for (const key of Object.keys(fragment)) {
|
|
96
|
+
if (key.startsWith('$')) {
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
if (key in target) {
|
|
100
|
+
const specVal = target[key];
|
|
101
|
+
const fragVal = fragment[key];
|
|
102
|
+
if (typeof specVal !== typeof fragVal) {
|
|
103
|
+
// eslint-disable-next-line max-len
|
|
104
|
+
throw new Error(`Attempted to merge ${JSON.stringify(fragVal)} into incompatible ${JSON.stringify(specVal)} at path ${jsonPath.join('/')}/${key}`);
|
|
105
|
+
}
|
|
106
|
+
if (specVal == fragVal) {
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
if (typeof specVal !== 'object') {
|
|
110
|
+
// eslint-disable-next-line max-len
|
|
111
|
+
throw new Error(`Conflict when attempting to merge ${JSON.stringify(fragVal)} into ${JSON.stringify(specVal)} at path ${jsonPath.join('/')}/${key}`);
|
|
112
|
+
}
|
|
113
|
+
merge(specVal, fragVal, [...jsonPath, key]);
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
target[key] = fragment[key];
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
function patch(target, fragment, log) {
|
|
121
|
+
var _a;
|
|
122
|
+
if (!fragment) {
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
const patches = findPatches(target, fragment);
|
|
126
|
+
for (const p of patches) {
|
|
127
|
+
log((_a = p.description) !== null && _a !== void 0 ? _a : '');
|
|
128
|
+
try {
|
|
129
|
+
fastJsonPatch.applyPatch(target, p.operations);
|
|
130
|
+
}
|
|
131
|
+
catch (e) {
|
|
132
|
+
throw new Error(`error applying patch: ${JSON.stringify(p, undefined, 2)}: ${e.message}`);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Find the sets of patches to apply in a document
|
|
138
|
+
*
|
|
139
|
+
* Adjusts paths to be root-relative, which makes it possible to have paths
|
|
140
|
+
* point outside the patch scope.
|
|
141
|
+
*/
|
|
142
|
+
function findPatches(data, patchSource) {
|
|
143
|
+
const ret = [];
|
|
144
|
+
recurse(data, patchSource, []);
|
|
145
|
+
return ret;
|
|
146
|
+
function recurse(actualData, fragment, jsonPath) {
|
|
147
|
+
if (!fragment) {
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
if ('patch' in fragment) {
|
|
151
|
+
const p = fragment.patch;
|
|
152
|
+
if (!p.operations) {
|
|
153
|
+
throw new Error(`Patch needs 'operations' key, got: ${JSON.stringify(p)}`);
|
|
154
|
+
}
|
|
155
|
+
ret.push({
|
|
156
|
+
description: p.description,
|
|
157
|
+
operations: p.operations.map((op) => adjustPaths(op, jsonPath)),
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
else if ('patch:each' in fragment) {
|
|
161
|
+
const p = fragment['patch:each'];
|
|
162
|
+
if (typeof actualData !== 'object') {
|
|
163
|
+
throw new Error(`Patch ${p.description}: expecting object in data, found '${actualData}'`);
|
|
164
|
+
}
|
|
165
|
+
if (!p.operations) {
|
|
166
|
+
throw new Error(`Patch needs 'operations' key, got: ${JSON.stringify(p)}`);
|
|
167
|
+
}
|
|
168
|
+
for (const key in actualData) {
|
|
169
|
+
ret.push({
|
|
170
|
+
description: `${key}: ${p.description}`,
|
|
171
|
+
operations: p.operations.map((op) => adjustPaths(op, [...jsonPath, key])),
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
for (const key of Object.keys(fragment)) {
|
|
177
|
+
if (!(key in actualData)) {
|
|
178
|
+
actualData[key] = {};
|
|
179
|
+
}
|
|
180
|
+
recurse(actualData[key], fragment[key], [...jsonPath, key]);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
function adjustPaths(op, jsonPath) {
|
|
185
|
+
return {
|
|
186
|
+
...op,
|
|
187
|
+
...op.path ? { path: adjustPath(op.path, jsonPath) } : undefined,
|
|
188
|
+
...op.from ? { from: adjustPath(op.from, jsonPath) } : undefined,
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Adjust path
|
|
193
|
+
*
|
|
194
|
+
* '$/' means from the root, otherwise interpret as relative path.
|
|
195
|
+
*/
|
|
196
|
+
function adjustPath(originalPath, jsonPath) {
|
|
197
|
+
if (typeof originalPath !== 'string') {
|
|
198
|
+
throw new Error(`adjustPath: expected string, got ${JSON.stringify(originalPath)}`);
|
|
199
|
+
}
|
|
200
|
+
if (originalPath.startsWith('$/')) {
|
|
201
|
+
return originalPath.substr(1);
|
|
202
|
+
}
|
|
203
|
+
return jsonPath.map(p => `/${p}`).join('') + originalPath;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Run this file as a CLI tool, to apply a patch set from the command line
|
|
208
|
+
*/
|
|
209
|
+
async function main(args) {
|
|
210
|
+
const quiet = eatArg('-q', args) || eatArg('--quiet', args);
|
|
211
|
+
if (args.length < 1) {
|
|
212
|
+
throw new Error('Usage: patch-set <DIR> [<FILE>]');
|
|
213
|
+
}
|
|
214
|
+
const [dir, targetFile] = args;
|
|
215
|
+
const model = await applyPatchSet(dir, { quiet });
|
|
216
|
+
if (targetFile) {
|
|
217
|
+
await writeSorted(targetFile, model);
|
|
218
|
+
}
|
|
219
|
+
else {
|
|
220
|
+
printSorted(model);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
function eatArg(arg, args) {
|
|
224
|
+
for (let i = 0; i < args.length; i++) {
|
|
225
|
+
if (args[i] === arg) {
|
|
226
|
+
args.splice(i, 1);
|
|
227
|
+
return true;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
return false;
|
|
231
|
+
}
|
|
232
|
+
if (require.main === module) {
|
|
233
|
+
main(process.argv.slice(2)).catch(e => {
|
|
234
|
+
process.exitCode = 1;
|
|
235
|
+
// eslint-disable-next-line no-console
|
|
236
|
+
console.error(e.message);
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF0Y2gtc2V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsicGF0Y2gtc2V0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBOzs7O0dBSUc7QUFDSCw2QkFBNkI7QUFDN0IsaURBQWlEO0FBQ2pELCtCQUErQjtBQUUvQixpRUFBaUU7QUFDakUsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBYy9CLEtBQUssVUFBVSxZQUFZLENBQUMsZUFBdUIsRUFBRSxVQUFVLEdBQUcsT0FBTyxDQUFDLEdBQUcsRUFBRTtJQUNwRixNQUFNLEdBQUcsR0FBYSxFQUFFLENBQUM7SUFFekIsTUFBTSxLQUFLLEdBQUcsTUFBTSxFQUFFLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQ2hELEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxFQUFFO1FBQ3hCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2xELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBRXBELElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRTtZQUMzQyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUc7Z0JBQ2IsSUFBSSxFQUFFLEtBQUs7Z0JBQ1gsT0FBTyxFQUFFLE1BQU0sWUFBWSxDQUFDLFFBQVEsRUFBRSxlQUFlLENBQUM7YUFDdkQsQ0FBQztTQUNIO2FBQU0sSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ2pDLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRztnQkFDYixJQUFJLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxPQUFPO2dCQUN6RCxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQzthQUNsQyxDQUFDO1NBQ0g7S0FDRjtJQUVELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQXRCRCxvQ0FzQkM7QUFFRCxTQUFnQixnQkFBZ0IsQ0FBQyxPQUFpQixFQUFFLFVBQXdCLEVBQUU7SUFDNUUsTUFBTSxZQUFZLEdBQVEsRUFBRSxDQUFDO0lBRTdCLEtBQUssTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtRQUM3QyxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFM0IsUUFBUSxLQUFLLENBQUMsSUFBSSxFQUFFO1lBQ2xCLEtBQUssVUFBVTtnQkFDYixHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ1QsS0FBSyxDQUFDLFlBQVksRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUNwQyxNQUFNO1lBQ1IsS0FBSyxPQUFPO2dCQUNWLEtBQUssQ0FBQyxZQUFZLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDNUQsTUFBTTtZQUNSLEtBQUssS0FBSztnQkFDUixNQUFNLFNBQVMsR0FBRyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dCQUMzRCxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ1QsS0FBSyxDQUFDLFlBQVksRUFBRSxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQ25DLE1BQU07U0FDVDtLQUNGO0lBRUQsT0FBTyxZQUFZLENBQUM7SUFFcEIsU0FBUyxHQUFHLENBQUMsQ0FBUztRQUNwQixJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRTtZQUNsQixzQ0FBc0M7WUFDdEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNoQjtJQUNILENBQUM7QUFDSCxDQUFDO0FBOUJELDRDQThCQztBQUVEOztHQUVHO0FBQ0ksS0FBSyxVQUFVLGFBQWEsQ0FBQyxlQUF1QixFQUFFLFVBQXdCLEVBQUU7SUFDckYsTUFBTSxPQUFPLEdBQUcsTUFBTSxZQUFZLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDcEQsT0FBTyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDNUMsQ0FBQztBQUhELHNDQUdDO0FBRUQ7O0dBRUc7QUFDSSxLQUFLLFVBQVUsYUFBYSxDQUFDLFVBQWtCLEVBQUUsZUFBdUIsRUFBRSxVQUF3QixFQUFFO0lBQ3pHLE1BQU0sS0FBSyxHQUFHLE1BQU0sYUFBYSxDQUFDLGVBQWUsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUM1RCxNQUFNLFdBQVcsQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDdkMsQ0FBQztBQUhELHNDQUdDO0FBRU0sS0FBSyxVQUFVLFdBQVcsQ0FBQyxVQUFrQixFQUFFLElBQVM7SUFDN0QsTUFBTSxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztJQUMxQyxNQUFNLEVBQUUsQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2hFLENBQUM7QUFIRCxrQ0FHQztBQUVELFNBQVMsV0FBVyxDQUFDLElBQVM7SUFDNUIsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDckUsQ0FBQztBQUVELFNBQVMsS0FBSyxDQUFDLE1BQVcsRUFBRSxRQUFhLEVBQUUsUUFBa0I7SUFDM0QsSUFBSSxDQUFDLFFBQVEsRUFBRTtRQUFFLE9BQU87S0FBRTtJQUMxQixJQUFJLENBQUMsTUFBTSxJQUFJLE9BQU8sTUFBTSxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1FBQ2xFLE1BQU0sSUFBSSxLQUFLLENBQUMsNEJBQTRCLE1BQU0sV0FBVyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztLQUNyRjtJQUVELEtBQUssTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRTtRQUN2QyxJQUFJLEdBQUcsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFBRSxTQUFTO1NBQUU7UUFFdEMsSUFBSSxHQUFHLElBQUksTUFBTSxFQUFFO1lBQ2pCLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM1QixNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDOUIsSUFBSSxPQUFPLE9BQU8sS0FBSyxPQUFPLE9BQU8sRUFBRTtnQkFDckMsbUNBQW1DO2dCQUNuQyxNQUFNLElBQUksS0FBSyxDQUFDLHNCQUFzQixJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxzQkFBc0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsWUFBWSxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUM7YUFDcEo7WUFDRCxJQUFJLE9BQU8sSUFBSSxPQUFPLEVBQUU7Z0JBQ3RCLFNBQVM7YUFDVjtZQUNELElBQUksT0FBTyxPQUFPLEtBQUssUUFBUSxFQUFFO2dCQUMvQixtQ0FBbUM7Z0JBQ25DLE1BQU0sSUFBSSxLQUFLLENBQUMscUNBQXFDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFNBQVMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsWUFBWSxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUM7YUFDdEo7WUFDRCxLQUFLLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxDQUFDLEdBQUcsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDN0M7YUFBTTtZQUNMLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDN0I7S0FDRjtBQUNILENBQUM7QUFFRCxTQUFTLEtBQUssQ0FBQyxNQUFXLEVBQUUsUUFBYSxFQUFFLEdBQXdCOztJQUNqRSxJQUFJLENBQUMsUUFBUSxFQUFFO1FBQUUsT0FBTztLQUFFO0lBRTFCLE1BQU0sT0FBTyxHQUFHLFdBQVcsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDOUMsS0FBSyxNQUFNLENBQUMsSUFBSSxPQUFPLEVBQUU7UUFDdkIsR0FBRyxPQUFDLENBQUMsQ0FBQyxXQUFXLG1DQUFJLEVBQUUsQ0FBQyxDQUFDO1FBRXpCLElBQUk7WUFDRixhQUFhLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDaEQ7UUFBQyxPQUFPLENBQUMsRUFBRTtZQUNWLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztTQUMzRjtLQUNGO0FBQ0gsQ0FBQztBQWdCRDs7Ozs7R0FLRztBQUNILFNBQVMsV0FBVyxDQUFDLElBQVMsRUFBRSxXQUFnQjtJQUM5QyxNQUFNLEdBQUcsR0FBWSxFQUFFLENBQUM7SUFDeEIsT0FBTyxDQUFDLElBQUksRUFBRSxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDL0IsT0FBTyxHQUFHLENBQUM7SUFFWCxTQUFTLE9BQU8sQ0FBQyxVQUFlLEVBQUUsUUFBYSxFQUFFLFFBQWtCO1FBQ2pFLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFBRSxPQUFPO1NBQUU7UUFFMUIsSUFBSSxPQUFPLElBQUksUUFBUSxFQUFFO1lBQ3ZCLE1BQU0sQ0FBQyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUM7WUFDekIsSUFBSSxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUU7Z0JBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsc0NBQXNDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2FBQzVFO1lBQ0QsR0FBRyxDQUFDLElBQUksQ0FBQztnQkFDUCxXQUFXLEVBQUUsQ0FBQyxDQUFDLFdBQVc7Z0JBQzFCLFVBQVUsRUFBRSxDQUFDLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQU8sRUFBRSxFQUFFLENBQUMsV0FBVyxDQUFDLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQzthQUNyRSxDQUFDLENBQUM7U0FDSjthQUFNLElBQUksWUFBWSxJQUFJLFFBQVEsRUFBRTtZQUNuQyxNQUFNLENBQUMsR0FBRyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDakMsSUFBSSxPQUFPLFVBQVUsS0FBSyxRQUFRLEVBQUU7Z0JBQ2xDLE1BQU0sSUFBSSxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsV0FBVyxzQ0FBc0MsVUFBVSxHQUFHLENBQUMsQ0FBQzthQUM1RjtZQUNELElBQUksQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFO2dCQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLHNDQUFzQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQzthQUM1RTtZQUNELEtBQUssTUFBTSxHQUFHLElBQUksVUFBVSxFQUFFO2dCQUM1QixHQUFHLENBQUMsSUFBSSxDQUFDO29CQUNQLFdBQVcsRUFBRSxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUMsV0FBVyxFQUFFO29CQUN2QyxVQUFVLEVBQUUsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFPLEVBQUUsRUFBRSxDQUFDLFdBQVcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO2lCQUMvRSxDQUFDLENBQUM7YUFDSjtTQUNGO2FBQU07WUFDTCxLQUFLLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUU7Z0JBQ3ZDLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxVQUFVLENBQUMsRUFBRTtvQkFDeEIsVUFBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztpQkFDdEI7Z0JBQ0QsT0FBTyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO2FBQzdEO1NBQ0Y7SUFDSCxDQUFDO0lBRUQsU0FBUyxXQUFXLENBQUMsRUFBTyxFQUFFLFFBQWtCO1FBQzlDLE9BQU87WUFDTCxHQUFHLEVBQUU7WUFDTCxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLFVBQVUsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVM7WUFDaEUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxVQUFVLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTO1NBQ2pFLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFNBQVMsVUFBVSxDQUFDLFlBQW9CLEVBQUUsUUFBa0I7UUFDMUQsSUFBSSxPQUFPLFlBQVksS0FBSyxRQUFRLEVBQUU7WUFDcEMsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQ0FBb0MsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDckY7UUFDRCxJQUFJLFlBQVksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDakMsT0FBTyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQy9CO1FBQ0QsT0FBTyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxZQUFZLENBQUM7SUFDNUQsQ0FBQztBQUNILENBQUM7QUFHRDs7R0FFRztBQUNILEtBQUssVUFBVSxJQUFJLENBQUMsSUFBYztJQUNoQyxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLE1BQU0sQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFFNUQsSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtRQUNuQixNQUFNLElBQUksS0FBSyxDQUFDLGlDQUFpQyxDQUFDLENBQUM7S0FDcEQ7SUFFRCxNQUFNLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxHQUFHLElBQUksQ0FBQztJQUUvQixNQUFNLEtBQUssR0FBRyxNQUFNLGFBQWEsQ0FBQyxHQUFHLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ2xELElBQUksVUFBVSxFQUFFO1FBQ2QsTUFBTSxXQUFXLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDO0tBQ3RDO1NBQU07UUFDTCxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7S0FDcEI7QUFDSCxDQUFDO0FBRUQsU0FBUyxNQUFNLENBQUMsR0FBVyxFQUFFLElBQWM7SUFDekMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDcEMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxFQUFFO1lBQ25CLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ2xCLE9BQU8sSUFBSSxDQUFDO1NBQ2I7S0FDRjtJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVELElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxNQUFNLEVBQUU7SUFDM0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFO1FBQ3BDLE9BQU8sQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDO1FBQ3JCLHNDQUFzQztRQUN0QyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMzQixDQUFDLENBQUMsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiXG4vKipcbiAqIEFwcGx5IGEgSlNPTiBwYXRjaCBzZXQgaW50byB0aGUgZ2l2ZW4gdGFyZ2V0IGZpbGVcbiAqXG4gKiBUaGUgc291cmNlcyBjYW4gYmUgdGFrZW4gZnJvbSBvbmUgb3IgbW9yZSBkaXJlY3Rvcmllcy5cbiAqL1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIGZhc3RKc29uUGF0Y2ggZnJvbSAnZmFzdC1qc29uLXBhdGNoJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzLWV4dHJhJztcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbmNvbnN0IHNvcnRKc29uID0gcmVxdWlyZSgnc29ydC1qc29uJyk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGF0Y2hPcHRpb25zIHtcbiAgcmVhZG9ubHkgcXVpZXQ/OiBib29sZWFuO1xufVxuXG5leHBvcnQgdHlwZSBQYXRjaFNldCA9IFJlY29yZDxzdHJpbmcsIFBhdGNoU2V0RWxlbWVudD47XG5cbmV4cG9ydCB0eXBlIFBhdGNoU2V0RWxlbWVudCA9XG4gIHwgeyByZWFkb25seSB0eXBlOiAnZnJhZ21lbnQnOyByZWFkb25seSBkYXRhOiBhbnkgfVxuICB8IHsgcmVhZG9ubHkgdHlwZTogJ3BhdGNoJzsgcmVhZG9ubHkgZGF0YTogYW55IH1cbiAgfCB7IHJlYWRvbmx5IHR5cGU6ICdzZXQnOyByZWFkb25seSBzb3VyY2VzOiBQYXRjaFNldCB9XG4gIDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRQYXRjaFNldChzb3VyY2VEaXJlY3Rvcnk6IHN0cmluZywgcmVsYXRpdmVUbyA9IHByb2Nlc3MuY3dkKCkpOiBQcm9taXNlPFBhdGNoU2V0PiB7XG4gIGNvbnN0IHJldDogUGF0Y2hTZXQgPSB7fTtcblxuICBjb25zdCBmaWxlcyA9IGF3YWl0IGZzLnJlYWRkaXIoc291cmNlRGlyZWN0b3J5KTtcbiAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgY29uc3QgZnVsbEZpbGUgPSBwYXRoLmpvaW4oc291cmNlRGlyZWN0b3J5LCBmaWxlKTtcbiAgICBjb25zdCByZWxOYW1lID0gcGF0aC5yZWxhdGl2ZShyZWxhdGl2ZVRvLCBmdWxsRmlsZSk7XG5cbiAgICBpZiAoKGF3YWl0IGZzLnN0YXQoZnVsbEZpbGUpKS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICByZXRbcmVsTmFtZV0gPSB7XG4gICAgICAgIHR5cGU6ICdzZXQnLFxuICAgICAgICBzb3VyY2VzOiBhd2FpdCBsb2FkUGF0Y2hTZXQoZnVsbEZpbGUsIHNvdXJjZURpcmVjdG9yeSksXG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAoZmlsZS5lbmRzV2l0aCgnLmpzb24nKSkge1xuICAgICAgcmV0W3JlbE5hbWVdID0ge1xuICAgICAgICB0eXBlOiBmaWxlLmluZGV4T2YoJ3BhdGNoJykgPT09IC0xID8gJ2ZyYWdtZW50JyA6ICdwYXRjaCcsXG4gICAgICAgIGRhdGE6IGF3YWl0IGZzLnJlYWRKc29uKGZ1bGxGaWxlKSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJldDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV2YWx1YXRlUGF0Y2hTZXQoc291cmNlczogUGF0Y2hTZXQsIG9wdGlvbnM6IFBhdGNoT3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IHRhcmdldE9iamVjdDogYW55ID0ge307XG5cbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoc291cmNlcykuc29ydCgpKSB7XG4gICAgY29uc3QgdmFsdWUgPSBzb3VyY2VzW2tleV07XG5cbiAgICBzd2l0Y2ggKHZhbHVlLnR5cGUpIHtcbiAgICAgIGNhc2UgJ2ZyYWdtZW50JzpcbiAgICAgICAgbG9nKGtleSk7XG4gICAgICAgIG1lcmdlKHRhcmdldE9iamVjdCwgdmFsdWUuZGF0YSwgW10pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3BhdGNoJzpcbiAgICAgICAgcGF0Y2godGFyZ2V0T2JqZWN0LCB2YWx1ZS5kYXRhLCAobSkgPT4gbG9nKGAke2tleX06ICR7bX1gKSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnc2V0JzpcbiAgICAgICAgY29uc3QgZXZhbHVhdGVkID0gZXZhbHVhdGVQYXRjaFNldCh2YWx1ZS5zb3VyY2VzLCBvcHRpb25zKTtcbiAgICAgICAgbG9nKGtleSk7XG4gICAgICAgIG1lcmdlKHRhcmdldE9iamVjdCwgZXZhbHVhdGVkLCBbXSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0YXJnZXRPYmplY3Q7XG5cbiAgZnVuY3Rpb24gbG9nKHg6IHN0cmluZykge1xuICAgIGlmICghb3B0aW9ucy5xdWlldCkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUubG9nKHgpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIExvYWQgYSBwYXRjaCBzZXQgZnJvbSBhIGRpcmVjdG9yeVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXBwbHlQYXRjaFNldChzb3VyY2VEaXJlY3Rvcnk6IHN0cmluZywgb3B0aW9uczogUGF0Y2hPcHRpb25zID0ge30pIHtcbiAgY29uc3QgcGF0Y2hlcyA9IGF3YWl0IGxvYWRQYXRjaFNldChzb3VyY2VEaXJlY3RvcnkpO1xuICByZXR1cm4gZXZhbHVhdGVQYXRjaFNldChwYXRjaGVzLCBvcHRpb25zKTtcbn1cblxuLyoqXG4gKiBMb2FkIGEgcGF0Y2ggc2V0IGFuZCB3cml0ZSBpdCBvdXQgdG8gYSBmaWxlXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhcHBseUFuZFdyaXRlKHRhcmdldEZpbGU6IHN0cmluZywgc291cmNlRGlyZWN0b3J5OiBzdHJpbmcsIG9wdGlvbnM6IFBhdGNoT3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IG1vZGVsID0gYXdhaXQgYXBwbHlQYXRjaFNldChzb3VyY2VEaXJlY3RvcnksIG9wdGlvbnMpO1xuICBhd2FpdCB3cml0ZVNvcnRlZCh0YXJnZXRGaWxlLCBtb2RlbCk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3cml0ZVNvcnRlZCh0YXJnZXRGaWxlOiBzdHJpbmcsIGRhdGE6IGFueSkge1xuICBhd2FpdCBmcy5ta2RpcnAocGF0aC5kaXJuYW1lKHRhcmdldEZpbGUpKTtcbiAgYXdhaXQgZnMud3JpdGVKc29uKHRhcmdldEZpbGUsIHNvcnRKc29uKGRhdGEpLCB7IHNwYWNlczogMiB9KTtcbn1cblxuZnVuY3Rpb24gcHJpbnRTb3J0ZWQoZGF0YTogYW55KSB7XG4gIHByb2Nlc3Muc3Rkb3V0LndyaXRlKEpTT04uc3RyaW5naWZ5KHNvcnRKc29uKGRhdGEpLCB1bmRlZmluZWQsIDIpKTtcbn1cblxuZnVuY3Rpb24gbWVyZ2UodGFyZ2V0OiBhbnksIGZyYWdtZW50OiBhbnksIGpzb25QYXRoOiBzdHJpbmdbXSkge1xuICBpZiAoIWZyYWdtZW50KSB7IHJldHVybjsgfVxuICBpZiAoIXRhcmdldCB8fCB0eXBlb2YgdGFyZ2V0ICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KHRhcmdldCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIG9iamVjdCwgZm91bmQ6ICcke3RhcmdldH0nIGF0ICckLiR7anNvblBhdGguam9pbignLicpfSdgKTtcbiAgfVxuXG4gIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGZyYWdtZW50KSkge1xuICAgIGlmIChrZXkuc3RhcnRzV2l0aCgnJCcpKSB7IGNvbnRpbnVlOyB9XG5cbiAgICBpZiAoa2V5IGluIHRhcmdldCkge1xuICAgICAgY29uc3Qgc3BlY1ZhbCA9IHRhcmdldFtrZXldO1xuICAgICAgY29uc3QgZnJhZ1ZhbCA9IGZyYWdtZW50W2tleV07XG4gICAgICBpZiAodHlwZW9mIHNwZWNWYWwgIT09IHR5cGVvZiBmcmFnVmFsKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtbGVuXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQXR0ZW1wdGVkIHRvIG1lcmdlICR7SlNPTi5zdHJpbmdpZnkoZnJhZ1ZhbCl9IGludG8gaW5jb21wYXRpYmxlICR7SlNPTi5zdHJpbmdpZnkoc3BlY1ZhbCl9IGF0IHBhdGggJHtqc29uUGF0aC5qb2luKCcvJyl9LyR7a2V5fWApO1xuICAgICAgfVxuICAgICAgaWYgKHNwZWNWYWwgPT0gZnJhZ1ZhbCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2Ygc3BlY1ZhbCAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1sZW5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb25mbGljdCB3aGVuIGF0dGVtcHRpbmcgdG8gbWVyZ2UgJHtKU09OLnN0cmluZ2lmeShmcmFnVmFsKX0gaW50byAke0pTT04uc3RyaW5naWZ5KHNwZWNWYWwpfSBhdCBwYXRoICR7anNvblBhdGguam9pbignLycpfS8ke2tleX1gKTtcbiAgICAgIH1cbiAgICAgIG1lcmdlKHNwZWNWYWwsIGZyYWdWYWwsIFsuLi5qc29uUGF0aCwga2V5XSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRhcmdldFtrZXldID0gZnJhZ21lbnRba2V5XTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcGF0Y2godGFyZ2V0OiBhbnksIGZyYWdtZW50OiBhbnksIGxvZzogKHg6IHN0cmluZykgPT4gdm9pZCkge1xuICBpZiAoIWZyYWdtZW50KSB7IHJldHVybjsgfVxuXG4gIGNvbnN0IHBhdGNoZXMgPSBmaW5kUGF0Y2hlcyh0YXJnZXQsIGZyYWdtZW50KTtcbiAgZm9yIChjb25zdCBwIG9mIHBhdGNoZXMpIHtcbiAgICBsb2cocC5kZXNjcmlwdGlvbiA/PyAnJyk7XG5cbiAgICB0cnkge1xuICAgICAgZmFzdEpzb25QYXRjaC5hcHBseVBhdGNoKHRhcmdldCwgcC5vcGVyYXRpb25zKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGVycm9yIGFwcGx5aW5nIHBhdGNoOiAke0pTT04uc3RyaW5naWZ5KHAsIHVuZGVmaW5lZCwgMil9OiAke2UubWVzc2FnZX1gKTtcbiAgICB9XG4gIH1cbn1cblxuaW50ZXJmYWNlIFBhdGNoIHtcbiAgcmVhZG9ubHkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IG9wZXJhdGlvbnM6IE9wZXJhdGlvbltdO1xufVxuXG50eXBlIE9wZXJhdGlvbiA9XG4gIHwgeyByZWFkb25seSBvcDogJ2FkZCc7IHJlYWRvbmx5IHBhdGg6IHN0cmluZzsgcmVhZG9ubHkgdmFsdWU6IGFueSB9XG4gIHwgeyByZWFkb25seSBvcDogJ3JlbW92ZSc7IHJlYWRvbmx5IHBhdGg6IHN0cmluZyB9XG4gIHwgeyByZWFkb25seSBvcDogJ3JlcGxhY2UnOyByZWFkb25seSBwYXRoOiBzdHJpbmc7IHJlYWRvbmx5IHZhbHVlOiBhbnkgfVxuICB8IHsgcmVhZG9ubHkgb3A6ICdjb3B5JzsgcmVhZG9ubHkgcGF0aDogc3RyaW5nOyByZWFkb25seSBmcm9tOiBzdHJpbmcgfVxuICB8IHsgcmVhZG9ubHkgb3A6ICdtb3ZlJzsgcmVhZG9ubHkgcGF0aDogc3RyaW5nOyByZWFkb25seSBmcm9tOiBzdHJpbmcgfVxuICB8IHsgcmVhZG9ubHkgb3A6ICd0ZXN0JzsgcmVhZG9ubHkgcGF0aDogc3RyaW5nOyByZWFkb25seSB2YWx1ZTogYW55IH1cbiAgO1xuXG4vKipcbiAqIEZpbmQgdGhlIHNldHMgb2YgcGF0Y2hlcyB0byBhcHBseSBpbiBhIGRvY3VtZW50XG4gKlxuICogQWRqdXN0cyBwYXRocyB0byBiZSByb290LXJlbGF0aXZlLCB3aGljaCBtYWtlcyBpdCBwb3NzaWJsZSB0byBoYXZlIHBhdGhzXG4gKiBwb2ludCBvdXRzaWRlIHRoZSBwYXRjaCBzY29wZS5cbiAqL1xuZnVuY3Rpb24gZmluZFBhdGNoZXMoZGF0YTogYW55LCBwYXRjaFNvdXJjZTogYW55KTogUGF0Y2hbXSB7XG4gIGNvbnN0IHJldDogUGF0Y2hbXSA9IFtdO1xuICByZWN1cnNlKGRhdGEsIHBhdGNoU291cmNlLCBbXSk7XG4gIHJldHVybiByZXQ7XG5cbiAgZnVuY3Rpb24gcmVjdXJzZShhY3R1YWxEYXRhOiBhbnksIGZyYWdtZW50OiBhbnksIGpzb25QYXRoOiBzdHJpbmdbXSkge1xuICAgIGlmICghZnJhZ21lbnQpIHsgcmV0dXJuOyB9XG5cbiAgICBpZiAoJ3BhdGNoJyBpbiBmcmFnbWVudCkge1xuICAgICAgY29uc3QgcCA9IGZyYWdtZW50LnBhdGNoO1xuICAgICAgaWYgKCFwLm9wZXJhdGlvbnMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQYXRjaCBuZWVkcyAnb3BlcmF0aW9ucycga2V5LCBnb3Q6ICR7SlNPTi5zdHJpbmdpZnkocCl9YCk7XG4gICAgICB9XG4gICAgICByZXQucHVzaCh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBwLmRlc2NyaXB0aW9uLFxuICAgICAgICBvcGVyYXRpb25zOiBwLm9wZXJhdGlvbnMubWFwKChvcDogYW55KSA9PiBhZGp1c3RQYXRocyhvcCwganNvblBhdGgpKSxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoJ3BhdGNoOmVhY2gnIGluIGZyYWdtZW50KSB7XG4gICAgICBjb25zdCBwID0gZnJhZ21lbnRbJ3BhdGNoOmVhY2gnXTtcbiAgICAgIGlmICh0eXBlb2YgYWN0dWFsRGF0YSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQYXRjaCAke3AuZGVzY3JpcHRpb259OiBleHBlY3Rpbmcgb2JqZWN0IGluIGRhdGEsIGZvdW5kICcke2FjdHVhbERhdGF9J2ApO1xuICAgICAgfVxuICAgICAgaWYgKCFwLm9wZXJhdGlvbnMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQYXRjaCBuZWVkcyAnb3BlcmF0aW9ucycga2V5LCBnb3Q6ICR7SlNPTi5zdHJpbmdpZnkocCl9YCk7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBhY3R1YWxEYXRhKSB7XG4gICAgICAgIHJldC5wdXNoKHtcbiAgICAgICAgICBkZXNjcmlwdGlvbjogYCR7a2V5fTogJHtwLmRlc2NyaXB0aW9ufWAsXG4gICAgICAgICAgb3BlcmF0aW9uczogcC5vcGVyYXRpb25zLm1hcCgob3A6IGFueSkgPT4gYWRqdXN0UGF0aHMob3AsIFsuLi5qc29uUGF0aCwga2V5XSkpLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoZnJhZ21lbnQpKSB7XG4gICAgICAgIGlmICghKGtleSBpbiBhY3R1YWxEYXRhKSkge1xuICAgICAgICAgIGFjdHVhbERhdGFba2V5XSA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIHJlY3Vyc2UoYWN0dWFsRGF0YVtrZXldLCBmcmFnbWVudFtrZXldLCBbLi4uanNvblBhdGgsIGtleV0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGFkanVzdFBhdGhzKG9wOiBhbnksIGpzb25QYXRoOiBzdHJpbmdbXSk6IE9wZXJhdGlvbiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLm9wLFxuICAgICAgLi4ub3AucGF0aCA/IHsgcGF0aDogYWRqdXN0UGF0aChvcC5wYXRoLCBqc29uUGF0aCkgfSA6IHVuZGVmaW5lZCxcbiAgICAgIC4uLm9wLmZyb20gPyB7IGZyb206IGFkanVzdFBhdGgob3AuZnJvbSwganNvblBhdGgpIH0gOiB1bmRlZmluZWQsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGp1c3QgcGF0aFxuICAgKlxuICAgKiAnJC8nIG1lYW5zIGZyb20gdGhlIHJvb3QsIG90aGVyd2lzZSBpbnRlcnByZXQgYXMgcmVsYXRpdmUgcGF0aC5cbiAgICovXG4gIGZ1bmN0aW9uIGFkanVzdFBhdGgob3JpZ2luYWxQYXRoOiBzdHJpbmcsIGpzb25QYXRoOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gICAgaWYgKHR5cGVvZiBvcmlnaW5hbFBhdGggIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGFkanVzdFBhdGg6IGV4cGVjdGVkIHN0cmluZywgZ290ICR7SlNPTi5zdHJpbmdpZnkob3JpZ2luYWxQYXRoKX1gKTtcbiAgICB9XG4gICAgaWYgKG9yaWdpbmFsUGF0aC5zdGFydHNXaXRoKCckLycpKSB7XG4gICAgICByZXR1cm4gb3JpZ2luYWxQYXRoLnN1YnN0cigxKTtcbiAgICB9XG4gICAgcmV0dXJuIGpzb25QYXRoLm1hcChwID0+IGAvJHtwfWApLmpvaW4oJycpICsgb3JpZ2luYWxQYXRoO1xuICB9XG59XG5cblxuLyoqXG4gKiBSdW4gdGhpcyBmaWxlIGFzIGEgQ0xJIHRvb2wsIHRvIGFwcGx5IGEgcGF0Y2ggc2V0IGZyb20gdGhlIGNvbW1hbmQgbGluZVxuICovXG5hc3luYyBmdW5jdGlvbiBtYWluKGFyZ3M6IHN0cmluZ1tdKSB7XG4gIGNvbnN0IHF1aWV0ID0gZWF0QXJnKCctcScsIGFyZ3MpIHx8IGVhdEFyZygnLS1xdWlldCcsIGFyZ3MpO1xuXG4gIGlmIChhcmdzLmxlbmd0aCA8IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1VzYWdlOiBwYXRjaC1zZXQgPERJUj4gWzxGSUxFPl0nKTtcbiAgfVxuXG4gIGNvbnN0IFtkaXIsIHRhcmdldEZpbGVdID0gYXJncztcblxuICBjb25zdCBtb2RlbCA9IGF3YWl0IGFwcGx5UGF0Y2hTZXQoZGlyLCB7IHF1aWV0IH0pO1xuICBpZiAodGFyZ2V0RmlsZSkge1xuICAgIGF3YWl0IHdyaXRlU29ydGVkKHRhcmdldEZpbGUsIG1vZGVsKTtcbiAgfSBlbHNlIHtcbiAgICBwcmludFNvcnRlZChtb2RlbCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZWF0QXJnKGFyZzogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSkge1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoYXJnc1tpXSA9PT0gYXJnKSB7XG4gICAgICBhcmdzLnNwbGljZShpLCAxKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmlmIChyZXF1aXJlLm1haW4gPT09IG1vZHVsZSkge1xuICBtYWluKHByb2Nlc3MuYXJndi5zbGljZSgyKSkuY2F0Y2goZSA9PiB7XG4gICAgcHJvY2Vzcy5leGl0Q29kZSA9IDE7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICBjb25zb2xlLmVycm9yKGUubWVzc2FnZSk7XG4gIH0pO1xufVxuIl19
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/* eslint-disable no-console */
|
|
3
|
+
/**
|
|
4
|
+
* Report on spec fragment files that are being held back.
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
const path = require("path");
|
|
8
|
+
const fs = require("fs-extra");
|
|
9
|
+
async function main(args) {
|
|
10
|
+
if (args.length < 2) {
|
|
11
|
+
throw new Error('Usage: report-issues <DIR> <FORMAT>');
|
|
12
|
+
}
|
|
13
|
+
const [dir, format] = args;
|
|
14
|
+
const officialVersion = (await fs.readJson(path.join(dir, '001_Version.json'))).ResourceSpecificationVersion;
|
|
15
|
+
let headerPrinted = false;
|
|
16
|
+
for (const file of await fs.readdir(dir)) {
|
|
17
|
+
if (!file.startsWith('000_')) {
|
|
18
|
+
continue;
|
|
19
|
+
}
|
|
20
|
+
const json = await fs.readJson(path.join(dir, file));
|
|
21
|
+
const fragmentVersion = json.$version;
|
|
22
|
+
switch (format) {
|
|
23
|
+
case 'outdated':
|
|
24
|
+
if (fragmentVersion !== officialVersion) {
|
|
25
|
+
if (!headerPrinted) {
|
|
26
|
+
console.log('## Unapplied changes');
|
|
27
|
+
console.log('');
|
|
28
|
+
headerPrinted = true;
|
|
29
|
+
}
|
|
30
|
+
const serviceName = file.replace(/^000_/, '').replace(/\.json$/, '').replace('_', '::');
|
|
31
|
+
console.log(`* ${serviceName} is at ${fragmentVersion}`);
|
|
32
|
+
}
|
|
33
|
+
break;
|
|
34
|
+
default:
|
|
35
|
+
throw new Error(`Unknown format type requested: ${format}`);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
main(process.argv.slice(2)).catch(e => {
|
|
40
|
+
// eslint-disable-next-line no-console
|
|
41
|
+
console.error(e);
|
|
42
|
+
process.exitCode = 1;
|
|
43
|
+
});
|
|
44
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LWlzc3Vlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInJlcG9ydC1pc3N1ZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLCtCQUErQjtBQUMvQjs7R0FFRzs7QUFFSCw2QkFBNkI7QUFDN0IsK0JBQStCO0FBRS9CLEtBQUssVUFBVSxJQUFJLENBQUMsSUFBYztJQUNoQyxJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1FBQ25CLE1BQU0sSUFBSSxLQUFLLENBQUMscUNBQXFDLENBQUMsQ0FBQztLQUN4RDtJQUVELE1BQU0sQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDO0lBRTNCLE1BQU0sZUFBZSxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLDRCQUE0QixDQUFDO0lBQzdHLElBQUksYUFBYSxHQUFHLEtBQUssQ0FBQztJQUUxQixLQUFLLE1BQU0sSUFBSSxJQUFJLE1BQU0sRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtRQUN4QyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUM1QixTQUFTO1NBQ1Y7UUFFRCxNQUFNLElBQUksR0FBRyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNyRCxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBRXRDLFFBQVEsTUFBTSxFQUFFO1lBQ2QsS0FBSyxVQUFVO2dCQUNiLElBQUksZUFBZSxLQUFLLGVBQWUsRUFBRTtvQkFDdkMsSUFBSSxDQUFDLGFBQWEsRUFBRTt3QkFDbEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO3dCQUNwQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO3dCQUNoQixhQUFhLEdBQUcsSUFBSSxDQUFDO3FCQUN0QjtvQkFDRCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7b0JBQ3hGLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxXQUFXLFVBQVUsZUFBZSxFQUFFLENBQUMsQ0FBQztpQkFDMUQ7Z0JBQ0QsTUFBTTtZQUVSO2dCQUNFLE1BQU0sSUFBSSxLQUFLLENBQUMsa0NBQWtDLE1BQU0sRUFBRSxDQUFDLENBQUM7U0FDL0Q7S0FDRjtBQUNILENBQUM7QUFFRCxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUU7SUFDcEMsc0NBQXNDO0lBQ3RDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDakIsT0FBTyxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUM7QUFDdkIsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBuby1jb25zb2xlICovXG4vKipcbiAqIFJlcG9ydCBvbiBzcGVjIGZyYWdtZW50IGZpbGVzIHRoYXQgYXJlIGJlaW5nIGhlbGQgYmFjay5cbiAqL1xuXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMtZXh0cmEnO1xuXG5hc3luYyBmdW5jdGlvbiBtYWluKGFyZ3M6IHN0cmluZ1tdKSB7XG4gIGlmIChhcmdzLmxlbmd0aCA8IDIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1VzYWdlOiByZXBvcnQtaXNzdWVzIDxESVI+IDxGT1JNQVQ+Jyk7XG4gIH1cblxuICBjb25zdCBbZGlyLCBmb3JtYXRdID0gYXJncztcblxuICBjb25zdCBvZmZpY2lhbFZlcnNpb24gPSAoYXdhaXQgZnMucmVhZEpzb24ocGF0aC5qb2luKGRpciwgJzAwMV9WZXJzaW9uLmpzb24nKSkpLlJlc291cmNlU3BlY2lmaWNhdGlvblZlcnNpb247XG4gIGxldCBoZWFkZXJQcmludGVkID0gZmFsc2U7XG5cbiAgZm9yIChjb25zdCBmaWxlIG9mIGF3YWl0IGZzLnJlYWRkaXIoZGlyKSkge1xuICAgIGlmICghZmlsZS5zdGFydHNXaXRoKCcwMDBfJykpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGpzb24gPSBhd2FpdCBmcy5yZWFkSnNvbihwYXRoLmpvaW4oZGlyLCBmaWxlKSk7XG4gICAgY29uc3QgZnJhZ21lbnRWZXJzaW9uID0ganNvbi4kdmVyc2lvbjtcblxuICAgIHN3aXRjaCAoZm9ybWF0KSB7XG4gICAgICBjYXNlICdvdXRkYXRlZCc6XG4gICAgICAgIGlmIChmcmFnbWVudFZlcnNpb24gIT09IG9mZmljaWFsVmVyc2lvbikge1xuICAgICAgICAgIGlmICghaGVhZGVyUHJpbnRlZCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJyMjIFVuYXBwbGllZCBjaGFuZ2VzJyk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnJyk7XG4gICAgICAgICAgICBoZWFkZXJQcmludGVkID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3Qgc2VydmljZU5hbWUgPSBmaWxlLnJlcGxhY2UoL14wMDBfLywgJycpLnJlcGxhY2UoL1xcLmpzb24kLywgJycpLnJlcGxhY2UoJ18nLCAnOjonKTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgKiAke3NlcnZpY2VOYW1lfSBpcyBhdCAke2ZyYWdtZW50VmVyc2lvbn1gKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGZvcm1hdCB0eXBlIHJlcXVlc3RlZDogJHtmb3JtYXR9YCk7XG4gICAgfVxuICB9XG59XG5cbm1haW4ocHJvY2Vzcy5hcmd2LnNsaWNlKDIpKS5jYXRjaChlID0+IHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgY29uc29sZS5lcnJvcihlKTtcbiAgcHJvY2Vzcy5leGl0Q29kZSA9IDE7XG59KTsiXX0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
/* eslint-disable no-console */
|
|
4
|
+
/**
|
|
5
|
+
* Split the given CloudFormation resource specification up into a patch set, by service
|
|
6
|
+
*
|
|
7
|
+
* After splitting, only write out those fragments that are valid.(*)
|
|
8
|
+
*
|
|
9
|
+
* The reason for this is that some service updates sometimes contain mistakes,
|
|
10
|
+
* and we want to be able to take partial upgrades. By splitting the spec, we can
|
|
11
|
+
* take updates to some services while leaving updates to other services behind.
|
|
12
|
+
*
|
|
13
|
+
* (*) If `NO_VALIDATE` is set, all pieces are written out. In normal operation this
|
|
14
|
+
* should not be used.
|
|
15
|
+
*/
|
|
16
|
+
const path = require("path");
|
|
17
|
+
const fs = require("fs-extra");
|
|
18
|
+
const patch_set_1 = require("./patch-set");
|
|
19
|
+
const validate_cfn_1 = require("./validate-cfn");
|
|
20
|
+
async function main(args) {
|
|
21
|
+
if (args.length < 2) {
|
|
22
|
+
throw new Error('Usage: split-spec-by-service <SPECFILE> <DIRECTORY>');
|
|
23
|
+
}
|
|
24
|
+
const [specFile, outDir] = args;
|
|
25
|
+
log(`Loading specification: ${specFile}`);
|
|
26
|
+
const spec = await fs.readJson(specFile);
|
|
27
|
+
// Split
|
|
28
|
+
log('Splitting');
|
|
29
|
+
const byService = {};
|
|
30
|
+
for (const [propTypeName, propType] of Object.entries(spec.PropertyTypes)) {
|
|
31
|
+
const svcName = serviceName(propTypeName);
|
|
32
|
+
serviceSpec(svcName).PropertyTypes[propTypeName] = propType;
|
|
33
|
+
}
|
|
34
|
+
for (const [resTypeName, resType] of Object.entries(spec.ResourceTypes)) {
|
|
35
|
+
const svcName = serviceName(resTypeName);
|
|
36
|
+
serviceSpec(svcName).ResourceTypes[resTypeName] = resType;
|
|
37
|
+
}
|
|
38
|
+
// Write out
|
|
39
|
+
log('Writing');
|
|
40
|
+
for (const [svcName, svcSpec] of Object.entries(byService)) {
|
|
41
|
+
const errors = !process.env.NO_VALIDATE ? validate_cfn_1.CfnSpecValidator.validate(svcSpec) : [];
|
|
42
|
+
if (errors.length === 0) {
|
|
43
|
+
// Change 'ResourceSpecificationVersion' to '$version', otherwise they will all conflict
|
|
44
|
+
const toWrite = {
|
|
45
|
+
PropertyTypes: svcSpec.PropertyTypes,
|
|
46
|
+
ResourceTypes: svcSpec.ResourceTypes,
|
|
47
|
+
$version: svcSpec.ResourceSpecificationVersion,
|
|
48
|
+
};
|
|
49
|
+
await patch_set_1.writeSorted(path.join(outDir, `000_${svcName}.json`), toWrite);
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
console.warn('='.repeat(70));
|
|
53
|
+
console.warn(' '.repeat(Math.floor(35 - svcName.length / 2)) + svcName);
|
|
54
|
+
console.warn('='.repeat(70));
|
|
55
|
+
for (const error of errors) {
|
|
56
|
+
console.warn(validate_cfn_1.formatErrorInContext(error));
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
await fs.writeJson(path.join(outDir, '001_Version.json'), {
|
|
61
|
+
ResourceSpecificationVersion: spec.ResourceSpecificationVersion,
|
|
62
|
+
}, { spaces: 2 });
|
|
63
|
+
function serviceSpec(svcName) {
|
|
64
|
+
if (!(svcName in byService)) {
|
|
65
|
+
byService[svcName] = {
|
|
66
|
+
PropertyTypes: {},
|
|
67
|
+
ResourceTypes: {},
|
|
68
|
+
ResourceSpecificationVersion: spec.ResourceSpecificationVersion,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
return byService[svcName];
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
function serviceName(x) {
|
|
75
|
+
return x.split('::').slice(0, 2).join('_');
|
|
76
|
+
}
|
|
77
|
+
function log(x) {
|
|
78
|
+
// eslint-disable-next-line no-console
|
|
79
|
+
console.log(x);
|
|
80
|
+
}
|
|
81
|
+
main(process.argv.slice(2)).catch(e => {
|
|
82
|
+
// eslint-disable-next-line no-console
|
|
83
|
+
console.error(e);
|
|
84
|
+
process.exitCode = 1;
|
|
85
|
+
});
|
|
86
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BsaXQtc3BlYy1ieS1zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic3BsaXQtc3BlYy1ieS1zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsK0JBQStCO0FBQy9COzs7Ozs7Ozs7OztHQVdHO0FBQ0gsNkJBQTZCO0FBQzdCLCtCQUErQjtBQUUvQiwyQ0FBMEM7QUFDMUMsaURBQWlGO0FBRWpGLEtBQUssVUFBVSxJQUFJLENBQUMsSUFBYztJQUNoQyxJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1FBQ25CLE1BQU0sSUFBSSxLQUFLLENBQUMscURBQXFELENBQUMsQ0FBQztLQUN4RTtJQUVELE1BQU0sQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ2hDLEdBQUcsQ0FBQywwQkFBMEIsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUMxQyxNQUFNLElBQUksR0FBWSxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7SUFFbEQsUUFBUTtJQUNSLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNqQixNQUFNLFNBQVMsR0FBNEIsRUFBRSxDQUFDO0lBQzlDLEtBQUssTUFBTSxDQUFDLFlBQVksRUFBRSxRQUFRLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRTtRQUN6RSxNQUFNLE9BQU8sR0FBRyxXQUFXLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDMUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsR0FBRyxRQUFRLENBQUM7S0FDN0Q7SUFDRCxLQUFLLE1BQU0sQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUU7UUFDdkUsTUFBTSxPQUFPLEdBQUcsV0FBVyxDQUFDLFdBQVcsQ0FBQyxD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QztBQUN2QixDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vLWNvbnNvbGUgKi9cbi8qKlxuICogU3BsaXQgdGhlIGdpdmVuIENsb3VkRm9ybWF0aW9uIHJlc291cmNlIHNwZWNpZmljYXRpb24gdXAgaW50byBhIHBhdGNoIHNldCwgYnkgc2VydmljZVxuICpcbiAqIEFmdGVyIHNwbGl0dGluZywgb25seSB3cml0ZSBvdXQgdGhvc2UgZnJhZ21lbnRzIHRoYXQgYXJlIHZhbGlkLigqKVxuICpcbiAqIFRoZSByZWFzb24gZm9yIHRoaXMgaXMgdGhhdCBzb21lIHNlcnZpY2UgdXBkYXRlcyBzb21ldGltZXMgY29udGFpbiBtaXN0YWtlcyxcbiAqIGFuZCB3ZSB3YW50IHRvIGJlIGFibGUgdG8gdGFrZSBwYXJ0aWFsIHVwZ3JhZGVzLiBCeSBzcGxpdHRpbmcgdGhlIHNwZWMsIHdlIGNhblxuICogdGFrZSB1cGRhdGVzIHRvIHNvbWUgc2VydmljZXMgd2hpbGUgbGVhdmluZyB1cGRhdGVzIHRvIG90aGVyIHNlcnZpY2VzIGJlaGluZC5cbiAqXG4gKiAoKikgSWYgYE5PX1ZBTElEQVRFYCBpcyBzZXQsIGFsbCBwaWVjZXMgYXJlIHdyaXR0ZW4gb3V0LiBJbiBub3JtYWwgb3BlcmF0aW9uIHRoaXNcbiAqICAgICBzaG91bGQgbm90IGJlIHVzZWQuXG4gKi9cbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcy1leHRyYSc7XG5cbmltcG9ydCB7IHdyaXRlU29ydGVkIH0gZnJvbSAnLi9wYXRjaC1zZXQnO1xuaW1wb3J0IHsgQ2ZuU3BlYywgQ2ZuU3BlY1ZhbGlkYXRvciwgZm9ybWF0RXJyb3JJbkNvbnRleHQgfSBmcm9tICcuL3ZhbGlkYXRlLWNmbic7XG5cbmFzeW5jIGZ1bmN0aW9uIG1haW4oYXJnczogc3RyaW5nW10pIHtcbiAgaWYgKGFyZ3MubGVuZ3RoIDwgMikge1xuICAgIHRocm93IG5ldyBFcnJvcignVXNhZ2U6IHNwbGl0LXNwZWMtYnktc2VydmljZSA8U1BFQ0ZJTEU+IDxESVJFQ1RPUlk+Jyk7XG4gIH1cblxuICBjb25zdCBbc3BlY0ZpbGUsIG91dERpcl0gPSBhcmdzO1xuICBsb2coYExvYWRpbmcgc3BlY2lmaWNhdGlvbjogJHtzcGVjRmlsZX1gKTtcbiAgY29uc3Qgc3BlYzogQ2ZuU3BlYyA9IGF3YWl0IGZzLnJlYWRKc29uKHNwZWNGaWxlKTtcblxuICAvLyBTcGxpdFxuICBsb2coJ1NwbGl0dGluZycpO1xuICBjb25zdCBieVNlcnZpY2U6IFJlY29yZDxzdHJpbmcsIENmblNwZWM+ID0ge307XG4gIGZvciAoY29uc3QgW3Byb3BUeXBlTmFtZSwgcHJvcFR5cGVdIG9mIE9iamVjdC5lbnRyaWVzKHNwZWMuUHJvcGVydHlUeXBlcykpIHtcbiAgICBjb25zdCBzdmNOYW1lID0gc2VydmljZU5hbWUocHJvcFR5cGVOYW1lKTtcbiAgICBzZXJ2aWNlU3BlYyhzdmNOYW1lKS5Qcm9wZXJ0eVR5cGVzW3Byb3BUeXBlTmFtZV0gPSBwcm9wVHlwZTtcbiAgfVxuICBmb3IgKGNvbnN0IFtyZXNUeXBlTmFtZSwgcmVzVHlwZV0gb2YgT2JqZWN0LmVudHJpZXMoc3BlYy5SZXNvdXJjZVR5cGVzKSkge1xuICAgIGNvbnN0IHN2Y05hbWUgPSBzZXJ2aWNlTmFtZShyZXNUeXBlTmFtZSk7XG4gICAgc2VydmljZVNwZWMoc3ZjTmFtZSkuUmVzb3VyY2VUeXBlc1tyZXNUeXBlTmFtZV0gPSByZXNUeXBlO1xuICB9XG5cbiAgLy8gV3JpdGUgb3V0XG4gIGxvZygnV3JpdGluZycpO1xuICBmb3IgKGNvbnN0IFtzdmNOYW1lLCBzdmNTcGVjXSBvZiBPYmplY3QuZW50cmllcyhieVNlcnZpY2UpKSB7XG4gICAgY29uc3QgZXJyb3JzID0gIXByb2Nlc3MuZW52Lk5PX1ZBTElEQVRFID8gQ2ZuU3BlY1ZhbGlkYXRvci52YWxpZGF0ZShzdmNTcGVjKSA6IFtdO1xuICAgIGlmIChlcnJvcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAvLyBDaGFuZ2UgJ1Jlc291cmNlU3BlY2lmaWNhdGlvblZlcnNpb24nIHRvICckdmVyc2lvbicsIG90aGVyd2lzZSB0aGV5IHdpbGwgYWxsIGNvbmZsaWN0XG4gICAgICBjb25zdCB0b1dyaXRlID0ge1xuICAgICAgICBQcm9wZXJ0eVR5cGVzOiBzdmNTcGVjLlByb3BlcnR5VHlwZXMsXG4gICAgICAgIFJlc291cmNlVHlwZXM6IHN2Y1NwZWMuUmVzb3VyY2VUeXBlcyxcbiAgICAgICAgJHZlcnNpb246IHN2Y1NwZWMuUmVzb3VyY2VTcGVjaWZpY2F0aW9uVmVyc2lvbixcbiAgICAgIH07XG5cbiAgICAgIGF3YWl0IHdyaXRlU29ydGVkKHBhdGguam9pbihvdXREaXIsIGAwMDBfJHtzdmNOYW1lfS5qc29uYCksIHRvV3JpdGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLndhcm4oJz0nLnJlcGVhdCg3MCkpO1xuICAgICAgY29uc29sZS53YXJuKCcgJy5yZXBlYXQoTWF0aC5mbG9vcigzNSAtIHN2Y05hbWUubGVuZ3RoIC8gMikpICsgc3ZjTmFtZSk7XG4gICAgICBjb25zb2xlLndhcm4oJz0nLnJlcGVhdCg3MCkpO1xuICAgICAgZm9yIChjb25zdCBlcnJvciBvZiBlcnJvcnMpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGZvcm1hdEVycm9ySW5Db250ZXh0KGVycm9yKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGF3YWl0IGZzLndyaXRlSnNvbihwYXRoLmpvaW4ob3V0RGlyLCAnMDAxX1ZlcnNpb24uanNvbicpLCB7XG4gICAgUmVzb3VyY2VTcGVjaWZpY2F0aW9uVmVyc2lvbjogc3BlYy5SZXNvdXJjZVNwZWNpZmljYXRpb25WZXJzaW9uLFxuICB9LCB7IHNwYWNlczogMiB9KTtcblxuICBmdW5jdGlvbiBzZXJ2aWNlU3BlYyhzdmNOYW1lOiBzdHJpbmcpIHtcbiAgICBpZiAoIShzdmNOYW1lIGluIGJ5U2VydmljZSkpIHtcbiAgICAgIGJ5U2VydmljZVtzdmNOYW1lXSA9IHtcbiAgICAgICAgUHJvcGVydHlUeXBlczoge30sXG4gICAgICAgIFJlc291cmNlVHlwZXM6IHt9LFxuICAgICAgICBSZXNvdXJjZVNwZWNpZmljYXRpb25WZXJzaW9uOiBzcGVjLlJlc291cmNlU3BlY2lmaWNhdGlvblZlcnNpb24sXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gYnlTZXJ2aWNlW3N2Y05hbWVdO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNlcnZpY2VOYW1lKHg6IHN0cmluZykge1xuICByZXR1cm4geC5zcGxpdCgnOjonKS5zbGljZSgwLCAyKS5qb2luKCdfJyk7XG59XG5cbmZ1bmN0aW9uIGxvZyh4OiBzdHJpbmcpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgY29uc29sZS5sb2coeCk7XG59XG5cbm1haW4ocHJvY2Vzcy5hcmd2LnNsaWNlKDIpKS5jYXRjaChlID0+IHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgY29uc29sZS5lcnJvcihlKTtcbiAgcHJvY2Vzcy5leGl0Q29kZSA9IDE7XG59KTtcbiJdfQ==
|
|
@@ -186,7 +186,7 @@
|
|
|
186
186
|
same "printed page" as the copyright notice for easier
|
|
187
187
|
identification within third-party archives.
|
|
188
188
|
|
|
189
|
-
Copyright 2018-
|
|
189
|
+
Copyright 2018-2022 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
190
190
|
|
|
191
191
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
192
192
|
you may not use this file except in compliance with the License.
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
AWS Cloud Development Kit (AWS CDK)
|
|
2
|
-
Copyright 2018-
|
|
2
|
+
Copyright 2018-2022 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
@@ -13,51 +13,67 @@ rm -f CHANGELOG.md.new
|
|
|
13
13
|
function update-spec() {
|
|
14
14
|
local title=$1
|
|
15
15
|
local url=$2
|
|
16
|
-
local
|
|
16
|
+
local targetdir=$3
|
|
17
17
|
local gunzip=$4
|
|
18
|
+
local split=$5
|
|
18
19
|
|
|
19
|
-
local
|
|
20
|
+
local tmpdir="$(mktemp -d)"
|
|
21
|
+
local newspec="${tmpdir}/new_proposed.json"
|
|
22
|
+
local newcombined="${tmpdir}/new.json"
|
|
23
|
+
local oldcombined="${tmpdir}/old.json"
|
|
20
24
|
|
|
21
25
|
# fail if the spec has changes, otherwise we won't be able to determine the diff
|
|
22
|
-
if [ -n "$(git status --porcelain ${
|
|
23
|
-
echo "The
|
|
26
|
+
if [ -n "$(git status --porcelain ${targetdir})" ]; then
|
|
27
|
+
echo "The directory ${targetdir} has changes, revert them before cfn-update"
|
|
24
28
|
exit 1
|
|
25
29
|
fi
|
|
26
30
|
|
|
27
31
|
echo >&2 "Downloading from ${url}..."
|
|
28
32
|
if ${gunzip}; then
|
|
29
|
-
curl -sL "${url}" | gunzip - > ${
|
|
33
|
+
curl -sL "${url}" | gunzip - > ${newspec}
|
|
30
34
|
else
|
|
31
|
-
curl -sL "${url}" > ${
|
|
35
|
+
curl -sL "${url}" > ${newspec}
|
|
32
36
|
fi
|
|
33
37
|
|
|
34
|
-
|
|
35
|
-
|
|
38
|
+
# Calculate the old and new combined specs, so we can do a diff on the changes
|
|
39
|
+
echo >&2 "Updating source spec..."
|
|
40
|
+
|
|
41
|
+
node build-tools/patch-set.js --quiet "${targetdir}" "${oldcombined}"
|
|
42
|
+
if ${split}; then
|
|
43
|
+
node build-tools/split-spec-by-service.js "${newspec}" "${targetdir}"
|
|
44
|
+
else
|
|
45
|
+
cp "${newspec}" "${targetdir}/spec.json"
|
|
46
|
+
sort-json "${targetdir}/spec.json"
|
|
47
|
+
fi
|
|
48
|
+
node build-tools/patch-set.js --quiet "${targetdir}" "${newcombined}"
|
|
36
49
|
|
|
37
50
|
echo >&2 "Updating CHANGELOG.md..."
|
|
38
|
-
node build-tools/spec-diff.js "${title}" "${
|
|
39
|
-
echo "" >> CHANGELOG.md.new
|
|
51
|
+
node build-tools/spec-diff.js "${title}" "${oldcombined}" "${newcombined}" >> CHANGELOG.md.new
|
|
40
52
|
|
|
41
|
-
echo
|
|
42
|
-
rm -f ${target}
|
|
43
|
-
cp ${intermediate} ${target}
|
|
53
|
+
echo "" >> CHANGELOG.md.new
|
|
44
54
|
}
|
|
45
55
|
|
|
56
|
+
# First run a build to get a complete version of the old spec
|
|
57
|
+
|
|
46
58
|
update-spec \
|
|
47
59
|
"CloudFormation Resource Specification" \
|
|
48
60
|
"https://d1uauaxba7bl26.cloudfront.net/latest/gzip/CloudFormationResourceSpecification.json" \
|
|
49
|
-
spec-source/
|
|
50
|
-
true
|
|
61
|
+
spec-source/specification/000_cfn/000_official \
|
|
62
|
+
true true
|
|
51
63
|
|
|
52
64
|
echo >&2 "Recording new version..."
|
|
53
65
|
rm -f cfn.version
|
|
54
|
-
node -p "require('${scriptdir}/../spec-source/
|
|
66
|
+
node -p "require('${scriptdir}/../spec-source/specification/000_cfn/000_official/001_Version.json').ResourceSpecificationVersion" > cfn.version
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
echo >&2 "Reporting outdated specs..."
|
|
70
|
+
node build-tools/report-issues spec-source/specification/000_cfn/000_official/ outdated >> CHANGELOG.md.new
|
|
55
71
|
|
|
56
72
|
update-spec \
|
|
57
73
|
"Serverless Application Model (SAM) Resource Specification" \
|
|
58
74
|
"https://raw.githubusercontent.com/awslabs/goformation/master/generate/sam-2016-10-31.json" \
|
|
59
|
-
spec-source/
|
|
60
|
-
false
|
|
75
|
+
spec-source/specification/100_sam/000_official \
|
|
76
|
+
false false
|
|
61
77
|
|
|
62
78
|
npm run build
|
|
63
79
|
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
export interface CfnSpec {
|
|
2
|
+
PropertyTypes: Record<string, any>;
|
|
3
|
+
ResourceTypes: Record<string, any>;
|
|
4
|
+
ResourceSpecificationVersion: string;
|
|
5
|
+
}
|
|
6
|
+
export interface ValidationError {
|
|
7
|
+
readonly value: JsonValue<any>;
|
|
8
|
+
readonly message: string;
|
|
9
|
+
}
|
|
10
|
+
export declare class CfnSpecValidator {
|
|
11
|
+
static validate(spec: CfnSpec): ValidationError[];
|
|
12
|
+
readonly errors: ValidationError[];
|
|
13
|
+
private readonly root;
|
|
14
|
+
constructor(spec: CfnSpec);
|
|
15
|
+
validateSpec(): void;
|
|
16
|
+
/**
|
|
17
|
+
* Property types are extremely weird
|
|
18
|
+
*
|
|
19
|
+
* Nominally, they define "records" that have a `Properties` field with the defined
|
|
20
|
+
* properties.
|
|
21
|
+
*
|
|
22
|
+
* However, they are also commonly used as aliases for other types, meaning they have
|
|
23
|
+
* the same type-indicating fields as individual property *fields* would have.
|
|
24
|
+
*
|
|
25
|
+
* Also also, it seems to be quite common to have them empty--have no fields at all.
|
|
26
|
+
* This seems to be taken as an alias for an unstructured `Json` type. It's probably
|
|
27
|
+
* just a mistake, but unfortunately a mistake that S3 is participating in, so if we
|
|
28
|
+
* fail on that we won't be able to consume updates to S3's schema. Our codegen is
|
|
29
|
+
* ready to deal with this and just renders it to an empty struct.
|
|
30
|
+
*/
|
|
31
|
+
private validatePropertyType;
|
|
32
|
+
private validateResourceType;
|
|
33
|
+
private validateProperties;
|
|
34
|
+
/**
|
|
35
|
+
* Validate the type
|
|
36
|
+
*
|
|
37
|
+
* There must be:
|
|
38
|
+
* - Either Type or PrimitiveType
|
|
39
|
+
* - Only if Type is List or Map, there will be either an ItemType or a PrimitiveItemType
|
|
40
|
+
* - Non-primitive Types must correspond to a property type
|
|
41
|
+
*/
|
|
42
|
+
private validateType;
|
|
43
|
+
private assertValidPropertyTypeReference;
|
|
44
|
+
private assertOptional;
|
|
45
|
+
private assert;
|
|
46
|
+
private validateMap;
|
|
47
|
+
private report;
|
|
48
|
+
}
|
|
49
|
+
interface JsonValue<A> {
|
|
50
|
+
readonly path: string[];
|
|
51
|
+
readonly pathValue: any;
|
|
52
|
+
readonly hasValue: boolean;
|
|
53
|
+
readonly value: A;
|
|
54
|
+
readonly valueOrUndefined: A | undefined;
|
|
55
|
+
get<K extends keyof A>(k: K): JsonValue<A[K]>;
|
|
56
|
+
}
|
|
57
|
+
declare class JsonValue<A> implements JsonValue<A> {
|
|
58
|
+
readonly value: A;
|
|
59
|
+
readonly path: string[];
|
|
60
|
+
static of<B>(x: B): JsonValue<B>;
|
|
61
|
+
readonly hasValue: boolean;
|
|
62
|
+
readonly valueOrUndefined: A | undefined;
|
|
63
|
+
readonly pathValue: any;
|
|
64
|
+
constructor(value: A, path: string[]);
|
|
65
|
+
}
|
|
66
|
+
export declare function formatErrorInContext(error: ValidationError): string;
|
|
67
|
+
export {};
|