jsii-reflect 1.47.0 → 1.48.0

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.
@@ -27,8 +27,12 @@ export declare class TypeSystem {
27
27
  /**
28
28
  * Loads a jsii module or a single .jsii file into the type system.
29
29
  *
30
+ * If `fileOrDirectory` is a directory, it will be treated as a jsii npm module,
31
+ * and its dependencies (as determined by its 'package.json' file) will be loaded
32
+ * as well.
33
+ *
30
34
  * If `fileOrDirectory` is a file, it will be treated as a single .jsii file.
31
- * If `fileOrDirectory` is a directory, it will be treated as a jsii npm module.
35
+ * No dependencies will be loaded. You almost never want this.
32
36
  *
33
37
  * Not validating makes the difference between loading assemblies with lots
34
38
  * of dependencies (such as app-delivery) in 90ms vs 3500ms.
@@ -2,12 +2,13 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.TypeSystem = void 0;
4
4
  const jsii = require("@jsii/spec");
5
+ const fs = require("fs-extra");
5
6
  const path = require("path");
6
- const util_1 = require("util");
7
7
  const assembly_1 = require("./assembly");
8
8
  const class_1 = require("./class");
9
9
  const enum_1 = require("./enum");
10
10
  const interface_1 = require("./interface");
11
+ const util_1 = require("./util");
11
12
  class TypeSystem {
12
13
  constructor() {
13
14
  /**
@@ -27,27 +28,31 @@ class TypeSystem {
27
28
  * NOT have to declare a JSII dependency on any of the packages.
28
29
  */
29
30
  async loadNpmDependencies(packageRoot, options = {}) {
30
- // eslint-disable-next-line @typescript-eslint/no-var-requires, @typescript-eslint/no-require-imports
31
- const pkg = require(path.resolve(packageRoot, 'package.json'));
31
+ const pkg = await fs.readJson(path.resolve(packageRoot, 'package.json'));
32
32
  for (const dep of dependenciesOf(pkg)) {
33
- // Filter jsii dependencies
34
- const depPkgJsonPath = require.resolve(`${dep}/package.json`, {
35
- paths: [packageRoot],
36
- });
37
- // eslint-disable-next-line @typescript-eslint/no-var-requires, @typescript-eslint/no-require-imports
38
- const depPkgJson = require(depPkgJsonPath);
33
+ if (util_1.isBuiltinModule(dep)) {
34
+ continue;
35
+ }
36
+ // eslint-disable-next-line no-await-in-loop
37
+ const depDir = await util_1.findDependencyDirectory(dep, packageRoot);
38
+ // eslint-disable-next-line no-await-in-loop
39
+ const depPkgJson = await fs.readJson(path.join(depDir, 'package.json'));
39
40
  if (!depPkgJson.jsii) {
40
41
  continue;
41
42
  }
42
43
  // eslint-disable-next-line no-await-in-loop
43
- await this.loadModule(path.dirname(depPkgJsonPath), options);
44
+ await this.loadModule(depDir, options);
44
45
  }
45
46
  }
46
47
  /**
47
48
  * Loads a jsii module or a single .jsii file into the type system.
48
49
  *
50
+ * If `fileOrDirectory` is a directory, it will be treated as a jsii npm module,
51
+ * and its dependencies (as determined by its 'package.json' file) will be loaded
52
+ * as well.
53
+ *
49
54
  * If `fileOrDirectory` is a file, it will be treated as a single .jsii file.
50
- * If `fileOrDirectory` is a directory, it will be treated as a jsii npm module.
55
+ * No dependencies will be loaded. You almost never want this.
51
56
  *
52
57
  * Not validating makes the difference between loading assemblies with lots
53
58
  * of dependencies (such as app-delivery) in 90ms vs 3500ms.
@@ -56,7 +61,7 @@ class TypeSystem {
56
61
  * @param validate Whether or not to validate the assembly while loading it.
57
62
  */
58
63
  async load(fileOrDirectory, options = {}) {
59
- if ((await stat(fileOrDirectory)).isDirectory()) {
64
+ if ((await fs.stat(fileOrDirectory)).isDirectory()) {
60
65
  return this.loadModule(fileOrDirectory, options);
61
66
  }
62
67
  return this.loadFile(fileOrDirectory, { ...options, isRoot: true });
@@ -69,7 +74,7 @@ class TypeSystem {
69
74
  return out;
70
75
  async function _loadModule(moduleDirectory, isRoot = false) {
71
76
  const filePath = path.join(moduleDirectory, 'package.json');
72
- const pkg = JSON.parse((await readFile(filePath)).toString());
77
+ const pkg = JSON.parse(await fs.readFile(filePath, { encoding: 'utf-8' }));
73
78
  if (!pkg.jsii) {
74
79
  throw new Error(`No "jsii" section in ${filePath}`);
75
80
  }
@@ -99,11 +104,10 @@ class TypeSystem {
99
104
  if (bundled.includes(name)) {
100
105
  continue;
101
106
  }
102
- const depDir = require.resolve(`${name}/package.json`, {
103
- paths: [moduleDirectory],
104
- });
105
107
  // eslint-disable-next-line no-await-in-loop
106
- await _loadModule.call(this, path.dirname(depDir));
108
+ const depDir = await util_1.findDependencyDirectory(name, moduleDirectory);
109
+ // eslint-disable-next-line no-await-in-loop
110
+ await _loadModule.call(this, depDir);
107
111
  }
108
112
  return root;
109
113
  }
@@ -239,7 +243,7 @@ class TypeSystem {
239
243
  * @param validate Whether to validate the assembly or just assume it matches the schema
240
244
  */
241
245
  async loadAssembly(file, validate = true) {
242
- const spec = JSON.parse((await readFile(file)).toString());
246
+ const spec = JSON.parse(await fs.readFile(file, { encoding: 'utf-8' }));
243
247
  const ass = validate
244
248
  ? jsii.validateAssembly(spec)
245
249
  : spec;
@@ -272,16 +276,4 @@ function flatMap(collection, mapper) {
272
276
  .map(mapper)
273
277
  .reduce((acc, elt) => acc.concat(elt), new Array());
274
278
  }
275
- function stat(p) {
276
- // just-in-time require so that this file can be loaded in browsers as well.
277
- // eslint-disable-next-line @typescript-eslint/no-require-imports,@typescript-eslint/no-var-requires
278
- const fs = require('fs');
279
- return util_1.promisify(fs.stat)(p);
280
- }
281
- function readFile(p) {
282
- // just-in-time require so that this file can be loaded in browsers as well.
283
- // eslint-disable-next-line @typescript-eslint/no-require-imports,@typescript-eslint/no-var-requires
284
- const fs = require('fs');
285
- return util_1.promisify(fs.readFile)(p);
286
- }
287
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZS1zeXN0ZW0uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ0eXBlLXN5c3RlbS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtQ0FBbUM7QUFDbkMsNkJBQTZCO0FBQzdCLCtCQUFpQztBQUVqQyx5Q0FBc0M7QUFDdEMsbUNBQW9DO0FBQ3BDLGlDQUFrQztBQUNsQywyQ0FBNEM7QUFNNUMsTUFBYSxVQUFVO0lBQXZCO1FBQ0U7O1dBRUc7UUFDYSxlQUFVLEdBQUcsSUFBSSxLQUFLLEVBQVksQ0FBQztRQUVuRDs7V0FFRztRQUNhLFVBQUssR0FBRyxJQUFJLEtBQUssRUFBWSxDQUFDO1FBRTdCLG9CQUFlLEdBQWlDLEVBQUUsQ0FBQztJQWtTdEUsQ0FBQztJQWhTQzs7Ozs7T0FLRztJQUNJLEtBQUssQ0FBQyxtQkFBbUIsQ0FDOUIsV0FBbUIsRUFDbkIsVUFBa0MsRUFBRTtRQUVwQyxxR0FBcUc7UUFDckcsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQUM7UUFFL0QsS0FBSyxNQUFNLEdBQUcsSUFBSSxjQUFjLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDckMsMkJBQTJCO1lBQzNCLE1BQU0sY0FBYyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxHQUFHLGVBQWUsRUFBRTtnQkFDNUQsS0FBSyxFQUFFLENBQUMsV0FBVyxDQUFDO2FBQ3JCLENBQUMsQ0FBQztZQUNILHFHQUFxRztZQUNyRyxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDM0MsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUU7Z0JBQ3BCLFNBQVM7YUFDVjtZQUVELDRDQUE0QztZQUM1QyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztTQUM5RDtJQUNI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QUMsSUFBSSxDQUFDLEdBQUcsWUFBWSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7UUFDMUQsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFFRDs7T0FFRztJQUNILElBQVcsS0FBSztRQUNkLE1BQU0sR0FBRyxHQUFHLElBQUksS0FBSyxFQUFZLENBQUM7UUFDbEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUM1QixHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsWUFBWSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDckQsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssS0FBSyxDQUFDLFlBQVksQ0FBQyxJQUFZLEVBQUUsUUFBUSxHQUFHLElBQUk7UUFDdEQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUMzRCxNQUFNLEdBQUcsR0FBRyxRQUFRO1lBQ2xCLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDO1lBQzdCLENBQUMsQ0FBRSxJQUFzQixDQUFDO1FBQzVCLE9BQU8sSUFBSSxtQkFBUSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRU8sT0FBTyxDQUFDLEdBQWE7UUFDM0IsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNyRCxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUN0QjtJQUNILENBQUM7Q0FDRjtBQTdTRCxnQ0E2U0M7QUFFRCxTQUFTLGNBQWMsQ0FBQyxXQUFnQjs7SUFDdEMsTUFBTSxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztJQUMvQixNQUFNLENBQUMsSUFBSSxPQUFDLFdBQVcsQ0FBQyxZQUFZLG1DQUFJLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3pFLE1BQU0sQ0FBQyxJQUFJLE9BQUMsV0FBVyxDQUFDLGdCQUFnQixtQ0FBSSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUM3RSxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDMUIsQ0FBQztBQUVELFNBQVMsWUFBWSxDQUNuQixNQUFrQixFQUNsQixNQUE0QztJQUU1QyxNQUFNLE1BQU0sR0FBRyxJQUFJLEtBQUssRUFBSyxDQUFDO0lBQzlCLEtBQUssTUFBTSxTQUFTLElBQUksTUFBTSxDQUFDLFVBQVUsRUFBRTtRQUN6QyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsWUFBWSxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO0tBQ2pEO0lBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQy9CLE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRCxTQUFTLE9BQU8sQ0FDZCxVQUF3QixFQUN4QixNQUFrQztJQUVsQyxPQUFPLFVBQVU7U0FDZCxHQUFHLENBQUMsTUFBTSxDQUFDO1NBQ1gsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLEtBQUssRUFBSyxDQUFDLENBQUM7QUFDM0QsQ0FBQztBQUVELFNBQVMsSUFBSSxDQUFDLENBQVM7SUFDckIsNEVBQTRFO0lBQzVFLG9HQUFvRztJQUNwRyxNQUFNLEVBQUUsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDekIsT0FBTyxnQkFBUyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMvQixDQUFDO0FBRUQsU0FBUyxRQUFRLENBQUMsQ0FBUztJQUN6Qiw0RUFBNEU7SUFDNUUsb0dBQW9HO0lBQ3BHLE1BQU0sRUFBRSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN6QixPQUFPLGdCQUFTLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25DLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBqc2lpIGZyb20gJ0Bqc2lpL3NwZWMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IHByb21pc2lmeSB9IGZyb20gJ3V0aWwnO1xuXG5pbXBvcnQgeyBBc3NlbWJseSB9IGZyb20gJy4vYXNzZW1ibHknO1xuaW1wb3J0IHsgQ2xhc3NUeXBlIH0gZnJvbSAnLi9jbGFzcyc7XG5pbXBvcnQgeyBFbnVtVHlwZSB9IGZyb20gJy4vZW51bSc7XG5pbXBvcnQgeyBJbnRlcmZhY2VUeXBlIH0gZnJvbSAnLi9pbnRlcmZhY2UnO1xuaW1wb3J0IHsgTWV0aG9kIH0gZnJvbSAnLi9tZXRob2QnO1xuaW1wb3J0IHsgTW9kdWxlTGlrZSB9IGZyb20gJy4vbW9kdWxlLWxpa2UnO1xuaW1wb3J0IHsgUHJvcGVydHkgfSBmcm9tICcuL3Byb3BlcnR5JztcbmltcG9ydCB7IFR5cGUgfSBmcm9tICcuL3R5cGUnO1xuXG5leHBvcnQgY2xhc3MgVHlwZVN5c3RlbSB7XG4gIC8qKlxuICAgKiBBbGwgYXNzZW1ibGllcyBpbiB0aGlzIHR5cGUgc3lzdGVtLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGFzc2VtYmxpZXMgPSBuZXcgQXJyYXk8QXNzZW1ibHk+KCk7XG5cbiAgLyoqXG4gICAqIFRoZSBcInJvb3RcIiBhc3NlbWJsaWVzIChvbmVzIHRoYXQgbG9hZGVkIGV4cGxpY2l0bHkgdmlhIGEgXCJsb2FkXCIgY2FsbCkuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcm9vdHMgPSBuZXcgQXJyYXk8QXNzZW1ibHk+KCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfYXNzZW1ibHlMb29rdXA6IHsgW25hbWU6IHN0cmluZ106IEFzc2VtYmx5IH0gPSB7fTtcblxuICAvKipcbiAgICogTG9hZCBhbGwgSlNJSSBkZXBlbmRlbmNpZXMgb2YgdGhlIGdpdmVuIE5QTSBwYWNrYWdlIGRpcmVjdG9yeS5cbiAgICpcbiAgICogVGhlIE5QTSBwYWNrYWdlIGl0c2VsZiBkb2VzICpub3QqIGhhdmUgdG8gYmUgYSBqc2lpIHBhY2thZ2UsIGFuZCBkb2VzXG4gICAqIE5PVCBoYXZlIHRvIGRlY2xhcmUgYSBKU0lJIGRlcGVuZGVuY3kgb24gYW55IG9mIHRoZSBwYWNrYWdlcy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBsb2FkTnBtRGVwZW5kZW5jaWVzKFxuICAgIHBhY2thZ2VSb290OiBzdHJpbmcsXG4gICAgb3B0aW9uczogeyB2YWxpZGF0ZT86IGJvb2xlYW4gfSA9IHt9LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXZhci1yZXF1aXJlcywgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuICAgIGNvbnN0IHBrZyA9IHJlcXVpcmUocGF0aC5yZXNvbHZlKHBhY2thZ2VSb290LCAncGFja2FnZS5qc29uJykpO1xuXG4gICAgZm9yIChjb25zdCBkZXAgb2YgZGVwZW5kZW5jaWVzT2YocGtnKSkge1xuICAgICAgLy8gRmlsdGVyIGpzaWkgZGVwZW5kZW5jaWVzXG4gICAgICBjb25zdCBkZXBQa2dKc29uUGF0aCA9IHJlcXVpcmUucmVzb2x2ZShgJHtkZXB9L3BhY2thZ2UuanNvbmAsIHtcbiAgICAgICAgcGF0aHM6IFtwYWNrYWdlUm9vdF0sXG4gICAgICB9KTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdmFyLXJlcXVpcmVzLCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzXG4gICAgICBjb25zdCBkZXBQa2dKc29uID0gcmVxdWlyZShkZXBQa2dKc29uUGF0aCk7XG4gICAgICBpZiAoIWRlcFBrZ0pzb24uanNpaSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWF3YWl0LWluLWxvb3BcbiAgICAgIGF3YWl0IHRoaXMubG9hZE1vZHVsZShwYXRoLmRpcm5hbWUoZGVwUGtnSnNvblBhdGgpLCBvcHRpb25zKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTG9hZHMgYSBqc2lpIG1vZHVsZSBvciBhIHNpbmdsZSAuanNpaSBmaWxlIGludG8gdGhlIHR5cGUgc3lzdGVtLlxuICAgKlxuICAgKiBJZiBgZmlsZU9yRGlyZWN0b3J5YCBpcyBhIGZpbGUsIGl0IHdpbGwgYmUgdHJlYXRlZCBhcyBhIHNpbmdsZSAuanNpaSBmaWxlLlxuICAgKiBJZiBgZmlsZU9yRGlyZWN0b3J5YCBpcyBhIGRpcmVjdG9yeSwgaXQgd2lsbCBiZSB0cmVhdGVkIGFzIGEganNpaSBucG0gbW9kdWxlLlxuICAgKlxuICAgKiBOb3QgdmFsaWRhdGluZyBtYWtlcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGxvYWRpbmcgYXNzZW1ibGllcyB3aXRoIGxvdHNcbiAgICogb2YgZGVwZW5kZW5jaWVzIChzdWNoIGFzIGFwcC1kZWxpdmVyeSkgaW4gOTBtcyB2cyAzNTAwbXMuXG4gICAqXG4gICAqIEBwYXJhbSBmaWxlT3JEaXJlY3RvcnkgQSAuanNpaSBmaWxlIHBhdGggb3IgYSBtb2R1bGUgZGlyZWN0b3J5XG4gICAqIEBwYXJhbSB2YWxpZGF0ZSBXaGV0aGVyIG9yIG5vdCB0byB2YWxpZGF0ZSB0aGUgYXNzZW1ibHkgd2hpbGUgbG9hZGluZyBpdC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBsb2FkKFxuICAgIGZpbGVPckRpcmVjdG9yeTogc3RyaW5nLFxuICAgIG9wdGlvbnM6IHsgdmFsaWRhdGU/OiBib29sZWFuIH0gPSB7fSxcbiAgKSB7XG4gICAgaWYgKChhd2FpdCBzdGF0KGZpbGVPckRpcmVjdG9yeSkpLmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmxvYWRNb2R1bGUoZmlsZU9yRGlyZWN0b3J5LCBvcHRpb25zKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubG9hZEZpbGUoZmlsZU9yRGlyZWN0b3J5LCB7IC4uLm9wdGlvbnMsIGlzUm9vdDogdHJ1ZSB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBsb2FkTW9kdWxlKFxuICAgIGRpcjogc3RyaW5nLFxuICAgIG9wdGlvbnM6IHsgdmFsaWRhdGU/OiBib29sZWFuIH0gPSB7fSxcbiAgKTogUHJvbWlzZTxBc3NlbWJseT4ge1xuICAgIGNvbnN0IG91dCA9IGF3YWl0IF9sb2FkTW9kdWxlLmNhbGwodGhpcywgZGlyLCB0cnVlKTtcbiAgICBpZiAoIW91dCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gbG9hZCBtb2R1bGUgZnJvbSBkaXJlY3Rvcnk6ICR7ZGlyfWApO1xuICAgIH1cblxuICAgIHJldHVybiBvdXQ7XG5cbiAgICBhc3luYyBmdW5jdGlvbiBfbG9hZE1vZHVsZShcbiAgICAgIHRoaXM6IFR5cGVTeXN0ZW0sXG4gICAgICBtb2R1bGVEaXJlY3Rvcnk6IHN0cmluZyxcbiAgICAgIGlzUm9vdCA9IGZhbHNlLFxuICAgICkge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4obW9kdWxlRGlyZWN0b3J5LCAncGFja2FnZS5qc29uJyk7XG4gICAgICBjb25zdCBwa2cgPSBKU09OLnBhcnNlKChhd2FpdCByZWFkRmlsZShmaWxlUGF0aCkpLnRvU3RyaW5nKCkpO1xuICAgICAgaWYgKCFwa2cuanNpaSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIFwianNpaVwiIHNlY3Rpb24gaW4gJHtmaWxlUGF0aH1gKTtcbiAgICAgIH1cblxuICAgICAgLy8gTG9hZCB0aGUgYXNzZW1ibHksIGJ1dCBkb24ndCByZWN1cnNlIGlmIHdlIGFscmVhZHkgaGF2ZSBhbiBhc3NlbWJseSB3aXRoIHRoZSBzYW1lIG5hbWUuXG4gICAgICAvLyBWYWxpZGF0aW9uIGlzIG5vdCBhbiBpbnNpZ25pZmljYW50IHRpbWUgc2luaywgYW5kIGxvYWRpbmcgSVMgaW5zaWduaWZpY2FudCwgc28gZG8gYVxuICAgICAgLy8gbG9hZCB3aXRob3V0IHZhbGlkYXRpb24gZmlyc3QuIFRoaXMgc2F2ZXMgYWJvdXQgMi8zcmRzIG9mIHByb2Nlc3NpbmcgdGltZS5cbiAgICAgIGNvbnN0IGFzbSA9IGF3YWl0IHRoaXMubG9hZEFzc2VtYmx5KFxuICAgICAgICBwYXRoLmpvaW4obW9kdWxlRGlyZWN0b3J5LCAnLmpzaWknKSxcbiAgICAgICAgZmFsc2UsXG4gICAgICApO1xuICAgICAgaWYgKHRoaXMuaW5jbHVkZXNBc3NlbWJseShhc20ubmFtZSkpIHtcbiAgICAgICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLmZpbmRBc3NlbWJseShhc20ubmFtZSk7XG4gICAgICAgIGlmIChleGlzdGluZy52ZXJzaW9uICE9PSBhc20udmVyc2lvbikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBDb25mbGljdGluZyB2ZXJzaW9ucyBvZiAke2FzbS5uYW1lfSBpbiB0eXBlIHN5c3RlbTogcHJldmlvdXNseSBsb2FkZWQgJHtleGlzdGluZy52ZXJzaW9ufSwgdHJ5aW5nIHRvIGxvYWQgJHthc20udmVyc2lvbn1gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgd2UgbWFyayB0aGlzIHRoaW5nIGFzIHJvb3QgYWZ0ZXIgYWxsIGlmIGl0IHdhc24ndCB5ZXQuXG4gICAgICAgIGlmIChpc1Jvb3QpIHtcbiAgICAgICAgICB0aGlzLmFkZFJvb3QoYXNtKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBleGlzdGluZztcbiAgICAgIH1cblxuICAgICAgaWYgKG9wdGlvbnMudmFsaWRhdGUgIT09IGZhbHNlKSB7XG4gICAgICAgIGFzbS52YWxpZGF0ZSgpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByb290ID0gdGhpcy5hZGRBc3NlbWJseShhc20sIHsgaXNSb290IH0pO1xuICAgICAgLy8gVXNpbmcgfHwgaW5zdGVhZCBvZiA/PyBiZWNhdXNlIG5wbWpzLmNvbSB3aWxsIGFsdGVyIHRoZSBwYWNrYWdlLmpzb24gZmlsZSBhbmQgcG9zc2libHkgcHV0IGBmYWxzZWAgaW4gcGtnLmJ1bmRsZURlcGVuZGVuY2llcy5cbiAgICAgIC8vIFRoaXMgaXMgYWN0dWFsbHkgbm9uIGNvbXBsaWFudCB0byB0aGUgcGFja2FnZS5qc29uIHNwZWNpZmljYXRpb24sIGJ1dCB0aGF0J3MgaG93IGl0IGlzLi4uXG4gICAgICBjb25zdCBidW5kbGVkOiBzdHJpbmdbXSA9XG4gICAgICAgIHBrZy5idW5kbGVkRGVwZW5kZW5jaWVzIHx8IHBrZy5idW5kbGVEZXBlbmRlbmNpZXMgfHwgW107XG5cbiAgICAgIGZvciAoY29uc3QgbmFtZSBvZiBkZXBlbmRlbmNpZXNPZihwa2cpKSB7XG4gICAgICAgIGlmIChidW5kbGVkLmluY2x1ZGVzKG5hbWUpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkZXBEaXIgPSByZXF1aXJlLnJlc29sdmUoYCR7bmFtZX0vcGFja2FnZS5qc29uYCwge1xuICAgICAgICAgIHBhdGhzOiBbbW9kdWxlRGlyZWN0b3J5XSxcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hd2FpdC1pbi1sb29wXG4gICAgICAgIGF3YWl0IF9sb2FkTW9kdWxlLmNhbGwodGhpcywgcGF0aC5kaXJuYW1lKGRlcERpcikpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcm9vdDtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgbG9hZEZpbGUoXG4gICAgZmlsZTogc3RyaW5nLFxuICAgIG9wdGlvbnM6IHsgaXNSb290PzogYm9vbGVhbjsgdmFsaWRhdGU/OiBib29sZWFuIH0gPSB7fSxcbiAgKSB7XG4gICAgY29uc3QgYXNzZW1ibHkgPSBhd2FpdCB0aGlzLmxvYWRBc3NlbWJseShmaWxlLCBvcHRpb25zLnZhbGlkYXRlICE9PSBmYWxzZSk7XG4gICAgcmV0dXJuIHRoaXMuYWRkQXNzZW1ibHkoYXNzZW1ibHksIG9wdGlvbnMpO1xuICB9XG5cbiAgcHVibGljIGFkZEFzc2VtYmx5KGFzbTogQXNzZW1ibHksIG9wdGlvbnM6IHsgaXNSb290PzogYm9vbGVhbiB9ID0ge30pIHtcbiAgICBpZiAoYXNtLnN5c3RlbSAhPT0gdGhpcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBc3NlbWJseSBoYXMgYmVlbiBjcmVhdGVkIGZvciBkaWZmZXJlbnQgdHlwZXN5c3RlbScpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5fYXNzZW1ibHlMb29rdXBbYXNtLm5hbWVdKSB7XG4gICAgICB0aGlzLl9hc3NlbWJseUxvb2t1cFthc20ubmFtZV0gPSBhc207XG4gICAgICB0aGlzLmFzc2VtYmxpZXMucHVzaChhc20pO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmlzUm9vdCAhPT0gZmFsc2UpIHtcbiAgICAgIHRoaXMuYWRkUm9vdChhc20pO1xuICAgIH1cblxuICAgIHJldHVybiBhc207XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoaXMgVHlwZVN5c3RlbSBpbmNsdWRlcyBhIGdpdmVuIGFzc2VtYmx5LlxuICAgKlxuICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgYXNzZW1ibHkgYmVpbmcgbG9va2VkIGZvci5cbiAgICovXG4gIHB1YmxpYyBpbmNsdWRlc0Fzc2VtYmx5KG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBuYW1lIGluIHRoaXMuX2Fzc2VtYmx5TG9va3VwO1xuICB9XG5cbiAgcHVibGljIGlzUm9vdChuYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5yb290cy5tYXAoKHIpID0+IHIubmFtZSkuaW5jbHVkZXMobmFtZSk7XG4gIH1cblxuICBwdWJsaWMgZmluZEFzc2VtYmx5KG5hbWU6IHN0cmluZykge1xuICAgIGNvbnN0IHJldCA9IHRoaXMudHJ5RmluZEFzc2VtYmx5KG5hbWUpO1xuICAgIGlmICghcmV0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEFzc2VtYmx5IFwiJHtuYW1lfVwiIG5vdCBmb3VuZGApO1xuICAgIH1cbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgcHVibGljIHRyeUZpbmRBc3NlbWJseShuYW1lOiBzdHJpbmcpOiBBc3NlbWJseSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2Fzc2VtYmx5TG9va3VwW25hbWVdO1xuICB9XG5cbiAgcHVibGljIGZpbmRGcW4oZnFuOiBzdHJpbmcpOiBUeXBlIHtcbiAgICBjb25zdCBbYXNzZW1ibHldID0gZnFuLnNwbGl0KCcuJyk7XG4gICAgY29uc3QgYXNtID0gdGhpcy5maW5kQXNzZW1ibHkoYXNzZW1ibHkpO1xuICAgIHJldHVybiBhc20uZmluZFR5cGUoZnFuKTtcbiAgfVxuXG4gIHB1YmxpYyB0cnlGaW5kRnFuKGZxbjogc3RyaW5nKTogVHlwZSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgW2Fzc2VtYmx5XSA9IGZxbi5zcGxpdCgnLicpO1xuICAgIGNvbnN0IGFzbSA9IHRoaXMudHJ5RmluZEFzc2VtYmx5KGFzc2VtYmx5KTtcbiAgICByZXR1cm4gYXNtPy50cnlGaW5kVHlwZShmcW4pO1xuICB9XG5cbiAgcHVibGljIGZpbmRDbGFzcyhmcW46IHN0cmluZyk6IENsYXNzVHlwZSB7XG4gICAgY29uc3QgdHlwZSA9IHRoaXMuZmluZEZxbihmcW4pO1xuICAgIGlmICghKHR5cGUgaW5zdGFuY2VvZiBDbGFzc1R5cGUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZRTiAke2Zxbn0gaXMgbm90IGEgY2xhc3NgKTtcbiAgICB9XG4gICAgcmV0dXJuIHR5cGU7XG4gIH1cblxuICBwdWJsaWMgZmluZEludGVyZmFjZShmcW46IHN0cmluZyk6IEludGVyZmFjZVR5cGUge1xuICAgIGNvbnN0IHR5cGUgPSB0aGlzLmZpbmRGcW4oZnFuKTtcbiAgICBpZiAoISh0eXBlIGluc3RhbmNlb2YgSW50ZXJmYWNlVHlwZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRlFOICR7ZnFufSBpcyBub3QgYW4gaW50ZXJmYWNlYCk7XG4gICAgfVxuICAgIHJldHVybiB0eXBlO1xuICB9XG5cbiAgcHVibGljIGZpbmRFbnVtKGZxbjogc3RyaW5nKTogRW51bVR5cGUge1xuICAgIGNvbnN0IHR5cGUgPSB0aGlzLmZpbmRGcW4oZnFuKTtcbiAgICBpZiAoISh0eXBlIGluc3RhbmNlb2YgRW51bVR5cGUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZRTiAke2Zxbn0gaXMgbm90IGFuIGVudW1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHR5cGU7XG4gIH1cblxuICAvKipcbiAgICogQWxsIG1ldGhvZHMgaW4gdGhlIHR5cGUgc3lzdGVtLlxuICAgKi9cbiAgcHVibGljIGdldCBtZXRob2RzKCkge1xuICAgIGNvbnN0IGdldE1ldGhvZHMgPSAobW9kOiBNb2R1bGVMaWtlKTogcmVhZG9ubHkgTWV0aG9kW10gPT4ge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgLi4uZmxhdE1hcChtb2Quc3VibW9kdWxlcywgZ2V0TWV0aG9kcyksXG4gICAgICAgIC4uLmZsYXRNYXAobW9kLmludGVyZmFjZXMsIChpZmFjZSkgPT4gaWZhY2Uub3duTWV0aG9kcyksXG4gICAgICAgIC4uLmZsYXRNYXAobW9kLmNsYXNzZXMsIChjbGF6eikgPT4gY2xhenoub3duTWV0aG9kcyksXG4gICAgICBdO1xuICAgIH07XG5cbiAgICByZXR1cm4gZmxhdE1hcCh0aGlzLmFzc2VtYmxpZXMsIGdldE1ldGhvZHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFsbCBwcm9wZXJ0aWVzIGluIHRoZSB0eXBlIHN5c3RlbS5cbiAgICovXG4gIHB1YmxpYyBnZXQgcHJvcGVydGllcygpIHtcbiAgICBjb25zdCBnZXRQcm9wZXJ0aWVzID0gKG1vZDogTW9kdWxlTGlrZSk6IHJlYWRvbmx5IFByb3BlcnR5W10gPT4ge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgLi4uZmxhdE1hcChtb2Quc3VibW9kdWxlcywgZ2V0UHJvcGVydGllcyksXG4gICAgICAgIC4uLmZsYXRNYXAobW9kLmludGVyZmFjZXMsIChpZmFjZSkgPT4gaWZhY2Uub3duUHJvcGVydGllcyksXG4gICAgICAgIC4uLmZsYXRNYXAobW9kLmNsYXNzZXMsIChjbGF6eikgPT4gY2xhenoub3duUHJvcGVydGllcyksXG4gICAgICBdO1xuICAgIH07XG5cbiAgICByZXR1cm4gZmxhdE1hcCh0aGlzLmFzc2VtYmxpZXMsIGdldFByb3BlcnRpZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFsbCBjbGFzc2VzIGluIHRoZSB0eXBlIHN5c3RlbS5cbiAgICovXG4gIHB1YmxpYyBnZXQgY2xhc3NlcygpOiByZWFkb25seSBDbGFzc1R5cGVbXSB7XG4gICAgY29uc3Qgb3V0ID0gbmV3IEFycmF5PENsYXNzVHlwZT4oKTtcbiAgICB0aGlzLmFzc2VtYmxpZXMuZm9yRWFjaCgoYSkgPT4ge1xuICAgICAgb3V0LnB1c2goLi4uY29sbGVjdFR5cGVzKGEsIChpdGVtKSA9PiBpdGVtLmNsYXNzZXMpKTtcbiAgICB9KTtcbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgLyoqXG4gICAqIEFsbCBpbnRlcmZhY2VzIGluIHRoZSB0eXBlIHN5c3RlbS5cbiAgICovXG4gIHB1YmxpYyBnZXQgaW50ZXJmYWNlcygpOiByZWFkb25seSBJbnRlcmZhY2VUeXBlW10ge1xuICAgIGNvbnN0IG91dCA9IG5ldyBBcnJheTxJbnRlcmZhY2VUeXBlPigpO1xuICAgIHRoaXMuYXNzZW1ibGllcy5mb3JFYWNoKChhKSA9PiB7XG4gICAgICBvdXQucHVzaCguLi5jb2xsZWN0VHlwZXMoYSwgKGl0ZW0pID0+IGl0ZW0uaW50ZXJmYWNlcykpO1xuICAgIH0pO1xuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICAvKipcbiAgICogQWxsIGVudW1zIGluIHRoZSB0eXBlIHN5c3RlbS5cbiAgICovXG4gIHB1YmxpYyBnZXQgZW51bXMoKTogcmVhZG9ubHkgRW51bVR5cGVbXSB7XG4gICAgY29uc3Qgb3V0ID0gbmV3IEFycmF5PEVudW1UeXBlPigpO1xuICAgIHRoaXMuYXNzZW1ibGllcy5mb3JFYWNoKChhKSA9PiB7XG4gICAgICBvdXQucHVzaCguLi5jb2xsZWN0VHlwZXMoYSwgKGl0ZW0pID0+IGl0ZW0uZW51bXMpKTtcbiAgICB9KTtcbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgYW4gYXNzZW1ibHkgd2l0aG91dCBhZGRpbmcgaXQgdG8gdGhlIHR5cGVzeXN0ZW1cbiAgICogQHBhcmFtIGZpbGUgQXNzZW1ibHkgZmlsZSB0byBsb2FkXG4gICAqIEBwYXJhbSB2YWxpZGF0ZSBXaGV0aGVyIHRvIHZhbGlkYXRlIHRoZSBhc3NlbWJseSBvciBqdXN0IGFzc3VtZSBpdCBtYXRjaGVzIHRoZSBzY2hlbWFcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgbG9hZEFzc2VtYmx5KGZpbGU6IHN0cmluZywgdmFsaWRhdGUgPSB0cnVlKSB7XG4gICAgY29uc3Qgc3BlYyA9IEpTT04ucGFyc2UoKGF3YWl0IHJlYWRGaWxlKGZpbGUpKS50b1N0cmluZygpKTtcbiAgICBjb25zdCBhc3MgPSB2YWxpZGF0ZVxuICAgICAgPyBqc2lpLnZhbGlkYXRlQXNzZW1ibHkoc3BlYylcbiAgICAgIDogKHNwZWMgYXMganNpaS5Bc3NlbWJseSk7XG4gICAgcmV0dXJuIG5ldyBBc3NlbWJseSh0aGlzLCBhc3MpO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRSb290KGFzbTogQXNzZW1ibHkpIHtcbiAgICBpZiAoIXRoaXMucm9vdHMubWFwKChyKSA9PiByLm5hbWUpLmluY2x1ZGVzKGFzbS5uYW1lKSkge1xuICAgICAgdGhpcy5yb290cy5wdXNoKGFzbSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGRlcGVuZGVuY2llc09mKHBhY2thZ2VKc29uOiBhbnkpIHtcbiAgY29uc3QgZGVwcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBPYmplY3Qua2V5cyhwYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgPz8ge30pLmZvckVhY2goZGVwcy5hZGQuYmluZChkZXBzKSk7XG4gIE9iamVjdC5rZXlzKHBhY2thZ2VKc29uLnBlZXJEZXBlbmRlbmNpZXMgPz8ge30pLmZvckVhY2goZGVwcy5hZGQuYmluZChkZXBzKSk7XG4gIHJldHVybiBBcnJheS5mcm9tKGRlcHMpO1xufVxuXG5mdW5jdGlvbiBjb2xsZWN0VHlwZXM8VCBleHRlbmRzIFR5cGU+KFxuICBtb2R1bGU6IE1vZHVsZUxpa2UsXG4gIGdldHRlcjogKG1vZHVsZTogTW9kdWxlTGlrZSkgPT4gcmVhZG9ubHkgVFtdLFxuKTogcmVhZG9ubHkgVFtdIHtcbiAgY29uc3QgcmVzdWx0ID0gbmV3IEFycmF5PFQ+KCk7XG4gIGZvciAoY29uc3Qgc3VibW9kdWxlIG9mIG1vZHVsZS5zdWJtb2R1bGVzKSB7XG4gICAgcmVzdWx0LnB1c2goLi4uY29sbGVjdFR5cGVzKHN1Ym1vZHVsZSwgZ2V0dGVyKSk7XG4gIH1cbiAgcmVzdWx0LnB1c2goLi4uZ2V0dGVyKG1vZHVsZSkpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBmbGF0TWFwPFQsIFI+KFxuICBjb2xsZWN0aW9uOiByZWFkb25seSBUW10sXG4gIG1hcHBlcjogKHZhbHVlOiBUKSA9PiByZWFkb25seSBSW10sXG4pOiByZWFkb25seSBSW10ge1xuICByZXR1cm4gY29sbGVjdGlvblxuICAgIC5tYXAobWFwcGVyKVxuICAgIC5yZWR1Y2UoKGFjYywgZWx0KSA9PiBhY2MuY29uY2F0KGVsdCksIG5ldyBBcnJheTxSPigpKTtcbn1cblxuZnVuY3Rpb24gc3RhdChwOiBzdHJpbmcpIHtcbiAgLy8ganVzdC1pbi10aW1lIHJlcXVpcmUgc28gdGhhdCB0aGlzIGZpbGUgY2FuIGJlIGxvYWRlZCBpbiBicm93c2VycyBhcyB3ZWxsLlxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0cyxAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdmFyLXJlcXVpcmVzXG4gIGNvbnN0IGZzID0gcmVxdWlyZSgnZnMnKTtcbiAgcmV0dXJuIHByb21pc2lmeShmcy5zdGF0KShwKTtcbn1cblxuZnVuY3Rpb24gcmVhZEZpbGUocDogc3RyaW5nKSB7XG4gIC8vIGp1c3QtaW4tdGltZSByZXF1aXJlIHNvIHRoYXQgdGhpcyBmaWxlIGNhbiBiZSBsb2FkZWQgaW4gYnJvd3NlcnMgYXMgd2VsbC5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHMsQHR5cGVzY3JpcHQtZXNsaW50L25vLXZhci1yZXF1aXJlc1xuICBjb25zdCBmcyA9IHJlcXVpcmUoJ2ZzJyk7XG4gIHJldHVybiBwcm9taXNpZnkoZnMucmVhZEZpbGUpKHApO1xufVxuIl19
279
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZS1zeXN0ZW0uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ0eXBlLXN5c3RlbS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtQ0FBbUM7QUFDbkMsK0JBQStCO0FBQy9CLDZCQUE2QjtBQUU3Qix5Q0FBc0M7QUFDdEMsbUNBQW9DO0FBQ3BDLGlDQUFrQztBQUNsQywyQ0FBNEM7QUFLNUMsaUNBQWtFO0FBRWxFLE1BQWEsVUFBVTtJQUF2QjtRQUNFOztXQUVHO1FBQ2EsZUFBVSxHQUFHLElBQUksS0FBSyxFQUFZLENBQUM7UUFFbkQ7O1dBRUc7UUFDYSxVQUFLLEdBQUcsSUFBSSxLQUFLLEVBQVksQ0FBQztRQUU3QixvQkFBZSxHQUFpQyxFQUFFLENBQUM7SUEwU3RFLENBQUM7SUF4U0M7Ozs7O09BS0c7SUFDSSxLQUFLLENBQUMsbUJBQW1CLENBQzlCLFdBQW1CLEVBQ25CLFVBQWtDLEVBQUU7UUFFcEMsTUFBTSxHQUFHLEdBQUcsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQUM7UUFFekUsS0FBSyxNQUFNLEdBQUcsSUFBSSxjQUFjLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDckMsSUFBSSxzQkFBZSxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUN4QixTQUFTO2FBQ1Y7WUFFRCw0Q0FBNEM7WUFDNUMsTUFBTSxNQUFNLEdBQUcsTUFBTSw4QkFBdUIsQ0FBQyxHQUFHLEVBQUUsV0FBVyxDQUFDLENBQUM7WUFFL0QsNENBQTRDO1lBQzVDLE1BQU0sVUFBVSxHQUFHLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFDO1lBQ3hFLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFO2dCQUNwQixTQUFTO2FBQ1Y7WUFFRCw0Q0FBNEM7WUFDNUMsTUFBTSxJQUFJLENB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QUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLEtBQUssRUFBSyxDQUFDLENBQUM7QUFDM0QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGpzaWkgZnJvbSAnQGpzaWkvc3BlYyc7XG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcy1leHRyYSc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuXG5pbXBvcnQgeyBBc3NlbWJseSB9IGZyb20gJy4vYXNzZW1ibHknO1xuaW1wb3J0IHsgQ2xhc3NUeXBlIH0gZnJvbSAnLi9jbGFzcyc7XG5pbXBvcnQgeyBFbnVtVHlwZSB9IGZyb20gJy4vZW51bSc7XG5pbXBvcnQgeyBJbnRlcmZhY2VUeXBlIH0gZnJvbSAnLi9pbnRlcmZhY2UnO1xuaW1wb3J0IHsgTWV0aG9kIH0gZnJvbSAnLi9tZXRob2QnO1xuaW1wb3J0IHsgTW9kdWxlTGlrZSB9IGZyb20gJy4vbW9kdWxlLWxpa2UnO1xuaW1wb3J0IHsgUHJvcGVydHkgfSBmcm9tICcuL3Byb3BlcnR5JztcbmltcG9ydCB7IFR5cGUgfSBmcm9tICcuL3R5cGUnO1xuaW1wb3J0IHsgZmluZERlcGVuZGVuY3lEaXJlY3RvcnksIGlzQnVpbHRpbk1vZHVsZSB9IGZyb20gJy4vdXRpbCc7XG5cbmV4cG9ydCBjbGFzcyBUeXBlU3lzdGVtIHtcbiAgLyoqXG4gICAqIEFsbCBhc3NlbWJsaWVzIGluIHRoaXMgdHlwZSBzeXN0ZW0uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYXNzZW1ibGllcyA9IG5ldyBBcnJheTxBc3NlbWJseT4oKTtcblxuICAvKipcbiAgICogVGhlIFwicm9vdFwiIGFzc2VtYmxpZXMgKG9uZXMgdGhhdCBsb2FkZWQgZXhwbGljaXRseSB2aWEgYSBcImxvYWRcIiBjYWxsKS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSByb290cyA9IG5ldyBBcnJheTxBc3NlbWJseT4oKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9hc3NlbWJseUxvb2t1cDogeyBbbmFtZTogc3RyaW5nXTogQXNzZW1ibHkgfSA9IHt9O1xuXG4gIC8qKlxuICAgKiBMb2FkIGFsbCBKU0lJIGRlcGVuZGVuY2llcyBvZiB0aGUgZ2l2ZW4gTlBNIHBhY2thZ2UgZGlyZWN0b3J5LlxuICAgKlxuICAgKiBUaGUgTlBNIHBhY2thZ2UgaXRzZWxmIGRvZXMgKm5vdCogaGF2ZSB0byBiZSBhIGpzaWkgcGFja2FnZSwgYW5kIGRvZXNcbiAgICogTk9UIGhhdmUgdG8gZGVjbGFyZSBhIEpTSUkgZGVwZW5kZW5jeSBvbiBhbnkgb2YgdGhlIHBhY2thZ2VzLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGxvYWROcG1EZXBlbmRlbmNpZXMoXG4gICAgcGFja2FnZVJvb3Q6IHN0cmluZyxcbiAgICBvcHRpb25zOiB7IHZhbGlkYXRlPzogYm9vbGVhbiB9ID0ge30sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBrZyA9IGF3YWl0IGZzLnJlYWRKc29uKHBhdGgucmVzb2x2ZShwYWNrYWdlUm9vdCwgJ3BhY2thZ2UuanNvbicpKTtcblxuICAgIGZvciAoY29uc3QgZGVwIG9mIGRlcGVuZGVuY2llc09mKHBrZykpIHtcbiAgICAgIGlmIChpc0J1aWx0aW5Nb2R1bGUoZGVwKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWF3YWl0LWluLWxvb3BcbiAgICAgIGNvbnN0IGRlcERpciA9IGF3YWl0IGZpbmREZXBlbmRlbmN5RGlyZWN0b3J5KGRlcCwgcGFja2FnZVJvb3QpO1xuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYXdhaXQtaW4tbG9vcFxuICAgICAgY29uc3QgZGVwUGtnSnNvbiA9IGF3YWl0IGZzLnJlYWRKc29uKHBhdGguam9pbihkZXBEaXIsICdwYWNrYWdlLmpzb24nKSk7XG4gICAgICBpZiAoIWRlcFBrZ0pzb24uanNpaSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWF3YWl0LWluLWxvb3BcbiAgICAgIGF3YWl0IHRoaXMubG9hZE1vZHVsZShkZXBEaXIsIG9wdGlvbnMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkcyBhIGpzaWkgbW9kdWxlIG9yIGEgc2luZ2xlIC5qc2lpIGZpbGUgaW50byB0aGUgdHlwZSBzeXN0ZW0uXG4gICAqXG4gICAqIElmIGBmaWxlT3JEaXJlY3RvcnlgIGlzIGEgZGlyZWN0b3J5LCBpdCB3aWxsIGJlIHRyZWF0ZWQgYXMgYSBqc2lpIG5wbSBtb2R1bGUsXG4gICAqIGFuZCBpdHMgZGVwZW5kZW5jaWVzIChhcyBkZXRlcm1pbmVkIGJ5IGl0cyAncGFja2FnZS5qc29uJyBmaWxlKSB3aWxsIGJlIGxvYWRlZFxuICAgKiBhcyB3ZWxsLlxuICAgKlxuICAgKiBJZiBgZmlsZU9yRGlyZWN0b3J5YCBpcyBhIGZpbGUsIGl0IHdpbGwgYmUgdHJlYXRlZCBhcyBhIHNpbmdsZSAuanNpaSBmaWxlLlxuICAgKiBObyBkZXBlbmRlbmNpZXMgd2lsbCBiZSBsb2FkZWQuIFlvdSBhbG1vc3QgbmV2ZXIgd2FudCB0aGlzLlxuICAgKlxuICAgKiBOb3QgdmFsaWRhdGluZyBtYWtlcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGxvYWRpbmcgYXNzZW1ibGllcyB3aXRoIGxvdHNcbiAgICogb2YgZGVwZW5kZW5jaWVzIChzdWNoIGFzIGFwcC1kZWxpdmVyeSkgaW4gOTBtcyB2cyAzNTAwbXMuXG4gICAqXG4gICAqIEBwYXJhbSBmaWxlT3JEaXJlY3RvcnkgQSAuanNpaSBmaWxlIHBhdGggb3IgYSBtb2R1bGUgZGlyZWN0b3J5XG4gICAqIEBwYXJhbSB2YWxpZGF0ZSBXaGV0aGVyIG9yIG5vdCB0byB2YWxpZGF0ZSB0aGUgYXNzZW1ibHkgd2hpbGUgbG9hZGluZyBpdC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBsb2FkKFxuICAgIGZpbGVPckRpcmVjdG9yeTogc3RyaW5nLFxuICAgIG9wdGlvbnM6IHsgdmFsaWRhdGU/OiBib29sZWFuIH0gPSB7fSxcbiAgKSB7XG4gICAgaWYgKChhd2FpdCBmcy5zdGF0KGZpbGVPckRpcmVjdG9yeSkpLmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmxvYWRNb2R1bGUoZmlsZU9yRGlyZWN0b3J5LCBvcHRpb25zKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubG9hZEZpbGUoZmlsZU9yRGlyZWN0b3J5LCB7IC4uLm9wdGlvbnMsIGlzUm9vdDogdHJ1ZSB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBsb2FkTW9kdWxlKFxuICAgIGRpcjogc3RyaW5nLFxuICAgIG9wdGlvbnM6IHsgdmFsaWRhdGU/OiBib29sZWFuIH0gPSB7fSxcbiAgKTogUHJvbWlzZTxBc3NlbWJseT4ge1xuICAgIGNvbnN0IG91dCA9IGF3YWl0IF9sb2FkTW9kdWxlLmNhbGwodGhpcywgZGlyLCB0cnVlKTtcbiAgICBpZiAoIW91dCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gbG9hZCBtb2R1bGUgZnJvbSBkaXJlY3Rvcnk6ICR7ZGlyfWApO1xuICAgIH1cblxuICAgIHJldHVybiBvdXQ7XG5cbiAgICBhc3luYyBmdW5jdGlvbiBfbG9hZE1vZHVsZShcbiAgICAgIHRoaXM6IFR5cGVTeXN0ZW0sXG4gICAgICBtb2R1bGVEaXJlY3Rvcnk6IHN0cmluZyxcbiAgICAgIGlzUm9vdCA9IGZhbHNlLFxuICAgICkge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4obW9kdWxlRGlyZWN0b3J5LCAncGFja2FnZS5qc29uJyk7XG4gICAgICBjb25zdCBwa2cgPSBKU09OLnBhcnNlKFxuICAgICAgICBhd2FpdCBmcy5yZWFkRmlsZShmaWxlUGF0aCwgeyBlbmNvZGluZzogJ3V0Zi04JyB9KSxcbiAgICAgICk7XG4gICAgICBpZiAoIXBrZy5qc2lpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gXCJqc2lpXCIgc2VjdGlvbiBpbiAke2ZpbGVQYXRofWApO1xuICAgICAgfVxuXG4gICAgICAvLyBMb2FkIHRoZSBhc3NlbWJseSwgYnV0IGRvbid0IHJlY3Vyc2UgaWYgd2UgYWxyZWFkeSBoYXZlIGFuIGFzc2VtYmx5IHdpdGggdGhlIHNhbWUgbmFtZS5cbiAgICAgIC8vIFZhbGlkYXRpb24gaXMgbm90IGFuIGluc2lnbmlmaWNhbnQgdGltZSBzaW5rLCBhbmQgbG9hZGluZyBJUyBpbnNpZ25pZmljYW50LCBzbyBkbyBhXG4gICAgICAvLyBsb2FkIHdpdGhvdXQgdmFsaWRhdGlvbiBmaXJzdC4gVGhpcyBzYXZlcyBhYm91dCAyLzNyZHMgb2YgcHJvY2Vzc2luZyB0aW1lLlxuICAgICAgY29uc3QgYXNtID0gYXdhaXQgdGhpcy5sb2FkQXNzZW1ibHkoXG4gICAgICAgIHBhdGguam9pbihtb2R1bGVEaXJlY3RvcnksICcuanNpaScpLFxuICAgICAgICBmYWxzZSxcbiAgICAgICk7XG4gICAgICBpZiAodGhpcy5pbmNsdWRlc0Fzc2VtYmx5KGFzbS5uYW1lKSkge1xuICAgICAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuZmluZEFzc2VtYmx5KGFzbS5uYW1lKTtcbiAgICAgICAgaWYgKGV4aXN0aW5nLnZlcnNpb24gIT09IGFzbS52ZXJzaW9uKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYENvbmZsaWN0aW5nIHZlcnNpb25zIG9mICR7YXNtLm5hbWV9IGluIHR5cGUgc3lzdGVtOiBwcmV2aW91c2x5IGxvYWRlZCAke2V4aXN0aW5nLnZlcnNpb259LCB0cnlpbmcgdG8gbG9hZCAke2FzbS52ZXJzaW9ufWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCB3ZSBtYXJrIHRoaXMgdGhpbmcgYXMgcm9vdCBhZnRlciBhbGwgaWYgaXQgd2Fzbid0IHlldC5cbiAgICAgICAgaWYgKGlzUm9vdCkge1xuICAgICAgICAgIHRoaXMuYWRkUm9vdChhc20pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGV4aXN0aW5nO1xuICAgICAgfVxuXG4gICAgICBpZiAob3B0aW9ucy52YWxpZGF0ZSAhPT0gZmFsc2UpIHtcbiAgICAgICAgYXNtLnZhbGlkYXRlKCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJvb3QgPSB0aGlzLmFkZEFzc2VtYmx5KGFzbSwgeyBpc1Jvb3QgfSk7XG4gICAgICAvLyBVc2luZyB8fCBpbnN0ZWFkIG9mID8/IGJlY2F1c2UgbnBtanMuY29tIHdpbGwgYWx0ZXIgdGhlIHBhY2thZ2UuanNvbiBmaWxlIGFuZCBwb3NzaWJseSBwdXQgYGZhbHNlYCBpbiBwa2cuYnVuZGxlRGVwZW5kZW5jaWVzLlxuICAgICAgLy8gVGhpcyBpcyBhY3R1YWxseSBub24gY29tcGxpYW50IHRvIHRoZSBwYWNrYWdlLmpzb24gc3BlY2lmaWNhdGlvbiwgYnV0IHRoYXQncyBob3cgaXQgaXMuLi5cbiAgICAgIGNvbnN0IGJ1bmRsZWQ6IHN0cmluZ1tdID1cbiAgICAgICAgcGtnLmJ1bmRsZWREZXBlbmRlbmNpZXMgfHwgcGtnLmJ1bmRsZURlcGVuZGVuY2llcyB8fCBbXTtcblxuICAgICAgZm9yIChjb25zdCBuYW1lIG9mIGRlcGVuZGVuY2llc09mKHBrZykpIHtcbiAgICAgICAgaWYgKGJ1bmRsZWQuaW5jbHVkZXMobmFtZSkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hd2FpdC1pbi1sb29wXG4gICAgICAgIGNvbnN0IGRlcERpciA9IGF3YWl0IGZpbmREZXBlbmRlbmN5RGlyZWN0b3J5KG5hbWUsIG1vZHVsZURpcmVjdG9yeSk7XG5cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWF3YWl0LWluLWxvb3BcbiAgICAgICAgYXdhaXQgX2xvYWRNb2R1bGUuY2FsbCh0aGlzLCBkZXBEaXIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcm9vdDtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgbG9hZEZpbGUoXG4gICAgZmlsZTogc3RyaW5nLFxuICAgIG9wdGlvbnM6IHsgaXNSb290PzogYm9vbGVhbjsgdmFsaWRhdGU/OiBib29sZWFuIH0gPSB7fSxcbiAgKSB7XG4gICAgY29uc3QgYXNzZW1ibHkgPSBhd2FpdCB0aGlzLmxvYWRBc3NlbWJseShmaWxlLCBvcHRpb25zLnZhbGlkYXRlICE9PSBmYWxzZSk7XG4gICAgcmV0dXJuIHRoaXMuYWRkQXNzZW1ibHkoYXNzZW1ibHksIG9wdGlvbnMpO1xuICB9XG5cbiAgcHVibGljIGFkZEFzc2VtYmx5KGFzbTogQXNzZW1ibHksIG9wdGlvbnM6IHsgaXNSb290PzogYm9vbGVhbiB9ID0ge30pIHtcbiAgICBpZiAoYXNtLnN5c3RlbSAhPT0gdGhpcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBc3NlbWJseSBoYXMgYmVlbiBjcmVhdGVkIGZvciBkaWZmZXJlbnQgdHlwZXN5c3RlbScpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5fYXNzZW1ibHlMb29rdXBbYXNtLm5hbWVdKSB7XG4gICAgICB0aGlzLl9hc3NlbWJseUxvb2t1cFthc20ubmFtZV0gPSBhc207XG4gICAgICB0aGlzLmFzc2VtYmxpZXMucHVzaChhc20pO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmlzUm9vdCAhPT0gZmFsc2UpIHtcbiAgICAgIHRoaXMuYWRkUm9vdChhc20pO1xuICAgIH1cblxuICAgIHJldHVybiBhc207XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoaXMgVHlwZVN5c3RlbSBpbmNsdWRlcyBhIGdpdmVuIGFzc2VtYmx5LlxuICAgKlxuICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgYXNzZW1ibHkgYmVpbmcgbG9va2VkIGZvci5cbiAgICovXG4gIHB1YmxpYyBpbmNsdWRlc0Fzc2VtYmx5KG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBuYW1lIGluIHRoaXMuX2Fzc2VtYmx5TG9va3VwO1xuICB9XG5cbiAgcHVibGljIGlzUm9vdChuYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5yb290cy5tYXAoKHIpID0+IHIubmFtZSkuaW5jbHVkZXMobmFtZSk7XG4gIH1cblxuICBwdWJsaWMgZmluZEFzc2VtYmx5KG5hbWU6IHN0cmluZykge1xuICAgIGNvbnN0IHJldCA9IHRoaXMudHJ5RmluZEFzc2VtYmx5KG5hbWUpO1xuICAgIGlmICghcmV0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEFzc2VtYmx5IFwiJHtuYW1lfVwiIG5vdCBmb3VuZGApO1xuICAgIH1cbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgcHVibGljIHRyeUZpbmRBc3NlbWJseShuYW1lOiBzdHJpbmcpOiBBc3NlbWJseSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2Fzc2VtYmx5TG9va3VwW25hbWVdO1xuICB9XG5cbiAgcHVibGljIGZpbmRGcW4oZnFuOiBzdHJpbmcpOiBUeXBlIHtcbiAgICBjb25zdCBbYXNzZW1ibHldID0gZnFuLnNwbGl0KCcuJyk7XG4gICAgY29uc3QgYXNtID0gdGhpcy5maW5kQXNzZW1ibHkoYXNzZW1ibHkpO1xuICAgIHJldHVybiBhc20uZmluZFR5cGUoZnFuKTtcbiAgfVxuXG4gIHB1YmxpYyB0cnlGaW5kRnFuKGZxbjogc3RyaW5nKTogVHlwZSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgW2Fzc2VtYmx5XSA9IGZxbi5zcGxpdCgnLicpO1xuICAgIGNvbnN0IGFzbSA9IHRoaXMudHJ5RmluZEFzc2VtYmx5KGFzc2VtYmx5KTtcbiAgICByZXR1cm4gYXNtPy50cnlGaW5kVHlwZShmcW4pO1xuICB9XG5cbiAgcHVibGljIGZpbmRDbGFzcyhmcW46IHN0cmluZyk6IENsYXNzVHlwZSB7XG4gICAgY29uc3QgdHlwZSA9IHRoaXMuZmluZEZxbihmcW4pO1xuICAgIGlmICghKHR5cGUgaW5zdGFuY2VvZiBDbGFzc1R5cGUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZRTiAke2Zxbn0gaXMgbm90IGEgY2xhc3NgKTtcbiAgICB9XG4gICAgcmV0dXJuIHR5cGU7XG4gIH1cblxuICBwdWJsaWMgZmluZEludGVyZmFjZShmcW46IHN0cmluZyk6IEludGVyZmFjZVR5cGUge1xuICAgIGNvbnN0IHR5cGUgPSB0aGlzLmZpbmRGcW4oZnFuKTtcbiAgICBpZiAoISh0eXBlIGluc3RhbmNlb2YgSW50ZXJmYWNlVHlwZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRlFOICR7ZnFufSBpcyBub3QgYW4gaW50ZXJmYWNlYCk7XG4gICAgfVxuICAgIHJldHVybiB0eXBlO1xuICB9XG5cbiAgcHVibGljIGZpbmRFbnVtKGZxbjogc3RyaW5nKTogRW51bVR5cGUge1xuICAgIGNvbnN0IHR5cGUgPSB0aGlzLmZpbmRGcW4oZnFuKTtcbiAgICBpZiAoISh0eXBlIGluc3RhbmNlb2YgRW51bVR5cGUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZRTiAke2Zxbn0gaXMgbm90IGFuIGVudW1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHR5cGU7XG4gIH1cblxuICAvKipcbiAgICogQWxsIG1ldGhvZHMgaW4gdGhlIHR5cGUgc3lzdGVtLlxuICAgKi9cbiAgcHVibGljIGdldCBtZXRob2RzKCkge1xuICAgIGNvbnN0IGdldE1ldGhvZHMgPSAobW9kOiBNb2R1bGVMaWtlKTogcmVhZG9ubHkgTWV0aG9kW10gPT4ge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgLi4uZmxhdE1hcChtb2Quc3VibW9kdWxlcywgZ2V0TWV0aG9kcyksXG4gICAgICAgIC4uLmZsYXRNYXAobW9kLmludGVyZmFjZXMsIChpZmFjZSkgPT4gaWZhY2Uub3duTWV0aG9kcyksXG4gICAgICAgIC4uLmZsYXRNYXAobW9kLmNsYXNzZXMsIChjbGF6eikgPT4gY2xhenoub3duTWV0aG9kcyksXG4gICAgICBdO1xuICAgIH07XG5cbiAgICByZXR1cm4gZmxhdE1hcCh0aGlzLmFzc2VtYmxpZXMsIGdldE1ldGhvZHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFsbCBwcm9wZXJ0aWVzIGluIHRoZSB0eXBlIHN5c3RlbS5cbiAgICovXG4gIHB1YmxpYyBnZXQgcHJvcGVydGllcygpIHtcbiAgICBjb25zdCBnZXRQcm9wZXJ0aWVzID0gKG1vZDogTW9kdWxlTGlrZSk6IHJlYWRvbmx5IFByb3BlcnR5W10gPT4ge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgLi4uZmxhdE1hcChtb2Quc3VibW9kdWxlcywgZ2V0UHJvcGVydGllcyksXG4gICAgICAgIC4uLmZsYXRNYXAobW9kLmludGVyZmFjZXMsIChpZmFjZSkgPT4gaWZhY2Uub3duUHJvcGVydGllcyksXG4gICAgICAgIC4uLmZsYXRNYXAobW9kLmNsYXNzZXMsIChjbGF6eikgPT4gY2xhenoub3duUHJvcGVydGllcyksXG4gICAgICBdO1xuICAgIH07XG5cbiAgICByZXR1cm4gZmxhdE1hcCh0aGlzLmFzc2VtYmxpZXMsIGdldFByb3BlcnRpZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFsbCBjbGFzc2VzIGluIHRoZSB0eXBlIHN5c3RlbS5cbiAgICovXG4gIHB1YmxpYyBnZXQgY2xhc3NlcygpOiByZWFkb25seSBDbGFzc1R5cGVbXSB7XG4gICAgY29uc3Qgb3V0ID0gbmV3IEFycmF5PENsYXNzVHlwZT4oKTtcbiAgICB0aGlzLmFzc2VtYmxpZXMuZm9yRWFjaCgoYSkgPT4ge1xuICAgICAgb3V0LnB1c2goLi4uY29sbGVjdFR5cGVzKGEsIChpdGVtKSA9PiBpdGVtLmNsYXNzZXMpKTtcbiAgICB9KTtcbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgLyoqXG4gICAqIEFsbCBpbnRlcmZhY2VzIGluIHRoZSB0eXBlIHN5c3RlbS5cbiAgICovXG4gIHB1YmxpYyBnZXQgaW50ZXJmYWNlcygpOiByZWFkb25seSBJbnRlcmZhY2VUeXBlW10ge1xuICAgIGNvbnN0IG91dCA9IG5ldyBBcnJheTxJbnRlcmZhY2VUeXBlPigpO1xuICAgIHRoaXMuYXNzZW1ibGllcy5mb3JFYWNoKChhKSA9PiB7XG4gICAgICBvdXQucHVzaCguLi5jb2xsZWN0VHlwZXMoYSwgKGl0ZW0pID0+IGl0ZW0uaW50ZXJmYWNlcykpO1xuICAgIH0pO1xuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICAvKipcbiAgICogQWxsIGVudW1zIGluIHRoZSB0eXBlIHN5c3RlbS5cbiAgICovXG4gIHB1YmxpYyBnZXQgZW51bXMoKTogcmVhZG9ubHkgRW51bVR5cGVbXSB7XG4gICAgY29uc3Qgb3V0ID0gbmV3IEFycmF5PEVudW1UeXBlPigpO1xuICAgIHRoaXMuYXNzZW1ibGllcy5mb3JFYWNoKChhKSA9PiB7XG4gICAgICBvdXQucHVzaCguLi5jb2xsZWN0VHlwZXMoYSwgKGl0ZW0pID0+IGl0ZW0uZW51bXMpKTtcbiAgICB9KTtcbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgYW4gYXNzZW1ibHkgd2l0aG91dCBhZGRpbmcgaXQgdG8gdGhlIHR5cGVzeXN0ZW1cbiAgICogQHBhcmFtIGZpbGUgQXNzZW1ibHkgZmlsZSB0byBsb2FkXG4gICAqIEBwYXJhbSB2YWxpZGF0ZSBXaGV0aGVyIHRvIHZhbGlkYXRlIHRoZSBhc3NlbWJseSBvciBqdXN0IGFzc3VtZSBpdCBtYXRjaGVzIHRoZSBzY2hlbWFcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgbG9hZEFzc2VtYmx5KGZpbGU6IHN0cmluZywgdmFsaWRhdGUgPSB0cnVlKSB7XG4gICAgY29uc3Qgc3BlYyA9IEpTT04ucGFyc2UoYXdhaXQgZnMucmVhZEZpbGUoZmlsZSwgeyBlbmNvZGluZzogJ3V0Zi04JyB9KSk7XG4gICAgY29uc3QgYXNzID0gdmFsaWRhdGVcbiAgICAgID8ganNpaS52YWxpZGF0ZUFzc2VtYmx5KHNwZWMpXG4gICAgICA6IChzcGVjIGFzIGpzaWkuQXNzZW1ibHkpO1xuICAgIHJldHVybiBuZXcgQXNzZW1ibHkodGhpcywgYXNzKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkUm9vdChhc206IEFzc2VtYmx5KSB7XG4gICAgaWYgKCF0aGlzLnJvb3RzLm1hcCgocikgPT4gci5uYW1lKS5pbmNsdWRlcyhhc20ubmFtZSkpIHtcbiAgICAgIHRoaXMucm9vdHMucHVzaChhc20pO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBkZXBlbmRlbmNpZXNPZihwYWNrYWdlSnNvbjogYW55KSB7XG4gIGNvbnN0IGRlcHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgT2JqZWN0LmtleXMocGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9KS5mb3JFYWNoKGRlcHMuYWRkLmJpbmQoZGVwcykpO1xuICBPYmplY3Qua2V5cyhwYWNrYWdlSnNvbi5wZWVyRGVwZW5kZW5jaWVzID8/IHt9KS5mb3JFYWNoKGRlcHMuYWRkLmJpbmQoZGVwcykpO1xuICByZXR1cm4gQXJyYXkuZnJvbShkZXBzKTtcbn1cblxuZnVuY3Rpb24gY29sbGVjdFR5cGVzPFQgZXh0ZW5kcyBUeXBlPihcbiAgbW9kdWxlOiBNb2R1bGVMaWtlLFxuICBnZXR0ZXI6IChtb2R1bGU6IE1vZHVsZUxpa2UpID0+IHJlYWRvbmx5IFRbXSxcbik6IHJlYWRvbmx5IFRbXSB7XG4gIGNvbnN0IHJlc3VsdCA9IG5ldyBBcnJheTxUPigpO1xuICBmb3IgKGNvbnN0IHN1Ym1vZHVsZSBvZiBtb2R1bGUuc3VibW9kdWxlcykge1xuICAgIHJlc3VsdC5wdXNoKC4uLmNvbGxlY3RUeXBlcyhzdWJtb2R1bGUsIGdldHRlcikpO1xuICB9XG4gIHJlc3VsdC5wdXNoKC4uLmdldHRlcihtb2R1bGUpKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gZmxhdE1hcDxULCBSPihcbiAgY29sbGVjdGlvbjogcmVhZG9ubHkgVFtdLFxuICBtYXBwZXI6ICh2YWx1ZTogVCkgPT4gcmVhZG9ubHkgUltdLFxuKTogcmVhZG9ubHkgUltdIHtcbiAgcmV0dXJuIGNvbGxlY3Rpb25cbiAgICAubWFwKG1hcHBlcilcbiAgICAucmVkdWNlKChhY2MsIGVsdCkgPT4gYWNjLmNvbmNhdChlbHQpLCBuZXcgQXJyYXk8Uj4oKSk7XG59XG4iXX0=
package/lib/util.d.ts CHANGED
@@ -1,3 +1,33 @@
1
1
  export declare function indexBy<T>(xs: T[], f: (x: T) => string): {
2
2
  [key: string]: T;
3
3
  };
4
+ /**
5
+ * Find the directory that contains a given dependency, identified by its 'package.json', from a starting search directory
6
+ *
7
+ * (This code is duplicated among jsii/jsii-pacmak/jsii-reflect. Changes should be done in all
8
+ * 3 locations, and we should unify these at some point: https://github.com/aws/jsii/issues/3236)
9
+ */
10
+ export declare function findDependencyDirectory(dependencyName: string, searchStart: string): Promise<string>;
11
+ /**
12
+ * Whether the given dependency is a built-in
13
+ *
14
+ * Some dependencies that occur in `package.json` are also built-ins in modern Node
15
+ * versions (most egregious example: 'punycode'). Detect those and filter them out.
16
+ */
17
+ export declare function isBuiltinModule(depName: string): any;
18
+ /**
19
+ * Find the package.json for a given package upwards from the given directory
20
+ *
21
+ * (This code is duplicated among jsii/jsii-pacmak/jsii-reflect. Changes should be done in all
22
+ * 3 locations, and we should unify these at some point: https://github.com/aws/jsii/issues/3236)
23
+ */
24
+ export declare function findPackageJsonUp(packageName: string, directory: string): Promise<string | undefined>;
25
+ /**
26
+ * Find a directory up the tree from a starting directory matching a condition
27
+ *
28
+ * Will return `undefined` if no directory matches
29
+ *
30
+ * (This code is duplicated among jsii/jsii-pacmak/jsii-reflect. Changes should be done in all
31
+ * 3 locations, and we should unify these at some point: https://github.com/aws/jsii/issues/3236)
32
+ */
33
+ export declare function findUp(directory: string, pred: (dir: string) => Promise<boolean>): Promise<string | undefined>;
package/lib/util.js CHANGED
@@ -1,6 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.indexBy = void 0;
3
+ exports.findUp = exports.findPackageJsonUp = exports.isBuiltinModule = exports.findDependencyDirectory = exports.indexBy = void 0;
4
+ const fs = require("fs-extra");
5
+ const path = require("path");
4
6
  function indexBy(xs, f) {
5
7
  const ret = {};
6
8
  for (const x of xs) {
@@ -9,4 +11,74 @@ function indexBy(xs, f) {
9
11
  return ret;
10
12
  }
11
13
  exports.indexBy = indexBy;
12
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInV0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsU0FBZ0IsT0FBTyxDQUFJLEVBQU8sRUFBRSxDQUFtQjtJQUNyRCxNQUFNLEdBQUcsR0FBeUIsRUFBRSxDQUFDO0lBQ3JDLEtBQUssTUFBTSxDQUFDLElBQUksRUFBRSxFQUFFO1FBQ2xCLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7S0FDZjtJQUNELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQU5ELDBCQU1DIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGZ1bmN0aW9uIGluZGV4Qnk8VD4oeHM6IFRbXSwgZjogKHg6IFQpID0+IHN0cmluZyk6IHsgW2tleTogc3RyaW5nXTogVCB9IHtcbiAgY29uc3QgcmV0OiB7IFtrZXk6IHN0cmluZ106IFQgfSA9IHt9O1xuICBmb3IgKGNvbnN0IHggb2YgeHMpIHtcbiAgICByZXRbZih4KV0gPSB4O1xuICB9XG4gIHJldHVybiByZXQ7XG59XG4iXX0=
14
+ /**
15
+ * Find the directory that contains a given dependency, identified by its 'package.json', from a starting search directory
16
+ *
17
+ * (This code is duplicated among jsii/jsii-pacmak/jsii-reflect. Changes should be done in all
18
+ * 3 locations, and we should unify these at some point: https://github.com/aws/jsii/issues/3236)
19
+ */
20
+ async function findDependencyDirectory(dependencyName, searchStart) {
21
+ // Explicitly do not use 'require("dep/package.json")' because that will fail if the
22
+ // package does not export that particular file.
23
+ const entryPoint = require.resolve(dependencyName, {
24
+ paths: [searchStart],
25
+ });
26
+ // Search up from the given directory, looking for a package.json that matches
27
+ // the dependency name (so we don't accidentally find stray 'package.jsons').
28
+ const depPkgJsonPath = await findPackageJsonUp(dependencyName, path.dirname(entryPoint));
29
+ if (!depPkgJsonPath) {
30
+ throw new Error(`Could not find dependency '${dependencyName}' from '${searchStart}'`);
31
+ }
32
+ return depPkgJsonPath;
33
+ }
34
+ exports.findDependencyDirectory = findDependencyDirectory;
35
+ /**
36
+ * Whether the given dependency is a built-in
37
+ *
38
+ * Some dependencies that occur in `package.json` are also built-ins in modern Node
39
+ * versions (most egregious example: 'punycode'). Detect those and filter them out.
40
+ */
41
+ function isBuiltinModule(depName) {
42
+ // eslint-disable-next-line @typescript-eslint/no-require-imports,@typescript-eslint/no-var-requires
43
+ const { builtinModules } = require('module');
44
+ return (builtinModules !== null && builtinModules !== void 0 ? builtinModules : []).includes(depName);
45
+ }
46
+ exports.isBuiltinModule = isBuiltinModule;
47
+ /**
48
+ * Find the package.json for a given package upwards from the given directory
49
+ *
50
+ * (This code is duplicated among jsii/jsii-pacmak/jsii-reflect. Changes should be done in all
51
+ * 3 locations, and we should unify these at some point: https://github.com/aws/jsii/issues/3236)
52
+ */
53
+ async function findPackageJsonUp(packageName, directory) {
54
+ return findUp(directory, async (dir) => {
55
+ const pjFile = path.join(dir, 'package.json');
56
+ return ((await fs.pathExists(pjFile)) &&
57
+ (await fs.readJson(pjFile)).name === packageName);
58
+ });
59
+ }
60
+ exports.findPackageJsonUp = findPackageJsonUp;
61
+ /**
62
+ * Find a directory up the tree from a starting directory matching a condition
63
+ *
64
+ * Will return `undefined` if no directory matches
65
+ *
66
+ * (This code is duplicated among jsii/jsii-pacmak/jsii-reflect. Changes should be done in all
67
+ * 3 locations, and we should unify these at some point: https://github.com/aws/jsii/issues/3236)
68
+ */
69
+ async function findUp(directory, pred) {
70
+ // eslint-disable-next-line no-constant-condition
71
+ while (true) {
72
+ // eslint-disable-next-line no-await-in-loop
73
+ if (await pred(directory)) {
74
+ return directory;
75
+ }
76
+ const parent = path.dirname(directory);
77
+ if (parent === directory) {
78
+ return undefined;
79
+ }
80
+ directory = parent;
81
+ }
82
+ }
83
+ exports.findUp = findUp;
84
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInV0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsK0JBQStCO0FBQy9CLDZCQUE2QjtBQUU3QixTQUFnQixPQUFPLENBQUksRUFBTyxFQUFFLENBQW1CO0lBQ3JELE1BQU0sR0FBRyxHQUF5QixFQUFFLENBQUM7SUFDckMsS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFFLEVBQUU7UUFDbEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztLQUNmO0lBQ0QsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBTkQsMEJBTUM7QUFFRDs7Ozs7R0FLRztBQUNJLEtBQUssVUFBVSx1QkFBdUIsQ0FDM0MsY0FBc0IsRUFDdEIsV0FBbUI7SUFFbkIsb0ZBQW9GO0lBQ3BGLGdEQUFnRDtJQUNoRCxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRTtRQUNqRCxLQUFLLEVBQUUsQ0FBQyxXQUFXLENBQUM7S0FDckIsQ0FBQyxDQUFDO0lBRUgsOEVBQThFO0lBQzlFLDZFQUE2RTtJQUM3RSxNQUFNLGNBQWMsR0FBRyxNQUFNLGlCQUFpQixDQUM1QyxjQUFjLEVBQ2QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FDekIsQ0FBQztJQUVGLElBQUksQ0FBQyxjQUFjLEVBQUU7UUFDbkIsTUFBTSxJQUFJLEtBQUssQ0FDYiw4QkFBOEIsY0FBYyxXQUFXLFdBQVcsR0FBRyxDQUN0RSxDQUFDO0tBQ0g7SUFFRCxPQUFPLGNBQWMsQ0FBQztBQUN4QixDQUFDO0FBeEJELDBEQXdCQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBZ0IsZUFBZSxDQUFDLE9BQWU7SUFDN0Msb0dBQW9HO0lBQ3BHLE1BQU0sRUFBRSxjQUFjLEVBQUUsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDN0MsT0FBTyxDQUFDLGNBQWMsYUFBZCxjQUFjLGNBQWQsY0FBYyxHQUFJLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUNsRCxDQUFDO0FBSkQsMENBSUM7QUFFRDs7Ozs7R0FLRztBQUNJLEtBQUssVUFBVSxpQkFBaUIsQ0FDckMsV0FBbUIsRUFDbkIsU0FBaUI7SUFFakIsT0FBTyxNQUFNLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRTtRQUNyQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxjQUFjLENBQUMsQ0FBQztRQUM5QyxPQUFPLENBQ0wsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDN0IsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssV0FBVyxDQUNqRCxDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBWEQsOENBV0M7QUFFRDs7Ozs7OztHQU9HO0FBQ0ksS0FBSyxVQUFVLE1BQU0sQ0FDMUIsU0FBaUIsRUFDakIsSUFBdUM7SUFFdkMsaURBQWlEO0lBQ2pELE9BQU8sSUFBSSxFQUFFO1FBQ1gsNENBQTRDO1FBQzVDLElBQUksTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUU7WUFDekIsT0FBTyxTQUFTLENBQUM7U0FDbEI7UUFFRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3ZDLElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRTtZQUN4QixPQUFPLFNBQVMsQ0FBQztTQUNsQjtRQUNELFNBQVMsR0FBRyxNQUFNLENBQUM7S0FDcEI7QUFDSCxDQUFDO0FBakJELHdCQWlCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBpbmRleEJ5PFQ+KHhzOiBUW10sIGY6ICh4OiBUKSA9PiBzdHJpbmcpOiB7IFtrZXk6IHN0cmluZ106IFQgfSB7XG4gIGNvbnN0IHJldDogeyBba2V5OiBzdHJpbmddOiBUIH0gPSB7fTtcbiAgZm9yIChjb25zdCB4IG9mIHhzKSB7XG4gICAgcmV0W2YoeCldID0geDtcbiAgfVxuICByZXR1cm4gcmV0O1xufVxuXG4vKipcbiAqIEZpbmQgdGhlIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIGEgZ2l2ZW4gZGVwZW5kZW5jeSwgaWRlbnRpZmllZCBieSBpdHMgJ3BhY2thZ2UuanNvbicsIGZyb20gYSBzdGFydGluZyBzZWFyY2ggZGlyZWN0b3J5XG4gKlxuICogKFRoaXMgY29kZSBpcyBkdXBsaWNhdGVkIGFtb25nIGpzaWkvanNpaS1wYWNtYWsvanNpaS1yZWZsZWN0LiBDaGFuZ2VzIHNob3VsZCBiZSBkb25lIGluIGFsbFxuICogMyBsb2NhdGlvbnMsIGFuZCB3ZSBzaG91bGQgdW5pZnkgdGhlc2UgYXQgc29tZSBwb2ludDogaHR0cHM6Ly9naXRodWIuY29tL2F3cy9qc2lpL2lzc3Vlcy8zMjM2KVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmluZERlcGVuZGVuY3lEaXJlY3RvcnkoXG4gIGRlcGVuZGVuY3lOYW1lOiBzdHJpbmcsXG4gIHNlYXJjaFN0YXJ0OiBzdHJpbmcsXG4pIHtcbiAgLy8gRXhwbGljaXRseSBkbyBub3QgdXNlICdyZXF1aXJlKFwiZGVwL3BhY2thZ2UuanNvblwiKScgYmVjYXVzZSB0aGF0IHdpbGwgZmFpbCBpZiB0aGVcbiAgLy8gcGFja2FnZSBkb2VzIG5vdCBleHBvcnQgdGhhdCBwYXJ0aWN1bGFyIGZpbGUuXG4gIGNvbnN0IGVudHJ5UG9pbnQgPSByZXF1aXJlLnJlc29sdmUoZGVwZW5kZW5jeU5hbWUsIHtcbiAgICBwYXRoczogW3NlYXJjaFN0YXJ0XSxcbiAgfSk7XG5cbiAgLy8gU2VhcmNoIHVwIGZyb20gdGhlIGdpdmVuIGRpcmVjdG9yeSwgbG9va2luZyBmb3IgYSBwYWNrYWdlLmpzb24gdGhhdCBtYXRjaGVzXG4gIC8vIHRoZSBkZXBlbmRlbmN5IG5hbWUgKHNvIHdlIGRvbid0IGFjY2lkZW50YWxseSBmaW5kIHN0cmF5ICdwYWNrYWdlLmpzb25zJykuXG4gIGNvbnN0IGRlcFBrZ0pzb25QYXRoID0gYXdhaXQgZmluZFBhY2thZ2VKc29uVXAoXG4gICAgZGVwZW5kZW5jeU5hbWUsXG4gICAgcGF0aC5kaXJuYW1lKGVudHJ5UG9pbnQpLFxuICApO1xuXG4gIGlmICghZGVwUGtnSnNvblBhdGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgQ291bGQgbm90IGZpbmQgZGVwZW5kZW5jeSAnJHtkZXBlbmRlbmN5TmFtZX0nIGZyb20gJyR7c2VhcmNoU3RhcnR9J2AsXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBkZXBQa2dKc29uUGF0aDtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHRoZSBnaXZlbiBkZXBlbmRlbmN5IGlzIGEgYnVpbHQtaW5cbiAqXG4gKiBTb21lIGRlcGVuZGVuY2llcyB0aGF0IG9jY3VyIGluIGBwYWNrYWdlLmpzb25gIGFyZSBhbHNvIGJ1aWx0LWlucyBpbiBtb2Rlcm4gTm9kZVxuICogdmVyc2lvbnMgKG1vc3QgZWdyZWdpb3VzIGV4YW1wbGU6ICdwdW55Y29kZScpLiBEZXRlY3QgdGhvc2UgYW5kIGZpbHRlciB0aGVtIG91dC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQnVpbHRpbk1vZHVsZShkZXBOYW1lOiBzdHJpbmcpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHMsQHR5cGVzY3JpcHQtZXNsaW50L25vLXZhci1yZXF1aXJlc1xuICBjb25zdCB7IGJ1aWx0aW5Nb2R1bGVzIH0gPSByZXF1aXJlKCdtb2R1bGUnKTtcbiAgcmV0dXJuIChidWlsdGluTW9kdWxlcyA/PyBbXSkuaW5jbHVkZXMoZGVwTmFtZSk7XG59XG5cbi8qKlxuICogRmluZCB0aGUgcGFja2FnZS5qc29uIGZvciBhIGdpdmVuIHBhY2thZ2UgdXB3YXJkcyBmcm9tIHRoZSBnaXZlbiBkaXJlY3RvcnlcbiAqXG4gKiAoVGhpcyBjb2RlIGlzIGR1cGxpY2F0ZWQgYW1vbmcganNpaS9qc2lpLXBhY21hay9qc2lpLXJlZmxlY3QuIENoYW5nZXMgc2hvdWxkIGJlIGRvbmUgaW4gYWxsXG4gKiAzIGxvY2F0aW9ucywgYW5kIHdlIHNob3VsZCB1bmlmeSB0aGVzZSBhdCBzb21lIHBvaW50OiBodHRwczovL2dpdGh1Yi5jb20vYXdzL2pzaWkvaXNzdWVzLzMyMzYpXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaW5kUGFja2FnZUpzb25VcChcbiAgcGFja2FnZU5hbWU6IHN0cmluZyxcbiAgZGlyZWN0b3J5OiBzdHJpbmcsXG4pIHtcbiAgcmV0dXJuIGZpbmRVcChkaXJlY3RvcnksIGFzeW5jIChkaXIpID0+IHtcbiAgICBjb25zdCBwakZpbGUgPSBwYXRoLmpvaW4oZGlyLCAncGFja2FnZS5qc29uJyk7XG4gICAgcmV0dXJuIChcbiAgICAgIChhd2FpdCBmcy5wYXRoRXhpc3RzKHBqRmlsZSkpICYmXG4gICAgICAoYXdhaXQgZnMucmVhZEpzb24ocGpGaWxlKSkubmFtZSA9PT0gcGFja2FnZU5hbWVcbiAgICApO1xuICB9KTtcbn1cblxuLyoqXG4gKiBGaW5kIGEgZGlyZWN0b3J5IHVwIHRoZSB0cmVlIGZyb20gYSBzdGFydGluZyBkaXJlY3RvcnkgbWF0Y2hpbmcgYSBjb25kaXRpb25cbiAqXG4gKiBXaWxsIHJldHVybiBgdW5kZWZpbmVkYCBpZiBubyBkaXJlY3RvcnkgbWF0Y2hlc1xuICpcbiAqIChUaGlzIGNvZGUgaXMgZHVwbGljYXRlZCBhbW9uZyBqc2lpL2pzaWktcGFjbWFrL2pzaWktcmVmbGVjdC4gQ2hhbmdlcyBzaG91bGQgYmUgZG9uZSBpbiBhbGxcbiAqIDMgbG9jYXRpb25zLCBhbmQgd2Ugc2hvdWxkIHVuaWZ5IHRoZXNlIGF0IHNvbWUgcG9pbnQ6IGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvanNpaS9pc3N1ZXMvMzIzNilcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpbmRVcChcbiAgZGlyZWN0b3J5OiBzdHJpbmcsXG4gIHByZWQ6IChkaXI6IHN0cmluZykgPT4gUHJvbWlzZTxib29sZWFuPixcbik6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zdGFudC1jb25kaXRpb25cbiAgd2hpbGUgKHRydWUpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYXdhaXQtaW4tbG9vcFxuICAgIGlmIChhd2FpdCBwcmVkKGRpcmVjdG9yeSkpIHtcbiAgICAgIHJldHVybiBkaXJlY3Rvcnk7XG4gICAgfVxuXG4gICAgY29uc3QgcGFyZW50ID0gcGF0aC5kaXJuYW1lKGRpcmVjdG9yeSk7XG4gICAgaWYgKHBhcmVudCA9PT0gZGlyZWN0b3J5KSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBkaXJlY3RvcnkgPSBwYXJlbnQ7XG4gIH1cbn1cbiJdfQ==
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "jsii-reflect",
3
- "version": "1.47.0",
3
+ "version": "1.48.0",
4
4
  "description": "strongly-typed reflection library and tools for jsii",
5
5
  "license": "Apache-2.0",
6
6
  "author": {
@@ -34,24 +34,24 @@
34
34
  "package": "package-js"
35
35
  },
36
36
  "dependencies": {
37
- "@jsii/check-node": "1.47.0",
38
- "@jsii/spec": "^1.47.0",
37
+ "@jsii/check-node": "1.48.0",
38
+ "@jsii/spec": "^1.48.0",
39
39
  "colors": "^1.4.0",
40
40
  "fs-extra": "^9.1.0",
41
- "oo-ascii-tree": "^1.47.0",
41
+ "oo-ascii-tree": "^1.48.0",
42
42
  "yargs": "^16.2.0"
43
43
  },
44
44
  "devDependencies": {
45
- "@scope/jsii-calc-lib": "^1.47.0",
45
+ "@scope/jsii-calc-lib": "^1.48.0",
46
46
  "@types/fs-extra": "^9.0.13",
47
47
  "@types/jest": "^27.0.3",
48
48
  "@types/node": "^12.20.37",
49
- "eslint": "^8.3.0",
50
- "jest": "^27.3.1",
51
- "jsii": "^1.47.0",
52
- "jsii-build-tools": "^1.47.0",
49
+ "eslint": "^8.4.1",
50
+ "jest": "^27.4.4",
51
+ "jsii": "^1.48.0",
52
+ "jsii-build-tools": "^1.48.0",
53
53
  "jsii-calc": "^3.20.120",
54
- "prettier": "^2.4.1",
54
+ "prettier": "^2.5.1",
55
55
  "typescript": "~3.9.10"
56
56
  }
57
57
  }
@@ -10,11 +10,15 @@ test('get full github source location for a class or method', async () => {
10
10
  // Nothing to do
11
11
  }
12
12
  }
13
- `.trim(), (obj) => (obj.repository.directory = 'some/sub/dir'));
13
+ `.trim(), (obj) => {
14
+ if (typeof obj.repository === 'object') {
15
+ obj.repository.directory = 'some/sub/dir';
16
+ }
17
+ });
14
18
  // THEN
15
19
  const klass = assembly.findType('testpkg.Foo');
16
20
  expect(klass.isClassType).toBeTruthy();
17
21
  expect(reflect.repositoryUrl(klass, 'main')).toBe('https://github.com/aws/jsii/blob/main/some/sub/dir/index.ts#L1');
18
22
  expect(reflect.repositoryUrl(klass)).toBe('https://github.com/aws/jsii/blob/master/some/sub/dir/index.ts#L1');
19
23
  });
20
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXBlbmRlbnQudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImluZGVwZW5kZW50LnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxrQ0FBa0M7QUFDbEMsaUNBQTRDO0FBRTVDLElBQUksQ0FBQyx1REFBdUQsRUFBRSxLQUFLLElBQUksRUFBRTtJQUN2RSxPQUFPO0lBQ1AsTUFBTSxRQUFRLEdBQUcsTUFBTSx5QkFBa0IsQ0FDdkM7Ozs7OztHQU1ELENBQUMsSUFBSSxFQUFFLEVBQ04sQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxTQUFTLEdBQUcsY0FBYyxDQUFDLENBQ3JELENBQUM7SUFFRixPQUFPO0lBQ1AsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUMvQyxNQUFNLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBRXZDLE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDL0MsZ0VBQWdFLENBQ2pFLENBQUM7SUFFRixNQUFNLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDdkMsa0VBQWtFLENBQ25FLENBQUM7QUFDSixDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHJlZmxlY3QgZnJvbSAnLi4vbGliJztcbmltcG9ydCB7IGFzc2VtYmx5RnJvbVNvdXJjZSB9IGZyb20gJy4vdXRpbCc7XG5cbnRlc3QoJ2dldCBmdWxsIGdpdGh1YiBzb3VyY2UgbG9jYXRpb24gZm9yIGEgY2xhc3Mgb3IgbWV0aG9kJywgYXN5bmMgKCkgPT4ge1xuICAvLyBXSEVOXG4gIGNvbnN0IGFzc2VtYmx5ID0gYXdhaXQgYXNzZW1ibHlGcm9tU291cmNlKFxuICAgIGBcbiAgICBleHBvcnQgY2xhc3MgRm9vIHtcbiAgICAgIHB1YmxpYyBiYXIoKSB7XG4gICAgICAgIC8vIE5vdGhpbmcgdG8gZG9cbiAgICAgIH1cbiAgICB9XG4gIGAudHJpbSgpLFxuICAgIChvYmopID0+IChvYmoucmVwb3NpdG9yeS5kaXJlY3RvcnkgPSAnc29tZS9zdWIvZGlyJyksXG4gICk7XG5cbiAgLy8gVEhFTlxuICBjb25zdCBrbGFzcyA9IGFzc2VtYmx5LmZpbmRUeXBlKCd0ZXN0cGtnLkZvbycpO1xuICBleHBlY3Qoa2xhc3MuaXNDbGFzc1R5cGUpLnRvQmVUcnV0aHkoKTtcblxuICBleHBlY3QocmVmbGVjdC5yZXBvc2l0b3J5VXJsKGtsYXNzLCAnbWFpbicpKS50b0JlKFxuICAgICdodHRwczovL2dpdGh1Yi5jb20vYXdzL2pzaWkvYmxvYi9tYWluL3NvbWUvc3ViL2Rpci9pbmRleC50cyNMMScsXG4gICk7XG5cbiAgZXhwZWN0KHJlZmxlY3QucmVwb3NpdG9yeVVybChrbGFzcykpLnRvQmUoXG4gICAgJ2h0dHBzOi8vZ2l0aHViLmNvbS9hd3MvanNpaS9ibG9iL21hc3Rlci9zb21lL3N1Yi9kaXIvaW5kZXgudHMjTDEnLFxuICApO1xufSk7XG4iXX0=
24
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXBlbmRlbnQudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImluZGVwZW5kZW50LnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxrQ0FBa0M7QUFDbEMsaUNBQTRDO0FBRTVDLElBQUksQ0FBQyx1REFBdUQsRUFBRSxLQUFLLElBQUksRUFBRTtJQUN2RSxPQUFPO0lBQ1AsTUFBTSxRQUFRLEdBQUcsTUFBTSx5QkFBa0IsQ0FDdkM7Ozs7OztHQU1ELENBQUMsSUFBSSxFQUFFLEVBQ04sQ0FBQyxHQUFHLEVBQUUsRUFBRTtRQUNOLElBQUksT0FBTyxHQUFHLENBQUMsVUFBVSxLQUFLLFFBQVEsRUFBRTtZQUN0QyxHQUFHLENBQUMsVUFBVSxDQUFDLFNBQVMsR0FBRyxjQUFjLENBQUM7U0FDM0M7SUFDSCxDQUFDLENBQ0YsQ0FBQztJQUVGLE9BQU87SUFDUCxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQy9DLE1BQU0sQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUM7SUFFdkMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUMvQyxnRUFBZ0UsQ0FDakUsQ0FBQztJQUVGLE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUN2QyxrRUFBa0UsQ0FDbkUsQ0FBQztBQUNKLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgcmVmbGVjdCBmcm9tICcuLi9saWInO1xuaW1wb3J0IHsgYXNzZW1ibHlGcm9tU291cmNlIH0gZnJvbSAnLi91dGlsJztcblxudGVzdCgnZ2V0IGZ1bGwgZ2l0aHViIHNvdXJjZSBsb2NhdGlvbiBmb3IgYSBjbGFzcyBvciBtZXRob2QnLCBhc3luYyAoKSA9PiB7XG4gIC8vIFdIRU5cbiAgY29uc3QgYXNzZW1ibHkgPSBhd2FpdCBhc3NlbWJseUZyb21Tb3VyY2UoXG4gICAgYFxuICAgIGV4cG9ydCBjbGFzcyBGb28ge1xuICAgICAgcHVibGljIGJhcigpIHtcbiAgICAgICAgLy8gTm90aGluZyB0byBkb1xuICAgICAgfVxuICAgIH1cbiAgYC50cmltKCksXG4gICAgKG9iaikgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBvYmoucmVwb3NpdG9yeSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgb2JqLnJlcG9zaXRvcnkuZGlyZWN0b3J5ID0gJ3NvbWUvc3ViL2Rpcic7XG4gICAgICB9XG4gICAgfSxcbiAgKTtcblxuICAvLyBUSEVOXG4gIGNvbnN0IGtsYXNzID0gYXNzZW1ibHkuZmluZFR5cGUoJ3Rlc3Rwa2cuRm9vJyk7XG4gIGV4cGVjdChrbGFzcy5pc0NsYXNzVHlwZSkudG9CZVRydXRoeSgpO1xuXG4gIGV4cGVjdChyZWZsZWN0LnJlcG9zaXRvcnlVcmwoa2xhc3MsICdtYWluJykpLnRvQmUoXG4gICAgJ2h0dHBzOi8vZ2l0aHViLmNvbS9hd3MvanNpaS9ibG9iL21haW4vc29tZS9zdWIvZGlyL2luZGV4LnRzI0wxJyxcbiAgKTtcblxuICBleHBlY3QocmVmbGVjdC5yZXBvc2l0b3J5VXJsKGtsYXNzKSkudG9CZShcbiAgICAnaHR0cHM6Ly9naXRodWIuY29tL2F3cy9qc2lpL2Jsb2IvbWFzdGVyL3NvbWUvc3ViL2Rpci9pbmRleC50cyNMMScsXG4gICk7XG59KTtcbiJdfQ==