node-backpack 0.0.4

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.
@@ -0,0 +1,352 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.Bundle = void 0;
27
+ const os = __importStar(require("os"));
28
+ const path = __importStar(require("path"));
29
+ const esbuild = __importStar(require("esbuild"));
30
+ const fs = __importStar(require("fs-extra"));
31
+ const _attributions_1 = require("./_attributions");
32
+ const _shell_1 = require("./_shell");
33
+ const violation_1 = require("./violation");
34
+ const DEFAULT_ALLOWED_LICENSES = [
35
+ 'Apache-2.0',
36
+ 'MIT',
37
+ 'BSD-3-Clause',
38
+ 'ISC',
39
+ 'BSD-2-Clause',
40
+ '0BSD',
41
+ ];
42
+ /**
43
+ * Bundle class to validate and pack nodejs bundles.
44
+ */
45
+ class Bundle {
46
+ constructor(props) {
47
+ var _a, _b, _c, _d, _e;
48
+ this.packageDir = props.packageDir;
49
+ this.noticePath = (_a = props.attributionsFile) !== null && _a !== void 0 ? _a : 'THIRD_PARTY_LICENSES';
50
+ this.manifest = fs.readJsonSync(path.join(this.packageDir, 'package.json'));
51
+ this.externals = (_b = props.externals) !== null && _b !== void 0 ? _b : {};
52
+ this.resources = (_c = props.resources) !== null && _c !== void 0 ? _c : {};
53
+ this.test = props.test;
54
+ this.allowedLicenses = (_d = props.allowedLicenses) !== null && _d !== void 0 ? _d : DEFAULT_ALLOWED_LICENSES;
55
+ this.dontAttribute = props.dontAttribute;
56
+ this.entryPoints = {};
57
+ const entryPoints = (_e = props.entryPoints) !== null && _e !== void 0 ? _e : (this.manifest.main ? [this.manifest.main] : []);
58
+ if (entryPoints.length === 0) {
59
+ throw new Error('Must configure at least 1 entrypoint');
60
+ }
61
+ for (const entrypoint of entryPoints) {
62
+ if (!fs.existsSync(path.join(this.packageDir, entrypoint))) {
63
+ throw new Error(`Unable to locate entrypoint: ${entrypoint}`);
64
+ }
65
+ this.entryPoints[entrypoint.replace('.js', '')] = entrypoint;
66
+ }
67
+ }
68
+ /**
69
+ * Validate the bundle for violations.
70
+ *
71
+ * If `fix` is set to true, this method will return the remaining
72
+ * violations after the fixes were applied.
73
+ *
74
+ * This method never throws. The Caller is responsible for inspecting the
75
+ * returned report and act accordingly.
76
+ */
77
+ validate(options = {}) {
78
+ var _a;
79
+ const fix = (_a = options.fix) !== null && _a !== void 0 ? _a : false;
80
+ // first validate
81
+ const circularImports = this.validateCircularImports();
82
+ const resources = this.validateResources();
83
+ const attributions = this.validateAttributions();
84
+ const report = new violation_1.ViolationsReport([...circularImports, ...resources, ...attributions]);
85
+ if (!fix) {
86
+ return report;
87
+ }
88
+ for (const violation of report.violations) {
89
+ if (violation.fix) {
90
+ violation.fix();
91
+ }
92
+ }
93
+ // return the un fixable violations
94
+ return new violation_1.ViolationsReport(report.violations.filter(v => !v.fix));
95
+ }
96
+ /**
97
+ * Write the bundle version of the project to a temp directory.
98
+ * This directory is what the tool will end up packing.
99
+ *
100
+ * Returns the temp directory location.
101
+ */
102
+ write() {
103
+ const target = fs.mkdtempSync(path.join(os.tmpdir(), 'bundle-write-'));
104
+ // we definitely don't need these directories in the package
105
+ // so no need to copy them over.
106
+ const ignoreDirectories = ['node_modules', '.git'];
107
+ // copy the entire project since we are retaining the original files.
108
+ fs.copySync(this.packageDir, target, { filter: n => !n.split(path.sep).some((p => ignoreDirectories.includes(p))) });
109
+ // clone the original manifest since we are going to
110
+ // to mutate it.
111
+ const manifest = { ...this.manifest };
112
+ // manifest mutations
113
+ this.removeDependencies(manifest);
114
+ this.addExternals(manifest);
115
+ // write artifacts
116
+ this.writeOutputs(target);
117
+ this.writeResources(target);
118
+ this.writeManifest(target, manifest);
119
+ return target;
120
+ }
121
+ /**
122
+ * Write the bundle and create the tarball.
123
+ *
124
+ * Returns the location of the tarball.
125
+ */
126
+ pack(options = {}) {
127
+ var _a;
128
+ const target = (_a = options.target) !== null && _a !== void 0 ? _a : this.packageDir;
129
+ const report = this.validate();
130
+ if (!report.success) {
131
+ throw new Error(`Unable to pack due to validation errors.\n\n${report.summary}`);
132
+ }
133
+ if (!fs.existsSync(target)) {
134
+ throw new Error(`Target doesnt exist: ${target}`);
135
+ }
136
+ // resolve symlinks.
137
+ const realTarget = fs.realpathSync(target);
138
+ if (!fs.lstatSync(realTarget).isDirectory()) {
139
+ throw new Error(`Target must be a directory: ${target}`);
140
+ }
141
+ console.log('Writing bundle');
142
+ const bundleDir = this.write();
143
+ try {
144
+ if (this.test) {
145
+ const command = `${path.join(bundleDir, this.test)}`;
146
+ console.log(`Running santiy test: ${command}`);
147
+ (0, _shell_1.shell)(command, { cwd: bundleDir });
148
+ }
149
+ // create the tarball
150
+ console.log('Packing');
151
+ const tarball = (0, _shell_1.shell)('npm pack', { quiet: true, cwd: bundleDir }).trim();
152
+ const dest = path.join(realTarget, tarball);
153
+ fs.copySync(path.join(bundleDir, tarball), dest, { recursive: true });
154
+ return dest;
155
+ }
156
+ finally {
157
+ fs.removeSync(bundleDir);
158
+ }
159
+ }
160
+ get bundle() {
161
+ if (this._bundle) {
162
+ return this._bundle;
163
+ }
164
+ this._bundle = this.esbuild();
165
+ return this._bundle;
166
+ }
167
+ get dependencies() {
168
+ if (this._dependencies) {
169
+ return this._dependencies;
170
+ }
171
+ const inputs = Object.keys(this.bundle.metafile.inputs);
172
+ const packages = new Set(Array.from(inputs).map(i => this.closestPackagePath(path.join(this.packageDir, i))));
173
+ this._dependencies = Array.from(packages).map(p => this.createPackage(p)).filter(d => d.name !== this.manifest.name);
174
+ return this._dependencies;
175
+ }
176
+ get dependenciesRoot() {
177
+ if (this._dependenciesRoot) {
178
+ return this._dependenciesRoot;
179
+ }
180
+ const lcp = longestCommonParent(this.dependencies.map(d => d.path));
181
+ this._dependenciesRoot = this.closestPackagePath(lcp);
182
+ return this._dependenciesRoot;
183
+ }
184
+ get attributions() {
185
+ if (this._attributions == null) {
186
+ this._attributions = new _attributions_1.Attributions({
187
+ packageDir: this.packageDir,
188
+ packageName: this.manifest.name,
189
+ filePath: this.noticePath,
190
+ dependencies: this.dependencies,
191
+ dependenciesRoot: this.dependenciesRoot,
192
+ exclude: this.dontAttribute,
193
+ allowedLicenses: this.allowedLicenses,
194
+ });
195
+ }
196
+ return this._attributions;
197
+ }
198
+ findExternalDependencyVersion(name) {
199
+ var _a, _b;
200
+ const versions = new Set();
201
+ // external dependencies will not exist in the dependencies list
202
+ // since esbuild skips over them. but they will exist as a dependency of
203
+ // one of them (or of us)
204
+ for (const pkg of [...this.dependencies, this.createPackage(this.packageDir)]) {
205
+ const manifest = fs.readJSONSync(path.join(pkg.path, 'package.json'));
206
+ const runtime = ((_a = manifest.dependencies) !== null && _a !== void 0 ? _a : {})[name];
207
+ const optional = ((_b = manifest.optionalDependencies) !== null && _b !== void 0 ? _b : {})[name];
208
+ const pin = (version) => (version.startsWith('^') || version.startsWith('~')) ? version.substring(1) : version;
209
+ if (runtime) {
210
+ versions.add(pin(runtime));
211
+ }
212
+ if (optional) {
213
+ versions.add(pin(optional));
214
+ }
215
+ }
216
+ if (versions.size === 0) {
217
+ throw new Error(`Unable to detect version for external dependency: ${name}`);
218
+ }
219
+ if (versions.size > 1) {
220
+ throw new Error(`Multiple versions detected for external dependency: ${name} (${Array.from(versions).join(',')})`);
221
+ }
222
+ return versions.values().next().value;
223
+ }
224
+ closestPackagePath(fdp) {
225
+ if (fs.existsSync(path.join(fdp, 'package.json'))) {
226
+ return fdp;
227
+ }
228
+ if (path.dirname(fdp) === fdp) {
229
+ throw new Error('Unable to find package manifest');
230
+ }
231
+ return this.closestPackagePath(path.dirname(fdp));
232
+ }
233
+ createPackage(packageDir) {
234
+ const manifestPath = path.join(packageDir, 'package.json');
235
+ const manifest = fs.readJSONSync(manifestPath);
236
+ return { path: packageDir, name: manifest.name, version: manifest.version };
237
+ }
238
+ esbuild() {
239
+ var _a, _b;
240
+ const bundle = esbuild.buildSync({
241
+ entryPoints: this.entryPoints,
242
+ bundle: true,
243
+ target: 'node12',
244
+ platform: 'node',
245
+ sourcemap: 'inline',
246
+ metafile: true,
247
+ treeShaking: true,
248
+ absWorkingDir: this.packageDir,
249
+ external: [...((_a = this.externals.dependencies) !== null && _a !== void 0 ? _a : []), ...((_b = this.externals.optionalDependencies) !== null && _b !== void 0 ? _b : [])],
250
+ write: false,
251
+ outdir: this.packageDir,
252
+ allowOverwrite: true,
253
+ });
254
+ if (bundle.warnings.length > 0) {
255
+ // esbuild warnings are usually important, lets try to be strict here.
256
+ // the warnings themselves are printed on screen.
257
+ throw new Error(`Found ${bundle.warnings.length} bundling warnings (See above)`);
258
+ }
259
+ return bundle;
260
+ }
261
+ validateCircularImports() {
262
+ console.log('Validating circular imports');
263
+ const violations = [];
264
+ const packages = [this.packageDir, ...this.dependencies.map(d => d.path)];
265
+ try {
266
+ // we don't use the programmatic API since it only offers an async API.
267
+ // prefer to stay sync for now since its easier to integrate with other tooling.
268
+ // will offer an async API further down the road.
269
+ const command = `${require.resolve('madge/bin/cli.js')} --json --warning --no-color --no-spinner --circular --extensions js ${packages.join(' ')}`;
270
+ (0, _shell_1.shell)(command, { quiet: true });
271
+ }
272
+ catch (e) {
273
+ const imports = JSON.parse(e.stdout.toString().trim());
274
+ for (const imp of imports) {
275
+ violations.push({ type: violation_1.ViolationType.CIRCULAR_IMPORT, message: `${imp.join(' -> ')}` });
276
+ }
277
+ }
278
+ return violations;
279
+ }
280
+ validateResources() {
281
+ console.log('Validating resources');
282
+ const violations = [];
283
+ for (const [src, _] of Object.entries(this.resources)) {
284
+ if (!fs.existsSync(path.join(this.packageDir, src))) {
285
+ violations.push({
286
+ type: violation_1.ViolationType.MISSING_RESOURCE,
287
+ message: `Unable to find resource (${src}) relative to the package directory`,
288
+ });
289
+ }
290
+ }
291
+ return violations;
292
+ }
293
+ validateAttributions() {
294
+ console.log('Validating attributions');
295
+ return this.attributions.validate().violations;
296
+ }
297
+ addExternals(manifest) {
298
+ var _a, _b, _c, _d;
299
+ // external dependencies should be specified as runtime dependencies
300
+ for (const external of (_a = this.externals.dependencies) !== null && _a !== void 0 ? _a : []) {
301
+ const version = this.findExternalDependencyVersion(external);
302
+ manifest.dependencies = (_b = manifest.dependencies) !== null && _b !== void 0 ? _b : {};
303
+ manifest.dependencies[external] = version;
304
+ }
305
+ // external dependencies should be specified as optional dependencies
306
+ for (const external of (_c = this.externals.optionalDependencies) !== null && _c !== void 0 ? _c : []) {
307
+ const version = this.findExternalDependencyVersion(external);
308
+ manifest.optionalDependencies = (_d = manifest.optionalDependencies) !== null && _d !== void 0 ? _d : {};
309
+ manifest.optionalDependencies[external] = version;
310
+ }
311
+ }
312
+ removeDependencies(manifest) {
313
+ var _a;
314
+ for (const [d, v] of Object.entries(this.manifest.dependencies)) {
315
+ manifest.devDependencies = (_a = manifest.devDependencies) !== null && _a !== void 0 ? _a : {};
316
+ manifest.devDependencies[d] = v;
317
+ delete manifest.dependencies[d];
318
+ }
319
+ }
320
+ writeOutputs(workDir) {
321
+ var _a;
322
+ for (const output of (_a = this.bundle.outputFiles) !== null && _a !== void 0 ? _a : []) {
323
+ const out = output.path.replace(this.packageDir, workDir);
324
+ fs.writeFileSync(out, output.contents);
325
+ }
326
+ }
327
+ writeResources(workdir) {
328
+ for (const [src, dst] of Object.entries(this.resources)) {
329
+ const to = path.join(workdir, dst);
330
+ fs.copySync(path.join(this.packageDir, src), to, { recursive: true });
331
+ }
332
+ }
333
+ writeManifest(workDir, manifest) {
334
+ fs.writeFileSync(path.join(workDir, 'package.json'), JSON.stringify(manifest, null, 2));
335
+ }
336
+ }
337
+ exports.Bundle = Bundle;
338
+ function longestCommonParent(paths) {
339
+ function _longestCommonParent(p1, p2) {
340
+ const dirs1 = p1.split(path.sep);
341
+ const dirs2 = p2.split(path.sep);
342
+ const parent = [];
343
+ for (let i = 0; i < Math.min(dirs1.length, dirs2.length); i++) {
344
+ if (dirs1[i] !== dirs2[i])
345
+ break;
346
+ parent.push(dirs1[i]);
347
+ }
348
+ return parent.join(path.sep);
349
+ }
350
+ return paths.reduce(_longestCommonParent);
351
+ }
352
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVuZGxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwaS9idW5kbGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSx1Q0FBeUI7QUFDekIsMkNBQTZCO0FBQzdCLGlEQUFtQztBQUNuQyw2Q0FBK0I7QUFDL0IsbURBQStDO0FBQy9DLHFDQUFpQztBQUNqQywyQ0FBeUU7QUFFekUsTUFBTSx3QkFBd0IsR0FBRztJQUMvQixZQUFZO0lBQ1osS0FBSztJQUNMLGNBQWM7SUFDZCxLQUFLO0lBQ0wsY0FBYztJQUNkLE1BQU07Q0FDUCxDQUFDO0FBd0hGOztHQUVHO0FBQ0gsTUFBYSxNQUFNO0lBbUJqQixZQUFZLEtBQWtCOztRQUM1QixJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUM7UUFDbkMsSUFBSSxDQUFDLFVBQVUsR0FBRyxNQUFBLEtBQUssQ0FBQyxnQkFBZ0IsbUNBQUksc0JBQXNCLENBQUM7UUFDbkUsSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFDO1FBQzVFLElBQUksQ0FBQyxTQUFTLEdBQUcsTUFBQSxLQUFLLENBQUMsU0FBUyxtQ0FBSSxFQUFFLENBQUM7UUFDdkMsSUFBSSxDQUFDLFNBQVMsR0FBRyxNQUFBLEtBQUssQ0FBQyxTQUFTLG1DQUFJLEVBQUUsQ0FBQztRQUN2QyxJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUM7UUFDdkIsSUFBSSxDQUFDLGVBQWUsR0FBRyxNQUFBLEtBQUssQ0FBQyxlQUFlLG1DQUFJLHdCQUF3QixDQUFDO1FBQ3pFLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDLGFBQWEsQ0FBQztRQUN6QyxJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQztR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cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgb3MgZnJvbSAnb3MnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIGVzYnVpbGQgZnJvbSAnZXNidWlsZCc7XG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcy1leHRyYSc7XG5pbXBvcnQgeyBBdHRyaWJ1dGlvbnMgfSBmcm9tICcuL19hdHRyaWJ1dGlvbnMnO1xuaW1wb3J0IHsgc2hlbGwgfSBmcm9tICcuL19zaGVsbCc7XG5pbXBvcnQgeyBWaW9sYXRpb24sIFZpb2xhdGlvblR5cGUsIFZpb2xhdGlvbnNSZXBvcnQgfSBmcm9tICcuL3Zpb2xhdGlvbic7XG5cbmNvbnN0IERFRkFVTFRfQUxMT1dFRF9MSUNFTlNFUyA9IFtcbiAgJ0FwYWNoZS0yLjAnLFxuICAnTUlUJyxcbiAgJ0JTRC0zLUNsYXVzZScsXG4gICdJU0MnLFxuICAnQlNELTItQ2xhdXNlJyxcbiAgJzBCU0QnLFxuXTtcblxuLyoqXG4gKiBCdW5kbGluZyBwcm9wZXJ0aWVzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1bmRsZVByb3BzIHtcblxuICAvKipcbiAgICogRGlyZWN0b3J5IHdoZXJlIHRoZSBwYWNrYWdlIHRvIGJ1bmRsZSBpcyBsb2NhdGVkIGF0LlxuICAgKi9cbiAgcmVhZG9ubHkgcGFja2FnZURpcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBMaXN0IG9mIGVudHJ5LXBvaW50cyB0byBidW5kbGUuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdGhlICdtYWluJyBmaWxlIGFzIHNwZWNpZmllZCBpbiBwYWNrYWdlLmpzb24uXG4gICAqL1xuICByZWFkb25seSBlbnRyeVBvaW50cz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBQYXRoIHRvIGF0dHJpYnV0aW9ucyBmaWxlIHRoYXQgd2lsbCBiZSBjcmVhdGVkIC8gdmFsaWRhdGVkLlxuICAgKiBUaGlzIHBhdGggaXMgcmVsYXRpdmUgdG8gdGhlIHBhY2thZ2UgZGlyZWN0b3J5LlxuICAgKlxuICAgKiBAZGVmYXVsdCAnVEhJUkRfUEFSVFlfTElDRU5TRVMnXG4gICAqL1xuICByZWFkb25seSBhdHRyaWJ1dGlvbnNGaWxlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBFeHRlcm5hbCBwYWNrYWdlcyB0aGF0IGNhbm5vdCBiZSBidW5kbGVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGV4dGVybmFsIHJlZmVyZW5jZXMuXG4gICAqL1xuICByZWFkb25seSBleHRlcm5hbHM/OiBFeHRlcm5hbHM7XG5cbiAgLyoqXG4gICAqIEV4dGVybmFsIHJlc291cmNlcyB0aGF0IG5lZWQgdG8gYmUgZW1iZWRkZWQgaW4gdGhlIGJ1bmRsZS5cbiAgICpcbiAgICogVGhlc2Ugd2lsbCBiZSBjb3BpZWQgb3ZlciB0byB0aGUgYXBwcm9wcmlhdGUgcGF0aHMgYmVmb3JlIHBhY2thZ2luZy5cbiAgICovXG4gIHJlYWRvbmx5IHJlc291cmNlcz86IHtbc3JjOiBzdHJpbmddOiBzdHJpbmd9O1xuXG4gIC8qKlxuICAgKiBBIGxpc3Qgb2YgbGljZW5zZXMgdGhhdCBhcmUgYWxsb3dlZCBmb3IgYnVuZGxpbmcuXG4gICAqIElmIGFueSBkZXBlbmRlbmN5IGNvbnRhaW5zIGEgbGljZW5zZSBub3QgaW4gdGhpcyBsaXN0LCBidW5kbGluZyB3aWxsIGZhaWwuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gRGVmYXVsdCBsaXN0XG4gICAqL1xuICByZWFkb25seSBhbGxvd2VkTGljZW5zZXM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogUGFja2FnZXMgbWF0Y2hpbmcgdGhpcyByZWd1bGFyIGV4cHJlc3Npb24gd2lsbCBiZSBleGNsdWRlZCBmcm9tIGF0dHJpYnV0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgZG9udEF0dHJpYnV0ZT86IHN0cmluZztcblxuICAvKipcbiAgICogQmFzaWMgc2FuaXR5IGNoZWNrIHRvIHJ1biBhZ2FpbnN0IHRoZSBjcmVhdGVkIGJ1bmRsZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBjaGVjay5cbiAgICovXG4gIHJlYWRvbmx5IHRlc3Q/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgYEJ1bmRsZS5wYWNrYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdW5kbGVQYWNrT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgdGFyZ2V0IGRpcmVjdG9yeSB0byBjcmVhdGUgdGhlIHBhY2thZ2UgaW4uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdGhlIHBhY2thZ2UgZGlyZWN0b3J5LlxuICAgKi9cbiAgcmVhZG9ubHkgdGFyZ2V0Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJ1bmRsZVZhbGlkYXRlT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBBdXRvbWF0aWNhbGx5IGZpeCBhbnkgKGZpeGFibGUpIHZpb2xhdGlvbnMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBmaXg/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFBhY2thZ2Ugb24gdGhlIGxvY2FsIGZpbGUgc3lzdGVtLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhY2thZ2Uge1xuICAvKipcbiAgICogUGF0aCBvZiB0aGUgZGVwZW5kZW5jeSBvbiB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0uXG4gICAqL1xuICByZWFkb25seSBwYXRoOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBEZXBlbmRlbmN5IG5hbWUuXG4gICAqL1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBEZXBlbmRlbmN5IHZlcnNpb24uXG4gICAqL1xuICByZWFkb25seSB2ZXJzaW9uOiBzdHJpbmc7XG59XG5cbi8qKlxuICogRXh0ZXJuYWwgcGFja2FnZXMgdGhhdCBjYW5ub3QgYmUgYnVuZGxlZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFeHRlcm5hbHMge1xuXG4gIC8qKlxuICAgKiBFeHRlcm5hbCBwYWNrYWdlcyB0aGF0IHNob3VsZCBiZSBsaXN0ZWQgaW4gdGhlIGBkZXBlbmRlbmNpZXNgIHNlY3Rpb25cbiAgICogb2YgdGhlIG1hbmlmZXN0LlxuICAgKi9cbiAgcmVhZG9ubHkgZGVwZW5kZW5jaWVzPzogcmVhZG9ubHkgc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEV4dGVybmFsIHBhY2thZ2VzIHRoYXQgc2hvdWxkIGJlIGxpc3RlZCBpbiB0aGUgYG9wdGlvbmFsRGVwZW5kZW5jaWVzYCBzZWN0aW9uXG4gICAqIG9mIHRoZSBtYW5pZmVzdC5cbiAgICovXG4gIHJlYWRvbmx5IG9wdGlvbmFsRGVwZW5kZW5jaWVzPzogcmVhZG9ubHkgc3RyaW5nW107XG5cbn1cblxuLyoqXG4gKiBCdW5kbGUgY2xhc3MgdG8gdmFsaWRhdGUgYW5kIHBhY2sgbm9kZWpzIGJ1bmRsZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBCdW5kbGUge1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgbWFuaWZlc3Q6IGFueTtcbiAgcHJpdmF0ZSByZWFkb25seSBub3RpY2VQYXRoOiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBwYWNrYWdlRGlyOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgZW50cnlQb2ludHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIHByaXZhdGUgcmVhZG9ubHkgZXh0ZXJuYWxzOiBFeHRlcm5hbHM7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVzb3VyY2VzOiB7W3NyYzogc3RyaW5nXTogc3RyaW5nfTtcbiAgcHJpdmF0ZSByZWFkb25seSBhbGxvd2VkTGljZW5zZXM6IHN0cmluZ1tdO1xuICBwcml2YXRlIHJlYWRvbmx5IGRvbnRBdHRyaWJ1dGU/OiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgdGVzdD86IHN0cmluZztcblxuICBwcml2YXRlIF9idW5kbGU/OiBlc2J1aWxkLkJ1aWxkUmVzdWx0O1xuICBwcml2YXRlIF9kZXBlbmRlbmNpZXM/OiBQYWNrYWdlW107XG4gIHByaXZhdGUgX2RlcGVuZGVuY2llc1Jvb3Q/OiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSBfYXR0cmlidXRpb25zPzogQXR0cmlidXRpb25zO1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzOiBCdW5kbGVQcm9wcykge1xuICAgIHRoaXMucGFja2FnZURpciA9IHByb3BzLnBhY2thZ2VEaXI7XG4gICAgdGhpcy5ub3RpY2VQYXRoID0gcHJvcHMuYXR0cmlidXRpb25zRmlsZSA/PyAnVEhJUkRfUEFSVFlfTElDRU5TRVMnO1xuICAgIHRoaXMubWFuaWZlc3QgPSBmcy5yZWFkSnNvblN5bmMocGF0aC5qb2luKHRoaXMucGFja2FnZURpciwgJ3BhY2thZ2UuanNvbicpKTtcbiAgICB0aGlzLmV4dGVybmFscyA9IHByb3BzLmV4dGVybmFscyA/PyB7fTtcbiAgICB0aGlzLnJlc291cmNlcyA9IHByb3BzLnJlc291cmNlcyA/PyB7fTtcbiAgICB0aGlzLnRlc3QgPSBwcm9wcy50ZXN0O1xuICAgIHRoaXMuYWxsb3dlZExpY2Vuc2VzID0gcHJvcHMuYWxsb3dlZExpY2Vuc2VzID8/IERFRkFVTFRfQUxMT1dFRF9MSUNFTlNFUztcbiAgICB0aGlzLmRvbnRBdHRyaWJ1dGUgPSBwcm9wcy5kb250QXR0cmlidXRlO1xuICAgIHRoaXMuZW50cnlQb2ludHMgPSB7fTtcblxuICAgIGNvbnN0IGVudHJ5UG9pbnRzID0gcHJvcHMuZW50cnlQb2ludHMgPz8gKHRoaXMubWFuaWZlc3QubWFpbiA/IFt0aGlzLm1hbmlmZXN0Lm1haW5dIDogW10pO1xuXG4gICAgaWYgKGVudHJ5UG9pbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNdXN0IGNvbmZpZ3VyZSBhdCBsZWFzdCAxIGVudHJ5cG9pbnQnKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGVudHJ5cG9pbnQgb2YgZW50cnlQb2ludHMpIHtcbiAgICAgIGlmICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4odGhpcy5wYWNrYWdlRGlyLCBlbnRyeXBvaW50KSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gbG9jYXRlIGVudHJ5cG9pbnQ6ICR7ZW50cnlwb2ludH1gKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZW50cnlQb2ludHNbZW50cnlwb2ludC5yZXBsYWNlKCcuanMnLCAnJyldID0gZW50cnlwb2ludDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgdGhlIGJ1bmRsZSBmb3IgdmlvbGF0aW9ucy5cbiAgICpcbiAgICogSWYgYGZpeGAgaXMgc2V0IHRvIHRydWUsIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIHRoZSByZW1haW5pbmdcbiAgICogdmlvbGF0aW9ucyBhZnRlciB0aGUgZml4ZXMgd2VyZSBhcHBsaWVkLlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBuZXZlciB0aHJvd3MuIFRoZSBDYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGluc3BlY3RpbmcgdGhlXG4gICAqIHJldHVybmVkIHJlcG9ydCBhbmQgYWN0IGFjY29yZGluZ2x5LlxuICAgKi9cbiAgcHVibGljIHZhbGlkYXRlKG9wdGlvbnM6IEJ1bmRsZVZhbGlkYXRlT3B0aW9ucyA9IHt9KTogVmlvbGF0aW9uc1JlcG9ydCB7XG5cbiAgICBjb25zdCBmaXggPSBvcHRpb25zLmZpeCA/PyBmYWxzZTtcblxuICAgIC8vIGZpcnN0IHZhbGlkYXRlXG4gICAgY29uc3QgY2lyY3VsYXJJbXBvcnRzID0gdGhpcy52YWxpZGF0ZUNpcmN1bGFySW1wb3J0cygpO1xuICAgIGNvbnN0IHJlc291cmNlcyA9IHRoaXMudmFsaWRhdGVSZXNvdXJjZXMoKTtcbiAgICBjb25zdCBhdHRyaWJ1dGlvbnMgPSB0aGlzLnZhbGlkYXRlQXR0cmlidXRpb25zKCk7XG5cbiAgICBjb25zdCByZXBvcnQgPSBuZXcgVmlvbGF0aW9uc1JlcG9ydChbLi4uY2lyY3VsYXJJbXBvcnRzLCAuLi5yZXNvdXJjZXMsIC4uLmF0dHJpYnV0aW9uc10pO1xuXG4gICAgaWYgKCFmaXgpIHtcbiAgICAgIHJldHVybiByZXBvcnQ7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCB2aW9sYXRpb24gb2YgcmVwb3J0LnZpb2xhdGlvbnMpIHtcbiAgICAgIGlmICh2aW9sYXRpb24uZml4KSB7XG4gICAgICAgIHZpb2xhdGlvbi5maXgoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyByZXR1cm4gdGhlIHVuIGZpeGFibGUgdmlvbGF0aW9uc1xuICAgIHJldHVybiBuZXcgVmlvbGF0aW9uc1JlcG9ydChyZXBvcnQudmlvbGF0aW9ucy5maWx0ZXIodiA9PiAhdi5maXgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXcml0ZSB0aGUgYnVuZGxlIHZlcnNpb24gb2YgdGhlIHByb2plY3QgdG8gYSB0ZW1wIGRpcmVjdG9yeS5cbiAgICogVGhpcyBkaXJlY3RvcnkgaXMgd2hhdCB0aGUgdG9vbCB3aWxsIGVuZCB1cCBwYWNraW5nLlxuICAgKlxuICAgKiBSZXR1cm5zIHRoZSB0ZW1wIGRpcmVjdG9yeSBsb2NhdGlvbi5cbiAgICovXG4gIHB1YmxpYyB3cml0ZSgpOiBzdHJpbmcge1xuXG4gICAgY29uc3QgdGFyZ2V0ID0gZnMubWtkdGVtcFN5bmMocGF0aC5qb2luKG9zLnRtcGRpcigpLCAnYnVuZGxlLXdyaXRlLScpKTtcblxuICAgIC8vIHdlIGRlZmluaXRlbHkgZG9uJ3QgbmVlZCB0aGVzZSBkaXJlY3RvcmllcyBpbiB0aGUgcGFja2FnZVxuICAgIC8vIHNvIG5vIG5lZWQgdG8gY29weSB0aGVtIG92ZXIuXG4gICAgY29uc3QgaWdub3JlRGlyZWN0b3JpZXMgPSBbJ25vZGVfbW9kdWxlcycsICcuZ2l0J107XG5cbiAgICAvLyBjb3B5IHRoZSBlbnRpcmUgcHJvamVjdCBzaW5jZSB3ZSBhcmUgcmV0YWluaW5nIHRoZSBvcmlnaW5hbCBmaWxlcy5cbiAgICBmcy5jb3B5U3luYyh0aGlzLnBhY2thZ2VEaXIsIHRhcmdldCwgeyBmaWx0ZXI6IG4gPT4gIW4uc3BsaXQocGF0aC5zZXApLnNvbWUoKHAgPT4gaWdub3JlRGlyZWN0b3JpZXMuaW5jbHVkZXMocCkpKSB9KTtcblxuICAgIC8vIGNsb25lIHRoZSBvcmlnaW5hbCBtYW5pZmVzdCBzaW5jZSB3ZSBhcmUgZ29pbmcgdG9cbiAgICAvLyB0byBtdXRhdGUgaXQuXG4gICAgY29uc3QgbWFuaWZlc3QgPSB7IC4uLnRoaXMubWFuaWZlc3QgfTtcblxuICAgIC8vIG1hbmlmZXN0IG11dGF0aW9uc1xuICAgIHRoaXMucmVtb3ZlRGVwZW5kZW5jaWVzKG1hbmlmZXN0KTtcbiAgICB0aGlzLmFkZEV4dGVybmFscyhtYW5pZmVzdCk7XG5cbiAgICAvLyB3cml0ZSBhcnRpZmFjdHNcbiAgICB0aGlzLndyaXRlT3V0cHV0cyh0YXJnZXQpO1xuICAgIHRoaXMud3JpdGVSZXNvdXJjZXModGFyZ2V0KTtcbiAgICB0aGlzLndyaXRlTWFuaWZlc3QodGFyZ2V0LCBtYW5pZmVzdCk7XG5cbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9XG5cbiAgLyoqXG4gICAqIFdyaXRlIHRoZSBidW5kbGUgYW5kIGNyZWF0ZSB0aGUgdGFyYmFsbC5cbiAgICpcbiAgICogUmV0dXJucyB0aGUgbG9jYXRpb24gb2YgdGhlIHRhcmJhbGwuXG4gICAqL1xuICBwdWJsaWMgcGFjayhvcHRpb25zOiBCdW5kbGVQYWNrT3B0aW9ucyA9IHt9KTogc3RyaW5nIHtcblxuICAgIGNvbnN0IHRhcmdldCA9IG9wdGlvbnMudGFyZ2V0ID8/IHRoaXMucGFja2FnZURpcjtcblxuICAgIGNvbnN0IHJlcG9ydCA9IHRoaXMudmFsaWRhdGUoKTtcbiAgICBpZiAoIXJlcG9ydC5zdWNjZXNzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBwYWNrIGR1ZSB0byB2YWxpZGF0aW9uIGVycm9ycy5cXG5cXG4ke3JlcG9ydC5zdW1tYXJ5fWApO1xuICAgIH1cblxuICAgIGlmICghZnMuZXhpc3RzU3luYyh0YXJnZXQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRhcmdldCBkb2VzbnQgZXhpc3Q6ICR7dGFyZ2V0fWApO1xuICAgIH1cblxuICAgIC8vIHJlc29sdmUgc3ltbGlua3MuXG4gICAgY29uc3QgcmVhbFRhcmdldCA9IGZzLnJlYWxwYXRoU3luYyh0YXJnZXQpO1xuXG4gICAgaWYgKCFmcy5sc3RhdFN5bmMocmVhbFRhcmdldCkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUYXJnZXQgbXVzdCBiZSBhIGRpcmVjdG9yeTogJHt0YXJnZXR9YCk7XG4gICAgfVxuXG4gICAgY29uc29sZS5sb2coJ1dyaXRpbmcgYnVuZGxlJyk7XG4gICAgY29uc3QgYnVuZGxlRGlyID0gdGhpcy53cml0ZSgpO1xuICAgIHRyeSB7XG5cbiAgICAgIGlmICh0aGlzLnRlc3QpIHtcbiAgICAgICAgY29uc3QgY29tbWFuZCA9IGAke3BhdGguam9pbihidW5kbGVEaXIsIHRoaXMudGVzdCl9YDtcbiAgICAgICAgY29uc29sZS5sb2coYFJ1bm5pbmcgc2FudGl5IHRlc3Q6ICR7Y29tbWFuZH1gKTtcbiAgICAgICAgc2hlbGwoY29tbWFuZCwgeyBjd2Q6IGJ1bmRsZURpciB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gY3JlYXRlIHRoZSB0YXJiYWxsXG4gICAgICBjb25zb2xlLmxvZygnUGFja2luZycpO1xuICAgICAgY29uc3QgdGFyYmFsbCA9IHNoZWxsKCducG0gcGFjaycsIHsgcXVpZXQ6IHRydWUsIGN3ZDogYnVuZGxlRGlyIH0pLnRyaW0oKTtcbiAgICAgIGNvbnN0IGRlc3QgPSBwYXRoLmpvaW4ocmVhbFRhcmdldCwgdGFyYmFsbCk7XG4gICAgICBmcy5jb3B5U3luYyhwYXRoLmpvaW4oYnVuZGxlRGlyLCB0YXJiYWxsKSwgZGVzdCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICByZXR1cm4gZGVzdDtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgZnMucmVtb3ZlU3luYyhidW5kbGVEaXIpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0IGJ1bmRsZSgpOiBlc2J1aWxkLkJ1aWxkUmVzdWx0IHtcbiAgICBpZiAodGhpcy5fYnVuZGxlKSB7XG4gICAgICByZXR1cm4gdGhpcy5fYnVuZGxlO1xuICAgIH1cbiAgICB0aGlzLl9idW5kbGUgPSB0aGlzLmVzYnVpbGQoKTtcbiAgICByZXR1cm4gdGhpcy5fYnVuZGxlO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgZGVwZW5kZW5jaWVzKCk6IFBhY2thZ2VbXSB7XG4gICAgaWYgKHRoaXMuX2RlcGVuZGVuY2llcykge1xuICAgICAgcmV0dXJuIHRoaXMuX2RlcGVuZGVuY2llcztcbiAgICB9XG4gICAgY29uc3QgaW5wdXRzID0gT2JqZWN0LmtleXModGhpcy5idW5kbGUubWV0YWZpbGUhLmlucHV0cyk7XG4gICAgY29uc3QgcGFja2FnZXMgPSBuZXcgU2V0KEFycmF5LmZyb20oaW5wdXRzKS5tYXAoaSA9PiB0aGlzLmNsb3Nlc3RQYWNrYWdlUGF0aChwYXRoLmpvaW4odGhpcy5wYWNrYWdlRGlyLCBpKSkpKTtcbiAgICB0aGlzLl9kZXBlbmRlbmNpZXMgPSBBcnJheS5mcm9tKHBhY2thZ2VzKS5tYXAocCA9PiB0aGlzLmNyZWF0ZVBhY2thZ2UocCkpLmZpbHRlcihkID0+IGQubmFtZSAhPT0gdGhpcy5tYW5pZmVzdC5uYW1lKTtcbiAgICByZXR1cm4gdGhpcy5fZGVwZW5kZW5jaWVzO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgZGVwZW5kZW5jaWVzUm9vdCgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLl9kZXBlbmRlbmNpZXNSb290KSB7XG4gICAgICByZXR1cm4gdGhpcy5fZGVwZW5kZW5jaWVzUm9vdDtcbiAgICB9XG4gICAgY29uc3QgbGNwID0gbG9uZ2VzdENvbW1vblBhcmVudCh0aGlzLmRlcGVuZGVuY2llcy5tYXAoZCA9PiBkLnBhdGgpKTtcbiAgICB0aGlzLl9kZXBlbmRlbmNpZXNSb290ID0gdGhpcy5jbG9zZXN0UGFja2FnZVBhdGgobGNwKTtcbiAgICByZXR1cm4gdGhpcy5fZGVwZW5kZW5jaWVzUm9vdDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IGF0dHJpYnV0aW9ucygpOiBBdHRyaWJ1dGlvbnMge1xuICAgIGlmICh0aGlzLl9hdHRyaWJ1dGlvbnMgPT0gbnVsbCkge1xuICAgICAgdGhpcy5fYXR0cmlidXRpb25zID0gbmV3IEF0dHJpYnV0aW9ucyh7XG4gICAgICAgIHBhY2thZ2VEaXI6IHRoaXMucGFja2FnZURpcixcbiAgICAgICAgcGFja2FnZU5hbWU6IHRoaXMubWFuaWZlc3QubmFtZSxcbiAgICAgICAgZmlsZVBhdGg6IHRoaXMubm90aWNlUGF0aCxcbiAgICAgICAgZGVwZW5kZW5jaWVzOiB0aGlzLmRlcGVuZGVuY2llcyxcbiAgICAgICAgZGVwZW5kZW5jaWVzUm9vdDogdGhpcy5kZXBlbmRlbmNpZXNSb290LFxuICAgICAgICBleGNsdWRlOiB0aGlzLmRvbnRBdHRyaWJ1dGUsXG4gICAgICAgIGFsbG93ZWRMaWNlbnNlczogdGhpcy5hbGxvd2VkTGljZW5zZXMsXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2F0dHJpYnV0aW9ucztcbiAgfVxuXG4gIHByaXZhdGUgZmluZEV4dGVybmFsRGVwZW5kZW5jeVZlcnNpb24obmFtZTogc3RyaW5nKTogc3RyaW5nIHtcblxuICAgIGNvbnN0IHZlcnNpb25zID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICAvLyBleHRlcm5hbCBkZXBlbmRlbmNpZXMgd2lsbCBub3QgZXhpc3QgaW4gdGhlIGRlcGVuZGVuY2llcyBsaXN0XG4gICAgLy8gc2luY2UgZXNidWlsZCBza2lwcyBvdmVyIHRoZW0uIGJ1dCB0aGV5IHdpbGwgZXhpc3QgYXMgYSBkZXBlbmRlbmN5IG9mXG4gICAgLy8gb25lIG9mIHRoZW0gKG9yIG9mIHVzKVxuICAgIGZvciAoY29uc3QgcGtnIG9mIFsuLi50aGlzLmRlcGVuZGVuY2llcywgdGhpcy5jcmVhdGVQYWNrYWdlKHRoaXMucGFja2FnZURpcildKSB7XG4gICAgICBjb25zdCBtYW5pZmVzdCA9IGZzLnJlYWRKU09OU3luYyhwYXRoLmpvaW4ocGtnLnBhdGgsICdwYWNrYWdlLmpzb24nKSk7XG4gICAgICBjb25zdCBydW50aW1lID0gKG1hbmlmZXN0LmRlcGVuZGVuY2llcyA/PyB7fSlbbmFtZV07XG4gICAgICBjb25zdCBvcHRpb25hbCA9IChtYW5pZmVzdC5vcHRpb25hbERlcGVuZGVuY2llcyA/PyB7fSlbbmFtZV07XG5cbiAgICAgIGNvbnN0IHBpbiA9ICh2ZXJzaW9uOiBzdHJpbmcpID0+ICh2ZXJzaW9uLnN0YXJ0c1dpdGgoJ14nKSB8fCB2ZXJzaW9uLnN0YXJ0c1dpdGgoJ34nKSkgPyB2ZXJzaW9uLnN1YnN0cmluZygxKSA6IHZlcnNpb247XG5cbiAgICAgIGlmIChydW50aW1lKSB7XG4gICAgICAgIHZlcnNpb25zLmFkZChwaW4ocnVudGltZSkpO1xuICAgICAgfVxuICAgICAgaWYgKG9wdGlvbmFsKSB7XG4gICAgICAgIHZlcnNpb25zLmFkZChwaW4ob3B0aW9uYWwpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodmVyc2lvbnMuc2l6ZSA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gZGV0ZWN0IHZlcnNpb24gZm9yIGV4dGVybmFsIGRlcGVuZGVuY3k6ICR7bmFtZX1gKTtcbiAgICB9XG5cbiAgICBpZiAodmVyc2lvbnMuc2l6ZSA+IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTXVsdGlwbGUgdmVyc2lvbnMgZGV0ZWN0ZWQgZm9yIGV4dGVybmFsIGRlcGVuZGVuY3k6ICR7bmFtZX0gKCR7QXJyYXkuZnJvbSh2ZXJzaW9ucykuam9pbignLCcpfSlgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmVyc2lvbnMudmFsdWVzKCkubmV4dCgpLnZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSBjbG9zZXN0UGFja2FnZVBhdGgoZmRwOiBzdHJpbmcpOiBzdHJpbmcge1xuXG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGZkcCwgJ3BhY2thZ2UuanNvbicpKSkge1xuICAgICAgcmV0dXJuIGZkcDtcbiAgICB9XG5cbiAgICBpZiAocGF0aC5kaXJuYW1lKGZkcCkgPT09IGZkcCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gZmluZCBwYWNrYWdlIG1hbmlmZXN0Jyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuY2xvc2VzdFBhY2thZ2VQYXRoKHBhdGguZGlybmFtZShmZHApKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlUGFja2FnZShwYWNrYWdlRGlyOiBzdHJpbmcpOiBQYWNrYWdlIHtcbiAgICBjb25zdCBtYW5pZmVzdFBhdGggPSBwYXRoLmpvaW4ocGFja2FnZURpciwgJ3BhY2thZ2UuanNvbicpO1xuICAgIGNvbnN0IG1hbmlmZXN0ID0gZnMucmVhZEpTT05TeW5jKG1hbmlmZXN0UGF0aCk7XG4gICAgcmV0dXJuIHsgcGF0aDogcGFja2FnZURpciwgbmFtZTogbWFuaWZlc3QubmFtZSwgdmVyc2lvbjogbWFuaWZlc3QudmVyc2lvbiB9O1xuICB9XG5cbiAgcHJpdmF0ZSBlc2J1aWxkKCk6IGVzYnVpbGQuQnVpbGRSZXN1bHQge1xuXG4gICAgY29uc3QgYnVuZGxlID0gZXNidWlsZC5idWlsZFN5bmMoe1xuICAgICAgZW50cnlQb2ludHM6IHRoaXMuZW50cnlQb2ludHMsXG4gICAgICBidW5kbGU6IHRydWUsXG4gICAgICB0YXJnZXQ6ICdub2RlMTInLFxuICAgICAgcGxhdGZvcm06ICdub2RlJyxcbiAgICAgIHNvdXJjZW1hcDogJ2lubGluZScsXG4gICAgICBtZXRhZmlsZTogdHJ1ZSxcbiAgICAgIHRyZWVTaGFraW5nOiB0cnVlLFxuICAgICAgYWJzV29ya2luZ0RpcjogdGhpcy5wYWNrYWdlRGlyLFxuICAgICAgZXh0ZXJuYWw6IFsuLi4odGhpcy5leHRlcm5hbHMuZGVwZW5kZW5jaWVzID8/IFtdKSwgLi4uKHRoaXMuZXh0ZXJuYWxzLm9wdGlvbmFsRGVwZW5kZW5jaWVzID8/IFtdKV0sXG4gICAgICB3cml0ZTogZmFsc2UsXG4gICAgICBvdXRkaXI6IHRoaXMucGFja2FnZURpcixcbiAgICAgIGFsbG93T3ZlcndyaXRlOiB0cnVlLFxuICAgIH0pO1xuXG4gICAgaWYgKGJ1bmRsZS53YXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBlc2J1aWxkIHdhcm5pbmdzIGFyZSB1c3VhbGx5IGltcG9ydGFudCwgbGV0cyB0cnkgdG8gYmUgc3RyaWN0IGhlcmUuXG4gICAgICAvLyB0aGUgd2FybmluZ3MgdGhlbXNlbHZlcyBhcmUgcHJpbnRlZCBvbiBzY3JlZW4uXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZvdW5kICR7YnVuZGxlLndhcm5pbmdzLmxlbmd0aH0gYnVuZGxpbmcgd2FybmluZ3MgKFNlZSBhYm92ZSlgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYnVuZGxlO1xuICB9XG5cbiAgcHJpdmF0ZSB2YWxpZGF0ZUNpcmN1bGFySW1wb3J0cygpOiBWaW9sYXRpb25bXSB7XG4gICAgY29uc29sZS5sb2coJ1ZhbGlkYXRpbmcgY2lyY3VsYXIgaW1wb3J0cycpO1xuICAgIGNvbnN0IHZpb2xhdGlvbnM6IFZpb2xhdGlvbltdID0gW107XG4gICAgY29uc3QgcGFja2FnZXMgPSBbdGhpcy5wYWNrYWdlRGlyLCAuLi50aGlzLmRlcGVuZGVuY2llcy5tYXAoZCA9PiBkLnBhdGgpXTtcbiAgICB0cnkge1xuICAgICAgLy8gd2UgZG9uJ3QgdXNlIHRoZSBwcm9ncmFtbWF0aWMgQVBJIHNpbmNlIGl0IG9ubHkgb2ZmZXJzIGFuIGFzeW5jIEFQSS5cbiAgICAgIC8vIHByZWZlciB0byBzdGF5IHN5bmMgZm9yIG5vdyBzaW5jZSBpdHMgZWFzaWVyIHRvIGludGVncmF0ZSB3aXRoIG90aGVyIHRvb2xpbmcuXG4gICAgICAvLyB3aWxsIG9mZmVyIGFuIGFzeW5jIEFQSSBmdXJ0aGVyIGRvd24gdGhlIHJvYWQuXG4gICAgICBjb25zdCBjb21tYW5kID0gYCR7cmVxdWlyZS5yZXNvbHZlKCdtYWRnZS9iaW4vY2xpLmpzJyl9IC0tanNvbiAtLXdhcm5pbmcgLS1uby1jb2xvciAtLW5vLXNwaW5uZXIgLS1jaXJjdWxhciAtLWV4dGVuc2lvbnMganMgJHtwYWNrYWdlcy5qb2luKCcgJyl9YDtcbiAgICAgIHNoZWxsKGNvbW1hbmQsIHsgcXVpZXQ6IHRydWUgfSk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICBjb25zdCBpbXBvcnRzOiBzdHJpbmdbXVtdID0gSlNPTi5wYXJzZShlLnN0ZG91dC50b1N0cmluZygpLnRyaW0oKSk7XG4gICAgICBmb3IgKGNvbnN0IGltcCBvZiBpbXBvcnRzKSB7XG4gICAgICAgIHZpb2xhdGlvbnMucHVzaCh7IHR5cGU6IFZpb2xhdGlvblR5cGUuQ0lSQ1VMQVJfSU1QT1JULCBtZXNzYWdlOiBgJHtpbXAuam9pbignIC0+ICcpfWAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHZpb2xhdGlvbnM7XG4gIH1cblxuICBwcml2YXRlIHZhbGlkYXRlUmVzb3VyY2VzKCk6IFZpb2xhdGlvbltdIHtcbiAgICBjb25zb2xlLmxvZygnVmFsaWRhdGluZyByZXNvdXJjZXMnKTtcbiAgICBjb25zdCB2aW9sYXRpb25zID0gW107XG4gICAgZm9yIChjb25zdCBbc3JjLCBfXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLnJlc291cmNlcykpIHtcbiAgICAgIGlmICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4odGhpcy5wYWNrYWdlRGlyLCBzcmMpKSkge1xuICAgICAgICB2aW9sYXRpb25zLnB1c2goe1xuICAgICAgICAgIHR5cGU6IFZpb2xhdGlvblR5cGUuTUlTU0lOR19SRVNPVVJDRSxcbiAgICAgICAgICBtZXNzYWdlOiBgVW5hYmxlIHRvIGZpbmQgcmVzb3VyY2UgKCR7c3JjfSkgcmVsYXRpdmUgdG8gdGhlIHBhY2thZ2UgZGlyZWN0b3J5YCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2aW9sYXRpb25zO1xuICB9XG5cbiAgcHJpdmF0ZSB2YWxpZGF0ZUF0dHJpYnV0aW9ucygpOiByZWFkb25seSBWaW9sYXRpb25bXSB7XG4gICAgY29uc29sZS5sb2coJ1ZhbGlkYXRpbmcgYXR0cmlidXRpb25zJyk7XG4gICAgcmV0dXJuIHRoaXMuYXR0cmlidXRpb25zLnZhbGlkYXRlKCkudmlvbGF0aW9ucztcbiAgfVxuXG4gIHByaXZhdGUgYWRkRXh0ZXJuYWxzKG1hbmlmZXN0OiBhbnkpIHtcblxuICAgIC8vIGV4dGVybmFsIGRlcGVuZGVuY2llcyBzaG91bGQgYmUgc3BlY2lmaWVkIGFzIHJ1bnRpbWUgZGVwZW5kZW5jaWVzXG4gICAgZm9yIChjb25zdCBleHRlcm5hbCBvZiB0aGlzLmV4dGVybmFscy5kZXBlbmRlbmNpZXMgPz8gW10pIHtcbiAgICAgIGNvbnN0IHZlcnNpb24gPSB0aGlzLmZpbmRFeHRlcm5hbERlcGVuZGVuY3lWZXJzaW9uKGV4dGVybmFsKTtcbiAgICAgIG1hbmlmZXN0LmRlcGVuZGVuY2llcyA9IG1hbmlmZXN0LmRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICAgIG1hbmlmZXN0LmRlcGVuZGVuY2llc1tleHRlcm5hbF0gPSB2ZXJzaW9uO1xuICAgIH1cblxuICAgIC8vIGV4dGVybmFsIGRlcGVuZGVuY2llcyBzaG91bGQgYmUgc3BlY2lmaWVkIGFzIG9wdGlvbmFsIGRlcGVuZGVuY2llc1xuICAgIGZvciAoY29uc3QgZXh0ZXJuYWwgb2YgdGhpcy5leHRlcm5hbHMub3B0aW9uYWxEZXBlbmRlbmNpZXMgPz8gW10pIHtcbiAgICAgIGNvbnN0IHZlcnNpb24gPSB0aGlzLmZpbmRFeHRlcm5hbERlcGVuZGVuY3lWZXJzaW9uKGV4dGVybmFsKTtcbiAgICAgIG1hbmlmZXN0Lm9wdGlvbmFsRGVwZW5kZW5jaWVzID0gbWFuaWZlc3Qub3B0aW9uYWxEZXBlbmRlbmNpZXMgPz8ge307XG4gICAgICBtYW5pZmVzdC5vcHRpb25hbERlcGVuZGVuY2llc1tleHRlcm5hbF0gPSB2ZXJzaW9uO1xuICAgIH1cblxuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVEZXBlbmRlbmNpZXMobWFuaWZlc3Q6IGFueSkge1xuICAgIGZvciAoY29uc3QgW2QsIHZdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMubWFuaWZlc3QuZGVwZW5kZW5jaWVzKSkge1xuICAgICAgbWFuaWZlc3QuZGV2RGVwZW5kZW5jaWVzID0gbWFuaWZlc3QuZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICAgICAgbWFuaWZlc3QuZGV2RGVwZW5kZW5jaWVzW2RdID0gdjtcbiAgICAgIGRlbGV0ZSBtYW5pZmVzdC5kZXBlbmRlbmNpZXNbZF07XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB3cml0ZU91dHB1dHMod29ya0Rpcjogc3RyaW5nKSB7XG4gICAgZm9yIChjb25zdCBvdXRwdXQgb2YgdGhpcy5idW5kbGUub3V0cHV0RmlsZXMgPz8gW10pIHtcbiAgICAgIGNvbnN0IG91dCA9IG91dHB1dC5wYXRoLnJlcGxhY2UodGhpcy5wYWNrYWdlRGlyLCB3b3JrRGlyKTtcbiAgICAgIGZzLndyaXRlRmlsZVN5bmMob3V0LCBvdXRwdXQuY29udGVudHMpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgd3JpdGVSZXNvdXJjZXMod29ya2Rpcjogc3RyaW5nKSB7XG4gICAgZm9yIChjb25zdCBbc3JjLCBkc3RdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMucmVzb3VyY2VzKSkge1xuICAgICAgY29uc3QgdG8gPSBwYXRoLmpvaW4od29ya2RpciwgZHN0KTtcbiAgICAgIGZzLmNvcHlTeW5jKHBhdGguam9pbih0aGlzLnBhY2thZ2VEaXIsIHNyYyksIHRvLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHdyaXRlTWFuaWZlc3Qod29ya0Rpcjogc3RyaW5nLCBtYW5pZmVzdDogYW55KSB7XG4gICAgZnMud3JpdGVGaWxlU3luYyhwYXRoLmpvaW4od29ya0RpciwgJ3BhY2thZ2UuanNvbicpLCBKU09OLnN0cmluZ2lmeShtYW5pZmVzdCwgbnVsbCwgMikpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGxvbmdlc3RDb21tb25QYXJlbnQocGF0aHM6IHN0cmluZ1tdKSB7XG5cbiAgZnVuY3Rpb24gX2xvbmdlc3RDb21tb25QYXJlbnQocDE6IHN0cmluZywgcDI6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgZGlyczEgPSBwMS5zcGxpdChwYXRoLnNlcCk7XG4gICAgY29uc3QgZGlyczIgPSBwMi5zcGxpdChwYXRoLnNlcCk7XG4gICAgY29uc3QgcGFyZW50ID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBNYXRoLm1pbihkaXJzMS5sZW5ndGgsIGRpcnMyLmxlbmd0aCk7IGkrKykge1xuICAgICAgaWYgKGRpcnMxW2ldICE9PSBkaXJzMltpXSkgYnJlYWs7XG4gICAgICBwYXJlbnQucHVzaChkaXJzMVtpXSk7XG4gICAgfVxuICAgIHJldHVybiBwYXJlbnQuam9pbihwYXRoLnNlcCk7XG4gIH1cblxuICByZXR1cm4gcGF0aHMucmVkdWNlKF9sb25nZXN0Q29tbW9uUGFyZW50KTtcbn1cbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export * from './bundle';
2
+ export * from './violation';
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./bundle"), exports);
18
+ __exportStar(require("./violation"), exports);
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXBpL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwyQ0FBeUI7QUFDekIsOENBQTRCIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9idW5kbGUnO1xuZXhwb3J0ICogZnJvbSAnLi92aW9sYXRpb24nOyJdfQ==
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Violation types.
3
+ */
4
+ export declare enum ViolationType {
5
+ /**
6
+ * Circular import on the package or one of its dependencies.
7
+ */
8
+ CIRCULAR_IMPORT = "circular-import",
9
+ /**
10
+ * Outdated attributions file.
11
+ */
12
+ OUTDATED_ATTRIBUTIONS = "outdated-attributions",
13
+ /**
14
+ * Missing notice file.
15
+ */
16
+ MISSING_NOTICE = "missing-notice",
17
+ /**
18
+ * Invalid license.
19
+ */
20
+ INVALID_LICENSE = "invalid-license",
21
+ /**
22
+ * No license.
23
+ */
24
+ NO_LICENSE = "no-license",
25
+ /**
26
+ * Multiple licenses.
27
+ */
28
+ MULTIPLE_LICENSE = "multiple-license",
29
+ /**
30
+ * Missing resource file.
31
+ */
32
+ MISSING_RESOURCE = "missing-resource"
33
+ }
34
+ /**
35
+ * A validation violation.
36
+ */
37
+ export interface Violation {
38
+ /**
39
+ * The violation type.
40
+ */
41
+ readonly type: ViolationType;
42
+ /**
43
+ * The violation message.
44
+ */
45
+ readonly message: string;
46
+ /**
47
+ * A fixer function.
48
+ * If undefined, this violation cannot be fixed automatically.
49
+ */
50
+ readonly fix?: () => void;
51
+ }
52
+ /**
53
+ * Report encapsulating a list of violations.
54
+ */
55
+ export declare class ViolationsReport {
56
+ private readonly _violations;
57
+ constructor(_violations: Violation[]);
58
+ /**
59
+ * The list of violations.
60
+ */
61
+ get violations(): readonly Violation[];
62
+ /**
63
+ * True when no violations exist. False otherwise.
64
+ */
65
+ get success(): boolean;
66
+ /**
67
+ * Summary of the violation in the report.
68
+ */
69
+ get summary(): string;
70
+ }
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ViolationsReport = exports.ViolationType = void 0;
4
+ /**
5
+ * Violation types.
6
+ */
7
+ var ViolationType;
8
+ (function (ViolationType) {
9
+ /**
10
+ * Circular import on the package or one of its dependencies.
11
+ */
12
+ ViolationType["CIRCULAR_IMPORT"] = "circular-import";
13
+ /**
14
+ * Outdated attributions file.
15
+ */
16
+ ViolationType["OUTDATED_ATTRIBUTIONS"] = "outdated-attributions";
17
+ /**
18
+ * Missing notice file.
19
+ */
20
+ ViolationType["MISSING_NOTICE"] = "missing-notice";
21
+ /**
22
+ * Invalid license.
23
+ */
24
+ ViolationType["INVALID_LICENSE"] = "invalid-license";
25
+ /**
26
+ * No license.
27
+ */
28
+ ViolationType["NO_LICENSE"] = "no-license";
29
+ /**
30
+ * Multiple licenses.
31
+ */
32
+ ViolationType["MULTIPLE_LICENSE"] = "multiple-license";
33
+ /**
34
+ * Missing resource file.
35
+ */
36
+ ViolationType["MISSING_RESOURCE"] = "missing-resource";
37
+ })(ViolationType = exports.ViolationType || (exports.ViolationType = {}));
38
+ /**
39
+ * Report encapsulating a list of violations.
40
+ */
41
+ class ViolationsReport {
42
+ constructor(_violations) {
43
+ this._violations = _violations;
44
+ }
45
+ /**
46
+ * The list of violations.
47
+ */
48
+ get violations() {
49
+ return this._violations;
50
+ }
51
+ /**
52
+ * True when no violations exist. False otherwise.
53
+ */
54
+ get success() {
55
+ return this.violations.length === 0;
56
+ }
57
+ /**
58
+ * Summary of the violation in the report.
59
+ */
60
+ get summary() {
61
+ const summary = [
62
+ `${this._violations.length} violations detected`,
63
+ ];
64
+ for (const v of this._violations) {
65
+ summary.push(`- ${v.type}: ${v.message}${v.fix ? ' (fixable)' : ''}`);
66
+ }
67
+ return summary.join('\n');
68
+ }
69
+ }
70
+ exports.ViolationsReport = ViolationsReport;
71
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlvbGF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwaS92aW9sYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUE7O0dBRUc7QUFDSCxJQUFZLGFBcUNYO0FBckNELFdBQVksYUFBYTtJQUV2Qjs7T0FFRztJQUNILG9EQUFtQyxDQUFBO0lBRW5DOztPQUVHO0lBQ0gsZ0VBQStDLENBQUE7SUFFL0M7O09BRUc7SUFDSCxrREFBaUMsQ0FBQTtJQUVqQzs7T0FFRztJQUNILG9EQUFtQyxDQUFBO0lBRW5DOztPQUVHO0lBQ0gsMENBQXlCLENBQUE7SUFFekI7O09BRUc7SUFDSCxzREFBcUMsQ0FBQTtJQUVyQzs7T0FFRztJQUNILHNEQUFxQyxDQUFBO0FBRXZDLENBQUMsRUFyQ1csYUFBYSxHQUFiLHFCQUFhLEtBQWIscUJBQWEsUUFxQ3hCO0FBcUJEOztHQUVHO0FBQ0gsTUFBYSxnQkFBZ0I7SUFFM0IsWUFBNkIsV0FBd0I7UUFBeEIsZ0JBQVcsR0FBWCxXQUFXLENBQWE7SUFBRyxDQUFDO0lBRXpEOztPQUVHO0lBQ0gsSUFBVyxVQUFVO1FBQ25CLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUMxQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFXLE9BQU87UUFDaEIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBVyxPQUFPO1FBQ2hCLE1BQU0sT0FBTyxHQUFHO1lBQ2QsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sc0JBQXNCO1NBQ2pELENBQUM7UUFDRixLQUFLLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDaEMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7U0FDdkU7UUFDRCxPQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDNUIsQ0FBQztDQUVGO0FBL0JELDRDQStCQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVmlvbGF0aW9uIHR5cGVzLlxuICovXG5leHBvcnQgZW51bSBWaW9sYXRpb25UeXBlIHtcblxuICAvKipcbiAgICogQ2lyY3VsYXIgaW1wb3J0IG9uIHRoZSBwYWNrYWdlIG9yIG9uZSBvZiBpdHMgZGVwZW5kZW5jaWVzLlxuICAgKi9cbiAgQ0lSQ1VMQVJfSU1QT1JUID0gJ2NpcmN1bGFyLWltcG9ydCcsXG5cbiAgLyoqXG4gICAqIE91dGRhdGVkIGF0dHJpYnV0aW9ucyBmaWxlLlxuICAgKi9cbiAgT1VUREFURURfQVRUUklCVVRJT05TID0gJ291dGRhdGVkLWF0dHJpYnV0aW9ucycsXG5cbiAgLyoqXG4gICAqIE1pc3Npbmcgbm90aWNlIGZpbGUuXG4gICAqL1xuICBNSVNTSU5HX05PVElDRSA9ICdtaXNzaW5nLW5vdGljZScsXG5cbiAgLyoqXG4gICAqIEludmFsaWQgbGljZW5zZS5cbiAgICovXG4gIElOVkFMSURfTElDRU5TRSA9ICdpbnZhbGlkLWxpY2Vuc2UnLFxuXG4gIC8qKlxuICAgKiBObyBsaWNlbnNlLlxuICAgKi9cbiAgTk9fTElDRU5TRSA9ICduby1saWNlbnNlJyxcblxuICAvKipcbiAgICogTXVsdGlwbGUgbGljZW5zZXMuXG4gICAqL1xuICBNVUxUSVBMRV9MSUNFTlNFID0gJ211bHRpcGxlLWxpY2Vuc2UnLFxuXG4gIC8qKlxuICAgKiBNaXNzaW5nIHJlc291cmNlIGZpbGUuXG4gICAqL1xuICBNSVNTSU5HX1JFU09VUkNFID0gJ21pc3NpbmctcmVzb3VyY2UnLFxuXG59XG5cbi8qKlxuICogQSB2YWxpZGF0aW9uIHZpb2xhdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW9sYXRpb24ge1xuICAvKipcbiAgICogVGhlIHZpb2xhdGlvbiB0eXBlLlxuICAgKi9cbiAgcmVhZG9ubHkgdHlwZTogVmlvbGF0aW9uVHlwZTtcbiAgLyoqXG4gICAqIFRoZSB2aW9sYXRpb24gbWVzc2FnZS5cbiAgICovXG4gIHJlYWRvbmx5IG1lc3NhZ2U6IHN0cmluZztcbiAgLyoqXG4gICAqIEEgZml4ZXIgZnVuY3Rpb24uXG4gICAqIElmIHVuZGVmaW5lZCwgdGhpcyB2aW9sYXRpb24gY2Fubm90IGJlIGZpeGVkIGF1dG9tYXRpY2FsbHkuXG4gICAqL1xuICByZWFkb25seSBmaXg/OiAoKSA9PiB2b2lkO1xufVxuXG4vKipcbiAqIFJlcG9ydCBlbmNhcHN1bGF0aW5nIGEgbGlzdCBvZiB2aW9sYXRpb25zLlxuICovXG5leHBvcnQgY2xhc3MgVmlvbGF0aW9uc1JlcG9ydCB7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBfdmlvbGF0aW9uczogVmlvbGF0aW9uW10pIHt9XG5cbiAgLyoqXG4gICAqIFRoZSBsaXN0IG9mIHZpb2xhdGlvbnMuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHZpb2xhdGlvbnMoKTogcmVhZG9ubHkgVmlvbGF0aW9uW10ge1xuICAgIHJldHVybiB0aGlzLl92aW9sYXRpb25zO1xuICB9XG5cbiAgLyoqXG4gICAqIFRydWUgd2hlbiBubyB2aW9sYXRpb25zIGV4aXN0LiBGYWxzZSBvdGhlcndpc2UuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHN1Y2Nlc3MoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudmlvbGF0aW9ucy5sZW5ndGggPT09IDA7XG4gIH1cblxuICAvKipcbiAgICogU3VtbWFyeSBvZiB0aGUgdmlvbGF0aW9uIGluIHRoZSByZXBvcnQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHN1bW1hcnkoKTogc3RyaW5nIHtcbiAgICBjb25zdCBzdW1tYXJ5ID0gW1xuICAgICAgYCR7dGhpcy5fdmlvbGF0aW9ucy5sZW5ndGh9IHZpb2xhdGlvbnMgZGV0ZWN0ZWRgLFxuICAgIF07XG4gICAgZm9yIChjb25zdCB2IG9mIHRoaXMuX3Zpb2xhdGlvbnMpIHtcbiAgICAgIHN1bW1hcnkucHVzaChgLSAke3YudHlwZX06ICR7di5tZXNzYWdlfSR7di5maXggPyAnIChmaXhhYmxlKScgOiAnJ31gKTtcbiAgICB9XG4gICAgcmV0dXJuIHN1bW1hcnkuam9pbignXFxuJyk7XG4gIH1cblxufVxuIl19
package/lib/cli.d.ts ADDED
@@ -0,0 +1 @@
1
+ export {};