@aws-cdk-testing/cli-integ 2.173.4 → 3.0.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.
Files changed (81) hide show
  1. package/.eslintrc.js +9 -0
  2. package/LICENSE +2 -1
  3. package/bin/query-github.js +3 -3
  4. package/bin/query-github.ts +56 -0
  5. package/bin/run-suite.js +3 -3
  6. package/bin/run-suite.ts +140 -0
  7. package/bin/stage-distribution.js +3 -2
  8. package/bin/stage-distribution.ts +267 -0
  9. package/bin/test-root.ts +3 -0
  10. package/lib/aws.js +9 -6
  11. package/lib/aws.ts +263 -0
  12. package/lib/corking.ts +33 -0
  13. package/lib/eventually.js +3 -3
  14. package/lib/eventually.ts +42 -0
  15. package/lib/files.js +3 -2
  16. package/lib/files.ts +80 -0
  17. package/lib/github.js +6 -5
  18. package/lib/github.ts +43 -0
  19. package/lib/index.ts +13 -0
  20. package/lib/integ-test.ts +81 -0
  21. package/lib/lists.ts +9 -0
  22. package/lib/memoize.ts +14 -0
  23. package/lib/npm.ts +41 -0
  24. package/lib/package-sources/release-source.js +3 -2
  25. package/lib/package-sources/release-source.ts +81 -0
  26. package/lib/package-sources/repo-source.ts +111 -0
  27. package/lib/package-sources/repo-tools/npm.js +5 -4
  28. package/lib/package-sources/repo-tools/npm.ts +48 -0
  29. package/lib/package-sources/source.ts +35 -0
  30. package/lib/package-sources/subprocess.ts +15 -0
  31. package/lib/resource-pool.js +2 -2
  32. package/lib/resource-pool.ts +140 -0
  33. package/lib/resources.ts +4 -0
  34. package/lib/shell.js +8 -5
  35. package/lib/shell.ts +168 -0
  36. package/lib/staging/codeartifact.js +11 -8
  37. package/lib/staging/codeartifact.ts +387 -0
  38. package/lib/staging/maven.js +5 -3
  39. package/lib/staging/maven.ts +95 -0
  40. package/lib/staging/npm.ts +62 -0
  41. package/lib/staging/nuget.ts +75 -0
  42. package/lib/staging/parallel-shell.js +2 -2
  43. package/lib/staging/parallel-shell.ts +51 -0
  44. package/lib/staging/pypi.ts +50 -0
  45. package/lib/staging/usage-dir.ts +99 -0
  46. package/lib/with-aws.js +3 -2
  47. package/lib/with-aws.ts +67 -0
  48. package/lib/with-cdk-app.js +23 -14
  49. package/lib/with-cdk-app.ts +742 -0
  50. package/lib/with-cli-lib.ts +134 -0
  51. package/lib/with-packages.ts +15 -0
  52. package/lib/with-sam.js +7 -4
  53. package/lib/with-sam.ts +288 -0
  54. package/lib/with-temporary-directory.ts +35 -0
  55. package/lib/with-timeout.ts +33 -0
  56. package/lib/xpmutex.js +2 -2
  57. package/lib/xpmutex.ts +218 -0
  58. package/package.json +84 -62
  59. package/resources/cloud-assemblies/0.36.0/cdk.out +1 -0
  60. package/resources/cloud-assemblies/1.10.0-lookup-default-vpc/cdk.out +1 -0
  61. package/resources/cloud-assemblies/1.10.0-request-azs/cdk.out +1 -0
  62. package/tests/cli-integ-tests/bootstrapping.integtest.js +22 -13
  63. package/tests/cli-integ-tests/bootstrapping.integtest.ts +493 -0
  64. package/tests/cli-integ-tests/cli-lib.integtest.js +3 -2
  65. package/tests/cli-integ-tests/cli-lib.integtest.ts +90 -0
  66. package/tests/cli-integ-tests/cli.integtest.js +76 -49
  67. package/tests/cli-integ-tests/cli.integtest.ts +2874 -0
  68. package/tests/cli-integ-tests/garbage-collection.integtest.js +2 -2
  69. package/tests/cli-integ-tests/garbage-collection.integtest.ts +392 -0
  70. package/tests/init-csharp/init-csharp.integtest.ts +15 -0
  71. package/tests/init-fsharp/init-fsharp.integtest.ts +15 -0
  72. package/tests/init-go/init-go.integtest.ts +23 -0
  73. package/tests/init-java/init-java.integtest.ts +14 -0
  74. package/tests/init-javascript/init-javascript.integtest.ts +59 -0
  75. package/tests/init-python/init-python.integtest.ts +20 -0
  76. package/tests/init-typescript-app/init-typescript-app.integtest.ts +66 -0
  77. package/tests/init-typescript-lib/init-typescript-lib.integtest.ts +13 -0
  78. package/tests/tool-integrations/amplify.integtest.ts +43 -0
  79. package/tests/tool-integrations/with-tool-context.ts +14 -0
  80. package/tests/uberpackage/uberpackage.integtest.ts +11 -0
  81. package/resources/cdk-apps/cfn-include-app/.gitignore +0 -1
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Run a block with a timeout
3
+ *
4
+ * We can't use the jest timeout feature:
5
+ *
6
+ * - `jest.concurrent()` does not do any concurrency management. It starts all
7
+ * tests at the same time.
8
+ * - Our tests use locking to make sure only one test is running at a time per
9
+ * region.
10
+ *
11
+ * The wait time for the locks is included in the jest test timeout. We therefore
12
+ * need to set it unreasonably high (as long as the last test may need to wait
13
+ * if all tests are executed using only 1 region, and they effectively execute
14
+ * sequentially), which makes it not useful to detect stuck tests.
15
+ *
16
+ * The `withTimeout()` modifier makes it possible to measure only a specific
17
+ * block of code. In our case: the effective test code, excluding the wait time.
18
+ */
19
+ export function withTimeout<A>(seconds: number, block: (x: A) => Promise<void>) {
20
+ return (x: A) => {
21
+ const timeOut = new Promise<void>((_ok, ko) => {
22
+ const timerHandle = setTimeout(
23
+ () => ko(new Error(`Timeout: test took more than ${seconds}s to complete`)),
24
+ seconds * 1000);
25
+ timerHandle.unref();
26
+ });
27
+
28
+ return Promise.race([
29
+ block(x),
30
+ timeOut,
31
+ ]);
32
+ };
33
+ }
package/lib/xpmutex.js CHANGED
@@ -171,7 +171,7 @@ class XpMutex {
171
171
  return {
172
172
  release: async () => {
173
173
  await fs_1.promises.unlink(this.fileName);
174
- await additionalLock?.release();
174
+ await (additionalLock === null || additionalLock === void 0 ? void 0 : additionalLock.release());
175
175
  },
176
176
  };
177
177
  }
@@ -204,4 +204,4 @@ function sleep(ms) {
204
204
  function randomSleep(ms) {
205
205
  return sleep(Math.floor(Math.random() * ms));
206
206
  }
207
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieHBtdXRleC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInhwbXV0ZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMkJBQXNEO0FBQ3RELHlCQUF5QjtBQUN6Qiw2QkFBNkI7QUFFN0IsTUFBYSxXQUFXO0lBQ2YsTUFBTSxDQUFDLGFBQWEsQ0FBQyxTQUFpQjtRQUMzQyxJQUFBLGNBQVMsRUFBQyxTQUFTLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUMxQyxPQUFPLElBQUksV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFTSxNQUFNLENBQUMsUUFBUSxDQUFDLElBQVk7UUFDakMsT0FBTyxXQUFXLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUtELFlBQW9DLFNBQWlCO1FBQWpCLGNBQVMsR0FBVCxTQUFTLENBQVE7UUFIcEMscUJBQWdCLEdBQUcsSUFBSSxHQUFHLEVBQWMsQ0FBQztRQUl4RCxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDcEIsQ0FBQztJQUVNLEtBQUssQ0FBQyxJQUFZO1FBQ3ZCLE9BQU8sSUFBSSxPQUFPLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLFdBQVcsQ0FBQyxTQUFrQjtRQUNuQyxNQUFNLElBQUksR0FBRyxJQUFJLE9BQU8sQ0FBTyxFQUFFLENBQUMsRUFBRTtZQUNsQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEtBQUssSUFBSSxFQUFFO2dCQUNuQyxNQUFNLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDdEIsRUFBRSxFQUFFLENBQUM7WUFDUCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxTQUFTLEVB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IHByb21pc2VzIGFzIGZzLCBta2RpclN5bmMgfSBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBvcyBmcm9tICdvcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuXG5leHBvcnQgY2xhc3MgWHBNdXRleFBvb2wge1xuICBwdWJsaWMgc3RhdGljIGZyb21EaXJlY3RvcnkoZGlyZWN0b3J5OiBzdHJpbmcpIHtcbiAgICBta2RpclN5bmMoZGlyZWN0b3J5LCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICByZXR1cm4gbmV3IFhwTXV0ZXhQb29sKGRpcmVjdG9yeSk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGZyb21OYW1lKG5hbWU6IHN0cmluZykge1xuICAgIHJldHVybiBYcE11dGV4UG9vbC5mcm9tRGlyZWN0b3J5KHBhdGguam9pbihvcy50bXBkaXIoKSwgbmFtZSkpO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSB3YWl0aW5nUmVzb2x2ZXJzID0gbmV3IFNldDwoKSA9PiB2b2lkPigpO1xuICBwcml2YXRlIHdhdGNoZXI6IFJldHVyblR5cGU8dHlwZW9mIHdhdGNoPiB8IHVuZGVmaW5lZDtcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSBkaXJlY3Rvcnk6IHN0cmluZykge1xuICAgIHRoaXMuc3RhcnRXYXRjaCgpO1xuICB9XG5cbiAgcHVibGljIG11dGV4KG5hbWU6IHN0cmluZykge1xuICAgIHJldHVybiBuZXcgWHBNdXRleCh0aGlzLCBuYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBd2FpdCBhbiB1bmxvY2sgZXZlbnRcbiAgICpcbiAgICogKEFuIHVubG9jayBldmVudCBpcyB3aGVuIGEgZmlsZSBpbiB0aGUgZGlyZWN0b3J5IGdldHMgZGVsZXRlZCwgd2l0aCBhIHRpbnlcbiAgICogcmFuZG9tIHNsZWVwIGF0dGFjaGVkIHRvIGl0KS5cbiAgICovXG4gIHB1YmxpYyBhd2FpdFVubG9jayhtYXhXYWl0TXM/OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB3YWl0ID0gbmV3IFByb21pc2U8dm9pZD4ob2sgPT4ge1xuICAgICAgdGhpcy53YWl0aW5nUmVzb2x2ZXJzLmFkZChhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IHJhbmRvbVNsZWVwKDEwKTtcbiAgICAgICAgb2soKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaWYgKG1heFdhaXRNcykge1xuICAgICAgcmV0dXJuIFByb21pc2UucmFjZShbd2FpdCwgc2xlZXAobWF4V2FpdE1zKV0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gd2FpdDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN0YXJ0V2F0Y2goKSB7XG4gICAgdGhpcy53YXRjaGVyID0gd2F0Y2godGhpcy5kaXJlY3RvcnkpO1xuICAgICh0aGlzLndhdGNoZXIgYXMgYW55KS51bnJlZigpOyAvLyBAdHlwZXMgZG9lc24ndCBrbm93IGFib3V0IHRoaXMgYnV0IGl0IGV4aXN0c1xuICAgIHRoaXMud2F0Y2hlci5vbignY2hhbmdlJywgYXN5bmMgKGV2ZW50VHlwZSwgZm5hbWUpID0+IHtcbiAgICAgIC8vIE9ubHkgdHJpZ2dlciBvbiAnZGVsZXRlcycuXG4gICAgICAvLyBBZnRlciByZWNlaXZpbmcgdGhlIGV2ZW50LCB3ZSBjaGVjayBpZiB0aGUgZmlsZSBleGlzdHMuXG4gICAgICAvLyAtIElmIG5vOiB0aGUgZmlsZSB3YXMgZGVsZXRlZCEgSHV6emFoLCB0aGlzIGNvdW50cyBhcyBhIHdha2V1cC5cbiAgICAgIC8vIC0gSWYgeWVzOiBlaXRoZXIgdGhlIGZpbGUgd2FzIGp1c3QgY3JlYXRlZCAoaW4gd2hpY2ggY2FzZSB3ZSBkb24ndCBuZWVkIHRvIHdha2V1cClcbiAgICAgIC8vICAgb3IgdGhlIGV2ZW50IHdhcyBkdWUgdG8gYSBkZWxldGUgYnV0IHNvbWVvbmUgcmFjZWQgdXMgdG8gaXQgYW5kIGNsYWltZWQgdGhlXG4gICAgICAvLyAgIGZpbGUgYWxyZWFkeSAoaW4gd2hpY2ggY2FzZSB3ZSBhbHNvIGRvbid0IG5lZWQgdG8gd2FrZSB1cCkuXG4gICAgICBpZiAoZXZlbnRUeXBlID09PSAncmVuYW1lJyAmJiAhYXdhaXQgZmlsZUV4aXN0cyhwYXRoLmpvaW4odGhpcy5kaXJlY3RvcnksIGZuYW1lLnRvU3RyaW5nKCkpKSkge1xuICAgICAgICB0aGlzLm5vdGlmeVdhaXRlcnMoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLndhdGNoZXIub24oJ2Vycm9yJywgYXN5bmMgKGUpID0+IHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgYXdhaXQgcmFuZG9tU2xlZXAoMTAwKTtcbiAgICAgIHRoaXMuc3RhcnRXYXRjaCgpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBub3RpZnlXYWl0ZXJzKCkge1xuICAgIGZvciAoY29uc3QgcHJvbWlzZSBvZiB0aGlzLndhaXRpbmdSZXNvbHZlcnMpIHtcbiAgICAgIHByb21pc2UoKTtcbiAgICB9XG4gICAgdGhpcy53YWl0aW5nUmVzb2x2ZXJzLmNsZWFyKCk7XG4gIH1cbn1cblxuLyoqXG4gKiBDcm9zcy1wcm9jZXNzIG11dGV4XG4gKlxuICogVXNlcyB0aGUgcHJlc2VuY2Ugb2YgYSBmaWxlIG9uIGRpc2sgYW5kIGBmcy53YXRjaGAgdG8gcmVwcmVzZW50IHRoZSBtdXRleFxuICogYW5kIGRpc2NvdmVyIHVubG9ja3MuXG4gKi9cbmV4cG9ydCBjbGFzcyBYcE11dGV4IHtcbiAgcHJpdmF0ZSByZWFkb25seSBmaWxlTmFtZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgcG9vbDogWHBNdXRleFBvb2wsIHB1YmxpYyByZWFkb25seSBtdXRleE5hbWU6IHN0cmluZykge1xuICAgIHRoaXMuZmlsZU5hbWUgPSBwYXRoLmpvaW4ocG9vbC5kaXJlY3RvcnksIGAke211dGV4TmFtZX0ubXV0ZXhgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcnkgdG8gYWNxdWlyZSB0aGUgbG9jayAobWF5IGZhaWwpXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgdHJ5QWNxdWlyZSgpOiBQcm9taXNlPElMb2NrIHwgdW5kZWZpbmVkPiB7XG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIC8vIEFjcXVpcmUgbG9jayBieSBiZWluZyB0aGUgb25lIHRvIGNyZWF0ZSB0aGUgZmlsZVxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMud3JpdGVQaWRGaWxlKCd3eCcpOyAvLyBGYWlscyBpZiB0aGUgZmlsZSBhbHJlYWR5IGV4aXN0c1xuICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgIGlmIChlLmNvZGUgIT09ICdFRVhJU1QnKSB7IHRocm93IGU7IH1cbiAgICAgIH1cblxuICAgICAgLy8gRmlsZSBhbHJlYWR5IGV4aXN0cy4gUmVhZCB0aGUgY29udGVudHMsIHNlZSBpZiBpdCdzIGFuIGV4aXN0ZW50IFBJRCAoaWYgc28sIHRoZSBsb2NrIGlzIHRha2VuKVxuICAgICAgY29uc3Qgb3duZXJQaWQgPSBhd2FpdCB0aGlzLnJlYWRQaWRGaWxlKCk7XG4gICAgICBpZiAob3duZXJQaWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBGaWxlIGdvdCBkZWxldGVkIGp1c3Qgbm93LCBtYXliZSB3ZSBjYW4gYWNxdWlyZSBpdCBhZ2FpblxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChwcm9jZXNzRXhpc3RzKG93bmVyUGlkKSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiBub3QsIHRoZSBsb2NrIGlzIHN0YWxlIGFuZCB3aWxsIG5ldmVyIGJlIHJlbGVhc2VkIGFueW1vcmUuIFdlIG1heVxuICAgICAgLy8gZGVsZXRlIGl0IGFuZCBhY3F1aXJlIGl0IGFueXdheSwgYnV0IHdlIG1heSBiZSByYWNpbmcgc29tZW9uZSBlbHNlIHRyeWluZ1xuICAgICAgLy8gdG8gZG8gdGhlIHNhbWUuIFNvbHZlIHRoaXMgYXMgZm9sbG93czpcbiAgICAgIC8vIC0gVHJ5IHRvIGFjcXVpcmUgYSBsb2NrIHRoYXQgZ2l2ZXMgdXMgcGVybWlzc2lvbnMgdG8gZGVjbGFyZSB0aGUgZXhpc3RpbmcgbG9jayBzdGFsZS5cbiAgICAgIC8vIC0gU2xlZXAgYSBzbWFsbCByYW5kb20gcGVyaW9kIHRvIHJlZHVjZSBjb250ZW50aW9uIG9uIHRoaXMgb3BlcmF0aW9uXG4gICAgICBhd2FpdCByYW5kb21TbGVlcCgxMCk7XG4gICAgICBjb25zdCBpbm5lck11eCA9IG5ldyBYcE11dGV4KHRoaXMucG9vbCwgYCR7dGhpcy5tdXRleE5hbWV9LiR7b3duZXJQaWR9YCk7XG4gICAgICBjb25zdCBpbm5lckxvY2sgPSBhd2FpdCBpbm5lck11eC50cnlBY3F1aXJlKCk7XG4gICAgICBpZiAoIWlubmVyTG9jaykge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICAvLyBXZSBtYXkgbm90IHJlbGVhc2UgdGhlICdpbm5lciBsb2NrJyB3ZSB1c2VkIHRvIGFjcXVpcmUgdGhlIHJpZ2h0cyB0byBkZWNsYXJlIHRoZSBvdGhlclxuICAgICAgLy8gbG9jayBzdGFsZSB1bnRpbCB3ZSByZWxlYXNlIHRoZSBhY3R1YWwgbG9jayBpdHNlbGYuIElmIHdlIGRpZCwgb3RoZXIgY29udGVuZGVycyBtaWdodFxuICAgICAgLy8gc2VlIGl0IHJlbGVhc2VkIHdoaWxlIHRoZXkncmUgc3RpbGwgaW4gdGhpcyBmYWxsYmFjayBibG9jayBhbmQgYWNjaWRlbnRhbGx5IHN0ZWFsXG4gICAgICAvLyBmcm9tIGEgbmV3IGxlZ2l0aW1hdGUgb3duZXIuXG4gICAgICByZXR1cm4gdGhpcy53cml0ZVBpZEZpbGUoJ3cnLCBpbm5lckxvY2spOyAvLyBGb3JjZSB3cml0ZSBsb2NrIGZpbGUsIGF0dGFjaCBpbm5lciBsb2NrIGFzIHdlbGxcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWNxdWlyZSB0aGUgbG9jaywgd2FpdGluZyB1bnRpbCB3ZSBjYW5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBhY3F1aXJlKCk6IFByb21pc2U8SUxvY2s+IHtcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgLy8gU3RhcnQgdGhlIHdhaXQgaGVyZSwgc28gd2UgZG9uJ3QgbWlzcyB0aGUgc2lnbmFsIGlmIGl0IGNvbWVzIGFmdGVyXG4gICAgICAvLyB3ZSB0cnkgYnV0IGJlZm9yZSB3ZSBzbGVlcC5cbiAgICAgIC8vXG4gICAgICAvLyBXZSBhbHNvIHBlcmlvZGljYWxseSByZXRyeSBhbnl3YXkgc2luY2Ugd2UgbWF5IGhhdmUgbWlzc2VkIHRoZSBkZWxldGVcbiAgICAgIC8vIHNpZ25hbCBkdWUgdG8gdW5mb3J0dW5hdGUgdGltaW5nLlxuICAgICAgY29uc3Qgd2FpdCA9IHRoaXMucG9vbC5hd2FpdFVubG9jayg1MDAwKTtcblxuICAgICAgY29uc3QgbG9jayA9IGF3YWl0IHRoaXMudHJ5QWNxdWlyZSgpO1xuICAgICAgaWYgKGxvY2spIHtcbiAgICAgICAgLy8gSWdub3JlIHRoZSB3YWl0IChjb3VudCBhcyBoYW5kbGVkKVxuICAgICAgICB3YWl0LnRoZW4oKCkgPT4ge30sICgpID0+IHt9KTtcbiAgICAgICAgcmV0dXJuIGxvY2s7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHdhaXQ7XG4gICAgICBhd2FpdCByYW5kb21TbGVlcCgxMDApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVhZFBpZEZpbGUoKTogUHJvbWlzZTxudW1iZXIgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCBkZWFkTGluZSA9IERhdGUubm93KCkgKyAxMDAwO1xuICAgIHdoaWxlIChEYXRlLm5vdygpIDwgZGVhZExpbmUpIHtcbiAgICAgIGxldCBjb250ZW50cztcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnRlbnRzID0gYXdhaXQgZnMucmVhZEZpbGUodGhpcy5maWxlTmFtZSwgeyBlbmNvZGluZzogJ3V0Zi04JyB9KTtcbiAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICBpZiAoZS5jb2RlID09PSAnRU5PRU5UJykgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG5cbiAgICAgIC8vIFJldHJ5IHVudGlsIHdlJ3ZlIHNlZW4gdGhlIGZ1bGwgY29udGVudHNcbiAgICAgIGlmIChjb250ZW50cy5lbmRzV2l0aCgnLicpKSB7IHJldHVybiBwYXJzZUludChjb250ZW50cy5zdWJzdHJpbmcoMCwgY29udGVudHMubGVuZ3RoIC0gMSksIDEwKTsgfVxuICAgICAgYXdhaXQgc2xlZXAoMTApO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLmZpbGVOYW1lfSB3YXMgbmV2ZXIgY29tcGxldGVseSB3cml0dGVuYCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHdyaXRlUGlkRmlsZShtb2RlOiBzdHJpbmcsIGFkZGl0aW9uYWxMb2NrPzogSUxvY2spOiBQcm9taXNlPElMb2NrPiB7XG4gICAgY29uc3QgZmQgPSBhd2FpdCBmcy5vcGVuKHRoaXMuZmlsZU5hbWUsIG1vZGUpOyAvLyBNYXkgZmFpbCBpZiB0aGUgZmlsZSBhbHJlYWR5IGV4aXN0c1xuICAgIGF3YWl0IGZkLndyaXRlKGAke3Byb2Nlc3MucGlkfS5gKTsgLy8gUGVyaW9kIGd1YXJkcyBhZ2FpbnN0IHBhcnRpYWwgcmVhZHNcbiAgICBhd2FpdCBmZC5jbG9zZSgpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHJlbGVhc2U6IGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgZnMudW5saW5rKHRoaXMuZmlsZU5hbWUpO1xuICAgICAgICBhd2FpdCBhZGRpdGlvbmFsTG9jaz8ucmVsZWFzZSgpO1xuICAgICAgfSxcbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUxvY2sge1xuICByZWxlYXNlKCk6IFByb21pc2U8dm9pZD47XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZpbGVFeGlzdHMoZmlsZU5hbWU6IHN0cmluZykge1xuICB0cnkge1xuICAgIGF3YWl0IGZzLnN0YXQoZmlsZU5hbWUpO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICBpZiAoZS5jb2RlID09PSAnRU5PRU5UJykgeyByZXR1cm4gZmFsc2U7IH1cbiAgICB0aHJvdyBlO1xuICB9XG59XG5cbmZ1bmN0aW9uIHByb2Nlc3NFeGlzdHMocGlkOiBudW1iZXIpIHtcbiAgdHJ5IHtcbiAgICBwcm9jZXNzLmtpbGwocGlkLCAwKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNsZWVwKG1zOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKG9rID0+IChzZXRUaW1lb3V0KG9rLCBtcykgYXMgYW55KS51bnJlZigpKTtcbn1cblxuZnVuY3Rpb24gcmFuZG9tU2xlZXAobXM6IG51bWJlcikge1xuICByZXR1cm4gc2xlZXAoTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogbXMpKTtcbn1cbiJdfQ==
207
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieHBtdXRleC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInhwbXV0ZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMkJBQXNEO0FBQ3RELHlCQUF5QjtBQUN6Qiw2QkFBNkI7QUFFN0IsTUFBYSxXQUFXO0lBQ2YsTUFBTSxDQUFDLGFBQWEsQ0FBQyxTQUFpQjtRQUMzQyxJQUFBLGNBQVMsRUFBQyxTQUFTLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUMxQyxPQUFPLElBQUksV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFTSxNQUFNLENBQUMsUUFBUSxDQUFDLElBQVk7UUFDakMsT0FBTyxXQUFXLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUtELFlBQW9DLFNBQWlCO1FBQWpCLGNBQVMsR0FBVCxTQUFTLENBQVE7UUFIcEMscUJBQWdCLEdBQUcsSUFBSSxHQUFHLEVBQWMsQ0FBQztRQUl4RCxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDcEIsQ0FBQztJQUVNLEtBQUssQ0FBQyxJQUFZO1FBQ3ZCLE9BQU8sSUFBSSxPQUFPLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLFdBQVcsQ0FBQyxTQUFrQjtRQUNuQyxNQUFNLElBQUksR0FBRyxJQUFJLE9BQU8sQ0FBTyxFQUFFLENBQUMsRUFBRTtZQUNsQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEtBQUssSUFBSSxFQUFFO2dCQUNuQyxNQUFNLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDdEIsRUFBRSxFQUFFLENBQUM7WUFDUCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxTQUFTLEVB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dXJjZXNDb250ZW50IjpbImltcG9ydCB7IHdhdGNoLCBwcm9taXNlcyBhcyBmcywgbWtkaXJTeW5jIH0gZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgb3MgZnJvbSAnb3MnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcblxuZXhwb3J0IGNsYXNzIFhwTXV0ZXhQb29sIHtcbiAgcHVibGljIHN0YXRpYyBmcm9tRGlyZWN0b3J5KGRpcmVjdG9yeTogc3RyaW5nKSB7XG4gICAgbWtkaXJTeW5jKGRpcmVjdG9yeSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgcmV0dXJuIG5ldyBYcE11dGV4UG9vbChkaXJlY3RvcnkpO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBmcm9tTmFtZShuYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gWHBNdXRleFBvb2wuZnJvbURpcmVjdG9yeShwYXRoLmpvaW4ob3MudG1wZGlyKCksIG5hbWUpKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgd2FpdGluZ1Jlc29sdmVycyA9IG5ldyBTZXQ8KCkgPT4gdm9pZD4oKTtcbiAgcHJpdmF0ZSB3YXRjaGVyOiBSZXR1cm5UeXBlPHR5cGVvZiB3YXRjaD4gfCB1bmRlZmluZWQ7XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgZGlyZWN0b3J5OiBzdHJpbmcpIHtcbiAgICB0aGlzLnN0YXJ0V2F0Y2goKTtcbiAgfVxuXG4gIHB1YmxpYyBtdXRleChuYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gbmV3IFhwTXV0ZXgodGhpcywgbmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogQXdhaXQgYW4gdW5sb2NrIGV2ZW50XG4gICAqXG4gICAqIChBbiB1bmxvY2sgZXZlbnQgaXMgd2hlbiBhIGZpbGUgaW4gdGhlIGRpcmVjdG9yeSBnZXRzIGRlbGV0ZWQsIHdpdGggYSB0aW55XG4gICAqIHJhbmRvbSBzbGVlcCBhdHRhY2hlZCB0byBpdCkuXG4gICAqL1xuICBwdWJsaWMgYXdhaXRVbmxvY2sobWF4V2FpdE1zPzogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgd2FpdCA9IG5ldyBQcm9taXNlPHZvaWQ+KG9rID0+IHtcbiAgICAgIHRoaXMud2FpdGluZ1Jlc29sdmVycy5hZGQoYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCByYW5kb21TbGVlcCgxMCk7XG4gICAgICAgIG9rKCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGlmIChtYXhXYWl0TXMpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJhY2UoW3dhaXQsIHNsZWVwKG1heFdhaXRNcyldKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHdhaXQ7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdGFydFdhdGNoKCkge1xuICAgIHRoaXMud2F0Y2hlciA9IHdhdGNoKHRoaXMuZGlyZWN0b3J5KTtcbiAgICAodGhpcy53YXRjaGVyIGFzIGFueSkudW5yZWYoKTsgLy8gQHR5cGVzIGRvZXNuJ3Qga25vdyBhYm91dCB0aGlzIGJ1dCBpdCBleGlzdHNcbiAgICB0aGlzLndhdGNoZXIub24oJ2NoYW5nZScsIGFzeW5jIChldmVudFR5cGUsIGZuYW1lKSA9PiB7XG4gICAgICAvLyBPbmx5IHRyaWdnZXIgb24gJ2RlbGV0ZXMnLlxuICAgICAgLy8gQWZ0ZXIgcmVjZWl2aW5nIHRoZSBldmVudCwgd2UgY2hlY2sgaWYgdGhlIGZpbGUgZXhpc3RzLlxuICAgICAgLy8gLSBJZiBubzogdGhlIGZpbGUgd2FzIGRlbGV0ZWQhIEh1enphaCwgdGhpcyBjb3VudHMgYXMgYSB3YWtldXAuXG4gICAgICAvLyAtIElmIHllczogZWl0aGVyIHRoZSBmaWxlIHdhcyBqdXN0IGNyZWF0ZWQgKGluIHdoaWNoIGNhc2Ugd2UgZG9uJ3QgbmVlZCB0byB3YWtldXApXG4gICAgICAvLyAgIG9yIHRoZSBldmVudCB3YXMgZHVlIHRvIGEgZGVsZXRlIGJ1dCBzb21lb25lIHJhY2VkIHVzIHRvIGl0IGFuZCBjbGFpbWVkIHRoZVxuICAgICAgLy8gICBmaWxlIGFscmVhZHkgKGluIHdoaWNoIGNhc2Ugd2UgYWxzbyBkb24ndCBuZWVkIHRvIHdha2UgdXApLlxuICAgICAgaWYgKGV2ZW50VHlwZSA9PT0gJ3JlbmFtZScgJiYgIWF3YWl0IGZpbGVFeGlzdHMocGF0aC5qb2luKHRoaXMuZGlyZWN0b3J5LCBmbmFtZS50b1N0cmluZygpKSkpIHtcbiAgICAgICAgdGhpcy5ub3RpZnlXYWl0ZXJzKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy53YXRjaGVyLm9uKCdlcnJvcicsIGFzeW5jIChlKSA9PiB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgIGF3YWl0IHJhbmRvbVNsZWVwKDEwMCk7XG4gICAgICB0aGlzLnN0YXJ0V2F0Y2goKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgbm90aWZ5V2FpdGVycygpIHtcbiAgICBmb3IgKGNvbnN0IHByb21pc2Ugb2YgdGhpcy53YWl0aW5nUmVzb2x2ZXJzKSB7XG4gICAgICBwcm9taXNlKCk7XG4gICAgfVxuICAgIHRoaXMud2FpdGluZ1Jlc29sdmVycy5jbGVhcigpO1xuICB9XG59XG5cbi8qKlxuICogQ3Jvc3MtcHJvY2VzcyBtdXRleFxuICpcbiAqIFVzZXMgdGhlIHByZXNlbmNlIG9mIGEgZmlsZSBvbiBkaXNrIGFuZCBgZnMud2F0Y2hgIHRvIHJlcHJlc2VudCB0aGUgbXV0ZXhcbiAqIGFuZCBkaXNjb3ZlciB1bmxvY2tzLlxuICovXG5leHBvcnQgY2xhc3MgWHBNdXRleCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgZmlsZU5hbWU6IHN0cmluZztcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHBvb2w6IFhwTXV0ZXhQb29sLCBwdWJsaWMgcmVhZG9ubHkgbXV0ZXhOYW1lOiBzdHJpbmcpIHtcbiAgICB0aGlzLmZpbGVOYW1lID0gcGF0aC5qb2luKHBvb2wuZGlyZWN0b3J5LCBgJHttdXRleE5hbWV9Lm11dGV4YCk7XG4gIH1cblxuICAvKipcbiAgICogVHJ5IHRvIGFjcXVpcmUgdGhlIGxvY2sgKG1heSBmYWlsKVxuICAgKi9cbiAgcHVibGljIGFzeW5jIHRyeUFjcXVpcmUoKTogUHJvbWlzZTxJTG9jayB8IHVuZGVmaW5lZD4ge1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAvLyBBY3F1aXJlIGxvY2sgYnkgYmVpbmcgdGhlIG9uZSB0byBjcmVhdGUgdGhlIGZpbGVcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLndyaXRlUGlkRmlsZSgnd3gnKTsgLy8gRmFpbHMgaWYgdGhlIGZpbGUgYWxyZWFkeSBleGlzdHNcbiAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICBpZiAoZS5jb2RlICE9PSAnRUVYSVNUJykgeyB0aHJvdyBlOyB9XG4gICAgICB9XG5cbiAgICAgIC8vIEZpbGUgYWxyZWFkeSBleGlzdHMuIFJlYWQgdGhlIGNvbnRlbnRzLCBzZWUgaWYgaXQncyBhbiBleGlzdGVudCBQSUQgKGlmIHNvLCB0aGUgbG9jayBpcyB0YWtlbilcbiAgICAgIGNvbnN0IG93bmVyUGlkID0gYXdhaXQgdGhpcy5yZWFkUGlkRmlsZSgpO1xuICAgICAgaWYgKG93bmVyUGlkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gRmlsZSBnb3QgZGVsZXRlZCBqdXN0IG5vdywgbWF5YmUgd2UgY2FuIGFjcXVpcmUgaXQgYWdhaW5cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAocHJvY2Vzc0V4aXN0cyhvd25lclBpZCkpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgbm90LCB0aGUgbG9jayBpcyBzdGFsZSBhbmQgd2lsbCBuZXZlciBiZSByZWxlYXNlZCBhbnltb3JlLiBXZSBtYXlcbiAgICAgIC8vIGRlbGV0ZSBpdCBhbmQgYWNxdWlyZSBpdCBhbnl3YXksIGJ1dCB3ZSBtYXkgYmUgcmFjaW5nIHNvbWVvbmUgZWxzZSB0cnlpbmdcbiAgICAgIC8vIHRvIGRvIHRoZSBzYW1lLiBTb2x2ZSB0aGlzIGFzIGZvbGxvd3M6XG4gICAgICAvLyAtIFRyeSB0byBhY3F1aXJlIGEgbG9jayB0aGF0IGdpdmVzIHVzIHBlcm1pc3Npb25zIHRvIGRlY2xhcmUgdGhlIGV4aXN0aW5nIGxvY2sgc3RhbGUuXG4gICAgICAvLyAtIFNsZWVwIGEgc21hbGwgcmFuZG9tIHBlcmlvZCB0byByZWR1Y2UgY29udGVudGlvbiBvbiB0aGlzIG9wZXJhdGlvblxuICAgICAgYXdhaXQgcmFuZG9tU2xlZXAoMTApO1xuICAgICAgY29uc3QgaW5uZXJNdXggPSBuZXcgWHBNdXRleCh0aGlzLnBvb2wsIGAke3RoaXMubXV0ZXhOYW1lfS4ke293bmVyUGlkfWApO1xuICAgICAgY29uc3QgaW5uZXJMb2NrID0gYXdhaXQgaW5uZXJNdXgudHJ5QWNxdWlyZSgpO1xuICAgICAgaWYgKCFpbm5lckxvY2spIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgLy8gV2UgbWF5IG5vdCByZWxlYXNlIHRoZSAnaW5uZXIgbG9jaycgd2UgdXNlZCB0byBhY3F1aXJlIHRoZSByaWdodHMgdG8gZGVjbGFyZSB0aGUgb3RoZXJcbiAgICAgIC8vIGxvY2sgc3RhbGUgdW50aWwgd2UgcmVsZWFzZSB0aGUgYWN0dWFsIGxvY2sgaXRzZWxmLiBJZiB3ZSBkaWQsIG90aGVyIGNvbnRlbmRlcnMgbWlnaHRcbiAgICAgIC8vIHNlZSBpdCByZWxlYXNlZCB3aGlsZSB0aGV5J3JlIHN0aWxsIGluIHRoaXMgZmFsbGJhY2sgYmxvY2sgYW5kIGFjY2lkZW50YWxseSBzdGVhbFxuICAgICAgLy8gZnJvbSBhIG5ldyBsZWdpdGltYXRlIG93bmVyLlxuICAgICAgcmV0dXJuIHRoaXMud3JpdGVQaWRGaWxlKCd3JywgaW5uZXJMb2NrKTsgLy8gRm9yY2Ugd3JpdGUgbG9jayBmaWxlLCBhdHRhY2ggaW5uZXIgbG9jayBhcyB3ZWxsXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFjcXVpcmUgdGhlIGxvY2ssIHdhaXRpbmcgdW50aWwgd2UgY2FuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgYWNxdWlyZSgpOiBQcm9taXNlPElMb2NrPiB7XG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIC8vIFN0YXJ0IHRoZSB3YWl0IGhlcmUsIHNvIHdlIGRvbid0IG1pc3MgdGhlIHNpZ25hbCBpZiBpdCBjb21lcyBhZnRlclxuICAgICAgLy8gd2UgdHJ5IGJ1dCBiZWZvcmUgd2Ugc2xlZXAuXG4gICAgICAvL1xuICAgICAgLy8gV2UgYWxzbyBwZXJpb2RpY2FsbHkgcmV0cnkgYW55d2F5IHNpbmNlIHdlIG1heSBoYXZlIG1pc3NlZCB0aGUgZGVsZXRlXG4gICAgICAvLyBzaWduYWwgZHVlIHRvIHVuZm9ydHVuYXRlIHRpbWluZy5cbiAgICAgIGNvbnN0IHdhaXQgPSB0aGlzLnBvb2wuYXdhaXRVbmxvY2soNTAwMCk7XG5cbiAgICAgIGNvbnN0IGxvY2sgPSBhd2FpdCB0aGlzLnRyeUFjcXVpcmUoKTtcbiAgICAgIGlmIChsb2NrKSB7XG4gICAgICAgIC8vIElnbm9yZSB0aGUgd2FpdCAoY291bnQgYXMgaGFuZGxlZClcbiAgICAgICAgd2FpdC50aGVuKCgpID0+IHt9LCAoKSA9PiB7fSk7XG4gICAgICAgIHJldHVybiBsb2NrO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCB3YWl0O1xuICAgICAgYXdhaXQgcmFuZG9tU2xlZXAoMTAwKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlYWRQaWRGaWxlKCk6IFByb21pc2U8bnVtYmVyIHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3QgZGVhZExpbmUgPSBEYXRlLm5vdygpICsgMTAwMDtcbiAgICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRMaW5lKSB7XG4gICAgICBsZXQgY29udGVudHM7XG4gICAgICB0cnkge1xuICAgICAgICBjb250ZW50cyA9IGF3YWl0IGZzLnJlYWRGaWxlKHRoaXMuZmlsZU5hbWUsIHsgZW5jb2Rpbmc6ICd1dGYtOCcgfSk7XG4gICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgaWYgKGUuY29kZSA9PT0gJ0VOT0VOVCcpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuXG4gICAgICAvLyBSZXRyeSB1bnRpbCB3ZSd2ZSBzZWVuIHRoZSBmdWxsIGNvbnRlbnRzXG4gICAgICBpZiAoY29udGVudHMuZW5kc1dpdGgoJy4nKSkgeyByZXR1cm4gcGFyc2VJbnQoY29udGVudHMuc3Vic3RyaW5nKDAsIGNvbnRlbnRzLmxlbmd0aCAtIDEpLCAxMCk7IH1cbiAgICAgIGF3YWl0IHNsZWVwKDEwKTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5maWxlTmFtZX0gd2FzIG5ldmVyIGNvbXBsZXRlbHkgd3JpdHRlbmApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB3cml0ZVBpZEZpbGUobW9kZTogc3RyaW5nLCBhZGRpdGlvbmFsTG9jaz86IElMb2NrKTogUHJvbWlzZTxJTG9jaz4ge1xuICAgIGNvbnN0IGZkID0gYXdhaXQgZnMub3Blbih0aGlzLmZpbGVOYW1lLCBtb2RlKTsgLy8gTWF5IGZhaWwgaWYgdGhlIGZpbGUgYWxyZWFkeSBleGlzdHNcbiAgICBhd2FpdCBmZC53cml0ZShgJHtwcm9jZXNzLnBpZH0uYCk7IC8vIFBlcmlvZCBndWFyZHMgYWdhaW5zdCBwYXJ0aWFsIHJlYWRzXG4gICAgYXdhaXQgZmQuY2xvc2UoKTtcblxuICAgIHJldHVybiB7XG4gICAgICByZWxlYXNlOiBhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IGZzLnVubGluayh0aGlzLmZpbGVOYW1lKTtcbiAgICAgICAgYXdhaXQgYWRkaXRpb25hbExvY2s/LnJlbGVhc2UoKTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElMb2NrIHtcbiAgcmVsZWFzZSgpOiBQcm9taXNlPHZvaWQ+O1xufVxuXG5hc3luYyBmdW5jdGlvbiBmaWxlRXhpc3RzKGZpbGVOYW1lOiBzdHJpbmcpIHtcbiAgdHJ5IHtcbiAgICBhd2FpdCBmcy5zdGF0KGZpbGVOYW1lKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgaWYgKGUuY29kZSA9PT0gJ0VOT0VOVCcpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgdGhyb3cgZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwcm9jZXNzRXhpc3RzKHBpZDogbnVtYmVyKSB7XG4gIHRyeSB7XG4gICAgcHJvY2Vzcy5raWxsKHBpZCwgMCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzbGVlcChtczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZShvayA9PiAoc2V0VGltZW91dChvaywgbXMpIGFzIGFueSkudW5yZWYoKSk7XG59XG5cbmZ1bmN0aW9uIHJhbmRvbVNsZWVwKG1zOiBudW1iZXIpIHtcbiAgcmV0dXJuIHNsZWVwKE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIG1zKSk7XG59XG4iXX0=
package/lib/xpmutex.ts ADDED
@@ -0,0 +1,218 @@
1
+ import { watch, promises as fs, mkdirSync } from 'fs';
2
+ import * as os from 'os';
3
+ import * as path from 'path';
4
+
5
+ export class XpMutexPool {
6
+ public static fromDirectory(directory: string) {
7
+ mkdirSync(directory, { recursive: true });
8
+ return new XpMutexPool(directory);
9
+ }
10
+
11
+ public static fromName(name: string) {
12
+ return XpMutexPool.fromDirectory(path.join(os.tmpdir(), name));
13
+ }
14
+
15
+ private readonly waitingResolvers = new Set<() => void>();
16
+ private watcher: ReturnType<typeof watch> | undefined;
17
+
18
+ private constructor(public readonly directory: string) {
19
+ this.startWatch();
20
+ }
21
+
22
+ public mutex(name: string) {
23
+ return new XpMutex(this, name);
24
+ }
25
+
26
+ /**
27
+ * Await an unlock event
28
+ *
29
+ * (An unlock event is when a file in the directory gets deleted, with a tiny
30
+ * random sleep attached to it).
31
+ */
32
+ public awaitUnlock(maxWaitMs?: number): Promise<void> {
33
+ const wait = new Promise<void>(ok => {
34
+ this.waitingResolvers.add(async () => {
35
+ await randomSleep(10);
36
+ ok();
37
+ });
38
+ });
39
+
40
+ if (maxWaitMs) {
41
+ return Promise.race([wait, sleep(maxWaitMs)]);
42
+ } else {
43
+ return wait;
44
+ }
45
+ }
46
+
47
+ private startWatch() {
48
+ this.watcher = watch(this.directory);
49
+ (this.watcher as any).unref(); // @types doesn't know about this but it exists
50
+ this.watcher.on('change', async (eventType, fname) => {
51
+ // Only trigger on 'deletes'.
52
+ // After receiving the event, we check if the file exists.
53
+ // - If no: the file was deleted! Huzzah, this counts as a wakeup.
54
+ // - If yes: either the file was just created (in which case we don't need to wakeup)
55
+ // or the event was due to a delete but someone raced us to it and claimed the
56
+ // file already (in which case we also don't need to wake up).
57
+ if (eventType === 'rename' && !await fileExists(path.join(this.directory, fname.toString()))) {
58
+ this.notifyWaiters();
59
+ }
60
+ });
61
+ this.watcher.on('error', async (e) => {
62
+ // eslint-disable-next-line no-console
63
+ console.error(e);
64
+ await randomSleep(100);
65
+ this.startWatch();
66
+ });
67
+ }
68
+
69
+ private notifyWaiters() {
70
+ for (const promise of this.waitingResolvers) {
71
+ promise();
72
+ }
73
+ this.waitingResolvers.clear();
74
+ }
75
+ }
76
+
77
+ /**
78
+ * Cross-process mutex
79
+ *
80
+ * Uses the presence of a file on disk and `fs.watch` to represent the mutex
81
+ * and discover unlocks.
82
+ */
83
+ export class XpMutex {
84
+ private readonly fileName: string;
85
+
86
+ constructor(private readonly pool: XpMutexPool, public readonly mutexName: string) {
87
+ this.fileName = path.join(pool.directory, `${mutexName}.mutex`);
88
+ }
89
+
90
+ /**
91
+ * Try to acquire the lock (may fail)
92
+ */
93
+ public async tryAcquire(): Promise<ILock | undefined> {
94
+ while (true) {
95
+ // Acquire lock by being the one to create the file
96
+ try {
97
+ return await this.writePidFile('wx'); // Fails if the file already exists
98
+ } catch (e: any) {
99
+ if (e.code !== 'EEXIST') { throw e; }
100
+ }
101
+
102
+ // File already exists. Read the contents, see if it's an existent PID (if so, the lock is taken)
103
+ const ownerPid = await this.readPidFile();
104
+ if (ownerPid === undefined) {
105
+ // File got deleted just now, maybe we can acquire it again
106
+ continue;
107
+ }
108
+ if (processExists(ownerPid)) {
109
+ return undefined;
110
+ }
111
+
112
+ // If not, the lock is stale and will never be released anymore. We may
113
+ // delete it and acquire it anyway, but we may be racing someone else trying
114
+ // to do the same. Solve this as follows:
115
+ // - Try to acquire a lock that gives us permissions to declare the existing lock stale.
116
+ // - Sleep a small random period to reduce contention on this operation
117
+ await randomSleep(10);
118
+ const innerMux = new XpMutex(this.pool, `${this.mutexName}.${ownerPid}`);
119
+ const innerLock = await innerMux.tryAcquire();
120
+ if (!innerLock) {
121
+ return undefined;
122
+ }
123
+
124
+ // We may not release the 'inner lock' we used to acquire the rights to declare the other
125
+ // lock stale until we release the actual lock itself. If we did, other contenders might
126
+ // see it released while they're still in this fallback block and accidentally steal
127
+ // from a new legitimate owner.
128
+ return this.writePidFile('w', innerLock); // Force write lock file, attach inner lock as well
129
+ }
130
+ }
131
+
132
+ /**
133
+ * Acquire the lock, waiting until we can
134
+ */
135
+ public async acquire(): Promise<ILock> {
136
+ while (true) {
137
+ // Start the wait here, so we don't miss the signal if it comes after
138
+ // we try but before we sleep.
139
+ //
140
+ // We also periodically retry anyway since we may have missed the delete
141
+ // signal due to unfortunate timing.
142
+ const wait = this.pool.awaitUnlock(5000);
143
+
144
+ const lock = await this.tryAcquire();
145
+ if (lock) {
146
+ // Ignore the wait (count as handled)
147
+ wait.then(() => {}, () => {});
148
+ return lock;
149
+ }
150
+
151
+ await wait;
152
+ await randomSleep(100);
153
+ }
154
+ }
155
+
156
+ private async readPidFile(): Promise<number | undefined> {
157
+ const deadLine = Date.now() + 1000;
158
+ while (Date.now() < deadLine) {
159
+ let contents;
160
+ try {
161
+ contents = await fs.readFile(this.fileName, { encoding: 'utf-8' });
162
+ } catch (e: any) {
163
+ if (e.code === 'ENOENT') { return undefined; }
164
+ throw e;
165
+ }
166
+
167
+ // Retry until we've seen the full contents
168
+ if (contents.endsWith('.')) { return parseInt(contents.substring(0, contents.length - 1), 10); }
169
+ await sleep(10);
170
+ }
171
+
172
+ throw new Error(`${this.fileName} was never completely written`);
173
+ }
174
+
175
+ private async writePidFile(mode: string, additionalLock?: ILock): Promise<ILock> {
176
+ const fd = await fs.open(this.fileName, mode); // May fail if the file already exists
177
+ await fd.write(`${process.pid}.`); // Period guards against partial reads
178
+ await fd.close();
179
+
180
+ return {
181
+ release: async () => {
182
+ await fs.unlink(this.fileName);
183
+ await additionalLock?.release();
184
+ },
185
+ };
186
+ }
187
+ }
188
+
189
+ export interface ILock {
190
+ release(): Promise<void>;
191
+ }
192
+
193
+ async function fileExists(fileName: string) {
194
+ try {
195
+ await fs.stat(fileName);
196
+ return true;
197
+ } catch (e: any) {
198
+ if (e.code === 'ENOENT') { return false; }
199
+ throw e;
200
+ }
201
+ }
202
+
203
+ function processExists(pid: number) {
204
+ try {
205
+ process.kill(pid, 0);
206
+ return true;
207
+ } catch {
208
+ return false;
209
+ }
210
+ }
211
+
212
+ function sleep(ms: number): Promise<void> {
213
+ return new Promise(ok => (setTimeout(ok, ms) as any).unref());
214
+ }
215
+
216
+ function randomSleep(ms: number) {
217
+ return sleep(Math.floor(Math.random() * ms));
218
+ }
package/package.json CHANGED
@@ -1,89 +1,111 @@
1
1
  {
2
2
  "name": "@aws-cdk-testing/cli-integ",
3
3
  "description": "Integration tests for the AWS CDK CLI",
4
- "version": "2.173.4",
4
+ "repository": {
5
+ "type": "git",
6
+ "url": "https://github.com/aws/aws-cdk-cli-testing",
7
+ "directory": "packages/@aws-cdk-testing/cli-integ"
8
+ },
5
9
  "bin": {
6
- "run-suite": "bin/run-suite",
10
+ "apply-patches": "bin/apply-patches",
7
11
  "download-and-run-old-tests": "bin/download-and-run-old-tests",
8
12
  "query-github": "bin/query-github",
9
- "apply-patches": "bin/apply-patches",
10
- "test-root": "bin/test-root",
11
- "stage-distribution": "bin/stage-distribution"
13
+ "run-suite": "bin/run-suite",
14
+ "stage-distribution": "bin/stage-distribution",
15
+ "test-root": "bin/test-root"
12
16
  },
13
17
  "scripts": {
14
- "build": "cdk-build",
15
- "watch": "cdk-watch",
16
- "lint": "cdk-lint",
17
- "pkglint": "pkglint -f",
18
- "test": "cdk-test",
19
- "package": "cdk-package",
20
- "build+test": "yarn build && yarn test",
21
- "build+extract": "yarn build",
22
- "build+test+package": "yarn build+test && yarn package",
23
- "build+test+extract": "yarn build+test"
18
+ "build": "npx projen build",
19
+ "bump": "npx projen bump",
20
+ "check-for-updates": "npx projen check-for-updates",
21
+ "compile": "npx projen compile",
22
+ "default": "npx projen default",
23
+ "eslint": "npx projen eslint",
24
+ "gather-versions": "npx projen gather-versions",
25
+ "package": "npx projen package",
26
+ "post-compile": "npx projen post-compile",
27
+ "pre-compile": "npx projen pre-compile",
28
+ "test": "npx projen test",
29
+ "test:watch": "npx projen test:watch",
30
+ "unbump": "npx projen unbump",
31
+ "watch": "npx projen watch",
32
+ "projen": "npx projen"
24
33
  },
25
34
  "author": {
26
35
  "name": "Amazon Web Services",
27
36
  "url": "https://aws.amazon.com",
28
37
  "organization": true
29
38
  },
30
- "license": "Apache-2.0",
31
39
  "devDependencies": {
32
- "@aws-cdk/cdk-build-tools": "2.173.4-alpha.0",
33
- "@types/semver": "^7.5.8",
34
- "@types/yargs": "^15.0.19",
35
- "@types/fs-extra": "^9.0.13",
36
- "@types/glob": "^7.2.0",
37
- "@types/npm": "^7.19.3",
38
- "@aws-cdk/pkglint": "2.173.4-alpha.0"
40
+ "@cdklabs/eslint-plugin": "^1.3.0",
41
+ "@stylistic/eslint-plugin": "^2.12.1",
42
+ "@types/fs-extra": "^9",
43
+ "@types/glob": "^7",
44
+ "@types/jest": "^29.5.14",
45
+ "@types/node": "^16",
46
+ "@types/semver": "^7",
47
+ "@types/yargs": "^15",
48
+ "@typescript-eslint/eslint-plugin": "^8",
49
+ "@typescript-eslint/parser": "^8",
50
+ "commit-and-tag-version": "^12",
51
+ "constructs": "^10.0.0",
52
+ "eslint": "^9",
53
+ "eslint-config-prettier": "^9.1.0",
54
+ "eslint-import-resolver-typescript": "^3.7.0",
55
+ "eslint-plugin-import": "^2.31.0",
56
+ "eslint-plugin-jest": "^28.10.0",
57
+ "eslint-plugin-prettier": "^5.2.1",
58
+ "jest": "^29.7.0",
59
+ "jest-junit": "^15",
60
+ "prettier": "^2.8",
61
+ "projen": "^0.91.4",
62
+ "ts-jest": "^29.2.5",
63
+ "typescript": "5.6"
39
64
  },
40
65
  "dependencies": {
66
+ "@aws-sdk/client-cloudformation": "^3",
67
+ "@aws-sdk/client-codeartifact": "^3",
68
+ "@aws-sdk/client-ecr": "^3",
69
+ "@aws-sdk/client-ecs": "^3",
70
+ "@aws-sdk/client-iam": "^3",
71
+ "@aws-sdk/client-lambda": "^3",
72
+ "@aws-sdk/client-s3": "^3",
73
+ "@aws-sdk/client-sns": "^3",
74
+ "@aws-sdk/client-sso": "^3",
75
+ "@aws-sdk/client-sts": "^3",
76
+ "@aws-sdk/credential-providers": "^3",
41
77
  "@octokit/rest": "^18.12.0",
42
- "@aws-sdk/client-codeartifact": "3.632.0",
43
- "@aws-sdk/client-cloudformation": "3.632.0",
44
- "@aws-sdk/client-ecr": "3.632.0",
45
- "@aws-sdk/client-ecs": "3.632.0",
46
- "@aws-sdk/client-iam": "3.632.0",
47
- "@aws-sdk/client-lambda": "3.632.0",
48
- "@aws-sdk/client-s3": "3.632.0",
49
- "@aws-sdk/client-sns": "3.632.0",
50
- "@aws-sdk/client-sso": "3.632.0",
51
- "@aws-sdk/client-sts": "3.632.0",
52
- "@aws-sdk/credential-providers": "3.632.0",
53
- "@smithy/util-retry": "3.0.8",
54
- "@smithy/types": "3.6.0",
55
- "axios": "^1.7.7",
78
+ "@smithy/types": "^3",
79
+ "@smithy/util-retry": "^3",
80
+ "axios": "^1",
56
81
  "chalk": "^4",
57
- "fs-extra": "^9.1.0",
58
- "glob": "^7.2.3",
59
- "jest": "^29.7.0",
60
- "jest-junit": "^14.0.1",
61
- "make-runnable": "^1.4.1",
62
- "mockttp": "^3.15.4",
63
- "npm": "^8.19.4",
64
- "p-queue": "^6.6.2",
65
- "semver": "^7.6.3",
66
- "sinon": "^9.2.4",
67
- "ts-mock-imports": "^1.3.16",
68
- "yaml": "1.10.2",
69
- "yargs": "^17.7.2"
70
- },
71
- "repository": {
72
- "url": "https://github.com/aws/aws-cdk.git",
73
- "type": "git",
74
- "directory": "packages/@aws-cdk-testing/cli-integ"
82
+ "fs-extra": "^9",
83
+ "glob": "^7",
84
+ "jest": "^29",
85
+ "make-runnable": "^1",
86
+ "mockttp": "^3",
87
+ "npm": "^8",
88
+ "p-queue": "^6",
89
+ "semver": "^7",
90
+ "sinon": "^9",
91
+ "ts-mock-imports": "^1",
92
+ "yaml": "1",
93
+ "yargs": "^17"
75
94
  },
76
95
  "keywords": [
77
96
  "aws",
78
97
  "cdk"
79
98
  ],
80
- "homepage": "https://github.com/aws/aws-cdk",
81
99
  "engines": {
82
- "node": ">= 14.15.0"
100
+ "node": ">= 16.0.0"
83
101
  },
84
- "stability": "stable",
85
- "maturity": "stable",
102
+ "main": "lib/index.js",
103
+ "license": "Apache-2.0",
104
+ "homepage": "https://github.com/aws/aws-cdk",
86
105
  "publishConfig": {
87
- "tag": "latest"
88
- }
89
- }
106
+ "access": "public"
107
+ },
108
+ "version": "3.0.0",
109
+ "types": "lib/index.d.ts",
110
+ "//": "~~ Generated by projen. To modify, edit .projenrc.js and run \"npx projen\"."
111
+ }
@@ -0,0 +1 @@
1
+ {"version":"0.36.0"}
@@ -0,0 +1 @@
1
+ {"version":"1.10.0"}
@@ -0,0 +1 @@
1
+ {"version":"1.10.0"}