@composurecdk/cloudfront 0.7.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 (92) hide show
  1. package/dist/commonjs/alarm-config.d.ts.map +1 -0
  2. package/dist/commonjs/alarm-config.js +3 -0
  3. package/dist/{alarm-config.js.map → commonjs/alarm-config.js.map} +1 -1
  4. package/dist/commonjs/alarm-defaults.d.ts.map +1 -0
  5. package/dist/commonjs/alarm-defaults.js +65 -0
  6. package/dist/commonjs/alarm-defaults.js.map +1 -0
  7. package/dist/commonjs/behavior-function-alarms.d.ts.map +1 -0
  8. package/dist/commonjs/behavior-function-alarms.js +145 -0
  9. package/dist/commonjs/behavior-function-alarms.js.map +1 -0
  10. package/dist/commonjs/cloudfront-alarm-builder.d.ts.map +1 -0
  11. package/dist/commonjs/cloudfront-alarm-builder.js +141 -0
  12. package/dist/commonjs/cloudfront-alarm-builder.js.map +1 -0
  13. package/dist/commonjs/defaults.d.ts.map +1 -0
  14. package/dist/commonjs/defaults.js +72 -0
  15. package/dist/commonjs/defaults.js.map +1 -0
  16. package/dist/commonjs/distribution-alarms.d.ts.map +1 -0
  17. package/dist/commonjs/distribution-alarms.js +64 -0
  18. package/dist/commonjs/distribution-alarms.js.map +1 -0
  19. package/dist/commonjs/distribution-builder.d.ts.map +1 -0
  20. package/dist/commonjs/distribution-builder.js +191 -0
  21. package/dist/commonjs/distribution-builder.js.map +1 -0
  22. package/dist/commonjs/index.d.ts.map +1 -0
  23. package/dist/commonjs/index.js +14 -0
  24. package/dist/commonjs/index.js.map +1 -0
  25. package/dist/commonjs/package.json +3 -0
  26. package/dist/commonjs/resolve-behaviors.d.ts.map +1 -0
  27. package/dist/commonjs/resolve-behaviors.js +101 -0
  28. package/dist/commonjs/resolve-behaviors.js.map +1 -0
  29. package/dist/esm/alarm-config.d.ts +98 -0
  30. package/dist/esm/alarm-config.d.ts.map +1 -0
  31. package/dist/esm/alarm-config.js.map +1 -0
  32. package/dist/esm/alarm-defaults.d.ts +28 -0
  33. package/dist/esm/alarm-defaults.d.ts.map +1 -0
  34. package/dist/esm/alarm-defaults.js.map +1 -0
  35. package/dist/esm/behavior-function-alarms.d.ts +44 -0
  36. package/dist/esm/behavior-function-alarms.d.ts.map +1 -0
  37. package/dist/esm/behavior-function-alarms.js.map +1 -0
  38. package/dist/esm/cloudfront-alarm-builder.d.ts +136 -0
  39. package/dist/esm/cloudfront-alarm-builder.d.ts.map +1 -0
  40. package/dist/esm/cloudfront-alarm-builder.js.map +1 -0
  41. package/dist/esm/defaults.d.ts +17 -0
  42. package/dist/esm/defaults.d.ts.map +1 -0
  43. package/dist/esm/defaults.js.map +1 -0
  44. package/dist/esm/distribution-alarms.d.ts +9 -0
  45. package/dist/esm/distribution-alarms.d.ts.map +1 -0
  46. package/dist/esm/distribution-alarms.js.map +1 -0
  47. package/dist/esm/distribution-builder.d.ts +345 -0
  48. package/dist/esm/distribution-builder.d.ts.map +1 -0
  49. package/dist/esm/distribution-builder.js.map +1 -0
  50. package/dist/esm/index.d.ts +6 -0
  51. package/dist/esm/index.d.ts.map +1 -0
  52. package/dist/esm/index.js.map +1 -0
  53. package/dist/esm/package.json +3 -0
  54. package/dist/esm/resolve-behaviors.d.ts +56 -0
  55. package/dist/esm/resolve-behaviors.d.ts.map +1 -0
  56. package/dist/esm/resolve-behaviors.js.map +1 -0
  57. package/package.json +36 -18
  58. package/dist/alarm-config.d.ts.map +0 -1
  59. package/dist/alarm-defaults.d.ts.map +0 -1
  60. package/dist/alarm-defaults.js.map +0 -1
  61. package/dist/behavior-function-alarms.d.ts.map +0 -1
  62. package/dist/behavior-function-alarms.js.map +0 -1
  63. package/dist/cloudfront-alarm-builder.d.ts.map +0 -1
  64. package/dist/cloudfront-alarm-builder.js.map +0 -1
  65. package/dist/defaults.d.ts.map +0 -1
  66. package/dist/defaults.js.map +0 -1
  67. package/dist/distribution-alarms.d.ts.map +0 -1
  68. package/dist/distribution-alarms.js.map +0 -1
  69. package/dist/distribution-builder.d.ts.map +0 -1
  70. package/dist/distribution-builder.js.map +0 -1
  71. package/dist/index.d.ts.map +0 -1
  72. package/dist/index.js.map +0 -1
  73. package/dist/resolve-behaviors.d.ts.map +0 -1
  74. package/dist/resolve-behaviors.js.map +0 -1
  75. /package/dist/{alarm-config.d.ts → commonjs/alarm-config.d.ts} +0 -0
  76. /package/dist/{alarm-defaults.d.ts → commonjs/alarm-defaults.d.ts} +0 -0
  77. /package/dist/{behavior-function-alarms.d.ts → commonjs/behavior-function-alarms.d.ts} +0 -0
  78. /package/dist/{cloudfront-alarm-builder.d.ts → commonjs/cloudfront-alarm-builder.d.ts} +0 -0
  79. /package/dist/{defaults.d.ts → commonjs/defaults.d.ts} +0 -0
  80. /package/dist/{distribution-alarms.d.ts → commonjs/distribution-alarms.d.ts} +0 -0
  81. /package/dist/{distribution-builder.d.ts → commonjs/distribution-builder.d.ts} +0 -0
  82. /package/dist/{index.d.ts → commonjs/index.d.ts} +0 -0
  83. /package/dist/{resolve-behaviors.d.ts → commonjs/resolve-behaviors.d.ts} +0 -0
  84. /package/dist/{alarm-config.js → esm/alarm-config.js} +0 -0
  85. /package/dist/{alarm-defaults.js → esm/alarm-defaults.js} +0 -0
  86. /package/dist/{behavior-function-alarms.js → esm/behavior-function-alarms.js} +0 -0
  87. /package/dist/{cloudfront-alarm-builder.js → esm/cloudfront-alarm-builder.js} +0 -0
  88. /package/dist/{defaults.js → esm/defaults.js} +0 -0
  89. /package/dist/{distribution-alarms.js → esm/distribution-alarms.js} +0 -0
  90. /package/dist/{distribution-builder.js → esm/distribution-builder.js} +0 -0
  91. /package/dist/{index.js → esm/index.js} +0 -0
  92. /package/dist/{resolve-behaviors.js → esm/resolve-behaviors.js} +0 -0
@@ -0,0 +1,191 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createDistributionBuilder = createDistributionBuilder;
4
+ const aws_cloudfront_1 = require("aws-cdk-lib/aws-cloudfront");
5
+ const aws_s3_1 = require("aws-cdk-lib/aws-s3");
6
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
7
+ const core_1 = require("@composurecdk/core");
8
+ const cloudformation_1 = require("@composurecdk/cloudformation");
9
+ const cloudwatch_1 = require("@composurecdk/cloudwatch");
10
+ const s3_1 = require("@composurecdk/s3");
11
+ const defaults_js_1 = require("./defaults.js");
12
+ const resolve_behaviors_js_1 = require("./resolve-behaviors.js");
13
+ const behavior_function_alarms_js_1 = require("./behavior-function-alarms.js");
14
+ const cloudfront_alarm_builder_js_1 = require("./cloudfront-alarm-builder.js");
15
+ class DistributionBuilder {
16
+ props = {};
17
+ #origin;
18
+ #additionalBehaviors = new Map();
19
+ #behaviorSlugs = new Map();
20
+ #customAlarms = [];
21
+ addAlarm(key, configure) {
22
+ this.#customAlarms.push(configure(new cloudwatch_1.AlarmDefinitionBuilder(key)));
23
+ return this;
24
+ }
25
+ /**
26
+ * Sets the default origin for the distribution.
27
+ *
28
+ * Accepts a concrete {@link IOrigin} or a {@link Ref} that resolves to one
29
+ * at build time — enabling cross-component wiring with S3 buckets.
30
+ *
31
+ * @param origin - The origin or a Ref to one.
32
+ * @returns This builder for chaining.
33
+ */
34
+ origin(origin) {
35
+ this.#origin = origin;
36
+ return this;
37
+ }
38
+ /**
39
+ * Adds an additional cache behavior for a path pattern. The behavior's
40
+ * origin is required (concrete or Resolvable). Any inline functions are
41
+ * created by the builder and receive per-behavior alarms scoped to the
42
+ * path pattern.
43
+ *
44
+ * @throws If a behavior for the same path pattern has already been added.
45
+ */
46
+ behavior(pathPattern, config) {
47
+ if (this.#additionalBehaviors.has(pathPattern)) {
48
+ throw new Error(`DistributionBuilder: behavior for path pattern "${pathPattern}" is already defined.`);
49
+ }
50
+ // Alarm keys and Function construct ids are derived from a PascalCase slug
51
+ // of the path pattern. Patterns that differ only by stripped characters
52
+ // (e.g. `/*.html` vs `*.html`) would collide downstream at createAlarms() —
53
+ // surface the collision here with the patterns named.
54
+ const slug = (0, behavior_function_alarms_js_1.pathPatternSlug)(pathPattern);
55
+ const existingPattern = this.#behaviorSlugs.get(slug);
56
+ if (existingPattern !== undefined) {
57
+ throw new Error(`DistributionBuilder: path pattern "${pathPattern}" produces the same alarm/construct ` +
58
+ `slug ("${slug}") as "${existingPattern}". Pick distinct patterns.`);
59
+ }
60
+ this.#behaviorSlugs.set(slug, pathPattern);
61
+ this.#additionalBehaviors.set(pathPattern, config);
62
+ return this;
63
+ }
64
+ /** @internal — see ADR-0005. */
65
+ [core_1.COPY_STATE](target) {
66
+ target.#origin = this.#origin;
67
+ for (const [k, v] of this.#additionalBehaviors)
68
+ target.#additionalBehaviors.set(k, v);
69
+ for (const [k, v] of this.#behaviorSlugs)
70
+ target.#behaviorSlugs.set(k, v);
71
+ target.#customAlarms.push(...this.#customAlarms);
72
+ }
73
+ build(scope, id, context) {
74
+ const resolvedOrigin = this.#origin ? (0, core_1.resolve)(this.#origin, context ?? {}) : undefined;
75
+ if (!resolvedOrigin) {
76
+ throw new Error(`DistributionBuilder "${id}" requires an origin. ` +
77
+ `Call .origin() with an IOrigin or a Ref to one.`);
78
+ }
79
+ const { accessLogs, certificate, defaultBehavior: userBehavior, recommendedAlarms: alarmConfig, ...distProps } = this.props;
80
+ const resolvedCertificate = certificate ? (0, core_1.resolve)(certificate, context ?? {}) : undefined;
81
+ const { accessLogs: defaultAccessLogs, defaultBehavior: defaultBehaviorDefaults, ...cdkDefaults } = defaults_js_1.DISTRIBUTION_DEFAULTS;
82
+ const cfg = accessLogs ?? defaultAccessLogs;
83
+ const { accessLogsBucket, accessLogProps } = resolveAccessLogs(scope, id, cfg);
84
+ const behaviors = (0, resolve_behaviors_js_1.resolveBehaviors)({
85
+ scope,
86
+ id,
87
+ context: context ?? {},
88
+ defaultOrigin: resolvedOrigin,
89
+ defaultBehavior: userBehavior,
90
+ defaultBehaviorDefaults: defaultBehaviorDefaults ?? {},
91
+ additionalBehaviors: this.#additionalBehaviors,
92
+ });
93
+ const mergedProps = {
94
+ ...cdkDefaults,
95
+ ...accessLogProps,
96
+ ...distProps,
97
+ ...(resolvedCertificate ? { certificate: resolvedCertificate } : {}),
98
+ defaultBehavior: behaviors.defaultBehavior,
99
+ ...(Object.keys(behaviors.additionalBehaviors).length > 0
100
+ ? { additionalBehaviors: behaviors.additionalBehaviors }
101
+ : {}),
102
+ };
103
+ const distribution = new aws_cloudfront_1.Distribution(scope, id, mergedProps);
104
+ // Ensure CloudFront is deleted before the access logs bucket during stack teardown.
105
+ // Without this, CloudFront may still be writing logs while the bucket is being emptied/deleted.
106
+ if (accessLogsBucket) {
107
+ distribution.node.addDependency(accessLogsBucket);
108
+ }
109
+ const alarms = (0, cloudfront_alarm_builder_js_1.buildCloudFrontAlarms)(scope, id, { distribution, functions: behaviors.functions }, { recommendedAlarms: alarmConfig, customAlarms: this.#customAlarms });
110
+ return {
111
+ distribution,
112
+ accessLogsBucket,
113
+ functions: behaviors.functions,
114
+ alarms,
115
+ };
116
+ }
117
+ }
118
+ /**
119
+ * Creates a new {@link IDistributionBuilder} for configuring a CloudFront distribution.
120
+ *
121
+ * This is the entry point for defining a CloudFront distribution component.
122
+ * The returned builder exposes every {@link DistributionBuilderProps} property
123
+ * as a fluent setter/getter, plus {@link IDistributionBuilder.origin | origin()}
124
+ * for setting the default origin with Ref support and
125
+ * {@link IDistributionBuilder.behavior | behavior()} for path-pattern behaviors.
126
+ * It implements {@link Lifecycle} for use with {@link compose}.
127
+ *
128
+ * @returns A fluent builder for a CloudFront distribution.
129
+ *
130
+ * @example
131
+ * ```ts
132
+ * const cdn = createDistributionBuilder()
133
+ * .origin(ref<BucketBuilderResult>("site", (r) =>
134
+ * S3BucketOrigin.withOriginAccessControl(r.bucket)))
135
+ * .defaultBehavior({
136
+ * functions: [{
137
+ * eventType: FunctionEventType.VIEWER_REQUEST,
138
+ * code: FunctionCode.fromFile({ filePath: "src/edge/rewrite.js" }),
139
+ * }],
140
+ * })
141
+ * .behavior("/api/*", {
142
+ * origin: apiOrigin,
143
+ * cachePolicy: CachePolicy.CACHING_DISABLED,
144
+ * });
145
+ * ```
146
+ */
147
+ function createDistributionBuilder() {
148
+ return (0, cloudformation_1.taggedBuilder)(DistributionBuilder);
149
+ }
150
+ function resolveAccessLogs(scope, id, cfg) {
151
+ if (cfg === false || cfg === undefined) {
152
+ return { accessLogProps: {} };
153
+ }
154
+ const extras = {
155
+ ...(cfg.prefix !== undefined ? { logFilePrefix: cfg.prefix } : {}),
156
+ ...(cfg.includeCookies !== undefined ? { logIncludesCookies: cfg.includeCookies } : {}),
157
+ };
158
+ if (cfg.destination !== undefined) {
159
+ if (cfg.configure !== undefined) {
160
+ throw new Error("accessLogs: 'configure' cannot be combined with 'destination' — " +
161
+ "the destination bucket is user-managed and not built by this builder.");
162
+ }
163
+ return {
164
+ accessLogProps: {
165
+ enableLogging: true,
166
+ logBucket: cfg.destination,
167
+ ...extras,
168
+ },
169
+ };
170
+ }
171
+ let subBuilder = (0, s3_1.createBucketBuilder)()
172
+ .serverAccessLogs(false)
173
+ .versioned(false)
174
+ // CloudFront standard logging writes via ACLs, which requires BucketOwnerPreferred.
175
+ .objectOwnership(aws_s3_1.ObjectOwnership.BUCKET_OWNER_PREFERRED)
176
+ .removalPolicy(aws_cdk_lib_1.RemovalPolicy.RETAIN)
177
+ .lifecycleRules(s3_1.DEFAULT_ACCESS_LOG_BUCKET_LIFECYCLE_RULES);
178
+ if (cfg.configure) {
179
+ subBuilder = cfg.configure(subBuilder);
180
+ }
181
+ const accessLogsBucket = subBuilder.build(scope, `${id}AccessLogs`).bucket;
182
+ return {
183
+ accessLogsBucket,
184
+ accessLogProps: {
185
+ enableLogging: true,
186
+ logBucket: accessLogsBucket,
187
+ ...extras,
188
+ },
189
+ };
190
+ }
191
+ //# sourceMappingURL=distribution-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"distribution-builder.js","sourceRoot":"","sources":["../../src/distribution-builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,yBAAyB,EACzB,KAAK,gBAAgB,EACrB,KAAK,wBAAwB,EAC7B,KAAK,yBAAyB,EAC9B,KAAK,oBAAoB,EACzB,KAAK,qBAAqB,EAC1B,KAAK,wBAAwB,EAC7B,KAAK,wBAAwB,GAC9B,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,4BAA4B,EAC5B,KAAK,2BAA2B,EAChC,KAAK,4BAA4B,EACjC,KAAK,uBAAuB,GAC7B,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AAChF,OAAO,EAAE,KAAK,uBAAuB,EAAE,KAAK,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAC3F,OAAO,EAAE,2BAA2B,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FUNCTION_ALARM_DEFAULTS = exports.DISTRIBUTION_ALARM_DEFAULTS = exports.INLINE_FUNCTION_DEFAULTS = exports.DISTRIBUTION_DEFAULTS = exports.createCloudFrontAlarmBuilder = exports.createDistributionBuilder = void 0;
4
+ var distribution_builder_js_1 = require("./distribution-builder.js");
5
+ Object.defineProperty(exports, "createDistributionBuilder", { enumerable: true, get: function () { return distribution_builder_js_1.createDistributionBuilder; } });
6
+ var cloudfront_alarm_builder_js_1 = require("./cloudfront-alarm-builder.js");
7
+ Object.defineProperty(exports, "createCloudFrontAlarmBuilder", { enumerable: true, get: function () { return cloudfront_alarm_builder_js_1.createCloudFrontAlarmBuilder; } });
8
+ var defaults_js_1 = require("./defaults.js");
9
+ Object.defineProperty(exports, "DISTRIBUTION_DEFAULTS", { enumerable: true, get: function () { return defaults_js_1.DISTRIBUTION_DEFAULTS; } });
10
+ Object.defineProperty(exports, "INLINE_FUNCTION_DEFAULTS", { enumerable: true, get: function () { return defaults_js_1.INLINE_FUNCTION_DEFAULTS; } });
11
+ var alarm_defaults_js_1 = require("./alarm-defaults.js");
12
+ Object.defineProperty(exports, "DISTRIBUTION_ALARM_DEFAULTS", { enumerable: true, get: function () { return alarm_defaults_js_1.DISTRIBUTION_ALARM_DEFAULTS; } });
13
+ Object.defineProperty(exports, "FUNCTION_ALARM_DEFAULTS", { enumerable: true, get: function () { return alarm_defaults_js_1.FUNCTION_ALARM_DEFAULTS; } });
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;AAAA,qEASmC;AARjC,oIAAA,yBAAyB,OAAA;AAS3B,6EAKuC;AAJrC,2IAAA,4BAA4B,OAAA;AAK9B,6CAAgF;AAAvE,oHAAA,qBAAqB,OAAA;AAAE,uHAAA,wBAAwB,OAAA;AAExD,yDAA2F;AAAlF,gIAAA,2BAA2B,OAAA;AAAE,4HAAA,uBAAuB,OAAA"}
@@ -0,0 +1,3 @@
1
+ {
2
+ "type": "commonjs"
3
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-behaviors.d.ts","sourceRoot":"","sources":["../../src/resolve-behaviors.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,eAAe,EAKpB,KAAK,OAAO,EACb,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAQ7C,OAAO,KAAK,EACV,wBAAwB,EACxB,qBAAqB,EACrB,aAAa,EAEd,MAAM,2BAA2B,CAAC;AAEnC;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC,2EAA2E;IAC3E,KAAK,EAAE,UAAU,CAAC;IAElB,2EAA2E;IAC3E,EAAE,EAAE,MAAM,CAAC;IAEX,4EAA4E;IAC5E,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEhC,2CAA2C;IAC3C,aAAa,EAAE,OAAO,CAAC;IAEvB,gEAAgE;IAChE,eAAe,EAAE,qBAAqB,GAAG,SAAS,CAAC;IAEnD,0EAA0E;IAC1E,uBAAuB,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAErD;;;OAGG;IACH,mBAAmB,EAAE,GAAG,CAAC,MAAM,EAAE,wBAAwB,CAAC,CAAC;CAC5D;AAED;;;;GAIG;AACH,MAAM,WAAW,sBAAsB;IACrC,iEAAiE;IACjE,eAAe,EAAE,eAAe,CAAC;IAEjC,4EAA4E;IAC5E,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IAErD;;;;;;;OAOG;IACH,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;CAC1C;AAiDD;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,GAAG,sBAAsB,CA0DrF"}
@@ -0,0 +1,101 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolveBehaviors = resolveBehaviors;
4
+ const aws_cloudfront_1 = require("aws-cdk-lib/aws-cloudfront");
5
+ const core_1 = require("@composurecdk/core");
6
+ const behavior_function_alarms_js_1 = require("./behavior-function-alarms.js");
7
+ const defaults_js_1 = require("./defaults.js");
8
+ function scopeLabel(pathPattern) {
9
+ return pathPattern === null ? "default behavior" : `behavior "${pathPattern}"`;
10
+ }
11
+ function behaviorIdScope(pathPattern) {
12
+ return pathPattern === null ? "DefaultBehavior" : `Behavior${(0, behavior_function_alarms_js_1.pathPatternSlug)(pathPattern)}`;
13
+ }
14
+ function assertUniqueEventTypes(functions, pathPattern) {
15
+ const seen = new Set();
16
+ for (const fn of functions) {
17
+ if (seen.has(fn.eventType)) {
18
+ throw new Error(`DistributionBuilder: ${scopeLabel(pathPattern)} has multiple functions for eventType "${fn.eventType}". ` +
19
+ `CloudFront allows at most one function per event type per behavior.`);
20
+ }
21
+ seen.add(fn.eventType);
22
+ }
23
+ }
24
+ function omit(obj, ...keys) {
25
+ const skip = new Set(keys);
26
+ const out = {};
27
+ for (const [k, v] of Object.entries(obj)) {
28
+ if (!skip.has(k))
29
+ out[k] = v;
30
+ }
31
+ return out;
32
+ }
33
+ function assertKeyValueStoreRuntime(def, pathPattern) {
34
+ if (!def.keyValueStore)
35
+ return;
36
+ const effectiveRuntime = def.runtime ?? defaults_js_1.INLINE_FUNCTION_DEFAULTS.runtime;
37
+ if (effectiveRuntime !== aws_cloudfront_1.FunctionRuntime.JS_2_0) {
38
+ throw new Error(`DistributionBuilder: ${scopeLabel(pathPattern)} function (${def.eventType}) uses a ` +
39
+ `keyValueStore, which requires FunctionRuntime.JS_2_0.`);
40
+ }
41
+ }
42
+ /**
43
+ * Materializes the default and additional cache behaviors into CDK-ready
44
+ * `BehaviorOptions`, creating any inline CloudFront Functions along the way
45
+ * and producing their path-scoped alarm definitions.
46
+ *
47
+ * Enforces CloudFront invariants at configure time: at most one function per
48
+ * event type per behavior, and `keyValueStore` requires `FunctionRuntime.JS_2_0`.
49
+ */
50
+ function resolveBehaviors(input) {
51
+ const { scope, id, context, defaultOrigin, defaultBehavior, defaultBehaviorDefaults } = input;
52
+ const functions = {};
53
+ const buildInlineFunctions = (pathPattern, definitions) => {
54
+ if (!definitions || definitions.length === 0)
55
+ return [];
56
+ assertUniqueEventTypes(definitions, pathPattern);
57
+ const scopeId = behaviorIdScope(pathPattern);
58
+ const associations = [];
59
+ for (const def of definitions) {
60
+ assertKeyValueStoreRuntime(def, pathPattern);
61
+ const { eventType } = def;
62
+ const fnId = `${id}${scopeId}${(0, behavior_function_alarms_js_1.eventTypePascal)(eventType)}Fn`;
63
+ const fn = new aws_cloudfront_1.Function(scope, fnId, {
64
+ ...defaults_js_1.INLINE_FUNCTION_DEFAULTS,
65
+ ...omit(def, "eventType", "recommendedAlarms"),
66
+ });
67
+ functions[(0, behavior_function_alarms_js_1.behaviorFunctionKeyPrefix)(pathPattern, eventType)] = {
68
+ function: fn,
69
+ pathPattern,
70
+ eventType,
71
+ recommendedAlarms: def.recommendedAlarms,
72
+ };
73
+ associations.push({ function: fn, eventType });
74
+ }
75
+ return associations;
76
+ };
77
+ const defaultAssociations = buildInlineFunctions(null, defaultBehavior?.functions);
78
+ const userDefaultBehavior = omit(defaultBehavior ?? {}, "functions");
79
+ const resolvedDefaultBehavior = {
80
+ ...defaultBehaviorDefaults,
81
+ ...userDefaultBehavior,
82
+ ...(defaultAssociations.length > 0 ? { functionAssociations: defaultAssociations } : {}),
83
+ origin: defaultOrigin,
84
+ };
85
+ const resolvedAdditionalBehaviors = {};
86
+ for (const [pathPattern, config] of input.additionalBehaviors) {
87
+ const resolvedOrigin = (0, core_1.resolve)(config.origin, context);
88
+ const associations = buildInlineFunctions(pathPattern, config.functions);
89
+ resolvedAdditionalBehaviors[pathPattern] = {
90
+ ...omit(config, "functions", "origin"),
91
+ origin: resolvedOrigin,
92
+ ...(associations.length > 0 ? { functionAssociations: associations } : {}),
93
+ };
94
+ }
95
+ return {
96
+ defaultBehavior: resolvedDefaultBehavior,
97
+ additionalBehaviors: resolvedAdditionalBehaviors,
98
+ functions,
99
+ };
100
+ }
101
+ //# sourceMappingURL=resolve-behaviors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-behaviors.js","sourceRoot":"","sources":["../../src/resolve-behaviors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,98 @@
1
+ import type { AlarmConfig } from "@composurecdk/cloudwatch";
2
+ /**
3
+ * Controls which recommended alarms are created for a CloudFront distribution.
4
+ * All applicable alarms are enabled by default with AWS-recommended thresholds.
5
+ * Set individual alarms to `false` to disable them, or provide an
6
+ * {@link AlarmConfig} to tune thresholds.
7
+ *
8
+ * Function-level alarms are created automatically for every inline function
9
+ * declared on a behavior — see {@link FunctionAlarmConfig} to tune them.
10
+ *
11
+ * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Best_Practice_Recommended_Alarms_AWS_Services.html#CloudFront
12
+ */
13
+ export interface DistributionAlarmConfig {
14
+ /**
15
+ * Master switch: set to `false` to disable all recommended alarms.
16
+ * Individual alarms can also be disabled via their own entry.
17
+ * @default true
18
+ */
19
+ enabled?: boolean;
20
+ /**
21
+ * Alarm when the distribution's 5xx error rate is elevated.
22
+ *
23
+ * Metric: `AWS/CloudFront 5xxErrorRate`, statistic Average, period 1 minute.
24
+ * Default threshold: > 5 (5% error rate).
25
+ *
26
+ * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Best_Practice_Recommended_Alarms_AWS_Services.html#CloudFront
27
+ */
28
+ errorRate?: AlarmConfig | false;
29
+ /**
30
+ * Alarm when origin response latency is elevated.
31
+ *
32
+ * Metric: `AWS/CloudFront OriginLatency`, statistic p90, period 1 minute.
33
+ * Default threshold: > 5000ms (5 seconds).
34
+ *
35
+ * Requires [additional CloudFront metrics](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/viewing-cloudfront-metrics.html#monitoring-console.distributions-additional)
36
+ * to be enabled on the distribution for this alarm to receive data.
37
+ * With the default `treatMissingData: NOT_BREACHING`, the alarm will
38
+ * not fire when additional metrics are not enabled.
39
+ *
40
+ * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Best_Practice_Recommended_Alarms_AWS_Services.html#CloudFront
41
+ */
42
+ originLatency?: AlarmConfig | false;
43
+ }
44
+ /**
45
+ * Controls which recommended alarms are created for a CloudFront Function
46
+ * declared inline on a cache behavior. All alarms are enabled by default
47
+ * with AWS-recommended thresholds. Set individual alarms to `false` to
48
+ * disable them, or provide an {@link AlarmConfig} to tune thresholds.
49
+ *
50
+ * CloudFront Function metrics are emitted in the `us-east-1` region only
51
+ * (CloudFront is a global service). The alarms live in the stack's region —
52
+ * if that is not `us-east-1`, the alarms will not receive data.
53
+ *
54
+ * @see https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/monitoring-functions.html
55
+ */
56
+ export interface FunctionAlarmConfig {
57
+ /**
58
+ * Per-function switch: set to `false` to disable all recommended alarms
59
+ * for this one function. Individual alarms can also be disabled via their
60
+ * own entry. The global kill switch is
61
+ * {@link DistributionBuilderProps.recommendedAlarms} `: false` on the
62
+ * surrounding distribution builder, which suppresses every recommended
63
+ * alarm regardless of per-function settings.
64
+ * @default true
65
+ */
66
+ enabled?: boolean;
67
+ /**
68
+ * Alarm when the function raises runtime exceptions while processing a
69
+ * viewer request or response.
70
+ *
71
+ * Metric: `AWS/CloudFront FunctionExecutionErrors`, statistic Sum,
72
+ * period 1 minute. Default threshold: > 0 errors.
73
+ *
74
+ * @see https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/monitoring-functions.html
75
+ */
76
+ executionErrors?: AlarmConfig | false;
77
+ /**
78
+ * Alarm when the function returns an event object that fails validation
79
+ * (e.g. malformed headers, unsupported response shape).
80
+ *
81
+ * Metric: `AWS/CloudFront FunctionValidationErrors`, statistic Sum,
82
+ * period 1 minute. Default threshold: > 0 errors.
83
+ *
84
+ * @see https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/monitoring-functions.html
85
+ */
86
+ validationErrors?: AlarmConfig | false;
87
+ /**
88
+ * Alarm when the function is throttled — typically because it exceeded
89
+ * the 1ms compute-utilization budget.
90
+ *
91
+ * Metric: `AWS/CloudFront FunctionThrottles`, statistic Sum,
92
+ * period 1 minute. Default threshold: > 0 throttles.
93
+ *
94
+ * @see https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/cloudfront-function-restrictions.html
95
+ */
96
+ throttles?: AlarmConfig | false;
97
+ }
98
+ //# sourceMappingURL=alarm-config.d.ts.map
@@ -0,0 +1 @@
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;;;;;;;;;;GAUG;AACH,MAAM,WAAW,uBAAuB;IACtC;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB;;;;;;;OAOG;IACH,SAAS,CAAC,EAAE,WAAW,GAAG,KAAK,CAAC;IAEhC;;;;;;;;;;;;OAYG;IACH,aAAa,CAAC,EAAE,WAAW,GAAG,KAAK,CAAC;CACrC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,mBAAmB;IAClC;;;;;;;;OAQG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB;;;;;;;;OAQG;IACH,eAAe,CAAC,EAAE,WAAW,GAAG,KAAK,CAAC;IAEtC;;;;;;;;OAQG;IACH,gBAAgB,CAAC,EAAE,WAAW,GAAG,KAAK,CAAC;IAEvC;;;;;;;;OAQG;IACH,SAAS,CAAC,EAAE,WAAW,GAAG,KAAK,CAAC;CACjC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"alarm-config.js","sourceRoot":"","sources":["../../src/alarm-config.ts"],"names":[],"mappings":""}
@@ -0,0 +1,28 @@
1
+ import type { AlarmConfigDefaults } from "@composurecdk/cloudwatch";
2
+ interface DistributionAlarmDefaults {
3
+ enabled: true;
4
+ errorRate: AlarmConfigDefaults;
5
+ originLatency: AlarmConfigDefaults;
6
+ }
7
+ interface FunctionAlarmDefaults {
8
+ enabled: true;
9
+ executionErrors: AlarmConfigDefaults;
10
+ validationErrors: AlarmConfigDefaults;
11
+ throttles: AlarmConfigDefaults;
12
+ }
13
+ /**
14
+ * AWS-recommended default alarm configuration for CloudFront distributions.
15
+ *
16
+ * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Best_Practice_Recommended_Alarms_AWS_Services.html#CloudFront
17
+ */
18
+ export declare const DISTRIBUTION_ALARM_DEFAULTS: DistributionAlarmDefaults;
19
+ /**
20
+ * Default alarm configuration for CloudFront Functions declared inline on
21
+ * a cache behavior. Any non-zero count of errors or throttles is worth
22
+ * investigating since a function executes on every viewer request/response.
23
+ *
24
+ * @see https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/monitoring-functions.html
25
+ */
26
+ export declare const FUNCTION_ALARM_DEFAULTS: FunctionAlarmDefaults;
27
+ export {};
28
+ //# sourceMappingURL=alarm-defaults.d.ts.map
@@ -0,0 +1 @@
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;AAEpE,UAAU,yBAAyB;IACjC,OAAO,EAAE,IAAI,CAAC;IACd,SAAS,EAAE,mBAAmB,CAAC;IAC/B,aAAa,EAAE,mBAAmB,CAAC;CACpC;AAED,UAAU,qBAAqB;IAC7B,OAAO,EAAE,IAAI,CAAC;IACd,eAAe,EAAE,mBAAmB,CAAC;IACrC,gBAAgB,EAAE,mBAAmB,CAAC;IACtC,SAAS,EAAE,mBAAmB,CAAC;CAChC;AAED;;;;GAIG;AACH,eAAO,MAAM,2BAA2B,EAAE,yBAyBzC,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,uBAAuB,EAAE,qBA0BrC,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"alarm-defaults.js","sourceRoot":"","sources":["../../src/alarm-defaults.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAgB9D;;;;GAIG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAA8B;IACpE,OAAO,EAAE,IAAI;IAEb;;;OAGG;IACH,SAAS,EAAE;QACT,SAAS,EAAE,CAAC;QACZ,iBAAiB,EAAE,CAAC;QACpB,iBAAiB,EAAE,CAAC;QACpB,gBAAgB,EAAE,gBAAgB,CAAC,aAAa;KACjD;IAED;;;;OAIG;IACH,aAAa,EAAE;QACb,SAAS,EAAE,IAAI;QACf,iBAAiB,EAAE,CAAC;QACpB,iBAAiB,EAAE,CAAC;QACpB,gBAAgB,EAAE,gBAAgB,CAAC,aAAa;KACjD;CACF,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAA0B;IAC5D,OAAO,EAAE,IAAI;IAEb,8EAA8E;IAC9E,eAAe,EAAE;QACf,SAAS,EAAE,CAAC;QACZ,iBAAiB,EAAE,CAAC;QACpB,iBAAiB,EAAE,CAAC;QACpB,gBAAgB,EAAE,gBAAgB,CAAC,aAAa;KACjD;IAED,qFAAqF;IACrF,gBAAgB,EAAE;QAChB,SAAS,EAAE,CAAC;QACZ,iBAAiB,EAAE,CAAC;QACpB,iBAAiB,EAAE,CAAC;QACpB,gBAAgB,EAAE,gBAAgB,CAAC,aAAa;KACjD;IAED,wFAAwF;IACxF,SAAS,EAAE;QACT,SAAS,EAAE,CAAC;QACZ,iBAAiB,EAAE,CAAC;QACpB,iBAAiB,EAAE,CAAC;QACpB,gBAAgB,EAAE,gBAAgB,CAAC,aAAa;KACjD;CACF,CAAC"}
@@ -0,0 +1,44 @@
1
+ import type { Function as CfFunction, FunctionEventType } from "aws-cdk-lib/aws-cloudfront";
2
+ import type { AlarmDefinition } from "@composurecdk/cloudwatch";
3
+ import type { FunctionAlarmConfig } from "./alarm-config.js";
4
+ /**
5
+ * Converts a CloudFront cache-behavior path pattern into a PascalCase slug
6
+ * suitable for alarm keys and CDK construct ids. A single leading `/` is
7
+ * dropped (the common case), interior `/` becomes `Slash` so sibling patterns
8
+ * don't collide, `*` becomes `Star`, and `?` becomes `Q`. Other
9
+ * non-alphanumeric characters are stripped.
10
+ *
11
+ * Examples:
12
+ * - `/api/*` → `ApiSlashStar`
13
+ * - `/api*` → `ApiStar` (distinct from `/api/*`)
14
+ * - `*.html` → `StarHtml`
15
+ * - `images/*` → `ImagesSlashStar`
16
+ *
17
+ * @internal
18
+ */
19
+ export declare function pathPatternSlug(pattern: string): string;
20
+ /**
21
+ * Converts a {@link FunctionEventType} value (e.g. `"viewer-request"`) into
22
+ * PascalCase (e.g. `"ViewerRequest"`) for use in alarm keys and construct ids.
23
+ *
24
+ * @internal
25
+ */
26
+ export declare function eventTypePascal(eventType: FunctionEventType): string;
27
+ /**
28
+ * Builds the prefix used for every alarm key produced for a given inline
29
+ * function — e.g. `defaultBehaviorViewerRequest` or `behaviorApiStarViewerRequest`.
30
+ * Pass `null` for the default behavior.
31
+ *
32
+ * @internal
33
+ */
34
+ export declare function behaviorFunctionKeyPrefix(pathPattern: string | null, eventType: FunctionEventType): string;
35
+ /**
36
+ * Produces fully-resolved {@link AlarmDefinition}s for the three AWS-recommended
37
+ * CloudFront Function alarms — execution errors, validation errors, throttles —
38
+ * scoped to a single behavior + event type so the keys and descriptions stay
39
+ * actionable when the same underlying function is used on multiple behaviors.
40
+ *
41
+ * @internal
42
+ */
43
+ export declare function resolveBehaviorFunctionAlarmDefinitions(pathPattern: string | null, eventType: FunctionEventType, fn: CfFunction, config: FunctionAlarmConfig | false | undefined): AlarmDefinition[];
44
+ //# sourceMappingURL=behavior-function-alarms.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"behavior-function-alarms.d.ts","sourceRoot":"","sources":["../../src/behavior-function-alarms.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,IAAI,UAAU,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC5F,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAEhE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AA0B7D;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAUvD;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,iBAAiB,GAAG,MAAM,CAKpE;AAED;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CACvC,WAAW,EAAE,MAAM,GAAG,IAAI,EAC1B,SAAS,EAAE,iBAAiB,GAC3B,MAAM,CAIR;AAUD;;;;;;;GAOG;AACH,wBAAgB,uCAAuC,CACrD,WAAW,EAAE,MAAM,GAAG,IAAI,EAC1B,SAAS,EAAE,iBAAiB,EAC5B,EAAE,EAAE,UAAU,EACd,MAAM,EAAE,mBAAmB,GAAG,KAAK,GAAG,SAAS,GAC9C,eAAe,EAAE,CA4DnB"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"behavior-function-alarms.js","sourceRoot":"","sources":["../../src/behavior-function-alarms.ts"],"names":[],"mappings":"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"}