cdk-turso 0.3.3 → 0.4.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 CHANGED
@@ -3992,7 +3992,7 @@
3992
3992
  },
3993
3993
  "name": "cdk-turso",
3994
3994
  "readme": {
3995
- "markdown": "# CDK Turso\n\nCDK constructs to create [Turso cloud](https://docs.turso.tech/turso-cloud) databases and manage auth tokens.\n\n## Installation\n\n```bash\nnpm install cdk-turso\n```\n\n## Usage\n\nFirst, create a `TursoProvider` with your API token:\n\n```typescript\nimport { Stack } from 'aws-cdk-lib';\nimport { StringParameter } from 'aws-cdk-lib/aws-ssm';\nimport { TursoProvider, TursoDatabase, TursoAuthToken } from 'cdk-turso';\n\nconst stack = new Stack();\n\n// SSM Parameter containing your Turso API token (must be a SecureString)\nconst apiToken = new StringParameter(stack, 'TursoApiToken', {\n parameterName: '/turso/api-token',\n stringValue: 'your-api-token',\n type: ParameterType.SECURE_STRING,\n});\n\n// Create the provider (one per stack)\nconst provider = new TursoProvider(stack, 'TursoProvider', {\n apiToken,\n});\n\nconst database = new TursoDatabase(stack, 'Database', {\n provider,\n databaseName: 'my-database',\n group: 'group-name',\n organizationSlug: 'my-org',\n});\n\n// Access database attributes\ndatabase.dbId; // Database ID\ndatabase.hostname; // Database hostname (e.g., my-database-my-org.turso.io)\ndatabase.databaseName; // Database name\n```\n\n### Auth Token\n\nGenerate a database auth token and store it as a SecureString in SSM Parameter Store:\n\n```typescript\nconst authToken = new TursoAuthToken(stack, 'AuthToken', {\n provider,\n databaseName: database.databaseName,\n organizationSlug: 'my-org',\n parameterName: '/turso/db-token',\n expiration: '2w', // optional, default: 'never'\n authorization: 'read-only', // optional, default: 'full-access'\n});\n\n// The SSM parameter name where the JWT is stored\nauthToken.parameterName;\n```\n\n## API\n\n### TursoProviderProps\n\n| Prop | Type | Required | Description |\n|------|------|----------|-------------|\n| `apiToken` | `ssm.IParameter` | Yes | SSM Parameter containing the Turso platform API token (must be SecureString) |\n| `logGroup` | `ILogGroup` | No | Optional CloudWatch log group for the Lambda handler |\n\n### TursoProvider\n\n| Attribute | Type | Description |\n|-----------|------|-------------|\n| `handler` | `Function` | The Lambda function backing all Turso custom resources (for attaching IAM permissions) |\n| `serviceToken` | `string` | The CDK custom-resource provider service token |\n\n### TursoDatabaseProps\n\n| Prop | Type | Required | Description |\n|------|------|----------|-------------|\n| `provider` | `TursoProvider` | Yes | The Turso provider to use for this database |\n| `databaseName` | `string` | Yes | Database name (lowercase, numbers, dashes only, max 64 chars) |\n| `group` | `string` | Yes | Turso group name (must already exist) |\n| `organizationSlug` | `string` | Yes | Organization slug |\n| `sizeLimit` | `string` | No | Size limit (e.g., '256mb') |\n| `seed` | `TursoDatabaseSeed` | No | Database seed configuration |\n| `encryption` | `TursoDatabaseEncryption` | No | Encryption configuration |\n\n### TursoDatabaseSeed\n\n```typescript\ninterface TursoDatabaseSeed {\n readonly type: string; // Seed type (e.g., 'schema')\n readonly name: string; // Seed name\n readonly timestamp?: string; // Optional timestamp\n}\n```\n\n### TursoDatabaseEncryption\n\n```typescript\ninterface TursoDatabaseEncryption {\n readonly encryptionKey: string; // KMS key ARN\n readonly encryptionCipher: string; // Cipher type (e.g., 'AES')\n}\n```\n\n### TursoDatabase\n\n| Attribute | Type | Description |\n|-----------|------|-------------|\n| `dbId` | `string` | Turso database ID |\n| `hostname` | `string` | DNS hostname (e.g., `my-database-my-org.turso.io`) for libSQL/HTTP connections |\n| `databaseName` | `string` | Database name |\n\n### TursoAuthTokenProps\n\n| Prop | Type | Required | Description |\n|------|------|----------|-------------|\n| `provider` | `TursoProvider` | Yes | The Turso provider to use for this auth token |\n| `databaseName` | `string` | Yes | The name of the Turso database to create an auth token for |\n| `organizationSlug` | `string` | Yes | The Turso organization slug that owns the database |\n| `parameterName` | `string` | Yes | SSM parameter name where the generated JWT will be stored as a SecureString |\n| `expiration` | `string` | No | Token expiry (e.g., `'2w'`, `'1d30m'`). Default: `'never'` |\n| `authorization` | `string` | No | `'full-access'` or `'read-only'`. Default: `'full-access'` |\n\n### TursoAuthToken\n\n| Attribute | Type | Description |\n|-----------|------|-------------|\n| `parameterName` | `string` | The SSM parameter name where the auth token is stored |\n\n## Requirements\n\n- Node.js 24.x runtime for the Lambda handler\n- The Lambda handler requires the AWS SDK for JavaScript v3 (pre-installed in Lambda runtime)\n"
3995
+ "markdown": "# CDK Turso\n\nCDK constructs to create [Turso cloud](https://docs.turso.tech/turso-cloud) databases and manage auth tokens.\n\n## Installation\n\n```bash\nnpm install cdk-turso\n```\n\n## Usage\n\nCreate a `TursoProvider` with your API token:\n\n```typescript\nimport { RemovalPolicy, Stack } from 'aws-cdk-lib';\nimport { ParameterType, StringParameter } from 'aws-cdk-lib/aws-ssm';\nimport { TursoProvider, TursoDatabase, TursoAuthToken } from 'cdk-turso';\n\nconst stack = new Stack();\n\n// SSM Parameter containing your Turso API token (must be a SecureString)\nconst apiToken = new StringParameter(stack, 'TursoApiToken', {\n parameterName: '/turso/api-token',\n stringValue: 'your-api-token',\n type: ParameterType.SECURE_STRING,\n});\n\n// Create the provider (one per stack)\nconst provider = new TursoProvider(stack, 'TursoProvider', {\n apiToken,\n});\n\nconst database = new TursoDatabase(stack, 'Database', {\n provider,\n databaseName: 'my-database',\n group: 'group-name',\n organizationSlug: 'my-org',\n adopt: true, // optional: adopt existing database if it already exists\n removalPolicy: RemovalPolicy.RETAIN, // optional: keep DB on stack delete\n});\n\n// Access database attributes\ndatabase.dbId; // Database ID\ndatabase.hostname; // Database hostname (e.g., my-database-my-org.turso.io)\ndatabase.databaseName; // Database name\n```\n\nIf you run a shared provider in another stack, import it by service token:\n\n```typescript\nconst provider = TursoProvider.fromServiceToken(\n stack,\n 'TursoProvider',\n 'arn:aws:lambda:us-east-1:123456789012:function:shared-turso-provider',\n);\n```\n\n### Auth Token\n\nGenerate a database auth token and store it as a SecureString in SSM Parameter Store:\n\n```typescript\nconst authToken = new TursoAuthToken(stack, 'AuthToken', {\n provider,\n databaseName: database.databaseName,\n organizationSlug: 'my-org',\n parameterName: '/turso/db-token',\n expiration: '2w', // optional, default: 'never'\n authorization: 'read-only', // optional, default: 'full-access'\n removalPolicy: RemovalPolicy.RETAIN, // optional: keep SSM parameter\n});\n\n// The SSM parameter name where the JWT is stored\nauthToken.parameterName;\n```\n\n## API\n\n### TursoProviderProps\n\n| Prop | Type | Required | Description |\n|------|------|----------|-------------|\n| `apiToken` | `ssm.IParameter` | Yes | SSM Parameter containing the Turso platform API token (must be SecureString) |\n| `logGroup` | `ILogGroup` | No | Optional CloudWatch log group for the Lambda handler |\n\n### TursoProvider\n\n| Attribute | Type | Description |\n|-----------|------|-------------|\n| `handler` | `Function` | The Lambda function backing all Turso custom resources (for attaching IAM permissions) |\n| `serviceToken` | `string` | The CDK custom-resource provider service token |\n\nStatic method:\n\n| Method | Returns | Description |\n|--------|---------|-------------|\n| `fromServiceToken(scope, id, serviceToken)` | `ITursoProvider` | Imports an existing Turso custom-resource provider |\n\n### ITursoProvider\n\n| Attribute | Type | Description |\n|-----------|------|-------------|\n| `serviceToken` | `string` | The CDK custom-resource provider service token |\n\n### TursoDatabaseProps\n\n| Prop | Type | Required | Description |\n|------|------|----------|-------------|\n| `provider` | `ITursoProvider` | Yes | The Turso provider to use for this database |\n| `databaseName` | `string` | Yes | Database name (lowercase, numbers, dashes only, max 64 chars) |\n| `group` | `string` | Yes | Turso group name (must already exist) |\n| `organizationSlug` | `string` | Yes | Organization slug |\n| `sizeLimit` | `string` | No | Size limit (e.g., '256mb') |\n| `seed` | `TursoDatabaseSeed` | No | Database seed configuration |\n| `encryption` | `TursoDatabaseEncryption` | No | Encryption configuration |\n| `adopt` | `boolean` | No | On create, adopt an existing database when create returns \"already exists\" |\n| `removalPolicy` | `RemovalPolicy` | No | Custom resource removal policy (for example `RemovalPolicy.RETAIN`) |\n\n### TursoDatabaseSeed\n\n```typescript\ninterface TursoDatabaseSeed {\n readonly type: string; // Seed type (e.g., 'schema')\n readonly name: string; // Seed name\n readonly timestamp?: string; // Optional timestamp\n}\n```\n\n### TursoDatabaseEncryption\n\n```typescript\ninterface TursoDatabaseEncryption {\n readonly encryptionKey: string; // KMS key ARN\n readonly encryptionCipher: string; // Cipher type (e.g., 'AES')\n}\n```\n\n### TursoDatabase\n\n| Attribute | Type | Description |\n|-----------|------|-------------|\n| `dbId` | `string` | Turso database ID |\n| `hostname` | `string` | DNS hostname (e.g., `my-database-my-org.turso.io`) for libSQL/HTTP connections |\n| `databaseName` | `string` | Database name |\n\n### TursoAuthTokenProps\n\n| Prop | Type | Required | Description |\n|------|------|----------|-------------|\n| `provider` | `ITursoProvider` | Yes | The Turso provider to use for this auth token |\n| `databaseName` | `string` | Yes | The name of the Turso database to create an auth token for |\n| `organizationSlug` | `string` | Yes | The Turso organization slug that owns the database |\n| `parameterName` | `string` | Yes | SSM parameter name where the generated JWT will be stored as a SecureString |\n| `expiration` | `string` | No | Token expiry (e.g., `'2w'`, `'1d30m'`). Default: `'never'` |\n| `authorization` | `string` | No | `'full-access'` or `'read-only'`. Default: `'full-access'` |\n| `removalPolicy` | `RemovalPolicy` | No | Custom resource removal policy (for example `RemovalPolicy.RETAIN`) |\n\n### TursoAuthToken\n\n| Attribute | Type | Description |\n|-----------|------|-------------|\n| `parameterName` | `string` | The SSM parameter name where the auth token is stored |\n\n## Requirements\n\n- Node.js 24.x runtime for the Lambda handler\n- The Lambda handler requires the AWS SDK for JavaScript v3 (pre-installed in Lambda runtime)\n"
3996
3996
  },
3997
3997
  "repository": {
3998
3998
  "type": "git",
@@ -4005,6 +4005,39 @@
4005
4005
  }
4006
4006
  },
4007
4007
  "types": {
4008
+ "cdk-turso.ITursoProvider": {
4009
+ "assembly": "cdk-turso",
4010
+ "docs": {
4011
+ "stability": "stable",
4012
+ "summary": "Shared Turso custom-resource provider contract."
4013
+ },
4014
+ "fqn": "cdk-turso.ITursoProvider",
4015
+ "kind": "interface",
4016
+ "locationInModule": {
4017
+ "filename": "src/turso-provider.ts",
4018
+ "line": 12
4019
+ },
4020
+ "name": "ITursoProvider",
4021
+ "properties": [
4022
+ {
4023
+ "abstract": true,
4024
+ "docs": {
4025
+ "stability": "stable",
4026
+ "summary": "The CDK custom-resource provider service token."
4027
+ },
4028
+ "immutable": true,
4029
+ "locationInModule": {
4030
+ "filename": "src/turso-provider.ts",
4031
+ "line": 16
4032
+ },
4033
+ "name": "serviceToken",
4034
+ "type": {
4035
+ "primitive": "string"
4036
+ }
4037
+ }
4038
+ ],
4039
+ "symbolId": "src/turso-provider:ITursoProvider"
4040
+ },
4008
4041
  "cdk-turso.TursoAuthToken": {
4009
4042
  "assembly": "cdk-turso",
4010
4043
  "base": "constructs.Construct",
@@ -4018,7 +4051,7 @@
4018
4051
  },
4019
4052
  "locationInModule": {
4020
4053
  "filename": "src/turso-auth-token.ts",
4021
- "line": 46
4054
+ "line": 53
4022
4055
  },
4023
4056
  "parameters": [
4024
4057
  {
@@ -4044,7 +4077,7 @@
4044
4077
  "kind": "class",
4045
4078
  "locationInModule": {
4046
4079
  "filename": "src/turso-auth-token.ts",
4047
- "line": 40
4080
+ "line": 47
4048
4081
  },
4049
4082
  "name": "TursoAuthToken",
4050
4083
  "properties": [
@@ -4056,7 +4089,7 @@
4056
4089
  "immutable": true,
4057
4090
  "locationInModule": {
4058
4091
  "filename": "src/turso-auth-token.ts",
4059
- "line": 44
4092
+ "line": 51
4060
4093
  },
4061
4094
  "name": "parameterName",
4062
4095
  "type": {
@@ -4140,7 +4173,7 @@
4140
4173
  },
4141
4174
  "name": "provider",
4142
4175
  "type": {
4143
- "fqn": "cdk-turso.TursoProvider"
4176
+ "fqn": "cdk-turso.ITursoProvider"
4144
4177
  }
4145
4178
  },
4146
4179
  {
@@ -4178,6 +4211,24 @@
4178
4211
  "type": {
4179
4212
  "primitive": "string"
4180
4213
  }
4214
+ },
4215
+ {
4216
+ "abstract": true,
4217
+ "docs": {
4218
+ "remarks": "Set to `RemovalPolicy.RETAIN` to keep the SSM parameter on stack\ndeletion.",
4219
+ "stability": "stable",
4220
+ "summary": "Removal policy for the underlying custom resource."
4221
+ },
4222
+ "immutable": true,
4223
+ "locationInModule": {
4224
+ "filename": "src/turso-auth-token.ts",
4225
+ "line": 44
4226
+ },
4227
+ "name": "removalPolicy",
4228
+ "optional": true,
4229
+ "type": {
4230
+ "fqn": "aws-cdk-lib.RemovalPolicy"
4231
+ }
4181
4232
  }
4182
4233
  ],
4183
4234
  "symbolId": "src/turso-auth-token:TursoAuthTokenProps"
@@ -4195,7 +4246,7 @@
4195
4246
  },
4196
4247
  "locationInModule": {
4197
4248
  "filename": "src/turso-database.ts",
4198
- "line": 35
4249
+ "line": 52
4199
4250
  },
4200
4251
  "parameters": [
4201
4252
  {
@@ -4221,7 +4272,7 @@
4221
4272
  "kind": "class",
4222
4273
  "locationInModule": {
4223
4274
  "filename": "src/turso-database.ts",
4224
- "line": 26
4275
+ "line": 43
4225
4276
  },
4226
4277
  "name": "TursoDatabase",
4227
4278
  "properties": [
@@ -4232,7 +4283,7 @@
4232
4283
  "immutable": true,
4233
4284
  "locationInModule": {
4234
4285
  "filename": "src/turso-database.ts",
4235
- "line": 33
4286
+ "line": 50
4236
4287
  },
4237
4288
  "name": "databaseName",
4238
4289
  "type": {
@@ -4246,7 +4297,7 @@
4246
4297
  "immutable": true,
4247
4298
  "locationInModule": {
4248
4299
  "filename": "src/turso-database.ts",
4249
- "line": 27
4300
+ "line": 44
4250
4301
  },
4251
4302
  "name": "dbId",
4252
4303
  "type": {
@@ -4261,7 +4312,7 @@
4261
4312
  "immutable": true,
4262
4313
  "locationInModule": {
4263
4314
  "filename": "src/turso-database.ts",
4264
- "line": 32
4315
+ "line": 49
4265
4316
  },
4266
4317
  "name": "hostname",
4267
4318
  "type": {
@@ -4389,7 +4440,26 @@
4389
4440
  },
4390
4441
  "name": "provider",
4391
4442
  "type": {
4392
- "fqn": "cdk-turso.TursoProvider"
4443
+ "fqn": "cdk-turso.ITursoProvider"
4444
+ }
4445
+ },
4446
+ {
4447
+ "abstract": true,
4448
+ "docs": {
4449
+ "default": "false",
4450
+ "remarks": "This flag is only used during Create requests.",
4451
+ "stability": "stable",
4452
+ "summary": "If true, the provider will adopt an existing Turso database when creation reports that the database already exists."
4453
+ },
4454
+ "immutable": true,
4455
+ "locationInModule": {
4456
+ "filename": "src/turso-database.ts",
4457
+ "line": 33
4458
+ },
4459
+ "name": "adopt",
4460
+ "optional": true,
4461
+ "type": {
4462
+ "primitive": "boolean"
4393
4463
  }
4394
4464
  },
4395
4465
  {
@@ -4408,6 +4478,24 @@
4408
4478
  "fqn": "cdk-turso.TursoDatabaseEncryption"
4409
4479
  }
4410
4480
  },
4481
+ {
4482
+ "abstract": true,
4483
+ "docs": {
4484
+ "remarks": "Set to `RemovalPolicy.RETAIN` to keep the Turso database on stack\ndeletion.",
4485
+ "stability": "stable",
4486
+ "summary": "Removal policy for the underlying custom resource."
4487
+ },
4488
+ "immutable": true,
4489
+ "locationInModule": {
4490
+ "filename": "src/turso-database.ts",
4491
+ "line": 40
4492
+ },
4493
+ "name": "removalPolicy",
4494
+ "optional": true,
4495
+ "type": {
4496
+ "fqn": "aws-cdk-lib.RemovalPolicy"
4497
+ }
4498
+ },
4411
4499
  {
4412
4500
  "abstract": true,
4413
4501
  "docs": {
@@ -4521,7 +4609,7 @@
4521
4609
  },
4522
4610
  "locationInModule": {
4523
4611
  "filename": "src/turso-provider.ts",
4524
- "line": 41
4612
+ "line": 72
4525
4613
  },
4526
4614
  "parameters": [
4527
4615
  {
@@ -4544,11 +4632,53 @@
4544
4632
  }
4545
4633
  ]
4546
4634
  },
4635
+ "interfaces": [
4636
+ "cdk-turso.ITursoProvider"
4637
+ ],
4547
4638
  "kind": "class",
4548
4639
  "locationInModule": {
4549
4640
  "filename": "src/turso-provider.ts",
4550
- "line": 28
4641
+ "line": 48
4551
4642
  },
4643
+ "methods": [
4644
+ {
4645
+ "docs": {
4646
+ "stability": "stable",
4647
+ "summary": "Imports an existing Turso provider by service token."
4648
+ },
4649
+ "locationInModule": {
4650
+ "filename": "src/turso-provider.ts",
4651
+ "line": 52
4652
+ },
4653
+ "name": "fromServiceToken",
4654
+ "parameters": [
4655
+ {
4656
+ "name": "scope",
4657
+ "type": {
4658
+ "fqn": "constructs.Construct"
4659
+ }
4660
+ },
4661
+ {
4662
+ "name": "id",
4663
+ "type": {
4664
+ "primitive": "string"
4665
+ }
4666
+ },
4667
+ {
4668
+ "name": "serviceToken",
4669
+ "type": {
4670
+ "primitive": "string"
4671
+ }
4672
+ }
4673
+ ],
4674
+ "returns": {
4675
+ "type": {
4676
+ "fqn": "cdk-turso.ITursoProvider"
4677
+ }
4678
+ },
4679
+ "static": true
4680
+ }
4681
+ ],
4552
4682
  "name": "TursoProvider",
4553
4683
  "properties": [
4554
4684
  {
@@ -4560,7 +4690,7 @@
4560
4690
  "immutable": true,
4561
4691
  "locationInModule": {
4562
4692
  "filename": "src/turso-provider.ts",
4563
- "line": 34
4693
+ "line": 65
4564
4694
  },
4565
4695
  "name": "handler",
4566
4696
  "type": {
@@ -4575,9 +4705,10 @@
4575
4705
  "immutable": true,
4576
4706
  "locationInModule": {
4577
4707
  "filename": "src/turso-provider.ts",
4578
- "line": 39
4708
+ "line": 70
4579
4709
  },
4580
4710
  "name": "serviceToken",
4711
+ "overrides": "cdk-turso.ITursoProvider",
4581
4712
  "type": {
4582
4713
  "primitive": "string"
4583
4714
  }
@@ -4595,7 +4726,7 @@
4595
4726
  "kind": "interface",
4596
4727
  "locationInModule": {
4597
4728
  "filename": "src/turso-provider.ts",
4598
- "line": 9
4729
+ "line": 29
4599
4730
  },
4600
4731
  "name": "TursoProviderProps",
4601
4732
  "properties": [
@@ -4608,7 +4739,7 @@
4608
4739
  "immutable": true,
4609
4740
  "locationInModule": {
4610
4741
  "filename": "src/turso-provider.ts",
4611
- "line": 14
4742
+ "line": 34
4612
4743
  },
4613
4744
  "name": "apiToken",
4614
4745
  "type": {
@@ -4625,7 +4756,7 @@
4625
4756
  "immutable": true,
4626
4757
  "locationInModule": {
4627
4758
  "filename": "src/turso-provider.ts",
4628
- "line": 20
4759
+ "line": 40
4629
4760
  },
4630
4761
  "name": "logGroup",
4631
4762
  "optional": true,
@@ -4637,6 +4768,6 @@
4637
4768
  "symbolId": "src/turso-provider:TursoProviderProps"
4638
4769
  }
4639
4770
  },
4640
- "version": "0.3.3",
4641
- "fingerprint": "N1aiv7fpRdWTVCEl9bEXfksK0Ax9YYQBzrVxaPCT0SM="
4771
+ "version": "0.4.0",
4772
+ "fingerprint": "IS+Survie1liGWodZx7DEmCYC9BiVWorwKnEdEgMSYY="
4642
4773
  }
package/AGENTS.md CHANGED
@@ -1,146 +1,149 @@
1
1
  # AGENTS.md
2
-
3
- Guidance for AI coding agents working in this repository.
2
+ Guidance for agentic coding assistants working in this repository.
4
3
 
5
4
  ## Project Overview
6
-
7
- CDK construct library for provisioning Turso cloud databases. Built with projen's `AwsCdkConstructLibrary` template, using JSII for multi-language support. Source must remain JSII-compatible.
8
-
9
- ## Commands
10
-
5
+ `cdk-turso` is a JSII-based AWS CDK construct library for Turso resources,
6
+ implemented through Lambda-backed CloudFormation custom resources.
7
+ - Main constructs: `TursoProvider`, `TursoDatabase`, `TursoAuthToken`
8
+ - Language: TypeScript with strict settings
9
+ - Build system: projen (`AwsCdkConstructLibrary`)
10
+ - Lint/format: Biome (ESLint is disabled)
11
+
12
+ ## Build, Lint, and Test Commands
13
+ Use npm/projen tasks from the repo root.
11
14
  ```bash
12
- npm run build # Full pipeline: compile test package
13
- npm run compile # jsii compiler (TypeScript → JS + .d.ts) + esbuild handler bundle
14
- npm run test # Jest (with coverage) + Biome lint
15
- npm run test:watch # Jest in watch mode
16
- npm run watch # jsii in watch mode (for development)
17
- npx projen biome # Run Biome formatter + linter with --fix
18
- npx projen # Regenerate project files from .projenrc.ts
15
+ npm run build # compile -> docgen -> test -> package
16
+ npm run compile # jsii compile + esbuild bundle
17
+ npm run test # jest + biome
18
+ npm run test:watch # jest watch mode
19
+ npm run watch # jsii watch mode
20
+ npx projen biome # biome check/format with --write
21
+ npx projen # regenerate projen-managed files
19
22
  ```
20
23
 
21
- Run a single test file:
24
+ ### Single-test execution (important)
25
+ Run one test file:
22
26
  ```bash
23
27
  npx jest --passWithNoTests test/handler.test.ts
24
28
  ```
25
-
26
- ## Projen: Critical Rule
27
-
28
- Most config files are **generated by projen** and must NOT be edited directly. This includes `package.json`, `biome.jsonc`, `tsconfig.json`, `tsconfig.dev.json`, GitHub workflows, `.mergify.yml`, and anything marked `~~ Generated by projen`. To change project configuration, edit `.projenrc.ts` and run `npx projen`.
29
-
30
- ## Architecture
31
-
29
+ Run one named test:
30
+ ```bash
31
+ npx jest --passWithNoTests test/handler.test.ts -t "create with adopt"
32
+ ```
33
+ Run construct tests only:
34
+ ```bash
35
+ npx jest --passWithNoTests test/turso-database.test.ts
32
36
  ```
37
+
38
+ ## Projen and Generated Files
39
+ Do not manually edit generated files; edit `.projenrc.ts`, then run
40
+ `npx projen`.
41
+ Common generated files include:
42
+ - `package.json`
43
+ - `biome.jsonc`
44
+ - `tsconfig.json`
45
+ - `tsconfig.dev.json`
46
+ - `.github/workflows/*`
47
+ - `.mergify.yml`
48
+ - files with `~~ Generated by projen`
49
+ `API.md` is generated by `jsii-docgen` during `npm run build`.
50
+
51
+ ## Repository Layout
52
+ ```text
33
53
  src/
34
- index.ts # Barrel exports — all public symbols re-exported here
35
- turso-database.ts # Main CDK construct for Turso databases
36
- turso-auth-token.ts # Auth token generation construct
37
- turso-provider.ts # Shared CloudFormation custom resource provider
38
- handler/index.ts # Lambda handler for custom resources (bundled via esbuild)
54
+ index.ts # Public exports barrel
55
+ turso-provider.ts # Shared provider (Lambda + Provider)
56
+ turso-database.ts # Database construct
57
+ turso-auth-token.ts # Auth token construct
58
+ handler/index.ts # Lambda custom-resource handler
39
59
  test/
40
- turso-database.test.ts # Construct unit tests (CDK assertions)
41
- turso-auth-token.test.ts # Auth token construct tests
42
- handler.test.ts # Handler unit tests (Jest mocks)
43
- lib/ # Compiled output (generated, gitignored)
44
- dist/ # Distribution packages (generated, gitignored)
60
+ turso-database.test.ts # CDK assertion tests
61
+ turso-auth-token.test.ts # CDK assertion tests
62
+ handler.test.ts # Handler unit tests with mocks
63
+ lib/ # Generated compile output
64
+ dist/ # Generated JSII packaging output
45
65
  ```
46
66
 
47
- - Peer dependencies: `aws-cdk-lib` (^2.1.0), `constructs` (^10.0.5)
48
- - Handler bundled separately: `esbuild src/handler/index.ts --bundle --platform=node --target=node24 --outfile=lib/handler/index.js --external:@aws-sdk/*`
49
- - Pre-commit hook (husky): runs `npx projen biome && npx projen build`
50
-
51
- ## Code Style (enforced by Biome)
52
-
53
- Biome is the sole linter and formatter. ESLint is disabled.
54
-
55
- ### Formatting
56
- - **2-space** indentation (spaces, not tabs)
57
- - **80-char** max line width
58
- - **Double quotes** for strings: `"hello"` not `'hello'`
59
- - **Semicolons as needed** omit them; Biome inserts only where syntactically required
60
- - **Trailing commas** on all multi-line constructs (arrays, objects, parameters)
61
- - **Arrow parentheses**: always, even for single parameter `(x) => x`
62
- - **Bracket spacing**: `{ a }` not `{a}`
63
-
64
- ### Linting Rules
67
+ ## Dependency and Runtime Notes
68
+ - Peer deps: `aws-cdk-lib` `^2.201.0`, `constructs` `^10.3.0`
69
+ - Lambda target/runtime: Node.js 24.x
70
+ - Handler bundle command is configured in `.projenrc.ts`
71
+ - Pre-commit hook runs: `npx projen biome && npx projen build`
72
+
73
+ ## Formatting and Linting (Biome)
74
+ Follow the enforced formatting profile:
75
+ - 2-space indentation, no tabs
76
+ - line width 80
77
+ - double quotes
78
+ - semicolons only when required
79
+ - trailing commas in multiline literals/params
80
+ - always parenthesize arrow function args: `(x) => x`
81
+ - bracket spacing: `{ a }`
82
+ Important lint rules:
65
83
  - `noUnusedImports`: error
66
84
  - `noUnusedVariables`: error
67
85
  - `noConfusingVoidType`: error
68
- - `noNonNullAssertion`: allowed in `**/*.test.ts` only
69
- - `useNodejsImportProtocol`: off — use `"path"` not `"node:path"`
86
+ - `noNonNullAssertion`: off only in `**/*.test.ts`
87
+ - `useNodejsImportProtocol`: off (`"path"` over `"node:path"`)
70
88
 
71
89
  ## Import Conventions
72
-
73
- ### Ordering
74
- 1. AWS CDK / framework imports (`aws-cdk-lib`, `aws-cdk-lib/*`, `constructs`)
75
- 2. External packages (`@aws-sdk/client-ssm`)
76
- 3. Node.js builtins (`import * as path from "path"`)
77
- 4. Relative imports (`"./turso-database"`, `"../src"`)
78
-
79
- ### Style
80
- - **Named imports** with destructuring: `import { CustomResource, Duration } from "aws-cdk-lib"`
81
- - **Namespace imports** for Node builtins: `import * as path from "path"`
82
- - **`type` keyword** for type-only imports: `import type { IParameter } from "aws-cdk-lib/aws-ssm"`
83
- - **Inline `type`** in mixed imports: `import { type SomeType, someValue } from "..."`
84
- - Use deep CDK imports: `aws-cdk-lib/aws-lambda`, `aws-cdk-lib/aws-ssm`, `aws-cdk-lib/custom-resources`
85
- - Barrel exports in `src/index.ts` are **alphabetically sorted**
90
+ Order imports in this sequence:
91
+ 1. CDK/framework (`aws-cdk-lib`, `aws-cdk-lib/*`, `constructs`)
92
+ 2. External packages (`@aws-sdk/client-ssm`, etc.)
93
+ 3. Node builtins (`import * as path from "path"`)
94
+ 4. Relative imports (`"./..."`, `"../..."`)
95
+ Style rules:
96
+ - Prefer named imports
97
+ - Use namespace imports for Node builtins
98
+ - Use `import type` for type-only imports
99
+ - Use inline `type` specifiers in mixed imports when needed
100
+ - Keep `src/index.ts` exports alphabetically ordered
101
+
102
+ ## TypeScript and API Design
103
+ - Keep code JSII-compatible (public API types should be simple/stable)
104
+ - Respect `strict` mode and avoid `any`
105
+ - Avoid unused locals/parameters and implicit returns
106
+ - Use explicit, narrow interfaces for custom resource properties
107
+ - Prefer `readonly` on interface and public class properties
86
108
 
87
109
  ## Naming Conventions
88
-
89
- | Category | Convention | Example |
90
- |---|---|---|
91
- | Source files | kebab-case `.ts` | `turso-database.ts` |
92
- | Test files | `{source-name}.test.ts` | `handler.test.ts` |
93
- | Classes | PascalCase | `TursoDatabase` |
94
- | Props interfaces | `{ClassName}Props` | `TursoDatabaseProps` |
95
- | Sub-config interfaces | `{ClassName}{Feature}` | `TursoDatabaseEncryption` |
96
- | Interface properties | `readonly`, camelCase | `readonly databaseName: string` |
97
- | Public class properties | `public readonly`, camelCase | `public readonly dbId: string` |
98
- | Functions | camelCase | `handler`, `getApiToken` |
99
- | CDK resource IDs | PascalCase string | `"Handler"`, `"Provider"` |
100
- | CF resource properties | PascalCase string | `"DatabaseName"`, `"Group"` |
101
- | Environment variables | SCREAMING_SNAKE_CASE | `TURSO_API_TOKEN_PARAMETER_NAME` |
102
-
103
- ## TypeScript
104
-
105
- - `strict: true` — all strict checks enabled (`noImplicitAny`, `strictNullChecks`, `strictPropertyInitialization`, etc.)
106
- - `noUnusedLocals: true`, `noUnusedParameters: true`, `noImplicitReturns: true`
107
- - `noFallthroughCasesInSwitch: true`
108
- - Target: `ES2020`, Module: `CommonJS`
109
-
110
- ## CDK Construct Patterns
111
-
112
- - Extend `Construct` from `constructs`, not from `aws-cdk-lib`
113
- - Constructor signature: `constructor(scope: Construct, id: string, props: XxxProps)`
114
- - Call `super(scope, id)` first
115
- - Validate inputs in constructor with `throw new Error(...)` for bad values (regex checks, length limits)
116
- - Custom resource pattern: Lambda Function Provider → CustomResource
117
- - Expose outputs as `public readonly` properties via `cr.getAttString("AttrName")`
118
-
119
- ## Error Handling
120
-
121
- - **Constructor validation**: throw `new Error(...)` with clear messages for invalid props
122
- - **Handler errors**: include HTTP status and response text: `throw new Error(\`Failed to create: ${response.status} ${errorText}\`)`
123
- - **Environment checks**: throw early if required env vars are missing
124
- - **Idempotent deletes**: tolerate 404 on delete operations
125
- - **Graceful handling**: skip delete for unknown/failed physical resource IDs
126
-
127
- ## Testing Patterns
128
-
129
- - Use `describe("ClassName", () => { ... })` as outer wrapper
130
- - Use **`test()`** (not `it()`) for individual cases
131
- - Test names are descriptive sentences: `"creates custom resource with correct properties"`
132
-
133
- ### Construct Tests
134
- - Helper function `createStack()` at top of describe block for shared setup
135
- - CDK assertions: `Template.fromStack(stack)`, `template.hasResource()`, `template.hasResourceProperties()`
136
- - Partial matching: `Match.arrayWith([...])`, `Match.objectLike({...})`
137
- - Validation tests: `expect(() => { ... }).toThrow("exact message")`
138
- - Import constructs from barrel: `import { TursoDatabase } from "../src"`
139
-
140
- ### Handler Tests
141
- - `jest.mock()` at file top level, before imports
142
- - Mock `global.fetch` per test: `global.fetch = jest.fn()`
143
- - `beforeEach`: clear mocks, set env vars, configure default mock responses
144
- - `afterEach`: clean up env vars
145
- - Async error assertions: `await expect(handler(...)).rejects.toThrow("message")`
146
- - Argument checking: `expect(mockFetch).toHaveBeenCalledWith(url, expect.objectContaining({...}))`
110
+ - Files: kebab-case (`turso-database.ts`)
111
+ - Tests: `<source>.test.ts`
112
+ - Classes: PascalCase
113
+ - Props interfaces: `<ClassName>Props`
114
+ - Function/method names: camelCase
115
+ - CDK logical IDs: PascalCase strings (`"Handler"`, `"Provider"`)
116
+ - Custom resource payload keys: PascalCase (`DatabaseName`, `OrganizationSlug`)
117
+ - Env vars: SCREAMING_SNAKE_CASE
118
+
119
+ ## Construct Patterns
120
+ - Extend `Construct` from `constructs`
121
+ - Constructor pattern: `(scope, id, props)` and `super(scope, id)` first
122
+ - Validate inputs early with clear `Error` messages
123
+ - Pattern is `Lambda -> Provider -> CustomResource`
124
+ - Expose CR outputs using `cr.getAttString(...)`
125
+ - Forward `removalPolicy` with `cr.applyRemovalPolicy(...)`
126
+ - `TursoDatabase.adopt` is create-only behavior; updates ignore it
127
+
128
+ ## Error Handling Guidelines
129
+ - Fail fast if required environment variables are missing
130
+ - Include status code and response text for API failures
131
+ - Keep delete operations idempotent (404 is tolerated where intended)
132
+ - Skip destructive delete work for unknown/failed physical IDs
133
+ - In adopt flows, only suppress expected "already exists" create errors
134
+
135
+ ## Testing Guidelines
136
+ - Use `describe(...)` and `test(...)` (not `it(...)`)
137
+ - Use behavior-focused test names
138
+ - Keep construct tests focused on synthesized template assertions
139
+ - Use `Template.fromStack`, `hasResource`, `hasResourceProperties`
140
+ - Use `Match.objectLike` / `Match.arrayWith` for partial assertions
141
+ - In handler tests, mock `global.fetch` per scenario
142
+ - Keep `jest.mock(...)` declarations at top-level before imports
143
+ - Use `await expect(...).rejects.toThrow(...)` for async error checks
144
+
145
+ ## Agent Checklist Before Finishing
146
+ - Run focused tests for changed behavior first
147
+ - Run `npm run test`
148
+ - Run `npm run build` when API surface/types/docs changed
149
+ - Regenerate files only through projen workflows
package/API.md CHANGED
@@ -278,6 +278,8 @@ DNS hostname for the database (e.g., `my-db-my-org.turso.io`). Use with libSQL o
278
278
 
279
279
  ### TursoProvider <a name="TursoProvider" id="cdk-turso.TursoProvider"></a>
280
280
 
281
+ - *Implements:* <a href="#cdk-turso.ITursoProvider">ITursoProvider</a>
282
+
281
283
  Shared Lambda + CloudFormation custom-resource provider for all Turso resources.
282
284
 
283
285
  Create one per stack and pass it to every
@@ -338,6 +340,7 @@ Returns a string representation of this construct.
338
340
  | **Name** | **Description** |
339
341
  | --- | --- |
340
342
  | <code><a href="#cdk-turso.TursoProvider.isConstruct">isConstruct</a></code> | Checks if `x` is a construct. |
343
+ | <code><a href="#cdk-turso.TursoProvider.fromServiceToken">fromServiceToken</a></code> | Imports an existing Turso provider by service token. |
341
344
 
342
345
  ---
343
346
 
@@ -373,6 +376,34 @@ Any object.
373
376
 
374
377
  ---
375
378
 
379
+ ##### `fromServiceToken` <a name="fromServiceToken" id="cdk-turso.TursoProvider.fromServiceToken"></a>
380
+
381
+ ```typescript
382
+ import { TursoProvider } from 'cdk-turso'
383
+
384
+ TursoProvider.fromServiceToken(scope: Construct, id: string, serviceToken: string)
385
+ ```
386
+
387
+ Imports an existing Turso provider by service token.
388
+
389
+ ###### `scope`<sup>Required</sup> <a name="scope" id="cdk-turso.TursoProvider.fromServiceToken.parameter.scope"></a>
390
+
391
+ - *Type:* constructs.Construct
392
+
393
+ ---
394
+
395
+ ###### `id`<sup>Required</sup> <a name="id" id="cdk-turso.TursoProvider.fromServiceToken.parameter.id"></a>
396
+
397
+ - *Type:* string
398
+
399
+ ---
400
+
401
+ ###### `serviceToken`<sup>Required</sup> <a name="serviceToken" id="cdk-turso.TursoProvider.fromServiceToken.parameter.serviceToken"></a>
402
+
403
+ - *Type:* string
404
+
405
+ ---
406
+
376
407
  #### Properties <a name="Properties" id="Properties"></a>
377
408
 
378
409
  | **Name** | **Type** | **Description** |
@@ -442,9 +473,10 @@ const tursoAuthTokenProps: TursoAuthTokenProps = { ... }
442
473
  | <code><a href="#cdk-turso.TursoAuthTokenProps.property.databaseName">databaseName</a></code> | <code>string</code> | The name of the Turso database to create an auth token for. |
443
474
  | <code><a href="#cdk-turso.TursoAuthTokenProps.property.organizationSlug">organizationSlug</a></code> | <code>string</code> | The Turso organization slug that owns the database. |
444
475
  | <code><a href="#cdk-turso.TursoAuthTokenProps.property.parameterName">parameterName</a></code> | <code>string</code> | The SSM parameter name where the generated JWT will be stored as a SecureString. |
445
- | <code><a href="#cdk-turso.TursoAuthTokenProps.property.provider">provider</a></code> | <code><a href="#cdk-turso.TursoProvider">TursoProvider</a></code> | *No description.* |
476
+ | <code><a href="#cdk-turso.TursoAuthTokenProps.property.provider">provider</a></code> | <code><a href="#cdk-turso.ITursoProvider">ITursoProvider</a></code> | *No description.* |
446
477
  | <code><a href="#cdk-turso.TursoAuthTokenProps.property.authorization">authorization</a></code> | <code>string</code> | Authorization level for the token. |
447
478
  | <code><a href="#cdk-turso.TursoAuthTokenProps.property.expiration">expiration</a></code> | <code>string</code> | Expiration time for the token (e.g., `"2w"`, `"1d30m"`). |
479
+ | <code><a href="#cdk-turso.TursoAuthTokenProps.property.removalPolicy">removalPolicy</a></code> | <code>aws-cdk-lib.RemovalPolicy</code> | Removal policy for the underlying custom resource. |
448
480
 
449
481
  ---
450
482
 
@@ -487,10 +519,10 @@ The SSM parameter name where the generated JWT will be stored as a SecureString.
487
519
  ##### `provider`<sup>Required</sup> <a name="provider" id="cdk-turso.TursoAuthTokenProps.property.provider"></a>
488
520
 
489
521
  ```typescript
490
- public readonly provider: TursoProvider;
522
+ public readonly provider: ITursoProvider;
491
523
  ```
492
524
 
493
- - *Type:* <a href="#cdk-turso.TursoProvider">TursoProvider</a>
525
+ - *Type:* <a href="#cdk-turso.ITursoProvider">ITursoProvider</a>
494
526
 
495
527
  ---
496
528
 
@@ -520,6 +552,21 @@ Expiration time for the token (e.g., `"2w"`, `"1d30m"`).
520
552
 
521
553
  ---
522
554
 
555
+ ##### `removalPolicy`<sup>Optional</sup> <a name="removalPolicy" id="cdk-turso.TursoAuthTokenProps.property.removalPolicy"></a>
556
+
557
+ ```typescript
558
+ public readonly removalPolicy: RemovalPolicy;
559
+ ```
560
+
561
+ - *Type:* aws-cdk-lib.RemovalPolicy
562
+
563
+ Removal policy for the underlying custom resource.
564
+
565
+ Set to `RemovalPolicy.RETAIN` to keep the SSM parameter on stack
566
+ deletion.
567
+
568
+ ---
569
+
523
570
  ### TursoDatabaseEncryption <a name="TursoDatabaseEncryption" id="cdk-turso.TursoDatabaseEncryption"></a>
524
571
 
525
572
  #### Initializer <a name="Initializer" id="cdk-turso.TursoDatabaseEncryption.Initializer"></a>
@@ -576,8 +623,10 @@ const tursoDatabaseProps: TursoDatabaseProps = { ... }
576
623
  | <code><a href="#cdk-turso.TursoDatabaseProps.property.databaseName">databaseName</a></code> | <code>string</code> | *No description.* |
577
624
  | <code><a href="#cdk-turso.TursoDatabaseProps.property.group">group</a></code> | <code>string</code> | *No description.* |
578
625
  | <code><a href="#cdk-turso.TursoDatabaseProps.property.organizationSlug">organizationSlug</a></code> | <code>string</code> | *No description.* |
579
- | <code><a href="#cdk-turso.TursoDatabaseProps.property.provider">provider</a></code> | <code><a href="#cdk-turso.TursoProvider">TursoProvider</a></code> | *No description.* |
626
+ | <code><a href="#cdk-turso.TursoDatabaseProps.property.provider">provider</a></code> | <code><a href="#cdk-turso.ITursoProvider">ITursoProvider</a></code> | *No description.* |
627
+ | <code><a href="#cdk-turso.TursoDatabaseProps.property.adopt">adopt</a></code> | <code>boolean</code> | If true, the provider will adopt an existing Turso database when creation reports that the database already exists. |
580
628
  | <code><a href="#cdk-turso.TursoDatabaseProps.property.encryption">encryption</a></code> | <code><a href="#cdk-turso.TursoDatabaseEncryption">TursoDatabaseEncryption</a></code> | *No description.* |
629
+ | <code><a href="#cdk-turso.TursoDatabaseProps.property.removalPolicy">removalPolicy</a></code> | <code>aws-cdk-lib.RemovalPolicy</code> | Removal policy for the underlying custom resource. |
581
630
  | <code><a href="#cdk-turso.TursoDatabaseProps.property.seed">seed</a></code> | <code><a href="#cdk-turso.TursoDatabaseSeed">TursoDatabaseSeed</a></code> | *No description.* |
582
631
  | <code><a href="#cdk-turso.TursoDatabaseProps.property.sizeLimit">sizeLimit</a></code> | <code>string</code> | *No description.* |
583
632
 
@@ -616,10 +665,25 @@ public readonly organizationSlug: string;
616
665
  ##### `provider`<sup>Required</sup> <a name="provider" id="cdk-turso.TursoDatabaseProps.property.provider"></a>
617
666
 
618
667
  ```typescript
619
- public readonly provider: TursoProvider;
668
+ public readonly provider: ITursoProvider;
669
+ ```
670
+
671
+ - *Type:* <a href="#cdk-turso.ITursoProvider">ITursoProvider</a>
672
+
673
+ ---
674
+
675
+ ##### `adopt`<sup>Optional</sup> <a name="adopt" id="cdk-turso.TursoDatabaseProps.property.adopt"></a>
676
+
677
+ ```typescript
678
+ public readonly adopt: boolean;
620
679
  ```
621
680
 
622
- - *Type:* <a href="#cdk-turso.TursoProvider">TursoProvider</a>
681
+ - *Type:* boolean
682
+ - *Default:* false
683
+
684
+ If true, the provider will adopt an existing Turso database when creation reports that the database already exists.
685
+
686
+ This flag is only used during Create requests.
623
687
 
624
688
  ---
625
689
 
@@ -633,6 +697,21 @@ public readonly encryption: TursoDatabaseEncryption;
633
697
 
634
698
  ---
635
699
 
700
+ ##### `removalPolicy`<sup>Optional</sup> <a name="removalPolicy" id="cdk-turso.TursoDatabaseProps.property.removalPolicy"></a>
701
+
702
+ ```typescript
703
+ public readonly removalPolicy: RemovalPolicy;
704
+ ```
705
+
706
+ - *Type:* aws-cdk-lib.RemovalPolicy
707
+
708
+ Removal policy for the underlying custom resource.
709
+
710
+ Set to `RemovalPolicy.RETAIN` to keep the Turso database on stack
711
+ deletion.
712
+
713
+ ---
714
+
636
715
  ##### `seed`<sup>Optional</sup> <a name="seed" id="cdk-turso.TursoDatabaseProps.property.seed"></a>
637
716
 
638
717
  ```typescript
@@ -749,4 +828,32 @@ If not provided, a log group will be automatically created.
749
828
  ---
750
829
 
751
830
 
831
+ ## Protocols <a name="Protocols" id="Protocols"></a>
832
+
833
+ ### ITursoProvider <a name="ITursoProvider" id="cdk-turso.ITursoProvider"></a>
834
+
835
+ - *Implemented By:* <a href="#cdk-turso.TursoProvider">TursoProvider</a>, <a href="#cdk-turso.ITursoProvider">ITursoProvider</a>
836
+
837
+ Shared Turso custom-resource provider contract.
838
+
839
+
840
+ #### Properties <a name="Properties" id="Properties"></a>
841
+
842
+ | **Name** | **Type** | **Description** |
843
+ | --- | --- | --- |
844
+ | <code><a href="#cdk-turso.ITursoProvider.property.serviceToken">serviceToken</a></code> | <code>string</code> | The CDK custom-resource provider service token. |
845
+
846
+ ---
847
+
848
+ ##### `serviceToken`<sup>Required</sup> <a name="serviceToken" id="cdk-turso.ITursoProvider.property.serviceToken"></a>
849
+
850
+ ```typescript
851
+ public readonly serviceToken: string;
852
+ ```
853
+
854
+ - *Type:* string
855
+
856
+ The CDK custom-resource provider service token.
857
+
858
+ ---
752
859
 
package/README.md CHANGED
@@ -10,11 +10,11 @@ npm install cdk-turso
10
10
 
11
11
  ## Usage
12
12
 
13
- First, create a `TursoProvider` with your API token:
13
+ Create a `TursoProvider` with your API token:
14
14
 
15
15
  ```typescript
16
- import { Stack } from 'aws-cdk-lib';
17
- import { StringParameter } from 'aws-cdk-lib/aws-ssm';
16
+ import { RemovalPolicy, Stack } from 'aws-cdk-lib';
17
+ import { ParameterType, StringParameter } from 'aws-cdk-lib/aws-ssm';
18
18
  import { TursoProvider, TursoDatabase, TursoAuthToken } from 'cdk-turso';
19
19
 
20
20
  const stack = new Stack();
@@ -36,6 +36,8 @@ const database = new TursoDatabase(stack, 'Database', {
36
36
  databaseName: 'my-database',
37
37
  group: 'group-name',
38
38
  organizationSlug: 'my-org',
39
+ adopt: true, // optional: adopt existing database if it already exists
40
+ removalPolicy: RemovalPolicy.RETAIN, // optional: keep DB on stack delete
39
41
  });
40
42
 
41
43
  // Access database attributes
@@ -44,6 +46,16 @@ database.hostname; // Database hostname (e.g., my-database-my-org.turso.io)
44
46
  database.databaseName; // Database name
45
47
  ```
46
48
 
49
+ If you run a shared provider in another stack, import it by service token:
50
+
51
+ ```typescript
52
+ const provider = TursoProvider.fromServiceToken(
53
+ stack,
54
+ 'TursoProvider',
55
+ 'arn:aws:lambda:us-east-1:123456789012:function:shared-turso-provider',
56
+ );
57
+ ```
58
+
47
59
  ### Auth Token
48
60
 
49
61
  Generate a database auth token and store it as a SecureString in SSM Parameter Store:
@@ -56,6 +68,7 @@ const authToken = new TursoAuthToken(stack, 'AuthToken', {
56
68
  parameterName: '/turso/db-token',
57
69
  expiration: '2w', // optional, default: 'never'
58
70
  authorization: 'read-only', // optional, default: 'full-access'
71
+ removalPolicy: RemovalPolicy.RETAIN, // optional: keep SSM parameter
59
72
  });
60
73
 
61
74
  // The SSM parameter name where the JWT is stored
@@ -78,17 +91,31 @@ authToken.parameterName;
78
91
  | `handler` | `Function` | The Lambda function backing all Turso custom resources (for attaching IAM permissions) |
79
92
  | `serviceToken` | `string` | The CDK custom-resource provider service token |
80
93
 
94
+ Static method:
95
+
96
+ | Method | Returns | Description |
97
+ |--------|---------|-------------|
98
+ | `fromServiceToken(scope, id, serviceToken)` | `ITursoProvider` | Imports an existing Turso custom-resource provider |
99
+
100
+ ### ITursoProvider
101
+
102
+ | Attribute | Type | Description |
103
+ |-----------|------|-------------|
104
+ | `serviceToken` | `string` | The CDK custom-resource provider service token |
105
+
81
106
  ### TursoDatabaseProps
82
107
 
83
108
  | Prop | Type | Required | Description |
84
109
  |------|------|----------|-------------|
85
- | `provider` | `TursoProvider` | Yes | The Turso provider to use for this database |
110
+ | `provider` | `ITursoProvider` | Yes | The Turso provider to use for this database |
86
111
  | `databaseName` | `string` | Yes | Database name (lowercase, numbers, dashes only, max 64 chars) |
87
112
  | `group` | `string` | Yes | Turso group name (must already exist) |
88
113
  | `organizationSlug` | `string` | Yes | Organization slug |
89
114
  | `sizeLimit` | `string` | No | Size limit (e.g., '256mb') |
90
115
  | `seed` | `TursoDatabaseSeed` | No | Database seed configuration |
91
116
  | `encryption` | `TursoDatabaseEncryption` | No | Encryption configuration |
117
+ | `adopt` | `boolean` | No | On create, adopt an existing database when create returns "already exists" |
118
+ | `removalPolicy` | `RemovalPolicy` | No | Custom resource removal policy (for example `RemovalPolicy.RETAIN`) |
92
119
 
93
120
  ### TursoDatabaseSeed
94
121
 
@@ -121,12 +148,13 @@ interface TursoDatabaseEncryption {
121
148
 
122
149
  | Prop | Type | Required | Description |
123
150
  |------|------|----------|-------------|
124
- | `provider` | `TursoProvider` | Yes | The Turso provider to use for this auth token |
151
+ | `provider` | `ITursoProvider` | Yes | The Turso provider to use for this auth token |
125
152
  | `databaseName` | `string` | Yes | The name of the Turso database to create an auth token for |
126
153
  | `organizationSlug` | `string` | Yes | The Turso organization slug that owns the database |
127
154
  | `parameterName` | `string` | Yes | SSM parameter name where the generated JWT will be stored as a SecureString |
128
155
  | `expiration` | `string` | No | Token expiry (e.g., `'2w'`, `'1d30m'`). Default: `'never'` |
129
156
  | `authorization` | `string` | No | `'full-access'` or `'read-only'`. Default: `'full-access'` |
157
+ | `removalPolicy` | `RemovalPolicy` | No | Custom resource removal policy (for example `RemovalPolicy.RETAIN`) |
130
158
 
131
159
  ### TursoAuthToken
132
160
 
@@ -591,16 +591,22 @@ var retryOptions = {
591
591
  numOfAttempts: 4,
592
592
  jitter: "none"
593
593
  };
594
- async function fetchWithRetry(url, options, errorMessage, allow404 = false) {
594
+ async function fetchWithRetry(url, options, errorMessage, allow404 = false, allowError) {
595
595
  return (0, import_exponential_backoff.backOff)(async () => {
596
596
  const response = await fetch(url, options);
597
597
  if (!response.ok && !(allow404 && response.status === 404)) {
598
598
  const errorText = await response.text();
599
+ if (allowError?.(response.status, errorText)) {
600
+ return response;
601
+ }
599
602
  throw new Error(`${errorMessage}: ${response.status} ${errorText}`);
600
603
  }
601
604
  return response;
602
605
  }, retryOptions);
603
606
  }
607
+ function isAlreadyExistsError(status, errorText) {
608
+ return status === 409 || /already exists|already been taken/i.test(errorText);
609
+ }
604
610
  async function getApiToken(parameterName) {
605
611
  const command = new import_client_ssm.GetParameterCommand({
606
612
  Name: parameterName,
@@ -618,6 +624,7 @@ async function handleDatabase(event, apiToken) {
618
624
  const baseUrl = "https://api.turso.tech/v1";
619
625
  if (RequestType === "Create") {
620
626
  const dbName = ResourceProperties.DatabaseName;
627
+ const adopt = ResourceProperties.Adopt === true;
621
628
  const body = {
622
629
  name: dbName,
623
630
  group: ResourceProperties.Group
@@ -641,8 +648,34 @@ async function handleDatabase(event, apiToken) {
641
648
  },
642
649
  body: JSON.stringify(body)
643
650
  },
644
- "Failed to create database"
651
+ "Failed to create database",
652
+ false,
653
+ (status, errorText) => {
654
+ return adopt && isAlreadyExistsError(status, errorText);
655
+ }
645
656
  );
657
+ if (!response.ok) {
658
+ const existingDbName = encodeURIComponent(dbName);
659
+ const existingResponse = await fetchWithRetry(
660
+ `${baseUrl}/organizations/${orgSlug}/databases/${existingDbName}`,
661
+ {
662
+ method: "GET",
663
+ headers: {
664
+ Authorization: `Bearer ${apiToken}`
665
+ }
666
+ },
667
+ "Failed to get database"
668
+ );
669
+ const existingData = await existingResponse.json();
670
+ return {
671
+ PhysicalResourceId: dbName,
672
+ Data: {
673
+ DbId: existingData.database.DbId,
674
+ Hostname: existingData.database.Hostname,
675
+ Name: existingData.database.Name
676
+ }
677
+ };
678
+ }
646
679
  const data = await response.json();
647
680
  return {
648
681
  PhysicalResourceId: dbName,
package/lib/index.d.ts CHANGED
@@ -1,3 +1,3 @@
1
1
  export { TursoAuthToken, TursoAuthTokenProps } from "./turso-auth-token";
2
2
  export { TursoDatabase, TursoDatabaseEncryption, TursoDatabaseProps, TursoDatabaseSeed, } from "./turso-database";
3
- export { TursoProvider, TursoProviderProps } from "./turso-provider";
3
+ export { ITursoProvider, TursoProvider, TursoProviderProps, } from "./turso-provider";
package/lib/index.js CHANGED
@@ -7,4 +7,4 @@ var turso_database_1 = require("./turso-database");
7
7
  Object.defineProperty(exports, "TursoDatabase", { enumerable: true, get: function () { return turso_database_1.TursoDatabase; } });
8
8
  var turso_provider_1 = require("./turso-provider");
9
9
  Object.defineProperty(exports, "TursoProvider", { enumerable: true, get: function () { return turso_provider_1.TursoProvider; } });
10
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsdURBQXdFO0FBQS9ELGtIQUFBLGNBQWMsT0FBQTtBQUN2QixtREFLeUI7QUFKdkIsK0dBQUEsYUFBYSxPQUFBO0FBS2YsbURBQW9FO0FBQTNELCtHQUFBLGFBQWEsT0FBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IFR1cnNvQXV0aFRva2VuLCBUdXJzb0F1dGhUb2tlblByb3BzIH0gZnJvbSBcIi4vdHVyc28tYXV0aC10b2tlblwiXG5leHBvcnQge1xuICBUdXJzb0RhdGFiYXNlLFxuICBUdXJzb0RhdGFiYXNlRW5jcnlwdGlvbixcbiAgVHVyc29EYXRhYmFzZVByb3BzLFxuICBUdXJzb0RhdGFiYXNlU2VlZCxcbn0gZnJvbSBcIi4vdHVyc28tZGF0YWJhc2VcIlxuZXhwb3J0IHsgVHVyc29Qcm92aWRlciwgVHVyc29Qcm92aWRlclByb3BzIH0gZnJvbSBcIi4vdHVyc28tcHJvdmlkZXJcIlxuIl19
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsdURBQXdFO0FBQS9ELGtIQUFBLGNBQWMsT0FBQTtBQUN2QixtREFLeUI7QUFKdkIsK0dBQUEsYUFBYSxPQUFBO0FBS2YsbURBSXlCO0FBRnZCLCtHQUFBLGFBQWEsT0FBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IFR1cnNvQXV0aFRva2VuLCBUdXJzb0F1dGhUb2tlblByb3BzIH0gZnJvbSBcIi4vdHVyc28tYXV0aC10b2tlblwiXG5leHBvcnQge1xuICBUdXJzb0RhdGFiYXNlLFxuICBUdXJzb0RhdGFiYXNlRW5jcnlwdGlvbixcbiAgVHVyc29EYXRhYmFzZVByb3BzLFxuICBUdXJzb0RhdGFiYXNlU2VlZCxcbn0gZnJvbSBcIi4vdHVyc28tZGF0YWJhc2VcIlxuZXhwb3J0IHtcbiAgSVR1cnNvUHJvdmlkZXIsXG4gIFR1cnNvUHJvdmlkZXIsXG4gIFR1cnNvUHJvdmlkZXJQcm9wcyxcbn0gZnJvbSBcIi4vdHVyc28tcHJvdmlkZXJcIlxuIl19
@@ -1,7 +1,8 @@
1
+ import { RemovalPolicy } from "aws-cdk-lib";
1
2
  import { Construct } from "constructs";
2
- import type { TursoProvider } from "./turso-provider";
3
+ import type { ITursoProvider } from "./turso-provider";
3
4
  export interface TursoAuthTokenProps {
4
- readonly provider: TursoProvider;
5
+ readonly provider: ITursoProvider;
5
6
  /**
6
7
  * The name of the Turso database to create an auth token for.
7
8
  */
@@ -27,6 +28,12 @@ export interface TursoAuthTokenProps {
27
28
  * @default "full-access"
28
29
  */
29
30
  readonly authorization?: string;
31
+ /**
32
+ * Removal policy for the underlying custom resource.
33
+ * Set to `RemovalPolicy.RETAIN` to keep the SSM parameter on stack
34
+ * deletion.
35
+ */
36
+ readonly removalPolicy?: RemovalPolicy;
30
37
  }
31
38
  export declare class TursoAuthToken extends Construct {
32
39
  /**
@@ -21,7 +21,8 @@ class TursoAuthToken extends constructs_1.Construct {
21
21
  ? props.parameterName.slice(1)
22
22
  : props.parameterName,
23
23
  });
24
- props.provider.handler.addToRolePolicy(new aws_iam_1.PolicyStatement({
24
+ const providerWithHandler = props.provider;
25
+ providerWithHandler.handler?.addToRolePolicy(new aws_iam_1.PolicyStatement({
25
26
  effect: aws_iam_1.Effect.ALLOW,
26
27
  actions: ["ssm:PutParameter", "ssm:DeleteParameter"],
27
28
  resources: [parameterArn],
@@ -38,15 +39,18 @@ class TursoAuthToken extends constructs_1.Construct {
38
39
  if (props.authorization) {
39
40
  resourceProps.Authorization = props.authorization;
40
41
  }
41
- new aws_cdk_lib_1.CustomResource(this, "TursoAuthToken", {
42
+ const cr = new aws_cdk_lib_1.CustomResource(this, "TursoAuthToken", {
42
43
  serviceToken: props.provider.serviceToken,
43
44
  resourceType: "Custom::TursoAuthToken",
44
45
  properties: resourceProps,
45
46
  });
47
+ if (props.removalPolicy !== undefined) {
48
+ cr.applyRemovalPolicy(props.removalPolicy);
49
+ }
46
50
  this.parameterName = props.parameterName;
47
51
  }
48
52
  }
49
53
  exports.TursoAuthToken = TursoAuthToken;
50
54
  _a = JSII_RTTI_SYMBOL_1;
51
- TursoAuthToken[_a] = { fqn: "cdk-turso.TursoAuthToken", version: "0.3.3" };
52
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHVyc28tYXV0aC10b2tlbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy90dXJzby1hdXRoLXRva2VuLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsNkNBQW1EO0FBQ25ELGlEQUE2RDtBQUM3RCwyQ0FBc0M7QUFxQ3RDLE1BQWEsY0FBZSxTQUFRLHNCQUFTO0lBTTNDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBMEI7UUFDbEUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQTtRQUVoQixJQUNFLEtBQUssQ0FBQyxhQUFhO1lBQ25CLEtBQUssQ0FBQyxhQUFhLEtBQUssYUFBYTtZQUNyQyxLQUFLLENBQUMsYUFBYSxLQUFLLFdBQVcsRUFDbkMsQ0FBQztZQUNELE1BQU0sSUFBSSxLQUFLLENBQUMsb0RBQW9ELENBQUMsQ0FBQTtRQUN2RSxDQUFDO1FBRUQsTUFBTSxZQUFZLEdBQUcsbUJBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQzVDLE9BQU8sRUFBRSxLQUFLO1lBQ2QsUUFBUSxFQUFFLFdBQVc7WUFDckIsWUFBWSxFQUFFLEtBQUssQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQztnQkFDL0MsQ0FBQyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztnQkFDOUIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxhQUFhO1NBQ3hCLENBQUMsQ0FBQTtRQUVGLEtBQUssQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FDcEMsSUFBSSx5QkFBZSxDQUFDO1lBQ2xCLE1BQU0sRUFBRSxnQkFBTSxDQUFDLEtBQUs7WUFDcEIsT0FBTyxFQUFFLENBQUMsa0JBQWtCLEVBQUUscUJBQXFCLENBQUM7WUFDcEQsU0FBUyxFQUFFLENBQUMsWUFBWSxDQUFDO1NBQzFCLENBQUMsQ0FDSCxDQUFBO1FBRUQsTUFBTSxhQUFhLEdBQTRCO1lBQzdDLFlBQVksRUFBRSxXQUFXO1lBQ3pCLFlBQVksRUFBRSxLQUFLLENBQUMsWUFBWTtZQUNoQyxnQkFBZ0IsRUFBRSxLQUFLLENBQUMsZ0JBQWdCO1lBQ3hDLGFBQWEsRUFBRSxLQUFLLENBQUMsYUFBYTtTQUNuQyxDQUFBO1FBRUQsSUFBSSxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDckIsYUFBYSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUMsVUFBVSxDQUFBO1FBQzdDLENBQUM7UUFDRCxJQUFJLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN4QixhQUFhLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQyxhQUFhLENBQUE7UUFDbkQsQ0FBQztRQUVELElBQUksNEJBQWMsQ0FBQyxJQUFJLEVBQUUsZ0JBQWdCLEVBQUU7WUFDekMsWUFBWSxFQUFFLEtBQUssQ0FBQyxRQUFRLENBQUMsWUFBWTtZQUN6QyxZQUFZLEVBQUUsd0JBQXdCO1lBQ3RDLFVBQVUsRUFBRSxhQUFhO1NBQzFCLENBQUMsQ0FBQTtRQUVGLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDLGFBQWEsQ0FBQTtJQUMxQyxDQUFDOztBQXRESCx3Q0F1REMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDdXN0b21SZXNvdXJjZSwgU3RhY2sgfSBmcm9tIFwiYXdzLWNkay1saWJcIlxuaW1wb3J0IHsgRWZmZWN0LCBQb2xpY3lTdGF0ZW1lbnQgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWlhbVwiXG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiXG5pbXBvcnQgdHlwZSB7IFR1cnNvUHJvdmlkZXIgfSBmcm9tIFwiLi90dXJzby1wcm92aWRlclwiXG5cbmV4cG9ydCBpbnRlcmZhY2UgVHVyc29BdXRoVG9rZW5Qcm9wcyB7XG4gIHJlYWRvbmx5IHByb3ZpZGVyOiBUdXJzb1Byb3ZpZGVyXG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBUdXJzbyBkYXRhYmFzZSB0byBjcmVhdGUgYW4gYXV0aCB0b2tlbiBmb3IuXG4gICAqL1xuICByZWFkb25seSBkYXRhYmFzZU5hbWU6IHN0cmluZ1xuXG4gIC8qKlxuICAgKiBUaGUgVHVyc28gb3JnYW5pemF0aW9uIHNsdWcgdGhhdCBvd25zIHRoZSBkYXRhYmFzZS5cbiAgICovXG4gIHJlYWRvbmx5IG9yZ2FuaXphdGlvblNsdWc6IHN0cmluZ1xuXG4gIC8qKlxuICAgKiBUaGUgU1NNIHBhcmFtZXRlciBuYW1lIHdoZXJlIHRoZSBnZW5lcmF0ZWQgSldUIHdpbGwgYmUgc3RvcmVkXG4gICAqIGFzIGEgU2VjdXJlU3RyaW5nLlxuICAgKi9cbiAgcmVhZG9ubHkgcGFyYW1ldGVyTmFtZTogc3RyaW5nXG5cbiAgLyoqXG4gICAqIEV4cGlyYXRpb24gdGltZSBmb3IgdGhlIHRva2VuIChlLmcuLCBgXCIyd1wiYCwgYFwiMWQzMG1cImApLlxuICAgKlxuICAgKiBAZGVmYXVsdCBcIm5ldmVyXCJcbiAgICovXG4gIHJlYWRvbmx5IGV4cGlyYXRpb24/OiBzdHJpbmdcblxuICAvKipcbiAgICogQXV0aG9yaXphdGlvbiBsZXZlbCBmb3IgdGhlIHRva2VuLlxuICAgKlxuICAgKiBAZGVmYXVsdCBcImZ1bGwtYWNjZXNzXCJcbiAgICovXG4gIHJlYWRvbmx5IGF1dGhvcml6YXRpb24/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGNsYXNzIFR1cnNvQXV0aFRva2VuIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgLyoqXG4gICAqIFRoZSBTU00gcGFyYW1ldGVyIG5hbWUgd2hlcmUgdGhlIGF1dGggdG9rZW4gaXMgc3RvcmVkLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHBhcmFtZXRlck5hbWU6IHN0cmluZ1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBUdXJzb0F1dGhUb2tlblByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKVxuXG4gICAgaWYgKFxuICAgICAgcHJvcHMuYXV0aG9yaXphdGlvbiAmJlxuICAgICAgcHJvcHMuYXV0aG9yaXphdGlvbiAhPT0gXCJmdWxsLWFjY2Vzc1wiICYmXG4gICAgICBwcm9wcy5hdXRob3JpemF0aW9uICE9PSBcInJlYWQtb25seVwiXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2F1dGhvcml6YXRpb24gbXVzdCBiZSBcImZ1bGwtYWNjZXNzXCIgb3IgXCJyZWFkLW9ubHlcIicpXG4gICAgfVxuXG4gICAgY29uc3QgcGFyYW1ldGVyQXJuID0gU3RhY2sub2YodGhpcykuZm9ybWF0QXJuKHtcbiAgICAgIHNlcnZpY2U6IFwic3NtXCIsXG4gICAgICByZXNvdXJjZTogXCJwYXJhbWV0ZXJcIixcbiAgICAgIHJlc291cmNlTmFtZTogcHJvcHMucGFyYW1ldGVyTmFtZS5zdGFydHNXaXRoKFwiL1wiKVxuICAgICAgICA/IHByb3BzLnBhcmFtZXRlck5hbWUuc2xpY2UoMSlcbiAgICAgICAgOiBwcm9wcy5wYXJhbWV0ZXJOYW1lLFxuICAgIH0pXG5cbiAgICBwcm9wcy5wcm92aWRlci5oYW5kbGVyLmFkZFRvUm9sZVBvbGljeShcbiAgICAgIG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICBlZmZlY3Q6IEVmZmVjdC5BTExPVyxcbiAgICAgICAgYWN0aW9uczogW1wic3NtOlB1dFBhcmFtZXRlclwiLCBcInNzbTpEZWxldGVQYXJhbWV0ZXJcIl0sXG4gICAgICAgIHJlc291cmNlczogW3BhcmFtZXRlckFybl0sXG4gICAgICB9KSxcbiAgICApXG5cbiAgICBjb25zdCByZXNvdXJjZVByb3BzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHtcbiAgICAgIFJlc291cmNlVHlwZTogXCJBdXRoVG9rZW5cIixcbiAgICAgIERhdGFiYXNlTmFtZTogcHJvcHMuZGF0YWJhc2VOYW1lLFxuICAgICAgT3JnYW5pemF0aW9uU2x1ZzogcHJvcHMub3JnYW5pemF0aW9uU2x1ZyxcbiAgICAgIFBhcmFtZXRlck5hbWU6IHByb3BzLnBhcmFtZXRlck5hbWUsXG4gICAgfVxuXG4gICAgaWYgKHByb3BzLmV4cGlyYXRpb24pIHtcbiAgICAgIHJlc291cmNlUHJvcHMuRXhwaXJhdGlvbiA9IHByb3BzLmV4cGlyYXRpb25cbiAgICB9XG4gICAgaWYgKHByb3BzLmF1dGhvcml6YXRpb24pIHtcbiAgICAgIHJlc291cmNlUHJvcHMuQXV0aG9yaXphdGlvbiA9IHByb3BzLmF1dGhvcml6YXRpb25cbiAgICB9XG5cbiAgICBuZXcgQ3VzdG9tUmVzb3VyY2UodGhpcywgXCJUdXJzb0F1dGhUb2tlblwiLCB7XG4gICAgICBzZXJ2aWNlVG9rZW46IHByb3BzLnByb3ZpZGVyLnNlcnZpY2VUb2tlbixcbiAgICAgIHJlc291cmNlVHlwZTogXCJDdXN0b206OlR1cnNvQXV0aFRva2VuXCIsXG4gICAgICBwcm9wZXJ0aWVzOiByZXNvdXJjZVByb3BzLFxuICAgIH0pXG5cbiAgICB0aGlzLnBhcmFtZXRlck5hbWUgPSBwcm9wcy5wYXJhbWV0ZXJOYW1lXG4gIH1cbn1cbiJdfQ==
55
+ TursoAuthToken[_a] = { fqn: "cdk-turso.TursoAuthToken", version: "0.4.0" };
56
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHVyc28tYXV0aC10b2tlbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy90dXJzby1hdXRoLXRva2VuLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsNkNBQWtFO0FBQ2xFLGlEQUE2RDtBQUM3RCwyQ0FBc0M7QUE0Q3RDLE1BQWEsY0FBZSxTQUFRLHNCQUFTO0lBTTNDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBMEI7UUFDbEUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQTtRQUVoQixJQUNFLEtBQUssQ0FBQyxhQUFhO1lBQ25CLEtBQUssQ0FBQyxhQUFhLEtBQUssYUFBYTtZQUNyQyxLQUFLLENBQUMsYUFBYSxLQUFLLFdBQVcsRUFDbkMsQ0FBQztZQUNELE1BQU0sSUFBSSxLQUFLLENBQUMsb0RBQW9ELENBQUMsQ0FBQTtRQUN2RSxDQUFDO1FBRUQsTUFBTSxZQUFZLEdBQUcsbUJBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQzVDLE9BQU8sRUFBRSxLQUFLO1lBQ2QsUUFBUSxFQUFFLFdBQVc7WUFDckIsWUFBWSxFQUFFLEtBQUssQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQztnQkFDL0MsQ0FBQyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztnQkFDOUIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxhQUFhO1NBQ3hCLENBQUMsQ0FBQTtRQUVGLE1BQU0sbUJBQW1CLEdBQUcsS0FBSyxDQUFDLFFBSWpDLENBQUE7UUFFRCxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsZUFBZSxDQUMxQyxJQUFJLHlCQUFlLENBQUM7WUFDbEIsTUFBTSxFQUFFLGdCQUFNLENBQUMsS0FBSztZQUNwQixPQUFPLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxxQkFBcUIsQ0FBQztZQUNwRCxTQUFTLEVBQUUsQ0FBQyxZQUFZLENBQUM7U0FDMUIsQ0FBQyxDQUNILENBQUE7UUFFRCxNQUFNLGFBQWEsR0FBNEI7WUFDN0MsWUFBWSxFQUFFLFdBQVc7WUFDekIsWUFBWSxFQUFFLEtBQUssQ0FBQyxZQUFZO1lBQ2hDLGdCQUFnQixFQUFFLEtBQUssQ0FBQyxnQkFBZ0I7WUFDeEMsYUFBYSxFQUFFLEtBQUssQ0FBQyxhQUFhO1NBQ25DLENBQUE7UUFFRCxJQUFJLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNyQixhQUFhLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUE7UUFDN0MsQ0FBQztRQUNELElBQUksS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3hCLGFBQWEsQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDLGFBQWEsQ0FBQTtRQUNuRCxDQUFDO1FBRUQsTUFBTSxFQUFFLEdBQUcsSUFBSSw0QkFBYyxDQUFDLElBQUksRUFBRSxnQkFBZ0IsRUFBRTtZQUNwRCxZQUFZLEVBQUUsS0FBSyxDQUFDLFFBQVEsQ0FBQyxZQUFZO1lBQ3pDLFlBQVksRUFBRSx3QkFBd0I7WUFDdEMsVUFBVSxFQUFFLGFBQWE7U0FDMUIsQ0FBQyxDQUFBO1FBRUYsSUFBSSxLQUFLLENBQUMsYUFBYSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3RDLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUE7UUFDNUMsQ0FBQztRQUVELElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDLGFBQWEsQ0FBQTtJQUMxQyxDQUFDOztBQWhFSCx3Q0FpRUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDdXN0b21SZXNvdXJjZSwgUmVtb3ZhbFBvbGljeSwgU3RhY2sgfSBmcm9tIFwiYXdzLWNkay1saWJcIlxuaW1wb3J0IHsgRWZmZWN0LCBQb2xpY3lTdGF0ZW1lbnQgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWlhbVwiXG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiXG5pbXBvcnQgdHlwZSB7IElUdXJzb1Byb3ZpZGVyIH0gZnJvbSBcIi4vdHVyc28tcHJvdmlkZXJcIlxuXG5leHBvcnQgaW50ZXJmYWNlIFR1cnNvQXV0aFRva2VuUHJvcHMge1xuICByZWFkb25seSBwcm92aWRlcjogSVR1cnNvUHJvdmlkZXJcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIFR1cnNvIGRhdGFiYXNlIHRvIGNyZWF0ZSBhbiBhdXRoIHRva2VuIGZvci5cbiAgICovXG4gIHJlYWRvbmx5IGRhdGFiYXNlTmFtZTogc3RyaW5nXG5cbiAgLyoqXG4gICAqIFRoZSBUdXJzbyBvcmdhbml6YXRpb24gc2x1ZyB0aGF0IG93bnMgdGhlIGRhdGFiYXNlLlxuICAgKi9cbiAgcmVhZG9ubHkgb3JnYW5pemF0aW9uU2x1Zzogc3RyaW5nXG5cbiAgLyoqXG4gICAqIFRoZSBTU00gcGFyYW1ldGVyIG5hbWUgd2hlcmUgdGhlIGdlbmVyYXRlZCBKV1Qgd2lsbCBiZSBzdG9yZWRcbiAgICogYXMgYSBTZWN1cmVTdHJpbmcuXG4gICAqL1xuICByZWFkb25seSBwYXJhbWV0ZXJOYW1lOiBzdHJpbmdcblxuICAvKipcbiAgICogRXhwaXJhdGlvbiB0aW1lIGZvciB0aGUgdG9rZW4gKGUuZy4sIGBcIjJ3XCJgLCBgXCIxZDMwbVwiYCkuXG4gICAqXG4gICAqIEBkZWZhdWx0IFwibmV2ZXJcIlxuICAgKi9cbiAgcmVhZG9ubHkgZXhwaXJhdGlvbj86IHN0cmluZ1xuXG4gIC8qKlxuICAgKiBBdXRob3JpemF0aW9uIGxldmVsIGZvciB0aGUgdG9rZW4uXG4gICAqXG4gICAqIEBkZWZhdWx0IFwiZnVsbC1hY2Nlc3NcIlxuICAgKi9cbiAgcmVhZG9ubHkgYXV0aG9yaXphdGlvbj86IHN0cmluZ1xuXG4gIC8qKlxuICAgKiBSZW1vdmFsIHBvbGljeSBmb3IgdGhlIHVuZGVybHlpbmcgY3VzdG9tIHJlc291cmNlLlxuICAgKiBTZXQgdG8gYFJlbW92YWxQb2xpY3kuUkVUQUlOYCB0byBrZWVwIHRoZSBTU00gcGFyYW1ldGVyIG9uIHN0YWNrXG4gICAqIGRlbGV0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVtb3ZhbFBvbGljeT86IFJlbW92YWxQb2xpY3lcbn1cblxuZXhwb3J0IGNsYXNzIFR1cnNvQXV0aFRva2VuIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgLyoqXG4gICAqIFRoZSBTU00gcGFyYW1ldGVyIG5hbWUgd2hlcmUgdGhlIGF1dGggdG9rZW4gaXMgc3RvcmVkLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHBhcmFtZXRlck5hbWU6IHN0cmluZ1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBUdXJzb0F1dGhUb2tlblByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKVxuXG4gICAgaWYgKFxuICAgICAgcHJvcHMuYXV0aG9yaXphdGlvbiAmJlxuICAgICAgcHJvcHMuYXV0aG9yaXphdGlvbiAhPT0gXCJmdWxsLWFjY2Vzc1wiICYmXG4gICAgICBwcm9wcy5hdXRob3JpemF0aW9uICE9PSBcInJlYWQtb25seVwiXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2F1dGhvcml6YXRpb24gbXVzdCBiZSBcImZ1bGwtYWNjZXNzXCIgb3IgXCJyZWFkLW9ubHlcIicpXG4gICAgfVxuXG4gICAgY29uc3QgcGFyYW1ldGVyQXJuID0gU3RhY2sub2YodGhpcykuZm9ybWF0QXJuKHtcbiAgICAgIHNlcnZpY2U6IFwic3NtXCIsXG4gICAgICByZXNvdXJjZTogXCJwYXJhbWV0ZXJcIixcbiAgICAgIHJlc291cmNlTmFtZTogcHJvcHMucGFyYW1ldGVyTmFtZS5zdGFydHNXaXRoKFwiL1wiKVxuICAgICAgICA/IHByb3BzLnBhcmFtZXRlck5hbWUuc2xpY2UoMSlcbiAgICAgICAgOiBwcm9wcy5wYXJhbWV0ZXJOYW1lLFxuICAgIH0pXG5cbiAgICBjb25zdCBwcm92aWRlcldpdGhIYW5kbGVyID0gcHJvcHMucHJvdmlkZXIgYXMgSVR1cnNvUHJvdmlkZXIgJiB7XG4gICAgICByZWFkb25seSBoYW5kbGVyPzoge1xuICAgICAgICBhZGRUb1JvbGVQb2xpY3koc3RhdGVtZW50OiBQb2xpY3lTdGF0ZW1lbnQpOiB2b2lkXG4gICAgICB9XG4gICAgfVxuXG4gICAgcHJvdmlkZXJXaXRoSGFuZGxlci5oYW5kbGVyPy5hZGRUb1JvbGVQb2xpY3koXG4gICAgICBuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgZWZmZWN0OiBFZmZlY3QuQUxMT1csXG4gICAgICAgIGFjdGlvbnM6IFtcInNzbTpQdXRQYXJhbWV0ZXJcIiwgXCJzc206RGVsZXRlUGFyYW1ldGVyXCJdLFxuICAgICAgICByZXNvdXJjZXM6IFtwYXJhbWV0ZXJBcm5dLFxuICAgICAgfSksXG4gICAgKVxuXG4gICAgY29uc3QgcmVzb3VyY2VQcm9wczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7XG4gICAgICBSZXNvdXJjZVR5cGU6IFwiQXV0aFRva2VuXCIsXG4gICAgICBEYXRhYmFzZU5hbWU6IHByb3BzLmRhdGFiYXNlTmFtZSxcbiAgICAgIE9yZ2FuaXphdGlvblNsdWc6IHByb3BzLm9yZ2FuaXphdGlvblNsdWcsXG4gICAgICBQYXJhbWV0ZXJOYW1lOiBwcm9wcy5wYXJhbWV0ZXJOYW1lLFxuICAgIH1cblxuICAgIGlmIChwcm9wcy5leHBpcmF0aW9uKSB7XG4gICAgICByZXNvdXJjZVByb3BzLkV4cGlyYXRpb24gPSBwcm9wcy5leHBpcmF0aW9uXG4gICAgfVxuICAgIGlmIChwcm9wcy5hdXRob3JpemF0aW9uKSB7XG4gICAgICByZXNvdXJjZVByb3BzLkF1dGhvcml6YXRpb24gPSBwcm9wcy5hdXRob3JpemF0aW9uXG4gICAgfVxuXG4gICAgY29uc3QgY3IgPSBuZXcgQ3VzdG9tUmVzb3VyY2UodGhpcywgXCJUdXJzb0F1dGhUb2tlblwiLCB7XG4gICAgICBzZXJ2aWNlVG9rZW46IHByb3BzLnByb3ZpZGVyLnNlcnZpY2VUb2tlbixcbiAgICAgIHJlc291cmNlVHlwZTogXCJDdXN0b206OlR1cnNvQXV0aFRva2VuXCIsXG4gICAgICBwcm9wZXJ0aWVzOiByZXNvdXJjZVByb3BzLFxuICAgIH0pXG5cbiAgICBpZiAocHJvcHMucmVtb3ZhbFBvbGljeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjci5hcHBseVJlbW92YWxQb2xpY3kocHJvcHMucmVtb3ZhbFBvbGljeSlcbiAgICB9XG5cbiAgICB0aGlzLnBhcmFtZXRlck5hbWUgPSBwcm9wcy5wYXJhbWV0ZXJOYW1lXG4gIH1cbn1cbiJdfQ==
@@ -1,5 +1,6 @@
1
+ import { RemovalPolicy } from "aws-cdk-lib";
1
2
  import { Construct } from "constructs";
2
- import type { TursoProvider } from "./turso-provider";
3
+ import type { ITursoProvider } from "./turso-provider";
3
4
  export interface TursoDatabaseSeed {
4
5
  readonly type: string;
5
6
  readonly name: string;
@@ -10,13 +11,28 @@ export interface TursoDatabaseEncryption {
10
11
  readonly encryptionCipher: string;
11
12
  }
12
13
  export interface TursoDatabaseProps {
13
- readonly provider: TursoProvider;
14
+ readonly provider: ITursoProvider;
14
15
  readonly databaseName: string;
15
16
  readonly group: string;
16
17
  readonly organizationSlug: string;
17
18
  readonly sizeLimit?: string;
18
19
  readonly seed?: TursoDatabaseSeed;
19
20
  readonly encryption?: TursoDatabaseEncryption;
21
+ /**
22
+ * If true, the provider will adopt an existing Turso database when
23
+ * creation reports that the database already exists.
24
+ *
25
+ * This flag is only used during Create requests.
26
+ *
27
+ * @default false
28
+ */
29
+ readonly adopt?: boolean;
30
+ /**
31
+ * Removal policy for the underlying custom resource.
32
+ * Set to `RemovalPolicy.RETAIN` to keep the Turso database on stack
33
+ * deletion.
34
+ */
35
+ readonly removalPolicy?: RemovalPolicy;
20
36
  }
21
37
  export declare class TursoDatabase extends Construct {
22
38
  readonly dbId: string;
@@ -29,11 +29,17 @@ class TursoDatabase extends constructs_1.Construct {
29
29
  if (props.encryption) {
30
30
  resourceProps.Encryption = props.encryption;
31
31
  }
32
+ if (props.adopt !== undefined) {
33
+ resourceProps.Adopt = props.adopt;
34
+ }
32
35
  const cr = new aws_cdk_lib_1.CustomResource(this, "TursoDb", {
33
36
  serviceToken: props.provider.serviceToken,
34
37
  resourceType: "Custom::TursoDatabase",
35
38
  properties: resourceProps,
36
39
  });
40
+ if (props.removalPolicy !== undefined) {
41
+ cr.applyRemovalPolicy(props.removalPolicy);
42
+ }
37
43
  this.dbId = cr.getAttString("DbId");
38
44
  this.hostname = cr.getAttString("Hostname");
39
45
  this.databaseName = cr.getAttString("Name");
@@ -41,5 +47,5 @@ class TursoDatabase extends constructs_1.Construct {
41
47
  }
42
48
  exports.TursoDatabase = TursoDatabase;
43
49
  _a = JSII_RTTI_SYMBOL_1;
44
- TursoDatabase[_a] = { fqn: "cdk-turso.TursoDatabase", version: "0.3.3" };
45
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHVyc28tZGF0YWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdHVyc28tZGF0YWJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw2Q0FBNEM7QUFDNUMsMkNBQXNDO0FBd0J0QyxNQUFhLGFBQWMsU0FBUSxzQkFBUztJQVMxQyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQXlCO1FBQ2pFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUE7UUFFaEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7WUFDN0MsTUFBTSxJQUFJLEtBQUssQ0FDYix1RUFBdUUsQ0FDeEUsQ0FBQTtRQUNILENBQUM7UUFDRCxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLEVBQUUsRUFBRSxDQUFDO1lBQ25DLE1BQU0sSUFBSSxLQUFLLENBQUMsNENBQTRDLENBQUMsQ0FBQTtRQUMvRCxDQUFDO1FBRUQsTUFBTSxhQUFhLEdBQTRCO1lBQzdDLFlBQVksRUFBRSxVQUFVO1lBQ3hCLFlBQVksRUFBRSxLQUFLLENBQUMsWUFBWTtZQUNoQyxLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUs7WUFDbEIsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLGdCQUFnQjtTQUN6QyxDQUFBO1FBRUQsSUFBSSxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDcEIsYUFBYSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFBO1FBQzNDLENBQUM7UUFDRCxJQUFJLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNmLGFBQWEsQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQTtRQUNqQyxDQUFDO1FBQ0QsSUFBSSxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDckIsYUFBYSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUMsVUFBVSxDQUFBO1FBQzdDLENBQUM7UUFFRCxNQUFNLEVBQUUsR0FBRyxJQUFJLDRCQUFjLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRTtZQUM3QyxZQUFZLEVBQUUsS0FBSyxDQUFDLFFBQVEsQ0FBQyxZQUFZO1lBQ3pDLFlBQVksRUFBRSx1QkFBdUI7WUFDckMsVUFBVSxFQUFFLGFBQWE7U0FDMUIsQ0FBQyxDQUFBO1FBRUYsSUFBSSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBQ25DLElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQTtRQUMzQyxJQUFJLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDN0MsQ0FBQzs7QUEvQ0gsc0NBZ0RDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ3VzdG9tUmVzb3VyY2UgfSBmcm9tIFwiYXdzLWNkay1saWJcIlxuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIlxuaW1wb3J0IHR5cGUgeyBUdXJzb1Byb3ZpZGVyIH0gZnJvbSBcIi4vdHVyc28tcHJvdmlkZXJcIlxuXG5leHBvcnQgaW50ZXJmYWNlIFR1cnNvRGF0YWJhc2VTZWVkIHtcbiAgcmVhZG9ubHkgdHlwZTogc3RyaW5nXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZ1xuICByZWFkb25seSB0aW1lc3RhbXA/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUdXJzb0RhdGFiYXNlRW5jcnlwdGlvbiB7XG4gIHJlYWRvbmx5IGVuY3J5cHRpb25LZXk6IHN0cmluZ1xuICByZWFkb25seSBlbmNyeXB0aW9uQ2lwaGVyOiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUdXJzb0RhdGFiYXNlUHJvcHMge1xuICByZWFkb25seSBwcm92aWRlcjogVHVyc29Qcm92aWRlclxuICByZWFkb25seSBkYXRhYmFzZU5hbWU6IHN0cmluZ1xuICByZWFkb25seSBncm91cDogc3RyaW5nXG4gIHJlYWRvbmx5IG9yZ2FuaXphdGlvblNsdWc6IHN0cmluZ1xuICByZWFkb25seSBzaXplTGltaXQ/OiBzdHJpbmdcbiAgcmVhZG9ubHkgc2VlZD86IFR1cnNvRGF0YWJhc2VTZWVkXG4gIHJlYWRvbmx5IGVuY3J5cHRpb24/OiBUdXJzb0RhdGFiYXNlRW5jcnlwdGlvblxufVxuXG5leHBvcnQgY2xhc3MgVHVyc29EYXRhYmFzZSBleHRlbmRzIENvbnN0cnVjdCB7XG4gIHB1YmxpYyByZWFkb25seSBkYklkOiBzdHJpbmdcbiAgLyoqXG4gICAqIEROUyBob3N0bmFtZSBmb3IgdGhlIGRhdGFiYXNlIChlLmcuLCBgbXktZGItbXktb3JnLnR1cnNvLmlvYCkuXG4gICAqIFVzZSB3aXRoIGxpYlNRTCBvciBIVFRQIGNvbm5lY3Rpb25zLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGhvc3RuYW1lOiBzdHJpbmdcbiAgcHVibGljIHJlYWRvbmx5IGRhdGFiYXNlTmFtZTogc3RyaW5nXG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFR1cnNvRGF0YWJhc2VQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZClcblxuICAgIGlmICghL15bYS16MC05LV0rJC8udGVzdChwcm9wcy5kYXRhYmFzZU5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiZGF0YWJhc2VOYW1lIG11c3QgY29udGFpbiBvbmx5IGxvd2VyY2FzZSBsZXR0ZXJzLCBudW1iZXJzLCBhbmQgZGFzaGVzXCIsXG4gICAgICApXG4gICAgfVxuICAgIGlmIChwcm9wcy5kYXRhYmFzZU5hbWUubGVuZ3RoID4gNjQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImRhdGFiYXNlTmFtZSBtdXN0IGJlIGF0IG1vc3QgNjQgY2hhcmFjdGVyc1wiKVxuICAgIH1cblxuICAgIGNvbnN0IHJlc291cmNlUHJvcHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge1xuICAgICAgUmVzb3VyY2VUeXBlOiBcIkRhdGFiYXNlXCIsXG4gICAgICBEYXRhYmFzZU5hbWU6IHByb3BzLmRhdGFiYXNlTmFtZSxcbiAgICAgIEdyb3VwOiBwcm9wcy5ncm91cCxcbiAgICAgIE9yZ2FuaXphdGlvblNsdWc6IHByb3BzLm9yZ2FuaXphdGlvblNsdWcsXG4gICAgfVxuXG4gICAgaWYgKHByb3BzLnNpemVMaW1pdCkge1xuICAgICAgcmVzb3VyY2VQcm9wcy5TaXplTGltaXQgPSBwcm9wcy5zaXplTGltaXRcbiAgICB9XG4gICAgaWYgKHByb3BzLnNlZWQpIHtcbiAgICAgIHJlc291cmNlUHJvcHMuU2VlZCA9IHByb3BzLnNlZWRcbiAgICB9XG4gICAgaWYgKHByb3BzLmVuY3J5cHRpb24pIHtcbiAgICAgIHJlc291cmNlUHJvcHMuRW5jcnlwdGlvbiA9IHByb3BzLmVuY3J5cHRpb25cbiAgICB9XG5cbiAgICBjb25zdCBjciA9IG5ldyBDdXN0b21SZXNvdXJjZSh0aGlzLCBcIlR1cnNvRGJcIiwge1xuICAgICAgc2VydmljZVRva2VuOiBwcm9wcy5wcm92aWRlci5zZXJ2aWNlVG9rZW4sXG4gICAgICByZXNvdXJjZVR5cGU6IFwiQ3VzdG9tOjpUdXJzb0RhdGFiYXNlXCIsXG4gICAgICBwcm9wZXJ0aWVzOiByZXNvdXJjZVByb3BzLFxuICAgIH0pXG5cbiAgICB0aGlzLmRiSWQgPSBjci5nZXRBdHRTdHJpbmcoXCJEYklkXCIpXG4gICAgdGhpcy5ob3N0bmFtZSA9IGNyLmdldEF0dFN0cmluZyhcIkhvc3RuYW1lXCIpXG4gICAgdGhpcy5kYXRhYmFzZU5hbWUgPSBjci5nZXRBdHRTdHJpbmcoXCJOYW1lXCIpXG4gIH1cbn1cbiJdfQ==
50
+ TursoDatabase[_a] = { fqn: "cdk-turso.TursoDatabase", version: "0.4.0" };
51
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHVyc28tZGF0YWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdHVyc28tZGF0YWJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw2Q0FBMkQ7QUFDM0QsMkNBQXNDO0FBeUN0QyxNQUFhLGFBQWMsU0FBUSxzQkFBUztJQVMxQyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQXlCO1FBQ2pFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUE7UUFFaEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7WUFDN0MsTUFBTSxJQUFJLEtBQUssQ0FDYix1RUFBdUUsQ0FDeEUsQ0FBQTtRQUNILENBQUM7UUFDRCxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLEVBQUUsRUFBRSxDQUFDO1lBQ25DLE1BQU0sSUFBSSxLQUFLLENBQUMsNENBQTRDLENBQUMsQ0FBQTtRQUMvRCxDQUFDO1FBRUQsTUFBTSxhQUFhLEdBQTRCO1lBQzdDLFlBQVksRUFBRSxVQUFVO1lBQ3hCLFlBQVksRUFBRSxLQUFLLENBQUMsWUFBWTtZQUNoQyxLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUs7WUFDbEIsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLGdCQUFnQjtTQUN6QyxDQUFBO1FBRUQsSUFBSSxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDcEIsYUFBYSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFBO1FBQzNDLENBQUM7UUFDRCxJQUFJLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNmLGFBQWEsQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQTtRQUNqQyxDQUFDO1FBQ0QsSUFBSSxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDckIsYUFBYSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUMsVUFBVSxDQUFBO1FBQzdDLENBQUM7UUFDRCxJQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDOUIsYUFBYSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFBO1FBQ25DLENBQUM7UUFFRCxNQUFNLEVBQUUsR0FBRyxJQUFJLDRCQUFjLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRTtZQUM3QyxZQUFZLEVBQUUsS0FBSyxDQUFDLFFBQVEsQ0FBQyxZQUFZO1lBQ3pDLFlBQVksRUFBRSx1QkFBdUI7WUFDckMsVUFBVSxFQUFFLGFBQWE7U0FDMUIsQ0FBQyxDQUFBO1FBRUYsSUFBSSxLQUFLLENBQUMsYUFBYSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3RDLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUE7UUFDNUMsQ0FBQztRQUVELElBQUksQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUNuQyxJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUE7UUFDM0MsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQzdDLENBQUM7O0FBdERILHNDQXVEQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEN1c3RvbVJlc291cmNlLCBSZW1vdmFsUG9saWN5IH0gZnJvbSBcImF3cy1jZGstbGliXCJcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCJcbmltcG9ydCB0eXBlIHsgSVR1cnNvUHJvdmlkZXIgfSBmcm9tIFwiLi90dXJzby1wcm92aWRlclwiXG5cbmV4cG9ydCBpbnRlcmZhY2UgVHVyc29EYXRhYmFzZVNlZWQge1xuICByZWFkb25seSB0eXBlOiBzdHJpbmdcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nXG4gIHJlYWRvbmx5IHRpbWVzdGFtcD86IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFR1cnNvRGF0YWJhc2VFbmNyeXB0aW9uIHtcbiAgcmVhZG9ubHkgZW5jcnlwdGlvbktleTogc3RyaW5nXG4gIHJlYWRvbmx5IGVuY3J5cHRpb25DaXBoZXI6IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFR1cnNvRGF0YWJhc2VQcm9wcyB7XG4gIHJlYWRvbmx5IHByb3ZpZGVyOiBJVHVyc29Qcm92aWRlclxuICByZWFkb25seSBkYXRhYmFzZU5hbWU6IHN0cmluZ1xuICByZWFkb25seSBncm91cDogc3RyaW5nXG4gIHJlYWRvbmx5IG9yZ2FuaXphdGlvblNsdWc6IHN0cmluZ1xuICByZWFkb25seSBzaXplTGltaXQ/OiBzdHJpbmdcbiAgcmVhZG9ubHkgc2VlZD86IFR1cnNvRGF0YWJhc2VTZWVkXG4gIHJlYWRvbmx5IGVuY3J5cHRpb24/OiBUdXJzb0RhdGFiYXNlRW5jcnlwdGlvblxuXG4gIC8qKlxuICAgKiBJZiB0cnVlLCB0aGUgcHJvdmlkZXIgd2lsbCBhZG9wdCBhbiBleGlzdGluZyBUdXJzbyBkYXRhYmFzZSB3aGVuXG4gICAqIGNyZWF0aW9uIHJlcG9ydHMgdGhhdCB0aGUgZGF0YWJhc2UgYWxyZWFkeSBleGlzdHMuXG4gICAqXG4gICAqIFRoaXMgZmxhZyBpcyBvbmx5IHVzZWQgZHVyaW5nIENyZWF0ZSByZXF1ZXN0cy5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGFkb3B0PzogYm9vbGVhblxuXG4gIC8qKlxuICAgKiBSZW1vdmFsIHBvbGljeSBmb3IgdGhlIHVuZGVybHlpbmcgY3VzdG9tIHJlc291cmNlLlxuICAgKiBTZXQgdG8gYFJlbW92YWxQb2xpY3kuUkVUQUlOYCB0byBrZWVwIHRoZSBUdXJzbyBkYXRhYmFzZSBvbiBzdGFja1xuICAgKiBkZWxldGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IHJlbW92YWxQb2xpY3k/OiBSZW1vdmFsUG9saWN5XG59XG5cbmV4cG9ydCBjbGFzcyBUdXJzb0RhdGFiYXNlIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgcHVibGljIHJlYWRvbmx5IGRiSWQ6IHN0cmluZ1xuICAvKipcbiAgICogRE5TIGhvc3RuYW1lIGZvciB0aGUgZGF0YWJhc2UgKGUuZy4sIGBteS1kYi1teS1vcmcudHVyc28uaW9gKS5cbiAgICogVXNlIHdpdGggbGliU1FMIG9yIEhUVFAgY29ubmVjdGlvbnMuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaG9zdG5hbWU6IHN0cmluZ1xuICBwdWJsaWMgcmVhZG9ubHkgZGF0YWJhc2VOYW1lOiBzdHJpbmdcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogVHVyc29EYXRhYmFzZVByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKVxuXG4gICAgaWYgKCEvXlthLXowLTktXSskLy50ZXN0KHByb3BzLmRhdGFiYXNlTmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJkYXRhYmFzZU5hbWUgbXVzdCBjb250YWluIG9ubHkgbG93ZXJjYXNlIGxldHRlcnMsIG51bWJlcnMsIGFuZCBkYXNoZXNcIixcbiAgICAgIClcbiAgICB9XG4gICAgaWYgKHByb3BzLmRhdGFiYXNlTmFtZS5sZW5ndGggPiA2NCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZGF0YWJhc2VOYW1lIG11c3QgYmUgYXQgbW9zdCA2NCBjaGFyYWN0ZXJzXCIpXG4gICAgfVxuXG4gICAgY29uc3QgcmVzb3VyY2VQcm9wczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7XG4gICAgICBSZXNvdXJjZVR5cGU6IFwiRGF0YWJhc2VcIixcbiAgICAgIERhdGFiYXNlTmFtZTogcHJvcHMuZGF0YWJhc2VOYW1lLFxuICAgICAgR3JvdXA6IHByb3BzLmdyb3VwLFxuICAgICAgT3JnYW5pemF0aW9uU2x1ZzogcHJvcHMub3JnYW5pemF0aW9uU2x1ZyxcbiAgICB9XG5cbiAgICBpZiAocHJvcHMuc2l6ZUxpbWl0KSB7XG4gICAgICByZXNvdXJjZVByb3BzLlNpemVMaW1pdCA9IHByb3BzLnNpemVMaW1pdFxuICAgIH1cbiAgICBpZiAocHJvcHMuc2VlZCkge1xuICAgICAgcmVzb3VyY2VQcm9wcy5TZWVkID0gcHJvcHMuc2VlZFxuICAgIH1cbiAgICBpZiAocHJvcHMuZW5jcnlwdGlvbikge1xuICAgICAgcmVzb3VyY2VQcm9wcy5FbmNyeXB0aW9uID0gcHJvcHMuZW5jcnlwdGlvblxuICAgIH1cbiAgICBpZiAocHJvcHMuYWRvcHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmVzb3VyY2VQcm9wcy5BZG9wdCA9IHByb3BzLmFkb3B0XG4gICAgfVxuXG4gICAgY29uc3QgY3IgPSBuZXcgQ3VzdG9tUmVzb3VyY2UodGhpcywgXCJUdXJzb0RiXCIsIHtcbiAgICAgIHNlcnZpY2VUb2tlbjogcHJvcHMucHJvdmlkZXIuc2VydmljZVRva2VuLFxuICAgICAgcmVzb3VyY2VUeXBlOiBcIkN1c3RvbTo6VHVyc29EYXRhYmFzZVwiLFxuICAgICAgcHJvcGVydGllczogcmVzb3VyY2VQcm9wcyxcbiAgICB9KVxuXG4gICAgaWYgKHByb3BzLnJlbW92YWxQb2xpY3kgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY3IuYXBwbHlSZW1vdmFsUG9saWN5KHByb3BzLnJlbW92YWxQb2xpY3kpXG4gICAgfVxuXG4gICAgdGhpcy5kYklkID0gY3IuZ2V0QXR0U3RyaW5nKFwiRGJJZFwiKVxuICAgIHRoaXMuaG9zdG5hbWUgPSBjci5nZXRBdHRTdHJpbmcoXCJIb3N0bmFtZVwiKVxuICAgIHRoaXMuZGF0YWJhc2VOYW1lID0gY3IuZ2V0QXR0U3RyaW5nKFwiTmFtZVwiKVxuICB9XG59XG4iXX0=
@@ -2,6 +2,15 @@ import { Function } from "aws-cdk-lib/aws-lambda";
2
2
  import type { ILogGroup } from "aws-cdk-lib/aws-logs";
3
3
  import type { IParameter } from "aws-cdk-lib/aws-ssm";
4
4
  import { Construct } from "constructs";
5
+ /**
6
+ * Shared Turso custom-resource provider contract.
7
+ */
8
+ export interface ITursoProvider {
9
+ /**
10
+ * The CDK custom-resource provider service token.
11
+ */
12
+ readonly serviceToken: string;
13
+ }
5
14
  export interface TursoProviderProps {
6
15
  /**
7
16
  * SSM parameter that holds the Turso platform API token
@@ -19,7 +28,11 @@ export interface TursoProviderProps {
19
28
  * Turso resources. Create one per stack and pass it to every
20
29
  * `TursoDatabase`, `TursoAuthToken`, etc.
21
30
  */
22
- export declare class TursoProvider extends Construct {
31
+ export declare class TursoProvider extends Construct implements ITursoProvider {
32
+ /**
33
+ * Imports an existing Turso provider by service token.
34
+ */
35
+ static fromServiceToken(scope: Construct, id: string, serviceToken: string): ITursoProvider;
23
36
  /**
24
37
  * The Lambda function backing all Turso custom resources.
25
38
  * Use this to attach additional IAM permissions when a resource
@@ -8,12 +8,24 @@ const aws_lambda_1 = require("aws-cdk-lib/aws-lambda");
8
8
  const custom_resources_1 = require("aws-cdk-lib/custom-resources");
9
9
  const constructs_1 = require("constructs");
10
10
  const path = require("path");
11
+ class ImportedTursoProvider extends constructs_1.Construct {
12
+ constructor(scope, id, serviceToken) {
13
+ super(scope, id);
14
+ this.serviceToken = serviceToken;
15
+ }
16
+ }
11
17
  /**
12
18
  * Shared Lambda + CloudFormation custom-resource provider for all
13
19
  * Turso resources. Create one per stack and pass it to every
14
20
  * `TursoDatabase`, `TursoAuthToken`, etc.
15
21
  */
16
22
  class TursoProvider extends constructs_1.Construct {
23
+ /**
24
+ * Imports an existing Turso provider by service token.
25
+ */
26
+ static fromServiceToken(scope, id, serviceToken) {
27
+ return new ImportedTursoProvider(scope, id, serviceToken);
28
+ }
17
29
  constructor(scope, id, props) {
18
30
  super(scope, id);
19
31
  this.handler = new aws_lambda_1.Function(this, "Handler", {
@@ -36,5 +48,5 @@ class TursoProvider extends constructs_1.Construct {
36
48
  }
37
49
  exports.TursoProvider = TursoProvider;
38
50
  _a = JSII_RTTI_SYMBOL_1;
39
- TursoProvider[_a] = { fqn: "cdk-turso.TursoProvider", version: "0.3.3" };
40
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHVyc28tcHJvdmlkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdHVyc28tcHJvdmlkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw2Q0FBc0M7QUFDdEMsdURBQStFO0FBRy9FLG1FQUF1RDtBQUN2RCwyQ0FBc0M7QUFDdEMsNkJBQTRCO0FBZ0I1Qjs7OztHQUlHO0FBQ0gsTUFBYSxhQUFjLFNBQVEsc0JBQVM7SUFhMUMsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUF5QjtRQUNqRSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFBO1FBRWhCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxxQkFBUSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUU7WUFDM0MsT0FBTyxFQUFFLElBQUksb0JBQU8sQ0FBQyxZQUFZLEVBQUUsMEJBQWEsQ0FBQyxNQUFNLENBQUM7WUFDeEQsT0FBTyxFQUFFLGVBQWU7WUFDeEIsSUFBSSxFQUFFLGlCQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQ3JELE9BQU8sRUFBRSxzQkFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDNUIsUUFBUSxFQUFFLEtBQUssQ0FBQyxRQUFRO1lBQ3hCLFdBQVcsRUFBRTtnQkFDWCw4QkFBOEIsRUFBRSxLQUFLLENBQUMsUUFBUSxDQUFDLGFBQWE7YUFDN0Q7U0FDRixDQUFDLENBQUE7UUFFRixLQUFLLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUE7UUFFdEMsTUFBTSxRQUFRLEdBQUcsSUFBSSwyQkFBUSxDQUFDLElBQUksRUFBRSxVQUFVLEVBQUU7WUFDOUMsY0FBYyxFQUFFLElBQUksQ0FBQyxPQUFPO1lBQzVCLFFBQVEsRUFBRSxLQUFLLENBQUMsUUFBUTtTQUN6QixDQUFDLENBQUE7UUFFRixJQUFJLENBQUMsWUFBWSxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUE7SUFDM0MsQ0FBQzs7QUFuQ0gsc0NBb0NDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRHVyYXRpb24gfSBmcm9tIFwiYXdzLWNkay1saWJcIlxuaW1wb3J0IHsgQ29kZSwgRnVuY3Rpb24sIFJ1bnRpbWUsIFJ1bnRpbWVGYW1pbHkgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxhbWJkYVwiXG5pbXBvcnQgdHlwZSB7IElMb2dHcm91cCB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbG9nc1wiXG5pbXBvcnQgdHlwZSB7IElQYXJhbWV0ZXIgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXNzbVwiXG5pbXBvcnQgeyBQcm92aWRlciB9IGZyb20gXCJhd3MtY2RrLWxpYi9jdXN0b20tcmVzb3VyY2VzXCJcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCJcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcInBhdGhcIlxuXG5leHBvcnQgaW50ZXJmYWNlIFR1cnNvUHJvdmlkZXJQcm9wcyB7XG4gIC8qKlxuICAgKiBTU00gcGFyYW1ldGVyIHRoYXQgaG9sZHMgdGhlIFR1cnNvIHBsYXRmb3JtIEFQSSB0b2tlblxuICAgKiAoc3RvcmVkIGFzIFNlY3VyZVN0cmluZykuXG4gICAqL1xuICByZWFkb25seSBhcGlUb2tlbjogSVBhcmFtZXRlclxuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBsb2cgZ3JvdXAgZm9yIHRoZSBMYW1iZGEgZnVuY3Rpb24uXG4gICAqIElmIG5vdCBwcm92aWRlZCwgYSBsb2cgZ3JvdXAgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQuXG4gICAqL1xuICByZWFkb25seSBsb2dHcm91cD86IElMb2dHcm91cCB8IHVuZGVmaW5lZFxufVxuXG4vKipcbiAqIFNoYXJlZCBMYW1iZGEgKyBDbG91ZEZvcm1hdGlvbiBjdXN0b20tcmVzb3VyY2UgcHJvdmlkZXIgZm9yIGFsbFxuICogVHVyc28gcmVzb3VyY2VzLiAgQ3JlYXRlIG9uZSBwZXIgc3RhY2sgYW5kIHBhc3MgaXQgdG8gZXZlcnlcbiAqIGBUdXJzb0RhdGFiYXNlYCwgYFR1cnNvQXV0aFRva2VuYCwgZXRjLlxuICovXG5leHBvcnQgY2xhc3MgVHVyc29Qcm92aWRlciBleHRlbmRzIENvbnN0cnVjdCB7XG4gIC8qKlxuICAgKiBUaGUgTGFtYmRhIGZ1bmN0aW9uIGJhY2tpbmcgYWxsIFR1cnNvIGN1c3RvbSByZXNvdXJjZXMuXG4gICAqIFVzZSB0aGlzIHRvIGF0dGFjaCBhZGRpdGlvbmFsIElBTSBwZXJtaXNzaW9ucyB3aGVuIGEgcmVzb3VyY2VcbiAgICogdHlwZSBuZWVkcyB0aGVtIChlLmcuIGBzc206UHV0UGFyYW1ldGVyYCBmb3IgYXV0aC10b2tlbiBzdG9yYWdlKS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBoYW5kbGVyOiBGdW5jdGlvblxuXG4gIC8qKlxuICAgKiBUaGUgQ0RLIGN1c3RvbS1yZXNvdXJjZSBwcm92aWRlciBzZXJ2aWNlIHRva2VuLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHNlcnZpY2VUb2tlbjogc3RyaW5nXG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFR1cnNvUHJvdmlkZXJQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZClcblxuICAgIHRoaXMuaGFuZGxlciA9IG5ldyBGdW5jdGlvbih0aGlzLCBcIkhhbmRsZXJcIiwge1xuICAgICAgcnVudGltZTogbmV3IFJ1bnRpbWUoXCJub2RlanMyNC54XCIsIFJ1bnRpbWVGYW1pbHkuTk9ERUpTKSxcbiAgICAgIGhhbmRsZXI6IFwiaW5kZXguaGFuZGxlclwiLFxuICAgICAgY29kZTogQ29kZS5mcm9tQXNzZXQocGF0aC5qb2luKF9fZGlybmFtZSwgXCJoYW5kbGVyXCIpKSxcbiAgICAgIHRpbWVvdXQ6IER1cmF0aW9uLm1pbnV0ZXMoMyksXG4gICAgICBsb2dHcm91cDogcHJvcHMubG9nR3JvdXAsXG4gICAgICBlbnZpcm9ubWVudDoge1xuICAgICAgICBUVVJTT19BUElfVE9LRU5fUEFSQU1FVEVSX05BTUU6IHByb3BzLmFwaVRva2VuLnBhcmFtZXRlck5hbWUsXG4gICAgICB9LFxuICAgIH0pXG5cbiAgICBwcm9wcy5hcGlUb2tlbi5ncmFudFJlYWQodGhpcy5oYW5kbGVyKVxuXG4gICAgY29uc3QgcHJvdmlkZXIgPSBuZXcgUHJvdmlkZXIodGhpcywgXCJQcm92aWRlclwiLCB7XG4gICAgICBvbkV2ZW50SGFuZGxlcjogdGhpcy5oYW5kbGVyLFxuICAgICAgbG9nR3JvdXA6IHByb3BzLmxvZ0dyb3VwLFxuICAgIH0pXG5cbiAgICB0aGlzLnNlcnZpY2VUb2tlbiA9IHByb3ZpZGVyLnNlcnZpY2VUb2tlblxuICB9XG59XG4iXX0=
51
+ TursoProvider[_a] = { fqn: "cdk-turso.TursoProvider", version: "0.4.0" };
52
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHVyc28tcHJvdmlkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdHVyc28tcHJvdmlkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw2Q0FBc0M7QUFDdEMsdURBQStFO0FBRy9FLG1FQUF1RDtBQUN2RCwyQ0FBc0M7QUFDdEMsNkJBQTRCO0FBWTVCLE1BQU0scUJBQXNCLFNBQVEsc0JBQVM7SUFHM0MsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxZQUFvQjtRQUM1RCxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFBO1FBRWhCLElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFBO0lBQ2xDLENBQUM7Q0FDRjtBQWdCRDs7OztHQUlHO0FBQ0gsTUFBYSxhQUFjLFNBQVEsc0JBQVM7SUFDMUM7O09BRUc7SUFDSSxNQUFNLENBQUMsZ0JBQWdCLENBQzVCLEtBQWdCLEVBQ2hCLEVBQVUsRUFDVixZQUFvQjtRQUVwQixPQUFPLElBQUkscUJBQXFCLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxZQUFZLENBQUMsQ0FBQTtJQUMzRCxDQUFDO0lBY0QsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUF5QjtRQUNqRSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFBO1FBRWhCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxxQkFBUSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUU7WUFDM0MsT0FBTyxFQUFFLElBQUksb0JBQU8sQ0FBQyxZQUFZLEVBQUUsMEJBQWEsQ0FBQyxNQUFNLENBQUM7WUFDeEQsT0FBTyxFQUFFLGVBQWU7WUFDeEIsSUFBSSxFQUFFLGlCQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQ3JELE9BQU8sRUFBRSxzQkFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDNUIsUUFBUSxFQUFFLEtBQUssQ0FBQyxRQUFRO1lBQ3hCLFdBQVcsRUFBRTtnQkFDWCw4QkFBOEIsRUFBRSxLQUFLLENBQUMsUUFBUSxDQUFDLGFBQWE7YUFDN0Q7U0FDRixDQUFDLENBQUE7UUFFRixLQUFLLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUE7UUFFdEMsTUFBTSxRQUFRLEdBQUcsSUFBSSwyQkFBUSxDQUFDLElBQUksRUFBRSxVQUFVLEVBQUU7WUFDOUMsY0FBYyxFQUFFLElBQUksQ0FBQyxPQUFPO1lBQzVCLFFBQVEsRUFBRSxLQUFLLENBQUMsUUFBUTtTQUN6QixDQUFDLENBQUE7UUFFRixJQUFJLENBQUMsWUFBWSxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUE7SUFDM0MsQ0FBQzs7QUE5Q0gsc0NBK0NDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRHVyYXRpb24gfSBmcm9tIFwiYXdzLWNkay1saWJcIlxuaW1wb3J0IHsgQ29kZSwgRnVuY3Rpb24sIFJ1bnRpbWUsIFJ1bnRpbWVGYW1pbHkgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxhbWJkYVwiXG5pbXBvcnQgdHlwZSB7IElMb2dHcm91cCB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbG9nc1wiXG5pbXBvcnQgdHlwZSB7IElQYXJhbWV0ZXIgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXNzbVwiXG5pbXBvcnQgeyBQcm92aWRlciB9IGZyb20gXCJhd3MtY2RrLWxpYi9jdXN0b20tcmVzb3VyY2VzXCJcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCJcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcInBhdGhcIlxuXG4vKipcbiAqIFNoYXJlZCBUdXJzbyBjdXN0b20tcmVzb3VyY2UgcHJvdmlkZXIgY29udHJhY3QuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSVR1cnNvUHJvdmlkZXIge1xuICAvKipcbiAgICogVGhlIENESyBjdXN0b20tcmVzb3VyY2UgcHJvdmlkZXIgc2VydmljZSB0b2tlbi5cbiAgICovXG4gIHJlYWRvbmx5IHNlcnZpY2VUb2tlbjogc3RyaW5nXG59XG5cbmNsYXNzIEltcG9ydGVkVHVyc29Qcm92aWRlciBleHRlbmRzIENvbnN0cnVjdCBpbXBsZW1lbnRzIElUdXJzb1Byb3ZpZGVyIHtcbiAgcHVibGljIHJlYWRvbmx5IHNlcnZpY2VUb2tlbjogc3RyaW5nXG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgc2VydmljZVRva2VuOiBzdHJpbmcpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpXG5cbiAgICB0aGlzLnNlcnZpY2VUb2tlbiA9IHNlcnZpY2VUb2tlblxuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHVyc29Qcm92aWRlclByb3BzIHtcbiAgLyoqXG4gICAqIFNTTSBwYXJhbWV0ZXIgdGhhdCBob2xkcyB0aGUgVHVyc28gcGxhdGZvcm0gQVBJIHRva2VuXG4gICAqIChzdG9yZWQgYXMgU2VjdXJlU3RyaW5nKS5cbiAgICovXG4gIHJlYWRvbmx5IGFwaVRva2VuOiBJUGFyYW1ldGVyXG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsIGxvZyBncm91cCBmb3IgdGhlIExhbWJkYSBmdW5jdGlvbi5cbiAgICogSWYgbm90IHByb3ZpZGVkLCBhIGxvZyBncm91cCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgY3JlYXRlZC5cbiAgICovXG4gIHJlYWRvbmx5IGxvZ0dyb3VwPzogSUxvZ0dyb3VwIHwgdW5kZWZpbmVkXG59XG5cbi8qKlxuICogU2hhcmVkIExhbWJkYSArIENsb3VkRm9ybWF0aW9uIGN1c3RvbS1yZXNvdXJjZSBwcm92aWRlciBmb3IgYWxsXG4gKiBUdXJzbyByZXNvdXJjZXMuICBDcmVhdGUgb25lIHBlciBzdGFjayBhbmQgcGFzcyBpdCB0byBldmVyeVxuICogYFR1cnNvRGF0YWJhc2VgLCBgVHVyc29BdXRoVG9rZW5gLCBldGMuXG4gKi9cbmV4cG9ydCBjbGFzcyBUdXJzb1Byb3ZpZGVyIGV4dGVuZHMgQ29uc3RydWN0IGltcGxlbWVudHMgSVR1cnNvUHJvdmlkZXIge1xuICAvKipcbiAgICogSW1wb3J0cyBhbiBleGlzdGluZyBUdXJzbyBwcm92aWRlciBieSBzZXJ2aWNlIHRva2VuLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tU2VydmljZVRva2VuKFxuICAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBzZXJ2aWNlVG9rZW46IHN0cmluZyxcbiAgKTogSVR1cnNvUHJvdmlkZXIge1xuICAgIHJldHVybiBuZXcgSW1wb3J0ZWRUdXJzb1Byb3ZpZGVyKHNjb3BlLCBpZCwgc2VydmljZVRva2VuKVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBMYW1iZGEgZnVuY3Rpb24gYmFja2luZyBhbGwgVHVyc28gY3VzdG9tIHJlc291cmNlcy5cbiAgICogVXNlIHRoaXMgdG8gYXR0YWNoIGFkZGl0aW9uYWwgSUFNIHBlcm1pc3Npb25zIHdoZW4gYSByZXNvdXJjZVxuICAgKiB0eXBlIG5lZWRzIHRoZW0gKGUuZy4gYHNzbTpQdXRQYXJhbWV0ZXJgIGZvciBhdXRoLXRva2VuIHN0b3JhZ2UpLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGhhbmRsZXI6IEZ1bmN0aW9uXG5cbiAgLyoqXG4gICAqIFRoZSBDREsgY3VzdG9tLXJlc291cmNlIHByb3ZpZGVyIHNlcnZpY2UgdG9rZW4uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgc2VydmljZVRva2VuOiBzdHJpbmdcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogVHVyc29Qcm92aWRlclByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKVxuXG4gICAgdGhpcy5oYW5kbGVyID0gbmV3IEZ1bmN0aW9uKHRoaXMsIFwiSGFuZGxlclwiLCB7XG4gICAgICBydW50aW1lOiBuZXcgUnVudGltZShcIm5vZGVqczI0LnhcIiwgUnVudGltZUZhbWlseS5OT0RFSlMpLFxuICAgICAgaGFuZGxlcjogXCJpbmRleC5oYW5kbGVyXCIsXG4gICAgICBjb2RlOiBDb2RlLmZyb21Bc3NldChwYXRoLmpvaW4oX19kaXJuYW1lLCBcImhhbmRsZXJcIikpLFxuICAgICAgdGltZW91dDogRHVyYXRpb24ubWludXRlcygzKSxcbiAgICAgIGxvZ0dyb3VwOiBwcm9wcy5sb2dHcm91cCxcbiAgICAgIGVudmlyb25tZW50OiB7XG4gICAgICAgIFRVUlNPX0FQSV9UT0tFTl9QQVJBTUVURVJfTkFNRTogcHJvcHMuYXBpVG9rZW4ucGFyYW1ldGVyTmFtZSxcbiAgICAgIH0sXG4gICAgfSlcblxuICAgIHByb3BzLmFwaVRva2VuLmdyYW50UmVhZCh0aGlzLmhhbmRsZXIpXG5cbiAgICBjb25zdCBwcm92aWRlciA9IG5ldyBQcm92aWRlcih0aGlzLCBcIlByb3ZpZGVyXCIsIHtcbiAgICAgIG9uRXZlbnRIYW5kbGVyOiB0aGlzLmhhbmRsZXIsXG4gICAgICBsb2dHcm91cDogcHJvcHMubG9nR3JvdXAsXG4gICAgfSlcblxuICAgIHRoaXMuc2VydmljZVRva2VuID0gcHJvdmlkZXIuc2VydmljZVRva2VuXG4gIH1cbn1cbiJdfQ==
package/package.json CHANGED
@@ -68,7 +68,7 @@
68
68
  "publishConfig": {
69
69
  "access": "public"
70
70
  },
71
- "version": "0.3.3",
71
+ "version": "0.4.0",
72
72
  "jest": {
73
73
  "coverageProvider": "v8",
74
74
  "testMatch": [
package/CLAUDE.md DELETED
@@ -1 +0,0 @@
1
- @AGENTS.md