cdk-rds-sql 7.2.3 → 7.3.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.
@@ -0,0 +1,37 @@
1
+ #!/usr/bin/env bash
2
+
3
+ set -o errexit -o pipefail -o nounset
4
+
5
+ # Script claude should use for linting.
6
+
7
+ # Make sure we're in the root
8
+ if [ ! -z "${CLAUDE_PROJECT_DIR:-}" ]
9
+ then
10
+ cd $CLAUDE_PROJECT_DIR
11
+ fi
12
+
13
+ # No file edited, leave
14
+ if [ ! -e ".claude/hooks/.edited" ]
15
+ then
16
+ exit 0
17
+ fi
18
+
19
+ # Read hook input from stdin and check for stop_hook_active flag
20
+ if command -v jq >/dev/null 2>&1; then
21
+ input=$(cat)
22
+ stop_hook_active=$(echo "$input" | jq -r '.stop_hook_active // false')
23
+ if [ "$stop_hook_active" = "true" ]; then
24
+ exit 0
25
+ fi
26
+ fi
27
+
28
+ format=$(npx projen eslint)
29
+
30
+ # Capture stdout and check exit code for the main linting command
31
+ if ! output=$(npx projen typecheck 2>&1); then
32
+ echo "$output" >&2
33
+ exit 2
34
+ fi
35
+
36
+ # We're done, remove .edited
37
+ rm .claude/hooks/.edited
@@ -5,7 +5,7 @@
5
5
  "hooks": [
6
6
  {
7
7
  "type": "command",
8
- "command": "cd $CLAUDE_PROJECT_DIR && npx projen typecheck"
8
+ "command": "$CLAUDE_PROJECT_DIR/.claude/hooks/lint"
9
9
  }
10
10
  ]
11
11
  }
package/.jsii CHANGED
@@ -4447,7 +4447,7 @@
4447
4447
  },
4448
4448
  "locationInModule": {
4449
4449
  "filename": "src/iam-grant.ts",
4450
- "line": 24
4450
+ "line": 34
4451
4451
  },
4452
4452
  "parameters": [
4453
4453
  {
@@ -4473,7 +4473,7 @@
4473
4473
  "kind": "class",
4474
4474
  "locationInModule": {
4475
4475
  "filename": "src/iam-grant.ts",
4476
- "line": 23
4476
+ "line": 24
4477
4477
  },
4478
4478
  "name": "IamGrant",
4479
4479
  "symbolId": "src/iam-grant:IamGrant"
@@ -4488,7 +4488,7 @@
4488
4488
  "kind": "interface",
4489
4489
  "locationInModule": {
4490
4490
  "filename": "src/iam-grant.ts",
4491
- "line": 6
4491
+ "line": 7
4492
4492
  },
4493
4493
  "name": "IamGrantProps",
4494
4494
  "properties": [
@@ -4501,7 +4501,7 @@
4501
4501
  "immutable": true,
4502
4502
  "locationInModule": {
4503
4503
  "filename": "src/iam-grant.ts",
4504
- "line": 10
4504
+ "line": 11
4505
4505
  },
4506
4506
  "name": "provider",
4507
4507
  "type": {
@@ -4517,7 +4517,7 @@
4517
4517
  "immutable": true,
4518
4518
  "locationInModule": {
4519
4519
  "filename": "src/iam-grant.ts",
4520
- "line": 20
4520
+ "line": 21
4521
4521
  },
4522
4522
  "name": "resourceArn",
4523
4523
  "type": {
@@ -4533,7 +4533,7 @@
4533
4533
  "immutable": true,
4534
4534
  "locationInModule": {
4535
4535
  "filename": "src/iam-grant.ts",
4536
- "line": 15
4536
+ "line": 16
4537
4537
  },
4538
4538
  "name": "roleName",
4539
4539
  "type": {
@@ -5594,6 +5594,6 @@
5594
5594
  "symbolId": "src/sql:SqlProps"
5595
5595
  }
5596
5596
  },
5597
- "version": "7.2.3",
5598
- "fingerprint": "pGZnaNWU/SSfTg6yNzCwpBaBdnhT9hVbu74xfvEEXe4="
5597
+ "version": "7.3.1",
5598
+ "fingerprint": "Mc3PNE6TVDDeFZIrlQTTfKYL82JgisTUWw7OGZDbhFo="
5599
5599
  }
@@ -27,6 +27,14 @@ repos:
27
27
  exclude: (.mergify.yml|.projen/|.github|tsconfig.dev.json|.gitignore|LICENSE|.gitattributes|.eslintrc.json)
28
28
  stages:
29
29
  - pre-commit
30
+ - repo: local
31
+ hooks:
32
+ - id: projen
33
+ name: run-projen
34
+ language: system
35
+ entry: sh -c 'npx projen'
36
+ files: \.ts$
37
+ pass_filenames: false
30
38
  - repo: local
31
39
  hooks:
32
40
  - id: build-typescript
package/AGENTS.md CHANGED
@@ -42,6 +42,9 @@ npx projen test
42
42
  # Run tests in watch mode
43
43
  npx projen test:watch
44
44
 
45
+ # Run typecheck (instead of npx tsc --noEmit)
46
+ npx projen typecheck
47
+
45
48
  # Run linting
46
49
  npx projen eslint
47
50
 
@@ -108,10 +111,6 @@ Projen tasks:
108
111
  - Global RDS certificate bundle is automatically downloaded during build
109
112
  - Can be disabled via `ssl: false` in Provider props
110
113
 
111
- ## Key Dependencies
114
+ ## Code style
112
115
 
113
- - **AWS CDK**: v2.171.1
114
- - **Node.js**: >= 22.14
115
- - **TypeScript**: ~5.8
116
- - **Database Drivers**: pg (PostgreSQL), mysql2 (MySQL)
117
- - **AWS SDKs**: secrets-manager, ssm clients
116
+ - Avoid any.
package/CLAUDE.md CHANGED
@@ -42,6 +42,9 @@ npx projen test
42
42
  # Run tests in watch mode
43
43
  npx projen test:watch
44
44
 
45
+ # Run typecheck (instead of npx tsc --noEmit)
46
+ npx projen typecheck
47
+
45
48
  # Run linting
46
49
  npx projen eslint
47
50
 
@@ -108,10 +111,6 @@ Projen tasks:
108
111
  - Global RDS certificate bundle is automatically downloaded during build
109
112
  - Can be disabled via `ssl: false` in Provider props
110
113
 
111
- ## Key Dependencies
114
+ ## Code style
112
115
 
113
- - **AWS CDK**: v2.171.1
114
- - **Node.js**: >= 22.14
115
- - **TypeScript**: ~5.8
116
- - **Database Drivers**: pg (PostgreSQL), mysql2 (MySQL)
117
- - **AWS SDKs**: secrets-manager, ssm clients
116
+ - Avoid any.
@@ -8,7 +8,6 @@ import {
8
8
  EngineRoleProperties,
9
9
  EngineSchemaProperties,
10
10
  EngineSqlProperties,
11
- EngineIamGrantProperties,
12
11
  } from "./types"
13
12
 
14
13
  export interface EngineConnectionConfig {
@@ -51,7 +50,10 @@ export abstract class AbstractEngine {
51
50
  props: EngineRoleProperties,
52
51
  oldProps: EngineRoleProperties
53
52
  ): Promise<string | string[]>
54
- abstract deleteRole(resourceId: string, props: EngineRoleProperties): string | string[]
53
+ abstract deleteRole(
54
+ resourceId: string,
55
+ props: EngineRoleProperties
56
+ ): Promise<string | string[]>
55
57
 
56
58
  abstract createSchema(
57
59
  resourceId: string,
@@ -75,20 +77,14 @@ export abstract class AbstractEngine {
75
77
  ): string | string[]
76
78
  abstract deleteSql(resourceId: string, props: EngineSqlProperties): string | string[]
77
79
 
78
- abstract createIamGrant(
79
- resourceId: string,
80
- props: EngineIamGrantProperties
81
- ): string | string[]
80
+ abstract createIamGrant(roleName: string, iamArn: string): string | string[]
82
81
  abstract updateIamGrant(
83
- resourceId: string,
84
- oldResourceId: string,
85
- props: EngineIamGrantProperties,
86
- oldProps: EngineIamGrantProperties
87
- ): string | string[]
88
- abstract deleteIamGrant(
89
- resourceId: string,
90
- props: EngineIamGrantProperties
82
+ roleName: string,
83
+ oldRoleName: string,
84
+ iamArn: string,
85
+ oldIamArn: string
91
86
  ): string | string[]
87
+ abstract deleteIamGrant(roleName: string, iamArn: string): string | string[]
92
88
 
93
89
  abstract executeSQL(
94
90
  sql: string | string[],
@@ -7,7 +7,6 @@ import {
7
7
  EngineRoleProperties,
8
8
  EngineSchemaProperties,
9
9
  EngineSqlProperties,
10
- EngineIamGrantProperties,
11
10
  } from "./types"
12
11
 
13
12
  export class DsqlEngine extends AbstractEngine {
@@ -37,19 +36,7 @@ export class DsqlEngine extends AbstractEngine {
37
36
  }
38
37
 
39
38
  async createRole(resourceId: string, props: EngineRoleProperties): Promise<string[]> {
40
- const sql = ["BEGIN"]
41
-
42
- // DSQL always uses IAM authentication, no passwords
43
- sql.push(pgFormat("CREATE ROLE %I WITH LOGIN", resourceId))
44
-
45
- if (props?.DatabaseName) {
46
- sql.push(
47
- pgFormat("GRANT CONNECT ON DATABASE %I TO %I", props.DatabaseName, resourceId)
48
- )
49
- }
50
-
51
- sql.push("COMMIT")
52
- return sql
39
+ return this.generateCreateRoleSql(resourceId, props?.DatabaseName)
53
40
  }
54
41
 
55
42
  async updateRole(
@@ -61,31 +48,26 @@ export class DsqlEngine extends AbstractEngine {
61
48
  const sql: string[] = []
62
49
 
63
50
  if (oldResourceId !== resourceId) {
64
- // DSQL doesn't support RENAME, so we need to create new role and drop old one
65
- // Use separate transactions for each DDL operation
51
+ // DSQL doesn't support RENAME, so we create new role and drop old one
52
+ // Create new role with old database permissions first
53
+ sql.push(...this.generateCreateRoleSql(resourceId, oldProps?.DatabaseName))
66
54
 
67
- // First transaction: Create the new role with permissions
68
- sql.push("BEGIN")
69
- sql.push(pgFormat("CREATE ROLE %I WITH LOGIN", resourceId))
55
+ // Add special marker for IAM grant revocation
56
+ sql.push(`-- REVOKE_IAM_GRANTS_FOR_ROLE: ${oldResourceId}`)
70
57
 
71
- // Transfer database permissions to new role
72
- if (oldProps?.DatabaseName) {
58
+ // Drop old role
59
+ sql.push(...this.generateDropRoleSql(oldResourceId))
60
+
61
+ // If database changed as well, grant new database permissions
62
+ if (props?.DatabaseName && props.DatabaseName !== oldProps?.DatabaseName) {
63
+ sql.push("BEGIN")
73
64
  sql.push(
74
- pgFormat(
75
- "GRANT CONNECT ON DATABASE %I TO %I",
76
- oldProps.DatabaseName,
77
- resourceId
78
- )
65
+ pgFormat("GRANT CONNECT ON DATABASE %I TO %I", props.DatabaseName, resourceId)
79
66
  )
67
+ sql.push("COMMIT")
80
68
  }
81
- sql.push("COMMIT")
82
-
83
- // Second transaction: Drop the old role
84
- sql.push("BEGIN")
85
- sql.push(pgFormat("DROP ROLE IF EXISTS %I", oldResourceId))
86
- sql.push("COMMIT")
87
69
  } else {
88
- // If only permissions are changing (no rename), single transaction is fine
70
+ // Only permissions are changing (no rename)
89
71
  sql.push("BEGIN")
90
72
 
91
73
  // Handle database permission changes
@@ -124,37 +106,21 @@ export class DsqlEngine extends AbstractEngine {
124
106
  sql.push("COMMIT")
125
107
  }
126
108
 
127
- // Handle case where role was renamed AND database changed to a different one
128
- if (
129
- oldResourceId !== resourceId &&
130
- props?.DatabaseName &&
131
- props.DatabaseName !== oldProps?.DatabaseName
132
- ) {
133
- sql.push("BEGIN")
134
- sql.push(
135
- pgFormat("GRANT CONNECT ON DATABASE %I TO %I", props.DatabaseName, resourceId)
136
- )
137
- sql.push("COMMIT")
138
- }
139
-
140
109
  return sql
141
110
  }
142
111
 
143
- deleteRole(resourceId: string, props: EngineRoleProperties): string | string[] {
144
- const sql = ["BEGIN"]
112
+ async deleteRole(
113
+ resourceId: string,
114
+ props: EngineRoleProperties
115
+ ): Promise<string | string[]> {
116
+ const sql: string[] = []
145
117
 
146
- if (props?.DatabaseName) {
147
- sql.push(
148
- pgFormat(
149
- "REVOKE ALL PRIVILEGES ON DATABASE %I FROM %I",
150
- props.DatabaseName,
151
- resourceId
152
- )
153
- )
154
- }
118
+ // Add special marker for IAM grant revocation
119
+ sql.push(`-- REVOKE_IAM_GRANTS_FOR_ROLE: ${resourceId}`)
120
+
121
+ // Add the regular drop role SQL
122
+ sql.push(...this.generateDropRoleSql(resourceId, props?.DatabaseName))
155
123
 
156
- sql.push(pgFormat("DROP ROLE IF EXISTS %I", resourceId))
157
- sql.push("COMMIT")
158
124
  return sql
159
125
  }
160
126
 
@@ -226,41 +192,47 @@ export class DsqlEngine extends AbstractEngine {
226
192
  return []
227
193
  }
228
194
 
229
- createIamGrant(resourceId: string, props: EngineIamGrantProperties): string | string[] {
230
- if (!props.ResourceArn) {
195
+ createIamGrant(roleName: string, iamArn: string): string | string[] {
196
+ if (!iamArn) {
231
197
  throw new Error("ResourceArn is required for IAM grant")
232
198
  }
233
- return pgFormat("AWS IAM GRANT %I TO %L", resourceId, props.ResourceArn)
199
+ return pgFormat("AWS IAM GRANT %I TO %L", roleName, iamArn)
234
200
  }
235
201
 
236
202
  updateIamGrant(
237
- resourceId: string,
238
- oldResourceId: string,
239
- props: EngineIamGrantProperties,
240
- oldProps: EngineIamGrantProperties
203
+ roleName: string,
204
+ oldRoleName: string,
205
+ iamArn: string,
206
+ oldIamArn: string
241
207
  ): string | string[] {
242
208
  const statements: string[] = []
243
209
 
210
+ // Only update if role name or IAM role ARN changed
211
+ const roleNameChanged = oldRoleName !== roleName
212
+ const arnChanged = oldIamArn !== iamArn
213
+
214
+ if (!roleNameChanged && !arnChanged) {
215
+ return statements // No changes needed
216
+ }
217
+
244
218
  // Revoke old grant if resource ARN or role name changed
245
- if (oldProps.ResourceArn) {
246
- statements.push(
247
- pgFormat("AWS IAM REVOKE %I FROM %L", oldResourceId, oldProps.ResourceArn)
248
- )
219
+ if (oldIamArn) {
220
+ statements.push(pgFormat("AWS IAM REVOKE %I FROM %L", oldRoleName, oldIamArn))
249
221
  }
250
222
 
251
223
  // Grant new permissions
252
- if (props.ResourceArn) {
253
- statements.push(pgFormat("AWS IAM GRANT %I TO %L", resourceId, props.ResourceArn))
224
+ if (iamArn) {
225
+ statements.push(pgFormat("AWS IAM GRANT %I TO %L", roleName, iamArn))
254
226
  }
255
227
 
256
228
  return statements
257
229
  }
258
230
 
259
- deleteIamGrant(resourceId: string, props: EngineIamGrantProperties): string | string[] {
260
- if (!props.ResourceArn) {
231
+ deleteIamGrant(roleName: string, iamArn: string): string | string[] {
232
+ if (!iamArn) {
261
233
  throw new Error("ResourceArn is required for IAM grant deletion")
262
234
  }
263
- return pgFormat("AWS IAM REVOKE %I FROM %L", resourceId, props.ResourceArn)
235
+ return pgFormat("AWS IAM REVOKE %I FROM %L", roleName, iamArn)
264
236
  }
265
237
 
266
238
  async executeSQL(sql: string | string[], config: EngineConnectionConfig): Promise<any> {
@@ -304,9 +276,31 @@ export class DsqlEngine extends AbstractEngine {
304
276
 
305
277
  for (const statement of statements) {
306
278
  if (statement.trim()) {
307
- this.log(`Executing SQL: ${statement}`)
308
- const result = await client.query(statement)
309
- results.push(result)
279
+ // Handle special IAM grant revocation marker
280
+ if (statement.startsWith("-- REVOKE_IAM_GRANTS_FOR_ROLE:")) {
281
+ const roleName = statement
282
+ .replace("-- REVOKE_IAM_GRANTS_FOR_ROLE:", "")
283
+ .trim()
284
+ await this.revokeIamGrantsForRole(client, roleName)
285
+ } else if (statement.includes("AWS IAM REVOKE")) {
286
+ this.log(`Executing SQL: ${statement}`)
287
+ try {
288
+ const result = await client.query(statement)
289
+ results.push(result)
290
+ } catch (error: any) {
291
+ if (error.message && error.message.includes("does not exist")) {
292
+ this.log(
293
+ `Ignoring error for IAM REVOKE (role doesn't exist): ${error.message}`
294
+ )
295
+ } else {
296
+ throw error
297
+ }
298
+ }
299
+ } else {
300
+ this.log(`Executing SQL: ${statement}`)
301
+ const result = await client.query(statement)
302
+ results.push(result)
303
+ }
310
304
  }
311
305
  }
312
306
 
@@ -338,4 +332,60 @@ export class DsqlEngine extends AbstractEngine {
338
332
  pgFormat("REVOKE ALL ON SCHEMA %I FROM %I", schema, roleName),
339
333
  ]
340
334
  }
335
+
336
+ private generateCreateRoleSql(roleName: string, databaseName?: string): string[] {
337
+ const sql = ["BEGIN"]
338
+ sql.push(pgFormat("CREATE ROLE %I WITH LOGIN", roleName))
339
+
340
+ if (databaseName) {
341
+ sql.push(pgFormat("GRANT CONNECT ON DATABASE %I TO %I", databaseName, roleName))
342
+ }
343
+
344
+ sql.push("COMMIT")
345
+ return sql
346
+ }
347
+
348
+ private generateDropRoleSql(roleName: string, databaseName?: string): string[] {
349
+ const sql = ["BEGIN"]
350
+
351
+ if (databaseName) {
352
+ sql.push(
353
+ pgFormat("REVOKE ALL PRIVILEGES ON DATABASE %I FROM %I", databaseName, roleName)
354
+ )
355
+ }
356
+
357
+ sql.push(pgFormat("DROP ROLE IF EXISTS %I", roleName))
358
+ sql.push("COMMIT")
359
+ return sql
360
+ }
361
+
362
+ private async revokeIamGrantsForRole(client: Client, roleName: string): Promise<void> {
363
+ try {
364
+ this.log(`Querying IAM grants for role: ${roleName}`)
365
+
366
+ // Query the IAM role mappings for this role
367
+ const result = await client.query(
368
+ pgFormat(
369
+ "SELECT arn FROM sys.iam_pg_role_mappings WHERE pg_role_name = %L",
370
+ roleName
371
+ )
372
+ )
373
+
374
+ if (result.rows && result.rows.length > 0) {
375
+ this.log(`Found ${result.rows.length} IAM grants to revoke for role: ${roleName}`)
376
+
377
+ // Revoke each IAM grant
378
+ for (const row of result.rows) {
379
+ const revokeStatement = pgFormat("AWS IAM REVOKE %I FROM %L", roleName, row.arn)
380
+ this.log(`Executing IAM revoke: ${revokeStatement}`)
381
+ await client.query(revokeStatement)
382
+ }
383
+ } else {
384
+ this.log(`No IAM grants found for role: ${roleName}`)
385
+ }
386
+ } catch (error) {
387
+ this.log(`Error revoking IAM grants for role ${roleName}: ${error}`)
388
+ // Don't throw here - the role might not have any IAM grants, which is fine
389
+ }
390
+ }
341
391
  }
@@ -54,8 +54,8 @@ describe("MySQL Engine", () => {
54
54
  expect(sql[2]).toContain("FLUSH PRIVILEGES")
55
55
  })
56
56
 
57
- it("should generate correct SQL for deleting a role", () => {
58
- const sql = engine.deleteRole("testrole", { DatabaseName: "testdb" })
57
+ it("should generate correct SQL for deleting a role", async () => {
58
+ const sql = await engine.deleteRole("testrole", { DatabaseName: "testdb" })
59
59
  expect(Array.isArray(sql)).toBe(true)
60
60
  expect(sql[0]).toContain("REVOKE ALL PRIVILEGES")
61
61
  expect(sql[1]).toContain("DROP USER IF EXISTS")
@@ -5,7 +5,6 @@ import {
5
5
  EngineRoleProperties,
6
6
  EngineSchemaProperties,
7
7
  EngineSqlProperties,
8
- EngineIamGrantProperties,
9
8
  } from "./types"
10
9
 
11
10
  export class MysqlEngine extends AbstractEngine {
@@ -137,7 +136,7 @@ export class MysqlEngine extends AbstractEngine {
137
136
  return sql
138
137
  }
139
138
 
140
- deleteRole(resourceId: string, props: EngineRoleProperties): string[] {
139
+ async deleteRole(resourceId: string, props: EngineRoleProperties): Promise<string[]> {
141
140
  const sql: string[] = []
142
141
 
143
142
  if (props?.DatabaseName) {
@@ -184,26 +183,20 @@ export class MysqlEngine extends AbstractEngine {
184
183
  return props?.Rollback || ""
185
184
  }
186
185
 
187
- createIamGrant(
188
- _resourceId: string,
189
- _props: EngineIamGrantProperties
190
- ): string | string[] {
186
+ createIamGrant(_roleName: string, _iamArn: string): string | string[] {
191
187
  throw new Error("IAM grants are only supported with DSQL clusters")
192
188
  }
193
189
 
194
190
  updateIamGrant(
195
- _resourceId: string,
196
- _oldResourceId: string,
197
- _props: EngineIamGrantProperties,
198
- _oldProps: EngineIamGrantProperties
191
+ _roleName: string,
192
+ _oldRoleName: string,
193
+ _iamArn: string,
194
+ _oldIamArn: string
199
195
  ): string | string[] {
200
196
  throw new Error("IAM grants are only supported with DSQL clusters")
201
197
  }
202
198
 
203
- deleteIamGrant(
204
- _resourceId: string,
205
- _props: EngineIamGrantProperties
206
- ): string | string[] {
199
+ deleteIamGrant(_roleName: string, _iamArn: string): string | string[] {
207
200
  throw new Error("IAM grants are only supported with DSQL clusters")
208
201
  }
209
202
 
@@ -8,7 +8,6 @@ import {
8
8
  EngineRoleProperties,
9
9
  EngineSchemaProperties,
10
10
  EngineSqlProperties,
11
- EngineIamGrantProperties,
12
11
  } from "./types"
13
12
 
14
13
  export class PostgresqlEngine extends AbstractEngine {
@@ -177,7 +176,7 @@ END$$;`,
177
176
  return sql
178
177
  }
179
178
 
180
- deleteRole(resourceId: string, props: EngineRoleProperties): string[] {
179
+ async deleteRole(resourceId: string, props: EngineRoleProperties): Promise<string[]> {
181
180
  return [
182
181
  "start transaction",
183
182
  pgFormat(
@@ -268,26 +267,20 @@ END$$;`,
268
267
  ]
269
268
  }
270
269
 
271
- createIamGrant(
272
- _resourceId: string,
273
- _props: EngineIamGrantProperties
274
- ): string | string[] {
270
+ createIamGrant(_roleName: string, _iamArn: string): string | string[] {
275
271
  throw new Error("IAM grants are only supported with DSQL clusters")
276
272
  }
277
273
 
278
274
  updateIamGrant(
279
- _resourceId: string,
280
- _oldResourceId: string,
281
- _props: EngineIamGrantProperties,
282
- _oldProps: EngineIamGrantProperties
275
+ _roleName: string,
276
+ _oldRoleName: string,
277
+ _iamArn: string,
278
+ _oldIamArn: string
283
279
  ): string | string[] {
284
280
  throw new Error("IAM grants are only supported with DSQL clusters")
285
281
  }
286
282
 
287
- deleteIamGrant(
288
- _resourceId: string,
289
- _props: EngineIamGrantProperties
290
- ): string | string[] {
283
+ deleteIamGrant(_roleName: string, _iamArn: string): string | string[] {
291
284
  throw new Error("IAM grants are only supported with DSQL clusters")
292
285
  }
293
286
 
package/lambda/handler.ts CHANGED
@@ -176,10 +176,8 @@ export const handler = async (
176
176
  sql = dbEngine.createSql(resourceId, toSqlEngineProps(event.ResourceProperties))
177
177
  break
178
178
  case RdsSqlResource.IAM_GRANT:
179
- sql = dbEngine.createIamGrant(
180
- resourceId,
181
- toIamGrantEngineProps(event.ResourceProperties)
182
- )
179
+ const createIam = toIamGrantEngineProps(event.ResourceProperties)
180
+ sql = dbEngine.createIamGrant(createIam.RoleName, createIam.ResourceArn)
183
181
  break
184
182
  case RdsSqlResource.PARAMETER_PASSWORD:
185
183
  await handleParameterPassword(event.ResourceProperties)
@@ -225,11 +223,13 @@ export const handler = async (
225
223
  case RdsSqlResource.IAM_GRANT:
226
224
  const iamUpdateEvent =
227
225
  event as CloudFormationCustomResourceUpdateEvent<ResourceProperties>
226
+ const newIam = toIamGrantEngineProps(event.ResourceProperties)
227
+ const oldIam = toIamGrantEngineProps(iamUpdateEvent.OldResourceProperties)
228
228
  sql = dbEngine.updateIamGrant(
229
- resourceId,
230
- oldResourceId,
231
- toIamGrantEngineProps(event.ResourceProperties),
232
- toIamGrantEngineProps(iamUpdateEvent.OldResourceProperties)
229
+ newIam.RoleName,
230
+ oldIam.RoleName,
231
+ newIam.ResourceArn,
232
+ oldIam.ResourceArn
233
233
  )
234
234
  break
235
235
  case RdsSqlResource.PARAMETER_PASSWORD:
@@ -245,7 +245,7 @@ export const handler = async (
245
245
  sql = dbEngine.deleteDatabase(resourceId, secretValues.username)
246
246
  break
247
247
  case RdsSqlResource.ROLE:
248
- sql = dbEngine.deleteRole(
248
+ sql = await dbEngine.deleteRole(
249
249
  resourceId,
250
250
  toRoleEngineProps(event.ResourceProperties)
251
251
  )
@@ -260,10 +260,8 @@ export const handler = async (
260
260
  sql = dbEngine.deleteSql(resourceId, toSqlEngineProps(event.ResourceProperties))
261
261
  break
262
262
  case RdsSqlResource.IAM_GRANT:
263
- sql = dbEngine.deleteIamGrant(
264
- resourceId,
265
- toIamGrantEngineProps(event.ResourceProperties)
266
- )
263
+ const delIam = toIamGrantEngineProps(event.ResourceProperties)
264
+ sql = dbEngine.deleteIamGrant(delIam.RoleName, delIam.ResourceArn)
267
265
  break
268
266
  case RdsSqlResource.PARAMETER_PASSWORD:
269
267
  await deleteParameterPassword(event.ResourceProperties)
package/lambda/types.ts CHANGED
@@ -25,7 +25,8 @@ export interface EngineSqlProperties {
25
25
  }
26
26
 
27
27
  export interface EngineIamGrantProperties {
28
- readonly ResourceArn?: string
28
+ readonly RoleName: string
29
+ readonly ResourceArn: string
29
30
  }
30
31
 
31
32
  // Common CloudFormation properties shared by all resources
@@ -33,7 +34,7 @@ export interface CommonProperties
33
34
  extends CloudFormationCustomResourceResourcePropertiesCommon {
34
35
  readonly Resource: RdsSqlResource
35
36
  readonly ResourceId: string
36
- readonly SecretArn: string
37
+ readonly SecretArn?: string // SecretArn is not set for DSQL
37
38
  }
38
39
 
39
40
  // CloudFormation-specific properties (engine properties + CloudFormation metadata)
package/lib/database.js CHANGED
@@ -45,5 +45,5 @@ class Database extends aws_cdk_lib_1.CustomResource {
45
45
  }
46
46
  exports.Database = Database;
47
47
  _a = JSII_RTTI_SYMBOL_1;
48
- Database[_a] = { fqn: "cdk-rds-sql.Database", version: "7.2.3" };
48
+ Database[_a] = { fqn: "cdk-rds-sql.Database", version: "7.3.1" };
49
49
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZGF0YWJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw2Q0FBNEM7QUFDNUMsMkNBQXNDO0FBQ3RDLGlDQUF1QztBQUN2Qyx5Q0FBc0Q7QUEwQnRELE1BQU0sZ0JBQWlCLFNBQVEsc0JBQVM7SUFHdEMsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUF5QjtRQUNqRSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFBO1FBQ2hCLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDLFlBQVksQ0FBQTtJQUN4QyxDQUFDO0NBQ0Y7QUFFRCxNQUFhLFFBQVMsU0FBUSw0QkFBYztJQUMxQzs7T0FFRztJQUNILE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFnQixFQUFFLEVBQVUsRUFBRSxZQUFvQjtRQUN4RSxPQUFPLElBQUksZ0JBQWdCLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRTtZQUNyQyxZQUFZLEVBQUUsWUFBWTtTQUMzQixDQUFDLENBQUE7SUFDSixDQUFDO0lBSUQsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUFvQjtRQUM1RCw0REFBNEQ7UUFDNUQsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sS0FBSyx5QkFBYyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2xELE1BQU0sSUFBSSxLQUFLLENBQ2IscUZBQXFGLENBQ3RGLENBQUE7UUFDSCxDQUFDO1FBRUQsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUU7WUFDZixZQUFZLEVBQUUsS0FBSyxDQUFDLFFBQVEsQ0FBQyxZQUFZO1lBQ3pDLFVBQVUsRUFBRTtnQkFDVixRQUFRLEVBQUUscUJBQWMsQ0FBQyxRQUFRO2dCQUNqQyxVQUFVLEVBQUUsS0FBSyxDQUFDLFlBQVk7Z0JBQzlCLEdBQUcsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDaEYsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsUUFBUTthQUM3QjtTQUNGLENBQUMsQ0FBQTtRQUNGLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUN2QyxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUE7UUFDdEMsSUFBSSxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDaEIsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ3RDLENBQUM7SUFDSCxDQUFDOztBQWxDSCw0QkFtQ0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDdXN0b21SZXNvdXJjZSB9IGZyb20gXCJhd3MtY2RrLWxpYlwiXG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiXG5pbXBvcnQgeyBSZHNTcWxSZXNvdXJjZSB9IGZyb20gXCIuL2VudW1cIlxuaW1wb3J0IHsgSVByb3ZpZGVyLCBEYXRhYmFzZUVuZ2luZSB9IGZyb20gXCIuL3Byb3ZpZGVyXCJcbmltcG9ydCB7IFJvbGUgfSBmcm9tIFwiLi9yb2xlXCJcblxuaW50ZXJmYWNlIERhdGFiYXNlQXR0cmlidXRlcyB7XG4gIC8qKlxuICAgKiBOYW1lIG9mIGRhdGFiYXNlIHRvIGNyZWF0ZS5cbiAgICovXG4gIHJlYWRvbmx5IGRhdGFiYXNlTmFtZTogc3RyaW5nXG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsIGRhdGFiYXNlIG93bmVyLlxuICAgKi9cbiAgcmVhZG9ubHkgb3duZXI/OiBSb2xlXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YWJhc2VQcm9wcyBleHRlbmRzIERhdGFiYXNlQXR0cmlidXRlcyB7XG4gIC8qKlxuICAgKiBQcm92aWRlci5cbiAgICovXG4gIHJlYWRvbmx5IHByb3ZpZGVyOiBJUHJvdmlkZXJcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRGF0YWJhc2Uge1xuICByZWFkb25seSBkYXRhYmFzZU5hbWU6IHN0cmluZ1xufVxuXG5jbGFzcyBJbXBvcnRlZERhdGFiYXNlIGV4dGVuZHMgQ29uc3RydWN0IGltcGxlbWVudHMgSURhdGFiYXNlIHtcbiAgcHVibGljIHJlYWRvbmx5IGRhdGFiYXNlTmFtZTogc3RyaW5nXG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IERhdGFiYXNlQXR0cmlidXRlcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZClcbiAgICB0aGlzLmRhdGFiYXNlTmFtZSA9IHByb3BzLmRhdGFiYXNlTmFtZVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBEYXRhYmFzZSBleHRlbmRzIEN1c3RvbVJlc291cmNlIGltcGxlbWVudHMgSURhdGFiYXNlIHtcbiAgLyoqXG4gICAqIFJldHVybiBhIERhdGFiYXNlIGJhc2VkIHVwb24gbmFtZSBvbmx5LiBVc2UgZm9yIGltcG9ydGluZyBleGlzdGluZyBkYXRhYmFzZXMuXG4gICAqL1xuICBzdGF0aWMgZnJvbURhdGFiYXNlTmFtZShzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBkYXRhYmFzZU5hbWU6IHN0cmluZyk6IElEYXRhYmFzZSB7XG4gICAgcmV0dXJuIG5ldyBJbXBvcnRlZERhdGFiYXNlKHNjb3BlLCBpZCwge1xuICAgICAgZGF0YWJhc2VOYW1lOiBkYXRhYmFzZU5hbWUsXG4gICAgfSlcbiAgfVxuXG4gIHB1YmxpYyByZWFkb25seSBkYXRhYmFzZU5hbWU6IHN0cmluZ1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBEYXRhYmFzZVByb3BzKSB7XG4gICAgLy8gQ2hlY2sgaWYgdXNpbmcgRFNRTCBwcm92aWRlciBhbmQgZm9yYmlkIGRhdGFiYXNlIGNyZWF0aW9uXG4gICAgaWYgKHByb3BzLnByb3ZpZGVyLmVuZ2luZSA9PT0gRGF0YWJhc2VFbmdpbmUuRFNRTCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIkRhdGFiYXNlIGNyZWF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgd2l0aCBEU1FMLiBEU1FMIGFsd2F5cyB1c2VzICdwb3N0Z3JlcycgZGF0YWJhc2UuXCJcbiAgICAgIClcbiAgICB9XG5cbiAgICBzdXBlcihzY29wZSwgaWQsIHtcbiAgICAgIHNlcnZpY2VUb2tlbjogcHJvcHMucHJvdmlkZXIuc2VydmljZVRva2VuLFxuICAgICAgcHJvcGVydGllczoge1xuICAgICAgICBSZXNvdXJjZTogUmRzU3FsUmVzb3VyY2UuREFUQUJBU0UsXG4gICAgICAgIFJlc291cmNlSWQ6IHByb3BzLmRhdGFiYXNlTmFtZSxcbiAgICAgICAgLi4uKHByb3BzLnByb3ZpZGVyLnNlY3JldCA/IHsgU2VjcmV0QXJuOiBwcm9wcy5wcm92aWRlci5zZWNyZXQuc2VjcmV0QXJuIH0gOiB7fSksXG4gICAgICAgIE93bmVyOiBwcm9wcy5vd25lcj8ucm9sZU5hbWUsXG4gICAgICB9LFxuICAgIH0pXG4gICAgdGhpcy5ub2RlLmFkZERlcGVuZGVuY3kocHJvcHMucHJvdmlkZXIpXG4gICAgdGhpcy5kYXRhYmFzZU5hbWUgPSBwcm9wcy5kYXRhYmFzZU5hbWVcbiAgICBpZiAocHJvcHMub3duZXIpIHtcbiAgICAgIHRoaXMubm9kZS5hZGREZXBlbmRlbmN5KHByb3BzLm93bmVyKVxuICAgIH1cbiAgfVxufVxuIl19
@@ -25452,34 +25452,21 @@ var DsqlEngine = class extends AbstractEngine {
25452
25452
  );
25453
25453
  }
25454
25454
  async createRole(resourceId, props) {
25455
- const sql = ["BEGIN"];
25456
- sql.push((0, import_node_pg_format.format)("CREATE ROLE %I WITH LOGIN", resourceId));
25457
- if (props?.DatabaseName) {
25458
- sql.push(
25459
- (0, import_node_pg_format.format)("GRANT CONNECT ON DATABASE %I TO %I", props.DatabaseName, resourceId)
25460
- );
25461
- }
25462
- sql.push("COMMIT");
25463
- return sql;
25455
+ return this.generateCreateRoleSql(resourceId, props?.DatabaseName);
25464
25456
  }
25465
25457
  async updateRole(resourceId, oldResourceId, props, oldProps) {
25466
25458
  const sql = [];
25467
25459
  if (oldResourceId !== resourceId) {
25468
- sql.push("BEGIN");
25469
- sql.push((0, import_node_pg_format.format)("CREATE ROLE %I WITH LOGIN", resourceId));
25470
- if (oldProps?.DatabaseName) {
25460
+ sql.push(...this.generateCreateRoleSql(resourceId, oldProps?.DatabaseName));
25461
+ sql.push(`-- REVOKE_IAM_GRANTS_FOR_ROLE: ${oldResourceId}`);
25462
+ sql.push(...this.generateDropRoleSql(oldResourceId));
25463
+ if (props?.DatabaseName && props.DatabaseName !== oldProps?.DatabaseName) {
25464
+ sql.push("BEGIN");
25471
25465
  sql.push(
25472
- (0, import_node_pg_format.format)(
25473
- "GRANT CONNECT ON DATABASE %I TO %I",
25474
- oldProps.DatabaseName,
25475
- resourceId
25476
- )
25466
+ (0, import_node_pg_format.format)("GRANT CONNECT ON DATABASE %I TO %I", props.DatabaseName, resourceId)
25477
25467
  );
25468
+ sql.push("COMMIT");
25478
25469
  }
25479
- sql.push("COMMIT");
25480
- sql.push("BEGIN");
25481
- sql.push((0, import_node_pg_format.format)("DROP ROLE IF EXISTS %I", oldResourceId));
25482
- sql.push("COMMIT");
25483
25470
  } else {
25484
25471
  sql.push("BEGIN");
25485
25472
  if (oldProps?.DatabaseName && props?.DatabaseName && oldProps.DatabaseName !== props.DatabaseName) {
@@ -25508,28 +25495,12 @@ var DsqlEngine = class extends AbstractEngine {
25508
25495
  }
25509
25496
  sql.push("COMMIT");
25510
25497
  }
25511
- if (oldResourceId !== resourceId && props?.DatabaseName && props.DatabaseName !== oldProps?.DatabaseName) {
25512
- sql.push("BEGIN");
25513
- sql.push(
25514
- (0, import_node_pg_format.format)("GRANT CONNECT ON DATABASE %I TO %I", props.DatabaseName, resourceId)
25515
- );
25516
- sql.push("COMMIT");
25517
- }
25518
25498
  return sql;
25519
25499
  }
25520
- deleteRole(resourceId, props) {
25521
- const sql = ["BEGIN"];
25522
- if (props?.DatabaseName) {
25523
- sql.push(
25524
- (0, import_node_pg_format.format)(
25525
- "REVOKE ALL PRIVILEGES ON DATABASE %I FROM %I",
25526
- props.DatabaseName,
25527
- resourceId
25528
- )
25529
- );
25530
- }
25531
- sql.push((0, import_node_pg_format.format)("DROP ROLE IF EXISTS %I", resourceId));
25532
- sql.push("COMMIT");
25500
+ async deleteRole(resourceId, props) {
25501
+ const sql = [];
25502
+ sql.push(`-- REVOKE_IAM_GRANTS_FOR_ROLE: ${resourceId}`);
25503
+ sql.push(...this.generateDropRoleSql(resourceId, props?.DatabaseName));
25533
25504
  return sql;
25534
25505
  }
25535
25506
  createSchema(resourceId, props) {
@@ -25586,29 +25557,32 @@ var DsqlEngine = class extends AbstractEngine {
25586
25557
  }
25587
25558
  return [];
25588
25559
  }
25589
- createIamGrant(resourceId, props) {
25590
- if (!props.ResourceArn) {
25560
+ createIamGrant(roleName, iamArn) {
25561
+ if (!iamArn) {
25591
25562
  throw new Error("ResourceArn is required for IAM grant");
25592
25563
  }
25593
- return (0, import_node_pg_format.format)("AWS IAM GRANT %I TO %L", resourceId, props.ResourceArn);
25564
+ return (0, import_node_pg_format.format)("AWS IAM GRANT %I TO %L", roleName, iamArn);
25594
25565
  }
25595
- updateIamGrant(resourceId, oldResourceId, props, oldProps) {
25566
+ updateIamGrant(roleName, oldRoleName, iamArn, oldIamArn) {
25596
25567
  const statements = [];
25597
- if (oldProps.ResourceArn) {
25598
- statements.push(
25599
- (0, import_node_pg_format.format)("AWS IAM REVOKE %I FROM %L", oldResourceId, oldProps.ResourceArn)
25600
- );
25568
+ const roleNameChanged = oldRoleName !== roleName;
25569
+ const arnChanged = oldIamArn !== iamArn;
25570
+ if (!roleNameChanged && !arnChanged) {
25571
+ return statements;
25572
+ }
25573
+ if (oldIamArn) {
25574
+ statements.push((0, import_node_pg_format.format)("AWS IAM REVOKE %I FROM %L", oldRoleName, oldIamArn));
25601
25575
  }
25602
- if (props.ResourceArn) {
25603
- statements.push((0, import_node_pg_format.format)("AWS IAM GRANT %I TO %L", resourceId, props.ResourceArn));
25576
+ if (iamArn) {
25577
+ statements.push((0, import_node_pg_format.format)("AWS IAM GRANT %I TO %L", roleName, iamArn));
25604
25578
  }
25605
25579
  return statements;
25606
25580
  }
25607
- deleteIamGrant(resourceId, props) {
25608
- if (!props.ResourceArn) {
25581
+ deleteIamGrant(roleName, iamArn) {
25582
+ if (!iamArn) {
25609
25583
  throw new Error("ResourceArn is required for IAM grant deletion");
25610
25584
  }
25611
- return (0, import_node_pg_format.format)("AWS IAM REVOKE %I FROM %L", resourceId, props.ResourceArn);
25585
+ return (0, import_node_pg_format.format)("AWS IAM REVOKE %I FROM %L", roleName, iamArn);
25612
25586
  }
25613
25587
  async executeSQL(sql, config) {
25614
25588
  this.log("Connecting to DSQL cluster...");
@@ -25646,9 +25620,28 @@ var DsqlEngine = class extends AbstractEngine {
25646
25620
  const results = [];
25647
25621
  for (const statement of statements) {
25648
25622
  if (statement.trim()) {
25649
- this.log(`Executing SQL: ${statement}`);
25650
- const result = await client.query(statement);
25651
- results.push(result);
25623
+ if (statement.startsWith("-- REVOKE_IAM_GRANTS_FOR_ROLE:")) {
25624
+ const roleName = statement.replace("-- REVOKE_IAM_GRANTS_FOR_ROLE:", "").trim();
25625
+ await this.revokeIamGrantsForRole(client, roleName);
25626
+ } else if (statement.includes("AWS IAM REVOKE")) {
25627
+ this.log(`Executing SQL: ${statement}`);
25628
+ try {
25629
+ const result = await client.query(statement);
25630
+ results.push(result);
25631
+ } catch (error) {
25632
+ if (error.message && error.message.includes("does not exist")) {
25633
+ this.log(
25634
+ `Ignoring error for IAM REVOKE (role doesn't exist): ${error.message}`
25635
+ );
25636
+ } else {
25637
+ throw error;
25638
+ }
25639
+ }
25640
+ } else {
25641
+ this.log(`Executing SQL: ${statement}`);
25642
+ const result = await client.query(statement);
25643
+ results.push(result);
25644
+ }
25652
25645
  }
25653
25646
  }
25654
25647
  this.log("SQL execution completed");
@@ -25677,6 +25670,49 @@ var DsqlEngine = class extends AbstractEngine {
25677
25670
  (0, import_node_pg_format.format)("REVOKE ALL ON SCHEMA %I FROM %I", schema, roleName)
25678
25671
  ];
25679
25672
  }
25673
+ generateCreateRoleSql(roleName, databaseName) {
25674
+ const sql = ["BEGIN"];
25675
+ sql.push((0, import_node_pg_format.format)("CREATE ROLE %I WITH LOGIN", roleName));
25676
+ if (databaseName) {
25677
+ sql.push((0, import_node_pg_format.format)("GRANT CONNECT ON DATABASE %I TO %I", databaseName, roleName));
25678
+ }
25679
+ sql.push("COMMIT");
25680
+ return sql;
25681
+ }
25682
+ generateDropRoleSql(roleName, databaseName) {
25683
+ const sql = ["BEGIN"];
25684
+ if (databaseName) {
25685
+ sql.push(
25686
+ (0, import_node_pg_format.format)("REVOKE ALL PRIVILEGES ON DATABASE %I FROM %I", databaseName, roleName)
25687
+ );
25688
+ }
25689
+ sql.push((0, import_node_pg_format.format)("DROP ROLE IF EXISTS %I", roleName));
25690
+ sql.push("COMMIT");
25691
+ return sql;
25692
+ }
25693
+ async revokeIamGrantsForRole(client, roleName) {
25694
+ try {
25695
+ this.log(`Querying IAM grants for role: ${roleName}`);
25696
+ const result = await client.query(
25697
+ (0, import_node_pg_format.format)(
25698
+ "SELECT arn FROM sys.iam_pg_role_mappings WHERE pg_role_name = %L",
25699
+ roleName
25700
+ )
25701
+ );
25702
+ if (result.rows && result.rows.length > 0) {
25703
+ this.log(`Found ${result.rows.length} IAM grants to revoke for role: ${roleName}`);
25704
+ for (const row of result.rows) {
25705
+ const revokeStatement = (0, import_node_pg_format.format)("AWS IAM REVOKE %I FROM %L", roleName, row.arn);
25706
+ this.log(`Executing IAM revoke: ${revokeStatement}`);
25707
+ await client.query(revokeStatement);
25708
+ }
25709
+ } else {
25710
+ this.log(`No IAM grants found for role: ${roleName}`);
25711
+ }
25712
+ } catch (error) {
25713
+ this.log(`Error revoking IAM grants for role ${roleName}: ${error}`);
25714
+ }
25715
+ }
25680
25716
  };
25681
25717
 
25682
25718
  // lambda/engine.mysql.ts
@@ -25770,7 +25806,7 @@ var MysqlEngine = class extends AbstractEngine {
25770
25806
  }
25771
25807
  return sql;
25772
25808
  }
25773
- deleteRole(resourceId, props) {
25809
+ async deleteRole(resourceId, props) {
25774
25810
  const sql = [];
25775
25811
  if (props?.DatabaseName) {
25776
25812
  sql.push(
@@ -25799,13 +25835,13 @@ var MysqlEngine = class extends AbstractEngine {
25799
25835
  deleteSql(_resourceId, props) {
25800
25836
  return props?.Rollback || "";
25801
25837
  }
25802
- createIamGrant(_resourceId, _props) {
25838
+ createIamGrant(_roleName, _iamArn) {
25803
25839
  throw new Error("IAM grants are only supported with DSQL clusters");
25804
25840
  }
25805
- updateIamGrant(_resourceId, _oldResourceId, _props, _oldProps) {
25841
+ updateIamGrant(_roleName, _oldRoleName, _iamArn, _oldIamArn) {
25806
25842
  throw new Error("IAM grants are only supported with DSQL clusters");
25807
25843
  }
25808
- deleteIamGrant(_resourceId, _props) {
25844
+ deleteIamGrant(_roleName, _iamArn) {
25809
25845
  throw new Error("IAM grants are only supported with DSQL clusters");
25810
25846
  }
25811
25847
  async executeSQL(sql, config) {
@@ -25979,7 +26015,7 @@ END$$;`,
25979
26015
  sql.push("commit");
25980
26016
  return sql;
25981
26017
  }
25982
- deleteRole(resourceId, props) {
26018
+ async deleteRole(resourceId, props) {
25983
26019
  return [
25984
26020
  "start transaction",
25985
26021
  (0, import_node_pg_format2.format)(
@@ -26053,13 +26089,13 @@ END$$;`,
26053
26089
  (0, import_node_pg_format2.format)("REVOKE ALL ON SCHEMA %I FROM %I", schema, roleName)
26054
26090
  ];
26055
26091
  }
26056
- createIamGrant(_resourceId, _props) {
26092
+ createIamGrant(_roleName, _iamArn) {
26057
26093
  throw new Error("IAM grants are only supported with DSQL clusters");
26058
26094
  }
26059
- updateIamGrant(_resourceId, _oldResourceId, _props, _oldProps) {
26095
+ updateIamGrant(_roleName, _oldRoleName, _iamArn, _oldIamArn) {
26060
26096
  throw new Error("IAM grants are only supported with DSQL clusters");
26061
26097
  }
26062
- deleteIamGrant(_resourceId, _props) {
26098
+ deleteIamGrant(_roleName, _iamArn) {
26063
26099
  throw new Error("IAM grants are only supported with DSQL clusters");
26064
26100
  }
26065
26101
  async executeSQL(sql, config) {
@@ -26248,10 +26284,8 @@ var handler = async (event) => {
26248
26284
  sql = dbEngine.createSql(resourceId, toSqlEngineProps(event.ResourceProperties));
26249
26285
  break;
26250
26286
  case "iam_grant" /* IAM_GRANT */:
26251
- sql = dbEngine.createIamGrant(
26252
- resourceId,
26253
- toIamGrantEngineProps(event.ResourceProperties)
26254
- );
26287
+ const createIam = toIamGrantEngineProps(event.ResourceProperties);
26288
+ sql = dbEngine.createIamGrant(createIam.RoleName, createIam.ResourceArn);
26255
26289
  break;
26256
26290
  case "parameter_password" /* PARAMETER_PASSWORD */:
26257
26291
  await handleParameterPassword(event.ResourceProperties);
@@ -26294,11 +26328,13 @@ var handler = async (event) => {
26294
26328
  break;
26295
26329
  case "iam_grant" /* IAM_GRANT */:
26296
26330
  const iamUpdateEvent = event;
26331
+ const newIam = toIamGrantEngineProps(event.ResourceProperties);
26332
+ const oldIam = toIamGrantEngineProps(iamUpdateEvent.OldResourceProperties);
26297
26333
  sql = dbEngine.updateIamGrant(
26298
- resourceId,
26299
- oldResourceId,
26300
- toIamGrantEngineProps(event.ResourceProperties),
26301
- toIamGrantEngineProps(iamUpdateEvent.OldResourceProperties)
26334
+ newIam.RoleName,
26335
+ oldIam.RoleName,
26336
+ newIam.ResourceArn,
26337
+ oldIam.ResourceArn
26302
26338
  );
26303
26339
  break;
26304
26340
  case "parameter_password" /* PARAMETER_PASSWORD */:
@@ -26314,7 +26350,7 @@ var handler = async (event) => {
26314
26350
  sql = dbEngine.deleteDatabase(resourceId, secretValues.username);
26315
26351
  break;
26316
26352
  case "role" /* ROLE */:
26317
- sql = dbEngine.deleteRole(
26353
+ sql = await dbEngine.deleteRole(
26318
26354
  resourceId,
26319
26355
  toRoleEngineProps(event.ResourceProperties)
26320
26356
  );
@@ -26329,10 +26365,8 @@ var handler = async (event) => {
26329
26365
  sql = dbEngine.deleteSql(resourceId, toSqlEngineProps(event.ResourceProperties));
26330
26366
  break;
26331
26367
  case "iam_grant" /* IAM_GRANT */:
26332
- sql = dbEngine.deleteIamGrant(
26333
- resourceId,
26334
- toIamGrantEngineProps(event.ResourceProperties)
26335
- );
26368
+ const delIam = toIamGrantEngineProps(event.ResourceProperties);
26369
+ sql = dbEngine.deleteIamGrant(delIam.RoleName, delIam.ResourceArn);
26336
26370
  break;
26337
26371
  case "parameter_password" /* PARAMETER_PASSWORD */:
26338
26372
  await deleteParameterPassword(event.ResourceProperties);
@@ -16,5 +16,6 @@ export interface IamGrantProps {
16
16
  readonly resourceArn: string;
17
17
  }
18
18
  export declare class IamGrant extends CustomResource {
19
+ private static createUniqueResourceId;
19
20
  constructor(scope: Construct, id: string, props: IamGrantProps);
20
21
  }
package/lib/iam-grant.js CHANGED
@@ -3,10 +3,19 @@ var _a;
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
4
  exports.IamGrant = void 0;
5
5
  const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
6
+ const crypto = require("crypto");
6
7
  const aws_cdk_lib_1 = require("aws-cdk-lib");
7
8
  const enum_1 = require("./enum");
8
9
  const provider_1 = require("./provider");
9
10
  class IamGrant extends aws_cdk_lib_1.CustomResource {
11
+ static createUniqueResourceId(roleName, resourceArn) {
12
+ const hash = crypto
13
+ .createHash("sha256")
14
+ .update(resourceArn)
15
+ .digest("hex")
16
+ .substring(0, 8);
17
+ return `${roleName}:${hash}`;
18
+ }
10
19
  constructor(scope, id, props) {
11
20
  // IAM grants are only supported on DSQL
12
21
  if (props.provider.engine !== provider_1.DatabaseEngine.DSQL) {
@@ -14,9 +23,11 @@ class IamGrant extends aws_cdk_lib_1.CustomResource {
14
23
  }
15
24
  super(scope, id, {
16
25
  serviceToken: props.provider.serviceToken,
26
+ resourceType: "Custom::DsqlIamGrant",
17
27
  properties: {
18
28
  Resource: enum_1.RdsSqlResource.IAM_GRANT,
19
- ResourceId: props.roleName,
29
+ ResourceId: IamGrant.createUniqueResourceId(props.roleName, props.resourceArn),
30
+ RoleName: props.roleName,
20
31
  ResourceArn: props.resourceArn,
21
32
  },
22
33
  });
@@ -25,5 +36,5 @@ class IamGrant extends aws_cdk_lib_1.CustomResource {
25
36
  }
26
37
  exports.IamGrant = IamGrant;
27
38
  _a = JSII_RTTI_SYMBOL_1;
28
- IamGrant[_a] = { fqn: "cdk-rds-sql.IamGrant", version: "7.2.3" };
29
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWFtLWdyYW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2lhbS1ncmFudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDZDQUE0QztBQUU1QyxpQ0FBdUM7QUFDdkMseUNBQXNEO0FBbUJ0RCxNQUFhLFFBQVMsU0FBUSw0QkFBYztJQUMxQyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQW9CO1FBQzVELHdDQUF3QztRQUN4QyxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxLQUFLLHlCQUFjLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDbEQsTUFBTSxJQUFJLEtBQUssQ0FDYixnSEFBZ0gsQ0FDakgsQ0FBQTtRQUNILENBQUM7UUFFRCxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRTtZQUNmLFlBQVksRUFBRSxLQUFLLENBQUMsUUFBUSxDQUFDLFlBQVk7WUFDekMsVUFBVSxFQUFFO2dCQUNWLFFBQVEsRUFBRSxxQkFBYyxDQUFDLFNBQVM7Z0JBQ2xDLFVBQVUsRUFBRSxLQUFLLENBQUMsUUFBUTtnQkFDMUIsV0FBVyxFQUFFLEtBQUssQ0FBQyxXQUFXO2FBQy9CO1NBQ0YsQ0FBQyxDQUFBO1FBQ0YsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQ3pDLENBQUM7O0FBbEJILDRCQW1CQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEN1c3RvbVJlc291cmNlIH0gZnJvbSBcImF3cy1jZGstbGliXCJcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCJcbmltcG9ydCB7IFJkc1NxbFJlc291cmNlIH0gZnJvbSBcIi4vZW51bVwiXG5pbXBvcnQgeyBJUHJvdmlkZXIsIERhdGFiYXNlRW5naW5lIH0gZnJvbSBcIi4vcHJvdmlkZXJcIlxuXG5leHBvcnQgaW50ZXJmYWNlIElhbUdyYW50UHJvcHMge1xuICAvKipcbiAgICogUHJvdmlkZXIuXG4gICAqL1xuICByZWFkb25seSBwcm92aWRlcjogSVByb3ZpZGVyXG5cbiAgLyoqXG4gICAqIERhdGFiYXNlIHJvbGUgbmFtZSB0byBncmFudCBJQU0gYWNjZXNzIHRvLlxuICAgKi9cbiAgcmVhZG9ubHkgcm9sZU5hbWU6IHN0cmluZ1xuXG4gIC8qKlxuICAgKiBJQU0gcmVzb3VyY2UgQVJOIChyb2xlLCB1c2VyLCBvciBvdGhlciBJQU0gcHJpbmNpcGFsKS5cbiAgICovXG4gIHJlYWRvbmx5IHJlc291cmNlQXJuOiBzdHJpbmdcbn1cblxuZXhwb3J0IGNsYXNzIElhbUdyYW50IGV4dGVuZHMgQ3VzdG9tUmVzb3VyY2Uge1xuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogSWFtR3JhbnRQcm9wcykge1xuICAgIC8vIElBTSBncmFudHMgYXJlIG9ubHkgc3VwcG9ydGVkIG9uIERTUUxcbiAgICBpZiAocHJvcHMucHJvdmlkZXIuZW5naW5lICE9PSBEYXRhYmFzZUVuZ2luZS5EU1FMKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiSUFNIGdyYW50cyBhcmUgb25seSBzdXBwb3J0ZWQgd2l0aCBEU1FMIGNsdXN0ZXJzLiBVc2UgcmVndWxhciBkYXRhYmFzZSBhdXRoZW50aWNhdGlvbiBmb3IgUkRTL0F1cm9yYSBjbHVzdGVycy5cIlxuICAgICAgKVxuICAgIH1cblxuICAgIHN1cGVyKHNjb3BlLCBpZCwge1xuICAgICAgc2VydmljZVRva2VuOiBwcm9wcy5wcm92aWRlci5zZXJ2aWNlVG9rZW4sXG4gICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIFJlc291cmNlOiBSZHNTcWxSZXNvdXJjZS5JQU1fR1JBTlQsXG4gICAgICAgIFJlc291cmNlSWQ6IHByb3BzLnJvbGVOYW1lLFxuICAgICAgICBSZXNvdXJjZUFybjogcHJvcHMucmVzb3VyY2VBcm4sXG4gICAgICB9LFxuICAgIH0pXG4gICAgdGhpcy5ub2RlLmFkZERlcGVuZGVuY3kocHJvcHMucHJvdmlkZXIpXG4gIH1cbn1cbiJdfQ==
39
+ IamGrant[_a] = { fqn: "cdk-rds-sql.IamGrant", version: "7.3.1" };
40
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWFtLWdyYW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2lhbS1ncmFudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLGlDQUFnQztBQUNoQyw2Q0FBNEM7QUFFNUMsaUNBQXVDO0FBQ3ZDLHlDQUFzRDtBQW1CdEQsTUFBYSxRQUFTLFNBQVEsNEJBQWM7SUFDbEMsTUFBTSxDQUFDLHNCQUFzQixDQUFDLFFBQWdCLEVBQUUsV0FBbUI7UUFDekUsTUFBTSxJQUFJLEdBQUcsTUFBTTthQUNoQixVQUFVLENBQUMsUUFBUSxDQUFDO2FBQ3BCLE1BQU0sQ0FBQyxXQUFXLENBQUM7YUFDbkIsTUFBTSxDQUFDLEtBQUssQ0FBQzthQUNiLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7UUFDbEIsT0FBTyxHQUFHLFFBQVEsSUFBSSxJQUFJLEVBQUUsQ0FBQTtJQUM5QixDQUFDO0lBRUQsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUFvQjtRQUM1RCx3Q0FBd0M7UUFDeEMsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sS0FBSyx5QkFBYyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2xELE1BQU0sSUFBSSxLQUFLLENBQ2IsZ0hBQWdILENBQ2pILENBQUE7UUFDSCxDQUFDO1FBRUQsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUU7WUFDZixZQUFZLEVBQUUsS0FBSyxDQUFDLFFBQVEsQ0FBQyxZQUFZO1lBQ3pDLFlBQVksRUFBRSxzQkFBc0I7WUFDcEMsVUFBVSxFQUFFO2dCQUNWLFFBQVEsRUFBRSxxQkFBYyxDQUFDLFNBQVM7Z0JBQ2xDLFVBQVUsRUFBRSxRQUFRLENBQUMsc0JBQXNCLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsV0FBVyxDQUFDO2dCQUM5RSxRQUFRLEVBQUUsS0FBSyxDQUFDLFFBQVE7Z0JBQ3hCLFdBQVcsRUFBRSxLQUFLLENBQUMsV0FBVzthQUMvQjtTQUNGLENBQUMsQ0FBQTtRQUNGLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUN6QyxDQUFDOztBQTdCSCw0QkE4QkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBjcnlwdG8gZnJvbSBcImNyeXB0b1wiXG5pbXBvcnQgeyBDdXN0b21SZXNvdXJjZSB9IGZyb20gXCJhd3MtY2RrLWxpYlwiXG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiXG5pbXBvcnQgeyBSZHNTcWxSZXNvdXJjZSB9IGZyb20gXCIuL2VudW1cIlxuaW1wb3J0IHsgSVByb3ZpZGVyLCBEYXRhYmFzZUVuZ2luZSB9IGZyb20gXCIuL3Byb3ZpZGVyXCJcblxuZXhwb3J0IGludGVyZmFjZSBJYW1HcmFudFByb3BzIHtcbiAgLyoqXG4gICAqIFByb3ZpZGVyLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJvdmlkZXI6IElQcm92aWRlclxuXG4gIC8qKlxuICAgKiBEYXRhYmFzZSByb2xlIG5hbWUgdG8gZ3JhbnQgSUFNIGFjY2VzcyB0by5cbiAgICovXG4gIHJlYWRvbmx5IHJvbGVOYW1lOiBzdHJpbmdcblxuICAvKipcbiAgICogSUFNIHJlc291cmNlIEFSTiAocm9sZSwgdXNlciwgb3Igb3RoZXIgSUFNIHByaW5jaXBhbCkuXG4gICAqL1xuICByZWFkb25seSByZXNvdXJjZUFybjogc3RyaW5nXG59XG5cbmV4cG9ydCBjbGFzcyBJYW1HcmFudCBleHRlbmRzIEN1c3RvbVJlc291cmNlIHtcbiAgcHJpdmF0ZSBzdGF0aWMgY3JlYXRlVW5pcXVlUmVzb3VyY2VJZChyb2xlTmFtZTogc3RyaW5nLCByZXNvdXJjZUFybjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBoYXNoID0gY3J5cHRvXG4gICAgICAuY3JlYXRlSGFzaChcInNoYTI1NlwiKVxuICAgICAgLnVwZGF0ZShyZXNvdXJjZUFybilcbiAgICAgIC5kaWdlc3QoXCJoZXhcIilcbiAgICAgIC5zdWJzdHJpbmcoMCwgOClcbiAgICByZXR1cm4gYCR7cm9sZU5hbWV9OiR7aGFzaH1gXG4gIH1cblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogSWFtR3JhbnRQcm9wcykge1xuICAgIC8vIElBTSBncmFudHMgYXJlIG9ubHkgc3VwcG9ydGVkIG9uIERTUUxcbiAgICBpZiAocHJvcHMucHJvdmlkZXIuZW5naW5lICE9PSBEYXRhYmFzZUVuZ2luZS5EU1FMKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiSUFNIGdyYW50cyBhcmUgb25seSBzdXBwb3J0ZWQgd2l0aCBEU1FMIGNsdXN0ZXJzLiBVc2UgcmVndWxhciBkYXRhYmFzZSBhdXRoZW50aWNhdGlvbiBmb3IgUkRTL0F1cm9yYSBjbHVzdGVycy5cIlxuICAgICAgKVxuICAgIH1cblxuICAgIHN1cGVyKHNjb3BlLCBpZCwge1xuICAgICAgc2VydmljZVRva2VuOiBwcm9wcy5wcm92aWRlci5zZXJ2aWNlVG9rZW4sXG4gICAgICByZXNvdXJjZVR5cGU6IFwiQ3VzdG9tOjpEc3FsSWFtR3JhbnRcIixcbiAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgUmVzb3VyY2U6IFJkc1NxbFJlc291cmNlLklBTV9HUkFOVCxcbiAgICAgICAgUmVzb3VyY2VJZDogSWFtR3JhbnQuY3JlYXRlVW5pcXVlUmVzb3VyY2VJZChwcm9wcy5yb2xlTmFtZSwgcHJvcHMucmVzb3VyY2VBcm4pLFxuICAgICAgICBSb2xlTmFtZTogcHJvcHMucm9sZU5hbWUsXG4gICAgICAgIFJlc291cmNlQXJuOiBwcm9wcy5yZXNvdXJjZUFybixcbiAgICAgIH0sXG4gICAgfSlcbiAgICB0aGlzLm5vZGUuYWRkRGVwZW5kZW5jeShwcm9wcy5wcm92aWRlcilcbiAgfVxufVxuIl19
package/lib/provider.js CHANGED
@@ -209,7 +209,7 @@ class Provider extends constructs_1.Construct {
209
209
  }
210
210
  exports.Provider = Provider;
211
211
  _a = JSII_RTTI_SYMBOL_1;
212
- Provider[_a] = { fqn: "cdk-rds-sql.Provider", version: "7.2.3" };
212
+ Provider[_a] = { fqn: "cdk-rds-sql.Provider", version: "7.3.1" };
213
213
  class ImportedProvider extends constructs_1.Construct {
214
214
  constructor(scope, id, attrs) {
215
215
  super(scope, id);
package/lib/role.js CHANGED
@@ -146,5 +146,5 @@ class Role extends constructs_1.Construct {
146
146
  }
147
147
  exports.Role = Role;
148
148
  _a = JSII_RTTI_SYMBOL_1;
149
- Role[_a] = { fqn: "cdk-rds-sql.Role", version: "7.2.3" };
149
+ Role[_a] = { fqn: "cdk-rds-sql.Role", version: "7.3.1" };
150
150
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm9sZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9yb2xlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsNkNBQWtFO0FBQ2xFLDJDQUEwQztBQUcxQyx1RUFBZ0U7QUFDaEUsMkNBQTBDO0FBQzFDLDJDQUFzQztBQUV0QyxpQ0FBdUM7QUFDdkMseUNBQXNEO0FBQ3RELGlFQUFtRTtBQStFbkUsOENBQThDO0FBQzlDLE1BQU0sVUFBVyxTQUFRLHNCQUFTO0lBQ2hDLFlBQ0UsS0FBZ0IsRUFDaEIsRUFBVSxFQUNWLEtBT0M7UUFFRCxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFBO1FBRWhCLDRDQUE0QztRQUM1QyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFO1lBQ3ZELElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUN4QixJQUFJLEdBQUcsQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLGFBQWEsR0FBRyxFQUFFLEVBQUU7b0JBQ2hELGFBQWEsRUFBRSxHQUFHLEtBQUssQ0FBQyxlQUFlLEdBQUcsR0FBRyxFQUFFO29CQUMvQyxXQUFXLEVBQUUsS0FBSyxDQUFDLFFBQVEsRUFBRTtpQkFDOUIsQ0FBQyxDQUFBO1lBQ0osQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFBO1FBRUYsNkRBQTZEO1FBQzdELE1BQU0scUJBQXFCLEdBQUcsR0FBRyxLQUFLLENBQUMsZUFBZSxVQUFVLENBQUE7UUFDaEUsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLDRCQUFjLENBQUMsSUFBSSxFQUFFLG1CQUFtQixFQUFFO1lBQ3ZFLFlBQVksRUFBRSxLQUFLLENBQUMsb0JBQW9CO1lBQ3hDLFVBQVUsRUFBRTtnQkFDVixTQUFTLEVBQUUsS0FBSyxDQUFDLFNBQVM7Z0JBQzFCLFFBQVEsRUFBRSxxQkFBYyxDQUFDLGtCQUFrQjtnQkFDM0MsV0FBVyxFQUFFLEtBQUssQ0FBQyxXQUFXO2dCQUM5QixhQUFhLEVBQUUscUJBQXFCO2FBQ3JDO1NBQ0YsQ0FBQyxDQUFBO1FBQ0Ysa0JBQWtCLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUE7UUFFckQsTUFBTSxRQUFRLEdBQUcsZUFBZSxtQkFBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLElBQ25ELG1CQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQ2pCLGFBQ0UscUJBQXFCLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQy9DLEdBQUcscUJBQXFCLEVBQUUsQ0FBQTtRQUUxQixLQUFLLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQ3BDLElBQUksR0FBRyxDQUFDLGVBQWUsQ0FBQztZQUN0QixPQUFPLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSx1QkFBdUIsRUFBRSxtQkFBbUIsQ0FBQztZQUMzRSxTQUFTLEVBQUUsQ0FBQyxRQUFRLENBQUM7U0FDdEIsQ0FBQyxDQUNILENBQUE7SUFDSCxDQUFDO0NBQ0Y7QUFFRCxNQUFhLElBQUssU0FBUSxzQkFBUztJQVlqQyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQWdCO1FBQ3hELElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEtBQUsseUJBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNsRCxJQUFJLEtBQUssQ0FBQyxRQUFRLElBQUksS0FBSyxDQUFDLFlBQVksRUFBRSxDQUFDO2dCQUN6QyxNQUFNLHlDQUF5QyxDQUFBO1lBQ2pELENBQUM7WUFDRCxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDM0Msb0dBQW9HO2dCQUNwRyx5RUFBeUU7Z0JBQ3pFLHNEQUFzRDtnQkFDdEQsTUFBTSx5Q0FBeUMsQ0FBQTtZQUNqRCxDQUFDO1FBQ0gsQ0FBQztRQUNELEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUE7UUFFaEIsK0RBQStEO1FBQy9ELElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEtBQUsseUJBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNsRCxnRkFBZ0Y7WUFDaEYsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQzVCLE1BQU0sSUFBSSxLQUFLLENBQ2IsNkVBQTZFO29CQUMzRSxnRkFBZ0Y7b0JBQ2hGLDRGQUE0RixDQUMvRixDQUFBO1lBQ0gsQ0FBQztZQUVELDhEQUE4RDtZQUM5RCxNQUFNLElBQUksR0FBSSxLQUFLLENBQUMsUUFBUSxDQUFDLE9BQTRCLENBQUMsZUFBZTtnQkFDdkUsQ0FBQyxDQUFFLEtBQUssQ0FBQyxRQUFRLENBQUMsT0FBNEIsQ0FBQyxlQUFlLENBQUMsUUFBUTtnQkFDdkUsQ0FBQyxDQUFFLEtBQUssQ0FBQyxRQUFRLENBQUMsT0FBNkIsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUE7WUFFM0UsTUFBTSxJQUFJLEdBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxPQUE0QixDQUFDLGVBQWU7Z0JBQ3ZFLENBQUMsQ0FBRSxLQUFLLENBQUMsUUFBUSxDQUFDLE9BQTRCLENBQUMsZUFBZSxDQUFDLElBQUk7Z0JBQ25FLENBQUMsQ0FBRSxLQUFLLENBQUMsUUFBUSxDQUFDLE9BQTZCLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFBO1lBRXZFLE1BQU0sVUFBVSxHQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsT0FBNEIsQ0FBQyxpQkFBaUI7Z0JBQy9FLENBQUMsQ0FBRSxLQUFLLENBQUMsUUFBUSxDQUFDLE9BQTRCLENBQUMsaUJBQWlCO2dCQUNoRSxDQUFDLENBQUUsS0FBSyxDQUFDLFFBQVEsQ0FBQyxPQUE2QixDQUFDLGtCQUFrQixDQUFBO1lBRXBFLE1BQU0sY0FBYyxHQUFHO2dCQUNyQixtQkFBbUIsRUFBRSxVQUFVO2dCQUMvQixNQUFNLEVBQUUsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNO2dCQUM3QixJQUFJLEVBQUUsSUFBSTtnQkFDVixJQUFJLEVBQUUsSUFBSTtnQkFDVixRQUFRLEVBQUUsS0FBSyxDQUFDLFFBQVE7Z0JBQ3hCLE1BQU0sRUFBRSxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFlBQVk7YUFDMUUsQ0FBQTtZQUVELElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSwyQkFBTSxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUU7Z0JBQ3ZDLFVBQVUsRUFBRSxLQUFLLENBQUMsVUFBVTtnQkFDNUIsYUFBYSxFQUFFLEtBQUssQ0FBQyxhQUFhO2dCQUNsQyxXQUFXLEVBQUUsd0JBQXdCLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxTQUFTLEtBQUssQ0FBQyxRQUFRLEVBQUU7Z0JBQ25GLEdBQUcsQ0FBQyxLQUFLLENBQUMsYUFBYTtvQkFDckIsQ0FBQyxDQUFDO3dCQUNFLDBEQUEwRDt3QkFDMUQsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUM7cUJBQ3JEO29CQUNILENBQUMsQ0FBQzt3QkFDRSx1Q0FBdUM7d0JBQ3ZDLG9CQUFvQixFQUFFOzRCQUNwQixjQUFjLEVBQUUsRUFBRSxFQUFFLHNEQUFzRDs0QkFDMUUsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUM7NEJBQ3BELGlCQUFpQixFQUFFLFVBQVU7NEJBQzdCLGlCQUFpQixFQUFFLCtCQUErQjt5QkFDbkQ7cUJBQ0YsQ0FBQztnQkFDTixhQUFhLEVBQUUsMkJBQWEsQ0FBQyxPQUFPO2FBQ3JDLENBQUMsQ0FBQTtZQUVGLG1EQUFtRDtZQUNuRCxJQUFJLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztnQkFDMUIsTUFBTSxTQUFTLEdBQUc7b0JBQ2hCLG1CQUFtQixFQUFFLFVBQVU7b0JBQy9CLE1BQU0sRUFBRSxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU07b0JBQzdCLElBQUksRUFBRSxJQUFJO29CQUNWLElBQUksRUFBRSxJQUFJO29CQUNWLFFBQVEsRUFBRSxLQUFLLENBQUMsUUFBUTtvQkFDeEIsTUFBTSxFQUFFLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsWUFBWTtpQkFDMUUsQ0FBQTtnQkFFRCxJQUFJLFVBQVUsQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFO29CQUNqQyxTQUFTLEVBQUUsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsU0FBUyxJQUFJLEVBQUU7b0JBQ2pELGVBQWUsRUFBRSxLQUFLLENBQUMsZUFBZTtvQkFDdEMsV0FBVyxFQUFFLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTO29CQUM3RCxvQkFBb0IsRUFBRSxLQUFLLENBQUMsUUFBUSxDQUFDLFlBQVk7b0JBQ2pELFFBQVEsRUFBRSxLQUFLLENBQUMsUUFBUTtvQkFDeEIsU0FBUztpQkFDVixDQUFDLENBQUE7WUFDSixDQUFDO1FBQ0gsQ0FBQztRQUVELE1BQU0sSUFBSSxHQUFHLElBQUksMkJBQWtCLENBQUMsSUFBSSxFQUFFLGNBQWMsRUFBRTtZQUN4RCxRQUFRLEVBQUUsS0FBSyxDQUFDLFFBQVE7WUFDeEIsUUFBUSxFQUFFLEtBQUssQ0FBQyxRQUFRO1lBQ3hCLFdBQVcsRUFDVCxLQUFLLENBQUMsYUFBYSxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxLQUFLLHlCQUFjLENBQUMsSUFBSTtnQkFDbEUsQ0FBQyxDQUFDLEVBQUU7Z0JBQ0osQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFPLENBQUMsU0FBUztZQUM1QixRQUFRLEVBQUUsS0FBSyxDQUFDLFFBQVE7WUFDeEIsWUFBWSxFQUFFLEtBQUssQ0FBQyxZQUFZO1lBQ2hDLGFBQWEsRUFBRSxLQUFLLENBQUMsYUFBYSxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxLQUFLLHlCQUFjLENBQUMsSUFBSTtTQUNwRixDQUFDLENBQUE7UUFFRixJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNoQixJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUE7WUFDcEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQTtZQUM3QyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQzlCLGdEQUFnRDtnQkFDaEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUE7WUFDaEUsQ0FBQztRQUNILENBQUM7UUFFRCxJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUE7SUFDaEMsQ0FBQzs7QUE1SEgsb0JBNkhDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ3VzdG9tUmVzb3VyY2UsIFJlbW92YWxQb2xpY3ksIFN0YWNrIH0gZnJvbSBcImF3cy1jZGstbGliXCJcbmltcG9ydCAqIGFzIGlhbSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWlhbVwiXG5pbXBvcnQgKiBhcyBrbXMgZnJvbSBcImF3cy1jZGstbGliL2F3cy1rbXNcIlxuaW1wb3J0IHsgSURhdGFiYXNlQ2x1c3RlciwgSURhdGFiYXNlSW5zdGFuY2UgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXJkc1wiXG5pbXBvcnQgeyBJU2VjcmV0LCBTZWNyZXQgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXNlY3JldHNtYW5hZ2VyXCJcbmltcG9ydCAqIGFzIHNzbSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXNzbVwiXG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiXG5pbXBvcnQgeyBJRGF0YWJhc2UgfSBmcm9tIFwiLi9kYXRhYmFzZVwiXG5pbXBvcnQgeyBSZHNTcWxSZXNvdXJjZSB9IGZyb20gXCIuL2VudW1cIlxuaW1wb3J0IHsgSVByb3ZpZGVyLCBEYXRhYmFzZUVuZ2luZSB9IGZyb20gXCIuL3Byb3ZpZGVyXCJcbmltcG9ydCB7IFJvbGUgYXMgQ3VzdG9tUmVzb3VyY2VSb2xlIH0gZnJvbSBcIi4vcm9sZS5jdXN0b20tcmVzb3VyY2VcIlxuXG5leHBvcnQgaW50ZXJmYWNlIFJvbGVQcm9wcyB7XG4gIC8qKlxuICAgKiBQcm92aWRlci5cbiAgICovXG4gIHJlYWRvbmx5IHByb3ZpZGVyOiBJUHJvdmlkZXJcblxuICAvKipcbiAgICogU1FMLlxuICAgKi9cbiAgcmVhZG9ubHkgcm9sZU5hbWU6IHN0cmluZ1xuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBkYXRhYmFzZSB0aGlzIHVzZXIgaXMgZXhwZWN0ZWQgdG8gdXNlLlxuICAgKlxuICAgKiBJZiB0aGUgZGF0YWJhc2UgZXhpc3RzLCBjb25uZWN0IHByaXZpbGVnZXMgYXJlIGdyYW50ZWQuXG4gICAqXG4gICAqIFNwZWNpZnkgb25lIG9mIGBkYXRhYmFzZWAgb3IgYGRhdGFiYXNlTmFtZWAuIFRoaXMgaXMgdGhlIG5hbWVcbiAgICogdGhhdCB3aWxsIGJlIHN0b3JlZCBpbiB0aGUgcm9sZSdzIHNlY3JldCBhcyB0aGUgZGF0YWJhc2UgbmFtZSB0b1xuICAgKiB1c2UuXG4gICAqL1xuICByZWFkb25seSBkYXRhYmFzZT86IElEYXRhYmFzZVxuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBkYXRhYmFzZSBuYW1lIHRoaXMgdXNlciBpcyBleHBlY3RlZCB0byB1c2UuXG4gICAqXG4gICAqIElmIHRoZSBkYXRhYmFzZSBleGlzdHMsIGNvbm5lY3QgcHJpdmlsZWdlcyBhcmUgZ3JhbnRlZC5cbiAgICpcbiAgICogU3BlY2lmeSBvbmUgb2YgYGRhdGFiYXNlYCBvciBgZGF0YWJhc2VOYW1lYC4gVGhpcyBpcyB0aGUgbmFtZVxuICAgKiB0aGF0IHdpbGwgYmUgc3RvcmVkIGluIHRoZSByb2xlJ3Mgc2VjcmV0IGFzIHRoZSBkYXRhYmFzZSBuYW1lIHRvXG4gICAqIHVzZS5cbiAgICovXG4gIHJlYWRvbmx5IGRhdGFiYXNlTmFtZT86IHN0cmluZ1xuXG4gIC8qKlxuICAgKiBBIG5ldyBzZWNyZXQgaXMgY3JlYXRlZCBmb3IgdGhpcyB1c2VyLlxuICAgKlxuICAgKiBPcHRpb25hbGx5IGVuY3J5cHQgaXQgd2l0aCB0aGUgZ2l2ZW4ga2V5LlxuICAgKi9cbiAgcmVhZG9ubHkgZW5jcnlwdGlvbktleT86IGttcy5JS2V5XG5cbiAgLyoqXG4gICAqIEEgbmV3IHNlY3JldCBpcyBjcmVhdGVkIGZvciB0aGlzIHVzZXIuXG4gICAqXG4gICAqIE9wdGlvbmFsbHkgYWRkIHNlY3JldCBuYW1lIHRvIHRoZSBzZWNyZXQuXG4gICAqL1xuICByZWFkb25seSBzZWNyZXROYW1lPzogc3RyaW5nXG5cbiAgLyoqXG4gICAqIFByZWZpeCBmb3IgU1NNIHBhcmFtZXRlcnMgdG8gc3RvcmUgY3JlZGVudGlhbHMgaW4gUGFyYW1ldGVyIFN0b3JlLlxuICAgKiBXaGVuIGRlZmluZWQsIGNyZWRlbnRpYWxzIHdpbGwgYWxzbyBiZSBzdG9yZWQgYXMgcGFyYW1ldGVycy5cbiAgICpcbiAgICogVGhlIHBhcmFtZXRlciBuYW1lcyBzdWNoIGFzIFwicGFzc3dvcmRcIiBpcyBzaW1wbHkgYXBwZW5kZWQgdG9cbiAgICogYHBhcmFtZXRlclByZWZpeGAsIHNvIG1ha2Ugc3VyZSB0aGUgcHJlZml4IGVuZHMgd2l0aCBhIHNsYXNoIGlmXG4gICAqICB5b3UgaGF2ZSB5b3VyIHBhcmFtZXRlciBuYW1lcyBzbGFzaCBzZXBhcmF0ZWQuXG4gICAqXG4gICAqIE5vdGUgdGhhdCB0aGUgcGFzc3dvcmQgZnJvbSB0aGUgc2VjcmV0IGlzIGNvcGllZCBqdXN0IG9uY2UsIHRoZXlcbiAgICogYXJlIG5vdCBrZXB0IGluIHN5bmMuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gY3JlZGVudGlhbHMgYXJlIG9ubHkgc3RvcmVkIGluIFNlY3JldHMgTWFuYWdlclxuICAgKi9cbiAgcmVhZG9ubHkgcGFyYW1ldGVyUHJlZml4Pzogc3RyaW5nXG5cbiAgLyoqXG4gICAqIEVuYWJsZSBJQU0gYXV0aGVudGljYXRpb24gZm9yIHRoaXMgcm9sZS5cbiAgICpcbiAgICogV2hlbiBlbmFibGVkLCB0aGUgcm9sZSB3aWxsIGJlIGNyZWF0ZWQgd2l0aG91dCBhIHBhc3N3b3JkIGFuZFxuICAgKiBjb25maWd1cmVkIGZvciBBV1MgSUFNIGRhdGFiYXNlIGF1dGhlbnRpY2F0aW9uLiBUaGUgc2VjcmV0XG4gICAqIHdpbGwgbm90IGNvbnRhaW4gYSBwYXNzd29yZCBmaWVsZC5cbiAgICpcbiAgICogTm90ZTogRm9yIERTUUwgY2x1c3RlcnMsIHRoaXMgcHJvcGVydHkgaXMgaWdub3JlZCBhcyBEU1FMIGFsd2F5c1xuICAgKiB1c2VzIElBTSBhdXRoZW50aWNhdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2UgLSB1c2UgcGFzc3dvcmQgYXV0aGVudGljYXRpb25cbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZUlhbUF1dGg/OiBib29sZWFuXG59XG5cbi8vIFByaXZhdGUgUGFyYW1ldGVycyBjb25zdHJ1Y3QgKG5vdCBleHBvcnRlZClcbmNsYXNzIFBhcmFtZXRlcnMgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICBjb25zdHJ1Y3RvcihcbiAgICBzY29wZTogQ29uc3RydWN0LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcHJvcHM6IHtcbiAgICAgIHByb3ZpZGVyOiBJUHJvdmlkZXJcbiAgICAgIHNlY3JldEFybjogc3RyaW5nXG4gICAgICBwYXJhbWV0ZXJQcmVmaXg6IHN0cmluZ1xuICAgICAgcGFzc3dvcmRBcm46IHN0cmluZ1xuICAgICAgcHJvdmlkZXJTZXJ2aWNlVG9rZW46IHN0cmluZ1xuICAgICAgcGFyYW1EYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICAgfVxuICApIHtcbiAgICBzdXBlcihzY29wZSwgaWQpXG5cbiAgICAvLyBDcmVhdGUgcGFyYW1ldGVycyBmb3IgZWFjaCBrZXktdmFsdWUgcGFpclxuICAgIE9iamVjdC5lbnRyaWVzKHByb3BzLnBhcmFtRGF0YSkuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBuZXcgc3NtLlN0cmluZ1BhcmFtZXRlcih0aGlzLCBgUGFyYW1ldGVyLSR7a2V5fWAsIHtcbiAgICAgICAgICBwYXJhbWV0ZXJOYW1lOiBgJHtwcm9wcy5wYXJhbWV0ZXJQcmVmaXh9JHtrZXl9YCxcbiAgICAgICAgICBzdHJpbmdWYWx1ZTogdmFsdWUudG9TdHJpbmcoKSxcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgLy8gRm9yIHBhc3N3b3JkLCB1c2UgdGhlIGV4aXN0aW5nIHByb3ZpZGVyIHRvIHN0b3JlIGl0IGluIFNTTVxuICAgIGNvbnN0IHBhc3N3b3JkUGFyYW1ldGVyTmFtZSA9IGAke3Byb3BzLnBhcmFtZXRlclByZWZpeH1wYXNzd29yZGBcbiAgICBjb25zdCBwYXNzd29yZF9wYXJhbWV0ZXIgPSBuZXcgQ3VzdG9tUmVzb3VyY2UodGhpcywgXCJQYXNzd29yZFBhcmFtZXRlclwiLCB7XG4gICAgICBzZXJ2aWNlVG9rZW46IHByb3BzLnByb3ZpZGVyU2VydmljZVRva2VuLFxuICAgICAgcHJvcGVydGllczoge1xuICAgICAgICBTZWNyZXRBcm46IHByb3BzLnNlY3JldEFybixcbiAgICAgICAgUmVzb3VyY2U6IFJkc1NxbFJlc291cmNlLlBBUkFNRVRFUl9QQVNTV09SRCxcbiAgICAgICAgUGFzc3dvcmRBcm46IHByb3BzLnBhc3N3b3JkQXJuLFxuICAgICAgICBQYXJhbWV0ZXJOYW1lOiBwYXNzd29yZFBhcmFtZXRlck5hbWUsXG4gICAgICB9LFxuICAgIH0pXG4gICAgcGFzc3dvcmRfcGFyYW1ldGVyLm5vZGUuYWRkRGVwZW5kZW5jeShwcm9wcy5wcm92aWRlcilcblxuICAgIGNvbnN0IHBhcmFtQXJuID0gYGFybjphd3M6c3NtOiR7U3RhY2sub2YodGhpcykucmVnaW9ufToke1xuICAgICAgU3RhY2sub2YodGhpcykuYWNjb3VudFxuICAgIH06cGFyYW1ldGVyJHtcbiAgICAgIHBhc3N3b3JkUGFyYW1ldGVyTmFtZS5zdGFydHNXaXRoKFwiL1wiKSA/IFwiXCIgOiBcIi9cIlxuICAgIH0ke3Bhc3N3b3JkUGFyYW1ldGVyTmFtZX1gXG5cbiAgICBwcm9wcy5wcm92aWRlci5oYW5kbGVyLmFkZFRvUm9sZVBvbGljeShcbiAgICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgYWN0aW9uczogW1wic3NtOlB1dFBhcmFtZXRlclwiLCBcInNzbTpBZGRUYWdzVG9SZXNvdXJjZVwiLCBcInNzbTpHZXRQYXJhbWV0ZXJzXCJdLFxuICAgICAgICByZXNvdXJjZXM6IFtwYXJhbUFybl0sXG4gICAgICB9KVxuICAgIClcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUm9sZSBleHRlbmRzIENvbnN0cnVjdCB7XG4gIC8qKlxuICAgKiBUaGUgcm9sZSBuYW1lLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHJvbGVOYW1lOiBzdHJpbmdcblxuICAvKipcbiAgICogVGhlIGdlbmVyYXRlZCBzZWNyZXQuXG4gICAqIE9ubHkgYXZhaWxhYmxlIGZvciBub24tRFNRTCBjbHVzdGVycyBhcyBEU1FMIHVzZXMgSUFNIGF1dGhlbnRpY2F0aW9uLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHNlY3JldD86IElTZWNyZXRcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogUm9sZVByb3BzKSB7XG4gICAgaWYgKHByb3BzLnByb3ZpZGVyLmVuZ2luZSAhPT0gRGF0YWJhc2VFbmdpbmUuRFNRTCkge1xuICAgICAgaWYgKHByb3BzLmRhdGFiYXNlICYmIHByb3BzLmRhdGFiYXNlTmFtZSkge1xuICAgICAgICB0aHJvdyBcIlNwZWNpZnkgZWl0aGVyIGRhdGFiYXNlIG9yIGRhdGFiYXNlTmFtZVwiXG4gICAgICB9XG4gICAgICBpZiAoIXByb3BzLmRhdGFiYXNlICYmICFwcm9wcy5kYXRhYmFzZU5hbWUpIHtcbiAgICAgICAgLy8gSWYgbmVpdGhlciBpcyBzcGVjaWZpZWQsIHdlIG1pZ2h0IG5lZWQgYSBkZWZhdWx0IG9yIHRocm93IGFuIGVycm9yIGRlcGVuZGluZyBvbiBkZXNpcmVkIGJlaGF2aW9yLlxuICAgICAgICAvLyBGb3Igbm93LCBsZXQncyBhc3N1bWUgaXQncyBhbGxvd2VkIGJ1dCB0aGUgc2VjcmV0IHdvbid0IGhhdmUgYSBkYm5hbWUuXG4gICAgICAgIC8vIElmIGl0IHNob3VsZCBiZSByZXF1aXJlZCwgdW5jb21tZW50IHRoZSBsaW5lIGJlbG93OlxuICAgICAgICB0aHJvdyBcIlNwZWNpZnkgZWl0aGVyIGRhdGFiYXNlIG9yIGRhdGFiYXNlTmFtZVwiXG4gICAgICB9XG4gICAgfVxuICAgIHN1cGVyKHNjb3BlLCBpZClcblxuICAgIC8vIERTUUwgZG9lc24ndCB1c2Ugc2VjcmV0cyAtIGl0IGFsd2F5cyB1c2VzIElBTSBhdXRoZW50aWNhdGlvblxuICAgIGlmIChwcm9wcy5wcm92aWRlci5lbmdpbmUgIT09IERhdGFiYXNlRW5naW5lLkRTUUwpIHtcbiAgICAgIC8vIEZvciBpbXBvcnRlZCBwcm92aWRlcnMgd2l0aG91dCBjbHVzdGVyIGRldGFpbHMsIHByb3ZpZGUgaGVscGZ1bCBlcnJvciBtZXNzYWdlXG4gICAgICBpZiAoIXByb3BzLnByb3ZpZGVyLmNsdXN0ZXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIFwiUm9sZSBjcmVhdGlvbiByZXF1aXJlcyBjbHVzdGVyIGluZm9ybWF0aW9uLiBXaGVuIGltcG9ydGluZyBhIHByb3ZpZGVyIHdpdGggXCIgK1xuICAgICAgICAgICAgXCJQcm92aWRlci5mcm9tUHJvdmlkZXJBdHRyaWJ1dGVzKCksIGluY2x1ZGUgdGhlICdjbHVzdGVyJyBwcm9wZXJ0eSBpZiB5b3UgcGxhbiBcIiArXG4gICAgICAgICAgICBcInRvIGNyZWF0ZSBuZXcgcm9sZXMuIEFsdGVybmF0aXZlbHksIHVzZSBleGlzdGluZyByb2xlcyBjcmVhdGVkIHdpdGggdGhlIG9yaWdpbmFsIHByb3ZpZGVyLlwiXG4gICAgICAgIClcbiAgICAgIH1cblxuICAgICAgLy8gRm9yIFJEUy9BdXJvcmEgY2x1c3RlcnMgYW5kIGluc3RhbmNlcywgZ2V0IGVuZHBvaW50IGRldGFpbHNcbiAgICAgIGNvbnN0IGhvc3QgPSAocHJvcHMucHJvdmlkZXIuY2x1c3RlciBhcyBJRGF0YWJhc2VDbHVzdGVyKS5jbHVzdGVyRW5kcG9pbnRcbiAgICAgICAgPyAocHJvcHMucHJvdmlkZXIuY2x1c3RlciBhcyBJRGF0YWJhc2VDbHVzdGVyKS5jbHVzdGVyRW5kcG9pbnQuaG9zdG5hbWVcbiAgICAgICAgOiAocHJvcHMucHJvdmlkZXIuY2x1c3RlciBhcyBJRGF0YWJhc2VJbnN0YW5jZSkuaW5zdGFuY2VFbmRwb2ludC5ob3N0bmFtZVxuXG4gICAgICBjb25zdCBwb3J0ID0gKHByb3BzLnByb3ZpZGVyLmNsdXN0ZXIgYXMgSURhdGFiYXNlQ2x1c3RlcikuY2x1c3RlckVuZHBvaW50XG4gICAgICAgID8gKHByb3BzLnByb3ZpZGVyLmNsdXN0ZXIgYXMgSURhdGFiYXNlQ2x1c3RlcikuY2x1c3RlckVuZHBvaW50LnBvcnRcbiAgICAgICAgOiAocHJvcHMucHJvdmlkZXIuY2x1c3RlciBhcyBJRGF0YWJhc2VJbnN0YW5jZSkuaW5zdGFuY2VFbmRwb2ludC5wb3J0XG5cbiAgICAgIGNvbnN0IGlkZW50aWZpZXIgPSAocHJvcHMucHJvdmlkZXIuY2x1c3RlciBhcyBJRGF0YWJhc2VDbHVzdGVyKS5jbHVzdGVySWRlbnRpZmllclxuICAgICAgICA/IChwcm9wcy5wcm92aWRlci5jbHVzdGVyIGFzIElEYXRhYmFzZUNsdXN0ZXIpLmNsdXN0ZXJJZGVudGlmaWVyXG4gICAgICAgIDogKHByb3BzLnByb3ZpZGVyLmNsdXN0ZXIgYXMgSURhdGFiYXNlSW5zdGFuY2UpLmluc3RhbmNlSWRlbnRpZmllclxuXG4gICAgICBjb25zdCBzZWNyZXRUZW1wbGF0ZSA9IHtcbiAgICAgICAgZGJDbHVzdGVySWRlbnRpZmllcjogaWRlbnRpZmllcixcbiAgICAgICAgZW5naW5lOiBwcm9wcy5wcm92aWRlci5lbmdpbmUsXG4gICAgICAgIGhvc3Q6IGhvc3QsXG4gICAgICAgIHBvcnQ6IHBvcnQsXG4gICAgICAgIHVzZXJuYW1lOiBwcm9wcy5yb2xlTmFtZSxcbiAgICAgICAgZGJuYW1lOiBwcm9wcy5kYXRhYmFzZSA/IHByb3BzLmRhdGFiYXNlLmRhdGFiYXNlTmFtZSA6IHByb3BzLmRhdGFiYXNlTmFtZSxcbiAgICAgIH1cblxuICAgICAgdGhpcy5zZWNyZXQgPSBuZXcgU2VjcmV0KHRoaXMsIFwiU2VjcmV0XCIsIHtcbiAgICAgICAgc2VjcmV0TmFtZTogcHJvcHMuc2VjcmV0TmFtZSxcbiAgICAgICAgZW5jcnlwdGlvbktleTogcHJvcHMuZW5jcnlwdGlvbktleSxcbiAgICAgICAgZGVzY3JpcHRpb246IGBHZW5lcmF0ZWQgc2VjcmV0IGZvciAke3Byb3BzLnByb3ZpZGVyLmVuZ2luZX0gcm9sZSAke3Byb3BzLnJvbGVOYW1lfWAsXG4gICAgICAgIC4uLihwcm9wcy5lbmFibGVJYW1BdXRoXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIC8vIEZvciBJQU0gYXV0aCwgY3JlYXRlIHNlY3JldCB3aXRob3V0IHBhc3N3b3JkIGdlbmVyYXRpb25cbiAgICAgICAgICAgICAgc2VjcmV0U3RyaW5nVGVtcGxhdGU6IEpTT04uc3RyaW5naWZ5KHNlY3JldFRlbXBsYXRlKSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgLy8gRm9yIHBhc3N3b3JkIGF1dGgsIGdlbmVyYXRlIHBhc3N3b3JkXG4gICAgICAgICAgICAgIGdlbmVyYXRlU2VjcmV0U3RyaW5nOiB7XG4gICAgICAgICAgICAgICAgcGFzc3dvcmRMZW5ndGg6IDMwLCAvLyBPcmFjbGUgcGFzc3dvcmQgY2Fubm90IGhhdmUgbW9yZSB0aGFuIDMwIGNoYXJhY3RlcnNcbiAgICAgICAgICAgICAgICBzZWNyZXRTdHJpbmdUZW1wbGF0ZTogSlNPTi5zdHJpbmdpZnkoc2VjcmV0VGVtcGxhdGUpLFxuICAgICAgICAgICAgICAgIGdlbmVyYXRlU3RyaW5nS2V5OiBcInBhc3N3b3JkXCIsXG4gICAgICAgICAgICAgICAgZXhjbHVkZUNoYXJhY3RlcnM6IFwiICUrfmAjJCYqKCl8W117fTo7PD4/IScvQFxcXCJcXFxcXCIsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgcmVtb3ZhbFBvbGljeTogUmVtb3ZhbFBvbGljeS5ERVNUUk9ZLFxuICAgICAgfSlcblxuICAgICAgLy8gQ3JlYXRlIFBhcmFtZXRlcnMgaWYgcGFyYW1ldGVyUHJlZml4IGlzIHByb3ZpZGVkXG4gICAgICBpZiAocHJvcHMucGFyYW1ldGVyUHJlZml4KSB7XG4gICAgICAgIGNvbnN0IHBhcmFtRGF0YSA9IHtcbiAgICAgICAgICBkYkNsdXN0ZXJJZGVudGlmaWVyOiBpZGVudGlmaWVyLFxuICAgICAgICAgIGVuZ2luZTogcHJvcHMucHJvdmlkZXIuZW5naW5lLFxuICAgICAgICAgIGhvc3Q6IGhvc3QsXG4gICAgICAgICAgcG9ydDogcG9ydCxcbiAgICAgICAgICB1c2VybmFtZTogcHJvcHMucm9sZU5hbWUsXG4gICAgICAgICAgZGJuYW1lOiBwcm9wcy5kYXRhYmFzZSA/IHByb3BzLmRhdGFiYXNlLmRhdGFiYXNlTmFtZSA6IHByb3BzLmRhdGFiYXNlTmFtZSxcbiAgICAgICAgfVxuXG4gICAgICAgIG5ldyBQYXJhbWV0ZXJzKHRoaXMsIFwiUGFyYW1ldGVyc1wiLCB7XG4gICAgICAgICAgc2VjcmV0QXJuOiBwcm9wcy5wcm92aWRlci5zZWNyZXQ/LnNlY3JldEFybiB8fCBcIlwiLFxuICAgICAgICAgIHBhcmFtZXRlclByZWZpeDogcHJvcHMucGFyYW1ldGVyUHJlZml4LFxuICAgICAgICAgIHBhc3N3b3JkQXJuOiBwcm9wcy5lbmFibGVJYW1BdXRoID8gXCJcIiA6IHRoaXMuc2VjcmV0LnNlY3JldEFybixcbiAgICAgICAgICBwcm92aWRlclNlcnZpY2VUb2tlbjogcHJvcHMucHJvdmlkZXIuc2VydmljZVRva2VuLFxuICAgICAgICAgIHByb3ZpZGVyOiBwcm9wcy5wcm92aWRlcixcbiAgICAgICAgICBwYXJhbURhdGEsXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgcm9sZSA9IG5ldyBDdXN0b21SZXNvdXJjZVJvbGUodGhpcywgXCJQb3N0Z3Jlc1JvbGVcIiwge1xuICAgICAgcHJvdmlkZXI6IHByb3BzLnByb3ZpZGVyLFxuICAgICAgcm9sZU5hbWU6IHByb3BzLnJvbGVOYW1lLFxuICAgICAgcGFzc3dvcmRBcm46XG4gICAgICAgIHByb3BzLmVuYWJsZUlhbUF1dGggfHwgcHJvcHMucHJvdmlkZXIuZW5naW5lID09PSBEYXRhYmFzZUVuZ2luZS5EU1FMXG4gICAgICAgICAgPyBcIlwiXG4gICAgICAgICAgOiB0aGlzLnNlY3JldCEuc2VjcmV0QXJuLFxuICAgICAgZGF0YWJhc2U6IHByb3BzLmRhdGFiYXNlLFxuICAgICAgZGF0YWJhc2VOYW1lOiBwcm9wcy5kYXRhYmFzZU5hbWUsXG4gICAgICBlbmFibGVJYW1BdXRoOiBwcm9wcy5lbmFibGVJYW1BdXRoIHx8IHByb3BzLnByb3ZpZGVyLmVuZ2luZSA9PT0gRGF0YWJhc2VFbmdpbmUuRFNRTCxcbiAgICB9KVxuXG4gICAgaWYgKHRoaXMuc2VjcmV0KSB7XG4gICAgICByb2xlLm5vZGUuYWRkRGVwZW5kZW5jeSh0aGlzLnNlY3JldClcbiAgICAgIHRoaXMuc2VjcmV0LmdyYW50UmVhZChwcm9wcy5wcm92aWRlci5oYW5kbGVyKVxuICAgICAgaWYgKHRoaXMuc2VjcmV0LmVuY3J5cHRpb25LZXkpIHtcbiAgICAgICAgLy8gSXQgc2VlbXMgd2UgbmVlZCB0byBncmFudCBleHBsaWNpdCBwZXJtaXNzaW9uXG4gICAgICAgIHRoaXMuc2VjcmV0LmVuY3J5cHRpb25LZXkuZ3JhbnREZWNyeXB0KHByb3BzLnByb3ZpZGVyLmhhbmRsZXIpXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5yb2xlTmFtZSA9IHByb3BzLnJvbGVOYW1lXG4gIH1cbn1cbiJdfQ==
package/lib/schema.js CHANGED
@@ -27,5 +27,5 @@ class Schema extends aws_cdk_lib_1.CustomResource {
27
27
  }
28
28
  exports.Schema = Schema;
29
29
  _a = JSII_RTTI_SYMBOL_1;
30
- Schema[_a] = { fqn: "cdk-rds-sql.Schema", version: "7.2.3" };
30
+ Schema[_a] = { fqn: "cdk-rds-sql.Schema", version: "7.3.1" };
31
31
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZW1hLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3NjaGVtYS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDZDQUE0QztBQUc1QyxpQ0FBdUM7QUE4QnZDLE1BQWEsTUFBTyxTQUFRLDRCQUFjO0lBR3hDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBa0I7UUFDMUQsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUU7WUFDZixZQUFZLEVBQUUsS0FBSyxDQUFDLFFBQVEsQ0FBQyxZQUFZO1lBQ3pDLFVBQVUsRUFBRTtnQkFDVixRQUFRLEVBQUUscUJBQWMsQ0FBQyxNQUFNO2dCQUMvQixVQUFVLEVBQUUsS0FBSyxDQUFDLFVBQVU7Z0JBQzVCLEdBQUcsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDaEYsWUFBWSxFQUFFLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxTQUFTO2dCQUN0RSxRQUFRLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVM7YUFDdkQ7U0FDRixDQUFDLENBQUE7UUFDRixJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDdkMsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUMsVUFBVSxDQUFBO1FBQ2xDLElBQUksS0FBSyxDQUFDLFFBQVE7WUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDM0QsSUFBSSxLQUFLLENBQUMsSUFBSTtZQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUNyRCxDQUFDOztBQWxCSCx3QkFtQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDdXN0b21SZXNvdXJjZSB9IGZyb20gXCJhd3MtY2RrLWxpYlwiXG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiXG5pbXBvcnQgeyBJRGF0YWJhc2UgfSBmcm9tIFwiLi9kYXRhYmFzZVwiXG5pbXBvcnQgeyBSZHNTcWxSZXNvdXJjZSB9IGZyb20gXCIuL2VudW1cIlxuaW1wb3J0IHsgSVByb3ZpZGVyIH0gZnJvbSBcIi4vcHJvdmlkZXJcIlxuaW1wb3J0IHsgUm9sZSB9IGZyb20gXCIuL3JvbGVcIlxuXG5leHBvcnQgaW50ZXJmYWNlIFNjaGVtYVByb3BzIHtcbiAgLyoqXG4gICAqIFByb3ZpZGVyLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJvdmlkZXI6IElQcm92aWRlclxuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBkYXRhYmFzZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSB1c2UgZGVmYXVsdCBkYXRhYmFzZVxuICAgKi9cbiAgcmVhZG9ubHkgZGF0YWJhc2U/OiBJRGF0YWJhc2VcblxuICAvKipcbiAgICogU2NoZW1hIG5hbWUuXG4gICAqL1xuICByZWFkb25seSBzY2hlbWFOYW1lOiBzdHJpbmdcblxuICAvKipcbiAgICogT3B0aW9uYWwgcm9sZSB3aGljaCB3aWxsIGJlIGdyYW50ZWQgdXNhZ2UgYW5kIGNyZWF0ZSBwZXJtaXNzaW9uc1xuICAgKiB0byB0aGlzIHNjaGVtYS4gVGhpcyB3YXkgdGhlIHJvbGUgY2FuIHJlYWQgaXRzIG93biB0YWJsZXMsIGJ1dFxuICAgKiBjYW5ub3Qgc2VlIG9yIGFjY2VzcyB0YWJsZXMgY3JlYXRlZCBieSBvdGhlcnMuXG4gICAqL1xuICByZWFkb25seSByb2xlPzogUm9sZVxufVxuXG5leHBvcnQgY2xhc3MgU2NoZW1hIGV4dGVuZHMgQ3VzdG9tUmVzb3VyY2Uge1xuICBwdWJsaWMgcmVhZG9ubHkgc2NoZW1hTmFtZTogc3RyaW5nXG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFNjaGVtYVByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCB7XG4gICAgICBzZXJ2aWNlVG9rZW46IHByb3BzLnByb3ZpZGVyLnNlcnZpY2VUb2tlbixcbiAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgUmVzb3VyY2U6IFJkc1NxbFJlc291cmNlLlNDSEVNQSxcbiAgICAgICAgUmVzb3VyY2VJZDogcHJvcHMuc2NoZW1hTmFtZSxcbiAgICAgICAgLi4uKHByb3BzLnByb3ZpZGVyLnNlY3JldCA/IHsgU2VjcmV0QXJuOiBwcm9wcy5wcm92aWRlci5zZWNyZXQuc2VjcmV0QXJuIH0gOiB7fSksXG4gICAgICAgIERhdGFiYXNlTmFtZTogcHJvcHMuZGF0YWJhc2UgPyBwcm9wcy5kYXRhYmFzZS5kYXRhYmFzZU5hbWUgOiB1bmRlZmluZWQsXG4gICAgICAgIFJvbGVOYW1lOiBwcm9wcy5yb2xlID8gcHJvcHMucm9sZS5yb2xlTmFtZSA6IHVuZGVmaW5lZCxcbiAgICAgIH0sXG4gICAgfSlcbiAgICB0aGlzLm5vZGUuYWRkRGVwZW5kZW5jeShwcm9wcy5wcm92aWRlcilcbiAgICB0aGlzLnNjaGVtYU5hbWUgPSBwcm9wcy5zY2hlbWFOYW1lXG4gICAgaWYgKHByb3BzLmRhdGFiYXNlKSB0aGlzLm5vZGUuYWRkRGVwZW5kZW5jeShwcm9wcy5kYXRhYmFzZSlcbiAgICBpZiAocHJvcHMucm9sZSkgdGhpcy5ub2RlLmFkZERlcGVuZGVuY3kocHJvcHMucm9sZSlcbiAgfVxufVxuIl19
package/lib/sql.js CHANGED
@@ -24,5 +24,5 @@ class Sql extends aws_cdk_lib_1.CustomResource {
24
24
  }
25
25
  exports.Sql = Sql;
26
26
  _a = JSII_RTTI_SYMBOL_1;
27
- Sql[_a] = { fqn: "cdk-rds-sql.Sql", version: "7.2.3" };
27
+ Sql[_a] = { fqn: "cdk-rds-sql.Sql", version: "7.3.1" };
28
28
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3FsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3NxbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDZDQUE0QztBQUc1QyxpQ0FBdUM7QUEyQnZDLE1BQWEsR0FBSSxTQUFRLDRCQUFjO0lBQ3JDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBZTtRQUN2RCxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRTtZQUNmLFlBQVksRUFBRSxLQUFLLENBQUMsUUFBUSxDQUFDLFlBQVk7WUFDekMsVUFBVSxFQUFFO2dCQUNWLFFBQVEsRUFBRSxxQkFBYyxDQUFDLEdBQUc7Z0JBQzVCLEdBQUcsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDaEYsWUFBWSxFQUFFLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxTQUFTO2dCQUN0RSxTQUFTLEVBQUUsS0FBSyxDQUFDLFNBQVM7Z0JBQzFCLFFBQVEsRUFBRSxLQUFLLENBQUMsUUFBUTthQUN6QjtTQUNGLENBQUMsQ0FBQTtRQUNGLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUN2QyxJQUFJLEtBQUssQ0FBQyxRQUFRO1lBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQzdELENBQUM7O0FBZEgsa0JBZUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDdXN0b21SZXNvdXJjZSB9IGZyb20gXCJhd3MtY2RrLWxpYlwiXG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiXG5pbXBvcnQgeyBJRGF0YWJhc2UgfSBmcm9tIFwiLi9kYXRhYmFzZVwiXG5pbXBvcnQgeyBSZHNTcWxSZXNvdXJjZSB9IGZyb20gXCIuL2VudW1cIlxuaW1wb3J0IHsgSVByb3ZpZGVyIH0gZnJvbSBcIi4vcHJvdmlkZXJcIlxuXG5leHBvcnQgaW50ZXJmYWNlIFNxbFByb3BzIHtcbiAgLyoqXG4gICAqIFByb3ZpZGVyLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJvdmlkZXI6IElQcm92aWRlclxuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBkYXRhYmFzZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSB1c2UgZGVmYXVsdCBkYXRhYmFzZVxuICAgKi9cbiAgcmVhZG9ubHkgZGF0YWJhc2U/OiBJRGF0YWJhc2VcblxuICAvKipcbiAgICogU1FMLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RhdGVtZW50Pzogc3RyaW5nXG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsIHN0YXRtZW50IHRvIGJlIGV4ZWN1dGVkIHdoZW4gdGhlIHJlc291cmNlIGlzIGRlbGV0ZWRcbiAgICovXG4gIHJlYWRvbmx5IHJvbGxiYWNrPzogc3RyaW5nXG59XG5cbmV4cG9ydCBjbGFzcyBTcWwgZXh0ZW5kcyBDdXN0b21SZXNvdXJjZSB7XG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBTcWxQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwge1xuICAgICAgc2VydmljZVRva2VuOiBwcm9wcy5wcm92aWRlci5zZXJ2aWNlVG9rZW4sXG4gICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIFJlc291cmNlOiBSZHNTcWxSZXNvdXJjZS5TUUwsXG4gICAgICAgIC4uLihwcm9wcy5wcm92aWRlci5zZWNyZXQgPyB7IFNlY3JldEFybjogcHJvcHMucHJvdmlkZXIuc2VjcmV0LnNlY3JldEFybiB9IDoge30pLFxuICAgICAgICBEYXRhYmFzZU5hbWU6IHByb3BzLmRhdGFiYXNlID8gcHJvcHMuZGF0YWJhc2UuZGF0YWJhc2VOYW1lIDogdW5kZWZpbmVkLFxuICAgICAgICBTdGF0ZW1lbnQ6IHByb3BzLnN0YXRlbWVudCxcbiAgICAgICAgUm9sbGJhY2s6IHByb3BzLnJvbGxiYWNrLFxuICAgICAgfSxcbiAgICB9KVxuICAgIHRoaXMubm9kZS5hZGREZXBlbmRlbmN5KHByb3BzLnByb3ZpZGVyKVxuICAgIGlmIChwcm9wcy5kYXRhYmFzZSkgdGhpcy5ub2RlLmFkZERlcGVuZGVuY3kocHJvcHMuZGF0YWJhc2UpXG4gIH1cbn1cbiJdfQ==
package/package.json CHANGED
@@ -105,7 +105,7 @@
105
105
  "publishConfig": {
106
106
  "access": "public"
107
107
  },
108
- "version": "7.2.3",
108
+ "version": "7.3.1",
109
109
  "jest": {
110
110
  "coverageProvider": "v8",
111
111
  "testMatch": [