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 +151 -20
- package/AGENTS.md +128 -125
- package/API.md +113 -6
- package/README.md +33 -5
- package/lib/handler/index.js +35 -2
- package/lib/index.d.ts +1 -1
- package/lib/index.js +1 -1
- package/lib/turso-auth-token.d.ts +9 -2
- package/lib/turso-auth-token.js +8 -4
- package/lib/turso-database.d.ts +18 -2
- package/lib/turso-database.js +8 -2
- package/lib/turso-provider.d.ts +14 -1
- package/lib/turso-provider.js +14 -2
- package/package.json +1 -1
- package/CLAUDE.md +0 -1
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\
|
|
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":
|
|
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":
|
|
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":
|
|
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.
|
|
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":
|
|
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":
|
|
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":
|
|
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":
|
|
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":
|
|
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.
|
|
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":
|
|
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":
|
|
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":
|
|
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":
|
|
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":
|
|
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":
|
|
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":
|
|
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.
|
|
4641
|
-
"fingerprint": "
|
|
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
|
-
|
|
8
|
-
|
|
9
|
-
|
|
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 #
|
|
13
|
-
npm run compile # jsii
|
|
14
|
-
npm run test #
|
|
15
|
-
npm run test:watch #
|
|
16
|
-
npm run watch # jsii
|
|
17
|
-
npx projen biome #
|
|
18
|
-
npx projen #
|
|
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
|
-
|
|
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
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
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 #
|
|
35
|
-
turso-
|
|
36
|
-
turso-
|
|
37
|
-
turso-
|
|
38
|
-
handler/index.ts # Lambda
|
|
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 #
|
|
41
|
-
turso-auth-token.test.ts #
|
|
42
|
-
handler.test.ts # Handler unit tests
|
|
43
|
-
lib/ #
|
|
44
|
-
dist/ #
|
|
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
|
-
|
|
48
|
-
-
|
|
49
|
-
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
-
|
|
57
|
-
-
|
|
58
|
-
-
|
|
59
|
-
-
|
|
60
|
-
-
|
|
61
|
-
-
|
|
62
|
-
|
|
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`:
|
|
69
|
-
- `useNodejsImportProtocol`: off
|
|
86
|
+
- `noNonNullAssertion`: off only in `**/*.test.ts`
|
|
87
|
+
- `useNodejsImportProtocol`: off (`"path"` over `"node:path"`)
|
|
70
88
|
|
|
71
89
|
## Import Conventions
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
-
|
|
81
|
-
-
|
|
82
|
-
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
-
|
|
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
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
-
|
|
108
|
-
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
-
|
|
115
|
-
-
|
|
116
|
-
-
|
|
117
|
-
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
-
|
|
125
|
-
-
|
|
126
|
-
|
|
127
|
-
|
|
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.
|
|
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:
|
|
522
|
+
public readonly provider: ITursoProvider;
|
|
491
523
|
```
|
|
492
524
|
|
|
493
|
-
- *Type:* <a href="#cdk-turso.
|
|
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.
|
|
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:
|
|
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:*
|
|
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
|
-
|
|
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` | `
|
|
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` | `
|
|
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
|
|
package/lib/handler/index.js
CHANGED
|
@@ -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,
|
|
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 {
|
|
3
|
+
import type { ITursoProvider } from "./turso-provider";
|
|
3
4
|
export interface TursoAuthTokenProps {
|
|
4
|
-
readonly provider:
|
|
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
|
/**
|
package/lib/turso-auth-token.js
CHANGED
|
@@ -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
|
|
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.
|
|
52
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
55
|
+
TursoAuthToken[_a] = { fqn: "cdk-turso.TursoAuthToken", version: "0.4.0" };
|
|
56
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHVyc28tYXV0aC10b2tlbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy90dXJzby1hdXRoLXRva2VuLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsNkNBQWtFO0FBQ2xFLGlEQUE2RDtBQUM3RCwyQ0FBc0M7QUE0Q3RDLE1BQWEsY0FBZSxTQUFRLHNCQUFTO0lBTTNDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBMEI7UUFDbEUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQTtRQUVoQixJQUNFLEtBQUssQ0FBQyxhQUFhO1lBQ25CLEtBQUssQ0FBQyxhQUFhLEtBQUssYUFBYTtZQUNyQyxLQUFLLENBQUMsYUFBYSxLQUFLLFdBQVcsRUFDbkMsQ0FBQztZQUNELE1BQU0sSUFBSSxLQUFLLENBQUMsb0RBQW9ELENBQUMsQ0FBQTtRQUN2RSxDQUFDO1FBRUQsTUFBTSxZQUFZLEdBQUcsbUJBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQzVDLE9BQU8sRUFBRSxLQUFLO1lBQ2QsUUFBUSxFQUFFLFdBQVc7WUFDckIsWUFBWSxFQUFFLEtBQUssQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQztnQkFDL0MsQ0FBQyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztnQkFDOUIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxhQUFhO1NBQ3hCLENBQUMsQ0FBQTtRQUVGLE1BQU0sbUJBQW1CLEdBQUcsS0FBSyxDQUFDLFFBSWpDLENBQUE7UUFFRCxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsZUFBZSxDQUMxQyxJQUFJLHlCQUFlLENBQUM7WUFDbEIsTUFBTSxFQUFFLGdCQUFNLENBQUMsS0FBSztZQUNwQixPQUFPLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxxQkFBcUIsQ0FBQztZQUNwRCxTQUFTLEVBQUUsQ0FBQyxZQUFZLENBQUM7U0FDMUIsQ0FBQyxDQUNILENBQUE7UUFFRCxNQUFNLGFBQWEsR0FBNEI7WUFDN0MsWUFBWSxFQUFFLFdBQVc7WUFDekIsWUFBWSxFQUFFLEtBQUssQ0FBQyxZQUFZO1lBQ2hDLGdCQUFnQixFQUFFLEtBQUssQ0FBQyxnQkFBZ0I7WUFDeEMsYUFBYSxFQUFFLEtBQUssQ0FBQyxhQUFhO1NBQ25DLENBQUE7UUFFRCxJQUFJLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNyQixhQUFhLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUE7UUFDN0MsQ0FBQztRQUNELElBQUksS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3hCLGFBQWEsQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDLGFBQWEsQ0FBQTtRQUNuRCxDQUFDO1FBRUQsTUFBTSxFQUFFLEdBQUcsSUFBSSw0QkFBYyxDQUFDLElBQUksRUFBRSxnQkFBZ0IsRUFBRTtZQUNwRCxZQUFZLEVBQUUsS0FBSyxDQUFDLFFBQVEsQ0FBQyxZQUFZO1lBQ3pDLFlBQVksRUFBRSx3QkFBd0I7WUFDdEMsVUFBVSxFQUFFLGFBQWE7U0FDMUIsQ0FBQyxDQUFBO1FBRUYsSUFBSSxLQUFLLENBQUMsYUFBYSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3RDLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUE7UUFDNUMsQ0FBQztRQUVELElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDLGFBQWEsQ0FBQTtJQUMxQyxDQUFDOztBQWhFSCx3Q0FpRUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDdXN0b21SZXNvdXJjZSwgUmVtb3ZhbFBvbGljeSwgU3RhY2sgfSBmcm9tIFwiYXdzLWNkay1saWJcIlxuaW1wb3J0IHsgRWZmZWN0LCBQb2xpY3lTdGF0ZW1lbnQgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWlhbVwiXG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiXG5pbXBvcnQgdHlwZSB7IElUdXJzb1Byb3ZpZGVyIH0gZnJvbSBcIi4vdHVyc28tcHJvdmlkZXJcIlxuXG5leHBvcnQgaW50ZXJmYWNlIFR1cnNvQXV0aFRva2VuUHJvcHMge1xuICByZWFkb25seSBwcm92aWRlcjogSVR1cnNvUHJvdmlkZXJcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIFR1cnNvIGRhdGFiYXNlIHRvIGNyZWF0ZSBhbiBhdXRoIHRva2VuIGZvci5cbiAgICovXG4gIHJlYWRvbmx5IGRhdGFiYXNlTmFtZTogc3RyaW5nXG5cbiAgLyoqXG4gICAqIFRoZSBUdXJzbyBvcmdhbml6YXRpb24gc2x1ZyB0aGF0IG93bnMgdGhlIGRhdGFiYXNlLlxuICAgKi9cbiAgcmVhZG9ubHkgb3JnYW5pemF0aW9uU2x1Zzogc3RyaW5nXG5cbiAgLyoqXG4gICAqIFRoZSBTU00gcGFyYW1ldGVyIG5hbWUgd2hlcmUgdGhlIGdlbmVyYXRlZCBKV1Qgd2lsbCBiZSBzdG9yZWRcbiAgICogYXMgYSBTZWN1cmVTdHJpbmcuXG4gICAqL1xuICByZWFkb25seSBwYXJhbWV0ZXJOYW1lOiBzdHJpbmdcblxuICAvKipcbiAgICogRXhwaXJhdGlvbiB0aW1lIGZvciB0aGUgdG9rZW4gKGUuZy4sIGBcIjJ3XCJgLCBgXCIxZDMwbVwiYCkuXG4gICAqXG4gICAqIEBkZWZhdWx0IFwibmV2ZXJcIlxuICAgKi9cbiAgcmVhZG9ubHkgZXhwaXJhdGlvbj86IHN0cmluZ1xuXG4gIC8qKlxuICAgKiBBdXRob3JpemF0aW9uIGxldmVsIGZvciB0aGUgdG9rZW4uXG4gICAqXG4gICAqIEBkZWZhdWx0IFwiZnVsbC1hY2Nlc3NcIlxuICAgKi9cbiAgcmVhZG9ubHkgYXV0aG9yaXphdGlvbj86IHN0cmluZ1xuXG4gIC8qKlxuICAgKiBSZW1vdmFsIHBvbGljeSBmb3IgdGhlIHVuZGVybHlpbmcgY3VzdG9tIHJlc291cmNlLlxuICAgKiBTZXQgdG8gYFJlbW92YWxQb2xpY3kuUkVUQUlOYCB0byBrZWVwIHRoZSBTU00gcGFyYW1ldGVyIG9uIHN0YWNrXG4gICAqIGRlbGV0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVtb3ZhbFBvbGljeT86IFJlbW92YWxQb2xpY3lcbn1cblxuZXhwb3J0IGNsYXNzIFR1cnNvQXV0aFRva2VuIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgLyoqXG4gICAqIFRoZSBTU00gcGFyYW1ldGVyIG5hbWUgd2hlcmUgdGhlIGF1dGggdG9rZW4gaXMgc3RvcmVkLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHBhcmFtZXRlck5hbWU6IHN0cmluZ1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBUdXJzb0F1dGhUb2tlblByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKVxuXG4gICAgaWYgKFxuICAgICAgcHJvcHMuYXV0aG9yaXphdGlvbiAmJlxuICAgICAgcHJvcHMuYXV0aG9yaXphdGlvbiAhPT0gXCJmdWxsLWFjY2Vzc1wiICYmXG4gICAgICBwcm9wcy5hdXRob3JpemF0aW9uICE9PSBcInJlYWQtb25seVwiXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2F1dGhvcml6YXRpb24gbXVzdCBiZSBcImZ1bGwtYWNjZXNzXCIgb3IgXCJyZWFkLW9ubHlcIicpXG4gICAgfVxuXG4gICAgY29uc3QgcGFyYW1ldGVyQXJuID0gU3RhY2sub2YodGhpcykuZm9ybWF0QXJuKHtcbiAgICAgIHNlcnZpY2U6IFwic3NtXCIsXG4gICAgICByZXNvdXJjZTogXCJwYXJhbWV0ZXJcIixcbiAgICAgIHJlc291cmNlTmFtZTogcHJvcHMucGFyYW1ldGVyTmFtZS5zdGFydHNXaXRoKFwiL1wiKVxuICAgICAgICA/IHByb3BzLnBhcmFtZXRlck5hbWUuc2xpY2UoMSlcbiAgICAgICAgOiBwcm9wcy5wYXJhbWV0ZXJOYW1lLFxuICAgIH0pXG5cbiAgICBjb25zdCBwcm92aWRlcldpdGhIYW5kbGVyID0gcHJvcHMucHJvdmlkZXIgYXMgSVR1cnNvUHJvdmlkZXIgJiB7XG4gICAgICByZWFkb25seSBoYW5kbGVyPzoge1xuICAgICAgICBhZGRUb1JvbGVQb2xpY3koc3RhdGVtZW50OiBQb2xpY3lTdGF0ZW1lbnQpOiB2b2lkXG4gICAgICB9XG4gICAgfVxuXG4gICAgcHJvdmlkZXJXaXRoSGFuZGxlci5oYW5kbGVyPy5hZGRUb1JvbGVQb2xpY3koXG4gICAgICBuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgZWZmZWN0OiBFZmZlY3QuQUxMT1csXG4gICAgICAgIGFjdGlvbnM6IFtcInNzbTpQdXRQYXJhbWV0ZXJcIiwgXCJzc206RGVsZXRlUGFyYW1ldGVyXCJdLFxuICAgICAgICByZXNvdXJjZXM6IFtwYXJhbWV0ZXJBcm5dLFxuICAgICAgfSksXG4gICAgKVxuXG4gICAgY29uc3QgcmVzb3VyY2VQcm9wczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7XG4gICAgICBSZXNvdXJjZVR5cGU6IFwiQXV0aFRva2VuXCIsXG4gICAgICBEYXRhYmFzZU5hbWU6IHByb3BzLmRhdGFiYXNlTmFtZSxcbiAgICAgIE9yZ2FuaXphdGlvblNsdWc6IHByb3BzLm9yZ2FuaXphdGlvblNsdWcsXG4gICAgICBQYXJhbWV0ZXJOYW1lOiBwcm9wcy5wYXJhbWV0ZXJOYW1lLFxuICAgIH1cblxuICAgIGlmIChwcm9wcy5leHBpcmF0aW9uKSB7XG4gICAgICByZXNvdXJjZVByb3BzLkV4cGlyYXRpb24gPSBwcm9wcy5leHBpcmF0aW9uXG4gICAgfVxuICAgIGlmIChwcm9wcy5hdXRob3JpemF0aW9uKSB7XG4gICAgICByZXNvdXJjZVByb3BzLkF1dGhvcml6YXRpb24gPSBwcm9wcy5hdXRob3JpemF0aW9uXG4gICAgfVxuXG4gICAgY29uc3QgY3IgPSBuZXcgQ3VzdG9tUmVzb3VyY2UodGhpcywgXCJUdXJzb0F1dGhUb2tlblwiLCB7XG4gICAgICBzZXJ2aWNlVG9rZW46IHByb3BzLnByb3ZpZGVyLnNlcnZpY2VUb2tlbixcbiAgICAgIHJlc291cmNlVHlwZTogXCJDdXN0b206OlR1cnNvQXV0aFRva2VuXCIsXG4gICAgICBwcm9wZXJ0aWVzOiByZXNvdXJjZVByb3BzLFxuICAgIH0pXG5cbiAgICBpZiAocHJvcHMucmVtb3ZhbFBvbGljeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjci5hcHBseVJlbW92YWxQb2xpY3kocHJvcHMucmVtb3ZhbFBvbGljeSlcbiAgICB9XG5cbiAgICB0aGlzLnBhcmFtZXRlck5hbWUgPSBwcm9wcy5wYXJhbWV0ZXJOYW1lXG4gIH1cbn1cbiJdfQ==
|
package/lib/turso-database.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
import { RemovalPolicy } from "aws-cdk-lib";
|
|
1
2
|
import { Construct } from "constructs";
|
|
2
|
-
import type {
|
|
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:
|
|
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;
|
package/lib/turso-database.js
CHANGED
|
@@ -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.
|
|
45
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
50
|
+
TursoDatabase[_a] = { fqn: "cdk-turso.TursoDatabase", version: "0.4.0" };
|
|
51
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHVyc28tZGF0YWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdHVyc28tZGF0YWJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw2Q0FBMkQ7QUFDM0QsMkNBQXNDO0FBeUN0QyxNQUFhLGFBQWMsU0FBUSxzQkFBUztJQVMxQyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQXlCO1FBQ2pFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUE7UUFFaEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7WUFDN0MsTUFBTSxJQUFJLEtBQUssQ0FDYix1RUFBdUUsQ0FDeEUsQ0FBQTtRQUNILENBQUM7UUFDRCxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLEVBQUUsRUFBRSxDQUFDO1lBQ25DLE1BQU0sSUFBSSxLQUFLLENBQUMsNENBQTRDLENBQUMsQ0FBQTtRQUMvRCxDQUFDO1FBRUQsTUFBTSxhQUFhLEdBQTRCO1lBQzdDLFlBQVksRUFBRSxVQUFVO1lBQ3hCLFlBQVksRUFBRSxLQUFLLENBQUMsWUFBWTtZQUNoQyxLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUs7WUFDbEIsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLGdCQUFnQjtTQUN6QyxDQUFBO1FBRUQsSUFBSSxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDcEIsYUFBYSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFBO1FBQzNDLENBQUM7UUFDRCxJQUFJLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNmLGFBQWEsQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQTtRQUNqQyxDQUFDO1FBQ0QsSUFBSSxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDckIsYUFBYSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUMsVUFBVSxDQUFBO1FBQzdDLENBQUM7UUFDRCxJQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDOUIsYUFBYSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFBO1FBQ25DLENBQUM7UUFFRCxNQUFNLEVBQUUsR0FBRyxJQUFJLDRCQUFjLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRTtZQUM3QyxZQUFZLEVBQUUsS0FBSyxDQUFDLFFBQVEsQ0FBQyxZQUFZO1lBQ3pDLFlBQVksRUFBRSx1QkFBdUI7WUFDckMsVUFBVSxFQUFFLGFBQWE7U0FDMUIsQ0FBQyxDQUFBO1FBRUYsSUFBSSxLQUFLLENBQUMsYUFBYSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3RDLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUE7UUFDNUMsQ0FBQztRQUVELElBQUksQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUNuQyxJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUE7UUFDM0MsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQzdDLENBQUM7O0FBdERILHNDQXVEQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEN1c3RvbVJlc291cmNlLCBSZW1vdmFsUG9saWN5IH0gZnJvbSBcImF3cy1jZGstbGliXCJcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCJcbmltcG9ydCB0eXBlIHsgSVR1cnNvUHJvdmlkZXIgfSBmcm9tIFwiLi90dXJzby1wcm92aWRlclwiXG5cbmV4cG9ydCBpbnRlcmZhY2UgVHVyc29EYXRhYmFzZVNlZWQge1xuICByZWFkb25seSB0eXBlOiBzdHJpbmdcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nXG4gIHJlYWRvbmx5IHRpbWVzdGFtcD86IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFR1cnNvRGF0YWJhc2VFbmNyeXB0aW9uIHtcbiAgcmVhZG9ubHkgZW5jcnlwdGlvbktleTogc3RyaW5nXG4gIHJlYWRvbmx5IGVuY3J5cHRpb25DaXBoZXI6IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFR1cnNvRGF0YWJhc2VQcm9wcyB7XG4gIHJlYWRvbmx5IHByb3ZpZGVyOiBJVHVyc29Qcm92aWRlclxuICByZWFkb25seSBkYXRhYmFzZU5hbWU6IHN0cmluZ1xuICByZWFkb25seSBncm91cDogc3RyaW5nXG4gIHJlYWRvbmx5IG9yZ2FuaXphdGlvblNsdWc6IHN0cmluZ1xuICByZWFkb25seSBzaXplTGltaXQ/OiBzdHJpbmdcbiAgcmVhZG9ubHkgc2VlZD86IFR1cnNvRGF0YWJhc2VTZWVkXG4gIHJlYWRvbmx5IGVuY3J5cHRpb24/OiBUdXJzb0RhdGFiYXNlRW5jcnlwdGlvblxuXG4gIC8qKlxuICAgKiBJZiB0cnVlLCB0aGUgcHJvdmlkZXIgd2lsbCBhZG9wdCBhbiBleGlzdGluZyBUdXJzbyBkYXRhYmFzZSB3aGVuXG4gICAqIGNyZWF0aW9uIHJlcG9ydHMgdGhhdCB0aGUgZGF0YWJhc2UgYWxyZWFkeSBleGlzdHMuXG4gICAqXG4gICAqIFRoaXMgZmxhZyBpcyBvbmx5IHVzZWQgZHVyaW5nIENyZWF0ZSByZXF1ZXN0cy5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGFkb3B0PzogYm9vbGVhblxuXG4gIC8qKlxuICAgKiBSZW1vdmFsIHBvbGljeSBmb3IgdGhlIHVuZGVybHlpbmcgY3VzdG9tIHJlc291cmNlLlxuICAgKiBTZXQgdG8gYFJlbW92YWxQb2xpY3kuUkVUQUlOYCB0byBrZWVwIHRoZSBUdXJzbyBkYXRhYmFzZSBvbiBzdGFja1xuICAgKiBkZWxldGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IHJlbW92YWxQb2xpY3k/OiBSZW1vdmFsUG9saWN5XG59XG5cbmV4cG9ydCBjbGFzcyBUdXJzb0RhdGFiYXNlIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgcHVibGljIHJlYWRvbmx5IGRiSWQ6IHN0cmluZ1xuICAvKipcbiAgICogRE5TIGhvc3RuYW1lIGZvciB0aGUgZGF0YWJhc2UgKGUuZy4sIGBteS1kYi1teS1vcmcudHVyc28uaW9gKS5cbiAgICogVXNlIHdpdGggbGliU1FMIG9yIEhUVFAgY29ubmVjdGlvbnMuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaG9zdG5hbWU6IHN0cmluZ1xuICBwdWJsaWMgcmVhZG9ubHkgZGF0YWJhc2VOYW1lOiBzdHJpbmdcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogVHVyc29EYXRhYmFzZVByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKVxuXG4gICAgaWYgKCEvXlthLXowLTktXSskLy50ZXN0KHByb3BzLmRhdGFiYXNlTmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJkYXRhYmFzZU5hbWUgbXVzdCBjb250YWluIG9ubHkgbG93ZXJjYXNlIGxldHRlcnMsIG51bWJlcnMsIGFuZCBkYXNoZXNcIixcbiAgICAgIClcbiAgICB9XG4gICAgaWYgKHByb3BzLmRhdGFiYXNlTmFtZS5sZW5ndGggPiA2NCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZGF0YWJhc2VOYW1lIG11c3QgYmUgYXQgbW9zdCA2NCBjaGFyYWN0ZXJzXCIpXG4gICAgfVxuXG4gICAgY29uc3QgcmVzb3VyY2VQcm9wczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7XG4gICAgICBSZXNvdXJjZVR5cGU6IFwiRGF0YWJhc2VcIixcbiAgICAgIERhdGFiYXNlTmFtZTogcHJvcHMuZGF0YWJhc2VOYW1lLFxuICAgICAgR3JvdXA6IHByb3BzLmdyb3VwLFxuICAgICAgT3JnYW5pemF0aW9uU2x1ZzogcHJvcHMub3JnYW5pemF0aW9uU2x1ZyxcbiAgICB9XG5cbiAgICBpZiAocHJvcHMuc2l6ZUxpbWl0KSB7XG4gICAgICByZXNvdXJjZVByb3BzLlNpemVMaW1pdCA9IHByb3BzLnNpemVMaW1pdFxuICAgIH1cbiAgICBpZiAocHJvcHMuc2VlZCkge1xuICAgICAgcmVzb3VyY2VQcm9wcy5TZWVkID0gcHJvcHMuc2VlZFxuICAgIH1cbiAgICBpZiAocHJvcHMuZW5jcnlwdGlvbikge1xuICAgICAgcmVzb3VyY2VQcm9wcy5FbmNyeXB0aW9uID0gcHJvcHMuZW5jcnlwdGlvblxuICAgIH1cbiAgICBpZiAocHJvcHMuYWRvcHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmVzb3VyY2VQcm9wcy5BZG9wdCA9IHByb3BzLmFkb3B0XG4gICAgfVxuXG4gICAgY29uc3QgY3IgPSBuZXcgQ3VzdG9tUmVzb3VyY2UodGhpcywgXCJUdXJzb0RiXCIsIHtcbiAgICAgIHNlcnZpY2VUb2tlbjogcHJvcHMucHJvdmlkZXIuc2VydmljZVRva2VuLFxuICAgICAgcmVzb3VyY2VUeXBlOiBcIkN1c3RvbTo6VHVyc29EYXRhYmFzZVwiLFxuICAgICAgcHJvcGVydGllczogcmVzb3VyY2VQcm9wcyxcbiAgICB9KVxuXG4gICAgaWYgKHByb3BzLnJlbW92YWxQb2xpY3kgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY3IuYXBwbHlSZW1vdmFsUG9saWN5KHByb3BzLnJlbW92YWxQb2xpY3kpXG4gICAgfVxuXG4gICAgdGhpcy5kYklkID0gY3IuZ2V0QXR0U3RyaW5nKFwiRGJJZFwiKVxuICAgIHRoaXMuaG9zdG5hbWUgPSBjci5nZXRBdHRTdHJpbmcoXCJIb3N0bmFtZVwiKVxuICAgIHRoaXMuZGF0YWJhc2VOYW1lID0gY3IuZ2V0QXR0U3RyaW5nKFwiTmFtZVwiKVxuICB9XG59XG4iXX0=
|
package/lib/turso-provider.d.ts
CHANGED
|
@@ -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
|
package/lib/turso-provider.js
CHANGED
|
@@ -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.
|
|
40
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
51
|
+
TursoProvider[_a] = { fqn: "cdk-turso.TursoProvider", version: "0.4.0" };
|
|
52
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHVyc28tcHJvdmlkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdHVyc28tcHJvdmlkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw2Q0FBc0M7QUFDdEMsdURBQStFO0FBRy9FLG1FQUF1RDtBQUN2RCwyQ0FBc0M7QUFDdEMsNkJBQTRCO0FBWTVCLE1BQU0scUJBQXNCLFNBQVEsc0JBQVM7SUFHM0MsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxZQUFvQjtRQUM1RCxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFBO1FBRWhCLElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFBO0lBQ2xDLENBQUM7Q0FDRjtBQWdCRDs7OztHQUlHO0FBQ0gsTUFBYSxhQUFjLFNBQVEsc0JBQVM7SUFDMUM7O09BRUc7SUFDSSxNQUFNLENBQUMsZ0JBQWdCLENBQzVCLEtBQWdCLEVBQ2hCLEVBQVUsRUFDVixZQUFvQjtRQUVwQixPQUFPLElBQUkscUJBQXFCLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxZQUFZLENBQUMsQ0FBQTtJQUMzRCxDQUFDO0lBY0QsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUF5QjtRQUNqRSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFBO1FBRWhCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxxQkFBUSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUU7WUFDM0MsT0FBTyxFQUFFLElBQUksb0JBQU8sQ0FBQyxZQUFZLEVBQUUsMEJBQWEsQ0FBQyxNQUFNLENBQUM7WUFDeEQsT0FBTyxFQUFFLGVBQWU7WUFDeEIsSUFBSSxFQUFFLGlCQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQ3JELE9BQU8sRUFBRSxzQkFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDNUIsUUFBUSxFQUFFLEtBQUssQ0FBQyxRQUFRO1lBQ3hCLFdBQVcsRUFBRTtnQkFDWCw4QkFBOEIsRUFBRSxLQUFLLENBQUMsUUFBUSxDQUFDLGFBQWE7YUFDN0Q7U0FDRixDQUFDLENBQUE7UUFFRixLQUFLLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUE7UUFFdEMsTUFBTSxRQUFRLEdBQUcsSUFBSSwyQkFBUSxDQUFDLElBQUksRUFBRSxVQUFVLEVBQUU7WUFDOUMsY0FBYyxFQUFFLElBQUksQ0FBQyxPQUFPO1lBQzVCLFFBQVEsRUFBRSxLQUFLLENBQUMsUUFBUTtTQUN6QixDQUFDLENBQUE7UUFFRixJQUFJLENBQUMsWUFBWSxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUE7SUFDM0MsQ0FBQzs7QUE5Q0gsc0NBK0NDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRHVyYXRpb24gfSBmcm9tIFwiYXdzLWNkay1saWJcIlxuaW1wb3J0IHsgQ29kZSwgRnVuY3Rpb24sIFJ1bnRpbWUsIFJ1bnRpbWVGYW1pbHkgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxhbWJkYVwiXG5pbXBvcnQgdHlwZSB7IElMb2dHcm91cCB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbG9nc1wiXG5pbXBvcnQgdHlwZSB7IElQYXJhbWV0ZXIgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXNzbVwiXG5pbXBvcnQgeyBQcm92aWRlciB9IGZyb20gXCJhd3MtY2RrLWxpYi9jdXN0b20tcmVzb3VyY2VzXCJcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCJcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcInBhdGhcIlxuXG4vKipcbiAqIFNoYXJlZCBUdXJzbyBjdXN0b20tcmVzb3VyY2UgcHJvdmlkZXIgY29udHJhY3QuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSVR1cnNvUHJvdmlkZXIge1xuICAvKipcbiAgICogVGhlIENESyBjdXN0b20tcmVzb3VyY2UgcHJvdmlkZXIgc2VydmljZSB0b2tlbi5cbiAgICovXG4gIHJlYWRvbmx5IHNlcnZpY2VUb2tlbjogc3RyaW5nXG59XG5cbmNsYXNzIEltcG9ydGVkVHVyc29Qcm92aWRlciBleHRlbmRzIENvbnN0cnVjdCBpbXBsZW1lbnRzIElUdXJzb1Byb3ZpZGVyIHtcbiAgcHVibGljIHJlYWRvbmx5IHNlcnZpY2VUb2tlbjogc3RyaW5nXG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgc2VydmljZVRva2VuOiBzdHJpbmcpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpXG5cbiAgICB0aGlzLnNlcnZpY2VUb2tlbiA9IHNlcnZpY2VUb2tlblxuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHVyc29Qcm92aWRlclByb3BzIHtcbiAgLyoqXG4gICAqIFNTTSBwYXJhbWV0ZXIgdGhhdCBob2xkcyB0aGUgVHVyc28gcGxhdGZvcm0gQVBJIHRva2VuXG4gICAqIChzdG9yZWQgYXMgU2VjdXJlU3RyaW5nKS5cbiAgICovXG4gIHJlYWRvbmx5IGFwaVRva2VuOiBJUGFyYW1ldGVyXG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsIGxvZyBncm91cCBmb3IgdGhlIExhbWJkYSBmdW5jdGlvbi5cbiAgICogSWYgbm90IHByb3ZpZGVkLCBhIGxvZyBncm91cCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgY3JlYXRlZC5cbiAgICovXG4gIHJlYWRvbmx5IGxvZ0dyb3VwPzogSUxvZ0dyb3VwIHwgdW5kZWZpbmVkXG59XG5cbi8qKlxuICogU2hhcmVkIExhbWJkYSArIENsb3VkRm9ybWF0aW9uIGN1c3RvbS1yZXNvdXJjZSBwcm92aWRlciBmb3IgYWxsXG4gKiBUdXJzbyByZXNvdXJjZXMuICBDcmVhdGUgb25lIHBlciBzdGFjayBhbmQgcGFzcyBpdCB0byBldmVyeVxuICogYFR1cnNvRGF0YWJhc2VgLCBgVHVyc29BdXRoVG9rZW5gLCBldGMuXG4gKi9cbmV4cG9ydCBjbGFzcyBUdXJzb1Byb3ZpZGVyIGV4dGVuZHMgQ29uc3RydWN0IGltcGxlbWVudHMgSVR1cnNvUHJvdmlkZXIge1xuICAvKipcbiAgICogSW1wb3J0cyBhbiBleGlzdGluZyBUdXJzbyBwcm92aWRlciBieSBzZXJ2aWNlIHRva2VuLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tU2VydmljZVRva2VuKFxuICAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBzZXJ2aWNlVG9rZW46IHN0cmluZyxcbiAgKTogSVR1cnNvUHJvdmlkZXIge1xuICAgIHJldHVybiBuZXcgSW1wb3J0ZWRUdXJzb1Byb3ZpZGVyKHNjb3BlLCBpZCwgc2VydmljZVRva2VuKVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBMYW1iZGEgZnVuY3Rpb24gYmFja2luZyBhbGwgVHVyc28gY3VzdG9tIHJlc291cmNlcy5cbiAgICogVXNlIHRoaXMgdG8gYXR0YWNoIGFkZGl0aW9uYWwgSUFNIHBlcm1pc3Npb25zIHdoZW4gYSByZXNvdXJjZVxuICAgKiB0eXBlIG5lZWRzIHRoZW0gKGUuZy4gYHNzbTpQdXRQYXJhbWV0ZXJgIGZvciBhdXRoLXRva2VuIHN0b3JhZ2UpLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGhhbmRsZXI6IEZ1bmN0aW9uXG5cbiAgLyoqXG4gICAqIFRoZSBDREsgY3VzdG9tLXJlc291cmNlIHByb3ZpZGVyIHNlcnZpY2UgdG9rZW4uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgc2VydmljZVRva2VuOiBzdHJpbmdcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogVHVyc29Qcm92aWRlclByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKVxuXG4gICAgdGhpcy5oYW5kbGVyID0gbmV3IEZ1bmN0aW9uKHRoaXMsIFwiSGFuZGxlclwiLCB7XG4gICAgICBydW50aW1lOiBuZXcgUnVudGltZShcIm5vZGVqczI0LnhcIiwgUnVudGltZUZhbWlseS5OT0RFSlMpLFxuICAgICAgaGFuZGxlcjogXCJpbmRleC5oYW5kbGVyXCIsXG4gICAgICBjb2RlOiBDb2RlLmZyb21Bc3NldChwYXRoLmpvaW4oX19kaXJuYW1lLCBcImhhbmRsZXJcIikpLFxuICAgICAgdGltZW91dDogRHVyYXRpb24ubWludXRlcygzKSxcbiAgICAgIGxvZ0dyb3VwOiBwcm9wcy5sb2dHcm91cCxcbiAgICAgIGVudmlyb25tZW50OiB7XG4gICAgICAgIFRVUlNPX0FQSV9UT0tFTl9QQVJBTUVURVJfTkFNRTogcHJvcHMuYXBpVG9rZW4ucGFyYW1ldGVyTmFtZSxcbiAgICAgIH0sXG4gICAgfSlcblxuICAgIHByb3BzLmFwaVRva2VuLmdyYW50UmVhZCh0aGlzLmhhbmRsZXIpXG5cbiAgICBjb25zdCBwcm92aWRlciA9IG5ldyBQcm92aWRlcih0aGlzLCBcIlByb3ZpZGVyXCIsIHtcbiAgICAgIG9uRXZlbnRIYW5kbGVyOiB0aGlzLmhhbmRsZXIsXG4gICAgICBsb2dHcm91cDogcHJvcHMubG9nR3JvdXAsXG4gICAgfSlcblxuICAgIHRoaXMuc2VydmljZVRva2VuID0gcHJvdmlkZXIuc2VydmljZVRva2VuXG4gIH1cbn1cbiJdfQ==
|
package/package.json
CHANGED
package/CLAUDE.md
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
@AGENTS.md
|