@composurecdk/lambda 0.6.0 → 0.8.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.
Files changed (81) hide show
  1. package/README.md +138 -6
  2. package/dist/{alarm-config.d.ts → commonjs/alarm-config.d.ts} +30 -0
  3. package/dist/commonjs/alarm-config.d.ts.map +1 -0
  4. package/dist/commonjs/alarm-config.js +3 -0
  5. package/dist/{alarm-config.js.map → commonjs/alarm-config.js.map} +1 -1
  6. package/dist/{alarm-defaults.d.ts → commonjs/alarm-defaults.d.ts} +2 -0
  7. package/dist/commonjs/alarm-defaults.d.ts.map +1 -0
  8. package/dist/commonjs/alarm-defaults.js +61 -0
  9. package/dist/commonjs/alarm-defaults.js.map +1 -0
  10. package/dist/commonjs/defaults.d.ts.map +1 -0
  11. package/dist/commonjs/defaults.js +23 -0
  12. package/dist/commonjs/defaults.js.map +1 -0
  13. package/dist/commonjs/event-sources/composure-event-source.d.ts +76 -0
  14. package/dist/commonjs/event-sources/composure-event-source.d.ts.map +1 -0
  15. package/dist/commonjs/event-sources/composure-event-source.js +36 -0
  16. package/dist/commonjs/event-sources/composure-event-source.js.map +1 -0
  17. package/dist/commonjs/event-sources/sqs-event-source.d.ts +54 -0
  18. package/dist/commonjs/event-sources/sqs-event-source.d.ts.map +1 -0
  19. package/dist/commonjs/event-sources/sqs-event-source.js +80 -0
  20. package/dist/commonjs/event-sources/sqs-event-source.js.map +1 -0
  21. package/dist/{function-alarms.d.ts → commonjs/function-alarms.d.ts} +5 -2
  22. package/dist/commonjs/function-alarms.d.ts.map +1 -0
  23. package/dist/commonjs/function-alarms.js +191 -0
  24. package/dist/commonjs/function-alarms.js.map +1 -0
  25. package/dist/commonjs/function-builder.d.ts +252 -0
  26. package/dist/commonjs/function-builder.d.ts.map +1 -0
  27. package/dist/commonjs/function-builder.js +233 -0
  28. package/dist/commonjs/function-builder.js.map +1 -0
  29. package/dist/{index.d.ts → commonjs/index.d.ts} +2 -0
  30. package/dist/commonjs/index.d.ts.map +1 -0
  31. package/dist/commonjs/index.js +13 -0
  32. package/dist/commonjs/index.js.map +1 -0
  33. package/dist/commonjs/package.json +3 -0
  34. package/dist/esm/alarm-config.d.ts +114 -0
  35. package/dist/esm/alarm-config.d.ts.map +1 -0
  36. package/dist/esm/alarm-config.js.map +1 -0
  37. package/dist/esm/alarm-defaults.d.ts +19 -0
  38. package/dist/esm/alarm-defaults.d.ts.map +1 -0
  39. package/dist/{alarm-defaults.js → esm/alarm-defaults.js} +14 -0
  40. package/dist/esm/alarm-defaults.js.map +1 -0
  41. package/dist/esm/defaults.d.ts +8 -0
  42. package/dist/esm/defaults.d.ts.map +1 -0
  43. package/dist/esm/defaults.js.map +1 -0
  44. package/dist/esm/event-sources/composure-event-source.d.ts +76 -0
  45. package/dist/esm/event-sources/composure-event-source.d.ts.map +1 -0
  46. package/dist/esm/event-sources/composure-event-source.js +31 -0
  47. package/dist/esm/event-sources/composure-event-source.js.map +1 -0
  48. package/dist/esm/event-sources/sqs-event-source.d.ts +54 -0
  49. package/dist/esm/event-sources/sqs-event-source.d.ts.map +1 -0
  50. package/dist/esm/event-sources/sqs-event-source.js +76 -0
  51. package/dist/esm/event-sources/sqs-event-source.js.map +1 -0
  52. package/dist/esm/function-alarms.d.ts +31 -0
  53. package/dist/esm/function-alarms.d.ts.map +1 -0
  54. package/dist/{function-alarms.js → esm/function-alarms.js} +69 -4
  55. package/dist/esm/function-alarms.js.map +1 -0
  56. package/dist/esm/function-builder.d.ts +252 -0
  57. package/dist/esm/function-builder.d.ts.map +1 -0
  58. package/dist/esm/function-builder.js +230 -0
  59. package/dist/esm/function-builder.js.map +1 -0
  60. package/dist/esm/index.d.ts +7 -0
  61. package/dist/esm/index.d.ts.map +1 -0
  62. package/dist/{index.js → esm/index.js} +1 -0
  63. package/dist/esm/index.js.map +1 -0
  64. package/dist/esm/package.json +3 -0
  65. package/package.json +38 -17
  66. package/dist/alarm-config.d.ts.map +0 -1
  67. package/dist/alarm-defaults.d.ts.map +0 -1
  68. package/dist/alarm-defaults.js.map +0 -1
  69. package/dist/defaults.d.ts.map +0 -1
  70. package/dist/defaults.js.map +0 -1
  71. package/dist/function-alarms.d.ts.map +0 -1
  72. package/dist/function-alarms.js.map +0 -1
  73. package/dist/function-builder.d.ts +0 -137
  74. package/dist/function-builder.d.ts.map +0 -1
  75. package/dist/function-builder.js +0 -62
  76. package/dist/function-builder.js.map +0 -1
  77. package/dist/index.d.ts.map +0 -1
  78. package/dist/index.js.map +0 -1
  79. /package/dist/{defaults.d.ts → commonjs/defaults.d.ts} +0 -0
  80. /package/dist/{alarm-config.js → esm/alarm-config.js} +0 -0
  81. /package/dist/{defaults.js → esm/defaults.js} +0 -0
@@ -0,0 +1,230 @@
1
+ import { ManagedPolicy } from "aws-cdk-lib/aws-iam";
2
+ import { Function as LambdaFunction, } from "aws-cdk-lib/aws-lambda";
3
+ import { COPY_STATE, resolve } from "@composurecdk/core";
4
+ import { taggedBuilder } from "@composurecdk/cloudformation";
5
+ import { AlarmDefinitionBuilder } from "@composurecdk/cloudwatch";
6
+ import { createServiceRoleBuilder, createStatementBuilder, } from "@composurecdk/iam";
7
+ import { createLogGroupBuilder } from "@composurecdk/logs";
8
+ import { createFunctionAlarms } from "./function-alarms.js";
9
+ import { FUNCTION_DEFAULTS } from "./defaults.js";
10
+ import { EVENT_SOURCE_MAPPING_ID_READERS, isComposureEventSource, } from "./event-sources/composure-event-source.js";
11
+ const LOGS_WRITER_POLICY_NAME = "LogsWriter";
12
+ class FunctionBuilder {
13
+ props = {};
14
+ #customAlarms = [];
15
+ #eventSources = [];
16
+ #configureRole;
17
+ #useCdkAutoRole = false;
18
+ addAlarm(key, configure) {
19
+ this.#customAlarms.push(configure(new AlarmDefinitionBuilder(key)));
20
+ return this;
21
+ }
22
+ /**
23
+ * Register an event source to be attached to the function at build time.
24
+ *
25
+ * A Lambda function can have many event sources of mixed types, so this
26
+ * hook is repeatable and typed to the common {@link IEventSource}. Pass a
27
+ * {@link ComposureEventSource} from a ComposureCDK factory (e.g. {@link sqsEventSource})
28
+ * or a bare concrete {@link IEventSource}.
29
+ *
30
+ * At build time the source is resolved and attached *after* the function
31
+ * (and its least-privilege execution role) exist, so the `source.bind(fn)`
32
+ * that `addEventSource` performs grants the consume permission onto the
33
+ * builder's role. The resolved source is exposed on
34
+ * {@link FunctionBuilderResult.eventSources} under `key`.
35
+ *
36
+ * Sources built by a recognised factory also enable contextual alarms —
37
+ * see {@link FunctionBuilderProps.recommendedAlarms}.
38
+ *
39
+ * @throws If `key` was already used by a previous `addEventSource` call.
40
+ */
41
+ addEventSource(key, source) {
42
+ if (this.#eventSources.some((e) => e.key === key)) {
43
+ throw new Error(`FunctionBuilder.addEventSource: duplicate key "${key}". Each event source must use a unique key.`);
44
+ }
45
+ this.#eventSources.push({ key, source });
46
+ return this;
47
+ }
48
+ /**
49
+ * Extend the default execution-role builder with additional configuration
50
+ * (inline policies, managed-policy attachments, description, etc.).
51
+ *
52
+ * The callback receives the internal {@link IRoleBuilder} that the function
53
+ * builder will use to construct the role. Calling `configureRole` more than
54
+ * once replaces the previous callback. The default `LogsWriter` inline
55
+ * policy is added before the callback runs; supplying another inline
56
+ * policy with the name `LogsWriter` throws at build time.
57
+ *
58
+ * Mutually exclusive with {@link role} and {@link useCdkAutoRole}.
59
+ */
60
+ configureRole(fn) {
61
+ this.#configureRole = fn;
62
+ return this;
63
+ }
64
+ /**
65
+ * Opt back into CDK's auto-created execution role attached to the
66
+ * `AWSLambdaBasicExecutionRole` managed policy.
67
+ *
68
+ * **Not the recommended path.** The default builder-created role grants
69
+ * `logs:CreateLogStream` and `logs:PutLogEvents` scoped to the function's
70
+ * own log group; CDK's auto-role grants those actions on `*` and also
71
+ * permits `logs:CreateLogGroup` arbitrarily. Use this escape hatch only
72
+ * when matching an existing stack's logical IDs during a phased migration
73
+ * or when the wildcard log surface is a deliberate trade-off.
74
+ *
75
+ * Mutually exclusive with {@link role} and {@link configureRole}.
76
+ */
77
+ useCdkAutoRole() {
78
+ this.#useCdkAutoRole = true;
79
+ return this;
80
+ }
81
+ /** @internal — see ADR-0005. */
82
+ [COPY_STATE](target) {
83
+ target.#customAlarms.push(...this.#customAlarms);
84
+ target.#eventSources.push(...this.#eventSources);
85
+ target.#configureRole = this.#configureRole;
86
+ target.#useCdkAutoRole = this.#useCdkAutoRole;
87
+ }
88
+ build(scope, id, context = {}) {
89
+ const { role: roleResolvable, recommendedAlarms: alarmConfig, ...functionProps } = this.props;
90
+ const seamCount = (roleResolvable !== undefined ? 1 : 0) +
91
+ (this.#configureRole !== undefined ? 1 : 0) +
92
+ (this.#useCdkAutoRole ? 1 : 0);
93
+ if (seamCount > 1) {
94
+ throw new Error(`FunctionBuilder "${id}": .role(), .configureRole(), and .useCdkAutoRole() are mutually exclusive`);
95
+ }
96
+ let logGroup;
97
+ let logGroupProps = {};
98
+ if (!this.props.logGroup) {
99
+ logGroup = createLogGroupBuilder().build(scope, `${id}LogGroup`).logGroup;
100
+ logGroupProps = { logGroup };
101
+ }
102
+ let role;
103
+ if (roleResolvable !== undefined) {
104
+ role = resolve(roleResolvable, context);
105
+ }
106
+ else if (!this.#useCdkAutoRole) {
107
+ role = this.#buildDefaultRole(scope, id, context, (logGroup ?? this.props.logGroup));
108
+ }
109
+ const mergedProps = {
110
+ ...FUNCTION_DEFAULTS,
111
+ ...logGroupProps,
112
+ ...functionProps,
113
+ ...(role ? { role } : {}),
114
+ };
115
+ const fn = new LambdaFunction(scope, id, mergedProps);
116
+ const eventSources = {};
117
+ const attachedEventSources = [];
118
+ for (const entry of this.#eventSources) {
119
+ const outer = resolve(entry.source, context);
120
+ let kind = "unknown";
121
+ let eventSource;
122
+ if (isComposureEventSource(outer)) {
123
+ kind = outer.kind;
124
+ eventSource = resolve(outer.source, context);
125
+ }
126
+ else {
127
+ eventSource = outer;
128
+ }
129
+ // Attach after the function exists so the `source.bind(fn)` that
130
+ // `addEventSource` performs grants the consume permission onto the
131
+ // builder's least-privilege role; the mapping UUID is only readable
132
+ // once bound.
133
+ fn.addEventSource(eventSource);
134
+ eventSources[entry.key] = eventSource;
135
+ attachedEventSources.push({
136
+ key: entry.key,
137
+ kind,
138
+ eventSourceMappingId: EVENT_SOURCE_MAPPING_ID_READERS[kind]?.(eventSource),
139
+ });
140
+ }
141
+ const alarms = createFunctionAlarms(scope, id, fn, alarmConfig, mergedProps, attachedEventSources, this.#customAlarms);
142
+ const resolvedRole = role ?? fn.role;
143
+ if (!resolvedRole) {
144
+ throw new Error(`FunctionBuilder "${id}": Lambda function has no execution role.`);
145
+ }
146
+ return { function: fn, role: resolvedRole, logGroup, alarms, eventSources };
147
+ }
148
+ #buildDefaultRole(scope, id, context, logGroup) {
149
+ if (!logGroup) {
150
+ throw new Error(`FunctionBuilder "${id}": cannot build the default execution role without a log group.`);
151
+ }
152
+ const logGroupArn = logGroup.logGroupArn;
153
+ const roleBuilder = createServiceRoleBuilder("lambda.amazonaws.com").addInlinePolicyStatements(LOGS_WRITER_POLICY_NAME, [
154
+ createStatementBuilder()
155
+ .allow()
156
+ .actions(["logs:CreateLogStream", "logs:PutLogEvents"])
157
+ .resources([logGroupArn, `${logGroupArn}:log-stream:*`]),
158
+ ]);
159
+ // CDK attaches AWSLambdaVPCAccessExecutionRole only when it constructs
160
+ // the role itself; when we supply the role we must add it ourselves.
161
+ if (this.props.vpc) {
162
+ roleBuilder.managedPolicies([
163
+ ...(roleBuilder.managedPolicies() ?? []),
164
+ ManagedPolicy.fromAwsManagedPolicyName("service-role/AWSLambdaVPCAccessExecutionRole"),
165
+ ]);
166
+ }
167
+ if (this.#configureRole) {
168
+ this.#configureRole(guardLogsWriter(roleBuilder, id));
169
+ }
170
+ return roleBuilder.build(scope, `${id}ExecutionRole`, context).role;
171
+ }
172
+ }
173
+ /**
174
+ * Creates a new {@link IFunctionBuilder} for configuring an AWS Lambda function.
175
+ *
176
+ * This is the entry point for defining a Lambda function component. The returned
177
+ * builder exposes every {@link FunctionBuilderProps} property as a fluent setter/getter
178
+ * and implements {@link Lifecycle} for use with {@link compose}.
179
+ *
180
+ * @returns A fluent builder for an AWS Lambda function.
181
+ *
182
+ * @example
183
+ * ```ts
184
+ * const handler = createFunctionBuilder()
185
+ * .runtime(Runtime.NODEJS_22_X)
186
+ * .handler("index.handler")
187
+ * .code(Code.fromAsset("lambda"))
188
+ * .timeout(Duration.seconds(30));
189
+ *
190
+ * // Use standalone:
191
+ * const result = handler.build(stack, "MyFunction");
192
+ *
193
+ * // Or compose into a system:
194
+ * const system = compose(
195
+ * { handler, table: createTableBuilder() },
196
+ * { handler: ["table"], table: [] },
197
+ * );
198
+ * ```
199
+ */
200
+ export function createFunctionBuilder() {
201
+ return taggedBuilder(FunctionBuilder);
202
+ }
203
+ /**
204
+ * Wraps a role builder so a user configurator that calls
205
+ * `addInlinePolicyStatements("LogsWriter", ...)` fails loudly. RoleBuilder
206
+ * stores inline policies in an internal array and the resulting record uses
207
+ * the policy name as a key — a duplicate `LogsWriter` would silently
208
+ * overwrite the scoped log policy and re-introduce wildcard log access.
209
+ */
210
+ function guardLogsWriter(rb, functionId) {
211
+ const original = rb.addInlinePolicyStatements.bind(rb);
212
+ return new Proxy(rb, {
213
+ get(target, prop, receiver) {
214
+ if (prop === "addInlinePolicyStatements") {
215
+ const guarded = (name, statements) => {
216
+ if (name === LOGS_WRITER_POLICY_NAME) {
217
+ throw new Error(`FunctionBuilder "${functionId}": cannot add an inline policy named ` +
218
+ `"${LOGS_WRITER_POLICY_NAME}" via .configureRole — the builder already ` +
219
+ `attaches one scoped to the function's log group. Use a different ` +
220
+ `name or call .role(...) to take full control of the role.`);
221
+ }
222
+ return original(name, statements);
223
+ };
224
+ return guarded;
225
+ }
226
+ return Reflect.get(target, prop, receiver);
227
+ },
228
+ });
229
+ }
230
+ //# sourceMappingURL=function-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"function-builder.js","sourceRoot":"","sources":["../../src/function-builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export { createFunctionBuilder, type FunctionBuilderProps, type FunctionBuilderResult, type IFunctionBuilder, } from "./function-builder.js";
2
+ export { FUNCTION_DEFAULTS } from "./defaults.js";
3
+ export { type FunctionAlarmConfig, type PercentageAlarmConfig } from "./alarm-config.js";
4
+ export { FUNCTION_ALARM_DEFAULTS } from "./alarm-defaults.js";
5
+ export { type ComposureEventSource, type EventSourceKind, } from "./event-sources/composure-event-source.js";
6
+ export { sqsEventSource, DEFAULT_SQS_EVENT_SOURCE_PROPS, } from "./event-sources/sqs-event-source.js";
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,KAAK,oBAAoB,EACzB,KAAK,qBAAqB,EAC1B,KAAK,gBAAgB,GACtB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,KAAK,mBAAmB,EAAE,KAAK,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AACzF,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EACL,KAAK,oBAAoB,EACzB,KAAK,eAAe,GACrB,MAAM,2CAA2C,CAAC;AACnD,OAAO,EACL,cAAc,EACd,8BAA8B,GAC/B,MAAM,qCAAqC,CAAC"}
@@ -1,4 +1,5 @@
1
1
  export { createFunctionBuilder, } from "./function-builder.js";
2
2
  export { FUNCTION_DEFAULTS } from "./defaults.js";
3
3
  export { FUNCTION_ALARM_DEFAULTS } from "./alarm-defaults.js";
4
+ export { sqsEventSource, DEFAULT_SQS_EVENT_SOURCE_PROPS, } from "./event-sources/sqs-event-source.js";
4
5
  //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,GAItB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAElD,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAK9D,OAAO,EACL,cAAc,EACd,8BAA8B,GAC/B,MAAM,qCAAqC,CAAC"}
@@ -0,0 +1,3 @@
1
+ {
2
+ "type": "module"
3
+ }
package/package.json CHANGED
@@ -1,29 +1,22 @@
1
1
  {
2
2
  "name": "@composurecdk/lambda",
3
- "version": "0.6.0",
3
+ "version": "0.8.0",
4
4
  "description": "Composable Lambda function builder with well-architected defaults",
5
5
  "repository": {
6
6
  "type": "git",
7
7
  "url": "https://github.com/laazyj/composureCDK",
8
8
  "directory": "packages/lambda"
9
9
  },
10
- "main": "./dist/index.js",
11
- "types": "./dist/index.d.ts",
12
- "exports": {
13
- ".": {
14
- "import": "./dist/index.js",
15
- "types": "./dist/index.d.ts"
16
- }
17
- },
18
10
  "files": [
19
11
  "dist",
20
12
  "README.md",
21
13
  "LICENSE"
22
14
  ],
23
15
  "scripts": {
24
- "clean": "rm -rf dist",
25
- "build": "tsc -p tsconfig.build.json",
16
+ "clean": "rm -rf dist .tshy .tshy-build",
17
+ "build": "tshy",
26
18
  "typecheck": "tsc --noEmit",
19
+ "check:exports": "attw --pack . --profile node16 && publint",
27
20
  "test": "vitest run --passWithNoTests",
28
21
  "test:watch": "vitest"
29
22
  },
@@ -34,18 +27,46 @@
34
27
  "access": "public"
35
28
  },
36
29
  "type": "module",
30
+ "engines": {
31
+ "node": ">=20"
32
+ },
33
+ "tshy": {
34
+ "exports": {
35
+ "./package.json": "./package.json",
36
+ ".": "./src/index.ts"
37
+ }
38
+ },
37
39
  "peerDependencies": {
38
- "@composurecdk/cloudwatch": "^0.6.0",
39
- "@composurecdk/core": "^0.6.0",
40
- "@composurecdk/logs": "^0.6.0",
40
+ "@composurecdk/cloudformation": "^0.8.0",
41
+ "@composurecdk/cloudwatch": "^0.8.0",
42
+ "@composurecdk/core": "^0.8.0",
43
+ "@composurecdk/iam": "^0.8.0",
44
+ "@composurecdk/logs": "^0.8.0",
41
45
  "aws-cdk-lib": "^2.0.0",
42
46
  "constructs": "^10.0.0"
43
47
  },
44
48
  "devDependencies": {
45
- "@types/node": "^25.6.0",
46
- "aws-cdk-lib": "^2.250.0",
49
+ "@composurecdk/iam": "^0.8.0",
50
+ "@types/node": "^25.6.2",
51
+ "aws-cdk-lib": "^2.253.1",
47
52
  "constructs": "^10.6.0",
48
53
  "typescript": "^6.0.3",
49
54
  "vitest": "^4.1.4"
50
- }
55
+ },
56
+ "exports": {
57
+ "./package.json": "./package.json",
58
+ ".": {
59
+ "import": {
60
+ "types": "./dist/esm/index.d.ts",
61
+ "default": "./dist/esm/index.js"
62
+ },
63
+ "require": {
64
+ "types": "./dist/commonjs/index.d.ts",
65
+ "default": "./dist/commonjs/index.js"
66
+ }
67
+ }
68
+ },
69
+ "main": "./dist/commonjs/index.js",
70
+ "types": "./dist/commonjs/index.d.ts",
71
+ "module": "./dist/esm/index.js"
51
72
  }
@@ -1 +0,0 @@
1
- {"version":3,"file":"alarm-config.d.ts","sourceRoot":"","sources":["../src/alarm-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAE5D;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,qBAAqB,GAAG,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,GAAG;IACnE;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,6BAA6B,GAAG,QAAQ,CAAC,IAAI,CAAC,qBAAqB,EAAE,WAAW,CAAC,CAAC,CAAC;AAE/F;;;;;;;GAOG;AACH,MAAM,WAAW,mBAAmB;IAClC;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB;;;;;;;OAOG;IACH,MAAM,CAAC,EAAE,WAAW,GAAG,KAAK,CAAC;IAE7B;;;;;;;OAOG;IACH,SAAS,CAAC,EAAE,WAAW,GAAG,KAAK,CAAC;IAEhC;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,EAAE,qBAAqB,GAAG,KAAK,CAAC;IAEzC;;;;;;;;;;OAUG;IACH,oBAAoB,CAAC,EAAE,qBAAqB,GAAG,KAAK,CAAC;CACtD"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"alarm-defaults.d.ts","sourceRoot":"","sources":["../src/alarm-defaults.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,mBAAmB,CAAC;AAEvE,UAAU,qBAAqB;IAC7B,OAAO,EAAE,IAAI,CAAC;IACd,MAAM,EAAE,mBAAmB,CAAC;IAC5B,SAAS,EAAE,mBAAmB,CAAC;IAC/B,QAAQ,EAAE,6BAA6B,CAAC;IACxC,oBAAoB,EAAE,6BAA6B,CAAC;CACrD;AAED;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,EAAE,qBAwCrC,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"alarm-defaults.js","sourceRoot":"","sources":["../src/alarm-defaults.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAY9D;;;;GAIG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAA0B;IAC5D,OAAO,EAAE,IAAI;IAEb,qDAAqD;IACrD,MAAM,EAAE;QACN,SAAS,EAAE,CAAC;QACZ,iBAAiB,EAAE,CAAC;QACpB,iBAAiB,EAAE,CAAC;QACpB,gBAAgB,EAAE,gBAAgB,CAAC,aAAa;KACjD;IAED,6DAA6D;IAC7D,SAAS,EAAE;QACT,SAAS,EAAE,CAAC;QACZ,iBAAiB,EAAE,CAAC;QACpB,iBAAiB,EAAE,CAAC;QACpB,gBAAgB,EAAE,gBAAgB,CAAC,aAAa;KACjD;IAED;;;OAGG;IACH,QAAQ,EAAE;QACR,gBAAgB,EAAE,GAAG;QACrB,iBAAiB,EAAE,CAAC;QACpB,iBAAiB,EAAE,CAAC;QACpB,gBAAgB,EAAE,gBAAgB,CAAC,aAAa;KACjD;IAED;;;OAGG;IACH,oBAAoB,EAAE;QACpB,gBAAgB,EAAE,GAAG;QACrB,iBAAiB,EAAE,CAAC;QACpB,iBAAiB,EAAE,CAAC;QACpB,gBAAgB,EAAE,gBAAgB,CAAC,aAAa;KACjD;CACF,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../src/defaults.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0B,KAAK,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEpF;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,EAAE,OAAO,CAAC,aAAa,CAapD,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../src/defaults.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,OAAO,EAAsB,MAAM,wBAAwB,CAAC;AAEpF;;;;GAIG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAA2B;IACvD;;;OAGG;IACH,OAAO,EAAE,OAAO,CAAC,MAAM;IAEvB;;;;OAIG;IACH,aAAa,EAAE,aAAa,CAAC,IAAI;CAClC,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"function-alarms.d.ts","sourceRoot":"","sources":["../src/function-alarms.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,KAAK,EAIX,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,QAAQ,IAAI,cAAc,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACxF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,KAAK,EAAE,eAAe,EAAa,MAAM,0BAA0B,CAAC;AAC3E,OAAO,EAAE,sBAAsB,EAAoC,MAAM,0BAA0B,CAAC;AACpG,OAAO,KAAK,EACV,mBAAmB,EAGpB,MAAM,mBAAmB,CAAC;AAM3B;;;;GAIG;AACH,wBAAgB,+BAA+B,CAC7C,EAAE,EAAE,cAAc,EAClB,MAAM,EAAE,mBAAmB,GAAG,SAAS,EACvC,KAAK,EAAE,IAAI,CAAC,aAAa,EAAE,SAAS,GAAG,8BAA8B,CAAC,GACrE,eAAe,EAAE,CA4EnB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,UAAU,EACjB,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,cAAc,EAClB,MAAM,EAAE,mBAAmB,GAAG,KAAK,GAAG,SAAS,EAC/C,KAAK,EAAE,IAAI,CAAC,aAAa,EAAE,SAAS,GAAG,8BAA8B,CAAC,EACtE,YAAY,GAAE,sBAAsB,CAAC,cAAc,CAAC,EAAO,GAC1D,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAUvB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"function-alarms.js","sourceRoot":"","sources":["../src/function-alarms.ts"],"names":[],"mappings":"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"}
@@ -1,137 +0,0 @@
1
- import { type Alarm } from "aws-cdk-lib/aws-cloudwatch";
2
- import { Function as LambdaFunction, type FunctionProps } from "aws-cdk-lib/aws-lambda";
3
- import type { LogGroup } from "aws-cdk-lib/aws-logs";
4
- import { type IConstruct } from "constructs";
5
- import { type IBuilder, type Lifecycle } from "@composurecdk/core";
6
- import { AlarmDefinitionBuilder } from "@composurecdk/cloudwatch";
7
- import type { FunctionAlarmConfig } from "./alarm-config.js";
8
- /**
9
- * Configuration properties for the Lambda function builder.
10
- *
11
- * Extends the CDK {@link FunctionProps} with additional builder-specific options.
12
- */
13
- export interface FunctionBuilderProps extends FunctionProps {
14
- /**
15
- * Configuration for AWS-recommended CloudWatch alarms.
16
- *
17
- * By default, the builder creates recommended alarms with sensible
18
- * thresholds for every applicable metric. Individual alarms can be
19
- * customized or disabled. Set to `false` to disable all alarms.
20
- *
21
- * No alarm actions are configured by default since notification
22
- * methods are user-specific. Access alarms from the build result
23
- * or use an `afterBuild` hook to apply actions.
24
- *
25
- * Contextual alarms (duration, concurrentExecutions) are only created
26
- * when the corresponding function configuration is present.
27
- *
28
- * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Best_Practice_Recommended_Alarms_AWS_Services.html#Lambda
29
- */
30
- recommendedAlarms?: FunctionAlarmConfig | false;
31
- }
32
- /**
33
- * The build output of a {@link IFunctionBuilder}. Contains the CDK constructs
34
- * created during {@link Lifecycle.build}, keyed by role.
35
- */
36
- export interface FunctionBuilderResult {
37
- /** The Lambda function construct created by the builder. */
38
- function: LambdaFunction;
39
- /**
40
- * The CloudWatch LogGroup created for the function, or `undefined` if
41
- * the user provided their own via the `logGroup` property.
42
- *
43
- * By default the builder creates a managed LogGroup using
44
- * {@link createLogGroupBuilder} with well-architected defaults (retention
45
- * policy, removal policy). This follows AWS CDK guidance to create a
46
- * `LogGroup` explicitly rather than relying on the auto-created default,
47
- * which cannot be configured via CDK.
48
- *
49
- * @see https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_lambda-readme.html
50
- * @see https://docs.aws.amazon.com/lambda/latest/dg/monitoring-cloudwatchlogs-loggroups.html
51
- */
52
- logGroup?: LogGroup;
53
- /**
54
- * CloudWatch alarms created for the function, keyed by alarm name.
55
- *
56
- * Includes both AWS-recommended alarms and any custom alarms added
57
- * via {@link IFunctionBuilder.addAlarm}. Access individual alarms
58
- * by key (e.g., `result.alarms.errors`).
59
- *
60
- * No alarm actions are configured — apply them via the result or an
61
- * `afterBuild` hook.
62
- *
63
- * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Best_Practice_Recommended_Alarms_AWS_Services.html#Lambda
64
- */
65
- alarms: Record<string, Alarm>;
66
- }
67
- /**
68
- * A fluent builder for configuring and creating an AWS Lambda function.
69
- *
70
- * Each configuration property from the CDK {@link FunctionProps} is exposed
71
- * as an overloaded method: call with a value to set it (returns the builder
72
- * for chaining), or call with no arguments to read the current value.
73
- *
74
- * The builder implements {@link Lifecycle}, so it can be used directly as a
75
- * component in a {@link compose | composed system}. When built, it creates
76
- * a Lambda function with the configured properties and returns a
77
- * {@link FunctionBuilderResult}.
78
- *
79
- * Unless a user-supplied `logGroup` is provided, the builder automatically
80
- * creates a managed CloudWatch LogGroup via {@link createLogGroupBuilder}
81
- * with well-architected defaults (retention, removal policy) and wires it
82
- * to the function. This ensures full control over log lifecycle and follows
83
- * AWS CDK guidance to create a LogGroup explicitly.
84
- *
85
- * The builder also creates AWS-recommended CloudWatch alarms by default.
86
- * Alarms can be customized or disabled via the `recommendedAlarms` property.
87
- * Custom alarms can be added via the {@link addAlarm} method.
88
- *
89
- * @see https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_lambda-readme.html
90
- *
91
- * @example
92
- * ```ts
93
- * const handler = createFunctionBuilder()
94
- * .runtime(Runtime.NODEJS_22_X)
95
- * .handler("index.handler")
96
- * .code(Code.fromAsset("lambda"))
97
- * .memorySize(256)
98
- * .timeout(Duration.seconds(30));
99
- * ```
100
- */
101
- export type IFunctionBuilder = IBuilder<FunctionBuilderProps, FunctionBuilder>;
102
- declare class FunctionBuilder implements Lifecycle<FunctionBuilderResult> {
103
- #private;
104
- props: Partial<FunctionBuilderProps>;
105
- addAlarm(key: string, configure: (alarm: AlarmDefinitionBuilder<LambdaFunction>) => AlarmDefinitionBuilder<LambdaFunction>): this;
106
- build(scope: IConstruct, id: string): FunctionBuilderResult;
107
- }
108
- /**
109
- * Creates a new {@link IFunctionBuilder} for configuring an AWS Lambda function.
110
- *
111
- * This is the entry point for defining a Lambda function component. The returned
112
- * builder exposes every {@link FunctionBuilderProps} property as a fluent setter/getter
113
- * and implements {@link Lifecycle} for use with {@link compose}.
114
- *
115
- * @returns A fluent builder for an AWS Lambda function.
116
- *
117
- * @example
118
- * ```ts
119
- * const handler = createFunctionBuilder()
120
- * .runtime(Runtime.NODEJS_22_X)
121
- * .handler("index.handler")
122
- * .code(Code.fromAsset("lambda"))
123
- * .timeout(Duration.seconds(30));
124
- *
125
- * // Use standalone:
126
- * const result = handler.build(stack, "MyFunction");
127
- *
128
- * // Or compose into a system:
129
- * const system = compose(
130
- * { handler, table: createTableBuilder() },
131
- * { handler: ["table"], table: [] },
132
- * );
133
- * ```
134
- */
135
- export declare function createFunctionBuilder(): IFunctionBuilder;
136
- export {};
137
- //# sourceMappingURL=function-builder.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"function-builder.d.ts","sourceRoot":"","sources":["../src/function-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAE,QAAQ,IAAI,cAAc,EAAE,KAAK,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACxF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAW,KAAK,QAAQ,EAAE,KAAK,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC5E,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAElE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAI7D;;;;GAIG;AACH,MAAM,WAAW,oBAAqB,SAAQ,aAAa;IACzD;;;;;;;;;;;;;;;OAeG;IACH,iBAAiB,CAAC,EAAE,mBAAmB,GAAG,KAAK,CAAC;CACjD;AAED;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC,4DAA4D;IAC5D,QAAQ,EAAE,cAAc,CAAC;IAEzB;;;;;;;;;;;;OAYG;IACH,QAAQ,CAAC,EAAE,QAAQ,CAAC;IAEpB;;;;;;;;;;;OAWG;IACH,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;CAC/B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,MAAM,MAAM,gBAAgB,GAAG,QAAQ,CAAC,oBAAoB,EAAE,eAAe,CAAC,CAAC;AAE/E,cAAM,eAAgB,YAAW,SAAS,CAAC,qBAAqB,CAAC;;IAC/D,KAAK,EAAE,OAAO,CAAC,oBAAoB,CAAC,CAAM;IAG1C,QAAQ,CACN,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,CACT,KAAK,EAAE,sBAAsB,CAAC,cAAc,CAAC,KAC1C,sBAAsB,CAAC,cAAc,CAAC,GAC1C,IAAI;IAKP,KAAK,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,GAAG,qBAAqB;CA8B5D;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,qBAAqB,IAAI,gBAAgB,CAExD"}
@@ -1,62 +0,0 @@
1
- import { Function as LambdaFunction } from "aws-cdk-lib/aws-lambda";
2
- import { Builder } from "@composurecdk/core";
3
- import { AlarmDefinitionBuilder } from "@composurecdk/cloudwatch";
4
- import { createLogGroupBuilder } from "@composurecdk/logs";
5
- import { createFunctionAlarms } from "./function-alarms.js";
6
- import { FUNCTION_DEFAULTS } from "./defaults.js";
7
- class FunctionBuilder {
8
- props = {};
9
- #customAlarms = [];
10
- addAlarm(key, configure) {
11
- this.#customAlarms.push(configure(new AlarmDefinitionBuilder(key)));
12
- return this;
13
- }
14
- build(scope, id) {
15
- let logGroup;
16
- let logGroupProps = {};
17
- if (!this.props.logGroup) {
18
- logGroup = createLogGroupBuilder().build(scope, `${id}LogGroup`).logGroup;
19
- logGroupProps = { logGroup };
20
- }
21
- const { recommendedAlarms: alarmConfig, ...functionProps } = this.props;
22
- const mergedProps = {
23
- ...FUNCTION_DEFAULTS,
24
- ...logGroupProps,
25
- ...functionProps,
26
- };
27
- const fn = new LambdaFunction(scope, id, mergedProps);
28
- const alarms = createFunctionAlarms(scope, id, fn, alarmConfig, mergedProps, this.#customAlarms);
29
- return { function: fn, logGroup, alarms };
30
- }
31
- }
32
- /**
33
- * Creates a new {@link IFunctionBuilder} for configuring an AWS Lambda function.
34
- *
35
- * This is the entry point for defining a Lambda function component. The returned
36
- * builder exposes every {@link FunctionBuilderProps} property as a fluent setter/getter
37
- * and implements {@link Lifecycle} for use with {@link compose}.
38
- *
39
- * @returns A fluent builder for an AWS Lambda function.
40
- *
41
- * @example
42
- * ```ts
43
- * const handler = createFunctionBuilder()
44
- * .runtime(Runtime.NODEJS_22_X)
45
- * .handler("index.handler")
46
- * .code(Code.fromAsset("lambda"))
47
- * .timeout(Duration.seconds(30));
48
- *
49
- * // Use standalone:
50
- * const result = handler.build(stack, "MyFunction");
51
- *
52
- * // Or compose into a system:
53
- * const system = compose(
54
- * { handler, table: createTableBuilder() },
55
- * { handler: ["table"], table: [] },
56
- * );
57
- * ```
58
- */
59
- export function createFunctionBuilder() {
60
- return Builder(FunctionBuilder);
61
- }
62
- //# sourceMappingURL=function-builder.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"function-builder.js","sourceRoot":"","sources":["../src/function-builder.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,IAAI,cAAc,EAAsB,MAAM,wBAAwB,CAAC;AAGxF,OAAO,EAAE,OAAO,EAAiC,MAAM,oBAAoB,CAAC;AAC5E,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAqGlD,MAAM,eAAe;IACnB,KAAK,GAAkC,EAAE,CAAC;IACjC,aAAa,GAA6C,EAAE,CAAC;IAEtE,QAAQ,CACN,GAAW,EACX,SAE2C;QAE3C,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,sBAAsB,CAAiB,GAAG,CAAC,CAAC,CAAC,CAAC;QACpF,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,KAAiB,EAAE,EAAU;QACjC,IAAI,QAA8B,CAAC;QACnC,IAAI,aAAa,GAAG,EAAE,CAAC;QAEvB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;YACzB,QAAQ,GAAG,qBAAqB,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAC;YAC1E,aAAa,GAAG,EAAE,QAAQ,EAAE,CAAC;QAC/B,CAAC;QAED,MAAM,EAAE,iBAAiB,EAAE,WAAW,EAAE,GAAG,aAAa,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;QAExE,MAAM,WAAW,GAAG;YAClB,GAAG,iBAAiB;YACpB,GAAG,aAAa;YAChB,GAAG,aAAa;SACO,CAAC;QAE1B,MAAM,EAAE,GAAG,IAAI,cAAc,CAAC,KAAK,EAAE,EAAE,EAAE,WAAW,CAAC,CAAC;QAEtD,MAAM,MAAM,GAAG,oBAAoB,CACjC,KAAK,EACL,EAAE,EACF,EAAE,EACF,WAAW,EACX,WAAW,EACX,IAAI,CAAC,aAAa,CACnB,CAAC;QAEF,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;IAC5C,CAAC;CACF;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,UAAU,qBAAqB;IACnC,OAAO,OAAO,CAAwC,eAAe,CAAC,CAAC;AACzE,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,KAAK,oBAAoB,EACzB,KAAK,qBAAqB,EAC1B,KAAK,gBAAgB,GACtB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,KAAK,mBAAmB,EAAE,KAAK,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AACzF,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC"}
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,GAItB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAElD,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC"}
File without changes
File without changes
File without changes