@liflig/cdk-vy 1.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.
@@ -0,0 +1,120 @@
1
+ /**
2
+ * CDK Construct for Cognito Resource Server
3
+ */
4
+ import { createRequire } from "node:module";
5
+ import * as path from "node:path";
6
+ import { fileURLToPath } from "node:url";
7
+ import * as cdk from "aws-cdk-lib";
8
+ import * as iam from "aws-cdk-lib/aws-iam";
9
+ import * as lambda from "aws-cdk-lib/aws-lambda";
10
+ import { NodejsFunction } from "aws-cdk-lib/aws-lambda-nodejs";
11
+ import * as logs from "aws-cdk-lib/aws-logs";
12
+ import * as cr from "aws-cdk-lib/custom-resources";
13
+ import { Construct } from "constructs";
14
+ const require = createRequire(import.meta.url);
15
+ const __filename = fileURLToPath(import.meta.url);
16
+ const __dirname = path.dirname(__filename);
17
+ /**
18
+ * A Cognito Resource Server managed through Vy's central Cognito service
19
+ *
20
+ * A resource server is an integration between a user pool and an API.
21
+ * Each resource server has custom scopes that you must activate in your app client.
22
+ * When you configure a resource server, your app can generate access tokens with
23
+ * OAuth scopes that authorize read and write operations to an API server.
24
+ *
25
+ * @example
26
+ * ```typescript
27
+ * const resourceServer = new CognitoResourceServer(this, 'ApiResourceServer', {
28
+ * environment: VyEnvironment.PROD,
29
+ * name: 'my-api',
30
+ * identifier: 'https://my-api.vydev.io',
31
+ * scopes: [
32
+ * { name: 'read', description: 'Read access to the API' },
33
+ * { name: 'write', description: 'Write access to the API' }
34
+ * ]
35
+ * });
36
+ * ```
37
+ */
38
+ export class CognitoResourceServer extends Construct {
39
+ /**
40
+ * The identifier of the resource server
41
+ */
42
+ identifier;
43
+ /**
44
+ * The name of the resource server
45
+ */
46
+ name;
47
+ /**
48
+ * The underlying custom resource
49
+ */
50
+ resource;
51
+ /**
52
+ * The logGroup for the event handler lambda
53
+ */
54
+ lambdaLogGroup;
55
+ /**
56
+ * The logGroup for the custom resource provider
57
+ */
58
+ providerLogGroup;
59
+ constructor(scope, id, props) {
60
+ super(scope, id);
61
+ this.identifier = props.identifier;
62
+ this.name = props.name;
63
+ this.lambdaLogGroup = new logs.LogGroup(this, "LambdaLogGroup", {
64
+ retention: props.logsRetention ?? logs.RetentionDays.ONE_WEEK,
65
+ });
66
+ const onEventHandler = new NodejsFunction(this, "OnEventHandler", {
67
+ runtime: lambda.Runtime.NODEJS_22_X,
68
+ handler: "handler",
69
+ entry: require.resolve(`${__dirname}/handler`),
70
+ timeout: cdk.Duration.minutes(2),
71
+ memorySize: 256,
72
+ logGroup: this.lambdaLogGroup,
73
+ environment: props.cognitoBaseDomain
74
+ ? {
75
+ COGNITO_BASE_DOMAIN: props.cognitoBaseDomain,
76
+ }
77
+ : undefined,
78
+ bundling: {
79
+ minify: true,
80
+ sourceMap: true,
81
+ target: "es2020",
82
+ externalModules: ["aws-sdk"],
83
+ },
84
+ });
85
+ onEventHandler.addToRolePolicy(new iam.PolicyStatement({
86
+ effect: iam.Effect.ALLOW,
87
+ actions: ["execute-api:Invoke"],
88
+ resources: ["*"], // Can be scoped down if API Gateway ARN is known
89
+ }));
90
+ this.providerLogGroup = new logs.LogGroup(this, "ProviderLogGroup", {
91
+ retention: props.logsRetention ?? logs.RetentionDays.ONE_WEEK,
92
+ });
93
+ const provider = new cr.Provider(this, "Provider", {
94
+ onEventHandler,
95
+ logGroup: this.providerLogGroup,
96
+ });
97
+ this.resource = new cdk.CustomResource(this, "Resource", {
98
+ serviceToken: provider.serviceToken,
99
+ properties: {
100
+ Environment: props.environment,
101
+ Name: props.name,
102
+ Identifier: props.identifier,
103
+ Scopes: props.scopes?.map((s) => ({
104
+ Name: s.name,
105
+ Description: s.description,
106
+ })),
107
+ },
108
+ resourceType: "Custom::VyCognitoResourceServer",
109
+ });
110
+ }
111
+ /**
112
+ * Get a reference to a scope in the format expected by app clients
113
+ * @param scopeName The name of the scope
114
+ * @returns The full scope identifier (e.g., 'https://api.vydev.io/read')
115
+ */
116
+ scopeIdentifier(scopeName) {
117
+ return `${this.identifier}/${scopeName}`;
118
+ }
119
+ }
120
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29nbml0by1yZXNvdXJjZS1zZXJ2ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29nbml0by1yZXNvdXJjZS1zZXJ2ZXIvY29nbml0by1yZXNvdXJjZS1zZXJ2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFBO0FBQzNDLE9BQU8sS0FBSyxJQUFJLE1BQU0sV0FBVyxDQUFBO0FBQ2pDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxVQUFVLENBQUE7QUFDeEMsT0FBTyxLQUFLLEdBQUcsTUFBTSxhQUFhLENBQUE7QUFDbEMsT0FBTyxLQUFLLEdBQUcsTUFBTSxxQkFBcUIsQ0FBQTtBQUMxQyxPQUFPLEtBQUssTUFBTSxNQUFNLHdCQUF3QixDQUFBO0FBQ2hELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQTtBQUM5RCxPQUFPLEtBQUssSUFBSSxNQUFNLHNCQUFzQixDQUFBO0FBQzVDLE9BQU8sS0FBSyxFQUFFLE1BQU0sOEJBQThCLENBQUE7QUFDbEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLFlBQVksQ0FBQTtBQUd0QyxNQUFNLE9BQU8sR0FBRyxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtBQUM5QyxNQUFNLFVBQVUsR0FBRyxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtBQUNqRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFBO0FBaUQxQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFDSCxNQUFNLE9BQU8scUJBQXNCLFNBQVEsU0FBUztJQUNsRDs7T0FFRztJQUNhLFVBQVUsQ0FBUTtJQUVsQzs7T0FFRztJQUNhLElBQUksQ0FBUTtJQUU1Qjs7T0FFRztJQUNhLFFBQVEsQ0FBb0I7SUFF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QUNJLGVBQWUsQ0FBQyxTQUFpQjtRQUN0QyxPQUFPLEdBQUcsSUFBSSxDQUFDLFVBQVUsSUFBSSxTQUFTLEVBQUUsQ0FBQTtJQUMxQyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENESyBDb25zdHJ1Y3QgZm9yIENvZ25pdG8gUmVzb3VyY2UgU2VydmVyXG4gKi9cblxuaW1wb3J0IHsgY3JlYXRlUmVxdWlyZSB9IGZyb20gXCJub2RlOm1vZHVsZVwiXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJub2RlOnBhdGhcIlxuaW1wb3J0IHsgZmlsZVVSTFRvUGF0aCB9IGZyb20gXCJub2RlOnVybFwiXG5pbXBvcnQgKiBhcyBjZGsgZnJvbSBcImF3cy1jZGstbGliXCJcbmltcG9ydCAqIGFzIGlhbSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWlhbVwiXG5pbXBvcnQgKiBhcyBsYW1iZGEgZnJvbSBcImF3cy1jZGstbGliL2F3cy1sYW1iZGFcIlxuaW1wb3J0IHsgTm9kZWpzRnVuY3Rpb24gfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxhbWJkYS1ub2RlanNcIlxuaW1wb3J0ICogYXMgbG9ncyBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxvZ3NcIlxuaW1wb3J0ICogYXMgY3IgZnJvbSBcImF3cy1jZGstbGliL2N1c3RvbS1yZXNvdXJjZXNcIlxuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIlxuaW1wb3J0IHR5cGUgeyBWeUVudmlyb25tZW50IH0gZnJvbSBcIi4uL3NoYXJlZC90eXBlc1wiXG5cbmNvbnN0IHJlcXVpcmUgPSBjcmVhdGVSZXF1aXJlKGltcG9ydC5tZXRhLnVybClcbmNvbnN0IF9fZmlsZW5hbWUgPSBmaWxlVVJMVG9QYXRoKGltcG9ydC5tZXRhLnVybClcbmNvbnN0IF9fZGlybmFtZSA9IHBhdGguZGlybmFtZShfX2ZpbGVuYW1lKVxuXG5leHBvcnQgaW50ZXJmYWNlIFNjb3BlIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBzY29wZVxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nXG5cbiAgLyoqXG4gICAqIEEgZGVzY3JpcHRpb24gb2Ygd2hhdCB0aGlzIHNjb3BlIGlzIGZvclxuICAgKi9cbiAgcmVhZG9ubHkgZGVzY3JpcHRpb246IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvZ25pdG9SZXNvdXJjZVNlcnZlclByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBWeSBlbnZpcm9ubWVudCB0byBwcm92aXNpb24gaW4gKGUuZy4sIFZ5RW52aXJvbm1lbnQuUFJPRCwgVnlFbnZpcm9ubWVudC5TVEFHRSwgVnlFbnZpcm9ubWVudC5URVNUKVxuICAgKi9cbiAgcmVhZG9ubHkgZW52aXJvbm1lbnQ6IFZ5RW52aXJvbm1lbnRcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIHJlc291cmNlIHNlcnZlclxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nXG5cbiAgLyoqXG4gICAqIFRoZSBpZGVudGlmaWVyIGZvciB0aGlzIHJlc291cmNlIHNlcnZlciAodXN1YWxseSBhIFVSTClcbiAgICogQGV4YW1wbGUgJ2h0dHBzOi8vYXBpLnZ5ZGV2LmlvJ1xuICAgKi9cbiAgcmVhZG9ubHkgaWRlbnRpZmllcjogc3RyaW5nXG5cbiAgLyoqXG4gICAqIEN1c3RvbSBzY29wZXMgZm9yIHRoaXMgcmVzb3VyY2Ugc2VydmVyXG4gICAqIEBkZWZhdWx0IC0gTm8gc2NvcGVzXG4gICAqL1xuICByZWFkb25seSBzY29wZXM/OiBTY29wZVtdXG5cbiAgLyoqXG4gICAqIEJhc2UgZG9tYWluIGZvciBDb2duaXRvIHNlcnZpY2VcbiAgICogQGRlZmF1bHQgJ2NvZ25pdG8udnlkZXYuaW8nXG4gICAqL1xuICByZWFkb25seSBjb2duaXRvQmFzZURvbWFpbj86IHN0cmluZ1xuXG4gIC8qKlxuICAgKiBAZGVmYXVsdCBsb2dzLlJldGVudGlvbkRheXMuT05FX1dFRUtcbiAgICovXG4gIHJlYWRvbmx5IGxvZ3NSZXRlbnRpb24/OiBsb2dzLlJldGVudGlvbkRheXNcbn1cblxuLyoqXG4gKiBBIENvZ25pdG8gUmVzb3VyY2UgU2VydmVyIG1hbmFnZWQgdGhyb3VnaCBWeSdzIGNlbnRyYWwgQ29nbml0byBzZXJ2aWNlXG4gKlxuICogQSByZXNvdXJjZSBzZXJ2ZXIgaXMgYW4gaW50ZWdyYXRpb24gYmV0d2VlbiBhIHVzZXIgcG9vbCBhbmQgYW4gQVBJLlxuICogRWFjaCByZXNvdXJjZSBzZXJ2ZXIgaGFzIGN1c3RvbSBzY29wZXMgdGhhdCB5b3UgbXVzdCBhY3RpdmF0ZSBpbiB5b3VyIGFwcCBjbGllbnQuXG4gKiBXaGVuIHlvdSBjb25maWd1cmUgYSByZXNvdXJjZSBzZXJ2ZXIsIHlvdXIgYXBwIGNhbiBnZW5lcmF0ZSBhY2Nlc3MgdG9rZW5zIHdpdGhcbiAqIE9BdXRoIHNjb3BlcyB0aGF0IGF1dGhvcml6ZSByZWFkIGFuZCB3cml0ZSBvcGVyYXRpb25zIHRvIGFuIEFQSSBzZXJ2ZXIuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHJlc291cmNlU2VydmVyID0gbmV3IENvZ25pdG9SZXNvdXJjZVNlcnZlcih0aGlzLCAnQXBpUmVzb3VyY2VTZXJ2ZXInLCB7XG4gKiAgIGVudmlyb25tZW50OiBWeUVudmlyb25tZW50LlBST0QsXG4gKiAgIG5hbWU6ICdteS1hcGknLFxuICogICBpZGVudGlmaWVyOiAnaHR0cHM6Ly9teS1hcGkudnlkZXYuaW8nLFxuICogICBzY29wZXM6IFtcbiAqICAgICB7IG5hbWU6ICdyZWFkJywgZGVzY3JpcHRpb246ICdSZWFkIGFjY2VzcyB0byB0aGUgQVBJJyB9LFxuICogICAgIHsgbmFtZTogJ3dyaXRlJywgZGVzY3JpcHRpb246ICdXcml0ZSBhY2Nlc3MgdG8gdGhlIEFQSScgfVxuICogICBdXG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgQ29nbml0b1Jlc291cmNlU2VydmVyIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgLyoqXG4gICAqIFRoZSBpZGVudGlmaWVyIG9mIHRoZSByZXNvdXJjZSBzZXJ2ZXJcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBpZGVudGlmaWVyOiBzdHJpbmdcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIHJlc291cmNlIHNlcnZlclxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG5hbWU6IHN0cmluZ1xuXG4gIC8qKlxuICAgKiBUaGUgdW5kZXJseWluZyBjdXN0b20gcmVzb3VyY2VcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSByZXNvdXJjZTogY2RrLkN1c3RvbVJlc291cmNlXG5cbiAgLyoqXG4gICAqIFRoZSBsb2dHcm91cCBmb3IgdGhlIGV2ZW50IGhhbmRsZXIgbGFtYmRhXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbGFtYmRhTG9nR3JvdXA6IGxvZ3MuTG9nR3JvdXBcblxuICAvKipcbiAgICogVGhlIGxvZ0dyb3VwIGZvciB0aGUgY3VzdG9tIHJlc291cmNlIHByb3ZpZGVyXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcHJvdmlkZXJMb2dHcm91cDogbG9ncy5Mb2dHcm91cFxuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBDb2duaXRvUmVzb3VyY2VTZXJ2ZXJQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZClcblxuICAgIHRoaXMuaWRlbnRpZmllciA9IHByb3BzLmlkZW50aWZpZXJcbiAgICB0aGlzLm5hbWUgPSBwcm9wcy5uYW1lXG5cbiAgICB0aGlzLmxhbWJkYUxvZ0dyb3VwID0gbmV3IGxvZ3MuTG9nR3JvdXAodGhpcywgXCJMYW1iZGFMb2dHcm91cFwiLCB7XG4gICAgICByZXRlbnRpb246IHByb3BzLmxvZ3NSZXRlbnRpb24gPz8gbG9ncy5SZXRlbnRpb25EYXlzLk9ORV9XRUVLLFxuICAgIH0pXG5cbiAgICBjb25zdCBvbkV2ZW50SGFuZGxlciA9IG5ldyBOb2RlanNGdW5jdGlvbih0aGlzLCBcIk9uRXZlbnRIYW5kbGVyXCIsIHtcbiAgICAgIHJ1bnRpbWU6IGxhbWJkYS5SdW50aW1lLk5PREVKU18yMl9YLFxuICAgICAgaGFuZGxlcjogXCJoYW5kbGVyXCIsXG4gICAgICBlbnRyeTogcmVxdWlyZS5yZXNvbHZlKGAke19fZGlybmFtZX0vaGFuZGxlcmApLFxuICAgICAgdGltZW91dDogY2RrLkR1cmF0aW9uLm1pbnV0ZXMoMiksXG4gICAgICBtZW1vcnlTaXplOiAyNTYsXG4gICAgICBsb2dHcm91cDogdGhpcy5sYW1iZGFMb2dHcm91cCxcbiAgICAgIGVudmlyb25tZW50OiBwcm9wcy5jb2duaXRvQmFzZURvbWFpblxuICAgICAgICA/IHtcbiAgICAgICAgICAgIENPR05JVE9fQkFTRV9ET01BSU46IHByb3BzLmNvZ25pdG9CYXNlRG9tYWluLFxuICAgICAgICAgIH1cbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICBidW5kbGluZzoge1xuICAgICAgICBtaW5pZnk6IHRydWUsXG4gICAgICAgIHNvdXJjZU1hcDogdHJ1ZSxcbiAgICAgICAgdGFyZ2V0OiBcImVzMjAyMFwiLFxuICAgICAgICBleHRlcm5hbE1vZHVsZXM6IFtcImF3cy1zZGtcIl0sXG4gICAgICB9LFxuICAgIH0pXG5cbiAgICBvbkV2ZW50SGFuZGxlci5hZGRUb1JvbGVQb2xpY3koXG4gICAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgICAgYWN0aW9uczogW1wiZXhlY3V0ZS1hcGk6SW52b2tlXCJdLFxuICAgICAgICByZXNvdXJjZXM6IFtcIipcIl0sIC8vIENhbiBiZSBzY29wZWQgZG93biBpZiBBUEkgR2F0ZXdheSBBUk4gaXMga25vd25cbiAgICAgIH0pLFxuICAgIClcblxuICAgIHRoaXMucHJvdmlkZXJMb2dHcm91cCA9IG5ldyBsb2dzLkxvZ0dyb3VwKHRoaXMsIFwiUHJvdmlkZXJMb2dHcm91cFwiLCB7XG4gICAgICByZXRlbnRpb246IHByb3BzLmxvZ3NSZXRlbnRpb24gPz8gbG9ncy5SZXRlbnRpb25EYXlzLk9ORV9XRUVLLFxuICAgIH0pXG5cbiAgICBjb25zdCBwcm92aWRlciA9IG5ldyBjci5Qcm92aWRlcih0aGlzLCBcIlByb3ZpZGVyXCIsIHtcbiAgICAgIG9uRXZlbnRIYW5kbGVyLFxuICAgICAgbG9nR3JvdXA6IHRoaXMucHJvdmlkZXJMb2dHcm91cCxcbiAgICB9KVxuXG4gICAgdGhpcy5yZXNvdXJjZSA9IG5ldyBjZGsuQ3VzdG9tUmVzb3VyY2UodGhpcywgXCJSZXNvdXJjZVwiLCB7XG4gICAgICBzZXJ2aWNlVG9rZW46IHByb3ZpZGVyLnNlcnZpY2VUb2tlbixcbiAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgRW52aXJvbm1lbnQ6IHByb3BzLmVudmlyb25tZW50LFxuICAgICAgICBOYW1lOiBwcm9wcy5uYW1lLFxuICAgICAgICBJZGVudGlmaWVyOiBwcm9wcy5pZGVudGlmaWVyLFxuICAgICAgICBTY29wZXM6IHByb3BzLnNjb3Blcz8ubWFwKChzKSA9PiAoe1xuICAgICAgICAgIE5hbWU6IHMubmFtZSxcbiAgICAgICAgICBEZXNjcmlwdGlvbjogcy5kZXNjcmlwdGlvbixcbiAgICAgICAgfSkpLFxuICAgICAgfSxcbiAgICAgIHJlc291cmNlVHlwZTogXCJDdXN0b206OlZ5Q29nbml0b1Jlc291cmNlU2VydmVyXCIsXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSByZWZlcmVuY2UgdG8gYSBzY29wZSBpbiB0aGUgZm9ybWF0IGV4cGVjdGVkIGJ5IGFwcCBjbGllbnRzXG4gICAqIEBwYXJhbSBzY29wZU5hbWUgVGhlIG5hbWUgb2YgdGhlIHNjb3BlXG4gICAqIEByZXR1cm5zIFRoZSBmdWxsIHNjb3BlIGlkZW50aWZpZXIgKGUuZy4sICdodHRwczovL2FwaS52eWRldi5pby9yZWFkJylcbiAgICovXG4gIHB1YmxpYyBzY29wZUlkZW50aWZpZXIoc2NvcGVOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLmlkZW50aWZpZXJ9LyR7c2NvcGVOYW1lfWBcbiAgfVxufVxuIl19
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Lambda handler for CognitoResourceServer custom resource
3
+ */
4
+ import type { CustomResourceRequest, CustomResourceResponse } from "../shared/types";
5
+ export declare function handler(event: CustomResourceRequest): Promise<CustomResourceResponse>;
@@ -0,0 +1,104 @@
1
+ /**
2
+ * Lambda handler for CognitoResourceServer custom resource
3
+ */
4
+ import { createFailureResponse, createSuccessResponse, handleError, } from "../shared/custom-resource-handler";
5
+ import { createUrlFromEnvironment, signedRequest } from "../shared/sigv4-client";
6
+ const COGNITO_BASE_DOMAIN = process.env.COGNITO_BASE_DOMAIN || "cognito.vydev.io";
7
+ async function createResourceServer(baseUrl, server) {
8
+ const response = await signedRequest({
9
+ method: "POST",
10
+ hostname: baseUrl,
11
+ path: "/resource-servers",
12
+ body: JSON.stringify(server),
13
+ });
14
+ if (response.statusCode !== 201) {
15
+ throw new Error(`Could not create resource: ${response.statusCode} - ${response.body}`);
16
+ }
17
+ return JSON.parse(response.body);
18
+ }
19
+ async function readResourceServer(baseUrl, identifier) {
20
+ const encodedIdentifier = encodeURIComponent(identifier);
21
+ const response = await signedRequest({
22
+ method: "GET",
23
+ hostname: baseUrl,
24
+ path: `/resource-servers/${encodedIdentifier}`,
25
+ });
26
+ if (response.statusCode !== 200) {
27
+ throw new Error(`Could not read resource: ${response.statusCode} - ${response.body}`);
28
+ }
29
+ return JSON.parse(response.body);
30
+ }
31
+ async function updateResourceServer(baseUrl, update) {
32
+ const encodedIdentifier = encodeURIComponent(update.identifier);
33
+ const response = await signedRequest({
34
+ method: "PUT",
35
+ hostname: baseUrl,
36
+ path: `/resource-servers/${encodedIdentifier}`,
37
+ body: JSON.stringify(update),
38
+ });
39
+ if (response.statusCode !== 200) {
40
+ throw new Error(`Could not update resource: ${response.statusCode} - ${response.body}`);
41
+ }
42
+ }
43
+ async function deleteResourceServer(baseUrl, identifier) {
44
+ const encodedIdentifier = encodeURIComponent(identifier);
45
+ const response = await signedRequest({
46
+ method: "DELETE",
47
+ hostname: baseUrl,
48
+ path: `/resource-servers/${encodedIdentifier}`,
49
+ });
50
+ if (response.statusCode !== 200) {
51
+ throw new Error(`Could not delete resource: ${response.statusCode} - ${response.body}`);
52
+ }
53
+ }
54
+ export async function handler(event) {
55
+ const props = event.ResourceProperties;
56
+ const baseUrl = createUrlFromEnvironment(COGNITO_BASE_DOMAIN, "delegated", props.Environment);
57
+ try {
58
+ switch (event.RequestType) {
59
+ case "Create": {
60
+ const server = {
61
+ identifier: props.Identifier,
62
+ name: props.Name,
63
+ scopes: props.Scopes?.map((s) => ({
64
+ name: s.Name,
65
+ description: s.Description,
66
+ })),
67
+ };
68
+ const created = await createResourceServer(baseUrl, server);
69
+ return createSuccessResponse(event.PhysicalResourceId ?? created.identifier, {
70
+ Identifier: created.identifier,
71
+ Name: created.name,
72
+ Scopes: created.scopes,
73
+ });
74
+ }
75
+ case "Update": {
76
+ const update = {
77
+ identifier: props.Identifier,
78
+ name: props.Name,
79
+ scopes: props.Scopes?.map((s) => ({
80
+ name: s.Name,
81
+ description: s.Description,
82
+ })),
83
+ };
84
+ await updateResourceServer(baseUrl, update);
85
+ const updated = await readResourceServer(baseUrl, props.Identifier);
86
+ return createSuccessResponse(event.PhysicalResourceId ?? updated.identifier, {
87
+ Identifier: updated.identifier,
88
+ Name: updated.name,
89
+ Scopes: updated.scopes,
90
+ });
91
+ }
92
+ case "Delete": {
93
+ const identifier = event.PhysicalResourceId || props.Identifier;
94
+ await deleteResourceServer(baseUrl, identifier);
95
+ return createSuccessResponse(identifier, {});
96
+ }
97
+ }
98
+ }
99
+ catch (error) {
100
+ console.error("Error:", error);
101
+ return createFailureResponse(event.PhysicalResourceId || props.Identifier || "unknown", handleError(error));
102
+ }
103
+ }
104
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFuZGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb2duaXRvLXJlc291cmNlLXNlcnZlci9oYW5kbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsT0FBTyxFQUNMLHFCQUFxQixFQUNyQixxQkFBcUIsRUFDckIsV0FBVyxHQUNaLE1BQU0sbUNBQW1DLENBQUE7QUFDMUMsT0FBTyxFQUFFLHdCQUF3QixFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFBO0FBUWhGLE1BQU0sbUJBQW1CLEdBQ3ZCLE9BQU8sQ0FBQyxHQUFHLENBQUMsbUJBQW1CLElBQUksa0JBQWtCLENBQUE7QUFTdkQsS0FBSyxVQUFVLG9CQUFvQixDQUNqQyxPQUFlLEVBQ2YsTUFBc0I7SUFFdEIsTUFBTSxRQUFRLEdBQUcsTUFBTSxhQUFhLENBQUM7UUFDbkMsTUFBTSxFQUFFLE1BQU07UUFDZCxRQUFRLEVBQUUsT0FBTztRQUNqQixJQUFJLEVBQUUsbUJBQW1CO1FBQ3pCLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQztLQUM3QixDQUFDLENBQUE7SUFFRixJQUFJLFFBQVEsQ0FBQyxVQUFVLEtBQUssR0FBRyxFQUFFLENBQUM7UUFDaEMsTUFBTSxJQUFJLEtBQUssQ0FDYiw4QkFBOEIsUUFBUSxDQUFDLFVBQVUsTUFBTSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQ3ZFLENBQUE7SUFDSCxDQUFDO0lBRUQsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQTtBQUNsQyxDQUFDO0FBRUQsS0FBSyxVQUFVLGtCQUFrQixDQUMvQixPQUFlLEVBQ2YsVUFBa0I7SUFFbEIsTUFBTSxpQkFBaUIsR0FBRyxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsQ0FBQTtJQUN4RCxNQUFNLFFBQVEsR0FBRyxNQUFNLGFBQWEsQ0FBQztRQUNuQyxNQUFNLEVBQUUsS0FBSztRQUNi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UUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFBO1FBQzlCLE9BQU8scUJBQXFCLENBQzFCLEtBQUssQ0FBQyxrQkFBa0IsSUFBSSxLQUFLLENBQUMsVUFBVSxJQUFJLFNBQVMsRUFDekQsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUNPLENBQUE7SUFDN0IsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIExhbWJkYSBoYW5kbGVyIGZvciBDb2duaXRvUmVzb3VyY2VTZXJ2ZXIgY3VzdG9tIHJlc291cmNlXG4gKi9cblxuaW1wb3J0IHtcbiAgY3JlYXRlRmFpbHVyZVJlc3BvbnNlLFxuICBjcmVhdGVTdWNjZXNzUmVzcG9uc2UsXG4gIGhhbmRsZUVycm9yLFxufSBmcm9tIFwiLi4vc2hhcmVkL2N1c3RvbS1yZXNvdXJjZS1oYW5kbGVyXCJcbmltcG9ydCB7IGNyZWF0ZVVybEZyb21FbnZpcm9ubWVudCwgc2lnbmVkUmVxdWVzdCB9IGZyb20gXCIuLi9zaGFyZWQvc2lndjQtY2xpZW50XCJcbmltcG9ydCB0eXBlIHtcbiAgQ3VzdG9tUmVzb3VyY2VSZXF1ZXN0LFxuICBDdXN0b21SZXNvdXJjZVJlc3BvbnNlLFxuICBSZXNvdXJjZVNlcnZlcixcbiAgUmVzb3VyY2VTZXJ2ZXJVcGRhdGVSZXF1ZXN0LFxufSBmcm9tIFwiLi4vc2hhcmVkL3R5cGVzXCJcblxuY29uc3QgQ09HTklUT19CQVNFX0RPTUFJTiA9XG4gIHByb2Nlc3MuZW52LkNPR05JVE9fQkFTRV9ET01BSU4gfHwgXCJjb2duaXRvLnZ5ZGV2LmlvXCJcblxuaW50ZXJmYWNlIFJlc291cmNlU2VydmVyUHJvcGVydGllcyB7XG4gIEVudmlyb25tZW50OiBzdHJpbmdcbiAgTmFtZTogc3RyaW5nXG4gIElkZW50aWZpZXI6IHN0cmluZ1xuICBTY29wZXM/OiBBcnJheTx7IE5hbWU6IHN0cmluZzsgRGVzY3JpcHRpb246IHN0cmluZyB9PlxufVxuXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVSZXNvdXJjZVNlcnZlcihcbiAgYmFzZVVybDogc3RyaW5nLFxuICBzZXJ2ZXI6IFJlc291cmNlU2VydmVyLFxuKTogUHJvbWlzZTxSZXNvdXJjZVNlcnZlcj4ge1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHNpZ25lZFJlcXVlc3Qoe1xuICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgaG9zdG5hbWU6IGJhc2VVcmwsXG4gICAgcGF0aDogXCIvcmVzb3VyY2Utc2VydmVyc1wiLFxuICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHNlcnZlciksXG4gIH0pXG5cbiAgaWYgKHJlc3BvbnNlLnN0YXR1c0NvZGUgIT09IDIwMSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBDb3VsZCBub3QgY3JlYXRlIHJlc291cmNlOiAke3Jlc3BvbnNlLnN0YXR1c0NvZGV9IC0gJHtyZXNwb25zZS5ib2R5fWAsXG4gICAgKVxuICB9XG5cbiAgcmV0dXJuIEpTT04ucGFyc2UocmVzcG9uc2UuYm9keSlcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZFJlc291cmNlU2VydmVyKFxuICBiYXNlVXJsOiBzdHJpbmcsXG4gIGlkZW50aWZpZXI6IHN0cmluZyxcbik6IFByb21pc2U8UmVzb3VyY2VTZXJ2ZXI+IHtcbiAgY29uc3QgZW5jb2RlZElkZW50aWZpZXIgPSBlbmNvZGVVUklDb21wb25lbnQoaWRlbnRpZmllcilcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBzaWduZWRSZXF1ZXN0KHtcbiAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgaG9zdG5hbWU6IGJhc2VVcmwsXG4gICAgcGF0aDogYC9yZXNvdXJjZS1zZXJ2ZXJzLyR7ZW5jb2RlZElkZW50aWZpZXJ9YCxcbiAgfSlcblxuICBpZiAocmVzcG9uc2Uuc3RhdHVzQ29kZSAhPT0gMjAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYENvdWxkIG5vdCByZWFkIHJlc291cmNlOiAke3Jlc3BvbnNlLnN0YXR1c0NvZGV9IC0gJHtyZXNwb25zZS5ib2R5fWAsXG4gICAgKVxuICB9XG5cbiAgcmV0dXJuIEpTT04ucGFyc2UocmVzcG9uc2UuYm9keSlcbn1cblxuYXN5bmMgZnVuY3Rpb24gdXBkYXRlUmVzb3VyY2VTZXJ2ZXIoXG4gIGJhc2VVcmw6IHN0cmluZyxcbiAgdXBkYXRlOiBSZXNvdXJjZVNlcnZlclVwZGF0ZVJlcXVlc3QsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZW5jb2RlZElkZW50aWZpZXIgPSBlbmNvZGVVUklDb21wb25lbnQodXBkYXRlLmlkZW50aWZpZXIpXG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgc2lnbmVkUmVxdWVzdCh7XG4gICAgbWV0aG9kOiBcIlBVVFwiLFxuICAgIGhvc3RuYW1lOiBiYXNlVXJsLFxuICAgIHBhdGg6IGAvcmVzb3VyY2Utc2VydmVycy8ke2VuY29kZWRJZGVudGlmaWVyfWAsXG4gICAgYm9keTogSlNPTi5zdHJpbmdpZnkodXBkYXRlKSxcbiAgfSlcblxuICBpZiAocmVzcG9uc2Uuc3RhdHVzQ29kZSAhPT0gMjAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYENvdWxkIG5vdCB1cGRhdGUgcmVzb3VyY2U6ICR7cmVzcG9uc2Uuc3RhdHVzQ29kZX0gLSAke3Jlc3BvbnNlLmJvZHl9YCxcbiAgICApXG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZGVsZXRlUmVzb3VyY2VTZXJ2ZXIoXG4gIGJhc2VVcmw6IHN0cmluZyxcbiAgaWRlbnRpZmllcjogc3RyaW5nLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGVuY29kZWRJZGVudGlmaWVyID0gZW5jb2RlVVJJQ29tcG9uZW50KGlkZW50aWZpZXIpXG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgc2lnbmVkUmVxdWVzdCh7XG4gICAgbWV0aG9kOiBcIkRFTEVURVwiLFxuICAgIGhvc3RuYW1lOiBiYXNlVXJsLFxuICAgIHBhdGg6IGAvcmVzb3VyY2Utc2VydmVycy8ke2VuY29kZWRJZGVudGlmaWVyfWAsXG4gIH0pXG5cbiAgaWYgKHJlc3BvbnNlLnN0YXR1c0NvZGUgIT09IDIwMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBDb3VsZCBub3QgZGVsZXRlIHJlc291cmNlOiAke3Jlc3BvbnNlLnN0YXR1c0NvZGV9IC0gJHtyZXNwb25zZS5ib2R5fWAsXG4gICAgKVxuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBoYW5kbGVyKFxuICBldmVudDogQ3VzdG9tUmVzb3VyY2VSZXF1ZXN0LFxuKTogUHJvbWlzZTxDdXN0b21SZXNvdXJjZVJlc3BvbnNlPiB7XG4gIGNvbnN0IHByb3BzID0gZXZlbnQuUmVzb3VyY2VQcm9wZXJ0aWVzIGFzIFJlc291cmNlU2VydmVyUHJvcGVydGllc1xuICBjb25zdCBiYXNlVXJsID0gY3JlYXRlVXJsRnJvbUVudmlyb25tZW50KFxuICAgIENPR05JVE9fQkFTRV9ET01BSU4sXG4gICAgXCJkZWxlZ2F0ZWRcIixcbiAgICBwcm9wcy5FbnZpcm9ubWVudCxcbiAgKVxuXG4gIHRyeSB7XG4gICAgc3dpdGNoIChldmVudC5SZXF1ZXN0VHlwZSkge1xuICAgICAgY2FzZSBcIkNyZWF0ZVwiOiB7XG4gICAgICAgIGNvbnN0IHNlcnZlcjogUmVzb3VyY2VTZXJ2ZXIgPSB7XG4gICAgICAgICAgaWRlbnRpZmllcjogcHJvcHMuSWRlbnRpZmllcixcbiAgICAgICAgICBuYW1lOiBwcm9wcy5OYW1lLFxuICAgICAgICAgIHNjb3BlczogcHJvcHMuU2NvcGVzPy5tYXAoKHMpID0+ICh7XG4gICAgICAgICAgICBuYW1lOiBzLk5hbWUsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogcy5EZXNjcmlwdGlvbixcbiAgICAgICAgICB9KSksXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjcmVhdGVkID0gYXdhaXQgY3JlYXRlUmVzb3VyY2VTZXJ2ZXIoYmFzZVVybCwgc2VydmVyKVxuXG4gICAgICAgIHJldHVybiBjcmVhdGVTdWNjZXNzUmVzcG9uc2UoXG4gICAgICAgICAgZXZlbnQuUGh5c2ljYWxSZXNvdXJjZUlkID8/IGNyZWF0ZWQuaWRlbnRpZmllcixcbiAgICAgICAgICB7XG4gICAgICAgICAgICBJZGVudGlmaWVyOiBjcmVhdGVkLmlkZW50aWZpZXIsXG4gICAgICAgICAgICBOYW1lOiBjcmVhdGVkLm5hbWUsXG4gICAgICAgICAgICBTY29wZXM6IGNyZWF0ZWQuc2NvcGVzLFxuICAgICAgICAgIH0sXG4gICAgICAgICkgYXMgQ3VzdG9tUmVzb3VyY2VSZXNwb25zZVxuICAgICAgfVxuXG4gICAgICBjYXNlIFwiVXBkYXRlXCI6IHtcbiAgICAgICAgY29uc3QgdXBkYXRlOiBSZXNvdXJjZVNlcnZlclVwZGF0ZVJlcXVlc3QgPSB7XG4gICAgICAgICAgaWRlbnRpZmllcjogcHJvcHMuSWRlbnRpZmllcixcbiAgICAgICAgICBuYW1lOiBwcm9wcy5OYW1lLFxuICAgICAgICAgIHNjb3BlczogcHJvcHMuU2NvcGVzPy5tYXAoKHMpID0+ICh7XG4gICAgICAgICAgICBuYW1lOiBzLk5hbWUsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogcy5EZXNjcmlwdGlvbixcbiAgICAgICAgICB9KSksXG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCB1cGRhdGVSZXNvdXJjZVNlcnZlcihiYXNlVXJsLCB1cGRhdGUpXG4gICAgICAgIGNvbnN0IHVwZGF0ZWQgPSBhd2FpdCByZWFkUmVzb3VyY2VTZXJ2ZXIoYmFzZVVybCwgcHJvcHMuSWRlbnRpZmllcilcblxuICAgICAgICByZXR1cm4gY3JlYXRlU3VjY2Vzc1Jlc3BvbnNlKFxuICAgICAgICAgIGV2ZW50LlBoeXNpY2FsUmVzb3VyY2VJZCA/PyB1cGRhdGVkLmlkZW50aWZpZXIsXG4gICAgICAgICAge1xuICAgICAgICAgICAgSWRlbnRpZmllcjogdXBkYXRlZC5pZGVudGlmaWVyLFxuICAgICAgICAgICAgTmFtZTogdXBkYXRlZC5uYW1lLFxuICAgICAgICAgICAgU2NvcGVzOiB1cGRhdGVkLnNjb3BlcyxcbiAgICAgICAgICB9LFxuICAgICAgICApIGFzIEN1c3RvbVJlc291cmNlUmVzcG9uc2VcbiAgICAgIH1cblxuICAgICAgY2FzZSBcIkRlbGV0ZVwiOiB7XG4gICAgICAgIGNvbnN0IGlkZW50aWZpZXIgPSBldmVudC5QaHlzaWNhbFJlc291cmNlSWQgfHwgcHJvcHMuSWRlbnRpZmllclxuICAgICAgICBhd2FpdCBkZWxldGVSZXNvdXJjZVNlcnZlcihiYXNlVXJsLCBpZGVudGlmaWVyKVxuXG4gICAgICAgIHJldHVybiBjcmVhdGVTdWNjZXNzUmVzcG9uc2UoaWRlbnRpZmllciwge30pIGFzIEN1c3RvbVJlc291cmNlUmVzcG9uc2VcbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihcIkVycm9yOlwiLCBlcnJvcilcbiAgICByZXR1cm4gY3JlYXRlRmFpbHVyZVJlc3BvbnNlKFxuICAgICAgZXZlbnQuUGh5c2ljYWxSZXNvdXJjZUlkIHx8IHByb3BzLklkZW50aWZpZXIgfHwgXCJ1bmtub3duXCIsXG4gICAgICBoYW5kbGVFcnJvcihlcnJvciksXG4gICAgKSBhcyBDdXN0b21SZXNvdXJjZVJlc3BvbnNlXG4gIH1cbn1cbiJdfQ==
package/lib/index.d.ts ADDED
@@ -0,0 +1,9 @@
1
+ /**
2
+ * @vy/cdk-resources
3
+ * CDK constructs for Vy internal services
4
+ *
5
+ * This library provides CDK equivalents to the Terraform provider `terraform-provider-vy`.
6
+ */
7
+ export * from "./cognito-app-client/cognito-app-client";
8
+ export * from "./cognito-info";
9
+ export * from "./cognito-resource-server/cognito-resource-server";
package/lib/index.js ADDED
@@ -0,0 +1,12 @@
1
+ /**
2
+ * @vy/cdk-resources
3
+ * CDK constructs for Vy internal services
4
+ *
5
+ * This library provides CDK equivalents to the Terraform provider `terraform-provider-vy`.
6
+ */
7
+ // Resources
8
+ export * from "./cognito-app-client/cognito-app-client";
9
+ // Data Sources
10
+ export * from "./cognito-info";
11
+ export * from "./cognito-resource-server/cognito-resource-server";
12
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7O0dBS0c7QUFFSCxZQUFZO0FBQ1osY0FBYyx5Q0FBeUMsQ0FBQTtBQUN2RCxlQUFlO0FBQ2YsY0FBYyxnQkFBZ0IsQ0FBQTtBQUM5QixjQUFjLG1EQUFtRCxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAdnkvY2RrLXJlc291cmNlc1xuICogQ0RLIGNvbnN0cnVjdHMgZm9yIFZ5IGludGVybmFsIHNlcnZpY2VzXG4gKlxuICogVGhpcyBsaWJyYXJ5IHByb3ZpZGVzIENESyBlcXVpdmFsZW50cyB0byB0aGUgVGVycmFmb3JtIHByb3ZpZGVyIGB0ZXJyYWZvcm0tcHJvdmlkZXItdnlgLlxuICovXG5cbi8vIFJlc291cmNlc1xuZXhwb3J0ICogZnJvbSBcIi4vY29nbml0by1hcHAtY2xpZW50L2NvZ25pdG8tYXBwLWNsaWVudFwiXG4vLyBEYXRhIFNvdXJjZXNcbmV4cG9ydCAqIGZyb20gXCIuL2NvZ25pdG8taW5mb1wiXG5leHBvcnQgKiBmcm9tIFwiLi9jb2duaXRvLXJlc291cmNlLXNlcnZlci9jb2duaXRvLXJlc291cmNlLXNlcnZlclwiXG4iXX0=
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Base handler for Custom Resources
3
+ * Handles the CloudFormation response protocol
4
+ */
5
+ import type { CustomResourceResponse } from "./types";
6
+ export declare function createSuccessResponse(physicalResourceId: string, data?: Record<string, any>): Pick<CustomResourceResponse, "Status" | "PhysicalResourceId" | "Data">;
7
+ export declare function createFailureResponse(physicalResourceId: string, reason: string): Pick<CustomResourceResponse, "Status" | "PhysicalResourceId" | "Reason">;
8
+ /**
9
+ * Base error handler for custom resource operations
10
+ */
11
+ export declare function handleError(error: unknown): string;
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Base handler for Custom Resources
3
+ * Handles the CloudFormation response protocol
4
+ */
5
+ export function createSuccessResponse(physicalResourceId, data) {
6
+ return {
7
+ Status: "SUCCESS",
8
+ PhysicalResourceId: physicalResourceId,
9
+ Data: data,
10
+ };
11
+ }
12
+ export function createFailureResponse(physicalResourceId, reason) {
13
+ return {
14
+ Status: "FAILED",
15
+ PhysicalResourceId: physicalResourceId,
16
+ Reason: reason,
17
+ };
18
+ }
19
+ /**
20
+ * Base error handler for custom resource operations
21
+ */
22
+ export function handleError(error) {
23
+ if (error instanceof Error) {
24
+ return error.message;
25
+ }
26
+ return String(error);
27
+ }
28
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tLXJlc291cmNlLWhhbmRsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2hhcmVkL2N1c3RvbS1yZXNvdXJjZS1oYW5kbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUlILE1BQU0sVUFBVSxxQkFBcUIsQ0FDbkMsa0JBQTBCLEVBQzFCLElBQTBCO0lBRTFCLE9BQU87UUFDTCxNQUFNLEVBQUUsU0FBUztRQUNqQixrQkFBa0IsRUFBRSxrQkFBa0I7UUFDdEMsSUFBSSxFQUFFLElBQUk7S0FDWCxDQUFBO0FBQ0gsQ0FBQztBQUVELE1BQU0sVUFBVSxxQkFBcUIsQ0FDbkMsa0JBQTBCLEVBQzFCLE1BQWM7SUFFZCxPQUFPO1FBQ0wsTUFBTSxFQUFFLFFBQVE7UUFDaEIsa0JBQWtCLEVBQUUsa0JBQWtCO1FBQ3RDLE1BQU0sRUFBRSxNQUFNO0tBQ2YsQ0FBQTtBQUNILENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sVUFBVSxXQUFXLENBQUMsS0FBYztJQUN4QyxJQUFJLEtBQUssWUFBWSxLQUFLLEVBQUUsQ0FBQztRQUMzQixPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUE7SUFDdEIsQ0FBQztJQUNELE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFBO0FBQ3RCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEJhc2UgaGFuZGxlciBmb3IgQ3VzdG9tIFJlc291cmNlc1xuICogSGFuZGxlcyB0aGUgQ2xvdWRGb3JtYXRpb24gcmVzcG9uc2UgcHJvdG9jb2xcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEN1c3RvbVJlc291cmNlUmVzcG9uc2UgfSBmcm9tIFwiLi90eXBlc1wiXG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTdWNjZXNzUmVzcG9uc2UoXG4gIHBoeXNpY2FsUmVzb3VyY2VJZDogc3RyaW5nLFxuICBkYXRhPzogUmVjb3JkPHN0cmluZywgYW55Pixcbik6IFBpY2s8Q3VzdG9tUmVzb3VyY2VSZXNwb25zZSwgXCJTdGF0dXNcIiB8IFwiUGh5c2ljYWxSZXNvdXJjZUlkXCIgfCBcIkRhdGFcIj4ge1xuICByZXR1cm4ge1xuICAgIFN0YXR1czogXCJTVUNDRVNTXCIsXG4gICAgUGh5c2ljYWxSZXNvdXJjZUlkOiBwaHlzaWNhbFJlc291cmNlSWQsXG4gICAgRGF0YTogZGF0YSxcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRmFpbHVyZVJlc3BvbnNlKFxuICBwaHlzaWNhbFJlc291cmNlSWQ6IHN0cmluZyxcbiAgcmVhc29uOiBzdHJpbmcsXG4pOiBQaWNrPEN1c3RvbVJlc291cmNlUmVzcG9uc2UsIFwiU3RhdHVzXCIgfCBcIlBoeXNpY2FsUmVzb3VyY2VJZFwiIHwgXCJSZWFzb25cIj4ge1xuICByZXR1cm4ge1xuICAgIFN0YXR1czogXCJGQUlMRURcIixcbiAgICBQaHlzaWNhbFJlc291cmNlSWQ6IHBoeXNpY2FsUmVzb3VyY2VJZCxcbiAgICBSZWFzb246IHJlYXNvbixcbiAgfVxufVxuXG4vKipcbiAqIEJhc2UgZXJyb3IgaGFuZGxlciBmb3IgY3VzdG9tIHJlc291cmNlIG9wZXJhdGlvbnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhbmRsZUVycm9yKGVycm9yOiB1bmtub3duKTogc3RyaW5nIHtcbiAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICByZXR1cm4gZXJyb3IubWVzc2FnZVxuICB9XG4gIHJldHVybiBTdHJpbmcoZXJyb3IpXG59XG4iXX0=
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Shared utility for making AWS SigV4 signed HTTP requests
3
+ */
4
+ export interface SignedRequestOptions {
5
+ method: string;
6
+ hostname: string;
7
+ path: string;
8
+ body?: string;
9
+ headers?: Record<string, string>;
10
+ region?: string;
11
+ }
12
+ export interface SignedResponse {
13
+ statusCode: number;
14
+ body: string;
15
+ headers: Record<string, string>;
16
+ }
17
+ export declare function signedRequest(options: SignedRequestOptions): Promise<SignedResponse>;
18
+ /**
19
+ * Helper to create base URL from environment
20
+ */
21
+ export declare function createUrlFromEnvironment(baseUrl: string, urlPrefix: string, environment: string): string;
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Shared utility for making AWS SigV4 signed HTTP requests
3
+ */
4
+ import { Sha256 } from "@aws-crypto/sha256-js";
5
+ import { defaultProvider } from "@aws-sdk/credential-provider-node";
6
+ import { HttpRequest } from "@smithy/protocol-http";
7
+ import { SignatureV4 } from "@smithy/signature-v4";
8
+ export async function signedRequest(options) {
9
+ const { method, hostname, path, body, headers = {}, region } = options;
10
+ const request = new HttpRequest({
11
+ method,
12
+ protocol: "https:",
13
+ hostname,
14
+ path,
15
+ headers: {
16
+ "Content-Type": "application/json",
17
+ Host: hostname,
18
+ ...headers,
19
+ },
20
+ body,
21
+ });
22
+ const credentialsProvider = defaultProvider();
23
+ const credentials = await credentialsProvider();
24
+ const signer = new SignatureV4({
25
+ credentials,
26
+ region: region ?? "eu-west-1",
27
+ service: "execute-api",
28
+ sha256: Sha256,
29
+ });
30
+ const signedRequest = await signer.sign(request);
31
+ const url = `https://${signedRequest.hostname}${signedRequest.path}`;
32
+ const response = await fetch(url, {
33
+ method: signedRequest.method,
34
+ headers: signedRequest.headers,
35
+ body: signedRequest.body,
36
+ });
37
+ const responseBody = await response.text();
38
+ return {
39
+ statusCode: response.status,
40
+ body: responseBody,
41
+ headers: Object.fromEntries(response.headers.entries()),
42
+ };
43
+ }
44
+ /**
45
+ * Helper to create base URL from environment
46
+ */
47
+ export function createUrlFromEnvironment(baseUrl, urlPrefix, environment) {
48
+ if (environment === "prod") {
49
+ return `${urlPrefix}.${baseUrl}`;
50
+ }
51
+ return `${urlPrefix}.${environment}.${baseUrl}`;
52
+ }
53
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lndjQtY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NoYXJlZC9zaWd2NC1jbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sdUJBQXVCLENBQUE7QUFDOUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG1DQUFtQyxDQUFBO0FBQ25FLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQTtBQUNuRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sc0JBQXNCLENBQUE7QUFpQmxELE1BQU0sQ0FBQyxLQUFLLFVBQVUsYUFBYSxDQUNqQyxPQUE2QjtJQUU3QixNQUFNLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE9BQU8sR0FBRyxFQUFFLEVBQUUsTUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFBO0lBRXRFLE1BQU0sT0FBTyxHQUFHLElBQUksV0FBVyxDQUFDO1FBQzlCLE1BQU07UUFDTixRQUFRLEVBQUUsUUFBUTtRQUNsQixRQUFRO1FBQ1IsSUFBSTtRQUNKLE9BQU8sRUFBRTtZQUNQLGNBQWMsRUFBRSxrQkFBa0I7WUFDbEMsSUFBSSxFQUFFLFFBQVE7WUFDZCxHQUFHLE9BQU87U0FDWDtRQUNELElBQUk7S0FDTCxDQUFDLENBQUE7SUFFRixNQUFNLG1CQUFtQixHQUFHLGVBQWUsRUFBRSxDQUFBO0lBQzdDLE1BQU0sV0FBVyxHQUFHLE1BQU0sbUJBQW1CLEVBQUUsQ0FBQTtJQUUvQyxNQUFNLE1BQU0sR0FBRyxJQUFJLFdBQVcsQ0FBQztRQUM3QixXQUFXO1FBQ1gsTUFBTSxFQUFFLE1BQU0sSUFBSSxXQUFXO1FBQzdCLE9BQU8sRUFBRSxhQUFhO1FBQ3RCLE1BQU0sRUFBRSxNQUFNO0tBQ2YsQ0FBQyxDQUFBO0lBRUYsTUFBTSxhQUFhLEdBQUcsTUFBTSxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBRWhELE1BQU0sR0FBRyxHQUFHLFdBQVcsYUFBYSxDQUFDLFFBQVEsR0FBRyxhQUFhLENBQUMsSUFBSSxFQUFFLENBQUE7SUFDcEUsTUFBTSxRQUFRLEdBQUcsTUFBTSxLQUFLLENBQUMsR0FBRyxFQUFFO1FBQ2hDLE1BQU0sRUFBRSxhQUFhLENBQUMsTUFBTTtRQUM1QixPQUFPLEVBQUUsYUFBYSxDQUFDLE9BQWlDO1FBQ3hELElBQUksRUFBRSxhQUFhLENBQUMsSUFBSTtLQUN6QixDQUFDLENBQUE7SUFFRixNQUFNLFlBQVksR0FBRyxNQUFNLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQTtJQUUxQyxPQUFPO1FBQ0wsVUFBVSxFQUFFLFFBQVEsQ0FBQyxNQUFNO1FBQzNCLElBQUksRUFBRSxZQUFZO1FBQ2xCLE9BQU8sRUFBRSxNQUFNLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7S0FDeEQsQ0FBQTtBQUNILENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sVUFBVSx3QkFBd0IsQ0FDdEMsT0FBZSxFQUNmLFNBQWlCLEVBQ2pCLFdBQW1CO0lBRW5CLElBQUksV0FBVyxLQUFLLE1BQU0sRUFBRSxDQUFDO1FBQzNCLE9BQU8sR0FBRyxTQUFTLElBQUksT0FBTyxFQUFFLENBQUE7SUFDbEMsQ0FBQztJQUNELE9BQU8sR0FBRyxTQUFTLElBQUksV0FBVyxJQUFJLE9BQU8sRUFBRSxDQUFBO0FBQ2pELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFNoYXJlZCB1dGlsaXR5IGZvciBtYWtpbmcgQVdTIFNpZ1Y0IHNpZ25lZCBIVFRQIHJlcXVlc3RzXG4gKi9cblxuaW1wb3J0IHsgU2hhMjU2IH0gZnJvbSBcIkBhd3MtY3J5cHRvL3NoYTI1Ni1qc1wiXG5pbXBvcnQgeyBkZWZhdWx0UHJvdmlkZXIgfSBmcm9tIFwiQGF3cy1zZGsvY3JlZGVudGlhbC1wcm92aWRlci1ub2RlXCJcbmltcG9ydCB7IEh0dHBSZXF1ZXN0IH0gZnJvbSBcIkBzbWl0aHkvcHJvdG9jb2wtaHR0cFwiXG5pbXBvcnQgeyBTaWduYXR1cmVWNCB9IGZyb20gXCJAc21pdGh5L3NpZ25hdHVyZS12NFwiXG5cbmV4cG9ydCBpbnRlcmZhY2UgU2lnbmVkUmVxdWVzdE9wdGlvbnMge1xuICBtZXRob2Q6IHN0cmluZ1xuICBob3N0bmFtZTogc3RyaW5nXG4gIHBhdGg6IHN0cmluZ1xuICBib2R5Pzogc3RyaW5nXG4gIGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4gIHJlZ2lvbj86IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25lZFJlc3BvbnNlIHtcbiAgc3RhdHVzQ29kZTogbnVtYmVyXG4gIGJvZHk6IHN0cmluZ1xuICBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzaWduZWRSZXF1ZXN0KFxuICBvcHRpb25zOiBTaWduZWRSZXF1ZXN0T3B0aW9ucyxcbik6IFByb21pc2U8U2lnbmVkUmVzcG9uc2U+IHtcbiAgY29uc3QgeyBtZXRob2QsIGhvc3RuYW1lLCBwYXRoLCBib2R5LCBoZWFkZXJzID0ge30sIHJlZ2lvbiB9ID0gb3B0aW9uc1xuXG4gIGNvbnN0IHJlcXVlc3QgPSBuZXcgSHR0cFJlcXVlc3Qoe1xuICAgIG1ldGhvZCxcbiAgICBwcm90b2NvbDogXCJodHRwczpcIixcbiAgICBob3N0bmFtZSxcbiAgICBwYXRoLFxuICAgIGhlYWRlcnM6IHtcbiAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgSG9zdDogaG9zdG5hbWUsXG4gICAgICAuLi5oZWFkZXJzLFxuICAgIH0sXG4gICAgYm9keSxcbiAgfSlcblxuICBjb25zdCBjcmVkZW50aWFsc1Byb3ZpZGVyID0gZGVmYXVsdFByb3ZpZGVyKClcbiAgY29uc3QgY3JlZGVudGlhbHMgPSBhd2FpdCBjcmVkZW50aWFsc1Byb3ZpZGVyKClcblxuICBjb25zdCBzaWduZXIgPSBuZXcgU2lnbmF0dXJlVjQoe1xuICAgIGNyZWRlbnRpYWxzLFxuICAgIHJlZ2lvbjogcmVnaW9uID8/IFwiZXUtd2VzdC0xXCIsXG4gICAgc2VydmljZTogXCJleGVjdXRlLWFwaVwiLFxuICAgIHNoYTI1NjogU2hhMjU2LFxuICB9KVxuXG4gIGNvbnN0IHNpZ25lZFJlcXVlc3QgPSBhd2FpdCBzaWduZXIuc2lnbihyZXF1ZXN0KVxuXG4gIGNvbnN0IHVybCA9IGBodHRwczovLyR7c2lnbmVkUmVxdWVzdC5ob3N0bmFtZX0ke3NpZ25lZFJlcXVlc3QucGF0aH1gXG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgbWV0aG9kOiBzaWduZWRSZXF1ZXN0Lm1ldGhvZCxcbiAgICBoZWFkZXJzOiBzaWduZWRSZXF1ZXN0LmhlYWRlcnMgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgICBib2R5OiBzaWduZWRSZXF1ZXN0LmJvZHksXG4gIH0pXG5cbiAgY29uc3QgcmVzcG9uc2VCb2R5ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpXG5cbiAgcmV0dXJuIHtcbiAgICBzdGF0dXNDb2RlOiByZXNwb25zZS5zdGF0dXMsXG4gICAgYm9keTogcmVzcG9uc2VCb2R5LFxuICAgIGhlYWRlcnM6IE9iamVjdC5mcm9tRW50cmllcyhyZXNwb25zZS5oZWFkZXJzLmVudHJpZXMoKSksXG4gIH1cbn1cblxuLyoqXG4gKiBIZWxwZXIgdG8gY3JlYXRlIGJhc2UgVVJMIGZyb20gZW52aXJvbm1lbnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVVybEZyb21FbnZpcm9ubWVudChcbiAgYmFzZVVybDogc3RyaW5nLFxuICB1cmxQcmVmaXg6IHN0cmluZyxcbiAgZW52aXJvbm1lbnQ6IHN0cmluZyxcbik6IHN0cmluZyB7XG4gIGlmIChlbnZpcm9ubWVudCA9PT0gXCJwcm9kXCIpIHtcbiAgICByZXR1cm4gYCR7dXJsUHJlZml4fS4ke2Jhc2VVcmx9YFxuICB9XG4gIHJldHVybiBgJHt1cmxQcmVmaXh9LiR7ZW52aXJvbm1lbnR9LiR7YmFzZVVybH1gXG59XG4iXX0=
@@ -0,0 +1,93 @@
1
+ /**
2
+ * Shared type definitions for Vy custom resources
3
+ */
4
+ /**
5
+ * The different Vy environments
6
+ */
7
+ export declare enum VyEnvironment {
8
+ /**
9
+ * Development environment
10
+ */
11
+ TEST = "test",
12
+ /**
13
+ * Production-like environment
14
+ */
15
+ STAGE = "stage",
16
+ /**
17
+ * Production environment
18
+ */
19
+ PROD = "prod"
20
+ }
21
+ export interface Scope {
22
+ name: string;
23
+ description: string;
24
+ }
25
+ export interface ResourceServer {
26
+ identifier: string;
27
+ name: string;
28
+ scopes?: Scope[];
29
+ }
30
+ export interface ResourceServerUpdateRequest {
31
+ identifier: string;
32
+ name: string;
33
+ scopes?: Scope[];
34
+ }
35
+ export interface AppClient {
36
+ name: string;
37
+ scopes: string[];
38
+ type: "frontend" | "backend";
39
+ callback_urls: string[];
40
+ logout_urls: string[];
41
+ generate_secret?: boolean;
42
+ client_id?: string;
43
+ client_secret?: string;
44
+ }
45
+ export interface AppClientUpdateRequest {
46
+ name: string;
47
+ scopes: string[];
48
+ callback_urls: string[];
49
+ logout_urls: string[];
50
+ }
51
+ export interface DeploymentAccount {
52
+ accountId: string;
53
+ slackChannel: string;
54
+ }
55
+ export interface EnvironmentAccount {
56
+ accountId: string;
57
+ ownerAccountId: string;
58
+ }
59
+ export interface ArtifactVersion {
60
+ uri: string;
61
+ store: string;
62
+ path: string;
63
+ version: string;
64
+ }
65
+ export interface CognitoDetails {
66
+ authUrl: string;
67
+ jwksUrl: string;
68
+ openIdUrl: string;
69
+ issuer: string;
70
+ }
71
+ /**
72
+ * Custom Resource event types
73
+ */
74
+ export interface CustomResourceRequest {
75
+ RequestType: "Create" | "Update" | "Delete";
76
+ RequestId: string;
77
+ ResponseURL: string;
78
+ ResourceType: string;
79
+ LogicalResourceId: string;
80
+ StackId: string;
81
+ PhysicalResourceId?: string;
82
+ ResourceProperties: Record<string, any>;
83
+ OldResourceProperties?: Record<string, any>;
84
+ }
85
+ export interface CustomResourceResponse {
86
+ Status: "SUCCESS" | "FAILED";
87
+ Reason?: string;
88
+ PhysicalResourceId: string;
89
+ StackId: string;
90
+ RequestId: string;
91
+ LogicalResourceId: string;
92
+ Data?: Record<string, any>;
93
+ }
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Shared type definitions for Vy custom resources
3
+ */
4
+ /**
5
+ * The different Vy environments
6
+ */
7
+ export var VyEnvironment;
8
+ (function (VyEnvironment) {
9
+ /**
10
+ * Development environment
11
+ */
12
+ VyEnvironment["TEST"] = "test";
13
+ /**
14
+ * Production-like environment
15
+ */
16
+ VyEnvironment["STAGE"] = "stage";
17
+ /**
18
+ * Production environment
19
+ */
20
+ VyEnvironment["PROD"] = "prod";
21
+ })(VyEnvironment || (VyEnvironment = {}));
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2hhcmVkL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUg7O0dBRUc7QUFDSCxNQUFNLENBQU4sSUFBWSxhQWVYO0FBZkQsV0FBWSxhQUFhO0lBQ3ZCOztPQUVHO0lBQ0gsOEJBQWEsQ0FBQTtJQUViOztPQUVHO0lBQ0gsZ0NBQWUsQ0FBQTtJQUVmOztPQUVHO0lBQ0gsOEJBQWEsQ0FBQTtBQUNmLENBQUMsRUFmVyxhQUFhLEtBQWIsYUFBYSxRQWV4QiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogU2hhcmVkIHR5cGUgZGVmaW5pdGlvbnMgZm9yIFZ5IGN1c3RvbSByZXNvdXJjZXNcbiAqL1xuXG4vKipcbiAqIFRoZSBkaWZmZXJlbnQgVnkgZW52aXJvbm1lbnRzXG4gKi9cbmV4cG9ydCBlbnVtIFZ5RW52aXJvbm1lbnQge1xuICAvKipcbiAgICogRGV2ZWxvcG1lbnQgZW52aXJvbm1lbnRcbiAgICovXG4gIFRFU1QgPSBcInRlc3RcIixcblxuICAvKipcbiAgICogUHJvZHVjdGlvbi1saWtlIGVudmlyb25tZW50XG4gICAqL1xuICBTVEFHRSA9IFwic3RhZ2VcIixcblxuICAvKipcbiAgICogUHJvZHVjdGlvbiBlbnZpcm9ubWVudFxuICAgKi9cbiAgUFJPRCA9IFwicHJvZFwiLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNjb3BlIHtcbiAgbmFtZTogc3RyaW5nXG4gIGRlc2NyaXB0aW9uOiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXNvdXJjZVNlcnZlciB7XG4gIGlkZW50aWZpZXI6IHN0cmluZ1xuICBuYW1lOiBzdHJpbmdcbiAgc2NvcGVzPzogU2NvcGVbXVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlc291cmNlU2VydmVyVXBkYXRlUmVxdWVzdCB7XG4gIGlkZW50aWZpZXI6IHN0cmluZ1xuICBuYW1lOiBzdHJpbmdcbiAgc2NvcGVzPzogU2NvcGVbXVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFwcENsaWVudCB7XG4gIG5hbWU6IHN0cmluZ1xuICBzY29wZXM6IHN0cmluZ1tdXG4gIHR5cGU6IFwiZnJvbnRlbmRcIiB8IFwiYmFja2VuZFwiXG4gIGNhbGxiYWNrX3VybHM6IHN0cmluZ1tdXG4gIGxvZ291dF91cmxzOiBzdHJpbmdbXVxuICBnZW5lcmF0ZV9zZWNyZXQ/OiBib29sZWFuXG4gIGNsaWVudF9pZD86IHN0cmluZ1xuICBjbGllbnRfc2VjcmV0Pzogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXBwQ2xpZW50VXBkYXRlUmVxdWVzdCB7XG4gIG5hbWU6IHN0cmluZ1xuICBzY29wZXM6IHN0cmluZ1tdXG4gIGNhbGxiYWNrX3VybHM6IHN0cmluZ1tdXG4gIGxvZ291dF91cmxzOiBzdHJpbmdbXVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIERlcGxveW1lbnRBY2NvdW50IHtcbiAgYWNjb3VudElkOiBzdHJpbmdcbiAgc2xhY2tDaGFubmVsOiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFbnZpcm9ubWVudEFjY291bnQge1xuICBhY2NvdW50SWQ6IHN0cmluZ1xuICBvd25lckFjY291bnRJZDogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXJ0aWZhY3RWZXJzaW9uIHtcbiAgdXJpOiBzdHJpbmdcbiAgc3RvcmU6IHN0cmluZ1xuICBwYXRoOiBzdHJpbmdcbiAgdmVyc2lvbjogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29nbml0b0RldGFpbHMge1xuICBhdXRoVXJsOiBzdHJpbmdcbiAgandrc1VybDogc3RyaW5nXG4gIG9wZW5JZFVybDogc3RyaW5nXG4gIGlzc3Vlcjogc3RyaW5nXG59XG5cbi8qKlxuICogQ3VzdG9tIFJlc291cmNlIGV2ZW50IHR5cGVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3VzdG9tUmVzb3VyY2VSZXF1ZXN0IHtcbiAgUmVxdWVzdFR5cGU6IFwiQ3JlYXRlXCIgfCBcIlVwZGF0ZVwiIHwgXCJEZWxldGVcIlxuICBSZXF1ZXN0SWQ6IHN0cmluZ1xuICBSZXNwb25zZVVSTDogc3RyaW5nXG4gIFJlc291cmNlVHlwZTogc3RyaW5nXG4gIExvZ2ljYWxSZXNvdXJjZUlkOiBzdHJpbmdcbiAgU3RhY2tJZDogc3RyaW5nXG4gIFBoeXNpY2FsUmVzb3VyY2VJZD86IHN0cmluZ1xuICBSZXNvdXJjZVByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIGFueT5cbiAgT2xkUmVzb3VyY2VQcm9wZXJ0aWVzPzogUmVjb3JkPHN0cmluZywgYW55PlxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEN1c3RvbVJlc291cmNlUmVzcG9uc2Uge1xuICBTdGF0dXM6IFwiU1VDQ0VTU1wiIHwgXCJGQUlMRURcIlxuICBSZWFzb24/OiBzdHJpbmdcbiAgUGh5c2ljYWxSZXNvdXJjZUlkOiBzdHJpbmdcbiAgU3RhY2tJZDogc3RyaW5nXG4gIFJlcXVlc3RJZDogc3RyaW5nXG4gIExvZ2ljYWxSZXNvdXJjZUlkOiBzdHJpbmdcbiAgRGF0YT86IFJlY29yZDxzdHJpbmcsIGFueT5cbn1cbiJdfQ==
package/package.json ADDED
@@ -0,0 +1,71 @@
1
+ {
2
+ "name": "@liflig/cdk-vy",
3
+ "version": "1.0.0",
4
+ "description": "CDK constructs for the Vy internal services, based on nsbno/terraform-provider-vy",
5
+ "keywords": [
6
+ "aws-cdk",
7
+ "cdk",
8
+ "vy",
9
+ "cognito",
10
+ "custom-resource"
11
+ ],
12
+ "homepage": "https://github.com/capralifecycle/vy-cdk-lib#readme",
13
+ "bugs": {
14
+ "url": "https://github.com/capralifecycle/vy-cdk-lib/issues"
15
+ },
16
+ "repository": {
17
+ "type": "git",
18
+ "url": "git+ssh://git@github.com/capralifecycle/liflig-cdk-vy.git"
19
+ },
20
+ "license": "MPL-2.0",
21
+ "author": "Liflig",
22
+ "type": "module",
23
+ "main": "lib/index.js",
24
+ "types": "lib/index.d.ts",
25
+ "files": [
26
+ "lib"
27
+ ],
28
+ "scripts": {
29
+ "build": "tsc",
30
+ "watch": "tsc -w",
31
+ "test": "NODE_OPTIONS=--experimental-vm-modules jest --runInBand",
32
+ "lint": "biome check",
33
+ "lint:fix": "biome check --fix",
34
+ "format": "biome format --write",
35
+ "semantic-release": "semantic-release",
36
+ "package": "jsii-pacmak",
37
+ "upgrade-dependencies": "ncu --upgrade --install always --format group"
38
+ },
39
+ "publishConfig": {
40
+ "access": "public",
41
+ "provenance": true
42
+ },
43
+ "devDependencies": {
44
+ "@biomejs/biome": "2.3.2",
45
+ "@commitlint/cli": "20.1.0",
46
+ "@commitlint/config-conventional": "20.0.0",
47
+ "@types/aws-lambda": "8.10.157",
48
+ "@types/jest": "30.0.0",
49
+ "@types/node": "24.9.2",
50
+ "aws-cdk-lib": "2.221.0",
51
+ "constructs": "10.4.2",
52
+ "jest": "30.2.0",
53
+ "jest-cdk-snapshot": "2.3.6",
54
+ "semantic-release": "25.0.1",
55
+ "ts-jest": "29.4.5",
56
+ "ts-node": "10.9.2",
57
+ "tsx": "4.20.6",
58
+ "typescript": "5.9.3",
59
+ "npm-check-updates": "19.1.2"
60
+ },
61
+ "dependencies": {
62
+ "@aws-crypto/sha256-js": "5.2.0",
63
+ "@aws-sdk/client-sts": "3.919.0",
64
+ "@smithy/protocol-http": "5.3.3",
65
+ "@smithy/signature-v4": "5.3.3"
66
+ },
67
+ "peerDependencies": {
68
+ "aws-cdk-lib": "^2.0.0",
69
+ "constructs": "^10.0.0"
70
+ }
71
+ }