cdk-turso 0.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/biome.jsonc ADDED
@@ -0,0 +1,85 @@
1
+ // biome-ignore-all format: ~~ Generated by projen. To modify, edit .projenrc.ts and run "npx projen".
2
+ {
3
+ "assist": {
4
+ "actions": {
5
+ "recommended": true
6
+ },
7
+ "enabled": true
8
+ },
9
+ "files": {
10
+ "ignoreUnknown": false,
11
+ "includes": [
12
+ "src/**",
13
+ "test/**",
14
+ ".projenrc.ts",
15
+ "projenrc/**",
16
+ "!.gitattributes",
17
+ "!.github/workflows/build.yml",
18
+ "!.github/workflows/pull-request-lint.yml",
19
+ "!.github/workflows/release.yml",
20
+ "!.github/workflows/upgrade-main.yml",
21
+ "!.gitignore",
22
+ "!.mergify.yml",
23
+ "!.projen/deps.json",
24
+ "!.projen/files.json",
25
+ "!.projen/tasks.json",
26
+ "!tsconfig.dev.json"
27
+ ]
28
+ },
29
+ "formatter": {
30
+ "enabled": true,
31
+ "indentStyle": "space",
32
+ "indentWidth": 2,
33
+ "lineWidth": 80
34
+ },
35
+ "javascript": {
36
+ "formatter": {
37
+ "quoteStyle": "double",
38
+ "arrowParentheses": "always",
39
+ "bracketSpacing": true,
40
+ "quoteProperties": "asNeeded",
41
+ "semicolons": "asNeeded",
42
+ "trailingCommas": "all"
43
+ }
44
+ },
45
+ "linter": {
46
+ "enabled": true,
47
+ "rules": {
48
+ "recommended": false,
49
+ "complexity": {
50
+ "useLiteralKeys": "off"
51
+ },
52
+ "correctness": {
53
+ "noUnusedImports": "error",
54
+ "noUnusedVariables": "error"
55
+ },
56
+ "style": {
57
+ "useNodejsImportProtocol": "off"
58
+ },
59
+ "suspicious": {
60
+ "noConfusingVoidType": "error",
61
+ "noShadowRestrictedNames": "off"
62
+ }
63
+ }
64
+ },
65
+ "vcs": {
66
+ "clientKind": "git",
67
+ "enabled": true,
68
+ "useIgnoreFile": true
69
+ },
70
+ "overrides": [
71
+ {
72
+ "includes": [
73
+ "**/*.test.ts"
74
+ ],
75
+ "linter": {
76
+ "rules": {
77
+ "style": {
78
+ "noNonNullAssertion": "off"
79
+ }
80
+ }
81
+ }
82
+ }
83
+ ],
84
+ "$schema": "node_modules/@biomejs/biome/configuration_schema.json"
85
+ }
@@ -0,0 +1,33 @@
1
+ export interface CloudFormationCustomResourceEvent {
2
+ RequestType: "Create" | "Update" | "Delete";
3
+ PhysicalResourceId?: string;
4
+ ResourceProperties: {
5
+ ServiceToken: string;
6
+ DatabaseName: string;
7
+ Group: string;
8
+ OrganizationSlug: string;
9
+ SizeLimit?: string;
10
+ Seed?: {
11
+ type: string;
12
+ name: string;
13
+ timestamp?: string;
14
+ };
15
+ Encryption?: {
16
+ encryptionKey: string;
17
+ encryptionCipher: string;
18
+ };
19
+ };
20
+ OldResourceProperties?: {
21
+ DatabaseName: string;
22
+ Group: string;
23
+ OrganizationSlug: string;
24
+ };
25
+ }
26
+ export declare function handler(event: CloudFormationCustomResourceEvent): Promise<{
27
+ PhysicalResourceId: string;
28
+ Data?: {
29
+ DbId: string;
30
+ Hostname: string;
31
+ Name: string;
32
+ };
33
+ }>;
@@ -0,0 +1,166 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/handler/index.ts
21
+ var index_exports = {};
22
+ __export(index_exports, {
23
+ handler: () => handler
24
+ });
25
+ module.exports = __toCommonJS(index_exports);
26
+ var import_client_ssm = require("@aws-sdk/client-ssm");
27
+ var ssmClient = new import_client_ssm.SSMClient({});
28
+ async function getApiToken(parameterName) {
29
+ const command = new import_client_ssm.GetParameterCommand({
30
+ Name: parameterName,
31
+ WithDecryption: true
32
+ });
33
+ const response = await ssmClient.send(command);
34
+ if (!response.Parameter?.Value) {
35
+ throw new Error(`SSM parameter ${parameterName} not found`);
36
+ }
37
+ return response.Parameter.Value;
38
+ }
39
+ async function handler(event) {
40
+ const {
41
+ RequestType,
42
+ PhysicalResourceId,
43
+ ResourceProperties,
44
+ OldResourceProperties
45
+ } = event;
46
+ const parameterName = process.env.TURSO_API_TOKEN_PARAMETER_NAME;
47
+ if (!parameterName) {
48
+ throw new Error(
49
+ "TURSO_API_TOKEN_PARAMETER_NAME environment variable not set"
50
+ );
51
+ }
52
+ const apiToken = await getApiToken(parameterName);
53
+ const orgSlug = encodeURIComponent(ResourceProperties.OrganizationSlug);
54
+ const baseUrl = "https://api.turso.tech/v1";
55
+ if (RequestType === "Create") {
56
+ const dbName = ResourceProperties.DatabaseName;
57
+ const body = {
58
+ name: dbName,
59
+ group: ResourceProperties.Group
60
+ };
61
+ if (ResourceProperties.SizeLimit) {
62
+ body.size_limit = ResourceProperties.SizeLimit;
63
+ }
64
+ if (ResourceProperties.Seed) {
65
+ body.seed = ResourceProperties.Seed;
66
+ }
67
+ if (ResourceProperties.Encryption) {
68
+ body.encryption = ResourceProperties.Encryption;
69
+ }
70
+ const response = await fetch(
71
+ `${baseUrl}/organizations/${orgSlug}/databases`,
72
+ {
73
+ method: "POST",
74
+ headers: {
75
+ Authorization: `Bearer ${apiToken}`,
76
+ "Content-Type": "application/json"
77
+ },
78
+ body: JSON.stringify(body)
79
+ }
80
+ );
81
+ if (!response.ok) {
82
+ const errorText = await response.text();
83
+ throw new Error(
84
+ `Failed to create database: ${response.status} ${errorText}`
85
+ );
86
+ }
87
+ const data = await response.json();
88
+ return {
89
+ PhysicalResourceId: dbName,
90
+ Data: {
91
+ DbId: data.database.DbId,
92
+ Hostname: data.database.Hostname,
93
+ Name: data.database.Name
94
+ }
95
+ };
96
+ }
97
+ if (RequestType === "Update") {
98
+ const oldDbName = OldResourceProperties?.DatabaseName;
99
+ const newDbName = ResourceProperties.DatabaseName;
100
+ if (oldDbName && oldDbName !== newDbName) {
101
+ const body = {
102
+ name: newDbName,
103
+ group: ResourceProperties.Group
104
+ };
105
+ const response = await fetch(
106
+ `${baseUrl}/organizations/${orgSlug}/databases`,
107
+ {
108
+ method: "POST",
109
+ headers: {
110
+ Authorization: `Bearer ${apiToken}`,
111
+ "Content-Type": "application/json"
112
+ },
113
+ body: JSON.stringify(body)
114
+ }
115
+ );
116
+ if (!response.ok) {
117
+ const errorText = await response.text();
118
+ throw new Error(
119
+ `Failed to create database: ${response.status} ${errorText}`
120
+ );
121
+ }
122
+ const data = await response.json();
123
+ return {
124
+ PhysicalResourceId: newDbName,
125
+ Data: {
126
+ DbId: data.database.DbId,
127
+ Hostname: data.database.Hostname,
128
+ Name: data.database.Name
129
+ }
130
+ };
131
+ }
132
+ return {
133
+ PhysicalResourceId: PhysicalResourceId || ResourceProperties.DatabaseName
134
+ };
135
+ }
136
+ if (RequestType === "Delete") {
137
+ if (!PhysicalResourceId) {
138
+ return { PhysicalResourceId: "unknown" };
139
+ }
140
+ if (PhysicalResourceId === "unknown" || PhysicalResourceId.startsWith("failed-")) {
141
+ return { PhysicalResourceId };
142
+ }
143
+ const dbNameToDelete = encodeURIComponent(PhysicalResourceId);
144
+ const response = await fetch(
145
+ `${baseUrl}/organizations/${orgSlug}/databases/${dbNameToDelete}`,
146
+ {
147
+ method: "DELETE",
148
+ headers: {
149
+ Authorization: `Bearer ${apiToken}`
150
+ }
151
+ }
152
+ );
153
+ if (!response.ok && response.status !== 404) {
154
+ const errorText = await response.text();
155
+ throw new Error(
156
+ `Failed to delete database: ${response.status} ${errorText}`
157
+ );
158
+ }
159
+ return { PhysicalResourceId };
160
+ }
161
+ throw new Error(`Unknown request type: ${RequestType}`);
162
+ }
163
+ // Annotate the CommonJS export names for ESM import in node:
164
+ 0 && (module.exports = {
165
+ handler
166
+ });
package/lib/index.d.ts ADDED
@@ -0,0 +1 @@
1
+ export { TursoDatabase, TursoDatabaseEncryption, TursoDatabaseProps, TursoDatabaseSeed, } from "./turso-database";
package/lib/index.js ADDED
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TursoDatabase = void 0;
4
+ var turso_database_1 = require("./turso-database");
5
+ Object.defineProperty(exports, "TursoDatabase", { enumerable: true, get: function () { return turso_database_1.TursoDatabase; } });
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbURBS3lCO0FBSnZCLCtHQUFBLGFBQWEsT0FBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7XG4gIFR1cnNvRGF0YWJhc2UsXG4gIFR1cnNvRGF0YWJhc2VFbmNyeXB0aW9uLFxuICBUdXJzb0RhdGFiYXNlUHJvcHMsXG4gIFR1cnNvRGF0YWJhc2VTZWVkLFxufSBmcm9tIFwiLi90dXJzby1kYXRhYmFzZVwiXG4iXX0=
@@ -0,0 +1,26 @@
1
+ import type { IParameter } from "aws-cdk-lib/aws-ssm";
2
+ import { Construct } from "constructs";
3
+ export interface TursoDatabaseSeed {
4
+ readonly type: string;
5
+ readonly name: string;
6
+ readonly timestamp?: string;
7
+ }
8
+ export interface TursoDatabaseEncryption {
9
+ readonly encryptionKey: string;
10
+ readonly encryptionCipher: string;
11
+ }
12
+ export interface TursoDatabaseProps {
13
+ readonly databaseName: string;
14
+ readonly group: string;
15
+ readonly organizationSlug: string;
16
+ readonly apiToken: IParameter;
17
+ readonly sizeLimit?: string;
18
+ readonly seed?: TursoDatabaseSeed;
19
+ readonly encryption?: TursoDatabaseEncryption;
20
+ }
21
+ export declare class TursoDatabase extends Construct {
22
+ readonly dbId: string;
23
+ readonly hostname: string;
24
+ readonly databaseName: string;
25
+ constructor(scope: Construct, id: string, props: TursoDatabaseProps);
26
+ }
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ var _a;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.TursoDatabase = void 0;
5
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
6
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
7
+ const aws_lambda_1 = require("aws-cdk-lib/aws-lambda");
8
+ const custom_resources_1 = require("aws-cdk-lib/custom-resources");
9
+ const constructs_1 = require("constructs");
10
+ const path = require("path");
11
+ class TursoDatabase extends constructs_1.Construct {
12
+ constructor(scope, id, props) {
13
+ super(scope, id);
14
+ if (!/^[a-z0-9-]+$/.test(props.databaseName)) {
15
+ throw new Error("databaseName must contain only lowercase letters, numbers, and dashes");
16
+ }
17
+ if (props.databaseName.length > 64) {
18
+ throw new Error("databaseName must be at most 64 characters");
19
+ }
20
+ const handler = new aws_lambda_1.Function(this, "Handler", {
21
+ runtime: new aws_lambda_1.Runtime("nodejs24.x", aws_lambda_1.RuntimeFamily.NODEJS),
22
+ handler: "index.handler",
23
+ code: aws_lambda_1.Code.fromAsset(path.join(__dirname, "handler")),
24
+ environment: {
25
+ TURSO_API_TOKEN_PARAMETER_NAME: props.apiToken.parameterName,
26
+ },
27
+ });
28
+ props.apiToken.grantRead(handler);
29
+ const provider = new custom_resources_1.Provider(this, "Provider", {
30
+ onEventHandler: handler,
31
+ });
32
+ const resourceProps = {
33
+ DatabaseName: props.databaseName,
34
+ Group: props.group,
35
+ OrganizationSlug: props.organizationSlug,
36
+ };
37
+ if (props.sizeLimit) {
38
+ resourceProps.SizeLimit = props.sizeLimit;
39
+ }
40
+ if (props.seed) {
41
+ resourceProps.Seed = props.seed;
42
+ }
43
+ if (props.encryption) {
44
+ resourceProps.Encryption = props.encryption;
45
+ }
46
+ const cr = new aws_cdk_lib_1.CustomResource(this, "CustomResource", {
47
+ serviceToken: provider.serviceToken,
48
+ properties: resourceProps,
49
+ });
50
+ this.dbId = cr.getAttString("DbId");
51
+ this.hostname = cr.getAttString("Hostname");
52
+ this.databaseName = cr.getAttString("Name");
53
+ }
54
+ }
55
+ exports.TursoDatabase = TursoDatabase;
56
+ _a = JSII_RTTI_SYMBOL_1;
57
+ TursoDatabase[_a] = { fqn: "cdk-turso.TursoDatabase", version: "0.0.0" };
58
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHVyc28tZGF0YWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdHVyc28tZGF0YWJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw2Q0FBNEM7QUFDNUMsdURBQStFO0FBRS9FLG1FQUF1RDtBQUN2RCwyQ0FBc0M7QUFDdEMsNkJBQTRCO0FBdUI1QixNQUFhLGFBQWMsU0FBUSxzQkFBUztJQUsxQyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQXlCO1FBQ2pFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUE7UUFFaEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7WUFDN0MsTUFBTSxJQUFJLEtBQUssQ0FDYix1RUFBdUUsQ0FDeEUsQ0FBQTtRQUNILENBQUM7UUFDRCxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLEVBQUUsRUFBRSxDQUFDO1lBQ25DLE1BQU0sSUFBSSxLQUFLLENBQUMsNENBQTRDLENBQUMsQ0FBQTtRQUMvRCxDQUFDO1FBRUQsTUFBTSxPQUFPLEdBQUcsSUFBSSxxQkFBUSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUU7WUFDNUMsT0FBTyxFQUFFLElBQUksb0JBQU8sQ0FBQyxZQUFZLEVBQUUsMEJBQWEsQ0FBQyxNQUFNLENBQUM7WUFDeEQsT0FBTyxFQUFFLGVBQWU7WUFDeEIsSUFBSSxFQUFFLGlCQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQ3JELFdBQVcsRUFBRTtnQkFDWCw4QkFBOEIsRUFBRSxLQUFLLENBQUMsUUFBUSxDQUFDLGFBQWE7YUFDN0Q7U0FDRixDQUFDLENBQUE7UUFFRixLQUFLLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUVqQyxNQUFNLFFBQVEsR0FBRyxJQUFJLDJCQUFRLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRTtZQUM5QyxjQUFjLEVBQUUsT0FBTztTQUN4QixDQUFDLENBQUE7UUFFRixNQUFNLGFBQWEsR0FBNEI7WUFDN0MsWUFBWSxFQUFFLEtBQUssQ0FBQyxZQUFZO1lBQ2hDLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSztZQUNsQixnQkFBZ0IsRUFBRSxLQUFLLENBQUMsZ0JBQWdCO1NBQ3pDLENBQUE7UUFFRCxJQUFJLEtBQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNwQixhQUFhLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUE7UUFDM0MsQ0FBQztRQUNELElBQUksS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2YsYUFBYSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFBO1FBQ2pDLENBQUM7UUFDRCxJQUFJLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNyQixhQUFhLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUE7UUFDN0MsQ0FBQztRQUVELE1BQU0sRUFBRSxHQUFHLElBQUksNEJBQWMsQ0FBQyxJQUFJLEVBQUUsZ0JBQWdCLEVBQUU7WUFDcEQsWUFBWSxFQUFFLFFBQVEsQ0FBQyxZQUFZO1lBQ25DLFVBQVUsRUFBRSxhQUFhO1NBQzFCLENBQUMsQ0FBQTtRQUVGLElBQUksQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUNuQyxJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUE7UUFDM0MsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQzdDLENBQUM7O0FBeERILHNDQXlEQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEN1c3RvbVJlc291cmNlIH0gZnJvbSBcImF3cy1jZGstbGliXCJcbmltcG9ydCB7IENvZGUsIEZ1bmN0aW9uLCBSdW50aW1lLCBSdW50aW1lRmFtaWx5IH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1sYW1iZGFcIlxuaW1wb3J0IHR5cGUgeyBJUGFyYW1ldGVyIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1zc21cIlxuaW1wb3J0IHsgUHJvdmlkZXIgfSBmcm9tIFwiYXdzLWNkay1saWIvY3VzdG9tLXJlc291cmNlc1wiXG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCJcblxuZXhwb3J0IGludGVyZmFjZSBUdXJzb0RhdGFiYXNlU2VlZCB7XG4gIHJlYWRvbmx5IHR5cGU6IHN0cmluZ1xuICByZWFkb25seSBuYW1lOiBzdHJpbmdcbiAgcmVhZG9ubHkgdGltZXN0YW1wPzogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHVyc29EYXRhYmFzZUVuY3J5cHRpb24ge1xuICByZWFkb25seSBlbmNyeXB0aW9uS2V5OiBzdHJpbmdcbiAgcmVhZG9ubHkgZW5jcnlwdGlvbkNpcGhlcjogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHVyc29EYXRhYmFzZVByb3BzIHtcbiAgcmVhZG9ubHkgZGF0YWJhc2VOYW1lOiBzdHJpbmdcbiAgcmVhZG9ubHkgZ3JvdXA6IHN0cmluZ1xuICByZWFkb25seSBvcmdhbml6YXRpb25TbHVnOiBzdHJpbmdcbiAgcmVhZG9ubHkgYXBpVG9rZW46IElQYXJhbWV0ZXJcbiAgcmVhZG9ubHkgc2l6ZUxpbWl0Pzogc3RyaW5nXG4gIHJlYWRvbmx5IHNlZWQ/OiBUdXJzb0RhdGFiYXNlU2VlZFxuICByZWFkb25seSBlbmNyeXB0aW9uPzogVHVyc29EYXRhYmFzZUVuY3J5cHRpb25cbn1cblxuZXhwb3J0IGNsYXNzIFR1cnNvRGF0YWJhc2UgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICBwdWJsaWMgcmVhZG9ubHkgZGJJZDogc3RyaW5nXG4gIHB1YmxpYyByZWFkb25seSBob3N0bmFtZTogc3RyaW5nXG4gIHB1YmxpYyByZWFkb25seSBkYXRhYmFzZU5hbWU6IHN0cmluZ1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBUdXJzb0RhdGFiYXNlUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpXG5cbiAgICBpZiAoIS9eW2EtejAtOS1dKyQvLnRlc3QocHJvcHMuZGF0YWJhc2VOYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcImRhdGFiYXNlTmFtZSBtdXN0IGNvbnRhaW4gb25seSBsb3dlcmNhc2UgbGV0dGVycywgbnVtYmVycywgYW5kIGRhc2hlc1wiLFxuICAgICAgKVxuICAgIH1cbiAgICBpZiAocHJvcHMuZGF0YWJhc2VOYW1lLmxlbmd0aCA+IDY0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJkYXRhYmFzZU5hbWUgbXVzdCBiZSBhdCBtb3N0IDY0IGNoYXJhY3RlcnNcIilcbiAgICB9XG5cbiAgICBjb25zdCBoYW5kbGVyID0gbmV3IEZ1bmN0aW9uKHRoaXMsIFwiSGFuZGxlclwiLCB7XG4gICAgICBydW50aW1lOiBuZXcgUnVudGltZShcIm5vZGVqczI0LnhcIiwgUnVudGltZUZhbWlseS5OT0RFSlMpLFxuICAgICAgaGFuZGxlcjogXCJpbmRleC5oYW5kbGVyXCIsXG4gICAgICBjb2RlOiBDb2RlLmZyb21Bc3NldChwYXRoLmpvaW4oX19kaXJuYW1lLCBcImhhbmRsZXJcIikpLFxuICAgICAgZW52aXJvbm1lbnQ6IHtcbiAgICAgICAgVFVSU09fQVBJX1RPS0VOX1BBUkFNRVRFUl9OQU1FOiBwcm9wcy5hcGlUb2tlbi5wYXJhbWV0ZXJOYW1lLFxuICAgICAgfSxcbiAgICB9KVxuXG4gICAgcHJvcHMuYXBpVG9rZW4uZ3JhbnRSZWFkKGhhbmRsZXIpXG5cbiAgICBjb25zdCBwcm92aWRlciA9IG5ldyBQcm92aWRlcih0aGlzLCBcIlByb3ZpZGVyXCIsIHtcbiAgICAgIG9uRXZlbnRIYW5kbGVyOiBoYW5kbGVyLFxuICAgIH0pXG5cbiAgICBjb25zdCByZXNvdXJjZVByb3BzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHtcbiAgICAgIERhdGFiYXNlTmFtZTogcHJvcHMuZGF0YWJhc2VOYW1lLFxuICAgICAgR3JvdXA6IHByb3BzLmdyb3VwLFxuICAgICAgT3JnYW5pemF0aW9uU2x1ZzogcHJvcHMub3JnYW5pemF0aW9uU2x1ZyxcbiAgICB9XG5cbiAgICBpZiAocHJvcHMuc2l6ZUxpbWl0KSB7XG4gICAgICByZXNvdXJjZVByb3BzLlNpemVMaW1pdCA9IHByb3BzLnNpemVMaW1pdFxuICAgIH1cbiAgICBpZiAocHJvcHMuc2VlZCkge1xuICAgICAgcmVzb3VyY2VQcm9wcy5TZWVkID0gcHJvcHMuc2VlZFxuICAgIH1cbiAgICBpZiAocHJvcHMuZW5jcnlwdGlvbikge1xuICAgICAgcmVzb3VyY2VQcm9wcy5FbmNyeXB0aW9uID0gcHJvcHMuZW5jcnlwdGlvblxuICAgIH1cblxuICAgIGNvbnN0IGNyID0gbmV3IEN1c3RvbVJlc291cmNlKHRoaXMsIFwiQ3VzdG9tUmVzb3VyY2VcIiwge1xuICAgICAgc2VydmljZVRva2VuOiBwcm92aWRlci5zZXJ2aWNlVG9rZW4sXG4gICAgICBwcm9wZXJ0aWVzOiByZXNvdXJjZVByb3BzLFxuICAgIH0pXG5cbiAgICB0aGlzLmRiSWQgPSBjci5nZXRBdHRTdHJpbmcoXCJEYklkXCIpXG4gICAgdGhpcy5ob3N0bmFtZSA9IGNyLmdldEF0dFN0cmluZyhcIkhvc3RuYW1lXCIpXG4gICAgdGhpcy5kYXRhYmFzZU5hbWUgPSBjci5nZXRBdHRTdHJpbmcoXCJOYW1lXCIpXG4gIH1cbn1cbiJdfQ==
package/package.json ADDED
@@ -0,0 +1,126 @@
1
+ {
2
+ "name": "cdk-turso",
3
+ "repository": {
4
+ "type": "git",
5
+ "url": "https://github.com/berend/cdk-turso.git"
6
+ },
7
+ "scripts": {
8
+ "biome": "npx projen biome",
9
+ "build": "npx projen build",
10
+ "bump": "npx projen bump",
11
+ "clobber": "npx projen clobber",
12
+ "compat": "npx projen compat",
13
+ "compile": "npx projen compile",
14
+ "default": "npx projen default",
15
+ "docgen": "npx projen docgen",
16
+ "eject": "npx projen eject",
17
+ "package": "npx projen package",
18
+ "package-all": "npx projen package-all",
19
+ "package:js": "npx projen package:js",
20
+ "post-compile": "npx projen post-compile",
21
+ "post-upgrade": "npx projen post-upgrade",
22
+ "pre-compile": "npx projen pre-compile",
23
+ "release": "npx projen release",
24
+ "test": "npx projen test",
25
+ "test:watch": "npx projen test:watch",
26
+ "unbump": "npx projen unbump",
27
+ "upgrade": "npx projen upgrade",
28
+ "watch": "npx projen watch",
29
+ "projen": "npx projen"
30
+ },
31
+ "author": {
32
+ "name": "Berend de Boer",
33
+ "email": "berend@pobox.com",
34
+ "organization": false
35
+ },
36
+ "devDependencies": {
37
+ "@aws-sdk/client-ssm": "^3.990.0",
38
+ "@biomejs/biome": "^2",
39
+ "@types/jest": "^30.0.0",
40
+ "@types/node": "^25.2.3",
41
+ "aws-cdk-lib": "2.1.0",
42
+ "commit-and-tag-version": "^12",
43
+ "constructs": "10.0.5",
44
+ "esbuild": "^0.27.3",
45
+ "jest": "^30.2.0",
46
+ "jest-junit": "^16",
47
+ "jsii": "~5.9.0",
48
+ "jsii-diff": "^1.126.0",
49
+ "jsii-docgen": "^10.5.0",
50
+ "jsii-pacmak": "^1.126.0",
51
+ "jsii-rosetta": "~5.9.0",
52
+ "projen": "^0.99.12",
53
+ "ts-jest": "^29.4.6",
54
+ "ts-node": "^10.9.2",
55
+ "typescript": "^5.9.3"
56
+ },
57
+ "peerDependencies": {
58
+ "aws-cdk-lib": "^2.1.0",
59
+ "constructs": "^10.0.5"
60
+ },
61
+ "keywords": [
62
+ "cdk"
63
+ ],
64
+ "main": "lib/index.js",
65
+ "license": "Apache-2.0",
66
+ "publishConfig": {
67
+ "access": "public"
68
+ },
69
+ "version": "0.0.0",
70
+ "jest": {
71
+ "coverageProvider": "v8",
72
+ "testMatch": [
73
+ "<rootDir>/@(src|test)/**/*(*.)@(spec|test).ts?(x)",
74
+ "<rootDir>/@(src|test)/**/__tests__/**/*.ts?(x)",
75
+ "<rootDir>/@(projenrc)/**/*(*.)@(spec|test).ts?(x)",
76
+ "<rootDir>/@(projenrc)/**/__tests__/**/*.ts?(x)"
77
+ ],
78
+ "clearMocks": true,
79
+ "collectCoverage": true,
80
+ "coverageReporters": [
81
+ "json",
82
+ "lcov",
83
+ "clover",
84
+ "cobertura",
85
+ "text"
86
+ ],
87
+ "coverageDirectory": "coverage",
88
+ "coveragePathIgnorePatterns": [
89
+ "/node_modules/"
90
+ ],
91
+ "testPathIgnorePatterns": [
92
+ "/node_modules/"
93
+ ],
94
+ "watchPathIgnorePatterns": [
95
+ "/node_modules/"
96
+ ],
97
+ "reporters": [
98
+ "default",
99
+ [
100
+ "jest-junit",
101
+ {
102
+ "outputDirectory": "test-reports"
103
+ }
104
+ ]
105
+ ],
106
+ "transform": {
107
+ "^.+\\.[t]sx?$": [
108
+ "ts-jest",
109
+ {
110
+ "tsconfig": "tsconfig.dev.json"
111
+ }
112
+ ]
113
+ }
114
+ },
115
+ "types": "lib/index.d.ts",
116
+ "stability": "stable",
117
+ "jsii": {
118
+ "outdir": "dist",
119
+ "targets": {},
120
+ "tsc": {
121
+ "outDir": "lib",
122
+ "rootDir": "src"
123
+ }
124
+ },
125
+ "//": "~~ Generated by projen. To modify, edit .projenrc.ts and run \"npx projen\"."
126
+ }