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.
- package/.gitattributes +23 -0
- package/CODE_OF_CONDUCT.md +4 -0
- package/CONTRIBUTING.md +59 -0
- package/LICENSE +202 -0
- package/NOTICE +1 -0
- package/README.md +160 -0
- package/bin/node-backpack +2 -0
- package/lib/api/_attributions.d.ts +64 -0
- package/lib/api/_attributions.js +161 -0
- package/lib/api/_shell.d.ts +5 -0
- package/lib/api/_shell.js +37 -0
- package/lib/api/bundle.d.ts +163 -0
- package/lib/api/bundle.js +352 -0
- package/lib/api/index.d.ts +2 -0
- package/lib/api/index.js +19 -0
- package/lib/api/violation.d.ts +70 -0
- package/lib/api/violation.js +71 -0
- package/lib/cli.d.ts +1 -0
- package/lib/cli.js +119 -0
- package/lib/index.d.ts +1 -0
- package/lib/index.js +18 -0
- package/package.json +101 -0
|
@@ -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==
|
package/lib/api/index.js
ADDED
|
@@ -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 {};
|