@composurecdk/apigateway 0.7.0 → 0.8.1

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 (101) 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 +46 -0
  6. package/dist/commonjs/alarm-defaults.js.map +1 -0
  7. package/dist/commonjs/builder-common.d.ts.map +1 -0
  8. package/dist/commonjs/builder-common.js +3 -0
  9. package/dist/{builder-common.js.map → commonjs/builder-common.js.map} +1 -1
  10. package/dist/commonjs/defaults.d.ts.map +1 -0
  11. package/dist/commonjs/defaults.js +56 -0
  12. package/dist/commonjs/defaults.js.map +1 -0
  13. package/dist/commonjs/deploy-options.d.ts.map +1 -0
  14. package/dist/commonjs/deploy-options.js +33 -0
  15. package/dist/commonjs/deploy-options.js.map +1 -0
  16. package/dist/commonjs/index.d.ts.map +1 -0
  17. package/dist/commonjs/index.js +13 -0
  18. package/dist/commonjs/index.js.map +1 -0
  19. package/dist/commonjs/package.json +3 -0
  20. package/dist/commonjs/resource-builder.d.ts.map +1 -0
  21. package/dist/commonjs/resource-builder.js +90 -0
  22. package/dist/commonjs/resource-builder.js.map +1 -0
  23. package/dist/commonjs/rest-api-alarms.d.ts.map +1 -0
  24. package/dist/commonjs/rest-api-alarms.js +102 -0
  25. package/dist/commonjs/rest-api-alarms.js.map +1 -0
  26. package/dist/commonjs/rest-api-builder.d.ts.map +1 -0
  27. package/dist/commonjs/rest-api-builder.js +105 -0
  28. package/dist/commonjs/rest-api-builder.js.map +1 -0
  29. package/dist/commonjs/spec-rest-api-builder.d.ts.map +1 -0
  30. package/dist/commonjs/spec-rest-api-builder.js +74 -0
  31. package/dist/commonjs/spec-rest-api-builder.js.map +1 -0
  32. package/dist/esm/alarm-config.d.ts +47 -0
  33. package/dist/esm/alarm-config.d.ts.map +1 -0
  34. package/dist/esm/alarm-config.js.map +1 -0
  35. package/dist/esm/alarm-defaults.d.ts +15 -0
  36. package/dist/esm/alarm-defaults.d.ts.map +1 -0
  37. package/dist/esm/alarm-defaults.js.map +1 -0
  38. package/dist/esm/builder-common.d.ts +68 -0
  39. package/dist/esm/builder-common.d.ts.map +1 -0
  40. package/dist/esm/builder-common.js.map +1 -0
  41. package/dist/esm/defaults.d.ts +22 -0
  42. package/dist/esm/defaults.d.ts.map +1 -0
  43. package/dist/esm/defaults.js.map +1 -0
  44. package/dist/esm/deploy-options.d.ts +17 -0
  45. package/dist/esm/deploy-options.d.ts.map +1 -0
  46. package/dist/esm/deploy-options.js.map +1 -0
  47. package/dist/esm/index.d.ts +7 -0
  48. package/dist/esm/index.d.ts.map +1 -0
  49. package/dist/esm/index.js.map +1 -0
  50. package/dist/esm/package.json +3 -0
  51. package/dist/esm/resource-builder.d.ts +70 -0
  52. package/dist/esm/resource-builder.d.ts.map +1 -0
  53. package/dist/esm/resource-builder.js.map +1 -0
  54. package/dist/esm/rest-api-alarms.d.ts +26 -0
  55. package/dist/esm/rest-api-alarms.d.ts.map +1 -0
  56. package/dist/esm/rest-api-alarms.js.map +1 -0
  57. package/dist/esm/rest-api-builder.d.ts +116 -0
  58. package/dist/esm/rest-api-builder.d.ts.map +1 -0
  59. package/dist/esm/rest-api-builder.js.map +1 -0
  60. package/dist/esm/spec-rest-api-builder.d.ts +90 -0
  61. package/dist/esm/spec-rest-api-builder.d.ts.map +1 -0
  62. package/dist/esm/spec-rest-api-builder.js.map +1 -0
  63. package/package.json +37 -19
  64. package/dist/alarm-config.d.ts.map +0 -1
  65. package/dist/alarm-defaults.d.ts.map +0 -1
  66. package/dist/alarm-defaults.js.map +0 -1
  67. package/dist/builder-common.d.ts.map +0 -1
  68. package/dist/defaults.d.ts.map +0 -1
  69. package/dist/defaults.js.map +0 -1
  70. package/dist/deploy-options.d.ts.map +0 -1
  71. package/dist/deploy-options.js.map +0 -1
  72. package/dist/index.d.ts.map +0 -1
  73. package/dist/index.js.map +0 -1
  74. package/dist/resource-builder.d.ts.map +0 -1
  75. package/dist/resource-builder.js.map +0 -1
  76. package/dist/rest-api-alarms.d.ts.map +0 -1
  77. package/dist/rest-api-alarms.js.map +0 -1
  78. package/dist/rest-api-builder.d.ts.map +0 -1
  79. package/dist/rest-api-builder.js.map +0 -1
  80. package/dist/spec-rest-api-builder.d.ts.map +0 -1
  81. package/dist/spec-rest-api-builder.js.map +0 -1
  82. /package/dist/{alarm-config.d.ts → commonjs/alarm-config.d.ts} +0 -0
  83. /package/dist/{alarm-defaults.d.ts → commonjs/alarm-defaults.d.ts} +0 -0
  84. /package/dist/{builder-common.d.ts → commonjs/builder-common.d.ts} +0 -0
  85. /package/dist/{defaults.d.ts → commonjs/defaults.d.ts} +0 -0
  86. /package/dist/{deploy-options.d.ts → commonjs/deploy-options.d.ts} +0 -0
  87. /package/dist/{index.d.ts → commonjs/index.d.ts} +0 -0
  88. /package/dist/{resource-builder.d.ts → commonjs/resource-builder.d.ts} +0 -0
  89. /package/dist/{rest-api-alarms.d.ts → commonjs/rest-api-alarms.d.ts} +0 -0
  90. /package/dist/{rest-api-builder.d.ts → commonjs/rest-api-builder.d.ts} +0 -0
  91. /package/dist/{spec-rest-api-builder.d.ts → commonjs/spec-rest-api-builder.d.ts} +0 -0
  92. /package/dist/{alarm-config.js → esm/alarm-config.js} +0 -0
  93. /package/dist/{alarm-defaults.js → esm/alarm-defaults.js} +0 -0
  94. /package/dist/{builder-common.js → esm/builder-common.js} +0 -0
  95. /package/dist/{defaults.js → esm/defaults.js} +0 -0
  96. /package/dist/{deploy-options.js → esm/deploy-options.js} +0 -0
  97. /package/dist/{index.js → esm/index.js} +0 -0
  98. /package/dist/{resource-builder.js → esm/resource-builder.js} +0 -0
  99. /package/dist/{rest-api-alarms.js → esm/rest-api-alarms.js} +0 -0
  100. /package/dist/{rest-api-builder.js → esm/rest-api-builder.js} +0 -0
  101. /package/dist/{spec-rest-api-builder.js → esm/spec-rest-api-builder.js} +0 -0
@@ -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;;;;;;;GAOG;AACH,MAAM,WAAW,kBAAkB;IACjC;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB;;;;;;;;OAQG;IACH,WAAW,CAAC,EAAE,WAAW,GAAG,KAAK,CAAC;IAElC;;;;;;;;OAQG;IACH,WAAW,CAAC,EAAE,WAAW,GAAG,KAAK,CAAC;IAElC;;;;;;;OAOG;IACH,OAAO,CAAC,EAAE,WAAW,GAAG,KAAK,CAAC;CAC/B"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=alarm-config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"alarm-config.js","sourceRoot":"","sources":["../src/alarm-config.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"alarm-config.js","sourceRoot":"","sources":["../../src/alarm-config.ts"],"names":[],"mappings":""}
@@ -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,oBAAoB;IAC5B,OAAO,EAAE,IAAI,CAAC;IACd,WAAW,EAAE,mBAAmB,CAAC;IACjC,WAAW,EAAE,mBAAmB,CAAC;IACjC,OAAO,EAAE,mBAAmB,CAAC;CAC9B;AAED;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,EAAE,oBAsCrC,CAAC"}
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.REST_API_ALARM_DEFAULTS = void 0;
4
+ const aws_cloudwatch_1 = require("aws-cdk-lib/aws-cloudwatch");
5
+ /**
6
+ * AWS-recommended default alarm configuration for API Gateway REST APIs.
7
+ *
8
+ * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Best_Practice_Recommended_Alarms_AWS_Services.html#ApiGateway
9
+ */
10
+ exports.REST_API_ALARM_DEFAULTS = {
11
+ enabled: true,
12
+ /**
13
+ * Elevated 4XX error rate indicates client-side issues such as
14
+ * authorization failures, invalid parameters, or throttling.
15
+ * Threshold 0.05 = 5% of requests.
16
+ */
17
+ clientError: {
18
+ threshold: 0.05,
19
+ evaluationPeriods: 5,
20
+ datapointsToAlarm: 5,
21
+ treatMissingData: aws_cloudwatch_1.TreatMissingData.NOT_BREACHING,
22
+ },
23
+ /**
24
+ * Elevated 5XX error rate indicates server-side issues such as
25
+ * backend failures or integration errors.
26
+ * Threshold 0.05 = 5% of requests.
27
+ */
28
+ serverError: {
29
+ threshold: 0.05,
30
+ evaluationPeriods: 3,
31
+ datapointsToAlarm: 3,
32
+ treatMissingData: aws_cloudwatch_1.TreatMissingData.NOT_BREACHING,
33
+ },
34
+ /**
35
+ * Elevated p90 latency indicates slow API responses that may
36
+ * impact user experience or trigger downstream timeouts.
37
+ * Default 2500ms threshold per AWS recommendation.
38
+ */
39
+ latency: {
40
+ threshold: 2500,
41
+ evaluationPeriods: 5,
42
+ datapointsToAlarm: 5,
43
+ treatMissingData: aws_cloudwatch_1.TreatMissingData.NOT_BREACHING,
44
+ },
45
+ };
46
+ //# sourceMappingURL=alarm-defaults.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"alarm-defaults.js","sourceRoot":"","sources":["../../src/alarm-defaults.ts"],"names":[],"mappings":";;;AAAA,+DAA8D;AAU9D;;;;GAIG;AACU,QAAA,uBAAuB,GAAyB;IAC3D,OAAO,EAAE,IAAI;IAEb;;;;OAIG;IACH,WAAW,EAAE;QACX,SAAS,EAAE,IAAI;QACf,iBAAiB,EAAE,CAAC;QACpB,iBAAiB,EAAE,CAAC;QACpB,gBAAgB,EAAE,iCAAgB,CAAC,aAAa;KACjD;IAED;;;;OAIG;IACH,WAAW,EAAE;QACX,SAAS,EAAE,IAAI;QACf,iBAAiB,EAAE,CAAC;QACpB,iBAAiB,EAAE,CAAC;QACpB,gBAAgB,EAAE,iCAAgB,CAAC,aAAa;KACjD;IAED;;;;OAIG;IACH,OAAO,EAAE;QACP,SAAS,EAAE,IAAI;QACf,iBAAiB,EAAE,CAAC;QACpB,iBAAiB,EAAE,CAAC;QACpB,gBAAgB,EAAE,iCAAgB,CAAC,aAAa;KACjD;CACF,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builder-common.d.ts","sourceRoot":"","sources":["../../src/builder-common.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAE5D;;;GAGG;AACH,MAAM,WAAW,uBAAuB;IACtC;;;;;;;;;;;;;OAaG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IAExB;;;;;;;;;;;;OAYG;IACH,iBAAiB,CAAC,EAAE,kBAAkB,GAAG,KAAK,CAAC;CAChD;AAED;;;;;GAKG;AACH,MAAM,WAAW,wBAAwB,CAAC,CAAC,SAAS,WAAW;IAC7D,qDAAqD;IACrD,GAAG,EAAE,CAAC,CAAC;IAEP;;;OAGG;IACH,cAAc,CAAC,EAAE,QAAQ,CAAC;IAE1B;;;;;;;;;;;OAWG;IACH,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;CAC/B"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=builder-common.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"builder-common.js","sourceRoot":"","sources":["../src/builder-common.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"builder-common.js","sourceRoot":"","sources":["../../src/builder-common.ts"],"names":[],"mappings":""}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../src/defaults.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,YAAY,EAAE,MAAM,4BAA4B,CAAC;AACnF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AAE1E;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,EAAE,YAmBrC,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,EAAE,OAAO,CAAC,mBAAmB,CAU1D,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,EAAE,OAAO,CAAC,uBAAuB,CAQnE,CAAC"}
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SPEC_REST_API_DEFAULTS = exports.REST_API_DEFAULTS = exports.DEPLOY_OPTIONS_DEFAULTS = void 0;
4
+ const aws_apigateway_1 = require("aws-cdk-lib/aws-apigateway");
5
+ /**
6
+ * Secure, AWS-recommended deploy-stage defaults shared by all API Gateway
7
+ * builders. Each property can be individually overridden via the builder's
8
+ * fluent API.
9
+ */
10
+ exports.DEPLOY_OPTIONS_DEFAULTS = {
11
+ /**
12
+ * Enable AWS X-Ray tracing on the API Gateway stage.
13
+ * @see https://docs.aws.amazon.com/wellarchitected/latest/serverless-applications-lens/opex-distributed-tracing.html
14
+ */
15
+ tracingEnabled: true,
16
+ /**
17
+ * Enable CloudWatch execution logging for API Gateway methods.
18
+ * @see https://docs.aws.amazon.com/wellarchitected/latest/serverless-applications-lens/opex-logging.html
19
+ */
20
+ loggingLevel: aws_apigateway_1.MethodLoggingLevel.INFO,
21
+ /**
22
+ * Disable full request/response body logging to prevent sensitive data
23
+ * from appearing in CloudWatch logs.
24
+ * @see https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-logging.html
25
+ */
26
+ dataTraceEnabled: false,
27
+ };
28
+ /**
29
+ * Secure, AWS-recommended defaults applied to every REST API built with
30
+ * {@link createRestApiBuilder}. Each property can be individually overridden
31
+ * via the builder's fluent API.
32
+ */
33
+ exports.REST_API_DEFAULTS = {
34
+ /**
35
+ * Automatically create an access log group with structured JSON output.
36
+ * Access logging provides an audit trail of all API calls for security
37
+ * monitoring and troubleshooting.
38
+ * @see https://docs.aws.amazon.com/wellarchitected/latest/serverless-applications-lens/opex-logging.html
39
+ */
40
+ accessLogging: true,
41
+ deployOptions: exports.DEPLOY_OPTIONS_DEFAULTS,
42
+ };
43
+ /**
44
+ * Secure, AWS-recommended defaults applied to every spec-driven REST API
45
+ * built with {@link createSpecRestApiBuilder}. Each property can be
46
+ * individually overridden via the builder's fluent API.
47
+ */
48
+ exports.SPEC_REST_API_DEFAULTS = {
49
+ /**
50
+ * Automatically create an access log group with structured JSON output.
51
+ * @see https://docs.aws.amazon.com/wellarchitected/latest/serverless-applications-lens/opex-logging.html
52
+ */
53
+ accessLogging: true,
54
+ deployOptions: exports.DEPLOY_OPTIONS_DEFAULTS,
55
+ };
56
+ //# sourceMappingURL=defaults.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/defaults.ts"],"names":[],"mappings":";;;AAAA,+DAAmF;AAInF;;;;GAIG;AACU,QAAA,uBAAuB,GAAiB;IACnD;;;OAGG;IACH,cAAc,EAAE,IAAI;IAEpB;;;OAGG;IACH,YAAY,EAAE,mCAAkB,CAAC,IAAI;IAErC;;;;OAIG;IACH,gBAAgB,EAAE,KAAK;CACxB,CAAC;AAEF;;;;GAIG;AACU,QAAA,iBAAiB,GAAiC;IAC7D;;;;;OAKG;IACH,aAAa,EAAE,IAAI;IAEnB,aAAa,EAAE,+BAAuB;CACvC,CAAC;AAEF;;;;GAIG;AACU,QAAA,sBAAsB,GAAqC;IACtE;;;OAGG;IACH,aAAa,EAAE,IAAI;IAEnB,aAAa,EAAE,+BAAuB;CACvC,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy-options.d.ts","sourceRoot":"","sources":["../../src/deploy-options.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,YAAY,EAClB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAG7C,UAAU,mBAAmB;IAC3B,cAAc,CAAC,EAAE,QAAQ,CAAC;IAC1B,aAAa,EAAE,YAAY,CAAC;CAC7B;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,UAAU,EACjB,EAAE,EAAE,MAAM,EACV,aAAa,EAAE,OAAO,GAAG,SAAS,EAClC,QAAQ,EAAE,YAAY,EACtB,iBAAiB,EAAE,YAAY,GAC9B,mBAAmB,CAsBrB"}
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolveDeployOptions = resolveDeployOptions;
4
+ const aws_apigateway_1 = require("aws-cdk-lib/aws-apigateway");
5
+ const logs_1 = require("@composurecdk/logs");
6
+ /**
7
+ * Resolves access logging configuration and merges deploy options with
8
+ * the provided defaults. Shared by {@link RestApiBuilder} and
9
+ * {@link SpecRestApiBuilder}.
10
+ *
11
+ * @internal
12
+ */
13
+ function resolveDeployOptions(scope, id, accessLogging, defaults, userDeployOptions) {
14
+ const autoAccessLog = (accessLogging ?? true) && !userDeployOptions.accessLogDestination;
15
+ let accessLogGroup;
16
+ let accessLogProps = {};
17
+ if (autoAccessLog) {
18
+ accessLogGroup = (0, logs_1.createLogGroupBuilder)().build(scope, `${id}AccessLogs`).logGroup;
19
+ accessLogProps = {
20
+ accessLogDestination: new aws_apigateway_1.LogGroupLogDestination(accessLogGroup),
21
+ accessLogFormat: aws_apigateway_1.AccessLogFormat.jsonWithStandardFields(),
22
+ };
23
+ }
24
+ return {
25
+ accessLogGroup,
26
+ deployOptions: {
27
+ ...defaults,
28
+ ...accessLogProps,
29
+ ...userDeployOptions,
30
+ },
31
+ };
32
+ }
33
+ //# sourceMappingURL=deploy-options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy-options.js","sourceRoot":"","sources":["../../src/deploy-options.ts"],"names":[],"mappings":";;AAqBA,oDA4BC;AAjDD,+DAIoC;AAGpC,6CAA2D;AAO3D;;;;;;GAMG;AACH,SAAgB,oBAAoB,CAClC,KAAiB,EACjB,EAAU,EACV,aAAkC,EAClC,QAAsB,EACtB,iBAA+B;IAE/B,MAAM,aAAa,GAAG,CAAC,aAAa,IAAI,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,oBAAoB,CAAC;IAEzF,IAAI,cAAoC,CAAC;IACzC,IAAI,cAAc,GAAG,EAAE,CAAC;IAExB,IAAI,aAAa,EAAE,CAAC;QAClB,cAAc,GAAG,IAAA,4BAAqB,GAAE,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,YAAY,CAAC,CAAC,QAAQ,CAAC;QAClF,cAAc,GAAG;YACf,oBAAoB,EAAE,IAAI,uCAAsB,CAAC,cAAc,CAAC;YAChE,eAAe,EAAE,gCAAe,CAAC,sBAAsB,EAAE;SAC1D,CAAC;IACJ,CAAC;IAED,OAAO;QACL,cAAc;QACd,aAAa,EAAE;YACb,GAAG,QAAQ;YACX,GAAG,cAAc;YACjB,GAAG,iBAAiB;SACrB;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EACzB,KAAK,eAAe,GACrB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,KAAK,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,EACL,wBAAwB,EACxB,KAAK,uBAAuB,EAC5B,KAAK,wBAAwB,EAC7B,KAAK,mBAAmB,GACzB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AAC1E,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.REST_API_ALARM_DEFAULTS = exports.SPEC_REST_API_DEFAULTS = exports.REST_API_DEFAULTS = exports.createSpecRestApiBuilder = exports.createRestApiBuilder = void 0;
4
+ var rest_api_builder_js_1 = require("./rest-api-builder.js");
5
+ Object.defineProperty(exports, "createRestApiBuilder", { enumerable: true, get: function () { return rest_api_builder_js_1.createRestApiBuilder; } });
6
+ var spec_rest_api_builder_js_1 = require("./spec-rest-api-builder.js");
7
+ Object.defineProperty(exports, "createSpecRestApiBuilder", { enumerable: true, get: function () { return spec_rest_api_builder_js_1.createSpecRestApiBuilder; } });
8
+ var defaults_js_1 = require("./defaults.js");
9
+ Object.defineProperty(exports, "REST_API_DEFAULTS", { enumerable: true, get: function () { return defaults_js_1.REST_API_DEFAULTS; } });
10
+ Object.defineProperty(exports, "SPEC_REST_API_DEFAULTS", { enumerable: true, get: function () { return defaults_js_1.SPEC_REST_API_DEFAULTS; } });
11
+ var alarm_defaults_js_1 = require("./alarm-defaults.js");
12
+ Object.defineProperty(exports, "REST_API_ALARM_DEFAULTS", { enumerable: true, get: function () { return alarm_defaults_js_1.REST_API_ALARM_DEFAULTS; } });
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;AAAA,6DAK+B;AAJ7B,2HAAA,oBAAoB,OAAA;AAMtB,uEAKoC;AAJlC,oIAAA,wBAAwB,OAAA;AAK1B,6CAA0E;AAAjE,gHAAA,iBAAiB,OAAA;AAAE,qHAAA,sBAAsB,OAAA;AAElD,yDAA8D;AAArD,4HAAA,uBAAuB,OAAA"}
@@ -0,0 +1,3 @@
1
+ {
2
+ "type": "commonjs"
3
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resource-builder.d.ts","sourceRoot":"","sources":["../../src/resource-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,SAAS,EAAE,KAAK,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAClG,OAAO,EAAW,KAAK,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAE9D,UAAU,gBAAgB;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,UAAU,CAAC,WAAW,CAAC,CAAC;IACtC,OAAO,CAAC,EAAE,aAAa,CAAC;CACzB;AAED,UAAU,kBAAkB;IAC1B,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAC5B,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;CAC3C;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,qBAAa,eAAe;IAC1B,gBAAgB;IAChB,QAAQ,CAAC,UAAU,EAAE,kBAAkB,CAAwC;IAE/E;;;;;;;;OAQG;IACH,SAAS,CACP,UAAU,EAAE,MAAM,EAClB,WAAW,CAAC,EAAE,UAAU,CAAC,WAAW,CAAC,EACrC,OAAO,CAAC,EAAE,aAAa,GACtB,IAAI;IAKP;;;;;;OAMG;IACH,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,CAAC,QAAQ,EAAE,eAAe,KAAK,IAAI,GAAG,IAAI;IASpF;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI;IAOvC,gBAAgB;IAChB,OAAO,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GAAG,IAAI;CAczE"}
@@ -0,0 +1,90 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ResourceBuilder = void 0;
4
+ const core_1 = require("@composurecdk/core");
5
+ /**
6
+ * A declarative builder for defining API Gateway resources and methods.
7
+ *
8
+ * `ResourceBuilder` captures a tree of resource paths and HTTP methods as
9
+ * data. The tree is applied to actual CDK constructs during
10
+ * {@link RestApiBuilder.build}. Users do not construct `ResourceBuilder`
11
+ * directly — instances are provided via the {@link IRestApiBuilder.addResource}
12
+ * callback.
13
+ *
14
+ * @example
15
+ * ```ts
16
+ * createRestApiBuilder()
17
+ * .addResource("users", users => users
18
+ * .addMethod("GET", listIntegration)
19
+ * .addResource("{id}", user => user
20
+ * .addMethod("GET", getIntegration)
21
+ * .addMethod("DELETE", deleteIntegration)
22
+ * )
23
+ * );
24
+ * ```
25
+ */
26
+ class ResourceBuilder {
27
+ /** @internal */
28
+ definition = { methods: [], children: new Map() };
29
+ /**
30
+ * Adds an HTTP method to this resource.
31
+ *
32
+ * @param httpMethod - The HTTP verb (GET, POST, PUT, DELETE, etc.).
33
+ * @param integration - The backend integration for this method. Accepts a concrete
34
+ * {@link Integration} or a {@link Ref} that resolves to one at build time.
35
+ * @param options - Additional method configuration such as authorization or method responses.
36
+ * @returns This builder for chaining.
37
+ */
38
+ addMethod(httpMethod, integration, options) {
39
+ this.definition.methods.push({ httpMethod, integration, options });
40
+ return this;
41
+ }
42
+ /**
43
+ * Adds a child resource under this resource.
44
+ *
45
+ * @param pathPart - The path segment for the child resource (e.g. "users" or "\{id\}").
46
+ * @param configure - Optional callback to configure the child resource's methods and nested resources.
47
+ * @returns This builder for chaining.
48
+ */
49
+ addResource(pathPart, configure) {
50
+ const child = new ResourceBuilder();
51
+ if (configure) {
52
+ configure(child);
53
+ }
54
+ this.definition.children.set(pathPart, child.definition);
55
+ return this;
56
+ }
57
+ /**
58
+ * Copies this builder's resource tree onto `target`. Used by
59
+ * `RestApiBuilder.[COPY_STATE]` per ADR-0005's containers-fresh,
60
+ * elements-shared rule: the `methods` array and `children` Map are
61
+ * reconstructed on `target`, but `MethodDefinition` and child
62
+ * `ResourceDefinition` entries are shared by reference. Sharing the
63
+ * child entries is safe because the public API (`addResource`)
64
+ * replaces a child wholesale rather than mutating it in place.
65
+ *
66
+ * @internal
67
+ */
68
+ copyInto(target) {
69
+ target.definition.methods.push(...this.definition.methods);
70
+ for (const [pathPart, childDef] of this.definition.children) {
71
+ target.definition.children.set(pathPart, childDef);
72
+ }
73
+ }
74
+ /** @internal */
75
+ applyTo(resource, context = {}) {
76
+ for (const method of this.definition.methods) {
77
+ const integration = method.integration !== undefined ? (0, core_1.resolve)(method.integration, context) : undefined;
78
+ resource.addMethod(method.httpMethod, integration, method.options);
79
+ }
80
+ for (const [pathPart, childDef] of this.definition.children) {
81
+ const childResource = resource.addResource(pathPart);
82
+ const childBuilder = new ResourceBuilder();
83
+ childBuilder.definition.methods = childDef.methods;
84
+ childDef.children.forEach((v, k) => childBuilder.definition.children.set(k, v));
85
+ childBuilder.applyTo(childResource, context);
86
+ }
87
+ }
88
+ }
89
+ exports.ResourceBuilder = ResourceBuilder;
90
+ //# sourceMappingURL=resource-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resource-builder.js","sourceRoot":"","sources":["../../src/resource-builder.ts"],"names":[],"mappings":";;;AACA,6CAA8D;AAa9D;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAa,eAAe;IAC1B,gBAAgB;IACP,UAAU,GAAuB,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC;IAE/E;;;;;;;;OAQG;IACH,SAAS,CACP,UAAkB,EAClB,WAAqC,EACrC,OAAuB;QAEvB,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC;QACnE,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;;OAMG;IACH,WAAW,CAAC,QAAgB,EAAE,SAA+C;QAC3E,MAAM,KAAK,GAAG,IAAI,eAAe,EAAE,CAAC;QACpC,IAAI,SAAS,EAAE,CAAC;YACd,SAAS,CAAC,KAAK,CAAC,CAAC;QACnB,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;QACzD,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,MAAuB;QAC9B,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QAC3D,KAAK,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC;YAC5D,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;IAED,gBAAgB;IAChB,OAAO,CAAC,QAAmB,EAAE,UAAkC,EAAE;QAC/D,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;YAC7C,MAAM,WAAW,GACf,MAAM,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,IAAA,cAAO,EAAC,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YACtF,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,EAAE,WAAW,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;QACrE,CAAC;QACD,KAAK,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC;YAC5D,MAAM,aAAa,GAAG,QAAQ,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;YACrD,MAAM,YAAY,GAAG,IAAI,eAAe,EAAE,CAAC;YAC3C,YAAY,CAAC,UAAU,CAAC,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC;YACnD,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAChF,YAAY,CAAC,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;CACF;AAvED,0CAuEC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rest-api-alarms.d.ts","sourceRoot":"","sources":["../../src/rest-api-alarms.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,KAAK,EAAqC,MAAM,4BAA4B,CAAC;AAC3F,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,sBAAsB,EAAoC,MAAM,0BAA0B,CAAC;AACpG,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAuB5D;;;GAGG;AACH,wBAAgB,8BAA8B,CAC5C,GAAG,EAAE,WAAW,EAChB,MAAM,EAAE,kBAAkB,GAAG,SAAS,GACrC,eAAe,EAAE,CAmDnB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,UAAU,EACjB,EAAE,EAAE,MAAM,EACV,GAAG,EAAE,WAAW,EAChB,MAAM,EAAE,kBAAkB,GAAG,KAAK,GAAG,SAAS,EAC9C,YAAY,GAAE,sBAAsB,CAAC,WAAW,CAAC,EAAO,GACvD,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAUvB"}
@@ -0,0 +1,102 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolveRestApiAlarmDefinitions = resolveRestApiAlarmDefinitions;
4
+ exports.createRestApiAlarms = createRestApiAlarms;
5
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
6
+ const aws_cloudwatch_1 = require("aws-cdk-lib/aws-cloudwatch");
7
+ const cloudwatch_1 = require("@composurecdk/cloudwatch");
8
+ const alarm_defaults_js_1 = require("./alarm-defaults.js");
9
+ const METRIC_PERIOD = aws_cdk_lib_1.Duration.minutes(1);
10
+ const METRIC_PERIOD_LABEL = `${String(METRIC_PERIOD.toMinutes())} minute`;
11
+ /**
12
+ * Creates an API Gateway metric with the correct namespace and
13
+ * dimensions (ApiName + Stage).
14
+ */
15
+ function apiMetric(api, metricName, statistic) {
16
+ return new aws_cloudwatch_1.Metric({
17
+ namespace: "AWS/ApiGateway",
18
+ metricName,
19
+ dimensionsMap: {
20
+ ApiName: api.restApiName,
21
+ Stage: api.deploymentStage.stageName,
22
+ },
23
+ statistic,
24
+ period: METRIC_PERIOD,
25
+ });
26
+ }
27
+ /**
28
+ * Resolves the recommended alarm configuration into fully-resolved
29
+ * {@link AlarmDefinition}s for an API Gateway REST API.
30
+ */
31
+ function resolveRestApiAlarmDefinitions(api, config) {
32
+ if (config?.enabled === false)
33
+ return [];
34
+ const definitions = [];
35
+ if (config?.clientError !== false) {
36
+ const cfg = (0, cloudwatch_1.resolveAlarmConfig)(config?.clientError, alarm_defaults_js_1.REST_API_ALARM_DEFAULTS.clientError);
37
+ definitions.push({
38
+ key: "clientError",
39
+ alarmName: cfg.alarmName,
40
+ metric: apiMetric(api, "4XXError", aws_cloudwatch_1.Stats.AVERAGE),
41
+ threshold: cfg.threshold,
42
+ comparisonOperator: aws_cloudwatch_1.ComparisonOperator.GREATER_THAN_THRESHOLD,
43
+ evaluationPeriods: cfg.evaluationPeriods,
44
+ datapointsToAlarm: cfg.datapointsToAlarm,
45
+ treatMissingData: cfg.treatMissingData,
46
+ description: `REST API client error rate is elevated. Threshold: > ${String(cfg.threshold * 100)}% of requests in ${METRIC_PERIOD_LABEL}.`,
47
+ });
48
+ }
49
+ if (config?.serverError !== false) {
50
+ const cfg = (0, cloudwatch_1.resolveAlarmConfig)(config?.serverError, alarm_defaults_js_1.REST_API_ALARM_DEFAULTS.serverError);
51
+ definitions.push({
52
+ key: "serverError",
53
+ alarmName: cfg.alarmName,
54
+ metric: apiMetric(api, "5XXError", aws_cloudwatch_1.Stats.AVERAGE),
55
+ threshold: cfg.threshold,
56
+ comparisonOperator: aws_cloudwatch_1.ComparisonOperator.GREATER_THAN_THRESHOLD,
57
+ evaluationPeriods: cfg.evaluationPeriods,
58
+ datapointsToAlarm: cfg.datapointsToAlarm,
59
+ treatMissingData: cfg.treatMissingData,
60
+ description: `REST API server error rate is elevated. Threshold: > ${String(cfg.threshold * 100)}% of requests in ${METRIC_PERIOD_LABEL}.`,
61
+ });
62
+ }
63
+ if (config?.latency !== false) {
64
+ const cfg = (0, cloudwatch_1.resolveAlarmConfig)(config?.latency, alarm_defaults_js_1.REST_API_ALARM_DEFAULTS.latency);
65
+ definitions.push({
66
+ key: "latency",
67
+ alarmName: cfg.alarmName,
68
+ metric: apiMetric(api, "Latency", aws_cloudwatch_1.Stats.percentile(90)),
69
+ threshold: cfg.threshold,
70
+ comparisonOperator: aws_cloudwatch_1.ComparisonOperator.GREATER_THAN_OR_EQUAL_TO_THRESHOLD,
71
+ evaluationPeriods: cfg.evaluationPeriods,
72
+ datapointsToAlarm: cfg.datapointsToAlarm,
73
+ treatMissingData: cfg.treatMissingData,
74
+ description: `REST API p90 latency is elevated. Threshold: >= ${String(cfg.threshold)}ms in ${METRIC_PERIOD_LABEL}.`,
75
+ });
76
+ }
77
+ return definitions;
78
+ }
79
+ /**
80
+ * Creates AWS-recommended CloudWatch alarms for an API Gateway REST API,
81
+ * merging recommended definitions with any custom alarm builders.
82
+ *
83
+ * @param scope - CDK construct scope for creating alarm constructs.
84
+ * @param id - Base identifier for alarm construct ids.
85
+ * @param api - The REST API to create alarms for.
86
+ * @param config - User-provided alarm configuration, or `false` to disable all.
87
+ * @param customAlarms - Custom alarm builders added via `addAlarm()`.
88
+ * @returns A record mapping alarm keys to their created Alarm constructs.
89
+ *
90
+ * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Best_Practice_Recommended_Alarms_AWS_Services.html#ApiGateway
91
+ */
92
+ function createRestApiAlarms(scope, id, api, config, customAlarms = []) {
93
+ if (config === false)
94
+ return {};
95
+ const enabled = config?.enabled ?? alarm_defaults_js_1.REST_API_ALARM_DEFAULTS.enabled;
96
+ if (!enabled)
97
+ return {};
98
+ const recommended = resolveRestApiAlarmDefinitions(api, config);
99
+ const custom = customAlarms.map((b) => b.resolve(api));
100
+ return (0, cloudwatch_1.createAlarms)(scope, id, [...recommended, ...custom]);
101
+ }
102
+ //# sourceMappingURL=rest-api-alarms.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rest-api-alarms.js","sourceRoot":"","sources":["../../src/rest-api-alarms.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rest-api-builder.d.ts","sourceRoot":"","sources":["../../src/rest-api-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,OAAO,EACP,KAAK,WAAW,EAChB,KAAK,YAAY,EAClB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,KAAK,SAAS,EAAE,KAAK,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACjF,OAAO,EAAE,KAAK,cAAc,EAAiB,MAAM,8BAA8B,CAAC;AAClF,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,KAAK,EAAE,uBAAuB,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAG7F,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAGxD;;;;GAIG;AACH,MAAM,WAAW,mBAAoB,SAAQ,YAAY,EAAE,uBAAuB;CAAG;AAErF;;;GAGG;AACH,MAAM,MAAM,oBAAoB,GAAG,wBAAwB,CAAC,OAAO,CAAC,CAAC;AAErE;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,MAAM,eAAe,GAAG,cAAc,CAAC,mBAAmB,EAAE,cAAc,CAAC,CAAC;AAElF,cAAM,cAAe,YAAW,SAAS,CAAC,oBAAoB,CAAC;;IAC7D,KAAK,EAAE,OAAO,CAAC,mBAAmB,CAAC,CAAM;IAIzC,QAAQ,CACN,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,CAAC,KAAK,EAAE,sBAAsB,CAAC,WAAW,CAAC,KAAK,sBAAsB,CAAC,WAAW,CAAC,GAC7F,IAAI;IAKP;;;;;;;;OAQG;IACH,SAAS,CACP,UAAU,EAAE,MAAM,EAClB,WAAW,CAAC,EAAE,UAAU,CAAC,WAAW,CAAC,EACrC,OAAO,CAAC,EAAE,aAAa,GACtB,IAAI;IAKP;;;;;;OAMG;IACH,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,CAAC,QAAQ,EAAE,eAAe,KAAK,IAAI,GAAG,IAAI;IAKpF;;;;;;;;OAQG;IACH,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI;IAK1C,KAAK,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,oBAAoB;CAoB7F;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,wBAAgB,oBAAoB,IAAI,eAAe,CAEtD"}
@@ -0,0 +1,105 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createRestApiBuilder = createRestApiBuilder;
4
+ const aws_apigateway_1 = require("aws-cdk-lib/aws-apigateway");
5
+ const core_1 = require("@composurecdk/core");
6
+ const cloudformation_1 = require("@composurecdk/cloudformation");
7
+ const cloudwatch_1 = require("@composurecdk/cloudwatch");
8
+ const defaults_js_1 = require("./defaults.js");
9
+ const deploy_options_js_1 = require("./deploy-options.js");
10
+ const resource_builder_js_1 = require("./resource-builder.js");
11
+ const rest_api_alarms_js_1 = require("./rest-api-alarms.js");
12
+ class RestApiBuilder {
13
+ props = {};
14
+ #root = new resource_builder_js_1.ResourceBuilder();
15
+ #customAlarms = [];
16
+ addAlarm(key, configure) {
17
+ this.#customAlarms.push(configure(new cloudwatch_1.AlarmDefinitionBuilder(key)));
18
+ return this;
19
+ }
20
+ /**
21
+ * Adds an HTTP method to the API root resource (`/`).
22
+ *
23
+ * @param httpMethod - The HTTP verb (GET, POST, PUT, DELETE, etc.).
24
+ * @param integration - The backend integration for this method. Accepts a concrete
25
+ * {@link Integration} or a {@link Ref} that resolves to one at build time.
26
+ * @param options - Additional method configuration such as authorization or method responses.
27
+ * @returns This builder for chaining.
28
+ */
29
+ addMethod(httpMethod, integration, options) {
30
+ this.#root.addMethod(httpMethod, integration, options);
31
+ return this;
32
+ }
33
+ /**
34
+ * Adds a child resource under the API root resource (`/`).
35
+ *
36
+ * @param pathPart - The path segment for the resource (e.g. "users" or "\{id\}").
37
+ * @param configure - Optional callback to configure the resource's methods and nested resources.
38
+ * @returns This builder for chaining.
39
+ */
40
+ addResource(pathPart, configure) {
41
+ this.#root.addResource(pathPart, configure);
42
+ return this;
43
+ }
44
+ /**
45
+ * Copies non-`props` state onto a freshly cloned builder. The resource
46
+ * tree is deep-cloned via `ResourceBuilder.copyInto` so mutations on
47
+ * either side after `.copy()` do not leak; the alarm-builder array is
48
+ * spread into a fresh container with elements shared by reference per
49
+ * ADR-0005's shallow-clone stance.
50
+ *
51
+ * @internal
52
+ */
53
+ [core_1.COPY_STATE](target) {
54
+ this.#root.copyInto(target.#root);
55
+ target.#customAlarms.push(...this.#customAlarms);
56
+ }
57
+ build(scope, id, context) {
58
+ const { accessLogging, recommendedAlarms: alarmConfig, ...restApiProps } = this.props;
59
+ const { accessLogGroup, deployOptions } = (0, deploy_options_js_1.resolveDeployOptions)(scope, id, accessLogging, defaults_js_1.REST_API_DEFAULTS.deployOptions ?? {}, restApiProps.deployOptions ?? {});
60
+ const api = new aws_apigateway_1.RestApi(scope, id, {
61
+ ...restApiProps,
62
+ deployOptions,
63
+ });
64
+ this.#root.applyTo(api.root, context ?? {});
65
+ const alarms = (0, rest_api_alarms_js_1.createRestApiAlarms)(scope, id, api, alarmConfig, this.#customAlarms);
66
+ return { api, accessLogGroup, alarms };
67
+ }
68
+ }
69
+ /**
70
+ * Creates a new {@link IRestApiBuilder} for configuring an API Gateway REST API.
71
+ *
72
+ * This is the entry point for defining a REST API component. The returned
73
+ * builder exposes every {@link RestApiProps} property as a fluent setter/getter,
74
+ * plus {@link IRestApiBuilder.addResource | addResource} and
75
+ * {@link IRestApiBuilder.addMethod | addMethod} for defining the resource tree.
76
+ * It implements {@link Lifecycle} for use with {@link compose}.
77
+ *
78
+ * @returns A fluent builder for an API Gateway REST API.
79
+ *
80
+ * @example
81
+ * ```ts
82
+ * const api = createRestApiBuilder()
83
+ * .restApiName("My Service")
84
+ * .description("Public API")
85
+ * .addResource("users", users => users
86
+ * .addMethod("GET", listUsersIntegration)
87
+ * .addResource("{id}", user => user
88
+ * .addMethod("GET", getUserIntegration)
89
+ * )
90
+ * );
91
+ *
92
+ * // Use standalone:
93
+ * const result = api.build(stack, "MyApi");
94
+ *
95
+ * // Or compose into a system:
96
+ * const system = compose(
97
+ * { api, handler: createFunctionBuilder() },
98
+ * { api: ["handler"], handler: [] },
99
+ * );
100
+ * ```
101
+ */
102
+ function createRestApiBuilder() {
103
+ return (0, cloudformation_1.taggedBuilder)(RestApiBuilder);
104
+ }
105
+ //# sourceMappingURL=rest-api-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rest-api-builder.js","sourceRoot":"","sources":["../../src/rest-api-builder.ts"],"names":[],"mappings":";;AA0KA,oDAEC;AA5KD,+DAMoC;AAEpC,6CAAiF;AACjF,iEAAkF;AAClF,yDAAkE;AAElE,+CAAkD;AAClD,2DAA2D;AAC3D,+DAAwD;AACxD,6DAA2D;AA2C3D,MAAM,cAAc;IAClB,KAAK,GAAiC,EAAE,CAAC;IAChC,KAAK,GAAG,IAAI,qCAAe,EAAE,CAAC;IAC9B,aAAa,GAA0C,EAAE,CAAC;IAEnE,QAAQ,CACN,GAAW,EACX,SAA8F;QAE9F,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,mCAAsB,CAAc,GAAG,CAAC,CAAC,CAAC,CAAC;QACjF,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;;;;OAQG;IACH,SAAS,CACP,UAAkB,EAClB,WAAqC,EACrC,OAAuB;QAEvB,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,UAAU,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;QACvD,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;;OAMG;IACH,WAAW,CAAC,QAAgB,EAAE,SAA+C;QAC3E,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QAC5C,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;;;;OAQG;IACH,CAAC,iBAAU,CAAC,CAAC,MAAsB;QACjC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAClC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC;IACnD,CAAC;IAED,KAAK,CAAC,KAAiB,EAAE,EAAU,EAAE,OAAgC;QACnE,MAAM,EAAE,aAAa,EAAE,iBAAiB,EAAE,WAAW,EAAE,GAAG,YAAY,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;QACtF,MAAM,EAAE,cAAc,EAAE,aAAa,EAAE,GAAG,IAAA,wCAAoB,EAC5D,KAAK,EACL,EAAE,EACF,aAAa,EACb,+BAAiB,CAAC,aAAa,IAAI,EAAE,EACrC,YAAY,CAAC,aAAa,IAAI,EAAE,CACjC,CAAC;QAEF,MAAM,GAAG,GAAG,IAAI,wBAAO,CAAC,KAAK,EAAE,EAAE,EAAE;YACjC,GAAG,YAAY;YACf,aAAa;SACd,CAAC,CAAC;QACH,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC;QAE5C,MAAM,MAAM,GAAG,IAAA,wCAAmB,EAAC,KAAK,EAAE,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QAEpF,OAAO,EAAE,GAAG,EAAE,cAAc,EAAE,MAAM,EAAE,CAAC;IACzC,CAAC;CACF;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,SAAgB,oBAAoB;IAClC,OAAO,IAAA,8BAAa,EAAsC,cAAc,CAAC,CAAC;AAC5E,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spec-rest-api-builder.d.ts","sourceRoot":"","sources":["../../src/spec-rest-api-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,WAAW,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAClG,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,KAAK,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAAE,KAAK,cAAc,EAAiB,MAAM,8BAA8B,CAAC;AAClF,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,KAAK,EAAE,uBAAuB,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAK7F;;;;;GAKG;AACH,MAAM,WAAW,uBAAwB,SAAQ,gBAAgB,EAAE,uBAAuB;CAAG;AAE7F;;;GAGG;AACH,MAAM,MAAM,wBAAwB,GAAG,wBAAwB,CAAC,WAAW,CAAC,CAAC;AAE7E;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,MAAM,mBAAmB,GAAG,cAAc,CAAC,uBAAuB,EAAE,kBAAkB,CAAC,CAAC;AAE9F,cAAM,kBAAmB,YAAW,SAAS,CAAC,wBAAwB,CAAC;;IACrE,KAAK,EAAE,OAAO,CAAC,uBAAuB,CAAC,CAAM;IAG7C,QAAQ,CACN,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,CAAC,KAAK,EAAE,sBAAsB,CAAC,WAAW,CAAC,KAAK,sBAAsB,CAAC,WAAW,CAAC,GAC7F,IAAI;IAKP,gCAAgC;IAChC,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,kBAAkB,GAAG,IAAI;IAI9C,KAAK,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,GAAG,wBAAwB;CAmB/D;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,wBAAgB,wBAAwB,IAAI,mBAAmB,CAE9D"}
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createSpecRestApiBuilder = createSpecRestApiBuilder;
4
+ const aws_apigateway_1 = require("aws-cdk-lib/aws-apigateway");
5
+ const core_1 = require("@composurecdk/core");
6
+ const cloudformation_1 = require("@composurecdk/cloudformation");
7
+ const cloudwatch_1 = require("@composurecdk/cloudwatch");
8
+ const defaults_js_1 = require("./defaults.js");
9
+ const deploy_options_js_1 = require("./deploy-options.js");
10
+ const rest_api_alarms_js_1 = require("./rest-api-alarms.js");
11
+ class SpecRestApiBuilder {
12
+ props = {};
13
+ #customAlarms = [];
14
+ addAlarm(key, configure) {
15
+ this.#customAlarms.push(configure(new cloudwatch_1.AlarmDefinitionBuilder(key)));
16
+ return this;
17
+ }
18
+ /** @internal — see ADR-0005. */
19
+ [core_1.COPY_STATE](target) {
20
+ target.#customAlarms.push(...this.#customAlarms);
21
+ }
22
+ build(scope, id) {
23
+ const { accessLogging, recommendedAlarms: alarmConfig, ...specRestApiProps } = this.props;
24
+ const { accessLogGroup, deployOptions } = (0, deploy_options_js_1.resolveDeployOptions)(scope, id, accessLogging, defaults_js_1.SPEC_REST_API_DEFAULTS.deployOptions ?? {}, specRestApiProps.deployOptions ?? {});
25
+ const api = new aws_apigateway_1.SpecRestApi(scope, id, {
26
+ ...specRestApiProps,
27
+ deployOptions,
28
+ });
29
+ const alarms = (0, rest_api_alarms_js_1.createRestApiAlarms)(scope, id, api, alarmConfig, this.#customAlarms);
30
+ return { api, accessLogGroup, alarms };
31
+ }
32
+ }
33
+ /**
34
+ * Creates a new {@link ISpecRestApiBuilder} for configuring an API Gateway
35
+ * REST API from an OpenAPI specification.
36
+ *
37
+ * This is the entry point for defining a spec-driven REST API component. The
38
+ * returned builder exposes every {@link SpecRestApiProps} property as a fluent
39
+ * setter/getter. It implements {@link Lifecycle} for use with {@link compose}.
40
+ *
41
+ * The API structure — resources, methods, and integrations — is defined
42
+ * entirely by the OpenAPI specification passed to {@link apiDefinition}.
43
+ * Use CDK's {@link ApiDefinition} static methods to load the spec from an
44
+ * inline object, a local file, or an S3 bucket.
45
+ *
46
+ * @returns A fluent builder for a spec-driven API Gateway REST API.
47
+ *
48
+ * @example
49
+ * ```ts
50
+ * // From a local OpenAPI file
51
+ * const api = createSpecRestApiBuilder()
52
+ * .restApiName("PetStore")
53
+ * .apiDefinition(ApiDefinition.fromAsset("openapi/petstore.yaml"));
54
+ *
55
+ * // From an inline definition
56
+ * const api = createSpecRestApiBuilder()
57
+ * .restApiName("PetStore")
58
+ * .apiDefinition(ApiDefinition.fromInline({
59
+ * openapi: "3.0.2",
60
+ * info: { title: "PetStore", version: "1.0" },
61
+ * paths: { "/pets": { get: { ... } } },
62
+ * }));
63
+ *
64
+ * // Compose into a system
65
+ * const system = compose(
66
+ * { api },
67
+ * { api: [] },
68
+ * );
69
+ * ```
70
+ */
71
+ function createSpecRestApiBuilder() {
72
+ return (0, cloudformation_1.taggedBuilder)(SpecRestApiBuilder);
73
+ }
74
+ //# sourceMappingURL=spec-rest-api-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spec-rest-api-builder.js","sourceRoot":"","sources":["../../src/spec-rest-api-builder.ts"],"names":[],"mappings":";;AA2HA,4DAEC;AA7HD,+DAAkG;AAElG,6CAAgE;AAChE,iEAAkF;AAClF,yDAAkE;AAElE,+CAAuD;AACvD,2DAA2D;AAC3D,6DAA2D;AAuC3D,MAAM,kBAAkB;IACtB,KAAK,GAAqC,EAAE,CAAC;IACpC,aAAa,GAA0C,EAAE,CAAC;IAEnE,QAAQ,CACN,GAAW,EACX,SAA8F;QAE9F,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,mCAAsB,CAAc,GAAG,CAAC,CAAC,CAAC,CAAC;QACjF,OAAO,IAAI,CAAC;IACd,CAAC;IAED,gCAAgC;IAChC,CAAC,iBAAU,CAAC,CAAC,MAA0B;QACrC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC;IACnD,CAAC;IAED,KAAK,CAAC,KAAiB,EAAE,EAAU;QACjC,MAAM,EAAE,aAAa,EAAE,iBAAiB,EAAE,WAAW,EAAE,GAAG,gBAAgB,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;QAC1F,MAAM,EAAE,cAAc,EAAE,aAAa,EAAE,GAAG,IAAA,wCAAoB,EAC5D,KAAK,EACL,EAAE,EACF,aAAa,EACb,oCAAsB,CAAC,aAAa,IAAI,EAAE,EAC1C,gBAAgB,CAAC,aAAa,IAAI,EAAE,CACrC,CAAC;QAEF,MAAM,GAAG,GAAG,IAAI,4BAAW,CAAC,KAAK,EAAE,EAAE,EAAE;YACrC,GAAG,gBAAgB;YACnB,aAAa;SACM,CAAC,CAAC;QAEvB,MAAM,MAAM,GAAG,IAAA,wCAAmB,EAAC,KAAK,EAAE,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QAEpF,OAAO,EAAE,GAAG,EAAE,cAAc,EAAE,MAAM,EAAE,CAAC;IACzC,CAAC;CACF;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,SAAgB,wBAAwB;IACtC,OAAO,IAAA,8BAAa,EAA8C,kBAAkB,CAAC,CAAC;AACxF,CAAC"}