@aligent/cdk-aspects 0.2.0 → 0.3.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/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # @aligent/cdk-aspects
2
2
 
3
+ ## 0.3.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [#1582](https://github.com/aligent/cdk-constructs/pull/1582) [`e069f79`](https://github.com/aligent/cdk-constructs/commit/e069f794bdbb003510ffb769504bc776839c7500) Thanks [@kai-nguyen-aligent](https://github.com/kai-nguyen-aligent)! - Migrate new Microservices default aspects (log-group, nodejs-function, and step-functions); Re-organies aspects depends on their functionality.
8
+
3
9
  ## 0.2.0
4
10
 
5
11
  ### Minor Changes
package/README.md CHANGED
@@ -1,21 +1,99 @@
1
1
  # Aligent CDK Aspects
2
2
 
3
+ ![TypeScript version](https://img.shields.io/github/package-json/dependency-version/aligent/cdk-constructs/dev/typescript?filename=packages/cdk-aspects/package.json&color=red) ![AWS CDK version](https://img.shields.io/github/package-json/dependency-version/aligent/cdk-constructs/dev/aws-cdk?filename=packages/cdk-aspects/package.json) ![NPM version](https://img.shields.io/npm/v/%40aligent%2Fcdk-aspects?color=green)
4
+
3
5
  This package provides a collection of CDK aspects that can be applied to your AWS CDK stacks to enforce best practices and automate common configurations.
4
6
 
5
7
  ## Defaults
6
8
 
7
- ### Microservice Checks
9
+ A collection of aspects that automatically apply best-practice defaults to AWS resources in your CDK stacks.
8
10
 
9
- A set of rules that validate your infrastructure against recommended practices using the cdk-nag library.
11
+ ### Log Group Defaults
12
+
13
+ Automatically applies configuration-aware defaults to CloudWatch Log Groups, balancing between cost optimization and data retention needs.
14
+
15
+ #### Features
16
+
17
+ - Automatically configures retention periods based on duration profile
18
+ - Applies appropriate removal policies
19
+ - Duration profiles:
20
+ - **SHORT**: 1 week retention, destroy on stack deletion
21
+ - **MEDIUM**: 6 months retention, destroy on stack deletion
22
+ - **LONG**: 2 years retention, retain on stack deletion
23
+
24
+ #### Usage
25
+
26
+ ```typescript
27
+ import { Aspects } from "aws-cdk-lib";
28
+ import { LogGroupDefaultsAspect } from "@aligent/cdk-aspects";
29
+
30
+ const app = new App();
31
+ Aspects.of(app).add(new LogGroupDefaultsAspect({ duration: "SHORT" }));
32
+ ```
33
+
34
+ ### Node.js Function Defaults
35
+
36
+ Automatically applies configuration-aware defaults to Node.js Lambda functions for consistent runtime configuration and observability.
37
+
38
+ #### Features
39
+
40
+ - Configures Node.js runtime version
41
+ - Enables X-Ray tracing by default
42
+ - Optionally enables source maps for better error stack traces (default: enabled)
43
+ - Configures default memory size (default: 256 MB)
44
+ - Configures default timeout (default: 3 seconds)
45
+
46
+ #### Usage
47
+
48
+ ```typescript
49
+ import { Aspects } from "aws-cdk-lib";
50
+ import { Runtime } from "aws-cdk-lib/aws-lambda";
51
+ import { NodeJsFunctionDefaultsAspect } from "@aligent/cdk-aspects";
52
+
53
+ const app = new App();
54
+ Aspects.of(app).add(
55
+ new NodeJsFunctionDefaultsAspect({
56
+ runtime: Runtime.NODEJS_24_X,
57
+ sourceMap: true, // default: true
58
+ memorySize: 256, // default: 256
59
+ timeout: 3, // default: 3
60
+ })
61
+ );
62
+ ```
63
+
64
+ ### Step Functions Defaults
65
+
66
+ Automatically applies tracing and logging settings to AWS Step Functions state machines for enhanced observability.
10
67
 
11
68
  #### Features
12
69
 
70
+ - Enables X-Ray tracing for all state machines
71
+ - Automatically creates log groups for EXPRESS state machines
72
+ - Configures comprehensive logging with full execution data capture
73
+
74
+ #### Usage
75
+
76
+ ```typescript
77
+ import { Aspects } from "aws-cdk-lib";
78
+ import { StepFunctionsDefaultsAspect } from "@aligent/cdk-aspects";
79
+
80
+ const app = new App();
81
+ Aspects.of(app).add(new StepFunctionsDefaultsAspect());
82
+ ```
83
+
84
+
85
+ ## Microservice Checks
86
+
87
+ A set of rules that validate your infrastructure against recommended practices using the cdk-nag library.
88
+
89
+ ### Features
90
+
13
91
  - Validates Lambda function memory configuration
14
92
  - Validates Lambda function timeout configuration
15
93
  - Validates Lambda function tracing configuration
16
94
  - Validates CloudWatch Log Group retention policy
17
95
 
18
- #### Usage
96
+ ### Usage
19
97
 
20
98
  ```typescript
21
99
  import { Aspects } from "aws-cdk-lib";
@@ -27,17 +105,17 @@ const stack = new Stack(app, "MyStack");
27
105
  Aspects.of(stack).add(new MicroserviceChecks());
28
106
  ```
29
107
 
30
- ### Version Functions
108
+ ## Version Functions
31
109
 
32
110
  An aspect that automatically adds versioning and aliases to Lambda functions and Step Functions.
33
111
 
34
- #### Features
112
+ ### Features
35
113
 
36
114
  - Automatically creates function aliases for Lambda functions
37
115
  - Creates versions and aliases for Step Functions with 100% traffic routing
38
116
  - Supports custom alias names
39
117
 
40
- #### Usage
118
+ ### Usage
41
119
 
42
120
  ```typescript
43
121
  import { Aspects } from "aws-cdk-lib";
package/index.d.ts CHANGED
@@ -1,3 +1,5 @@
1
- import { MicroserviceChecks } from "./lib/defaults/microservice-checks/microservice-checks";
2
- import { VersionFunctionsAspect } from "./lib/defaults/version-functions/version-functions";
3
- export { MicroserviceChecks, VersionFunctionsAspect };
1
+ export * from "./lib/defaults/log-group";
2
+ export * from "./lib/defaults/nodejs-function";
3
+ export * from "./lib/defaults/step-functions";
4
+ export * from "./lib/lambda-sfn-versioning";
5
+ export * from "./lib/microservice-checks";
package/index.js CHANGED
@@ -1,8 +1,22 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
2
16
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.VersionFunctionsAspect = exports.MicroserviceChecks = void 0;
4
- const microservice_checks_1 = require("./lib/defaults/microservice-checks/microservice-checks");
5
- Object.defineProperty(exports, "MicroserviceChecks", { enumerable: true, get: function () { return microservice_checks_1.MicroserviceChecks; } });
6
- const version_functions_1 = require("./lib/defaults/version-functions/version-functions");
7
- Object.defineProperty(exports, "VersionFunctionsAspect", { enumerable: true, get: function () { return version_functions_1.VersionFunctionsAspect; } });
8
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxnR0FBNEY7QUFHbkYsbUdBSEEsd0NBQWtCLE9BR0E7QUFGM0IsMEZBQTRGO0FBRS9ELHVHQUZwQiwwQ0FBc0IsT0FFb0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBNaWNyb3NlcnZpY2VDaGVja3MgfSBmcm9tIFwiLi9saWIvZGVmYXVsdHMvbWljcm9zZXJ2aWNlLWNoZWNrcy9taWNyb3NlcnZpY2UtY2hlY2tzXCI7XG5pbXBvcnQgeyBWZXJzaW9uRnVuY3Rpb25zQXNwZWN0IH0gZnJvbSBcIi4vbGliL2RlZmF1bHRzL3ZlcnNpb24tZnVuY3Rpb25zL3ZlcnNpb24tZnVuY3Rpb25zXCI7XG5cbmV4cG9ydCB7IE1pY3Jvc2VydmljZUNoZWNrcywgVmVyc2lvbkZ1bmN0aW9uc0FzcGVjdCB9O1xuIl19
17
+ __exportStar(require("./lib/defaults/log-group"), exports);
18
+ __exportStar(require("./lib/defaults/nodejs-function"), exports);
19
+ __exportStar(require("./lib/defaults/step-functions"), exports);
20
+ __exportStar(require("./lib/lambda-sfn-versioning"), exports);
21
+ __exportStar(require("./lib/microservice-checks"), exports);
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsMkRBQXlDO0FBQ3pDLGlFQUErQztBQUMvQyxnRUFBOEM7QUFDOUMsOERBQTRDO0FBQzVDLDREQUEwQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gXCIuL2xpYi9kZWZhdWx0cy9sb2ctZ3JvdXBcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2xpYi9kZWZhdWx0cy9ub2RlanMtZnVuY3Rpb25cIjtcbmV4cG9ydCAqIGZyb20gXCIuL2xpYi9kZWZhdWx0cy9zdGVwLWZ1bmN0aW9uc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vbGliL2xhbWJkYS1zZm4tdmVyc2lvbmluZ1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vbGliL21pY3Jvc2VydmljZS1jaGVja3NcIjtcbiJdfQ==
@@ -0,0 +1,50 @@
1
+ import { type IAspect } from "aws-cdk-lib";
2
+ import { IConstruct } from "constructs";
3
+ interface Config {
4
+ duration: "SHORT" | "MEDIUM" | "LONG";
5
+ }
6
+ /**
7
+ * Aspect that automatically applies configuration-aware defaults to CloudWatch Log Groups
8
+ *
9
+ * Visits all constructs in the scope and automatically applies configuration-specific to log groups.
10
+ * Different configurations balance between cost optimization and data retention needs.
11
+ *
12
+ * @example
13
+ * ```typescript
14
+ * // Apply configuration-specific defaults to all log groups
15
+ * Aspects.of(app).add(new LogGroupDefaultsAspect({ duration: 'SHORT' }));
16
+ *
17
+ * // Log groups automatically inherit configuration defaults
18
+ * new LogGroup(stack, 'MyLogGroup', {
19
+ * // retention and removal policy applied automatically
20
+ * });
21
+ * ```
22
+ *
23
+ * @see https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_logs.LogGroup.html
24
+ */
25
+ export declare class LogGroupDefaultsAspect implements IAspect {
26
+ private readonly defaultProps;
27
+ /**
28
+ * Creates a new LogGroupDefaultsAspect
29
+ *
30
+ * @param config - Configuration identifier used to select appropriate defaults.
31
+ */
32
+ constructor(config: Config);
33
+ /**
34
+ * Get duration-specific log group properties
35
+ *
36
+ * @param duration - The duration to get the log group properties for
37
+ * @returns The log group properties for the duration
38
+ */
39
+ private retentionProperties;
40
+ /**
41
+ * Visits a construct and applies configuration-appropriate defaults
42
+ *
43
+ * Applies configuration-specific retention and removal policies to log groups
44
+ * that don't already have these properties explicitly set.
45
+ *
46
+ * @param node - The construct to potentially modify
47
+ */
48
+ visit(node: IConstruct): void;
49
+ }
50
+ export {};
@@ -0,0 +1,83 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LogGroupDefaultsAspect = void 0;
4
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
5
+ const aws_logs_1 = require("aws-cdk-lib/aws-logs");
6
+ /**
7
+ * Aspect that automatically applies configuration-aware defaults to CloudWatch Log Groups
8
+ *
9
+ * Visits all constructs in the scope and automatically applies configuration-specific to log groups.
10
+ * Different configurations balance between cost optimization and data retention needs.
11
+ *
12
+ * @example
13
+ * ```typescript
14
+ * // Apply configuration-specific defaults to all log groups
15
+ * Aspects.of(app).add(new LogGroupDefaultsAspect({ duration: 'SHORT' }));
16
+ *
17
+ * // Log groups automatically inherit configuration defaults
18
+ * new LogGroup(stack, 'MyLogGroup', {
19
+ * // retention and removal policy applied automatically
20
+ * });
21
+ * ```
22
+ *
23
+ * @see https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_logs.LogGroup.html
24
+ */
25
+ class LogGroupDefaultsAspect {
26
+ /**
27
+ * Creates a new LogGroupDefaultsAspect
28
+ *
29
+ * @param config - Configuration identifier used to select appropriate defaults.
30
+ */
31
+ constructor(config) {
32
+ const props = this.retentionProperties(config.duration);
33
+ this.defaultProps = { ...props };
34
+ }
35
+ /**
36
+ * Get duration-specific log group properties
37
+ *
38
+ * @param duration - The duration to get the log group properties for
39
+ * @returns The log group properties for the duration
40
+ */
41
+ retentionProperties(duration) {
42
+ switch (duration) {
43
+ case "SHORT":
44
+ return {
45
+ retention: aws_logs_1.RetentionDays.ONE_WEEK,
46
+ removalPolicy: aws_cdk_lib_1.RemovalPolicy.DESTROY,
47
+ };
48
+ case "MEDIUM":
49
+ return {
50
+ retention: aws_logs_1.RetentionDays.SIX_MONTHS,
51
+ removalPolicy: aws_cdk_lib_1.RemovalPolicy.DESTROY,
52
+ };
53
+ default:
54
+ return {
55
+ retention: aws_logs_1.RetentionDays.TWO_YEARS,
56
+ removalPolicy: aws_cdk_lib_1.RemovalPolicy.RETAIN,
57
+ };
58
+ }
59
+ }
60
+ /**
61
+ * Visits a construct and applies configuration-appropriate defaults
62
+ *
63
+ * Applies configuration-specific retention and removal policies to log groups
64
+ * that don't already have these properties explicitly set.
65
+ *
66
+ * @param node - The construct to potentially modify
67
+ */
68
+ visit(node) {
69
+ if (node instanceof aws_logs_1.LogGroup) {
70
+ if (this.defaultProps.removalPolicy) {
71
+ node.applyRemovalPolicy(this.defaultProps.removalPolicy);
72
+ }
73
+ if (this.defaultProps.retention) {
74
+ const cfnLogGroup = node.node.defaultChild;
75
+ if (cfnLogGroup && cfnLogGroup.retentionInDays === undefined) {
76
+ cfnLogGroup.retentionInDays = this.defaultProps.retention;
77
+ }
78
+ }
79
+ }
80
+ }
81
+ }
82
+ exports.LogGroupDefaultsAspect = LogGroupDefaultsAspect;
83
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nLWdyb3VwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsibG9nLWdyb3VwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZDQUEwRDtBQUMxRCxtREFLOEI7QUFPOUI7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtCRztBQUNILE1BQWEsc0JBQXNCO0lBR2pDOzs7O09BSUc7SUFDSCxZQUFZLE1BQWM7UUFDeEIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN4RCxJQUFJLENBQUMsWUFBWSxHQUFHLEVBQUUsR0FBRyxLQUFLLEVBQUUsQ0FBQztJQUNuQyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyxtQkFBbUIsQ0FBQyxRQUFxQztRQUMvRCxRQUFRLFFBQVEsRUFBRSxDQUFDO1lBQ2pCLEtBQUssT0FBTztnQkFDVixPQUFPO29CQUNMLFNBQVMsRUFBRSx3QkFBYSxDQUFDLFFBQVE7b0JBQ2pDLGFBQWEsRUFBRSwyQkFBYSxDQUFDLE9BQU87aUJBQ3JDLENBQUM7WUFDSixLQUFLLFFBQVE7Z0JBQ1gsT0FBTztvQkFDTCxTQUFTLEVBQUUsd0JBQWEsQ0FBQyxVQUFVO29CQUNuQyxhQUFhLEVBQUUsMkJBQWEsQ0FBQyxPQUFPO2lCQUNyQyxDQUFDO1lBQ0o7Z0JBQ0UsT0FBTztvQkFDTCxTQUFTLEVBQUUsd0JBQWEsQ0FBQyxTQUFTO29CQUNsQyxhQUFhLEVBQUUsMkJBQWEsQ0FBQyxNQUFNO2lCQUNwQyxDQUFDO1FBQ04sQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsS0FBSyxDQUFDLElBQWdCO1FBQ3BCLElBQUksSUFBSSxZQUFZLG1CQUFRLEVBQUUsQ0FBQztZQUM3QixJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQ3BDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQzNELENBQUM7WUFFRCxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQ2hDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBMkIsQ0FBQztnQkFDMUQsSUFBSSxXQUFXLElBQUksV0FBVyxDQUFDLGVBQWUsS0FBSyxTQUFTLEVBQUUsQ0FBQztvQkFDN0QsV0FBVyxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQztnQkFDNUQsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBN0RELHdEQTZEQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJlbW92YWxQb2xpY3ksIHR5cGUgSUFzcGVjdCB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHtcbiAgQ2ZuTG9nR3JvdXAsXG4gIExvZ0dyb3VwLFxuICBSZXRlbnRpb25EYXlzLFxuICB0eXBlIExvZ0dyb3VwUHJvcHMsXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbG9nc1wiO1xuaW1wb3J0IHsgSUNvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5cbmludGVyZmFjZSBDb25maWcge1xuICBkdXJhdGlvbjogXCJTSE9SVFwiIHwgXCJNRURJVU1cIiB8IFwiTE9OR1wiO1xufVxuXG4vKipcbiAqIEFzcGVjdCB0aGF0IGF1dG9tYXRpY2FsbHkgYXBwbGllcyBjb25maWd1cmF0aW9uLWF3YXJlIGRlZmF1bHRzIHRvIENsb3VkV2F0Y2ggTG9nIEdyb3Vwc1xuICpcbiAqIFZpc2l0cyBhbGwgY29uc3RydWN0cyBpbiB0aGUgc2NvcGUgYW5kIGF1dG9tYXRpY2FsbHkgYXBwbGllcyBjb25maWd1cmF0aW9uLXNwZWNpZmljIHRvIGxvZyBncm91cHMuXG4gKiBEaWZmZXJlbnQgY29uZmlndXJhdGlvbnMgYmFsYW5jZSBiZXR3ZWVuIGNvc3Qgb3B0aW1pemF0aW9uIGFuZCBkYXRhIHJldGVudGlvbiBuZWVkcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gQXBwbHkgY29uZmlndXJhdGlvbi1zcGVjaWZpYyBkZWZhdWx0cyB0byBhbGwgbG9nIGdyb3Vwc1xuICogQXNwZWN0cy5vZihhcHApLmFkZChuZXcgTG9nR3JvdXBEZWZhdWx0c0FzcGVjdCh7IGR1cmF0aW9uOiAnU0hPUlQnIH0pKTtcbiAqXG4gKiAvLyBMb2cgZ3JvdXBzIGF1dG9tYXRpY2FsbHkgaW5oZXJpdCBjb25maWd1cmF0aW9uIGRlZmF1bHRzXG4gKiBuZXcgTG9nR3JvdXAoc3RhY2ssICdNeUxvZ0dyb3VwJywge1xuICogICAvLyByZXRlbnRpb24gYW5kIHJlbW92YWwgcG9saWN5IGFwcGxpZWQgYXV0b21hdGljYWxseVxuICogfSk7XG4gKiBgYGBcbiAqXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jZGsvYXBpL3YyL2RvY3MvYXdzLWNkay1saWIuYXdzX2xvZ3MuTG9nR3JvdXAuaHRtbFxuICovXG5leHBvcnQgY2xhc3MgTG9nR3JvdXBEZWZhdWx0c0FzcGVjdCBpbXBsZW1lbnRzIElBc3BlY3Qge1xuICBwcml2YXRlIHJlYWRvbmx5IGRlZmF1bHRQcm9wczogTG9nR3JvdXBQcm9wcztcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBMb2dHcm91cERlZmF1bHRzQXNwZWN0XG4gICAqXG4gICAqIEBwYXJhbSBjb25maWcgLSBDb25maWd1cmF0aW9uIGlkZW50aWZpZXIgdXNlZCB0byBzZWxlY3QgYXBwcm9wcmlhdGUgZGVmYXVsdHMuXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihjb25maWc6IENvbmZpZykge1xuICAgIGNvbnN0IHByb3BzID0gdGhpcy5yZXRlbnRpb25Qcm9wZXJ0aWVzKGNvbmZpZy5kdXJhdGlvbik7XG4gICAgdGhpcy5kZWZhdWx0UHJvcHMgPSB7IC4uLnByb3BzIH07XG4gIH1cblxuICAvKipcbiAgICogR2V0IGR1cmF0aW9uLXNwZWNpZmljIGxvZyBncm91cCBwcm9wZXJ0aWVzXG4gICAqXG4gICAqIEBwYXJhbSBkdXJhdGlvbiAtIFRoZSBkdXJhdGlvbiB0byBnZXQgdGhlIGxvZyBncm91cCBwcm9wZXJ0aWVzIGZvclxuICAgKiBAcmV0dXJucyBUaGUgbG9nIGdyb3VwIHByb3BlcnRpZXMgZm9yIHRoZSBkdXJhdGlvblxuICAgKi9cbiAgcHJpdmF0ZSByZXRlbnRpb25Qcm9wZXJ0aWVzKGR1cmF0aW9uOiBcIlNIT1JUXCIgfCBcIk1FRElVTVwiIHwgXCJMT05HXCIpIHtcbiAgICBzd2l0Y2ggKGR1cmF0aW9uKSB7XG4gICAgICBjYXNlIFwiU0hPUlRcIjpcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICByZXRlbnRpb246IFJldGVudGlvbkRheXMuT05FX1dFRUssXG4gICAgICAgICAgcmVtb3ZhbFBvbGljeTogUmVtb3ZhbFBvbGljeS5ERVNUUk9ZLFxuICAgICAgICB9O1xuICAgICAgY2FzZSBcIk1FRElVTVwiOlxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHJldGVudGlvbjogUmV0ZW50aW9uRGF5cy5TSVhfTU9OVEhTLFxuICAgICAgICAgIHJlbW92YWxQb2xpY3k6IFJlbW92YWxQb2xpY3kuREVTVFJPWSxcbiAgICAgICAgfTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgcmV0ZW50aW9uOiBSZXRlbnRpb25EYXlzLlRXT19ZRUFSUyxcbiAgICAgICAgICByZW1vdmFsUG9saWN5OiBSZW1vdmFsUG9saWN5LlJFVEFJTixcbiAgICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmlzaXRzIGEgY29uc3RydWN0IGFuZCBhcHBsaWVzIGNvbmZpZ3VyYXRpb24tYXBwcm9wcmlhdGUgZGVmYXVsdHNcbiAgICpcbiAgICogQXBwbGllcyBjb25maWd1cmF0aW9uLXNwZWNpZmljIHJldGVudGlvbiBhbmQgcmVtb3ZhbCBwb2xpY2llcyB0byBsb2cgZ3JvdXBzXG4gICAqIHRoYXQgZG9uJ3QgYWxyZWFkeSBoYXZlIHRoZXNlIHByb3BlcnRpZXMgZXhwbGljaXRseSBzZXQuXG4gICAqXG4gICAqIEBwYXJhbSBub2RlIC0gVGhlIGNvbnN0cnVjdCB0byBwb3RlbnRpYWxseSBtb2RpZnlcbiAgICovXG4gIHZpc2l0KG5vZGU6IElDb25zdHJ1Y3QpOiB2b2lkIHtcbiAgICBpZiAobm9kZSBpbnN0YW5jZW9mIExvZ0dyb3VwKSB7XG4gICAgICBpZiAodGhpcy5kZWZhdWx0UHJvcHMucmVtb3ZhbFBvbGljeSkge1xuICAgICAgICBub2RlLmFwcGx5UmVtb3ZhbFBvbGljeSh0aGlzLmRlZmF1bHRQcm9wcy5yZW1vdmFsUG9saWN5KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuZGVmYXVsdFByb3BzLnJldGVudGlvbikge1xuICAgICAgICBjb25zdCBjZm5Mb2dHcm91cCA9IG5vZGUubm9kZS5kZWZhdWx0Q2hpbGQgYXMgQ2ZuTG9nR3JvdXA7XG4gICAgICAgIGlmIChjZm5Mb2dHcm91cCAmJiBjZm5Mb2dHcm91cC5yZXRlbnRpb25JbkRheXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGNmbkxvZ0dyb3VwLnJldGVudGlvbkluRGF5cyA9IHRoaXMuZGVmYXVsdFByb3BzLnJldGVudGlvbjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIl19
@@ -0,0 +1,52 @@
1
+ import { type IAspect } from "aws-cdk-lib";
2
+ import { Runtime } from "aws-cdk-lib/aws-lambda";
3
+ import { IConstruct } from "constructs";
4
+ interface Config {
5
+ runtime: Runtime;
6
+ sourceMap?: boolean;
7
+ memorySize?: number;
8
+ timeout?: number;
9
+ }
10
+ /**
11
+ * Aspect that automatically applies configuration-aware defaults to Node.js Lambda functions
12
+ *
13
+ * Visits all constructs in the scope and automatically applies configuration-specific runtime, tracing, and environment settings to Node.js Lambda functions.
14
+ * Different configurations can optimize for different priorities such as build speed, bundle size, or debugging capabilities.
15
+ *
16
+ * @example
17
+ * ```typescript
18
+ * // Apply configuration-specific defaults to all Node.js functions
19
+ * Aspects.of(app).add(new NodeJsFunctionDefaultsAspect({
20
+ * runtime: Runtime.NODEJS_24_X,
21
+ * sourceMap: true,
22
+ * }));
23
+ *
24
+ * // Functions automatically inherit configuration defaults
25
+ * new NodejsFunction(stack, 'MyFunction', {
26
+ * code: Code.fromAsset('src/lambda'),
27
+ * handler: 'index.handler',
28
+ * // runtime, tracing, and source map support applied automatically
29
+ * });
30
+ * ```
31
+ *
32
+ * @see https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_lambda_nodejs.NodejsFunction.html
33
+ */
34
+ export declare class NodeJsFunctionDefaultsAspect implements IAspect {
35
+ private readonly config;
36
+ /**
37
+ * Creates a new NodeJsFunctionDefaultsAspect
38
+ *
39
+ * @param config - Configuration identifier used to select appropriate defaults.
40
+ */
41
+ constructor(config: Config);
42
+ /**
43
+ * Visits a construct and applies runtime and tracing settings if it's a NodejsFunction
44
+ *
45
+ * Applies configuration-specific runtime, tracing, and environment settings to Node.js
46
+ * Lambda functions that don't already have these properties explicitly set.
47
+ *
48
+ * @param node - The construct to potentially modify
49
+ */
50
+ visit(node: IConstruct): void;
51
+ }
52
+ export {};
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.NodeJsFunctionDefaultsAspect = void 0;
4
+ const aws_lambda_1 = require("aws-cdk-lib/aws-lambda");
5
+ const aws_lambda_nodejs_1 = require("aws-cdk-lib/aws-lambda-nodejs");
6
+ /**
7
+ * Aspect that automatically applies configuration-aware defaults to Node.js Lambda functions
8
+ *
9
+ * Visits all constructs in the scope and automatically applies configuration-specific runtime, tracing, and environment settings to Node.js Lambda functions.
10
+ * Different configurations can optimize for different priorities such as build speed, bundle size, or debugging capabilities.
11
+ *
12
+ * @example
13
+ * ```typescript
14
+ * // Apply configuration-specific defaults to all Node.js functions
15
+ * Aspects.of(app).add(new NodeJsFunctionDefaultsAspect({
16
+ * runtime: Runtime.NODEJS_24_X,
17
+ * sourceMap: true,
18
+ * }));
19
+ *
20
+ * // Functions automatically inherit configuration defaults
21
+ * new NodejsFunction(stack, 'MyFunction', {
22
+ * code: Code.fromAsset('src/lambda'),
23
+ * handler: 'index.handler',
24
+ * // runtime, tracing, and source map support applied automatically
25
+ * });
26
+ * ```
27
+ *
28
+ * @see https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_lambda_nodejs.NodejsFunction.html
29
+ */
30
+ class NodeJsFunctionDefaultsAspect {
31
+ /**
32
+ * Creates a new NodeJsFunctionDefaultsAspect
33
+ *
34
+ * @param config - Configuration identifier used to select appropriate defaults.
35
+ */
36
+ constructor(config) {
37
+ var _a, _b, _c;
38
+ this.config = {
39
+ ...config,
40
+ sourceMap: (_a = config.sourceMap) !== null && _a !== void 0 ? _a : true,
41
+ memorySize: (_b = config.memorySize) !== null && _b !== void 0 ? _b : 256,
42
+ timeout: (_c = config.timeout) !== null && _c !== void 0 ? _c : 3,
43
+ };
44
+ }
45
+ /**
46
+ * Visits a construct and applies runtime and tracing settings if it's a NodejsFunction
47
+ *
48
+ * Applies configuration-specific runtime, tracing, and environment settings to Node.js
49
+ * Lambda functions that don't already have these properties explicitly set.
50
+ *
51
+ * @param node - The construct to potentially modify
52
+ */
53
+ visit(node) {
54
+ if (node instanceof aws_lambda_nodejs_1.NodejsFunction) {
55
+ const cfnFunction = node.node.defaultChild;
56
+ if (cfnFunction) {
57
+ cfnFunction.runtime = this.config.runtime.name;
58
+ }
59
+ if (cfnFunction && cfnFunction.tracingConfig === undefined) {
60
+ cfnFunction.tracingConfig = { mode: aws_lambda_1.Tracing.ACTIVE };
61
+ }
62
+ if (cfnFunction && cfnFunction.memorySize === undefined) {
63
+ cfnFunction.memorySize = this.config.memorySize;
64
+ }
65
+ if (cfnFunction && cfnFunction.timeout === undefined) {
66
+ cfnFunction.timeout = this.config.timeout;
67
+ }
68
+ if (this.config.sourceMap) {
69
+ node.addEnvironment("NODE_OPTIONS", "--enable-source-maps");
70
+ }
71
+ }
72
+ }
73
+ }
74
+ exports.NodeJsFunctionDefaultsAspect = NodeJsFunctionDefaultsAspect;
75
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZWpzLWZ1bmN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsibm9kZWpzLWZ1bmN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLHVEQUF1RTtBQUN2RSxxRUFBK0Q7QUFVL0Q7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBdUJHO0FBQ0gsTUFBYSw0QkFBNEI7SUFHdkM7Ozs7T0FJRztJQUNILFlBQVksTUFBYzs7UUFDeEIsSUFBSSxDQUFDLE1BQU0sR0FBRztZQUNaLEdBQUcsTUFBTTtZQUNULFNBQVMsRUFBRSxNQUFBLE1BQU0sQ0FBQyxTQUFTLG1DQUFJLElBQUk7WUFDbkMsVUFBVSxFQUFFLE1BQUEsTUFBTSxDQUFDLFVBQVUsbUNBQUksR0FBRztZQUNwQyxPQUFPLEVBQUUsTUFBQSxNQUFNLENBQUMsT0FBTyxtQ0FBSSxDQUFDO1NBQzdCLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILEtBQUssQ0FBQyxJQUFnQjtRQUNwQixJQUFJLElBQUksWUFBWSxrQ0FBYyxFQUFFLENBQUM7WUFDbkMsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUEyQixDQUFDO1lBRTFELElBQUksV0FBVyxFQUFFLENBQUM7Z0JBQ2hCLFdBQVcsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO1lBQ2pELENBQUM7WUFFRCxJQUFJLFdBQVcsSUFBSSxXQUFXLENBQUMsYUFBYSxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUMzRCxXQUFXLENBQUMsYUFBYSxHQUFHLEVBQUUsSUFBSSxFQUFFLG9CQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDdkQsQ0FBQztZQUVELElBQUksV0FBVyxJQUFJLFdBQVcsQ0FBQyxVQUFVLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQ3hELFdBQVcsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUM7WUFDbEQsQ0FBQztZQUVELElBQUksV0FBVyxJQUFJLFdBQVcsQ0FBQyxPQUFPLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQ3JELFdBQVcsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7WUFDNUMsQ0FBQztZQUVELElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDMUIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxjQUFjLEVBQUUsc0JBQXNCLENBQUMsQ0FBQztZQUM5RCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7Q0FDRjtBQWxERCxvRUFrREMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0eXBlIElBc3BlY3QgfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7IENmbkZ1bmN0aW9uLCBSdW50aW1lLCBUcmFjaW5nIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1sYW1iZGFcIjtcbmltcG9ydCB7IE5vZGVqc0Z1bmN0aW9uIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1sYW1iZGEtbm9kZWpzXCI7XG5pbXBvcnQgeyBJQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcblxuaW50ZXJmYWNlIENvbmZpZyB7XG4gIHJ1bnRpbWU6IFJ1bnRpbWU7XG4gIHNvdXJjZU1hcD86IGJvb2xlYW47XG4gIG1lbW9yeVNpemU/OiBudW1iZXI7XG4gIHRpbWVvdXQ/OiBudW1iZXI7XG59XG5cbi8qKlxuICogQXNwZWN0IHRoYXQgYXV0b21hdGljYWxseSBhcHBsaWVzIGNvbmZpZ3VyYXRpb24tYXdhcmUgZGVmYXVsdHMgdG8gTm9kZS5qcyBMYW1iZGEgZnVuY3Rpb25zXG4gKlxuICogVmlzaXRzIGFsbCBjb25zdHJ1Y3RzIGluIHRoZSBzY29wZSBhbmQgYXV0b21hdGljYWxseSBhcHBsaWVzIGNvbmZpZ3VyYXRpb24tc3BlY2lmaWMgcnVudGltZSwgdHJhY2luZywgYW5kIGVudmlyb25tZW50IHNldHRpbmdzIHRvIE5vZGUuanMgTGFtYmRhIGZ1bmN0aW9ucy5cbiAqIERpZmZlcmVudCBjb25maWd1cmF0aW9ucyBjYW4gb3B0aW1pemUgZm9yIGRpZmZlcmVudCBwcmlvcml0aWVzIHN1Y2ggYXMgYnVpbGQgc3BlZWQsIGJ1bmRsZSBzaXplLCBvciBkZWJ1Z2dpbmcgY2FwYWJpbGl0aWVzLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBBcHBseSBjb25maWd1cmF0aW9uLXNwZWNpZmljIGRlZmF1bHRzIHRvIGFsbCBOb2RlLmpzIGZ1bmN0aW9uc1xuICogQXNwZWN0cy5vZihhcHApLmFkZChuZXcgTm9kZUpzRnVuY3Rpb25EZWZhdWx0c0FzcGVjdCh7XG4gKiAgIHJ1bnRpbWU6IFJ1bnRpbWUuTk9ERUpTXzI0X1gsXG4gKiAgIHNvdXJjZU1hcDogdHJ1ZSxcbiAqIH0pKTtcbiAqXG4gKiAvLyBGdW5jdGlvbnMgYXV0b21hdGljYWxseSBpbmhlcml0IGNvbmZpZ3VyYXRpb24gZGVmYXVsdHNcbiAqIG5ldyBOb2RlanNGdW5jdGlvbihzdGFjaywgJ015RnVuY3Rpb24nLCB7XG4gKiAgIGNvZGU6IENvZGUuZnJvbUFzc2V0KCdzcmMvbGFtYmRhJyksXG4gKiAgIGhhbmRsZXI6ICdpbmRleC5oYW5kbGVyJyxcbiAqICAgLy8gcnVudGltZSwgdHJhY2luZywgYW5kIHNvdXJjZSBtYXAgc3VwcG9ydCBhcHBsaWVkIGF1dG9tYXRpY2FsbHlcbiAqIH0pO1xuICogYGBgXG4gKlxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY2RrL2FwaS92Mi9kb2NzL2F3cy1jZGstbGliLmF3c19sYW1iZGFfbm9kZWpzLk5vZGVqc0Z1bmN0aW9uLmh0bWxcbiAqL1xuZXhwb3J0IGNsYXNzIE5vZGVKc0Z1bmN0aW9uRGVmYXVsdHNBc3BlY3QgaW1wbGVtZW50cyBJQXNwZWN0IHtcbiAgcHJpdmF0ZSByZWFkb25seSBjb25maWc6IFJlcXVpcmVkPENvbmZpZz47XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgTm9kZUpzRnVuY3Rpb25EZWZhdWx0c0FzcGVjdFxuICAgKlxuICAgKiBAcGFyYW0gY29uZmlnIC0gQ29uZmlndXJhdGlvbiBpZGVudGlmaWVyIHVzZWQgdG8gc2VsZWN0IGFwcHJvcHJpYXRlIGRlZmF1bHRzLlxuICAgKi9cbiAgY29uc3RydWN0b3IoY29uZmlnOiBDb25maWcpIHtcbiAgICB0aGlzLmNvbmZpZyA9IHtcbiAgICAgIC4uLmNvbmZpZyxcbiAgICAgIHNvdXJjZU1hcDogY29uZmlnLnNvdXJjZU1hcCA/PyB0cnVlLFxuICAgICAgbWVtb3J5U2l6ZTogY29uZmlnLm1lbW9yeVNpemUgPz8gMjU2LFxuICAgICAgdGltZW91dDogY29uZmlnLnRpbWVvdXQgPz8gMyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFZpc2l0cyBhIGNvbnN0cnVjdCBhbmQgYXBwbGllcyBydW50aW1lIGFuZCB0cmFjaW5nIHNldHRpbmdzIGlmIGl0J3MgYSBOb2RlanNGdW5jdGlvblxuICAgKlxuICAgKiBBcHBsaWVzIGNvbmZpZ3VyYXRpb24tc3BlY2lmaWMgcnVudGltZSwgdHJhY2luZywgYW5kIGVudmlyb25tZW50IHNldHRpbmdzIHRvIE5vZGUuanNcbiAgICogTGFtYmRhIGZ1bmN0aW9ucyB0aGF0IGRvbid0IGFscmVhZHkgaGF2ZSB0aGVzZSBwcm9wZXJ0aWVzIGV4cGxpY2l0bHkgc2V0LlxuICAgKlxuICAgKiBAcGFyYW0gbm9kZSAtIFRoZSBjb25zdHJ1Y3QgdG8gcG90ZW50aWFsbHkgbW9kaWZ5XG4gICAqL1xuICB2aXNpdChub2RlOiBJQ29uc3RydWN0KTogdm9pZCB7XG4gICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBOb2RlanNGdW5jdGlvbikge1xuICAgICAgY29uc3QgY2ZuRnVuY3Rpb24gPSBub2RlLm5vZGUuZGVmYXVsdENoaWxkIGFzIENmbkZ1bmN0aW9uO1xuXG4gICAgICBpZiAoY2ZuRnVuY3Rpb24pIHtcbiAgICAgICAgY2ZuRnVuY3Rpb24ucnVudGltZSA9IHRoaXMuY29uZmlnLnJ1bnRpbWUubmFtZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNmbkZ1bmN0aW9uICYmIGNmbkZ1bmN0aW9uLnRyYWNpbmdDb25maWcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjZm5GdW5jdGlvbi50cmFjaW5nQ29uZmlnID0geyBtb2RlOiBUcmFjaW5nLkFDVElWRSB9O1xuICAgICAgfVxuXG4gICAgICBpZiAoY2ZuRnVuY3Rpb24gJiYgY2ZuRnVuY3Rpb24ubWVtb3J5U2l6ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNmbkZ1bmN0aW9uLm1lbW9yeVNpemUgPSB0aGlzLmNvbmZpZy5tZW1vcnlTaXplO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2ZuRnVuY3Rpb24gJiYgY2ZuRnVuY3Rpb24udGltZW91dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNmbkZ1bmN0aW9uLnRpbWVvdXQgPSB0aGlzLmNvbmZpZy50aW1lb3V0O1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5jb25maWcuc291cmNlTWFwKSB7XG4gICAgICAgIG5vZGUuYWRkRW52aXJvbm1lbnQoXCJOT0RFX09QVElPTlNcIiwgXCItLWVuYWJsZS1zb3VyY2UtbWFwc1wiKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,36 @@
1
+ import { type IAspect } from "aws-cdk-lib";
2
+ import { IConstruct } from "constructs";
3
+ /**
4
+ * Aspect that automatically applies tracing and logging settings to Step Functions
5
+ *
6
+ * Visits all constructs in the scope and automatically applies X-Ray tracing to all
7
+ * state machines. For EXPRESS state machines, automatically creates log groups and
8
+ * configures comprehensive logging for enhanced observability.
9
+ *
10
+ * @example
11
+ * ```typescript
12
+ * // Apply configuration-specific defaults to all Step Functions
13
+ * Aspects.of(app).add(new StepFunctionDefaultsAspect());
14
+ *
15
+ * // Step Functions automatically inherit defaults
16
+ * new StateMachine(stack, 'MyWorkflow', {
17
+ * stateMachineType: StateMachineType.EXPRESS,
18
+ * definitionBody: DefinitionBody.fromFile('workflow.asl.yaml'),
19
+ * // tracing enabled and logging configured automatically for EXPRESS
20
+ * });
21
+ * ```
22
+ *
23
+ * @see https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_stepfunctions.StateMachine.html
24
+ */
25
+ export declare class StepFunctionsDefaultsAspect implements IAspect {
26
+ /**
27
+ * Visits a construct and applies tracing and logging settings if it's a StateMachine
28
+ *
29
+ * Enables X-Ray tracing for all state machines. For EXPRESS state machines that don't
30
+ * already have logging configured, automatically creates log groups and configures
31
+ * comprehensive logging with full execution data capture.
32
+ *
33
+ * @param node - The construct to potentially modify
34
+ */
35
+ visit(node: IConstruct): void;
36
+ }
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.StepFunctionsDefaultsAspect = void 0;
4
+ const aws_logs_1 = require("aws-cdk-lib/aws-logs");
5
+ const aws_stepfunctions_1 = require("aws-cdk-lib/aws-stepfunctions");
6
+ /**
7
+ * Aspect that automatically applies tracing and logging settings to Step Functions
8
+ *
9
+ * Visits all constructs in the scope and automatically applies X-Ray tracing to all
10
+ * state machines. For EXPRESS state machines, automatically creates log groups and
11
+ * configures comprehensive logging for enhanced observability.
12
+ *
13
+ * @example
14
+ * ```typescript
15
+ * // Apply configuration-specific defaults to all Step Functions
16
+ * Aspects.of(app).add(new StepFunctionDefaultsAspect());
17
+ *
18
+ * // Step Functions automatically inherit defaults
19
+ * new StateMachine(stack, 'MyWorkflow', {
20
+ * stateMachineType: StateMachineType.EXPRESS,
21
+ * definitionBody: DefinitionBody.fromFile('workflow.asl.yaml'),
22
+ * // tracing enabled and logging configured automatically for EXPRESS
23
+ * });
24
+ * ```
25
+ *
26
+ * @see https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_stepfunctions.StateMachine.html
27
+ */
28
+ class StepFunctionsDefaultsAspect {
29
+ /**
30
+ * Visits a construct and applies tracing and logging settings if it's a StateMachine
31
+ *
32
+ * Enables X-Ray tracing for all state machines. For EXPRESS state machines that don't
33
+ * already have logging configured, automatically creates log groups and configures
34
+ * comprehensive logging with full execution data capture.
35
+ *
36
+ * @param node - The construct to potentially modify
37
+ */
38
+ visit(node) {
39
+ if (node instanceof aws_stepfunctions_1.StateMachine) {
40
+ const cfnStateMachine = node.node.defaultChild;
41
+ if (cfnStateMachine) {
42
+ // Apply tracing if not already set
43
+ if (cfnStateMachine.tracingConfiguration === undefined) {
44
+ cfnStateMachine.tracingConfiguration = {
45
+ enabled: true,
46
+ };
47
+ }
48
+ // For EXPRESS state machines, configure logging if not already set
49
+ if (cfnStateMachine.stateMachineType === aws_stepfunctions_1.StateMachineType.EXPRESS &&
50
+ cfnStateMachine.loggingConfiguration === undefined) {
51
+ // Create a log group for the state machine
52
+ const logGroup = new aws_logs_1.LogGroup(node, "LogGroup", {
53
+ logGroupName: `/aws/vendedlogs/states/${node.node.id}`,
54
+ });
55
+ // Get the underlying CFN log group to access its ARN
56
+ const cfnLogGroup = logGroup.node.defaultChild;
57
+ cfnStateMachine.loggingConfiguration = {
58
+ destinations: [
59
+ {
60
+ cloudWatchLogsLogGroup: {
61
+ logGroupArn: cfnLogGroup.attrArn,
62
+ },
63
+ },
64
+ ],
65
+ level: aws_stepfunctions_1.LogLevel.ALL,
66
+ includeExecutionData: true,
67
+ };
68
+ }
69
+ }
70
+ }
71
+ }
72
+ }
73
+ exports.StepFunctionsDefaultsAspect = StepFunctionsDefaultsAspect;
74
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1mdW5jdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJzdGVwLWZ1bmN0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSxtREFBNkQ7QUFDN0QscUVBS3VDO0FBR3ZDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FxQkc7QUFDSCxNQUFhLDJCQUEyQjtJQUN0Qzs7Ozs7Ozs7T0FRRztJQUNILEtBQUssQ0FBQyxJQUFnQjtRQUNwQixJQUFJLElBQUksWUFBWSxnQ0FBWSxFQUFFLENBQUM7WUFDakMsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUErQixDQUFDO1lBRWxFLElBQUksZUFBZSxFQUFFLENBQUM7Z0JBQ3BCLG1DQUFtQztnQkFDbkMsSUFBSSxlQUFlLENBQUMsb0JBQW9CLEtBQUssU0FBUyxFQUFFLENBQUM7b0JBQ3ZELGVBQWUsQ0FBQyxvQkFBb0IsR0FBRzt3QkFDckMsT0FBTyxFQUFFLElBQUk7cUJBQ2QsQ0FBQztnQkFDSixDQUFDO2dCQUVELG1FQUFtRTtnQkFDbkUsSUFDRSxlQUFlLENBQUMsZ0JBQWdCLEtBQUssb0NBQWdCLENBQUMsT0FBTztvQkFDN0QsZUFBZSxDQUFDLG9CQUFvQixLQUFLLFNBQVMsRUFDbEQsQ0FBQztvQkFDRCwyQ0FBMkM7b0JBQzNDLE1BQU0sUUFBUSxHQUFHLElBQUksbUJBQVEsQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFO3dCQUM5QyxZQUFZLEVBQUUsMEJBQTBCLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFO3FCQUN2RCxDQUFDLENBQUM7b0JBRUgscURBQXFEO29CQUNyRCxNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLFlBQTJCLENBQUM7b0JBRTlELGVBQWUsQ0FBQyxvQkFBb0IsR0FBRzt3QkFDckMsWUFBWSxFQUFFOzRCQUNaO2dDQUNFLHNCQUFzQixFQUFFO29DQUN0QixXQUFXLEVBQUUsV0FBVyxDQUFDLE9BQU87aUNBQ2pDOzZCQUNGO3lCQUNGO3dCQUNELEtBQUssRUFBRSw0QkFBUSxDQUFDLEdBQUc7d0JBQ25CLG9CQUFvQixFQUFFLElBQUk7cUJBQzNCLENBQUM7Z0JBQ0osQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBbERELGtFQWtEQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHR5cGUgSUFzcGVjdCB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHsgQ2ZuTG9nR3JvdXAsIExvZ0dyb3VwIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1sb2dzXCI7XG5pbXBvcnQge1xuICBDZm5TdGF0ZU1hY2hpbmUsXG4gIExvZ0xldmVsLFxuICBTdGF0ZU1hY2hpbmUsXG4gIFN0YXRlTWFjaGluZVR5cGUsXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3Mtc3RlcGZ1bmN0aW9uc1wiO1xuaW1wb3J0IHsgSUNvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5cbi8qKlxuICogQXNwZWN0IHRoYXQgYXV0b21hdGljYWxseSBhcHBsaWVzIHRyYWNpbmcgYW5kIGxvZ2dpbmcgc2V0dGluZ3MgdG8gU3RlcCBGdW5jdGlvbnNcbiAqXG4gKiBWaXNpdHMgYWxsIGNvbnN0cnVjdHMgaW4gdGhlIHNjb3BlIGFuZCBhdXRvbWF0aWNhbGx5IGFwcGxpZXMgWC1SYXkgdHJhY2luZyB0byBhbGxcbiAqIHN0YXRlIG1hY2hpbmVzLiBGb3IgRVhQUkVTUyBzdGF0ZSBtYWNoaW5lcywgYXV0b21hdGljYWxseSBjcmVhdGVzIGxvZyBncm91cHMgYW5kXG4gKiBjb25maWd1cmVzIGNvbXByZWhlbnNpdmUgbG9nZ2luZyBmb3IgZW5oYW5jZWQgb2JzZXJ2YWJpbGl0eS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gQXBwbHkgY29uZmlndXJhdGlvbi1zcGVjaWZpYyBkZWZhdWx0cyB0byBhbGwgU3RlcCBGdW5jdGlvbnNcbiAqIEFzcGVjdHMub2YoYXBwKS5hZGQobmV3IFN0ZXBGdW5jdGlvbkRlZmF1bHRzQXNwZWN0KCkpO1xuICpcbiAqIC8vIFN0ZXAgRnVuY3Rpb25zIGF1dG9tYXRpY2FsbHkgaW5oZXJpdCBkZWZhdWx0c1xuICogbmV3IFN0YXRlTWFjaGluZShzdGFjaywgJ015V29ya2Zsb3cnLCB7XG4gKiAgIHN0YXRlTWFjaGluZVR5cGU6IFN0YXRlTWFjaGluZVR5cGUuRVhQUkVTUyxcbiAqICAgZGVmaW5pdGlvbkJvZHk6IERlZmluaXRpb25Cb2R5LmZyb21GaWxlKCd3b3JrZmxvdy5hc2wueWFtbCcpLFxuICogICAvLyB0cmFjaW5nIGVuYWJsZWQgYW5kIGxvZ2dpbmcgY29uZmlndXJlZCBhdXRvbWF0aWNhbGx5IGZvciBFWFBSRVNTXG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2Nkay9hcGkvdjIvZG9jcy9hd3MtY2RrLWxpYi5hd3Nfc3RlcGZ1bmN0aW9ucy5TdGF0ZU1hY2hpbmUuaHRtbFxuICovXG5leHBvcnQgY2xhc3MgU3RlcEZ1bmN0aW9uc0RlZmF1bHRzQXNwZWN0IGltcGxlbWVudHMgSUFzcGVjdCB7XG4gIC8qKlxuICAgKiBWaXNpdHMgYSBjb25zdHJ1Y3QgYW5kIGFwcGxpZXMgdHJhY2luZyBhbmQgbG9nZ2luZyBzZXR0aW5ncyBpZiBpdCdzIGEgU3RhdGVNYWNoaW5lXG4gICAqXG4gICAqIEVuYWJsZXMgWC1SYXkgdHJhY2luZyBmb3IgYWxsIHN0YXRlIG1hY2hpbmVzLiBGb3IgRVhQUkVTUyBzdGF0ZSBtYWNoaW5lcyB0aGF0IGRvbid0XG4gICAqIGFscmVhZHkgaGF2ZSBsb2dnaW5nIGNvbmZpZ3VyZWQsIGF1dG9tYXRpY2FsbHkgY3JlYXRlcyBsb2cgZ3JvdXBzIGFuZCBjb25maWd1cmVzXG4gICAqIGNvbXByZWhlbnNpdmUgbG9nZ2luZyB3aXRoIGZ1bGwgZXhlY3V0aW9uIGRhdGEgY2FwdHVyZS5cbiAgICpcbiAgICogQHBhcmFtIG5vZGUgLSBUaGUgY29uc3RydWN0IHRvIHBvdGVudGlhbGx5IG1vZGlmeVxuICAgKi9cbiAgdmlzaXQobm9kZTogSUNvbnN0cnVjdCk6IHZvaWQge1xuICAgIGlmIChub2RlIGluc3RhbmNlb2YgU3RhdGVNYWNoaW5lKSB7XG4gICAgICBjb25zdCBjZm5TdGF0ZU1hY2hpbmUgPSBub2RlLm5vZGUuZGVmYXVsdENoaWxkIGFzIENmblN0YXRlTWFjaGluZTtcblxuICAgICAgaWYgKGNmblN0YXRlTWFjaGluZSkge1xuICAgICAgICAvLyBBcHBseSB0cmFjaW5nIGlmIG5vdCBhbHJlYWR5IHNldFxuICAgICAgICBpZiAoY2ZuU3RhdGVNYWNoaW5lLnRyYWNpbmdDb25maWd1cmF0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBjZm5TdGF0ZU1hY2hpbmUudHJhY2luZ0NvbmZpZ3VyYXRpb24gPSB7XG4gICAgICAgICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBGb3IgRVhQUkVTUyBzdGF0ZSBtYWNoaW5lcywgY29uZmlndXJlIGxvZ2dpbmcgaWYgbm90IGFscmVhZHkgc2V0XG4gICAgICAgIGlmIChcbiAgICAgICAgICBjZm5TdGF0ZU1hY2hpbmUuc3RhdGVNYWNoaW5lVHlwZSA9PT0gU3RhdGVNYWNoaW5lVHlwZS5FWFBSRVNTICYmXG4gICAgICAgICAgY2ZuU3RhdGVNYWNoaW5lLmxvZ2dpbmdDb25maWd1cmF0aW9uID09PSB1bmRlZmluZWRcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gQ3JlYXRlIGEgbG9nIGdyb3VwIGZvciB0aGUgc3RhdGUgbWFjaGluZVxuICAgICAgICAgIGNvbnN0IGxvZ0dyb3VwID0gbmV3IExvZ0dyb3VwKG5vZGUsIFwiTG9nR3JvdXBcIiwge1xuICAgICAgICAgICAgbG9nR3JvdXBOYW1lOiBgL2F3cy92ZW5kZWRsb2dzL3N0YXRlcy8ke25vZGUubm9kZS5pZH1gLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8gR2V0IHRoZSB1bmRlcmx5aW5nIENGTiBsb2cgZ3JvdXAgdG8gYWNjZXNzIGl0cyBBUk5cbiAgICAgICAgICBjb25zdCBjZm5Mb2dHcm91cCA9IGxvZ0dyb3VwLm5vZGUuZGVmYXVsdENoaWxkIGFzIENmbkxvZ0dyb3VwO1xuXG4gICAgICAgICAgY2ZuU3RhdGVNYWNoaW5lLmxvZ2dpbmdDb25maWd1cmF0aW9uID0ge1xuICAgICAgICAgICAgZGVzdGluYXRpb25zOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjbG91ZFdhdGNoTG9nc0xvZ0dyb3VwOiB7XG4gICAgICAgICAgICAgICAgICBsb2dHcm91cEFybjogY2ZuTG9nR3JvdXAuYXR0ckFybixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIGxldmVsOiBMb2dMZXZlbC5BTEwsXG4gICAgICAgICAgICBpbmNsdWRlRXhlY3V0aW9uRGF0YTogdHJ1ZSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iXX0=
@@ -20,7 +20,7 @@ import { IConstruct } from "constructs";
20
20
  * Aspects.of(app).add(new VersionFunctionsAspect({ alias: 'PROD' }));
21
21
  * ```
22
22
  */
23
- export declare class VersionFunctionsAspect implements IAspect {
23
+ export declare class LambdaAndStepFunctionVersioningAspect implements IAspect {
24
24
  private readonly props;
25
25
  /**
26
26
  * Creates a new VersionFunctionsAspect
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LambdaAndStepFunctionVersioningAspect = void 0;
4
+ const aws_lambda_1 = require("aws-cdk-lib/aws-lambda");
5
+ const aws_stepfunctions_1 = require("aws-cdk-lib/aws-stepfunctions");
6
+ /**
7
+ * Aspect that automatically adds versioning and aliases to Lambda and Step Functions
8
+ *
9
+ * Visits all constructs in the scope and automatically creates versions and aliases
10
+ * for supported resource types. This enables blue-green deployments, traffic shifting,
11
+ * and provides stable ARNs for external integrations.
12
+ *
13
+ * Currently supports:
14
+ * - Lambda Functions: Creates function aliases
15
+ * - Step Functions: Creates versions and aliases with 100% traffic routing
16
+ *
17
+ * @example
18
+ * ```typescript
19
+ * // Apply to entire app for automatic versioning
20
+ * Aspects.of(app).add(new VersionFunctionsAspect());
21
+ *
22
+ * // Or with custom alias name
23
+ * Aspects.of(app).add(new VersionFunctionsAspect({ alias: 'PROD' }));
24
+ * ```
25
+ */
26
+ class LambdaAndStepFunctionVersioningAspect {
27
+ /**
28
+ * Creates a new VersionFunctionsAspect
29
+ *
30
+ * @param props - Configuration for the aspect
31
+ * @param props.alias - Name for the alias to create. Defaults to 'LATEST'
32
+ */
33
+ constructor(props = {
34
+ alias: "LATEST",
35
+ }) {
36
+ this.props = props;
37
+ }
38
+ /**
39
+ * Visits a construct and applies versioning if it's a supported resource type
40
+ *
41
+ * For Lambda Functions: Adds a function alias pointing to $LATEST
42
+ * For Step Functions: Creates a version and alias with 100% traffic routing
43
+ *
44
+ * @param node - The construct to potentially add versioning to
45
+ */
46
+ visit(node) {
47
+ if (node instanceof aws_stepfunctions_1.StateMachine) {
48
+ const version = new aws_stepfunctions_1.CfnStateMachineVersion(node, `Version`, {
49
+ stateMachineArn: node.stateMachineArn,
50
+ });
51
+ new aws_stepfunctions_1.CfnStateMachineAlias(node, `Alias`, {
52
+ name: this.props.alias,
53
+ routingConfiguration: [
54
+ {
55
+ stateMachineVersionArn: version.attrArn,
56
+ weight: 100,
57
+ },
58
+ ],
59
+ });
60
+ }
61
+ if (node instanceof aws_lambda_1.Function) {
62
+ node.addAlias(this.props.alias);
63
+ }
64
+ }
65
+ }
66
+ exports.LambdaAndStepFunctionVersioningAspect = LambdaAndStepFunctionVersioningAspect;
67
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGFtYmRhLXNmbi12ZXJzaW9uaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsibGFtYmRhLXNmbi12ZXJzaW9uaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLHVEQUFrRDtBQUNsRCxxRUFJdUM7QUFHdkM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQkc7QUFDSCxNQUFhLHFDQUFxQztJQUNoRDs7Ozs7T0FLRztJQUNILFlBQ21CLFFBRWI7UUFDRixLQUFLLEVBQUUsUUFBUTtLQUNoQjtRQUpnQixVQUFLLEdBQUwsS0FBSyxDQUlyQjtJQUNBLENBQUM7SUFFSjs7Ozs7OztPQU9HO0lBQ0gsS0FBSyxDQUFDLElBQWdCO1FBQ3BCLElBQUksSUFBSSxZQUFZLGdDQUFZLEVBQUUsQ0FBQztZQUNqQyxNQUFNLE9BQU8sR0FBRyxJQUFJLDBDQUFzQixDQUFDLElBQUksRUFBRSxTQUFTLEVBQUU7Z0JBQzFELGVBQWUsRUFBRSxJQUFJLENBQUMsZUFBZTthQUN0QyxDQUFDLENBQUM7WUFFSCxJQUFJLHdDQUFvQixDQUFDLElBQUksRUFBRSxPQUFPLEVBQUU7Z0JBQ3RDLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUs7Z0JBQ3RCLG9CQUFvQixFQUFFO29CQUNwQjt3QkFDRSxzQkFBc0IsRUFBRSxPQUFPLENBQUMsT0FBTzt3QkFDdkMsTUFBTSxFQUFFLEdBQUc7cUJBQ1o7aUJBQ0Y7YUFDRixDQUFDLENBQUM7UUFDTCxDQUFDO1FBRUQsSUFBSSxJQUFJLFlBQVkscUJBQVEsRUFBRSxDQUFDO1lBQzdCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNsQyxDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBNUNELHNGQTRDQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgSUFzcGVjdCB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHsgRnVuY3Rpb24gfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxhbWJkYVwiO1xuaW1wb3J0IHtcbiAgQ2ZuU3RhdGVNYWNoaW5lQWxpYXMsXG4gIENmblN0YXRlTWFjaGluZVZlcnNpb24sXG4gIFN0YXRlTWFjaGluZSxcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1zdGVwZnVuY3Rpb25zXCI7XG5pbXBvcnQgeyBJQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcblxuLyoqXG4gKiBBc3BlY3QgdGhhdCBhdXRvbWF0aWNhbGx5IGFkZHMgdmVyc2lvbmluZyBhbmQgYWxpYXNlcyB0byBMYW1iZGEgYW5kIFN0ZXAgRnVuY3Rpb25zXG4gKlxuICogVmlzaXRzIGFsbCBjb25zdHJ1Y3RzIGluIHRoZSBzY29wZSBhbmQgYXV0b21hdGljYWxseSBjcmVhdGVzIHZlcnNpb25zIGFuZCBhbGlhc2VzXG4gKiBmb3Igc3VwcG9ydGVkIHJlc291cmNlIHR5cGVzLiBUaGlzIGVuYWJsZXMgYmx1ZS1ncmVlbiBkZXBsb3ltZW50cywgdHJhZmZpYyBzaGlmdGluZyxcbiAqIGFuZCBwcm92aWRlcyBzdGFibGUgQVJOcyBmb3IgZXh0ZXJuYWwgaW50ZWdyYXRpb25zLlxuICpcbiAqIEN1cnJlbnRseSBzdXBwb3J0czpcbiAqIC0gTGFtYmRhIEZ1bmN0aW9uczogQ3JlYXRlcyBmdW5jdGlvbiBhbGlhc2VzXG4gKiAtIFN0ZXAgRnVuY3Rpb25zOiBDcmVhdGVzIHZlcnNpb25zIGFuZCBhbGlhc2VzIHdpdGggMTAwJSB0cmFmZmljIHJvdXRpbmdcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gQXBwbHkgdG8gZW50aXJlIGFwcCBmb3IgYXV0b21hdGljIHZlcnNpb25pbmdcbiAqIEFzcGVjdHMub2YoYXBwKS5hZGQobmV3IFZlcnNpb25GdW5jdGlvbnNBc3BlY3QoKSk7XG4gKlxuICogLy8gT3Igd2l0aCBjdXN0b20gYWxpYXMgbmFtZVxuICogQXNwZWN0cy5vZihhcHApLmFkZChuZXcgVmVyc2lvbkZ1bmN0aW9uc0FzcGVjdCh7IGFsaWFzOiAnUFJPRCcgfSkpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBMYW1iZGFBbmRTdGVwRnVuY3Rpb25WZXJzaW9uaW5nQXNwZWN0IGltcGxlbWVudHMgSUFzcGVjdCB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IFZlcnNpb25GdW5jdGlvbnNBc3BlY3RcbiAgICpcbiAgICogQHBhcmFtIHByb3BzIC0gQ29uZmlndXJhdGlvbiBmb3IgdGhlIGFzcGVjdFxuICAgKiBAcGFyYW0gcHJvcHMuYWxpYXMgLSBOYW1lIGZvciB0aGUgYWxpYXMgdG8gY3JlYXRlLiBEZWZhdWx0cyB0byAnTEFURVNUJ1xuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBwcm9wczoge1xuICAgICAgYWxpYXM6IHN0cmluZztcbiAgICB9ID0ge1xuICAgICAgYWxpYXM6IFwiTEFURVNUXCIsXG4gICAgfVxuICApIHt9XG5cbiAgLyoqXG4gICAqIFZpc2l0cyBhIGNvbnN0cnVjdCBhbmQgYXBwbGllcyB2ZXJzaW9uaW5nIGlmIGl0J3MgYSBzdXBwb3J0ZWQgcmVzb3VyY2UgdHlwZVxuICAgKlxuICAgKiBGb3IgTGFtYmRhIEZ1bmN0aW9uczogQWRkcyBhIGZ1bmN0aW9uIGFsaWFzIHBvaW50aW5nIHRvICRMQVRFU1RcbiAgICogRm9yIFN0ZXAgRnVuY3Rpb25zOiBDcmVhdGVzIGEgdmVyc2lvbiBhbmQgYWxpYXMgd2l0aCAxMDAlIHRyYWZmaWMgcm91dGluZ1xuICAgKlxuICAgKiBAcGFyYW0gbm9kZSAtIFRoZSBjb25zdHJ1Y3QgdG8gcG90ZW50aWFsbHkgYWRkIHZlcnNpb25pbmcgdG9cbiAgICovXG4gIHZpc2l0KG5vZGU6IElDb25zdHJ1Y3QpOiB2b2lkIHtcbiAgICBpZiAobm9kZSBpbnN0YW5jZW9mIFN0YXRlTWFjaGluZSkge1xuICAgICAgY29uc3QgdmVyc2lvbiA9IG5ldyBDZm5TdGF0ZU1hY2hpbmVWZXJzaW9uKG5vZGUsIGBWZXJzaW9uYCwge1xuICAgICAgICBzdGF0ZU1hY2hpbmVBcm46IG5vZGUuc3RhdGVNYWNoaW5lQXJuLFxuICAgICAgfSk7XG5cbiAgICAgIG5ldyBDZm5TdGF0ZU1hY2hpbmVBbGlhcyhub2RlLCBgQWxpYXNgLCB7XG4gICAgICAgIG5hbWU6IHRoaXMucHJvcHMuYWxpYXMsXG4gICAgICAgIHJvdXRpbmdDb25maWd1cmF0aW9uOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgc3RhdGVNYWNoaW5lVmVyc2lvbkFybjogdmVyc2lvbi5hdHRyQXJuLFxuICAgICAgICAgICAgd2VpZ2h0OiAxMDAsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChub2RlIGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcbiAgICAgIG5vZGUuYWRkQWxpYXModGhpcy5wcm9wcy5hbGlhcyk7XG4gICAgfVxuICB9XG59XG4iXX0=
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aligent/cdk-aspects",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "Collection of CDK Asppects",
5
5
  "main": "index.js",
6
6
  "types": "index.d.ts",
@@ -1,67 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.VersionFunctionsAspect = void 0;
4
- const aws_lambda_1 = require("aws-cdk-lib/aws-lambda");
5
- const aws_stepfunctions_1 = require("aws-cdk-lib/aws-stepfunctions");
6
- /**
7
- * Aspect that automatically adds versioning and aliases to Lambda and Step Functions
8
- *
9
- * Visits all constructs in the scope and automatically creates versions and aliases
10
- * for supported resource types. This enables blue-green deployments, traffic shifting,
11
- * and provides stable ARNs for external integrations.
12
- *
13
- * Currently supports:
14
- * - Lambda Functions: Creates function aliases
15
- * - Step Functions: Creates versions and aliases with 100% traffic routing
16
- *
17
- * @example
18
- * ```typescript
19
- * // Apply to entire app for automatic versioning
20
- * Aspects.of(app).add(new VersionFunctionsAspect());
21
- *
22
- * // Or with custom alias name
23
- * Aspects.of(app).add(new VersionFunctionsAspect({ alias: 'PROD' }));
24
- * ```
25
- */
26
- class VersionFunctionsAspect {
27
- /**
28
- * Creates a new VersionFunctionsAspect
29
- *
30
- * @param props - Configuration for the aspect
31
- * @param props.alias - Name for the alias to create. Defaults to 'LATEST'
32
- */
33
- constructor(props = {
34
- alias: "LATEST",
35
- }) {
36
- this.props = props;
37
- }
38
- /**
39
- * Visits a construct and applies versioning if it's a supported resource type
40
- *
41
- * For Lambda Functions: Adds a function alias pointing to $LATEST
42
- * For Step Functions: Creates a version and alias with 100% traffic routing
43
- *
44
- * @param node - The construct to potentially add versioning to
45
- */
46
- visit(node) {
47
- if (node instanceof aws_stepfunctions_1.StateMachine) {
48
- const version = new aws_stepfunctions_1.CfnStateMachineVersion(node, `Version`, {
49
- stateMachineArn: node.stateMachineArn,
50
- });
51
- new aws_stepfunctions_1.CfnStateMachineAlias(node, `Alias`, {
52
- name: this.props.alias,
53
- routingConfiguration: [
54
- {
55
- stateMachineVersionArn: version.attrArn,
56
- weight: 100,
57
- },
58
- ],
59
- });
60
- }
61
- if (node instanceof aws_lambda_1.Function) {
62
- node.addAlias(this.props.alias);
63
- }
64
- }
65
- }
66
- exports.VersionFunctionsAspect = VersionFunctionsAspect;
67
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi1mdW5jdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ2ZXJzaW9uLWZ1bmN0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSx1REFBa0Q7QUFDbEQscUVBSXVDO0FBR3ZDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHO0FBQ0gsTUFBYSxzQkFBc0I7SUFDakM7Ozs7O09BS0c7SUFDSCxZQUNtQixRQUViO1FBQ0YsS0FBSyxFQUFFLFFBQVE7S0FDaEI7UUFKZ0IsVUFBSyxHQUFMLEtBQUssQ0FJckI7SUFDQSxDQUFDO0lBRUo7Ozs7Ozs7T0FPRztJQUNILEtBQUssQ0FBQyxJQUFnQjtRQUNwQixJQUFJLElBQUksWUFBWSxnQ0FBWSxFQUFFLENBQUM7WUFDakMsTUFBTSxPQUFPLEdBQUcsSUFBSSwwQ0FBc0IsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFO2dCQUMxRCxlQUFlLEVBQUUsSUFBSSxDQUFDLGVBQWU7YUFDdEMsQ0FBQyxDQUFDO1lBRUgsSUFBSSx3Q0FBb0IsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFO2dCQUN0QyxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLO2dCQUN0QixvQkFBb0IsRUFBRTtvQkFDcEI7d0JBQ0Usc0JBQXNCLEVBQUUsT0FBTyxDQUFDLE9BQU87d0JBQ3ZDLE1BQU0sRUFBRSxHQUFHO3FCQUNaO2lCQUNGO2FBQ0YsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVELElBQUksSUFBSSxZQUFZLHFCQUFRLEVBQUUsQ0FBQztZQUM3QixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbEMsQ0FBQztJQUNILENBQUM7Q0FDRjtBQTVDRCx3REE0Q0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IElBc3BlY3QgfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7IEZ1bmN0aW9uIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1sYW1iZGFcIjtcbmltcG9ydCB7XG4gIENmblN0YXRlTWFjaGluZUFsaWFzLFxuICBDZm5TdGF0ZU1hY2hpbmVWZXJzaW9uLFxuICBTdGF0ZU1hY2hpbmUsXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3Mtc3RlcGZ1bmN0aW9uc1wiO1xuaW1wb3J0IHsgSUNvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5cbi8qKlxuICogQXNwZWN0IHRoYXQgYXV0b21hdGljYWxseSBhZGRzIHZlcnNpb25pbmcgYW5kIGFsaWFzZXMgdG8gTGFtYmRhIGFuZCBTdGVwIEZ1bmN0aW9uc1xuICpcbiAqIFZpc2l0cyBhbGwgY29uc3RydWN0cyBpbiB0aGUgc2NvcGUgYW5kIGF1dG9tYXRpY2FsbHkgY3JlYXRlcyB2ZXJzaW9ucyBhbmQgYWxpYXNlc1xuICogZm9yIHN1cHBvcnRlZCByZXNvdXJjZSB0eXBlcy4gVGhpcyBlbmFibGVzIGJsdWUtZ3JlZW4gZGVwbG95bWVudHMsIHRyYWZmaWMgc2hpZnRpbmcsXG4gKiBhbmQgcHJvdmlkZXMgc3RhYmxlIEFSTnMgZm9yIGV4dGVybmFsIGludGVncmF0aW9ucy5cbiAqXG4gKiBDdXJyZW50bHkgc3VwcG9ydHM6XG4gKiAtIExhbWJkYSBGdW5jdGlvbnM6IENyZWF0ZXMgZnVuY3Rpb24gYWxpYXNlc1xuICogLSBTdGVwIEZ1bmN0aW9uczogQ3JlYXRlcyB2ZXJzaW9ucyBhbmQgYWxpYXNlcyB3aXRoIDEwMCUgdHJhZmZpYyByb3V0aW5nXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIEFwcGx5IHRvIGVudGlyZSBhcHAgZm9yIGF1dG9tYXRpYyB2ZXJzaW9uaW5nXG4gKiBBc3BlY3RzLm9mKGFwcCkuYWRkKG5ldyBWZXJzaW9uRnVuY3Rpb25zQXNwZWN0KCkpO1xuICpcbiAqIC8vIE9yIHdpdGggY3VzdG9tIGFsaWFzIG5hbWVcbiAqIEFzcGVjdHMub2YoYXBwKS5hZGQobmV3IFZlcnNpb25GdW5jdGlvbnNBc3BlY3QoeyBhbGlhczogJ1BST0QnIH0pKTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgVmVyc2lvbkZ1bmN0aW9uc0FzcGVjdCBpbXBsZW1lbnRzIElBc3BlY3Qge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBWZXJzaW9uRnVuY3Rpb25zQXNwZWN0XG4gICAqXG4gICAqIEBwYXJhbSBwcm9wcyAtIENvbmZpZ3VyYXRpb24gZm9yIHRoZSBhc3BlY3RcbiAgICogQHBhcmFtIHByb3BzLmFsaWFzIC0gTmFtZSBmb3IgdGhlIGFsaWFzIHRvIGNyZWF0ZS4gRGVmYXVsdHMgdG8gJ0xBVEVTVCdcbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcHJvcHM6IHtcbiAgICAgIGFsaWFzOiBzdHJpbmc7XG4gICAgfSA9IHtcbiAgICAgIGFsaWFzOiBcIkxBVEVTVFwiLFxuICAgIH1cbiAgKSB7fVxuXG4gIC8qKlxuICAgKiBWaXNpdHMgYSBjb25zdHJ1Y3QgYW5kIGFwcGxpZXMgdmVyc2lvbmluZyBpZiBpdCdzIGEgc3VwcG9ydGVkIHJlc291cmNlIHR5cGVcbiAgICpcbiAgICogRm9yIExhbWJkYSBGdW5jdGlvbnM6IEFkZHMgYSBmdW5jdGlvbiBhbGlhcyBwb2ludGluZyB0byAkTEFURVNUXG4gICAqIEZvciBTdGVwIEZ1bmN0aW9uczogQ3JlYXRlcyBhIHZlcnNpb24gYW5kIGFsaWFzIHdpdGggMTAwJSB0cmFmZmljIHJvdXRpbmdcbiAgICpcbiAgICogQHBhcmFtIG5vZGUgLSBUaGUgY29uc3RydWN0IHRvIHBvdGVudGlhbGx5IGFkZCB2ZXJzaW9uaW5nIHRvXG4gICAqL1xuICB2aXNpdChub2RlOiBJQ29uc3RydWN0KTogdm9pZCB7XG4gICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBTdGF0ZU1hY2hpbmUpIHtcbiAgICAgIGNvbnN0IHZlcnNpb24gPSBuZXcgQ2ZuU3RhdGVNYWNoaW5lVmVyc2lvbihub2RlLCBgVmVyc2lvbmAsIHtcbiAgICAgICAgc3RhdGVNYWNoaW5lQXJuOiBub2RlLnN0YXRlTWFjaGluZUFybixcbiAgICAgIH0pO1xuXG4gICAgICBuZXcgQ2ZuU3RhdGVNYWNoaW5lQWxpYXMobm9kZSwgYEFsaWFzYCwge1xuICAgICAgICBuYW1lOiB0aGlzLnByb3BzLmFsaWFzLFxuICAgICAgICByb3V0aW5nQ29uZmlndXJhdGlvbjogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHN0YXRlTWFjaGluZVZlcnNpb25Bcm46IHZlcnNpb24uYXR0ckFybixcbiAgICAgICAgICAgIHdlaWdodDogMTAwLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAobm9kZSBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG4gICAgICBub2RlLmFkZEFsaWFzKHRoaXMucHJvcHMuYWxpYXMpO1xuICAgIH1cbiAgfVxufVxuIl19