cdk-drizzle-migrate 2.0.5 → 3.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/.jsii CHANGED
@@ -4054,7 +4054,7 @@
4054
4054
  },
4055
4055
  "name": "cdk-drizzle-migrate",
4056
4056
  "readme": {
4057
- "markdown": "# About\n\nThis CDK construct library makes it possible to run the drizzle\nmigrate at deploy of your stack time against the RDS or DSQL cluster of your\nchoice. The supported engines are PostgreSQL, MariaDB and MySQL.\n\nThis construct library is intended to be used in enterprise\nenvironments, and works in isolated subnets.\n\n<p align=\"left\">\n <a href=\"https://github.com/semantic-release/semantic-release\"><img src=\"https://img.shields.io/badge/semantic--release-angular-e10079?logo=semantic-release\" alt=semantic-release: angular\"></a>\n <a href=\"https://github.com/berenddeboer/cdk-rds-sql/actions/workflows/release.yml\"><img src=\"https://github.com/berenddeboer/cdk-rds-sql/actions/workflows/release.yml/badge.svg\" alt=\"Release badge\"></a>\n</p>\n\n# Requirements\n\nThis package assumes you deploy from a unix shell with access to `cp`,\n`mkdir`, and `curl`.\n\n# Installation\n\n npm i cdk-drizzle-migrate\n\nYou probably will be very unhappy if you don't have esbuild, so as\nusual in a cdk typescript project make sure that is installed too:\n\n npm i esbuild\n\nAnd obviously drizzle-kit and drizzle-orm should be available if you\nactually want to create migrations.\n\n# Usage\n\n## RDS and Aurora\n\nHave an RDS database and a secret that stores your db\ncredentials. Usually this will be the root secret for your RDS\ndatabase:\n\n```ts\nimport { DrizzleMigrate } from \"@berenddeboer/cdk-drizzle-migrate\"\n\n// Create the DrizzleMigrate construct\nconst migrator = new DrizzleMigrate(this, \"DrizzleMigration\", {\n dbSecret: database.secret!,\n migrationsPath: \"migrations\",\n vpc: vpc,\n vpcSubnets: {\n subnetType: ec2.SubnetType.PRIVATE_ISOLATED,\n },\n cluster: database, // Pass the database instance to allow automatic security group configuration\n})\n```\n\nYour secret should look like the standard one created by CDK:\n\n```json\n{\n \"password\": \"some-password\",\n \"dbname\": \"testdb\",\n \"engine\": \"postgres\",\n \"port\": 5432,\n \"dbInstanceIdentifier\": \"some-name\",\n \"host\": \"some-name.cvabql2flhit.us-east-1.rds.amazonaws.com\",\n \"username\": \"postgres\"\n}\n```\n\n## DSQL\n\nFor DSQL there is no secret where credentials are stored. Only IAM\naccess is supported.\n\nDrizzle doesn't really support DSQL, so if you create migrations you\nwill often need to tweak them manually as so little of postgresql is\nsupported.\n\n## Migrations\n\nSpecify the path where the migrations are stored, `migrations` in this case.\n\nWhen this resource is deployed, it will run `drizzle-kit migrate` for\nyou in the lambda.\n\nThe default timeout is 5 minutes, you need to increase this if your\nmigration takes more time.\n\nPassing your database cluster is optional. If supplied, the lambda's\nsecurity group will be added as allowed source to the database\nsecurity group if no security group is present in\n`handlerProps.securityGroups`.\n\nIf you do not pass a cluster, make sure to pass in a security group in\n`handlerProps.securityGroups` which can connect to your database.\n\nAlso if you do not pass a cluster, but you still want to create a\ndatabase, you may wish to add a dependency to make sure the database\nis created, before the migration is run:\n\n```ts\nmigrator.resource.node.addDependency(cluster)\n```\n\n# Potential pitfalls\n\n1. The lambda can only run for 15 minutes. If your migrations take\n longer, this solution will not work.\n\n# Working on this code\n\n1. Install packages: `npm ci`\n\n2. Bootstrap CDK if not done: `npx cdk bootstrap\n aws://123456/us-east-1`. Replace 123456 with your AWS account.\n\n## Handler notes\n\nWhen making changes to the Lambda handler code in `lambda/index.ts`,\nyou need to transpile it to JavaScript:\n\n```bash\nnpx projen build:handler\n```\n\nThis will generate `src/handler/handler.js` which is used by the CDK\nconstruct.\n\nThis technique is used to avoid having to bundle nodejs dependencies\nas that doesn't work well in this case.\n"
4057
+ "markdown": "# About\n\nThis CDK construct library makes it possible to run the drizzle\nmigrate at deploy of your stack time against the RDS or DSQL cluster of your\nchoice. The supported engines are PostgreSQL, MariaDB and MySQL.\n\nThis construct library is intended to be used in enterprise\nenvironments, and works in isolated subnets.\n\n<p align=\"left\">\n <a href=\"https://github.com/semantic-release/semantic-release\"><img src=\"https://img.shields.io/badge/semantic--release-angular-e10079?logo=semantic-release\" alt=semantic-release: angular\"></a>\n <a href=\"https://github.com/berenddeboer/cdk-rds-sql/actions/workflows/release.yml\"><img src=\"https://github.com/berenddeboer/cdk-rds-sql/actions/workflows/release.yml/badge.svg\" alt=\"Release badge\"></a>\n</p>\n\n# Requirements\n\nThis package assumes you deploy from a unix shell with access to `cp`,\n`mkdir`, and `curl`.\n\nVersion 3 of this package is for Drizzle 1 migration folders and\nrequires `drizzle-kit` and `drizzle-orm` 1.0 or later. Use version 2\nof this package with Drizzle 0.x migration folders.\n\n# Installation\n\n npm i cdk-drizzle-migrate\n\nYou probably will be very unhappy if you don't have esbuild, so as\nusual in a cdk typescript project make sure that is installed too:\n\n npm i esbuild\n\nAnd obviously drizzle-kit and drizzle-orm 1.0 or later should be\navailable if you actually want to create migrations.\n\n# Usage\n\n## RDS and Aurora\n\nHave an RDS database and a secret that stores your db\ncredentials. Usually this will be the root secret for your RDS\ndatabase:\n\n```ts\nimport { DrizzleMigrate } from \"@berenddeboer/cdk-drizzle-migrate\"\n\n// Create the DrizzleMigrate construct\nconst migrator = new DrizzleMigrate(this, \"DrizzleMigration\", {\n dbSecret: database.secret!,\n migrationsPath: \"migrations\",\n vpc: vpc,\n vpcSubnets: {\n subnetType: ec2.SubnetType.PRIVATE_ISOLATED,\n },\n cluster: database, // Pass the database instance to allow automatic security group configuration\n})\n```\n\nYour secret should look like the standard one created by CDK:\n\n```json\n{\n \"password\": \"some-password\",\n \"dbname\": \"testdb\",\n \"engine\": \"postgres\",\n \"port\": 5432,\n \"dbInstanceIdentifier\": \"some-name\",\n \"host\": \"some-name.cvabql2flhit.us-east-1.rds.amazonaws.com\",\n \"username\": \"postgres\"\n}\n```\n\n## DSQL\n\nFor DSQL there is no secret where credentials are stored. Only IAM\naccess is supported.\n\nDrizzle doesn't really support DSQL, so if you create migrations you\nwill often need to tweak them manually as so little of postgresql is\nsupported.\n\n## Migrations\n\nSpecify the path where the migrations are stored, `migrations` in this case.\n\nWhen this resource is deployed, it will run `drizzle-kit migrate` for\nyou in the lambda.\n\nThe default timeout is 5 minutes, you need to increase this if your\nmigration takes more time.\n\nPassing your database cluster is optional. If supplied, the lambda's\nsecurity group will be added as allowed source to the database\nsecurity group if no security group is present in\n`handlerProps.securityGroups`.\n\nIf you do not pass a cluster, make sure to pass in a security group in\n`handlerProps.securityGroups` which can connect to your database.\n\nAlso if you do not pass a cluster, but you still want to create a\ndatabase, you may wish to add a dependency to make sure the database\nis created, before the migration is run:\n\n```ts\nmigrator.resource.node.addDependency(cluster)\n```\n\n# Potential pitfalls\n\n1. The lambda can only run for 15 minutes. If your migrations take\n longer, this solution will not work.\n\n# Working on this code\n\n1. Install packages: `npm ci`\n\n2. Bootstrap CDK if not done: `npx cdk bootstrap\n aws://123456/us-east-1`. Replace 123456 with your AWS account.\n\n## Handler notes\n\nWhen making changes to the Lambda handler code in `lambda/index.ts`,\nyou need to transpile it to JavaScript:\n\n```bash\nnpx projen build:handler\n```\n\nThis will generate `src/handler/handler.js` which is used by the CDK\nconstruct.\n\nThis technique is used to avoid having to bundle nodejs dependencies\nas that doesn't work well in this case.\n"
4058
4058
  },
4059
4059
  "repository": {
4060
4060
  "type": "git",
@@ -4283,6 +4283,6 @@
4283
4283
  "symbolId": "src/drizzle-migrate-provider:DrizzleMigrateProps"
4284
4284
  }
4285
4285
  },
4286
- "version": "2.0.5",
4287
- "fingerprint": "gdmsD1UBbqW1ys6A4am3sj3YyQjsDq7URRcvQRtzP+k="
4286
+ "version": "3.0.1",
4287
+ "fingerprint": "YKGta1jx9bfGCw70YRry0oaMsVRcsp7GluCNL1sYK+s="
4288
4288
  }
package/README.md CHANGED
@@ -17,6 +17,10 @@ environments, and works in isolated subnets.
17
17
  This package assumes you deploy from a unix shell with access to `cp`,
18
18
  `mkdir`, and `curl`.
19
19
 
20
+ Version 3 of this package is for Drizzle 1 migration folders and
21
+ requires `drizzle-kit` and `drizzle-orm` 1.0 or later. Use version 2
22
+ of this package with Drizzle 0.x migration folders.
23
+
20
24
  # Installation
21
25
 
22
26
  npm i cdk-drizzle-migrate
@@ -26,8 +30,8 @@ usual in a cdk typescript project make sure that is installed too:
26
30
 
27
31
  npm i esbuild
28
32
 
29
- And obviously drizzle-kit and drizzle-orm should be available if you
30
- actually want to create migrations.
33
+ And obviously drizzle-kit and drizzle-orm 1.0 or later should be
34
+ available if you actually want to create migrations.
31
35
 
32
36
  # Usage
33
37
 
@@ -150,5 +150,5 @@ class DrizzleMigrate extends constructs_1.Construct {
150
150
  }
151
151
  exports.DrizzleMigrate = DrizzleMigrate;
152
152
  _a = JSII_RTTI_SYMBOL_1;
153
- DrizzleMigrate[_a] = { fqn: "cdk-drizzle-migrate.DrizzleMigrate", version: "2.0.5" };
153
+ DrizzleMigrate[_a] = { fqn: "cdk-drizzle-migrate.DrizzleMigrate", version: "3.0.1" };
154
154
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJpenpsZS1taWdyYXRlLXByb3ZpZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2RyaXp6bGUtbWlncmF0ZS1wcm92aWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLG1DQUF5QztBQUN6QywyQkFBK0I7QUFDL0IsNkJBQTRCO0FBQzVCLDZDQUF5RjtBQUN6Riw2Q0FBNEM7QUFFNUMsMkNBQTBDO0FBQzFDLGlEQUFnRDtBQUNoRCxxRUFBbUY7QUFDbkYsNkNBQTRDO0FBRzVDLG1EQUFrRDtBQUNsRCwyQ0FBc0M7QUFFdEM7O0dBRUc7QUFDSCxTQUFTLGFBQWEsQ0FDcEIsT0FBdUU7SUFFdkUsT0FBTyxPQUFPLFlBQVksSUFBSSxDQUFDLFVBQVUsQ0FBQTtBQUMzQyxDQUFDO0FBcUREOztHQUVHO0FBQ0gsTUFBYSxjQUFlLFNBQVEsc0JBQVM7SUFXM0MsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUEwQjtRQUNsRSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFBO1FBRWhCLHlCQUF5QjtRQUN6QixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsT0FBTyxJQUFJLGFBQWEsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDNUQsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUMvQixNQUFNLElBQUksS0FBSyxDQUNiLDZFQUE2RSxDQUM5RSxDQUFBO1FBQ0gsQ0FBQztRQUNELElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDMUIsTUFBTSxJQUFJLEtBQUssQ0FBQywrQ0FBK0MsQ0FBQyxDQUFBO1FBQ2xFLENBQUM7UUFDRCxJQUFJLE1BQU0sSUFBSSxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDN0IsTUFBTSxJQUFJLEtBQUssQ0FDYixtRkFBbUYsQ0FDcEYsQ0FBQTtRQUNILENBQUM7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QztZQUNYLDhEQUE4RDtZQUM5RCwyREFBMkQ7WUFDM0QsTUFBTSxXQUFXLEdBQUcsS0FBSyxDQUFDLE9BQTBCLENBQUE7WUFDcEQsTUFBTSxTQUFTLEdBQUcsV0FBVyxDQUFDLGNBQWMsQ0FBQTtZQUM1QyxNQUFNLE1BQU0sR0FBRyxtQkFBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUE7WUFDcEMsd0JBQXdCLENBQUMsUUFBUSxHQUFHLEdBQUcsU0FBUyxTQUFTLE1BQU0sU0FBUyxDQUFBO1lBQ3hFLHdCQUF3QixDQUFDLElBQUksR0FBRyxNQUFNLENBQUE7UUFDeEMsQ0FBQzthQUFNLENBQUM7WUFDTix3QkFBd0IsQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDLFFBQVMsQ0FBQyxTQUFTLENBQUE7UUFDaEUsQ0FBQztRQUVELElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSw0QkFBYyxDQUFDLElBQUksRUFBRSxnQkFBZ0IsRUFBRTtZQUN6RCxZQUFZLEVBQUUsUUFBUSxDQUFDLFlBQVk7WUFDbkMsVUFBVSxFQUFFLHdCQUF3QjtTQUNyQyxDQUFDLENBQUE7UUFFRixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxZQUEyQixDQUFBO1FBQ2xFLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxnQkFBZ0IsRUFBRSxHQUFHLENBQUMsQ0FBQTtRQUV0RCxxRUFBcUU7UUFDckUsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDbEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUNqRCxDQUFDO0lBQ0gsQ0FBQzs7QUFqS0gsd0NBa0tDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgc3RyaWN0IGFzIGFzc2VydCB9IGZyb20gXCJhc3NlcnRcIlxuaW1wb3J0IHsgZXhpc3RzU3luYyB9IGZyb20gXCJmc1wiXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCJcbmltcG9ydCB7IENmblJlc291cmNlLCBDdXN0b21SZXNvdXJjZSwgRHVyYXRpb24sIFN0YWNrLCBSZW1vdmFsUG9saWN5IH0gZnJvbSBcImF3cy1jZGstbGliXCJcbmltcG9ydCAqIGFzIGRzcWwgZnJvbSBcImF3cy1jZGstbGliL2F3cy1kc3FsXCJcbmltcG9ydCAqIGFzIGVjMiBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVjMlwiXG5pbXBvcnQgKiBhcyBpYW0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1pYW1cIlxuaW1wb3J0ICogYXMgbGFtYmRhIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbGFtYmRhXCJcbmltcG9ydCB7IE5vZGVqc0Z1bmN0aW9uLCBOb2RlanNGdW5jdGlvblByb3BzIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1sYW1iZGEtbm9kZWpzXCJcbmltcG9ydCAqIGFzIGxvZ3MgZnJvbSBcImF3cy1jZGstbGliL2F3cy1sb2dzXCJcbmltcG9ydCAqIGFzIHJkcyBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXJkc1wiXG5pbXBvcnQgKiBhcyBzZWNyZXRzbWFuYWdlciBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXNlY3JldHNtYW5hZ2VyXCJcbmltcG9ydCAqIGFzIGNyIGZyb20gXCJhd3MtY2RrLWxpYi9jdXN0b20tcmVzb3VyY2VzXCJcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCJcblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGlmIGEgY2x1c3RlciBpcyBhIERTUUwgY2x1c3RlclxuICovXG5mdW5jdGlvbiBpc0RzcWxDbHVzdGVyKFxuICBjbHVzdGVyOiByZHMuSURhdGFiYXNlQ2x1c3RlciB8IHJkcy5JRGF0YWJhc2VJbnN0YW5jZSB8IGRzcWwuQ2ZuQ2x1c3RlclxuKTogY2x1c3RlciBpcyBkc3FsLkNmbkNsdXN0ZXIge1xuICByZXR1cm4gY2x1c3RlciBpbnN0YW5jZW9mIGRzcWwuQ2ZuQ2x1c3RlclxufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIERyaXp6bGVNaWdyYXRlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRHJpenpsZU1pZ3JhdGVQcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgZGF0YWJhc2Ugc2VjcmV0IGNvbnRhaW5pbmcgY29ubmVjdGlvbiBkZXRhaWxzXG4gICAqIE11c3QgY29udGFpbiBzdGFuZGFyZCBDREsgZGF0YWJhc2Ugc2VjcmV0IHByb3BlcnRpZXM6IHVzZXJuYW1lLFxuICAgKiBwYXNzd29yZCwgaG9zdCwgcG9ydCwgZW5naW5lLCBldGMuXG4gICAqIE5vdCByZXF1aXJlZCB3aGVuIHJlbHlpbmcgb24gSUFNIGF1dGhlbnRpY2F0aW9uIChzdWNoIGFzIERTUUwpLlxuICAgKiBAZGVmYXVsdCAtIHVuZGVmaW5lZCBmb3IgRFNRTCBjbHVzdGVycyB1c2luZyBJQU0gYXV0aGVudGljYXRpb25cbiAgICovXG4gIHJlYWRvbmx5IGRiU2VjcmV0Pzogc2VjcmV0c21hbmFnZXIuSVNlY3JldFxuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCB0byB0aGUgbWlncmF0aW9ucyBkaXJlY3RvcnlcbiAgICogVGhpcyBkaXJlY3Rvcnkgd2lsbCBiZSBidW5kbGVkIHdpdGggdGhlIExhbWJkYSBmdW5jdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgbWlncmF0aW9uc1BhdGg6IHN0cmluZ1xuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBwcm9wZXJ0aWVzIHRvIGN1c3RvbWl6ZSB0aGUgTGFtYmRhIGZ1bmN0aW9uXG4gICAqIEV4Y2x1ZGVzIHJ1bnRpbWUsIGVudHJ5LCBhbmQgaGFuZGxlciB3aGljaCBhcmUgbWFuYWdlZCBieSB0aGUgY29uc3RydWN0XG4gICAqIEBkZWZhdWx0IC0gRGVmYXVsdCBMYW1iZGEgY29uZmlndXJhdGlvbiBpcyB1c2VkXG4gICAqL1xuICByZWFkb25seSBoYW5kbGVyUHJvcHM/OiBOb2RlanNGdW5jdGlvblByb3BzXG5cbiAgLyoqXG4gICAqIFRoZSBWUEMgd2hlcmUgdGhlIExhbWJkYSBmdW5jdGlvbiB3aWxsIGJlIGRlcGxveWVkXG4gICAqIFJlcXVpcmVkIHdoZW4geW91ciBkYXRhYmFzZSBpcyBvbmx5IGFjY2Vzc2libGUgaW4gYSBWUEMuXG4gICAqIE5vdCByZXF1aXJlZCBmb3IgRFNRTCBhcyBpdCB1c2VzIHB1YmxpYyBlbmRwb2ludHMgd2l0aCBJQU0gYXV0aGVudGljYXRpb25cbiAgICogQGRlZmF1bHQgLSB1c2UgVlBDIG9mIHlvdXIgUkRTL0F1cm9yYSBjbHVzdGVyXG4gICAqL1xuICByZWFkb25seSB2cGM/OiBlYzIuSVZwY1xuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBzdWJuZXQgc2VsZWN0aW9uIHRvIGRlcGxveSB0aGUgTGFtYmRhIGZ1bmN0aW9uXG4gICAqIE9ubHkgdXNlZCB3aGVuIHZwYyBpcyBzcGVjaWZpZWRcbiAgICogQGRlZmF1bHQgLSBQUklWQVRFX1dJVEhfRUdSRVNTIHN1Ym5ldHNcbiAgICovXG4gIHJlYWRvbmx5IHZwY1N1Ym5ldHM/OiBlYzIuU3VibmV0U2VsZWN0aW9uXG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsIGRhdGFiYXNlIGNsdXN0ZXIgb3IgaW5zdGFuY2VcbiAgICogU3VwcG9ydHMgYm90aCB0cmFkaXRpb25hbCBSRFMvQXVyb3JhIGNsdXN0ZXJzIGFuZCBEU1FMIGNsdXN0ZXJzXG4gICAqIC0gRm9yIFJEUy9BdXJvcmE6IHNlY3VyaXR5IGdyb3VwcyB3aWxsIGJlIGNvbmZpZ3VyZWQgdG8gYWxsb3cgYWNjZXNzXG4gICAqIC0gRm9yIERTUUw6IElBTSBhdXRoZW50aWNhdGlvbiB3aWxsIGJlIHVzZWQgaW5zdGVhZCBvZiBzZWNyZXRzXG4gICAqIEBkZWZhdWx0IC0gTm8gZGF0YWJhc2UgY29ubmVjdGlvbiBpcyBjb25maWd1cmVkXG4gICAqL1xuICByZWFkb25seSBjbHVzdGVyPzogcmRzLklEYXRhYmFzZUNsdXN0ZXIgfCByZHMuSURhdGFiYXNlSW5zdGFuY2UgfCBkc3FsLkNmbkNsdXN0ZXJcbn1cblxuLyoqXG4gKiBBIGN1c3RvbSByZXNvdXJjZSB0aGF0IHJ1bnMgRHJpenpsZSBtaWdyYXRpb25zXG4gKi9cbmV4cG9ydCBjbGFzcyBEcml6emxlTWlncmF0ZSBleHRlbmRzIENvbnN0cnVjdCB7XG4gIC8qKlxuICAgKiBUaGUgY3VzdG9tIHJlc291cmNlIHRoYXQgd2FzIGNyZWF0ZWRcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSByZXNvdXJjZTogQ3VzdG9tUmVzb3VyY2VcblxuICAvKipcbiAgICogVGhlIExhbWJkYSBmdW5jdGlvbiB0aGF0IGV4ZWN1dGVzIHRoZSBtaWdyYXRpb25zXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaGFuZGxlcjogTm9kZWpzRnVuY3Rpb25cblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogRHJpenpsZU1pZ3JhdGVQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZClcblxuICAgIC8vIFZhbGlkYXRlIGNvbmZpZ3VyYXRpb25cbiAgICBjb25zdCBpc0RzcWwgPSBwcm9wcy5jbHVzdGVyICYmIGlzRHNxbENsdXN0ZXIocHJvcHMuY2x1c3RlcilcbiAgICBpZiAoIWlzRHNxbCAmJiAhcHJvcHMuZGJTZWNyZXQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJFaXRoZXIgZGJTZWNyZXQgKGZvciB0cmFkaXRpb25hbCBSRFMpIG9yIGNsdXN0ZXIgd2l0aCBEU1FMIG11c3QgYmUgcHJvdmlkZWRcIlxuICAgICAgKVxuICAgIH1cbiAgICBpZiAoIWlzRHNxbCAmJiAhcHJvcHMudnBjKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJWUEMgaXMgcmVxdWlyZWQgZm9yIHRyYWRpdGlvbmFsIFJEUyBkYXRhYmFzZXNcIilcbiAgICB9XG4gICAgaWYgKGlzRHNxbCAmJiBwcm9wcy5kYlNlY3JldCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcImRiU2VjcmV0IHNob3VsZCBub3QgYmUgcHJvdmlkZWQgd2hlbiB1c2luZyBEU1FMIGNsdXN0ZXIgKHVzZXMgSUFNIGF1dGhlbnRpY2F0aW9uKVwiXG4gICAgICApXG4gICAgfVxuXG4gICAgY29uc3QgbWlncmF0aW9uc0RpciA9IHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCBwcm9wcy5taWdyYXRpb25zUGF0aClcbiAgICBhc3NlcnQoXG4gICAgICBleGlzdHNTeW5jKG1pZ3JhdGlvbnNEaXIpLFxuICAgICAgYE1pZ3JhdGlvbnMgZGlyZWN0b3J5ICR7bWlncmF0aW9uc0Rpcn0gZG9lcyBub3QgZXhpc3RgXG4gICAgKVxuICAgIGNvbnN0IGhhbmRsZXJEaXIgPSBwYXRoLmpvaW4oX19kaXJuYW1lLCBcImhhbmRsZXJcIilcblxuICAgIGNvbnN0IHRzX2ZpbGVuYW1lID0gcGF0aC5qb2luKGhhbmRsZXJEaXIsIFwiaW5kZXgudHNcIilcbiAgICBjb25zdCBqc19maWxlbmFtZSA9IHBhdGguam9pbihoYW5kbGVyRGlyLCBcImluZGV4LmpzXCIpXG4gICAgY29uc3QgZW50cnkgPSBleGlzdHNTeW5jKHRzX2ZpbGVuYW1lKSA/IHRzX2ZpbGVuYW1lIDoganNfZmlsZW5hbWVcblxuICAgIGNvbnN0IGVudmlyb25tZW50OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgTk9fQ09MT1I6IFwiMVwiLFxuICAgICAgLi4uKHByb3BzLmhhbmRsZXJQcm9wcz8uZW52aXJvbm1lbnQgfHwge30pLFxuICAgIH1cblxuICAgIC8vIENyZWF0ZSBleHBsaWNpdCBsb2cgZ3JvdXAgZm9yIHRoZSBMYW1iZGEgaGFuZGxlclxuICAgIGNvbnN0IGxvZ0dyb3VwID0gbmV3IGxvZ3MuTG9nR3JvdXAodGhpcywgXCJNaWdyYXRlSGFuZGxlckxvZ0dyb3VwXCIsIHtcbiAgICAgIHJldGVudGlvbjogbG9ncy5SZXRlbnRpb25EYXlzLk9ORV9XRUVLLFxuICAgICAgLy8gS2VlcCBsb2cgZ3JvdXAsIGl0J3MgYW5ub3lpbmcgd2hlbiBpdCBnZXRzIGRlbGV0ZWQgZm9yIG5ld1xuICAgICAgLy8gZGVwbG95cywgYW5kIHNvbWV0aGluZyBoYXMgZ29uZSB3cm9uZy4gWW91IGhhdmUgbm8gd2F5IHRvXG4gICAgICAvLyBsb29rIGF0IHRoZSBsb2dzIGluIHRoYXQgY2FzZS5cbiAgICAgIHJlbW92YWxQb2xpY3k6IFJlbW92YWxQb2xpY3kuUkVUQUlOLFxuICAgIH0pXG5cbiAgICBjb25zdCBvbkV2ZW50SGFuZGxlciA9IG5ldyBOb2RlanNGdW5jdGlvbih0aGlzLCBcIk1pZ3JhdGVIYW5kbGVyXCIsIHtcbiAgICAgIHJ1bnRpbWU6IGxhbWJkYS5SdW50aW1lLk5PREVKU18yMF9YLFxuICAgICAgZW50cnk6IGVudHJ5LFxuICAgICAgbG9nR3JvdXA6IGxvZ0dyb3VwLFxuICAgICAgbG9nZ2luZ0Zvcm1hdDogbGFtYmRhLkxvZ2dpbmdGb3JtYXQuSlNPTixcbiAgICAgIGFwcGxpY2F0aW9uTG9nTGV2ZWxWMjogbGFtYmRhLkFwcGxpY2F0aW9uTG9nTGV2ZWwuSU5GTyxcbiAgICAgIHRpbWVvdXQ6IER1cmF0aW9uLm1pbnV0ZXMoNSksXG4gICAgICB2cGM6IHByb3BzLnZwYyxcbiAgICAgIHZwY1N1Ym5ldHM6IHByb3BzLnZwY1N1Ym5ldHMsXG4gICAgICAuLi5wcm9wcy5oYW5kbGVyUHJvcHMsXG4gICAgICBlbnZpcm9ubWVudCxcbiAgICAgIGJ1bmRsaW5nOiB7XG4gICAgICAgIHNvdXJjZU1hcDogZmFsc2UsXG4gICAgICAgIC8vIEluY2x1ZGUgdGhlIG1pZ3JhdGlvbnMgZGlyZWN0b3J5IGluIHRoZSBidW5kbGVcbiAgICAgICAgY29tbWFuZEhvb2tzOiB7XG4gICAgICAgICAgYmVmb3JlQnVuZGxpbmcoXzogc3RyaW5nLCBvdXRwdXREaXI6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbW1hbmRzID0gW1xuICAgICAgICAgICAgICBgY3AgJHtoYW5kbGVyRGlyfS9oYW5kbGVyLmpzICR7b3V0cHV0RGlyfWAsXG4gICAgICAgICAgICAgIGBjcCAtciAke21pZ3JhdGlvbnNEaXJ9ICR7cGF0aC5qb2luKG91dHB1dERpciwgXCJtaWdyYXRpb25zXCIpfWAsXG4gICAgICAgICAgICAgIC8vIEFsd2F5cyBkb3dubG9hZCBSRFMgY2VydGlmaWNhdGUgZm9yIFNTTCBjb25uZWN0aW9ucyAoYm90aCBSRFMgYW5kIERTUUwgbmVlZCBpdClcbiAgICAgICAgICAgICAgYG1rZGlyIC1wICR7cGF0aC5qb2luKG91dHB1dERpciwgXCJjZXJ0c1wiKX1gLFxuICAgICAgICAgICAgICBgY3VybCAtLXNpbGVudCAtZkwgaHR0cHM6Ly90cnVzdHN0b3JlLnBraS5yZHMuYW1hem9uYXdzLmNvbS9nbG9iYWwvZ2xvYmFsLWJ1bmRsZS5wZW0gLW8gJHtwYXRoLmpvaW4ob3V0cHV0RGlyLCBcImNlcnRzXCIsIFwiZ2xvYmFsLWJ1bmRsZS5wZW1cIil9YCxcbiAgICAgICAgICAgIF1cblxuICAgICAgICAgICAgcmV0dXJuIGNvbW1hbmRzXG4gICAgICAgICAgfSxcbiAgICAgICAgICBhZnRlckJ1bmRsaW5nKCk6IHN0cmluZ1tdIHtcbiAgICAgICAgICAgIHJldHVybiBbXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgYmVmb3JlSW5zdGFsbCgpOiBzdHJpbmdbXSB7XG4gICAgICAgICAgICByZXR1cm4gW11cbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICAuLi5wcm9wcy5oYW5kbGVyUHJvcHM/LmJ1bmRsaW5nLFxuICAgICAgfSxcbiAgICB9KVxuXG4gICAgLy8gSGFuZGxlIGRhdGFiYXNlIGNvbm5lY3Rpb24gc2V0dXBcbiAgICBpZiAoaXNEc3FsKSB7XG4gICAgICAvLyBGb3IgRFNRTCwgZ3JhbnQgSUFNIHBlcm1pc3Npb25zIGluc3RlYWQgb2YgVlBDIHNlY3VyaXR5IGdyb3Vwc1xuICAgICAgY29uc3QgZHNxbENsdXN0ZXIgPSBwcm9wcy5jbHVzdGVyIGFzIGRzcWwuQ2ZuQ2x1c3RlclxuICAgICAgb25FdmVudEhhbmRsZXIuYWRkVG9Sb2xlUG9saWN5KFxuICAgICAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgICAgIGFjdGlvbnM6IFtcImRzcWw6RGJDb25uZWN0QWRtaW5cIl0sXG4gICAgICAgICAgcmVzb3VyY2VzOiBbZHNxbENsdXN0ZXIuYXR0clJlc291cmNlQXJuXSxcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVHJhZGl0aW9uYWwgUkRTIHNldHVwIHdpdGggc2VjdXJpdHkgZ3JvdXBzXG4gICAgICBpZiAoXG4gICAgICAgIHByb3BzLmNsdXN0ZXIgJiZcbiAgICAgICAgKCFwcm9wcy5oYW5kbGVyUHJvcHMgfHxcbiAgICAgICAgICB0eXBlb2YgcHJvcHMuaGFuZGxlclByb3BzLnNlY3VyaXR5R3JvdXBzID09PSBcInVuZGVmaW5lZFwiIHx8XG4gICAgICAgICAgcHJvcHMuaGFuZGxlclByb3BzLnNlY3VyaXR5R3JvdXBzLmxlbmd0aCA9PT0gMClcbiAgICAgICkge1xuICAgICAgICBjb25zdCByZHNDbHVzdGVyID0gcHJvcHMuY2x1c3RlciBhcyByZHMuSURhdGFiYXNlQ2x1c3RlciB8IHJkcy5JRGF0YWJhc2VJbnN0YW5jZVxuICAgICAgICByZHNDbHVzdGVyLmNvbm5lY3Rpb25zLmFsbG93RGVmYXVsdFBvcnRGcm9tKFxuICAgICAgICAgIG9uRXZlbnRIYW5kbGVyLmNvbm5lY3Rpb25zLFxuICAgICAgICAgIFwiQWxsb3cgZHJpenpsZSBtaWdyYXRlIGxhbWJkYSB0byBjb25uZWN0IHRvIGRiXCJcbiAgICAgICAgKVxuICAgICAgfVxuXG4gICAgICAvLyBHcmFudCB0aGUgTGFtYmRhIGZ1bmN0aW9uIHBlcm1pc3Npb24gdG8gcmVhZCB0aGUgc2VjcmV0XG4gICAgICBwcm9wcy5kYlNlY3JldCEuZ3JhbnRSZWFkKG9uRXZlbnRIYW5kbGVyKVxuICAgIH1cblxuICAgIHRoaXMuaGFuZGxlciA9IG9uRXZlbnRIYW5kbGVyXG5cbiAgICBjb25zdCBwcm92aWRlciA9IG5ldyBjci5Qcm92aWRlcih0aGlzLCBcIlByb3ZpZGVyXCIsIHtcbiAgICAgIG9uRXZlbnRIYW5kbGVyLFxuICAgICAgbG9nR3JvdXAsXG4gICAgfSlcblxuICAgIC8vIEJ1aWxkIGN1c3RvbSByZXNvdXJjZSBwcm9wZXJ0aWVzIGJhc2VkIG9uIGRhdGFiYXNlIHR5cGVcbiAgICBjb25zdCBjdXN0b21SZXNvdXJjZVByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAvLyBXZSdyZSBub3cgdXNpbmcgYSBmaXhlZCBwYXRoIGluc2lkZSB0aGUgTGFtYmRhIGJ1bmRsZVxuICAgICAgbWlncmF0aW9uc1BhdGg6IFwibWlncmF0aW9uc1wiLFxuICAgICAgLy8gQWRkaW5nIGEgdGltZXN0YW1wIGVuc3VyZXMgdGhlIHJlc291cmNlIGlzIHVwZGF0ZWQgb24gZWFjaCBkZXBsb3ltZW50XG4gICAgICB0aW1lc3RhbXA6IERhdGUubm93KCkudG9TdHJpbmcoKSxcbiAgICB9XG5cbiAgICBpZiAoaXNEc3FsKSB7XG4gICAgICAvLyBGb3IgRFNRTCwgY29uc3RydWN0IHRoZSBlbmRwb2ludCBmcm9tIGNsdXN0ZXIgSUQgYW5kIHJlZ2lvblxuICAgICAgLy8gRFNRTCBlbmRwb2ludCBmb3JtYXQ6ICR7Y2x1c3RlcklkfS5kc3FsLiR7cmVnaW9ufS5vbi5hd3NcbiAgICAgIGNvbnN0IGRzcWxDbHVzdGVyID0gcHJvcHMuY2x1c3RlciBhcyBkc3FsLkNmbkNsdXN0ZXJcbiAgICAgIGNvbnN0IGNsdXN0ZXJJZCA9IGRzcWxDbHVzdGVyLmF0dHJJZGVudGlmaWVyXG4gICAgICBjb25zdCByZWdpb24gPSBTdGFjay5vZih0aGlzKS5yZWdpb25cbiAgICAgIGN1c3RvbVJlc291cmNlUHJvcGVydGllcy5lbmRwb2ludCA9IGAke2NsdXN0ZXJJZH0uZHNxbC4ke3JlZ2lvbn0ub24uYXdzYFxuICAgICAgY3VzdG9tUmVzb3VyY2VQcm9wZXJ0aWVzLnBvcnQgPSBcIjU0MzJcIlxuICAgIH0gZWxzZSB7XG4gICAgICBjdXN0b21SZXNvdXJjZVByb3BlcnRpZXMuc2VjcmV0QXJuID0gcHJvcHMuZGJTZWNyZXQhLnNlY3JldEFyblxuICAgIH1cblxuICAgIHRoaXMucmVzb3VyY2UgPSBuZXcgQ3VzdG9tUmVzb3VyY2UodGhpcywgXCJDdXN0b21SZXNvdXJjZVwiLCB7XG4gICAgICBzZXJ2aWNlVG9rZW46IHByb3ZpZGVyLnNlcnZpY2VUb2tlbixcbiAgICAgIHByb3BlcnRpZXM6IGN1c3RvbVJlc291cmNlUHJvcGVydGllcyxcbiAgICB9KVxuXG4gICAgY29uc3QgcmVzb3VyY2VDZm4gPSB0aGlzLnJlc291cmNlLm5vZGUuZGVmYXVsdENoaWxkIGFzIENmblJlc291cmNlXG4gICAgcmVzb3VyY2VDZm4uYWRkUHJvcGVydHlPdmVycmlkZShcIlNlcnZpY2VUaW1lb3V0XCIsIDkwMClcblxuICAgIC8vIEFkZCBkZXBlbmRlbmN5IHRvIGVuc3VyZSBkYXRhYmFzZSBpcyBjcmVhdGVkIGJlZm9yZSBtaWdyYXRpb25zIHJ1blxuICAgIGlmIChwcm9wcy5jbHVzdGVyKSB7XG4gICAgICB0aGlzLnJlc291cmNlLm5vZGUuYWRkRGVwZW5kZW5jeShwcm9wcy5jbHVzdGVyKVxuICAgIH1cbiAgfVxufVxuIl19