cdk-common 2.0.28 → 2.0.32

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.
Files changed (172) hide show
  1. package/.jsii +4 -4
  2. package/lib/main.js +1 -1
  3. package/node_modules/@aws-cdk/assert/LICENSE +1 -1
  4. package/node_modules/@aws-cdk/assert/NOTICE +1 -1
  5. package/node_modules/@aws-cdk/assert/package.json +9 -9
  6. package/node_modules/@aws-cdk/cfnspec/CHANGELOG.md +16 -0
  7. package/node_modules/@aws-cdk/cfnspec/build-tools/build.js +7 -53
  8. package/node_modules/@aws-cdk/cfnspec/build-tools/massage-spec.d.ts +0 -4
  9. package/node_modules/@aws-cdk/cfnspec/build-tools/massage-spec.js +2 -61
  10. package/node_modules/@aws-cdk/cfnspec/build-tools/patch-set.d.ts +25 -0
  11. package/node_modules/@aws-cdk/cfnspec/build-tools/patch-set.js +239 -0
  12. package/node_modules/@aws-cdk/cfnspec/build-tools/report-issues.d.ts +4 -0
  13. package/node_modules/@aws-cdk/cfnspec/build-tools/report-issues.js +44 -0
  14. package/node_modules/@aws-cdk/cfnspec/build-tools/split-spec-by-service.d.ts +1 -0
  15. package/node_modules/@aws-cdk/cfnspec/build-tools/split-spec-by-service.js +86 -0
  16. package/node_modules/@aws-cdk/cfnspec/build-tools/template/LICENSE +1 -1
  17. package/node_modules/@aws-cdk/cfnspec/build-tools/template/NOTICE +1 -1
  18. package/node_modules/@aws-cdk/cfnspec/build-tools/update-metrics.sh +2 -0
  19. package/node_modules/@aws-cdk/cfnspec/build-tools/update.sh +34 -18
  20. package/node_modules/@aws-cdk/cfnspec/build-tools/validate-cfn.d.ts +67 -0
  21. package/node_modules/@aws-cdk/cfnspec/build-tools/validate-cfn.js +285 -0
  22. package/node_modules/@aws-cdk/cfnspec/coverage/build-tools/index.html +49 -20
  23. package/node_modules/@aws-cdk/cfnspec/coverage/build-tools/massage-spec.ts.html +12 -166
  24. package/node_modules/@aws-cdk/cfnspec/coverage/build-tools/patch-set.ts.html +907 -0
  25. package/node_modules/@aws-cdk/cfnspec/coverage/build-tools/scrutiny.ts.html +1 -2
  26. package/node_modules/@aws-cdk/cfnspec/coverage/build-tools/validate-cfn.ts.html +1093 -0
  27. package/node_modules/@aws-cdk/cfnspec/coverage/index.html +34 -35
  28. package/node_modules/@aws-cdk/cfnspec/coverage/junit.xml +6272 -6232
  29. package/node_modules/@aws-cdk/cfnspec/coverage/lcov-report/build-tools/index.html +49 -20
  30. package/node_modules/@aws-cdk/cfnspec/coverage/lcov-report/build-tools/massage-spec.ts.html +12 -166
  31. package/node_modules/@aws-cdk/cfnspec/coverage/lcov-report/build-tools/patch-set.ts.html +907 -0
  32. package/node_modules/@aws-cdk/cfnspec/coverage/lcov-report/build-tools/scrutiny.ts.html +1 -2
  33. package/node_modules/@aws-cdk/cfnspec/coverage/lcov-report/build-tools/validate-cfn.ts.html +1093 -0
  34. package/node_modules/@aws-cdk/cfnspec/coverage/lcov-report/index.html +34 -35
  35. package/node_modules/@aws-cdk/cfnspec/coverage/lcov-report/lib/canned-metrics/canned-metrics-schema.ts.html +2 -3
  36. package/node_modules/@aws-cdk/cfnspec/coverage/lcov-report/lib/canned-metrics/index.html +1 -2
  37. package/node_modules/@aws-cdk/cfnspec/coverage/lcov-report/lib/canned-metrics.ts.html +22 -23
  38. package/node_modules/@aws-cdk/cfnspec/coverage/lcov-report/lib/index.html +19 -20
  39. package/node_modules/@aws-cdk/cfnspec/coverage/lcov-report/lib/index.ts.html +96 -25
  40. package/node_modules/@aws-cdk/cfnspec/coverage/lcov-report/lib/schema/augmentation.ts.html +5 -6
  41. package/node_modules/@aws-cdk/cfnspec/coverage/lcov-report/lib/schema/base-types.ts.html +12 -13
  42. package/node_modules/@aws-cdk/cfnspec/coverage/lcov-report/lib/schema/index.html +7 -8
  43. package/node_modules/@aws-cdk/cfnspec/coverage/lcov-report/lib/schema/index.ts.html +11 -12
  44. package/node_modules/@aws-cdk/cfnspec/coverage/lcov-report/lib/schema/property.ts.html +39 -40
  45. package/node_modules/@aws-cdk/cfnspec/coverage/lcov-report/lib/schema/resource-type.ts.html +20 -21
  46. package/node_modules/@aws-cdk/cfnspec/coverage/lcov-report/lib/schema/specification.ts.html +2 -3
  47. package/node_modules/@aws-cdk/cfnspec/coverage/lcov.info +744 -346
  48. package/node_modules/@aws-cdk/cfnspec/coverage/lib/canned-metrics/canned-metrics-schema.ts.html +2 -3
  49. package/node_modules/@aws-cdk/cfnspec/coverage/lib/canned-metrics/index.html +1 -2
  50. package/node_modules/@aws-cdk/cfnspec/coverage/lib/canned-metrics.ts.html +22 -23
  51. package/node_modules/@aws-cdk/cfnspec/coverage/lib/index.html +19 -20
  52. package/node_modules/@aws-cdk/cfnspec/coverage/lib/index.ts.html +96 -25
  53. package/node_modules/@aws-cdk/cfnspec/coverage/lib/schema/augmentation.ts.html +5 -6
  54. package/node_modules/@aws-cdk/cfnspec/coverage/lib/schema/base-types.ts.html +12 -13
  55. package/node_modules/@aws-cdk/cfnspec/coverage/lib/schema/index.html +7 -8
  56. package/node_modules/@aws-cdk/cfnspec/coverage/lib/schema/index.ts.html +11 -12
  57. package/node_modules/@aws-cdk/cfnspec/coverage/lib/schema/property.ts.html +39 -40
  58. package/node_modules/@aws-cdk/cfnspec/coverage/lib/schema/resource-type.ts.html +20 -21
  59. package/node_modules/@aws-cdk/cfnspec/coverage/lib/schema/specification.ts.html +2 -3
  60. package/node_modules/@aws-cdk/cfnspec/lib/canned-metrics/README.md +6 -1
  61. package/node_modules/@aws-cdk/cfnspec/lib/canned-metrics/services.json +19997 -10215
  62. package/node_modules/@aws-cdk/cfnspec/lib/index.d.ts +8 -0
  63. package/node_modules/@aws-cdk/cfnspec/lib/index.js +25 -2
  64. package/node_modules/@aws-cdk/cfnspec/lib/schema/docs.d.ts +20 -0
  65. package/node_modules/@aws-cdk/cfnspec/lib/schema/docs.js +3 -0
  66. package/node_modules/@aws-cdk/cfnspec/lib/schema/index.d.ts +1 -0
  67. package/node_modules/@aws-cdk/cfnspec/lib/schema/index.js +2 -1
  68. package/node_modules/@aws-cdk/cfnspec/package.json +5 -5
  69. package/node_modules/@aws-cdk/cfnspec/spec/cfn-docs.json +38910 -0
  70. package/node_modules/@aws-cdk/cfnspec/spec/cfn-lint.json +3 -3
  71. package/node_modules/@aws-cdk/cfnspec/spec/specification.json +319 -311
  72. package/node_modules/@aws-cdk/cfnspec/tsconfig.tsbuildinfo +285 -179
  73. package/node_modules/@aws-cdk/cloudformation-diff/LICENSE +1 -1
  74. package/node_modules/@aws-cdk/cloudformation-diff/NOTICE +1 -1
  75. package/node_modules/@aws-cdk/cloudformation-diff/package.json +6 -6
  76. package/node_modules/@types/concat-stream/node_modules/@types/node/README.md +1 -1
  77. package/node_modules/@types/concat-stream/node_modules/@types/node/package.json +2 -2
  78. package/node_modules/@types/concat-stream/node_modules/@types/node/process.d.ts +1 -1
  79. package/node_modules/@types/form-data/node_modules/@types/node/README.md +1 -1
  80. package/node_modules/@types/form-data/node_modules/@types/node/package.json +2 -2
  81. package/node_modules/@types/form-data/node_modules/@types/node/process.d.ts +1 -1
  82. package/node_modules/graceful-fs/package.json +1 -1
  83. package/node_modules/graceful-fs/polyfills.js +4 -2
  84. package/node_modules/table/README.md +79 -1
  85. package/node_modules/table/dist/src/alignSpanningCell.d.ts +7 -0
  86. package/node_modules/table/dist/src/alignSpanningCell.js +44 -0
  87. package/node_modules/table/dist/src/alignSpanningCell.js.map +1 -0
  88. package/node_modules/table/dist/src/alignString.js.map +1 -0
  89. package/node_modules/table/dist/src/alignTableData.js +7 -1
  90. package/node_modules/table/dist/src/alignTableData.js.map +1 -0
  91. package/node_modules/table/dist/src/calculateCellHeight.js.map +1 -0
  92. package/node_modules/table/dist/src/calculateMaximumColumnWidths.d.ts +7 -0
  93. package/node_modules/table/dist/src/calculateMaximumColumnWidths.js +36 -0
  94. package/node_modules/table/dist/src/calculateMaximumColumnWidths.js.map +1 -0
  95. package/node_modules/table/dist/src/calculateOutputColumnWidths.d.ts +2 -0
  96. package/node_modules/table/dist/src/calculateOutputColumnWidths.js +10 -0
  97. package/node_modules/table/dist/src/calculateOutputColumnWidths.js.map +1 -0
  98. package/node_modules/table/dist/src/calculateRowHeights.js +28 -5
  99. package/node_modules/table/dist/src/calculateRowHeights.js.map +1 -0
  100. package/node_modules/table/dist/src/calculateSpanningCellWidth.d.ts +3 -0
  101. package/node_modules/table/dist/src/calculateSpanningCellWidth.js +26 -0
  102. package/node_modules/table/dist/src/calculateSpanningCellWidth.js.map +1 -0
  103. package/node_modules/table/dist/src/createStream.js +2 -1
  104. package/node_modules/table/dist/src/createStream.js.map +1 -0
  105. package/node_modules/table/dist/src/drawBorder.d.ts +27 -19
  106. package/node_modules/table/dist/src/drawBorder.js +164 -63
  107. package/node_modules/table/dist/src/drawBorder.js.map +1 -0
  108. package/node_modules/table/dist/src/drawContent.d.ts +10 -5
  109. package/node_modules/table/dist/src/drawContent.js +31 -7
  110. package/node_modules/table/dist/src/drawContent.js.map +1 -0
  111. package/node_modules/table/dist/src/drawRow.d.ts +6 -2
  112. package/node_modules/table/dist/src/drawRow.js +6 -2
  113. package/node_modules/table/dist/src/drawRow.js.map +1 -0
  114. package/node_modules/table/dist/src/drawTable.d.ts +1 -1
  115. package/node_modules/table/dist/src/drawTable.js +10 -18
  116. package/node_modules/table/dist/src/drawTable.js.map +1 -0
  117. package/node_modules/table/dist/src/generated/validators.d.ts +2 -2
  118. package/node_modules/table/dist/src/generated/validators.js +746 -223
  119. package/node_modules/table/dist/src/generated/validators.js.map +1 -0
  120. package/node_modules/table/dist/src/getBorderCharacters.js +16 -0
  121. package/node_modules/table/dist/src/getBorderCharacters.js.map +1 -0
  122. package/node_modules/table/dist/src/index.js.map +1 -0
  123. package/node_modules/table/dist/src/injectHeaderConfig.d.ts +3 -0
  124. package/node_modules/table/dist/src/injectHeaderConfig.js +29 -0
  125. package/node_modules/table/dist/src/injectHeaderConfig.js.map +1 -0
  126. package/node_modules/table/dist/src/makeRangeConfig.d.ts +3 -0
  127. package/node_modules/table/dist/src/makeRangeConfig.js +18 -0
  128. package/node_modules/table/dist/src/makeRangeConfig.js.map +1 -0
  129. package/node_modules/table/dist/src/makeStreamConfig.js.map +1 -0
  130. package/node_modules/table/dist/src/makeTableConfig.d.ts +2 -2
  131. package/node_modules/table/dist/src/makeTableConfig.js +26 -29
  132. package/node_modules/table/dist/src/makeTableConfig.js.map +1 -0
  133. package/node_modules/table/dist/src/mapDataUsingRowHeights.d.ts +2 -0
  134. package/node_modules/table/dist/src/mapDataUsingRowHeights.js +17 -10
  135. package/node_modules/table/dist/src/mapDataUsingRowHeights.js.map +1 -0
  136. package/node_modules/table/dist/src/padTableData.js +7 -1
  137. package/node_modules/table/dist/src/padTableData.js.map +1 -0
  138. package/node_modules/table/dist/src/schemas/config.json +95 -0
  139. package/node_modules/table/dist/src/schemas/shared.json +139 -0
  140. package/node_modules/table/dist/src/schemas/streamConfig.json +25 -0
  141. package/node_modules/table/dist/src/spanningCellManager.d.ts +21 -0
  142. package/node_modules/table/dist/src/spanningCellManager.js +86 -0
  143. package/node_modules/table/dist/src/spanningCellManager.js.map +1 -0
  144. package/node_modules/table/dist/src/stringifyTableData.js.map +1 -0
  145. package/node_modules/table/dist/src/table.js +9 -5
  146. package/node_modules/table/dist/src/table.js.map +1 -0
  147. package/node_modules/table/dist/src/truncateTableData.d.ts +2 -2
  148. package/node_modules/table/dist/src/truncateTableData.js +2 -2
  149. package/node_modules/table/dist/src/truncateTableData.js.map +1 -0
  150. package/node_modules/table/dist/src/types/api.d.ts +21 -5
  151. package/node_modules/table/dist/src/types/api.js.map +1 -0
  152. package/node_modules/table/dist/src/types/internal.js.map +1 -0
  153. package/node_modules/table/dist/src/utils.d.ts +10 -1
  154. package/node_modules/table/dist/src/utils.js +51 -1
  155. package/node_modules/table/dist/src/utils.js.map +1 -0
  156. package/node_modules/table/dist/src/validateConfig.js.map +1 -0
  157. package/node_modules/table/dist/src/validateSpanningCellConfig.d.ts +3 -0
  158. package/node_modules/table/dist/src/validateSpanningCellConfig.js +46 -0
  159. package/node_modules/table/dist/src/validateSpanningCellConfig.js.map +1 -0
  160. package/node_modules/table/dist/src/validateTableData.js.map +1 -0
  161. package/node_modules/table/dist/src/wrapCell.js.map +1 -0
  162. package/node_modules/table/dist/src/wrapString.js.map +1 -0
  163. package/node_modules/table/dist/src/wrapWord.js +2 -2
  164. package/node_modules/table/dist/src/wrapWord.js.map +1 -0
  165. package/node_modules/table/package.json +2 -3
  166. package/package.json +6 -6
  167. package/node_modules/table/dist/src/calculateCellWidths.d.ts +0 -5
  168. package/node_modules/table/dist/src/calculateCellWidths.js +0 -17
  169. package/node_modules/table/dist/src/calculateColumnWidths.d.ts +0 -6
  170. package/node_modules/table/dist/src/calculateColumnWidths.js +0 -17
  171. package/node_modules/table/dist/src/drawHeader.d.ts +0 -2
  172. package/node_modules/table/dist/src/drawHeader.js +0 -30
@@ -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,4 @@
1
+ /**
2
+ * Report on spec fragment files that are being held back.
3
+ */
4
+ export {};
@@ -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,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-2021 Amazon.com, Inc. or its affiliates. All Rights Reserved.
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-2021 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ Copyright 2018-2022 Amazon.com, Inc. or its affiliates. All Rights Reserved.
@@ -1,6 +1,8 @@
1
1
  #!/bin/bash
2
2
  set -eu
3
3
 
4
+ # Run this script on the tarball found in the release artifacts of the CloudWatchConsoleServiceDirectory package.
5
+
4
6
  explorer_tarball="$1"
5
7
 
6
8
  target_file=lib/canned-metrics/services.json
@@ -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 target=$3
16
+ local targetdir=$3
17
17
  local gunzip=$4
18
+ local split=$5
18
19
 
19
- local intermediate="$(mktemp -d)/new.json"
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 ${target})" ]; then
23
- echo "The file ${target} has changes, revert them before cfn-update"
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 - > ${intermediate}
33
+ curl -sL "${url}" | gunzip - > ${newspec}
30
34
  else
31
- curl -sL "${url}" > ${intermediate}
35
+ curl -sL "${url}" > ${newspec}
32
36
  fi
33
37
 
34
- echo >&2 "Sorting..."
35
- sort-json ${intermediate}
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}" "${target}" "${intermediate}" >> CHANGELOG.md.new
39
- echo "" >> CHANGELOG.md.new
51
+ node build-tools/spec-diff.js "${title}" "${oldcombined}" "${newcombined}" >> CHANGELOG.md.new
40
52
 
41
- echo >&2 "Updating source spec..."
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/000_CloudFormationResourceSpecification.json \
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/000_CloudFormationResourceSpecification.json').ResourceSpecificationVersion" > cfn.version
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/000_sam.spec.json \
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 {};