cdk-drizzle-migrate 1.0.1 → 2.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.
- package/.jsii +244 -92
- package/API.md +32 -26
- package/CLAUDE.md +79 -0
- package/README.md +20 -6
- package/lib/drizzle-migrate-provider.d.ts +15 -7
- package/lib/drizzle-migrate-provider.js +82 -25
- package/lib/handler/handler.js +23300 -15071
- package/node_modules/@types/aws-lambda/README.md +1 -1
- package/node_modules/@types/aws-lambda/handler.d.ts +96 -0
- package/node_modules/@types/aws-lambda/package.json +3 -3
- package/node_modules/@types/aws-lambda/trigger/cloudfront-response.d.ts +8 -6
- package/node_modules/@types/aws-lambda/trigger/cognito-user-pool-trigger/index.d.ts +2 -0
- package/node_modules/@types/aws-lambda/trigger/cognito-user-pool-trigger/pre-token-generation-v3.d.ts +50 -0
- package/node_modules/@types/aws-lambda/trigger/guard-duty-event-notification.d.ts +1 -1
- package/package.json +30 -25
package/API.md
CHANGED
|
@@ -161,24 +161,12 @@ const drizzleMigrateProps: DrizzleMigrateProps = { ... }
|
|
|
161
161
|
|
|
162
162
|
| **Name** | **Type** | **Description** |
|
|
163
163
|
| --- | --- | --- |
|
|
164
|
-
| <code><a href="#cdk-drizzle-migrate.DrizzleMigrateProps.property.dbSecret">dbSecret</a></code> | <code>aws-cdk-lib.aws_secretsmanager.ISecret</code> | The database secret containing connection details Must contain standard CDK database secret properties: username, password, host, port, engine, etc. |
|
|
165
164
|
| <code><a href="#cdk-drizzle-migrate.DrizzleMigrateProps.property.migrationsPath">migrationsPath</a></code> | <code>string</code> | The path to the migrations directory This directory will be bundled with the Lambda function. |
|
|
166
|
-
| <code><a href="#cdk-drizzle-migrate.DrizzleMigrateProps.property.
|
|
167
|
-
| <code><a href="#cdk-drizzle-migrate.DrizzleMigrateProps.property.
|
|
165
|
+
| <code><a href="#cdk-drizzle-migrate.DrizzleMigrateProps.property.cluster">cluster</a></code> | <code>aws-cdk-lib.aws_rds.IDatabaseCluster \| aws-cdk-lib.aws_rds.IDatabaseInstance \| aws-cdk-lib.aws_dsql.CfnCluster</code> | Optional database cluster or instance Supports both traditional RDS/Aurora clusters and DSQL clusters - For RDS/Aurora: security groups will be configured to allow access - For DSQL: IAM authentication will be used instead of secrets. |
|
|
166
|
+
| <code><a href="#cdk-drizzle-migrate.DrizzleMigrateProps.property.dbSecret">dbSecret</a></code> | <code>aws-cdk-lib.aws_secretsmanager.ISecret</code> | The database secret containing connection details Must contain standard CDK database secret properties: username, password, host, port, engine, etc. |
|
|
168
167
|
| <code><a href="#cdk-drizzle-migrate.DrizzleMigrateProps.property.handlerProps">handlerProps</a></code> | <code>aws-cdk-lib.aws_lambda_nodejs.NodejsFunctionProps</code> | Optional properties to customize the Lambda function Excludes runtime, entry, and handler which are managed by the construct. |
|
|
169
|
-
| <code><a href="#cdk-drizzle-migrate.DrizzleMigrateProps.property.
|
|
170
|
-
|
|
171
|
-
---
|
|
172
|
-
|
|
173
|
-
##### `dbSecret`<sup>Required</sup> <a name="dbSecret" id="cdk-drizzle-migrate.DrizzleMigrateProps.property.dbSecret"></a>
|
|
174
|
-
|
|
175
|
-
```typescript
|
|
176
|
-
public readonly dbSecret: ISecret;
|
|
177
|
-
```
|
|
178
|
-
|
|
179
|
-
- *Type:* aws-cdk-lib.aws_secretsmanager.ISecret
|
|
180
|
-
|
|
181
|
-
The database secret containing connection details Must contain standard CDK database secret properties: username, password, host, port, engine, etc.
|
|
168
|
+
| <code><a href="#cdk-drizzle-migrate.DrizzleMigrateProps.property.vpc">vpc</a></code> | <code>aws-cdk-lib.aws_ec2.IVpc</code> | The VPC where the Lambda function will be deployed Required when your database is only accessible in a VPC. |
|
|
169
|
+
| <code><a href="#cdk-drizzle-migrate.DrizzleMigrateProps.property.vpcSubnets">vpcSubnets</a></code> | <code>aws-cdk-lib.aws_ec2.SubnetSelection</code> | Optional subnet selection to deploy the Lambda function Only used when vpc is specified. |
|
|
182
170
|
|
|
183
171
|
---
|
|
184
172
|
|
|
@@ -194,28 +182,31 @@ The path to the migrations directory This directory will be bundled with the Lam
|
|
|
194
182
|
|
|
195
183
|
---
|
|
196
184
|
|
|
197
|
-
##### `
|
|
185
|
+
##### `cluster`<sup>Optional</sup> <a name="cluster" id="cdk-drizzle-migrate.DrizzleMigrateProps.property.cluster"></a>
|
|
198
186
|
|
|
199
187
|
```typescript
|
|
200
|
-
public readonly
|
|
188
|
+
public readonly cluster: IDatabaseCluster | IDatabaseInstance | CfnCluster;
|
|
201
189
|
```
|
|
202
190
|
|
|
203
|
-
- *Type:* aws-cdk-lib.
|
|
191
|
+
- *Type:* aws-cdk-lib.aws_rds.IDatabaseCluster | aws-cdk-lib.aws_rds.IDatabaseInstance | aws-cdk-lib.aws_dsql.CfnCluster
|
|
192
|
+
- *Default:* No database connection is configured
|
|
204
193
|
|
|
205
|
-
|
|
194
|
+
Optional database cluster or instance Supports both traditional RDS/Aurora clusters and DSQL clusters - For RDS/Aurora: security groups will be configured to allow access - For DSQL: IAM authentication will be used instead of secrets.
|
|
206
195
|
|
|
207
196
|
---
|
|
208
197
|
|
|
209
|
-
##### `
|
|
198
|
+
##### `dbSecret`<sup>Optional</sup> <a name="dbSecret" id="cdk-drizzle-migrate.DrizzleMigrateProps.property.dbSecret"></a>
|
|
210
199
|
|
|
211
200
|
```typescript
|
|
212
|
-
public readonly
|
|
201
|
+
public readonly dbSecret: ISecret;
|
|
213
202
|
```
|
|
214
203
|
|
|
215
|
-
- *Type:* aws-cdk-lib.
|
|
216
|
-
- *Default:*
|
|
204
|
+
- *Type:* aws-cdk-lib.aws_secretsmanager.ISecret
|
|
205
|
+
- *Default:* undefined for DSQL clusters using IAM authentication
|
|
217
206
|
|
|
218
|
-
|
|
207
|
+
The database secret containing connection details Must contain standard CDK database secret properties: username, password, host, port, engine, etc.
|
|
208
|
+
|
|
209
|
+
Not required when relying on IAM authentication (such as DSQL).
|
|
219
210
|
|
|
220
211
|
---
|
|
221
212
|
|
|
@@ -232,6 +223,21 @@ Optional properties to customize the Lambda function Excludes runtime, entry, an
|
|
|
232
223
|
|
|
233
224
|
---
|
|
234
225
|
|
|
226
|
+
##### `vpc`<sup>Optional</sup> <a name="vpc" id="cdk-drizzle-migrate.DrizzleMigrateProps.property.vpc"></a>
|
|
227
|
+
|
|
228
|
+
```typescript
|
|
229
|
+
public readonly vpc: IVpc;
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
- *Type:* aws-cdk-lib.aws_ec2.IVpc
|
|
233
|
+
- *Default:* use VPC of your RDS/Aurora cluster
|
|
234
|
+
|
|
235
|
+
The VPC where the Lambda function will be deployed Required when your database is only accessible in a VPC.
|
|
236
|
+
|
|
237
|
+
Not required for DSQL as it uses public endpoints with IAM authentication
|
|
238
|
+
|
|
239
|
+
---
|
|
240
|
+
|
|
235
241
|
##### `vpcSubnets`<sup>Optional</sup> <a name="vpcSubnets" id="cdk-drizzle-migrate.DrizzleMigrateProps.property.vpcSubnets"></a>
|
|
236
242
|
|
|
237
243
|
```typescript
|
|
@@ -241,7 +247,7 @@ public readonly vpcSubnets: SubnetSelection;
|
|
|
241
247
|
- *Type:* aws-cdk-lib.aws_ec2.SubnetSelection
|
|
242
248
|
- *Default:* PRIVATE_WITH_EGRESS subnets
|
|
243
249
|
|
|
244
|
-
Optional subnet selection to deploy the Lambda function.
|
|
250
|
+
Optional subnet selection to deploy the Lambda function Only used when vpc is specified.
|
|
245
251
|
|
|
246
252
|
---
|
|
247
253
|
|
package/CLAUDE.md
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
# CLAUDE.md
|
|
2
|
+
|
|
3
|
+
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
|
|
4
|
+
|
|
5
|
+
## Project Overview
|
|
6
|
+
|
|
7
|
+
This is a Projen managed AWS CDK construct library that enables
|
|
8
|
+
running Drizzle ORM migrations against RDS clusters at deploy time. It
|
|
9
|
+
supports PostgreSQL, MariaDB, and MySQL engines and is designed for
|
|
10
|
+
enterprise environments with isolated subnets.
|
|
11
|
+
|
|
12
|
+
## Development Commands
|
|
13
|
+
|
|
14
|
+
- **Build**: `npx projen build` - Compiles TypeScript and runs all build steps
|
|
15
|
+
- **Test**: `npx projen test` - Runs Jest tests and synthesizes integration stacks
|
|
16
|
+
- **Lint**: `npx projen eslint` - Runs ESLint on source files
|
|
17
|
+
- **Format**: `npx projen format` - Formats code with Prettier
|
|
18
|
+
|
|
19
|
+
### Lambda Handler Development
|
|
20
|
+
|
|
21
|
+
When modifying the Lambda handler code in `lambda/handler.ts`:
|
|
22
|
+
|
|
23
|
+
1. Transpile to JavaScript: `npx projen build:handler`
|
|
24
|
+
2. This generates `src/handler/handler.js` which is used by the CDK construct
|
|
25
|
+
3. The build automatically runs before compilation via pre-compile hook
|
|
26
|
+
|
|
27
|
+
### Unit testing
|
|
28
|
+
|
|
29
|
+
- Run unit tests: `npx jest test/drizzle-migration.test.ts`
|
|
30
|
+
- Run a single test: `npx jest test/drizzle-migrate.test.ts --no-coverage -t "creates resources"`
|
|
31
|
+
|
|
32
|
+
### Integration Testing
|
|
33
|
+
|
|
34
|
+
The project has three integration test stacks for different database engines:
|
|
35
|
+
|
|
36
|
+
- **PostgreSQL**: `npx projen integ:deploy:postgres`, `npx projen integ:destroy:postgres`
|
|
37
|
+
- **MariaDB**: `npx projen integ:deploy:mariadb`, `npx projen integ:destroy:mariadb`
|
|
38
|
+
- **Aurora Serverless**: `npx projen integ:deploy:serverless`, `npx projen integ:destroy:serverless`
|
|
39
|
+
|
|
40
|
+
Generate migrations for integration tests:
|
|
41
|
+
- `npx projen integ:generate-migrations:postgres`
|
|
42
|
+
- `npx projen integ:generate-migrations:mariadb`
|
|
43
|
+
- `npx projen integ:generate-migrations:serverless`
|
|
44
|
+
|
|
45
|
+
Synthesize all integration stacks: `npx projen integ:synth:all`
|
|
46
|
+
|
|
47
|
+
## Architecture
|
|
48
|
+
|
|
49
|
+
### Core Components
|
|
50
|
+
|
|
51
|
+
- **DrizzleMigrate** (`src/drizzle-migrate-provider.ts`): Main CDK construct that creates a Lambda function to run migrations
|
|
52
|
+
- **Lambda Handler** (`lambda/handler.ts`): Runtime code that connects to RDS and executes Drizzle migrations
|
|
53
|
+
- **Integration Tests** (`integ/`): Three separate CDK apps testing different database engines
|
|
54
|
+
|
|
55
|
+
### Key Design Patterns
|
|
56
|
+
|
|
57
|
+
1. **Handler Bundling**: The Lambda handler is transpiled from TypeScript to JavaScript using esbuild and bundled with the construct to avoid Node.js dependency issues
|
|
58
|
+
|
|
59
|
+
2. **Security Groups**: If a database cluster/instance is passed to the construct, it automatically configures security group rules to allow Lambda access
|
|
60
|
+
|
|
61
|
+
3. **Multi-Engine Support**: The handler detects database engine from the secret and uses appropriate Drizzle drivers (postgres-js, mysql2)
|
|
62
|
+
|
|
63
|
+
4. **Migration Path Bundling**: The specified migrations directory is bundled with the Lambda function and read at runtime
|
|
64
|
+
|
|
65
|
+
### Dependencies
|
|
66
|
+
|
|
67
|
+
- Uses Projen for project configuration and task management
|
|
68
|
+
- CDK v2
|
|
69
|
+
- Drizzle ORM and drizzle-kit for database operations
|
|
70
|
+
- esbuild for Lambda handler transpilation
|
|
71
|
+
- Jest for testing with integration stack synthesis
|
|
72
|
+
|
|
73
|
+
## File Structure
|
|
74
|
+
|
|
75
|
+
- `src/` - CDK construct source code
|
|
76
|
+
- `lambda/` - Lambda handler source (TypeScript)
|
|
77
|
+
- `src/handler/` - Generated JavaScript handler (do not edit directly)
|
|
78
|
+
- `integ/` - Integration test CDK applications
|
|
79
|
+
- `test/` - Unit tests
|
package/README.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# About
|
|
2
2
|
|
|
3
3
|
This CDK construct library makes it possible to run the drizzle
|
|
4
|
-
migrate at deploy of your stack time against the RDS cluster of your
|
|
4
|
+
migrate at deploy of your stack time against the RDS or DSQL cluster of your
|
|
5
5
|
choice. The supported engines are PostgreSQL, MariaDB and MySQL.
|
|
6
6
|
|
|
7
7
|
This construct library is intended to be used in enterprise
|
|
@@ -31,6 +31,8 @@ actually want to create migrations.
|
|
|
31
31
|
|
|
32
32
|
# Usage
|
|
33
33
|
|
|
34
|
+
## RDS and Aurora
|
|
35
|
+
|
|
34
36
|
Have an RDS database and a secret that stores your db
|
|
35
37
|
credentials. Usually this will be the root secret for your RDS
|
|
36
38
|
database:
|
|
@@ -64,6 +66,17 @@ Your secret should look like the standard one created by CDK:
|
|
|
64
66
|
}
|
|
65
67
|
```
|
|
66
68
|
|
|
69
|
+
## DSQL
|
|
70
|
+
|
|
71
|
+
For DSQL there is no secret where credentials are stored. Only IAM
|
|
72
|
+
access is supported.
|
|
73
|
+
|
|
74
|
+
Drizzle doesn't really support DSQL, so if you create migrations you
|
|
75
|
+
will often need to tweak them manually as so little of postgresql is
|
|
76
|
+
supported.
|
|
77
|
+
|
|
78
|
+
## Migrations
|
|
79
|
+
|
|
67
80
|
Specify the path where the migrations are stored, `migrations` in this case.
|
|
68
81
|
|
|
69
82
|
When this resource is deployed, it will run `drizzle-kit migrate` for
|
|
@@ -80,9 +93,9 @@ security group if no security group is present in
|
|
|
80
93
|
If you do not pass a cluster, make sure to pass in a security group in
|
|
81
94
|
`handlerProps.securityGroups` which can connect to your database.
|
|
82
95
|
|
|
83
|
-
Also if you do not pass a cluster
|
|
84
|
-
you may wish to add a dependency to make sure the database
|
|
85
|
-
before the migration is run:
|
|
96
|
+
Also if you do not pass a cluster, but you still want to create a
|
|
97
|
+
database, you may wish to add a dependency to make sure the database
|
|
98
|
+
is created, before the migration is run:
|
|
86
99
|
|
|
87
100
|
```ts
|
|
88
101
|
migrator.resource.node.addDependency(cluster)
|
|
@@ -95,14 +108,15 @@ migrator.resource.node.addDependency(cluster)
|
|
|
95
108
|
|
|
96
109
|
# Working on this code
|
|
97
110
|
|
|
98
|
-
1. Install packages: `npm
|
|
111
|
+
1. Install packages: `npm ci`
|
|
99
112
|
|
|
100
113
|
2. Bootstrap CDK if not done: `npx cdk bootstrap
|
|
101
114
|
aws://123456/us-east-1`. Replace 123456 with your AWS account.
|
|
102
115
|
|
|
103
116
|
## Handler notes
|
|
104
117
|
|
|
105
|
-
When making changes to the Lambda handler code in `lambda/index.ts`,
|
|
118
|
+
When making changes to the Lambda handler code in `lambda/index.ts`,
|
|
119
|
+
you need to transpile it to JavaScript:
|
|
106
120
|
|
|
107
121
|
```bash
|
|
108
122
|
npx projen build:handler
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { CustomResource } from "aws-cdk-lib";
|
|
2
|
+
import * as dsql from "aws-cdk-lib/aws-dsql";
|
|
2
3
|
import * as ec2 from "aws-cdk-lib/aws-ec2";
|
|
3
4
|
import { NodejsFunction, NodejsFunctionProps } from "aws-cdk-lib/aws-lambda-nodejs";
|
|
4
5
|
import * as rds from "aws-cdk-lib/aws-rds";
|
|
@@ -10,9 +11,12 @@ import { Construct } from "constructs";
|
|
|
10
11
|
export interface DrizzleMigrateProps {
|
|
11
12
|
/**
|
|
12
13
|
* The database secret containing connection details
|
|
13
|
-
* Must contain standard CDK database secret properties: username,
|
|
14
|
+
* Must contain standard CDK database secret properties: username,
|
|
15
|
+
* password, host, port, engine, etc.
|
|
16
|
+
* Not required when relying on IAM authentication (such as DSQL).
|
|
17
|
+
* @default - undefined for DSQL clusters using IAM authentication
|
|
14
18
|
*/
|
|
15
|
-
readonly dbSecret
|
|
19
|
+
readonly dbSecret?: secretsmanager.ISecret;
|
|
16
20
|
/**
|
|
17
21
|
* The path to the migrations directory
|
|
18
22
|
* This directory will be bundled with the Lambda function
|
|
@@ -26,21 +30,25 @@ export interface DrizzleMigrateProps {
|
|
|
26
30
|
readonly handlerProps?: NodejsFunctionProps;
|
|
27
31
|
/**
|
|
28
32
|
* The VPC where the Lambda function will be deployed
|
|
29
|
-
* Required
|
|
33
|
+
* Required when your database is only accessible in a VPC.
|
|
34
|
+
* Not required for DSQL as it uses public endpoints with IAM authentication
|
|
35
|
+
* @default - use VPC of your RDS/Aurora cluster
|
|
30
36
|
*/
|
|
31
|
-
readonly vpc
|
|
37
|
+
readonly vpc?: ec2.IVpc;
|
|
32
38
|
/**
|
|
33
39
|
* Optional subnet selection to deploy the Lambda function
|
|
40
|
+
* Only used when vpc is specified
|
|
34
41
|
* @default - PRIVATE_WITH_EGRESS subnets
|
|
35
42
|
*/
|
|
36
43
|
readonly vpcSubnets?: ec2.SubnetSelection;
|
|
37
44
|
/**
|
|
38
45
|
* Optional database cluster or instance
|
|
39
|
-
*
|
|
40
|
-
* configured to allow access
|
|
46
|
+
* Supports both traditional RDS/Aurora clusters and DSQL clusters
|
|
47
|
+
* - For RDS/Aurora: security groups will be configured to allow access
|
|
48
|
+
* - For DSQL: IAM authentication will be used instead of secrets
|
|
41
49
|
* @default - No database connection is configured
|
|
42
50
|
*/
|
|
43
|
-
readonly cluster?: rds.IDatabaseCluster | rds.IDatabaseInstance;
|
|
51
|
+
readonly cluster?: rds.IDatabaseCluster | rds.IDatabaseInstance | dsql.CfnCluster;
|
|
44
52
|
}
|
|
45
53
|
/**
|
|
46
54
|
* A custom resource that runs Drizzle migrations
|
|
@@ -7,46 +7,78 @@ const assert_1 = require("assert");
|
|
|
7
7
|
const fs_1 = require("fs");
|
|
8
8
|
const path = require("path");
|
|
9
9
|
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
10
|
+
const dsql = require("aws-cdk-lib/aws-dsql");
|
|
11
|
+
const iam = require("aws-cdk-lib/aws-iam");
|
|
10
12
|
const lambda = require("aws-cdk-lib/aws-lambda");
|
|
11
13
|
const aws_lambda_nodejs_1 = require("aws-cdk-lib/aws-lambda-nodejs");
|
|
12
14
|
const logs = require("aws-cdk-lib/aws-logs");
|
|
13
15
|
const cr = require("aws-cdk-lib/custom-resources");
|
|
14
16
|
const constructs_1 = require("constructs");
|
|
17
|
+
/**
|
|
18
|
+
* Helper function to determine if a cluster is a DSQL cluster
|
|
19
|
+
*/
|
|
20
|
+
function isDsqlCluster(cluster) {
|
|
21
|
+
return cluster instanceof dsql.CfnCluster;
|
|
22
|
+
}
|
|
15
23
|
/**
|
|
16
24
|
* A custom resource that runs Drizzle migrations
|
|
17
25
|
*/
|
|
18
26
|
class DrizzleMigrate extends constructs_1.Construct {
|
|
19
27
|
constructor(scope, id, props) {
|
|
20
28
|
super(scope, id);
|
|
29
|
+
// Validate configuration
|
|
30
|
+
const isDsql = props.cluster && isDsqlCluster(props.cluster);
|
|
31
|
+
if (!isDsql && !props.dbSecret) {
|
|
32
|
+
throw new Error("Either dbSecret (for traditional RDS) or cluster with DSQL must be provided");
|
|
33
|
+
}
|
|
34
|
+
if (!isDsql && !props.vpc) {
|
|
35
|
+
throw new Error("VPC is required for traditional RDS databases");
|
|
36
|
+
}
|
|
37
|
+
if (isDsql && props.dbSecret) {
|
|
38
|
+
throw new Error("dbSecret should not be provided when using DSQL cluster (uses IAM authentication)");
|
|
39
|
+
}
|
|
21
40
|
const migrationsDir = path.join(process.cwd(), props.migrationsPath);
|
|
22
41
|
(0, assert_1.strict)((0, fs_1.existsSync)(migrationsDir), `Migrations directory ${migrationsDir} does not exist`);
|
|
23
42
|
const handlerDir = path.join(__dirname, "handler");
|
|
24
43
|
const ts_filename = path.join(handlerDir, "index.ts");
|
|
25
44
|
const js_filename = path.join(handlerDir, "index.js");
|
|
26
45
|
const entry = (0, fs_1.existsSync)(ts_filename) ? ts_filename : js_filename;
|
|
46
|
+
const environment = {
|
|
47
|
+
NO_COLOR: "1",
|
|
48
|
+
...(props.handlerProps?.environment || {}),
|
|
49
|
+
};
|
|
50
|
+
// Create explicit log group for the Lambda handler
|
|
51
|
+
const logGroup = new logs.LogGroup(this, "MigrateHandlerLogGroup", {
|
|
52
|
+
retention: logs.RetentionDays.ONE_WEEK,
|
|
53
|
+
// Keep log group, it's annoying when it gets deleted for new
|
|
54
|
+
// deploys, and something has gone wrong. You have no way to
|
|
55
|
+
// look at the logs in that case.
|
|
56
|
+
removalPolicy: aws_cdk_lib_1.RemovalPolicy.RETAIN,
|
|
57
|
+
});
|
|
27
58
|
const onEventHandler = new aws_lambda_nodejs_1.NodejsFunction(this, "MigrateHandler", {
|
|
28
59
|
runtime: lambda.Runtime.NODEJS_20_X,
|
|
29
60
|
entry: entry,
|
|
30
|
-
|
|
61
|
+
logGroup: logGroup,
|
|
62
|
+
loggingFormat: lambda.LoggingFormat.JSON,
|
|
63
|
+
applicationLogLevelV2: lambda.ApplicationLogLevel.INFO,
|
|
31
64
|
timeout: aws_cdk_lib_1.Duration.minutes(5),
|
|
32
65
|
vpc: props.vpc,
|
|
33
66
|
vpcSubnets: props.vpcSubnets,
|
|
34
67
|
...props.handlerProps,
|
|
35
|
-
environment
|
|
36
|
-
NO_COLOR: "1",
|
|
37
|
-
...(props.handlerProps?.environment || {}),
|
|
38
|
-
},
|
|
68
|
+
environment,
|
|
39
69
|
bundling: {
|
|
40
70
|
sourceMap: false,
|
|
41
71
|
// Include the migrations directory in the bundle
|
|
42
72
|
commandHooks: {
|
|
43
73
|
beforeBundling(_, outputDir) {
|
|
44
|
-
|
|
74
|
+
const commands = [
|
|
45
75
|
`cp ${handlerDir}/handler.js ${outputDir}`,
|
|
46
76
|
`cp -r ${migrationsDir} ${path.join(outputDir, "migrations")}`,
|
|
77
|
+
// Always download RDS certificate for SSL connections (both RDS and DSQL need it)
|
|
47
78
|
`mkdir -p ${path.join(outputDir, "certs")}`,
|
|
48
79
|
`curl --silent -fL https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem -o ${path.join(outputDir, "certs", "global-bundle.pem")}`,
|
|
49
80
|
];
|
|
81
|
+
return commands;
|
|
50
82
|
},
|
|
51
83
|
afterBundling() {
|
|
52
84
|
return [];
|
|
@@ -58,30 +90,55 @@ class DrizzleMigrate extends constructs_1.Construct {
|
|
|
58
90
|
...props.handlerProps?.bundling,
|
|
59
91
|
},
|
|
60
92
|
});
|
|
61
|
-
//
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
93
|
+
// Handle database connection setup
|
|
94
|
+
if (isDsql) {
|
|
95
|
+
// For DSQL, grant IAM permissions instead of VPC security groups
|
|
96
|
+
const dsqlCluster = props.cluster;
|
|
97
|
+
onEventHandler.addToRolePolicy(new iam.PolicyStatement({
|
|
98
|
+
effect: iam.Effect.ALLOW,
|
|
99
|
+
actions: ["dsql:DbConnectAdmin"],
|
|
100
|
+
resources: [dsqlCluster.attrResourceArn],
|
|
101
|
+
}));
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
// Traditional RDS setup with security groups
|
|
105
|
+
if (props.cluster &&
|
|
106
|
+
(!props.handlerProps ||
|
|
107
|
+
typeof props.handlerProps.securityGroups === "undefined" ||
|
|
108
|
+
props.handlerProps.securityGroups.length === 0)) {
|
|
109
|
+
const rdsCluster = props.cluster;
|
|
110
|
+
rdsCluster.connections.allowDefaultPortFrom(onEventHandler.connections, "Allow drizzle migrate lambda to connect to db");
|
|
111
|
+
}
|
|
112
|
+
// Grant the Lambda function permission to read the secret
|
|
113
|
+
props.dbSecret.grantRead(onEventHandler);
|
|
68
114
|
}
|
|
69
115
|
this.handler = onEventHandler;
|
|
70
|
-
// Grant the Lambda function permission to read the secret
|
|
71
|
-
props.dbSecret.grantRead(onEventHandler);
|
|
72
116
|
const provider = new cr.Provider(this, "Provider", {
|
|
73
117
|
onEventHandler,
|
|
74
|
-
|
|
118
|
+
logGroup,
|
|
75
119
|
});
|
|
120
|
+
// Build custom resource properties based on database type
|
|
121
|
+
const customResourceProperties = {
|
|
122
|
+
// We're now using a fixed path inside the Lambda bundle
|
|
123
|
+
migrationsPath: "migrations",
|
|
124
|
+
// Adding a timestamp ensures the resource is updated on each deployment
|
|
125
|
+
timestamp: Date.now().toString(),
|
|
126
|
+
};
|
|
127
|
+
if (isDsql) {
|
|
128
|
+
// For DSQL, construct the endpoint from cluster ID and region
|
|
129
|
+
// DSQL endpoint format: ${clusterId}.dsql.${region}.on.aws
|
|
130
|
+
const dsqlCluster = props.cluster;
|
|
131
|
+
const clusterId = dsqlCluster.attrIdentifier;
|
|
132
|
+
const region = aws_cdk_lib_1.Stack.of(this).region;
|
|
133
|
+
customResourceProperties.endpoint = `${clusterId}.dsql.${region}.on.aws`;
|
|
134
|
+
customResourceProperties.port = "5432";
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
customResourceProperties.secretArn = props.dbSecret.secretArn;
|
|
138
|
+
}
|
|
76
139
|
this.resource = new aws_cdk_lib_1.CustomResource(this, "CustomResource", {
|
|
77
140
|
serviceToken: provider.serviceToken,
|
|
78
|
-
properties:
|
|
79
|
-
secretArn: props.dbSecret.secretArn,
|
|
80
|
-
// We're now using a fixed path inside the Lambda bundle
|
|
81
|
-
migrationsPath: "migrations",
|
|
82
|
-
// Adding a timestamp ensures the resource is updated on each deployment
|
|
83
|
-
timestamp: Date.now().toString(),
|
|
84
|
-
},
|
|
141
|
+
properties: customResourceProperties,
|
|
85
142
|
});
|
|
86
143
|
const resourceCfn = this.resource.node.defaultChild;
|
|
87
144
|
resourceCfn.addPropertyOverride("ServiceTimeout", 900);
|
|
@@ -93,5 +150,5 @@ class DrizzleMigrate extends constructs_1.Construct {
|
|
|
93
150
|
}
|
|
94
151
|
exports.DrizzleMigrate = DrizzleMigrate;
|
|
95
152
|
_a = JSII_RTTI_SYMBOL_1;
|
|
96
|
-
DrizzleMigrate[_a] = { fqn: "cdk-drizzle-migrate.DrizzleMigrate", version: "
|
|
97
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJpenpsZS1taWdyYXRlLXByb3ZpZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2RyaXp6bGUtbWlncmF0ZS1wcm92aWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLG1DQUF5QztBQUN6QywyQkFBK0I7QUFDL0IsNkJBQTRCO0FBQzVCLDZDQUFtRTtBQUVuRSxpREFBZ0Q7QUFDaEQscUVBQW1GO0FBQ25GLDZDQUE0QztBQUc1QyxtREFBa0Q7QUFDbEQsMkNBQXNDO0FBOEN0Qzs7R0FFRztBQUNILE1BQWEsY0FBZSxTQUFRLHNCQUFTO0lBVzNDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBMEI7UUFDbEUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQTtRQUVoQixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUE7UUFDcEUsSUFBQSxlQUFNLEVBQ0osSUFBQSxlQUFVLEVBQUMsYUFBYSxDQUFDLEVBQ3pCLHdCQUF3QixhQUFhLGlCQUFpQixDQUN2RCxDQUFBO1FBQ0QsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUE7UUFFbEQsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUE7UUFDckQsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUE7UUFDckQsTUFBTSxLQUFLLEdBQUcsSUFBQSxlQUFVLEVBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFBO1FBRWpFLE1BQU0sY0FBYyxHQUFHLElBQUksa0NBQWMsQ0FBQyxJQUFJLEVBQUUsZ0JBQWdCLEVBQUU7WUFD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Q0FBQztZQUNsQixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQ2pELENBQUM7SUFDSCxDQUFDOztBQXRHSCx3Q0F1R0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBzdHJpY3QgYXMgYXNzZXJ0IH0gZnJvbSBcImFzc2VydFwiXG5pbXBvcnQgeyBleGlzdHNTeW5jIH0gZnJvbSBcImZzXCJcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcInBhdGhcIlxuaW1wb3J0IHsgQ2ZuUmVzb3VyY2UsIEN1c3RvbVJlc291cmNlLCBEdXJhdGlvbiB9IGZyb20gXCJhd3MtY2RrLWxpYlwiXG5pbXBvcnQgKiBhcyBlYzIgZnJvbSBcImF3cy1jZGstbGliL2F3cy1lYzJcIlxuaW1wb3J0ICogYXMgbGFtYmRhIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbGFtYmRhXCJcbmltcG9ydCB7IE5vZGVqc0Z1bmN0aW9uLCBOb2RlanNGdW5jdGlvblByb3BzIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1sYW1iZGEtbm9kZWpzXCJcbmltcG9ydCAqIGFzIGxvZ3MgZnJvbSBcImF3cy1jZGstbGliL2F3cy1sb2dzXCJcbmltcG9ydCAqIGFzIHJkcyBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXJkc1wiXG5pbXBvcnQgKiBhcyBzZWNyZXRzbWFuYWdlciBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXNlY3JldHNtYW5hZ2VyXCJcbmltcG9ydCAqIGFzIGNyIGZyb20gXCJhd3MtY2RrLWxpYi9jdXN0b20tcmVzb3VyY2VzXCJcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCJcblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBEcml6emxlTWlncmF0ZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIERyaXp6bGVNaWdyYXRlUHJvcHMge1xuICAvKipcbiAgICogVGhlIGRhdGFiYXNlIHNlY3JldCBjb250YWluaW5nIGNvbm5lY3Rpb24gZGV0YWlsc1xuICAgKiBNdXN0IGNvbnRhaW4gc3RhbmRhcmQgQ0RLIGRhdGFiYXNlIHNlY3JldCBwcm9wZXJ0aWVzOiB1c2VybmFtZSwgcGFzc3dvcmQsIGhvc3QsIHBvcnQsIGVuZ2luZSwgZXRjLlxuICAgKi9cbiAgcmVhZG9ubHkgZGJTZWNyZXQ6IHNlY3JldHNtYW5hZ2VyLklTZWNyZXRcblxuICAvKipcbiAgICogVGhlIHBhdGggdG8gdGhlIG1pZ3JhdGlvbnMgZGlyZWN0b3J5XG4gICAqIFRoaXMgZGlyZWN0b3J5IHdpbGwgYmUgYnVuZGxlZCB3aXRoIHRoZSBMYW1iZGEgZnVuY3Rpb25cbiAgICovXG4gIHJlYWRvbmx5IG1pZ3JhdGlvbnNQYXRoOiBzdHJpbmdcblxuICAvKipcbiAgICogT3B0aW9uYWwgcHJvcGVydGllcyB0byBjdXN0b21pemUgdGhlIExhbWJkYSBmdW5jdGlvblxuICAgKiBFeGNsdWRlcyBydW50aW1lLCBlbnRyeSwgYW5kIGhhbmRsZXIgd2hpY2ggYXJlIG1hbmFnZWQgYnkgdGhlIGNvbnN0cnVjdFxuICAgKiBAZGVmYXVsdCAtIERlZmF1bHQgTGFtYmRhIGNvbmZpZ3VyYXRpb24gaXMgdXNlZFxuICAgKi9cbiAgcmVhZG9ubHkgaGFuZGxlclByb3BzPzogTm9kZWpzRnVuY3Rpb25Qcm9wc1xuXG4gIC8qKlxuICAgKiBUaGUgVlBDIHdoZXJlIHRoZSBMYW1iZGEgZnVuY3Rpb24gd2lsbCBiZSBkZXBsb3llZFxuICAgKiBSZXF1aXJlZCB0byBhbGxvdyB0aGUgTGFtYmRhIGZ1bmN0aW9uIHRvIGNvbm5lY3QgdG8gdGhlIGRhdGFiYXNlXG4gICAqL1xuICByZWFkb25seSB2cGM6IGVjMi5JVnBjXG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsIHN1Ym5ldCBzZWxlY3Rpb24gdG8gZGVwbG95IHRoZSBMYW1iZGEgZnVuY3Rpb25cbiAgICogQGRlZmF1bHQgLSBQUklWQVRFX1dJVEhfRUdSRVNTIHN1Ym5ldHNcbiAgICovXG4gIHJlYWRvbmx5IHZwY1N1Ym5ldHM/OiBlYzIuU3VibmV0U2VsZWN0aW9uXG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsIGRhdGFiYXNlIGNsdXN0ZXIgb3IgaW5zdGFuY2VcbiAgICogSWYgcHJvdmlkZWQgYW5kIGEgbmV3IHNlY3VyaXR5IGdyb3VwIGlzIGNyZWF0ZWQsIHRoZSBzZWN1cml0eSBncm91cCB3aWxsIGJlXG4gICAqIGNvbmZpZ3VyZWQgdG8gYWxsb3cgYWNjZXNzIHRvIHRoZSBkYXRhYmFzZVxuICAgKiBAZGVmYXVsdCAtIE5vIGRhdGFiYXNlIGNvbm5lY3Rpb24gaXMgY29uZmlndXJlZFxuICAgKi9cbiAgcmVhZG9ubHkgY2x1c3Rlcj86IHJkcy5JRGF0YWJhc2VDbHVzdGVyIHwgcmRzLklEYXRhYmFzZUluc3RhbmNlXG59XG5cbi8qKlxuICogQSBjdXN0b20gcmVzb3VyY2UgdGhhdCBydW5zIERyaXp6bGUgbWlncmF0aW9uc1xuICovXG5leHBvcnQgY2xhc3MgRHJpenpsZU1pZ3JhdGUgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICAvKipcbiAgICogVGhlIGN1c3RvbSByZXNvdXJjZSB0aGF0IHdhcyBjcmVhdGVkXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcmVzb3VyY2U6IEN1c3RvbVJlc291cmNlXG5cbiAgLyoqXG4gICAqIFRoZSBMYW1iZGEgZnVuY3Rpb24gdGhhdCBleGVjdXRlcyB0aGUgbWlncmF0aW9uc1xuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGhhbmRsZXI6IE5vZGVqc0Z1bmN0aW9uXG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IERyaXp6bGVNaWdyYXRlUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpXG5cbiAgICBjb25zdCBtaWdyYXRpb25zRGlyID0gcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIHByb3BzLm1pZ3JhdGlvbnNQYXRoKVxuICAgIGFzc2VydChcbiAgICAgIGV4aXN0c1N5bmMobWlncmF0aW9uc0RpciksXG4gICAgICBgTWlncmF0aW9ucyBkaXJlY3RvcnkgJHttaWdyYXRpb25zRGlyfSBkb2VzIG5vdCBleGlzdGBcbiAgICApXG4gICAgY29uc3QgaGFuZGxlckRpciA9IHBhdGguam9pbihfX2Rpcm5hbWUsIFwiaGFuZGxlclwiKVxuXG4gICAgY29uc3QgdHNfZmlsZW5hbWUgPSBwYXRoLmpvaW4oaGFuZGxlckRpciwgXCJpbmRleC50c1wiKVxuICAgIGNvbnN0IGpzX2ZpbGVuYW1lID0gcGF0aC5qb2luKGhhbmRsZXJEaXIsIFwiaW5kZXguanNcIilcbiAgICBjb25zdCBlbnRyeSA9IGV4aXN0c1N5bmModHNfZmlsZW5hbWUpID8gdHNfZmlsZW5hbWUgOiBqc19maWxlbmFtZVxuXG4gICAgY29uc3Qgb25FdmVudEhhbmRsZXIgPSBuZXcgTm9kZWpzRnVuY3Rpb24odGhpcywgXCJNaWdyYXRlSGFuZGxlclwiLCB7XG4gICAgICBydW50aW1lOiBsYW1iZGEuUnVudGltZS5OT0RFSlNfMjBfWCxcbiAgICAgIGVudHJ5OiBlbnRyeSxcbiAgICAgIGxvZ1JldGVudGlvbjogbG9ncy5SZXRlbnRpb25EYXlzLk9ORV9XRUVLLFxuICAgICAgdGltZW91dDogRHVyYXRpb24ubWludXRlcyg1KSxcbiAgICAgIHZwYzogcHJvcHMudnBjLFxuICAgICAgdnBjU3VibmV0czogcHJvcHMudnBjU3VibmV0cyxcbiAgICAgIC4uLnByb3BzLmhhbmRsZXJQcm9wcyxcbiAgICAgIGVudmlyb25tZW50OiB7XG4gICAgICAgIE5PX0NPTE9SOiBcIjFcIixcbiAgICAgICAgLi4uKHByb3BzLmhhbmRsZXJQcm9wcz8uZW52aXJvbm1lbnQgfHwge30pLFxuICAgICAgfSxcbiAgICAgIGJ1bmRsaW5nOiB7XG4gICAgICAgIHNvdXJjZU1hcDogZmFsc2UsXG4gICAgICAgIC8vIEluY2x1ZGUgdGhlIG1pZ3JhdGlvbnMgZGlyZWN0b3J5IGluIHRoZSBidW5kbGVcbiAgICAgICAgY29tbWFuZEhvb2tzOiB7XG4gICAgICAgICAgYmVmb3JlQnVuZGxpbmcoXzogc3RyaW5nLCBvdXRwdXREaXI6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgIGBjcCAke2hhbmRsZXJEaXJ9L2hhbmRsZXIuanMgJHtvdXRwdXREaXJ9YCxcbiAgICAgICAgICAgICAgYGNwIC1yICR7bWlncmF0aW9uc0Rpcn0gJHtwYXRoLmpvaW4ob3V0cHV0RGlyLCBcIm1pZ3JhdGlvbnNcIil9YCxcbiAgICAgICAgICAgICAgYG1rZGlyIC1wICR7cGF0aC5qb2luKG91dHB1dERpciwgXCJjZXJ0c1wiKX1gLFxuICAgICAgICAgICAgICBgY3VybCAtLXNpbGVudCAtZkwgaHR0cHM6Ly90cnVzdHN0b3JlLnBraS5yZHMuYW1hem9uYXdzLmNvbS9nbG9iYWwvZ2xvYmFsLWJ1bmRsZS5wZW0gLW8gJHtwYXRoLmpvaW4ob3V0cHV0RGlyLCBcImNlcnRzXCIsIFwiZ2xvYmFsLWJ1bmRsZS5wZW1cIil9YCxcbiAgICAgICAgICAgIF1cbiAgICAgICAgICB9LFxuICAgICAgICAgIGFmdGVyQnVuZGxpbmcoKTogc3RyaW5nW10ge1xuICAgICAgICAgICAgcmV0dXJuIFtdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBiZWZvcmVJbnN0YWxsKCk6IHN0cmluZ1tdIHtcbiAgICAgICAgICAgIHJldHVybiBbXVxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIC4uLnByb3BzLmhhbmRsZXJQcm9wcz8uYnVuZGxpbmcsXG4gICAgICB9LFxuICAgIH0pXG5cbiAgICAvLyBJZiB0aGUgdXNlciBnYXZlIHVzIGEgc2VjdXJpdHkgZ3JvdXAsIGFzc3VtZSBpdCBjYW4gY29ubmVjdCB0byB0aGUgZGF0YWJhc2UuXG4gICAgLy8gSWYgbm90LCBtYWtlIHN1cmUgdGhlIENESyBjcmVhdGVkIHNlY3VyaXR5IGdyb3VwIGFsbG93cyBhY2Nlc3MgdG8gdGhlIERCLlxuICAgIGlmIChcbiAgICAgIHByb3BzLmNsdXN0ZXIgJiZcbiAgICAgICghcHJvcHMuaGFuZGxlclByb3BzIHx8XG4gICAgICAgIHR5cGVvZiBwcm9wcy5oYW5kbGVyUHJvcHMuc2VjdXJpdHlHcm91cHMgPT09IFwidW5kZWZpbmVkXCIgfHxcbiAgICAgICAgcHJvcHMuaGFuZGxlclByb3BzLnNlY3VyaXR5R3JvdXBzLmxlbmd0aCA9PT0gMClcbiAgICApIHtcbiAgICAgIHByb3BzLmNsdXN0ZXIuY29ubmVjdGlvbnMuYWxsb3dEZWZhdWx0UG9ydEZyb20oXG4gICAgICAgIG9uRXZlbnRIYW5kbGVyLmNvbm5lY3Rpb25zLFxuICAgICAgICBcIkFsbG93IGRyaXp6bGUgbWlncmF0ZSBsYW1iZGEgdG8gY29ubmVjdCB0byBkYlwiXG4gICAgICApXG4gICAgfVxuXG4gICAgdGhpcy5oYW5kbGVyID0gb25FdmVudEhhbmRsZXJcblxuICAgIC8vIEdyYW50IHRoZSBMYW1iZGEgZnVuY3Rpb24gcGVybWlzc2lvbiB0byByZWFkIHRoZSBzZWNyZXRcbiAgICBwcm9wcy5kYlNlY3JldC5ncmFudFJlYWQob25FdmVudEhhbmRsZXIpXG5cbiAgICBjb25zdCBwcm92aWRlciA9IG5ldyBjci5Qcm92aWRlcih0aGlzLCBcIlByb3ZpZGVyXCIsIHtcbiAgICAgIG9uRXZlbnRIYW5kbGVyLFxuICAgICAgbG9nUmV0ZW50aW9uOiBsb2dzLlJldGVudGlvbkRheXMuT05FX1dFRUssXG4gICAgfSlcblxuICAgIHRoaXMucmVzb3VyY2UgPSBuZXcgQ3VzdG9tUmVzb3VyY2UodGhpcywgXCJDdXN0b21SZXNvdXJjZVwiLCB7XG4gICAgICBzZXJ2aWNlVG9rZW46IHByb3ZpZGVyLnNlcnZpY2VUb2tlbixcbiAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgc2VjcmV0QXJuOiBwcm9wcy5kYlNlY3JldC5zZWNyZXRBcm4sXG4gICAgICAgIC8vIFdlJ3JlIG5vdyB1c2luZyBhIGZpeGVkIHBhdGggaW5zaWRlIHRoZSBMYW1iZGEgYnVuZGxlXG4gICAgICAgIG1pZ3JhdGlvbnNQYXRoOiBcIm1pZ3JhdGlvbnNcIixcbiAgICAgICAgLy8gQWRkaW5nIGEgdGltZXN0YW1wIGVuc3VyZXMgdGhlIHJlc291cmNlIGlzIHVwZGF0ZWQgb24gZWFjaCBkZXBsb3ltZW50XG4gICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKS50b1N0cmluZygpLFxuICAgICAgfSxcbiAgICB9KVxuXG4gICAgY29uc3QgcmVzb3VyY2VDZm4gPSB0aGlzLnJlc291cmNlLm5vZGUuZGVmYXVsdENoaWxkIGFzIENmblJlc291cmNlXG4gICAgcmVzb3VyY2VDZm4uYWRkUHJvcGVydHlPdmVycmlkZShcIlNlcnZpY2VUaW1lb3V0XCIsIDkwMClcblxuICAgIC8vIEFkZCBkZXBlbmRlbmN5IHRvIGVuc3VyZSBkYXRhYmFzZSBpcyBjcmVhdGVkIGJlZm9yZSBtaWdyYXRpb25zIHJ1blxuICAgIGlmIChwcm9wcy5jbHVzdGVyKSB7XG4gICAgICB0aGlzLnJlc291cmNlLm5vZGUuYWRkRGVwZW5kZW5jeShwcm9wcy5jbHVzdGVyKVxuICAgIH1cbiAgfVxufVxuIl19
|
|
153
|
+
DrizzleMigrate[_a] = { fqn: "cdk-drizzle-migrate.DrizzleMigrate", version: "2.0.0" };
|
|
154
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJpenpsZS1taWdyYXRlLXByb3ZpZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2RyaXp6bGUtbWlncmF0ZS1wcm92aWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLG1DQUF5QztBQUN6QywyQkFBK0I7QUFDL0IsNkJBQTRCO0FBQzVCLDZDQUF5RjtBQUN6Riw2Q0FBNEM7QUFFNUMsMkNBQTBDO0FBQzFDLGlEQUFnRDtBQUNoRCxxRUFBbUY7QUFDbkYsNkNBQTRDO0FBRzVDLG1EQUFrRDtBQUNsRCwyQ0FBc0M7QUFFdEM7O0dBRUc7QUFDSCxTQUFTLGFBQWEsQ0FDcEIsT0FBdUU7SUFFdkUsT0FBTyxPQUFPLFlBQVksSUFBSSxDQUFDLFVBQVUsQ0FBQTtBQUMzQyxDQUFDO0FBcUREOztHQUVHO0FBQ0gsTUFBYSxjQUFlLFNBQVEsc0JBQVM7SUFXM0MsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUEwQjtRQUNsRSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFBO1FBRWhCLHlCQUF5QjtRQUN6QixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsT0FBTyxJQUFJLGFBQWEsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDNUQsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUMvQixNQUFNLElBQUksS0FBSyxDQUNiLDZFQUE2RSxDQUM5RSxDQUFBO1FBQ0gsQ0FBQztRQUNELElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDMUIsTUFBTSxJQUFJLEtBQUssQ0FBQywrQ0FBK0MsQ0FBQyxDQUFBO1FBQ2xFLENBQUM7UUFDRCxJQUFJLE1BQU0sSUFBSSxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDN0IsTUFBTSxJQUFJLEtBQUssQ0FDYixtRkFBbUYsQ0FDcEYsQ0FBQTtRQUNILENBQUM7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QztZQUNYLDhEQUE4RDtZQUM5RCwyREFBMkQ7WUFDM0QsTUFBTSxXQUFXLEdBQUcsS0FBSyxDQUFDLE9BQTBCLENBQUE7WUFDcEQsTUFBTSxTQUFTLEdBQUcsV0FBVyxDQUFDLGNBQWMsQ0FBQTtZQUM1QyxNQUFNLE1BQU0sR0FBRyxtQkFBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUE7WUFDcEMsd0JBQXdCLENBQUMsUUFBUSxHQUFHLEdBQUcsU0FBUyxTQUFTLE1BQU0sU0FBUyxDQUFBO1lBQ3hFLHdCQUF3QixDQUFDLElBQUksR0FBRyxNQUFNLENBQUE7UUFDeEMsQ0FBQzthQUFNLENBQUM7WUFDTix3QkFBd0IsQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDLFFBQVMsQ0FBQyxTQUFTLENBQUE7UUFDaEUsQ0FBQztRQUVELElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSw0QkFBYyxDQUFDLElBQUksRUFBRSxnQkFBZ0IsRUFBRTtZQUN6RCxZQUFZLEVBQUUsUUFBUSxDQUFDLFlBQVk7WUFDbkMsVUFBVSxFQUFFLHdCQUF3QjtTQUNyQyxDQUFDLENBQUE7UUFFRixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxZQUEyQixDQUFBO1FBQ2xFLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxnQkFBZ0IsRUFBRSxHQUFHLENBQUMsQ0FBQTtRQUV0RCxxRUFBcUU7UUFDckUsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDbEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUNqRCxDQUFDO0lBQ0gsQ0FBQzs7QUFqS0gsd0NBa0tDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgc3RyaWN0IGFzIGFzc2VydCB9IGZyb20gXCJhc3NlcnRcIlxuaW1wb3J0IHsgZXhpc3RzU3luYyB9IGZyb20gXCJmc1wiXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCJcbmltcG9ydCB7IENmblJlc291cmNlLCBDdXN0b21SZXNvdXJjZSwgRHVyYXRpb24sIFN0YWNrLCBSZW1vdmFsUG9saWN5IH0gZnJvbSBcImF3cy1jZGstbGliXCJcbmltcG9ydCAqIGFzIGRzcWwgZnJvbSBcImF3cy1jZGstbGliL2F3cy1kc3FsXCJcbmltcG9ydCAqIGFzIGVjMiBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVjMlwiXG5pbXBvcnQgKiBhcyBpYW0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1pYW1cIlxuaW1wb3J0ICogYXMgbGFtYmRhIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbGFtYmRhXCJcbmltcG9ydCB7IE5vZGVqc0Z1bmN0aW9uLCBOb2RlanNGdW5jdGlvblByb3BzIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1sYW1iZGEtbm9kZWpzXCJcbmltcG9ydCAqIGFzIGxvZ3MgZnJvbSBcImF3cy1jZGstbGliL2F3cy1sb2dzXCJcbmltcG9ydCAqIGFzIHJkcyBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXJkc1wiXG5pbXBvcnQgKiBhcyBzZWNyZXRzbWFuYWdlciBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXNlY3JldHNtYW5hZ2VyXCJcbmltcG9ydCAqIGFzIGNyIGZyb20gXCJhd3MtY2RrLWxpYi9jdXN0b20tcmVzb3VyY2VzXCJcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCJcblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGlmIGEgY2x1c3RlciBpcyBhIERTUUwgY2x1c3RlclxuICovXG5mdW5jdGlvbiBpc0RzcWxDbHVzdGVyKFxuICBjbHVzdGVyOiByZHMuSURhdGFiYXNlQ2x1c3RlciB8IHJkcy5JRGF0YWJhc2VJbnN0YW5jZSB8IGRzcWwuQ2ZuQ2x1c3RlclxuKTogY2x1c3RlciBpcyBkc3FsLkNmbkNsdXN0ZXIge1xuICByZXR1cm4gY2x1c3RlciBpbnN0YW5jZW9mIGRzcWwuQ2ZuQ2x1c3RlclxufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIERyaXp6bGVNaWdyYXRlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRHJpenpsZU1pZ3JhdGVQcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgZGF0YWJhc2Ugc2VjcmV0IGNvbnRhaW5pbmcgY29ubmVjdGlvbiBkZXRhaWxzXG4gICAqIE11c3QgY29udGFpbiBzdGFuZGFyZCBDREsgZGF0YWJhc2Ugc2VjcmV0IHByb3BlcnRpZXM6IHVzZXJuYW1lLFxuICAgKiBwYXNzd29yZCwgaG9zdCwgcG9ydCwgZW5naW5lLCBldGMuXG4gICAqIE5vdCByZXF1aXJlZCB3aGVuIHJlbHlpbmcgb24gSUFNIGF1dGhlbnRpY2F0aW9uIChzdWNoIGFzIERTUUwpLlxuICAgKiBAZGVmYXVsdCAtIHVuZGVmaW5lZCBmb3IgRFNRTCBjbHVzdGVycyB1c2luZyBJQU0gYXV0aGVudGljYXRpb25cbiAgICovXG4gIHJlYWRvbmx5IGRiU2VjcmV0Pzogc2VjcmV0c21hbmFnZXIuSVNlY3JldFxuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCB0byB0aGUgbWlncmF0aW9ucyBkaXJlY3RvcnlcbiAgICogVGhpcyBkaXJlY3Rvcnkgd2lsbCBiZSBidW5kbGVkIHdpdGggdGhlIExhbWJkYSBmdW5jdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgbWlncmF0aW9uc1BhdGg6IHN0cmluZ1xuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBwcm9wZXJ0aWVzIHRvIGN1c3RvbWl6ZSB0aGUgTGFtYmRhIGZ1bmN0aW9uXG4gICAqIEV4Y2x1ZGVzIHJ1bnRpbWUsIGVudHJ5LCBhbmQgaGFuZGxlciB3aGljaCBhcmUgbWFuYWdlZCBieSB0aGUgY29uc3RydWN0XG4gICAqIEBkZWZhdWx0IC0gRGVmYXVsdCBMYW1iZGEgY29uZmlndXJhdGlvbiBpcyB1c2VkXG4gICAqL1xuICByZWFkb25seSBoYW5kbGVyUHJvcHM/OiBOb2RlanNGdW5jdGlvblByb3BzXG5cbiAgLyoqXG4gICAqIFRoZSBWUEMgd2hlcmUgdGhlIExhbWJkYSBmdW5jdGlvbiB3aWxsIGJlIGRlcGxveWVkXG4gICAqIFJlcXVpcmVkIHdoZW4geW91ciBkYXRhYmFzZSBpcyBvbmx5IGFjY2Vzc2libGUgaW4gYSBWUEMuXG4gICAqIE5vdCByZXF1aXJlZCBmb3IgRFNRTCBhcyBpdCB1c2VzIHB1YmxpYyBlbmRwb2ludHMgd2l0aCBJQU0gYXV0aGVudGljYXRpb25cbiAgICogQGRlZmF1bHQgLSB1c2UgVlBDIG9mIHlvdXIgUkRTL0F1cm9yYSBjbHVzdGVyXG4gICAqL1xuICByZWFkb25seSB2cGM/OiBlYzIuSVZwY1xuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBzdWJuZXQgc2VsZWN0aW9uIHRvIGRlcGxveSB0aGUgTGFtYmRhIGZ1bmN0aW9uXG4gICAqIE9ubHkgdXNlZCB3aGVuIHZwYyBpcyBzcGVjaWZpZWRcbiAgICogQGRlZmF1bHQgLSBQUklWQVRFX1dJVEhfRUdSRVNTIHN1Ym5ldHNcbiAgICovXG4gIHJlYWRvbmx5IHZwY1N1Ym5ldHM/OiBlYzIuU3VibmV0U2VsZWN0aW9uXG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsIGRhdGFiYXNlIGNsdXN0ZXIgb3IgaW5zdGFuY2VcbiAgICogU3VwcG9ydHMgYm90aCB0cmFkaXRpb25hbCBSRFMvQXVyb3JhIGNsdXN0ZXJzIGFuZCBEU1FMIGNsdXN0ZXJzXG4gICAqIC0gRm9yIFJEUy9BdXJvcmE6IHNlY3VyaXR5IGdyb3VwcyB3aWxsIGJlIGNvbmZpZ3VyZWQgdG8gYWxsb3cgYWNjZXNzXG4gICAqIC0gRm9yIERTUUw6IElBTSBhdXRoZW50aWNhdGlvbiB3aWxsIGJlIHVzZWQgaW5zdGVhZCBvZiBzZWNyZXRzXG4gICAqIEBkZWZhdWx0IC0gTm8gZGF0YWJhc2UgY29ubmVjdGlvbiBpcyBjb25maWd1cmVkXG4gICAqL1xuICByZWFkb25seSBjbHVzdGVyPzogcmRzLklEYXRhYmFzZUNsdXN0ZXIgfCByZHMuSURhdGFiYXNlSW5zdGFuY2UgfCBkc3FsLkNmbkNsdXN0ZXJcbn1cblxuLyoqXG4gKiBBIGN1c3RvbSByZXNvdXJjZSB0aGF0IHJ1bnMgRHJpenpsZSBtaWdyYXRpb25zXG4gKi9cbmV4cG9ydCBjbGFzcyBEcml6emxlTWlncmF0ZSBleHRlbmRzIENvbnN0cnVjdCB7XG4gIC8qKlxuICAgKiBUaGUgY3VzdG9tIHJlc291cmNlIHRoYXQgd2FzIGNyZWF0ZWRcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSByZXNvdXJjZTogQ3VzdG9tUmVzb3VyY2VcblxuICAvKipcbiAgICogVGhlIExhbWJkYSBmdW5jdGlvbiB0aGF0IGV4ZWN1dGVzIHRoZSBtaWdyYXRpb25zXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaGFuZGxlcjogTm9kZWpzRnVuY3Rpb25cblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogRHJpenpsZU1pZ3JhdGVQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZClcblxuICAgIC8vIFZhbGlkYXRlIGNvbmZpZ3VyYXRpb25cbiAgICBjb25zdCBpc0RzcWwgPSBwcm9wcy5jbHVzdGVyICYmIGlzRHNxbENsdXN0ZXIocHJvcHMuY2x1c3RlcilcbiAgICBpZiAoIWlzRHNxbCAmJiAhcHJvcHMuZGJTZWNyZXQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJFaXRoZXIgZGJTZWNyZXQgKGZvciB0cmFkaXRpb25hbCBSRFMpIG9yIGNsdXN0ZXIgd2l0aCBEU1FMIG11c3QgYmUgcHJvdmlkZWRcIlxuICAgICAgKVxuICAgIH1cbiAgICBpZiAoIWlzRHNxbCAmJiAhcHJvcHMudnBjKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJWUEMgaXMgcmVxdWlyZWQgZm9yIHRyYWRpdGlvbmFsIFJEUyBkYXRhYmFzZXNcIilcbiAgICB9XG4gICAgaWYgKGlzRHNxbCAmJiBwcm9wcy5kYlNlY3JldCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcImRiU2VjcmV0IHNob3VsZCBub3QgYmUgcHJvdmlkZWQgd2hlbiB1c2luZyBEU1FMIGNsdXN0ZXIgKHVzZXMgSUFNIGF1dGhlbnRpY2F0aW9uKVwiXG4gICAgICApXG4gICAgfVxuXG4gICAgY29uc3QgbWlncmF0aW9uc0RpciA9IHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCBwcm9wcy5taWdyYXRpb25zUGF0aClcbiAgICBhc3NlcnQoXG4gICAgICBleGlzdHNTeW5jKG1pZ3JhdGlvbnNEaXIpLFxuICAgICAgYE1pZ3JhdGlvbnMgZGlyZWN0b3J5ICR7bWlncmF0aW9uc0Rpcn0gZG9lcyBub3QgZXhpc3RgXG4gICAgKVxuICAgIGNvbnN0IGhhbmRsZXJEaXIgPSBwYXRoLmpvaW4oX19kaXJuYW1lLCBcImhhbmRsZXJcIilcblxuICAgIGNvbnN0IHRzX2ZpbGVuYW1lID0gcGF0aC5qb2luKGhhbmRsZXJEaXIsIFwiaW5kZXgudHNcIilcbiAgICBjb25zdCBqc19maWxlbmFtZSA9IHBhdGguam9pbihoYW5kbGVyRGlyLCBcImluZGV4LmpzXCIpXG4gICAgY29uc3QgZW50cnkgPSBleGlzdHNTeW5jKHRzX2ZpbGVuYW1lKSA/IHRzX2ZpbGVuYW1lIDoganNfZmlsZW5hbWVcblxuICAgIGNvbnN0IGVudmlyb25tZW50OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgTk9fQ09MT1I6IFwiMVwiLFxuICAgICAgLi4uKHByb3BzLmhhbmRsZXJQcm9wcz8uZW52aXJvbm1lbnQgfHwge30pLFxuICAgIH1cblxuICAgIC8vIENyZWF0ZSBleHBsaWNpdCBsb2cgZ3JvdXAgZm9yIHRoZSBMYW1iZGEgaGFuZGxlclxuICAgIGNvbnN0IGxvZ0dyb3VwID0gbmV3IGxvZ3MuTG9nR3JvdXAodGhpcywgXCJNaWdyYXRlSGFuZGxlckxvZ0dyb3VwXCIsIHtcbiAgICAgIHJldGVudGlvbjogbG9ncy5SZXRlbnRpb25EYXlzLk9ORV9XRUVLLFxuICAgICAgLy8gS2VlcCBsb2cgZ3JvdXAsIGl0J3MgYW5ub3lpbmcgd2hlbiBpdCBnZXRzIGRlbGV0ZWQgZm9yIG5ld1xuICAgICAgLy8gZGVwbG95cywgYW5kIHNvbWV0aGluZyBoYXMgZ29uZSB3cm9uZy4gWW91IGhhdmUgbm8gd2F5IHRvXG4gICAgICAvLyBsb29rIGF0IHRoZSBsb2dzIGluIHRoYXQgY2FzZS5cbiAgICAgIHJlbW92YWxQb2xpY3k6IFJlbW92YWxQb2xpY3kuUkVUQUlOLFxuICAgIH0pXG5cbiAgICBjb25zdCBvbkV2ZW50SGFuZGxlciA9IG5ldyBOb2RlanNGdW5jdGlvbih0aGlzLCBcIk1pZ3JhdGVIYW5kbGVyXCIsIHtcbiAgICAgIHJ1bnRpbWU6IGxhbWJkYS5SdW50aW1lLk5PREVKU18yMF9YLFxuICAgICAgZW50cnk6IGVudHJ5LFxuICAgICAgbG9nR3JvdXA6IGxvZ0dyb3VwLFxuICAgICAgbG9nZ2luZ0Zvcm1hdDogbGFtYmRhLkxvZ2dpbmdGb3JtYXQuSlNPTixcbiAgICAgIGFwcGxpY2F0aW9uTG9nTGV2ZWxWMjogbGFtYmRhLkFwcGxpY2F0aW9uTG9nTGV2ZWwuSU5GTyxcbiAgICAgIHRpbWVvdXQ6IER1cmF0aW9uLm1pbnV0ZXMoNSksXG4gICAgICB2cGM6IHByb3BzLnZwYyxcbiAgICAgIHZwY1N1Ym5ldHM6IHByb3BzLnZwY1N1Ym5ldHMsXG4gICAgICAuLi5wcm9wcy5oYW5kbGVyUHJvcHMsXG4gICAgICBlbnZpcm9ubWVudCxcbiAgICAgIGJ1bmRsaW5nOiB7XG4gICAgICAgIHNvdXJjZU1hcDogZmFsc2UsXG4gICAgICAgIC8vIEluY2x1ZGUgdGhlIG1pZ3JhdGlvbnMgZGlyZWN0b3J5IGluIHRoZSBidW5kbGVcbiAgICAgICAgY29tbWFuZEhvb2tzOiB7XG4gICAgICAgICAgYmVmb3JlQnVuZGxpbmcoXzogc3RyaW5nLCBvdXRwdXREaXI6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbW1hbmRzID0gW1xuICAgICAgICAgICAgICBgY3AgJHtoYW5kbGVyRGlyfS9oYW5kbGVyLmpzICR7b3V0cHV0RGlyfWAsXG4gICAgICAgICAgICAgIGBjcCAtciAke21pZ3JhdGlvbnNEaXJ9ICR7cGF0aC5qb2luKG91dHB1dERpciwgXCJtaWdyYXRpb25zXCIpfWAsXG4gICAgICAgICAgICAgIC8vIEFsd2F5cyBkb3dubG9hZCBSRFMgY2VydGlmaWNhdGUgZm9yIFNTTCBjb25uZWN0aW9ucyAoYm90aCBSRFMgYW5kIERTUUwgbmVlZCBpdClcbiAgICAgICAgICAgICAgYG1rZGlyIC1wICR7cGF0aC5qb2luKG91dHB1dERpciwgXCJjZXJ0c1wiKX1gLFxuICAgICAgICAgICAgICBgY3VybCAtLXNpbGVudCAtZkwgaHR0cHM6Ly90cnVzdHN0b3JlLnBraS5yZHMuYW1hem9uYXdzLmNvbS9nbG9iYWwvZ2xvYmFsLWJ1bmRsZS5wZW0gLW8gJHtwYXRoLmpvaW4ob3V0cHV0RGlyLCBcImNlcnRzXCIsIFwiZ2xvYmFsLWJ1bmRsZS5wZW1cIil9YCxcbiAgICAgICAgICAgIF1cblxuICAgICAgICAgICAgcmV0dXJuIGNvbW1hbmRzXG4gICAgICAgICAgfSxcbiAgICAgICAgICBhZnRlckJ1bmRsaW5nKCk6IHN0cmluZ1tdIHtcbiAgICAgICAgICAgIHJldHVybiBbXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgYmVmb3JlSW5zdGFsbCgpOiBzdHJpbmdbXSB7XG4gICAgICAgICAgICByZXR1cm4gW11cbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICAuLi5wcm9wcy5oYW5kbGVyUHJvcHM/LmJ1bmRsaW5nLFxuICAgICAgfSxcbiAgICB9KVxuXG4gICAgLy8gSGFuZGxlIGRhdGFiYXNlIGNvbm5lY3Rpb24gc2V0dXBcbiAgICBpZiAoaXNEc3FsKSB7XG4gICAgICAvLyBGb3IgRFNRTCwgZ3JhbnQgSUFNIHBlcm1pc3Npb25zIGluc3RlYWQgb2YgVlBDIHNlY3VyaXR5IGdyb3Vwc1xuICAgICAgY29uc3QgZHNxbENsdXN0ZXIgPSBwcm9wcy5jbHVzdGVyIGFzIGRzcWwuQ2ZuQ2x1c3RlclxuICAgICAgb25FdmVudEhhbmRsZXIuYWRkVG9Sb2xlUG9saWN5KFxuICAgICAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgICAgIGFjdGlvbnM6IFtcImRzcWw6RGJDb25uZWN0QWRtaW5cIl0sXG4gICAgICAgICAgcmVzb3VyY2VzOiBbZHNxbENsdXN0ZXIuYXR0clJlc291cmNlQXJuXSxcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVHJhZGl0aW9uYWwgUkRTIHNldHVwIHdpdGggc2VjdXJpdHkgZ3JvdXBzXG4gICAgICBpZiAoXG4gICAgICAgIHByb3BzLmNsdXN0ZXIgJiZcbiAgICAgICAgKCFwcm9wcy5oYW5kbGVyUHJvcHMgfHxcbiAgICAgICAgICB0eXBlb2YgcHJvcHMuaGFuZGxlclByb3BzLnNlY3VyaXR5R3JvdXBzID09PSBcInVuZGVmaW5lZFwiIHx8XG4gICAgICAgICAgcHJvcHMuaGFuZGxlclByb3BzLnNlY3VyaXR5R3JvdXBzLmxlbmd0aCA9PT0gMClcbiAgICAgICkge1xuICAgICAgICBjb25zdCByZHNDbHVzdGVyID0gcHJvcHMuY2x1c3RlciBhcyByZHMuSURhdGFiYXNlQ2x1c3RlciB8IHJkcy5JRGF0YWJhc2VJbnN0YW5jZVxuICAgICAgICByZHNDbHVzdGVyLmNvbm5lY3Rpb25zLmFsbG93RGVmYXVsdFBvcnRGcm9tKFxuICAgICAgICAgIG9uRXZlbnRIYW5kbGVyLmNvbm5lY3Rpb25zLFxuICAgICAgICAgIFwiQWxsb3cgZHJpenpsZSBtaWdyYXRlIGxhbWJkYSB0byBjb25uZWN0IHRvIGRiXCJcbiAgICAgICAgKVxuICAgICAgfVxuXG4gICAgICAvLyBHcmFudCB0aGUgTGFtYmRhIGZ1bmN0aW9uIHBlcm1pc3Npb24gdG8gcmVhZCB0aGUgc2VjcmV0XG4gICAgICBwcm9wcy5kYlNlY3JldCEuZ3JhbnRSZWFkKG9uRXZlbnRIYW5kbGVyKVxuICAgIH1cblxuICAgIHRoaXMuaGFuZGxlciA9IG9uRXZlbnRIYW5kbGVyXG5cbiAgICBjb25zdCBwcm92aWRlciA9IG5ldyBjci5Qcm92aWRlcih0aGlzLCBcIlByb3ZpZGVyXCIsIHtcbiAgICAgIG9uRXZlbnRIYW5kbGVyLFxuICAgICAgbG9nR3JvdXAsXG4gICAgfSlcblxuICAgIC8vIEJ1aWxkIGN1c3RvbSByZXNvdXJjZSBwcm9wZXJ0aWVzIGJhc2VkIG9uIGRhdGFiYXNlIHR5cGVcbiAgICBjb25zdCBjdXN0b21SZXNvdXJjZVByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAvLyBXZSdyZSBub3cgdXNpbmcgYSBmaXhlZCBwYXRoIGluc2lkZSB0aGUgTGFtYmRhIGJ1bmRsZVxuICAgICAgbWlncmF0aW9uc1BhdGg6IFwibWlncmF0aW9uc1wiLFxuICAgICAgLy8gQWRkaW5nIGEgdGltZXN0YW1wIGVuc3VyZXMgdGhlIHJlc291cmNlIGlzIHVwZGF0ZWQgb24gZWFjaCBkZXBsb3ltZW50XG4gICAgICB0aW1lc3RhbXA6IERhdGUubm93KCkudG9TdHJpbmcoKSxcbiAgICB9XG5cbiAgICBpZiAoaXNEc3FsKSB7XG4gICAgICAvLyBGb3IgRFNRTCwgY29uc3RydWN0IHRoZSBlbmRwb2ludCBmcm9tIGNsdXN0ZXIgSUQgYW5kIHJlZ2lvblxuICAgICAgLy8gRFNRTCBlbmRwb2ludCBmb3JtYXQ6ICR7Y2x1c3RlcklkfS5kc3FsLiR7cmVnaW9ufS5vbi5hd3NcbiAgICAgIGNvbnN0IGRzcWxDbHVzdGVyID0gcHJvcHMuY2x1c3RlciBhcyBkc3FsLkNmbkNsdXN0ZXJcbiAgICAgIGNvbnN0IGNsdXN0ZXJJZCA9IGRzcWxDbHVzdGVyLmF0dHJJZGVudGlmaWVyXG4gICAgICBjb25zdCByZWdpb24gPSBTdGFjay5vZih0aGlzKS5yZWdpb25cbiAgICAgIGN1c3RvbVJlc291cmNlUHJvcGVydGllcy5lbmRwb2ludCA9IGAke2NsdXN0ZXJJZH0uZHNxbC4ke3JlZ2lvbn0ub24uYXdzYFxuICAgICAgY3VzdG9tUmVzb3VyY2VQcm9wZXJ0aWVzLnBvcnQgPSBcIjU0MzJcIlxuICAgIH0gZWxzZSB7XG4gICAgICBjdXN0b21SZXNvdXJjZVByb3BlcnRpZXMuc2VjcmV0QXJuID0gcHJvcHMuZGJTZWNyZXQhLnNlY3JldEFyblxuICAgIH1cblxuICAgIHRoaXMucmVzb3VyY2UgPSBuZXcgQ3VzdG9tUmVzb3VyY2UodGhpcywgXCJDdXN0b21SZXNvdXJjZVwiLCB7XG4gICAgICBzZXJ2aWNlVG9rZW46IHByb3ZpZGVyLnNlcnZpY2VUb2tlbixcbiAgICAgIHByb3BlcnRpZXM6IGN1c3RvbVJlc291cmNlUHJvcGVydGllcyxcbiAgICB9KVxuXG4gICAgY29uc3QgcmVzb3VyY2VDZm4gPSB0aGlzLnJlc291cmNlLm5vZGUuZGVmYXVsdENoaWxkIGFzIENmblJlc291cmNlXG4gICAgcmVzb3VyY2VDZm4uYWRkUHJvcGVydHlPdmVycmlkZShcIlNlcnZpY2VUaW1lb3V0XCIsIDkwMClcblxuICAgIC8vIEFkZCBkZXBlbmRlbmN5IHRvIGVuc3VyZSBkYXRhYmFzZSBpcyBjcmVhdGVkIGJlZm9yZSBtaWdyYXRpb25zIHJ1blxuICAgIGlmIChwcm9wcy5jbHVzdGVyKSB7XG4gICAgICB0aGlzLnJlc291cmNlLm5vZGUuYWRkRGVwZW5kZW5jeShwcm9wcy5jbHVzdGVyKVxuICAgIH1cbiAgfVxufVxuIl19
|