@fjall/components-infrastructure 0.86.1 → 0.87.3

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 (112) hide show
  1. package/README.md +3 -3
  2. package/dist/lib/app.d.ts +166 -6
  3. package/dist/lib/app.js +212 -20
  4. package/dist/lib/aspects/resourceInventory.d.ts +4 -4
  5. package/dist/lib/aspects/resourceInventory.js +3 -3
  6. package/dist/lib/config/aws/backupGlobalSettings.js +1 -2
  7. package/dist/lib/config/aws/identityCenter.js +1 -5
  8. package/dist/lib/config/aws/organisation.js +1 -4
  9. package/dist/lib/index.d.ts +1 -0
  10. package/dist/lib/index.js +7 -1
  11. package/dist/lib/patterns/aws/buildkite.js +3 -2
  12. package/dist/lib/patterns/aws/cdn.d.ts +164 -0
  13. package/dist/lib/patterns/aws/cdn.js +264 -0
  14. package/dist/lib/patterns/aws/compute.d.ts +278 -59
  15. package/dist/lib/patterns/aws/compute.js +384 -188
  16. package/dist/lib/patterns/aws/connections.d.ts +46 -0
  17. package/dist/lib/patterns/aws/connections.js +159 -0
  18. package/dist/lib/patterns/aws/database.d.ts +124 -11
  19. package/dist/lib/patterns/aws/database.js +188 -66
  20. package/dist/lib/patterns/aws/hostedZone.js +1 -1
  21. package/dist/lib/patterns/aws/index.d.ts +3 -0
  22. package/dist/lib/patterns/aws/index.js +4 -1
  23. package/dist/lib/patterns/aws/interfaces/compute.d.ts +121 -0
  24. package/dist/lib/patterns/aws/interfaces/compute.js +48 -0
  25. package/dist/lib/patterns/aws/interfaces/connector.d.ts +183 -0
  26. package/dist/lib/patterns/aws/interfaces/connector.js +117 -0
  27. package/dist/lib/patterns/aws/interfaces/database.d.ts +136 -0
  28. package/dist/lib/patterns/aws/interfaces/database.js +65 -0
  29. package/dist/lib/patterns/aws/interfaces/index.d.ts +12 -0
  30. package/dist/lib/patterns/aws/interfaces/index.js +49 -0
  31. package/dist/lib/patterns/aws/interfaces/messaging.d.ts +146 -0
  32. package/dist/lib/patterns/aws/interfaces/messaging.js +56 -0
  33. package/dist/lib/patterns/aws/interfaces/pattern.d.ts +403 -0
  34. package/dist/lib/patterns/aws/interfaces/pattern.js +36 -0
  35. package/dist/lib/patterns/aws/interfaces/storage.d.ts +136 -0
  36. package/dist/lib/patterns/aws/interfaces/storage.js +48 -0
  37. package/dist/lib/patterns/aws/messaging.d.ts +183 -0
  38. package/dist/lib/patterns/aws/messaging.js +239 -0
  39. package/dist/lib/patterns/aws/network.js +4 -4
  40. package/dist/lib/patterns/aws/pattern.d.ts +67 -0
  41. package/dist/lib/patterns/aws/pattern.js +69 -0
  42. package/dist/lib/patterns/aws/payload.d.ts +87 -0
  43. package/dist/lib/patterns/aws/payload.js +526 -0
  44. package/dist/lib/patterns/aws/storage.d.ts +127 -15
  45. package/dist/lib/patterns/aws/storage.js +234 -38
  46. package/dist/lib/resources/aws/backup/backupPlan.js +1 -6
  47. package/dist/lib/resources/aws/backup/backupVault.js +1 -2
  48. package/dist/lib/resources/aws/base/awsStack.d.ts +0 -2
  49. package/dist/lib/resources/aws/base/awsStack.js +1 -7
  50. package/dist/lib/resources/aws/cdn/cloudFront.d.ts +71 -0
  51. package/dist/lib/resources/aws/cdn/cloudFront.js +176 -0
  52. package/dist/lib/resources/aws/cdn/index.d.ts +1 -0
  53. package/dist/lib/resources/aws/cdn/index.js +18 -0
  54. package/dist/lib/resources/aws/compute/ec2.d.ts +5 -0
  55. package/dist/lib/resources/aws/compute/ec2.js +33 -6
  56. package/dist/lib/resources/aws/compute/ecs.d.ts +32 -25
  57. package/dist/lib/resources/aws/compute/ecs.js +31 -115
  58. package/dist/lib/resources/aws/compute/lambda.d.ts +94 -5
  59. package/dist/lib/resources/aws/compute/lambda.js +209 -32
  60. package/dist/lib/resources/aws/database/database.js +1 -1
  61. package/dist/lib/resources/aws/database/dynamodb.d.ts +70 -0
  62. package/dist/lib/resources/aws/database/dynamodb.js +181 -0
  63. package/dist/lib/resources/aws/database/index.d.ts +1 -0
  64. package/dist/lib/resources/aws/database/index.js +2 -1
  65. package/dist/lib/resources/aws/database/migrationLambda.d.ts +80 -0
  66. package/dist/lib/resources/aws/database/migrationLambda.js +119 -0
  67. package/dist/lib/resources/aws/database/rdsAurora.d.ts +15 -0
  68. package/dist/lib/resources/aws/database/rdsAurora.js +41 -18
  69. package/dist/lib/resources/aws/database/rdsAuroraGlobal.js +12 -8
  70. package/dist/lib/resources/aws/database/rdsInstance.js +2 -2
  71. package/dist/lib/resources/aws/index.d.ts +2 -0
  72. package/dist/lib/resources/aws/index.js +3 -1
  73. package/dist/lib/resources/aws/messaging/eventbridge.d.ts +28 -0
  74. package/dist/lib/resources/aws/messaging/eventbridge.js +53 -0
  75. package/dist/lib/resources/aws/messaging/index.d.ts +3 -0
  76. package/dist/lib/resources/aws/messaging/index.js +20 -0
  77. package/dist/lib/resources/aws/messaging/sns.d.ts +35 -0
  78. package/dist/lib/resources/aws/messaging/sns.js +70 -0
  79. package/dist/lib/resources/aws/messaging/sqs.d.ts +105 -0
  80. package/dist/lib/resources/aws/messaging/sqs.js +231 -0
  81. package/dist/lib/resources/aws/messaging/utils.d.ts +3 -0
  82. package/dist/lib/resources/aws/messaging/utils.js +7 -0
  83. package/dist/lib/resources/aws/networking/ipam.js +1 -2
  84. package/dist/lib/resources/aws/networking/ipamPool.js +3 -2
  85. package/dist/lib/resources/aws/networking/vpc.js +1 -2
  86. package/dist/lib/resources/aws/storage/ecr.js +8 -5
  87. package/dist/lib/resources/aws/storage/s3.js +1 -2
  88. package/dist/lib/resources/aws/utilities/awsCustomResource.js +1 -1
  89. package/dist/lib/resources/aws/utilities/customResource.js +1 -1
  90. package/dist/lib/utils/getConfig.js +3 -2
  91. package/dist/lib/utils/index.d.ts +1 -0
  92. package/dist/lib/utils/index.js +2 -1
  93. package/dist/lib/utils/manifestWriter.d.ts +174 -0
  94. package/dist/lib/utils/manifestWriter.js +233 -0
  95. package/dist/lib/utils/standardTagsAspect.js +1 -8
  96. package/dist/lib/utils/validationLogger.d.ts +34 -0
  97. package/dist/lib/utils/validationLogger.js +83 -0
  98. package/package.json +3 -3
  99. package/dist/lib/__tests__/setup.d.ts +0 -48
  100. package/dist/lib/__tests__/setup.js +0 -1
  101. package/dist/lib/patterns/aws/cicdRole.d.ts +0 -67
  102. package/dist/lib/patterns/aws/cicdRole.js +0 -68
  103. package/dist/lib/resources/aws/cicd/cicdRole.d.ts +0 -65
  104. package/dist/lib/resources/aws/cicd/cicdRole.js +0 -191
  105. package/dist/lib/resources/aws/compute/ecsFreeTier.d.ts +0 -75
  106. package/dist/lib/resources/aws/compute/ecsFreeTier.js +0 -1
  107. package/dist/lib/resources/aws/compute/ecsSpot.d.ts +0 -75
  108. package/dist/lib/resources/aws/compute/ecsSpot.js +0 -1
  109. package/dist/lib/resources/aws/compute/utilities/capacityProviderDrainWaiter.d.ts +0 -20
  110. package/dist/lib/resources/aws/compute/utilities/capacityProviderDrainWaiter.js +0 -1
  111. package/dist/lib/resources/aws/utilities/cfnOutput.d.ts +0 -5
  112. package/dist/lib/resources/aws/utilities/cfnOutput.js +0 -1
@@ -0,0 +1,183 @@
1
+ import { type Construct } from "constructs";
2
+ import { type IGrantable, type Grant } from "aws-cdk-lib/aws-iam";
3
+ import type App from "../../app";
4
+ import { SQSQueue } from "../../resources/aws/messaging/sqs";
5
+ import { SNSTopic } from "../../resources/aws/messaging/sns";
6
+ import { EventBridgeBus } from "../../resources/aws/messaging/eventbridge";
7
+ import { type IQueueMessaging, type ITopicMessaging, type IEventBusMessaging, type AnyMessaging } from "./interfaces/messaging.js";
8
+ import { type IQueueConnector } from "./interfaces/connector.js";
9
+ /**
10
+ * Queue messaging props with type discriminator.
11
+ */
12
+ export interface IQueueProps {
13
+ /** Type discriminator for messaging type. */
14
+ type: "queue";
15
+ queueType?: "standard" | "fifo";
16
+ visibilityTimeout?: number;
17
+ messageRetentionPeriod?: number;
18
+ receiveMessageWaitTime?: number;
19
+ maxMessageSize?: number;
20
+ deliveryDelay?: number;
21
+ deadLetterQueue?: {
22
+ enabled: boolean;
23
+ maxReceiveCount?: number;
24
+ };
25
+ encryption?: "SSE_SQS" | "SSE_KMS" | "NONE";
26
+ kmsKeyArn?: string;
27
+ contentBasedDeduplication?: boolean;
28
+ fifoThroughputLimit?: "perQueue" | "perMessageGroupId";
29
+ deduplicationScope?: "queue" | "messageGroup";
30
+ removalPolicy?: "DESTROY" | "RETAIN";
31
+ }
32
+ /**
33
+ * Topic messaging props with type discriminator.
34
+ */
35
+ export interface ITopicProps {
36
+ /** Type discriminator for messaging type. */
37
+ type: "topic";
38
+ topicName?: string;
39
+ displayName?: string;
40
+ fifo?: boolean;
41
+ contentBasedDeduplication?: boolean;
42
+ removalPolicy?: "DESTROY" | "RETAIN";
43
+ }
44
+ /**
45
+ * EventBus messaging props with type discriminator.
46
+ */
47
+ export interface IEventBusProps {
48
+ /** Type discriminator for messaging type. */
49
+ type: "eventBus";
50
+ eventBusName?: string;
51
+ removalPolicy?: "DESTROY" | "RETAIN";
52
+ }
53
+ /**
54
+ * Union type for all messaging props.
55
+ */
56
+ export type IMessagingProps = IQueueProps | ITopicProps | IEventBusProps;
57
+ /**
58
+ * SQS queue messaging wrapper implementing IQueueMessaging interface.
59
+ * Provides grant methods and Fjall patterns for queue messaging.
60
+ */
61
+ export declare class QueueMessaging extends SQSQueue implements IQueueMessaging, IQueueConnector {
62
+ /** Type discriminator for runtime type narrowing. */
63
+ readonly messagingType: "queue";
64
+ /** The connector type for unified connection processing. */
65
+ readonly connectorType: "queue";
66
+ constructor(scope: Construct, id: string, props: IQueueProps);
67
+ /**
68
+ * Grant send message permissions to the grantee.
69
+ * Implements IQueueMessaging.grantSendMessages.
70
+ */
71
+ grantSendMessages(grantee: IGrantable): Grant;
72
+ /**
73
+ * Grant consume (receive and delete) message permissions to the grantee.
74
+ * Implements IQueueMessaging.grantConsumeMessages.
75
+ */
76
+ grantConsumeMessages(grantee: IGrantable): Grant;
77
+ /**
78
+ * Grant purge permissions to the grantee.
79
+ * Implements IQueueMessaging.grantPurge.
80
+ */
81
+ grantPurge(grantee: IGrantable): Grant;
82
+ /**
83
+ * Grant specific actions to the grantee.
84
+ * Implements IQueueMessaging.grant.
85
+ */
86
+ grant(grantee: IGrantable, ...actions: string[]): Grant;
87
+ /**
88
+ * Grant full access (send and consume) to the grantee.
89
+ * Implements IQueueMessaging.grantFull and IQueueConnector.grantFull.
90
+ */
91
+ grantFull(grantee: IGrantable): Grant;
92
+ }
93
+ /**
94
+ * SNS topic messaging wrapper implementing ITopicMessaging interface.
95
+ * Provides grant methods and Fjall patterns for topic messaging.
96
+ */
97
+ export declare class TopicMessaging extends SNSTopic implements ITopicMessaging {
98
+ /** Type discriminator for runtime type narrowing. */
99
+ readonly messagingType: "topic";
100
+ constructor(scope: Construct, id: string, props: ITopicProps);
101
+ /**
102
+ * Grant publish permissions to the grantee.
103
+ * Implements ITopicMessaging.grantPublish.
104
+ */
105
+ grantPublish(grantee: IGrantable): Grant;
106
+ /**
107
+ * Grant subscribe permissions to the grantee.
108
+ * Implements ITopicMessaging.grantSubscribe.
109
+ */
110
+ grantSubscribe(grantee: IGrantable): Grant;
111
+ }
112
+ /**
113
+ * EventBridge event bus messaging wrapper implementing IEventBusMessaging interface.
114
+ * Provides grant methods and Fjall patterns for event-driven messaging.
115
+ */
116
+ export declare class EventBusMessaging extends EventBridgeBus implements IEventBusMessaging {
117
+ /** Type discriminator for runtime type narrowing. */
118
+ readonly messagingType: "eventBus";
119
+ constructor(scope: Construct, id: string, props: IEventBusProps);
120
+ /**
121
+ * Grant put events permissions to the grantee.
122
+ * Implements IEventBusMessaging.grantPutEventsTo.
123
+ */
124
+ grantPutEventsTo(grantee: IGrantable): Grant;
125
+ }
126
+ /**
127
+ * Factory for creating messaging resources.
128
+ *
129
+ * Supports:
130
+ * - Queue (SQS)
131
+ * - Topic (SNS)
132
+ * - EventBus (EventBridge)
133
+ *
134
+ * @example
135
+ * // Standard queue with DLQ
136
+ * const notifications = app.addMessaging(MessagingFactory.build("Notifications", {
137
+ * type: "queue",
138
+ * queueType: "standard",
139
+ * deadLetterQueue: { enabled: true, maxReceiveCount: 3 }
140
+ * }));
141
+ *
142
+ * @example
143
+ * // SNS Topic for pub/sub
144
+ * const alerts = app.addMessaging(MessagingFactory.build("Alerts", {
145
+ * type: "topic",
146
+ * displayName: "Alert Notifications"
147
+ * }));
148
+ *
149
+ * @example
150
+ * // EventBridge for event-driven architecture
151
+ * const events = app.addMessaging(MessagingFactory.build("DomainEvents", {
152
+ * type: "eventBus"
153
+ * }));
154
+ *
155
+ * @example
156
+ * // Grant permissions
157
+ * notifications.grantSendMessages(producerLambda);
158
+ * alerts.grantPublish(apiService);
159
+ * events.grantPutEventsTo(orderService);
160
+ */
161
+ export declare class MessagingFactory {
162
+ /**
163
+ * Build a queue messaging factory function.
164
+ */
165
+ static build(id: string, props: IQueueProps): (app: App, scope: Construct) => QueueMessaging;
166
+ /**
167
+ * Build a topic messaging factory function.
168
+ */
169
+ static build(id: string, props: ITopicProps): (app: App, scope: Construct) => TopicMessaging;
170
+ /**
171
+ * Build an event bus messaging factory function.
172
+ */
173
+ static build(id: string, props: IEventBusProps): (app: App, scope: Construct) => EventBusMessaging;
174
+ /**
175
+ * Build a messaging factory function (generic).
176
+ */
177
+ static build(id: string, props: IMessagingProps): (app: App, scope: Construct) => AnyMessaging;
178
+ }
179
+ export type { SQSQueueProps } from "../../resources/aws/messaging/sqs";
180
+ export type { SNSTopicProps } from "../../resources/aws/messaging/sns";
181
+ export type { EventBridgeBusProps } from "../../resources/aws/messaging/eventbridge";
182
+ export type { IQueueMessaging, ITopicMessaging, IEventBusMessaging, AnyMessaging, IQueue, ITopic, IEventBus } from "./interfaces/messaging.js";
183
+ export { isQueueMessaging, isTopicMessaging, isEventBusMessaging } from "./interfaces/messaging.js";
@@ -0,0 +1,239 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isEventBusMessaging = exports.isTopicMessaging = exports.isQueueMessaging = exports.MessagingFactory = exports.EventBusMessaging = exports.TopicMessaging = exports.QueueMessaging = void 0;
4
+ const sqs_1 = require("../../resources/aws/messaging/sqs");
5
+ const sns_1 = require("../../resources/aws/messaging/sns");
6
+ const eventbridge_1 = require("../../resources/aws/messaging/eventbridge");
7
+ const validationLogger_js_1 = require("../../utils/validationLogger.js");
8
+ /**
9
+ * Validates SQS props and logs warnings for misconfigured options.
10
+ */
11
+ function validateSQSProps(props) {
12
+ // Validate visibility timeout range (0-43200 seconds = 12 hours)
13
+ if (props.visibilityTimeout !== undefined &&
14
+ (props.visibilityTimeout < 0 || props.visibilityTimeout > 43200)) {
15
+ throw new Error("visibilityTimeout must be between 0 and 43200 seconds (12 hours)");
16
+ }
17
+ // Validate message retention period (60-1209600 seconds = 1 minute to 14 days)
18
+ if (props.messageRetentionPeriod !== undefined &&
19
+ (props.messageRetentionPeriod < 60 ||
20
+ props.messageRetentionPeriod > 1209600)) {
21
+ throw new Error("messageRetentionPeriod must be between 60 and 1209600 seconds (1 minute to 14 days)");
22
+ }
23
+ // Warn about FIFO-specific options on standard queues
24
+ if (props.queueType !== "fifo") {
25
+ if (props.contentBasedDeduplication !== undefined) {
26
+ validationLogger_js_1.FjallLogger.warn("'contentBasedDeduplication' is only applicable to FIFO queues. " +
27
+ "This setting will be ignored for standard queues.");
28
+ }
29
+ if (props.fifoThroughputLimit !== undefined) {
30
+ validationLogger_js_1.FjallLogger.warn("'fifoThroughputLimit' is only applicable to FIFO queues. " +
31
+ "This setting will be ignored for standard queues.");
32
+ }
33
+ if (props.deduplicationScope !== undefined) {
34
+ validationLogger_js_1.FjallLogger.warn("'deduplicationScope' is only applicable to FIFO queues. " +
35
+ "This setting will be ignored for standard queues.");
36
+ }
37
+ }
38
+ // Validate KMS encryption
39
+ if (props.kmsKeyArn && props.encryption !== "SSE_KMS") {
40
+ validationLogger_js_1.FjallLogger.warn("'kmsKeyArn' provided but 'encryption' is not SSE_KMS. " +
41
+ "The KMS key will be ignored.");
42
+ }
43
+ }
44
+ /**
45
+ * Validates SNS Topic props.
46
+ */
47
+ function validateTopicProps(props) {
48
+ // Warn about FIFO-specific options on standard topics
49
+ if (!props.fifo && props.contentBasedDeduplication !== undefined) {
50
+ validationLogger_js_1.FjallLogger.warn("'contentBasedDeduplication' is only applicable to FIFO topics. " +
51
+ "This setting will be ignored for standard topics.");
52
+ }
53
+ }
54
+ /**
55
+ * SQS queue messaging wrapper implementing IQueueMessaging interface.
56
+ * Provides grant methods and Fjall patterns for queue messaging.
57
+ */
58
+ class QueueMessaging extends sqs_1.SQSQueue {
59
+ constructor(scope, id, props) {
60
+ const queueProps = {
61
+ queueType: props.queueType,
62
+ visibilityTimeout: props.visibilityTimeout,
63
+ messageRetentionPeriod: props.messageRetentionPeriod,
64
+ receiveMessageWaitTime: props.receiveMessageWaitTime,
65
+ maxMessageSize: props.maxMessageSize,
66
+ deliveryDelay: props.deliveryDelay,
67
+ deadLetterQueue: props.deadLetterQueue,
68
+ encryption: props.encryption,
69
+ kmsKeyArn: props.kmsKeyArn,
70
+ contentBasedDeduplication: props.contentBasedDeduplication,
71
+ fifoThroughputLimit: props.fifoThroughputLimit,
72
+ deduplicationScope: props.deduplicationScope,
73
+ removalPolicy: props.removalPolicy
74
+ };
75
+ super(scope, id, queueProps);
76
+ /** Type discriminator for runtime type narrowing. */
77
+ this.messagingType = "queue";
78
+ /** The connector type for unified connection processing. */
79
+ this.connectorType = "queue";
80
+ }
81
+ /**
82
+ * Grant send message permissions to the grantee.
83
+ * Implements IQueueMessaging.grantSendMessages.
84
+ */
85
+ grantSendMessages(grantee) {
86
+ return this.getQueue().grantSendMessages(grantee);
87
+ }
88
+ /**
89
+ * Grant consume (receive and delete) message permissions to the grantee.
90
+ * Implements IQueueMessaging.grantConsumeMessages.
91
+ */
92
+ grantConsumeMessages(grantee) {
93
+ return this.getQueue().grantConsumeMessages(grantee);
94
+ }
95
+ /**
96
+ * Grant purge permissions to the grantee.
97
+ * Implements IQueueMessaging.grantPurge.
98
+ */
99
+ grantPurge(grantee) {
100
+ return this.getQueue().grantPurge(grantee);
101
+ }
102
+ /**
103
+ * Grant specific actions to the grantee.
104
+ * Implements IQueueMessaging.grant.
105
+ */
106
+ grant(grantee, ...actions) {
107
+ return this.getQueue().grant(grantee, ...actions);
108
+ }
109
+ /**
110
+ * Grant full access (send and consume) to the grantee.
111
+ * Implements IQueueMessaging.grantFull and IQueueConnector.grantFull.
112
+ */
113
+ grantFull(grantee) {
114
+ this.grantSendMessages(grantee);
115
+ return this.grantConsumeMessages(grantee);
116
+ }
117
+ }
118
+ exports.QueueMessaging = QueueMessaging;
119
+ /**
120
+ * SNS topic messaging wrapper implementing ITopicMessaging interface.
121
+ * Provides grant methods and Fjall patterns for topic messaging.
122
+ */
123
+ class TopicMessaging extends sns_1.SNSTopic {
124
+ constructor(scope, id, props) {
125
+ const topicProps = {
126
+ topicName: props.topicName,
127
+ displayName: props.displayName,
128
+ fifo: props.fifo,
129
+ contentBasedDeduplication: props.contentBasedDeduplication,
130
+ removalPolicy: props.removalPolicy
131
+ };
132
+ super(scope, id, topicProps);
133
+ /** Type discriminator for runtime type narrowing. */
134
+ this.messagingType = "topic";
135
+ }
136
+ /**
137
+ * Grant publish permissions to the grantee.
138
+ * Implements ITopicMessaging.grantPublish.
139
+ */
140
+ grantPublish(grantee) {
141
+ return this.getTopic().grantPublish(grantee);
142
+ }
143
+ /**
144
+ * Grant subscribe permissions to the grantee.
145
+ * Implements ITopicMessaging.grantSubscribe.
146
+ */
147
+ grantSubscribe(grantee) {
148
+ return this.getTopic().grantSubscribe(grantee);
149
+ }
150
+ }
151
+ exports.TopicMessaging = TopicMessaging;
152
+ /**
153
+ * EventBridge event bus messaging wrapper implementing IEventBusMessaging interface.
154
+ * Provides grant methods and Fjall patterns for event-driven messaging.
155
+ */
156
+ class EventBusMessaging extends eventbridge_1.EventBridgeBus {
157
+ constructor(scope, id, props) {
158
+ const eventBusProps = {
159
+ eventBusName: props.eventBusName,
160
+ removalPolicy: props.removalPolicy
161
+ };
162
+ super(scope, id, eventBusProps);
163
+ /** Type discriminator for runtime type narrowing. */
164
+ this.messagingType = "eventBus";
165
+ }
166
+ /**
167
+ * Grant put events permissions to the grantee.
168
+ * Implements IEventBusMessaging.grantPutEventsTo.
169
+ */
170
+ grantPutEventsTo(grantee) {
171
+ return this.getEventBus().grantPutEventsTo(grantee);
172
+ }
173
+ }
174
+ exports.EventBusMessaging = EventBusMessaging;
175
+ /**
176
+ * Factory for creating messaging resources.
177
+ *
178
+ * Supports:
179
+ * - Queue (SQS)
180
+ * - Topic (SNS)
181
+ * - EventBus (EventBridge)
182
+ *
183
+ * @example
184
+ * // Standard queue with DLQ
185
+ * const notifications = app.addMessaging(MessagingFactory.build("Notifications", {
186
+ * type: "queue",
187
+ * queueType: "standard",
188
+ * deadLetterQueue: { enabled: true, maxReceiveCount: 3 }
189
+ * }));
190
+ *
191
+ * @example
192
+ * // SNS Topic for pub/sub
193
+ * const alerts = app.addMessaging(MessagingFactory.build("Alerts", {
194
+ * type: "topic",
195
+ * displayName: "Alert Notifications"
196
+ * }));
197
+ *
198
+ * @example
199
+ * // EventBridge for event-driven architecture
200
+ * const events = app.addMessaging(MessagingFactory.build("DomainEvents", {
201
+ * type: "eventBus"
202
+ * }));
203
+ *
204
+ * @example
205
+ * // Grant permissions
206
+ * notifications.grantSendMessages(producerLambda);
207
+ * alerts.grantPublish(apiService);
208
+ * events.grantPutEventsTo(orderService);
209
+ */
210
+ class MessagingFactory {
211
+ /**
212
+ * Implementation of the build method.
213
+ */
214
+ static build(id, props) {
215
+ return (_app, scope) => {
216
+ switch (props.type) {
217
+ case "queue":
218
+ validateSQSProps(props);
219
+ return new QueueMessaging(scope, id, props);
220
+ case "topic":
221
+ validateTopicProps(props);
222
+ return new TopicMessaging(scope, id, props);
223
+ case "eventBus":
224
+ return new EventBusMessaging(scope, id, props);
225
+ default: {
226
+ const _exhaustive = props;
227
+ throw new Error(`Unsupported messaging type: ${_exhaustive.type}`);
228
+ }
229
+ }
230
+ };
231
+ }
232
+ }
233
+ exports.MessagingFactory = MessagingFactory;
234
+ // Re-export type guards
235
+ var messaging_js_1 = require("./interfaces/messaging.js");
236
+ Object.defineProperty(exports, "isQueueMessaging", { enumerable: true, get: function () { return messaging_js_1.isQueueMessaging; } });
237
+ Object.defineProperty(exports, "isTopicMessaging", { enumerable: true, get: function () { return messaging_js_1.isTopicMessaging; } });
238
+ Object.defineProperty(exports, "isEventBusMessaging", { enumerable: true, get: function () { return messaging_js_1.isEventBusMessaging; } });
239
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vbGliL3BhdHRlcm5zL2F3cy9tZXNzYWdpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBSUEsMkRBRzJDO0FBQzNDLDJEQUcyQztBQUMzQywyRUFHbUQ7QUFDbkQseUVBQThEO0FBNkQ5RDs7R0FFRztBQUNILFNBQVMsZ0JBQWdCLENBQUMsS0FBa0I7SUFDMUMsaUVBQWlFO0lBQ2pFLElBQ0UsS0FBSyxDQUFDLGlCQUFpQixLQUFLLFNBQVM7UUFDckMsQ0FBQyxLQUFLLENBQUMsaUJBQWlCLEdBQUcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLENBQUMsRUFDaEUsQ0FBQztRQUNELE1BQU0sSUFBSSxLQUFLLENBQ2Isa0VBQWtFLENBQ25FLENBQUM7SUFDSixDQUFDO0lBRUQsK0VBQStFO0lBQy9FLElBQ0UsS0FBSyxDQUFDLHNCQUFzQixLQUFLLFNBQVM7UUFDMUMsQ0FBQyxLQUFLLENBQUMsc0JBQXNCLEdBQUcsRUFBRTtZQUNoQyxLQUFLLENBQUMsc0JBQXNCLEdBQUcsT0FBTyxDQUFDLEVBQ3pDLENBQUM7UUFDRCxNQUFNLElBQUksS0FBSyxDQUNiLHFGQUFxRixDQUN0RixDQUFDO0lBQ0osQ0FBQztJQUVELHNEQUFzRDtJQUN0RCxJQUFJLEtBQUssQ0FBQyxTQUFTLEtBQUssTUFBTSxFQUFFLENBQUM7UUFDL0IsSUFBSSxLQUFLLENBQUMseUJBQXlCLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDbEQsaUNBQVcsQ0FBQyxJQUFJLENBQ2QsaUVBQWlFO2dCQUMvRCxtREFBbUQsQ0FDdEQsQ0FBQztRQUNKLENBQUM7UUFDRCxJQUFJLEtBQUssQ0FBQyxtQkFBbUIsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUM1QyxpQ0FBVyxDQUFDLElBQUksQ0FDZCwyREFBMkQ7Z0JBQ3pELG1EQUFtRCxDQUN0RCxDQUFDO1FBQ0osQ0FBQztRQUNE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IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgeyB0eXBlIElHcmFudGFibGUsIHR5cGUgR3JhbnQgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWlhbVwiO1xuXG5pbXBvcnQgdHlwZSBBcHAgZnJvbSBcIi4uLy4uL2FwcFwiO1xuaW1wb3J0IHtcbiAgU1FTUXVldWUsXG4gIHR5cGUgU1FTUXVldWVQcm9wc1xufSBmcm9tIFwiLi4vLi4vcmVzb3VyY2VzL2F3cy9tZXNzYWdpbmcvc3FzXCI7XG5pbXBvcnQge1xuICBTTlNUb3BpYyxcbiAgdHlwZSBTTlNUb3BpY1Byb3BzXG59IGZyb20gXCIuLi8uLi9yZXNvdXJjZXMvYXdzL21lc3NhZ2luZy9zbnNcIjtcbmltcG9ydCB7XG4gIEV2ZW50QnJpZGdlQnVzLFxuICB0eXBlIEV2ZW50QnJpZGdlQnVzUHJvcHNcbn0gZnJvbSBcIi4uLy4uL3Jlc291cmNlcy9hd3MvbWVzc2FnaW5nL2V2ZW50YnJpZGdlXCI7XG5pbXBvcnQgeyBGamFsbExvZ2dlciB9IGZyb20gXCIuLi8uLi91dGlscy92YWxpZGF0aW9uTG9nZ2VyLmpzXCI7XG5pbXBvcnQge1xuICB0eXBlIElRdWV1ZU1lc3NhZ2luZyxcbiAgdHlwZSBJVG9waWNNZXNzYWdpbmcsXG4gIHR5cGUgSUV2ZW50QnVzTWVzc2FnaW5nLFxuICB0eXBlIEFueU1lc3NhZ2luZ1xufSBmcm9tIFwiLi9pbnRlcmZhY2VzL21lc3NhZ2luZy5qc1wiO1xuaW1wb3J0IHsgdHlwZSBJUXVldWVDb25uZWN0b3IgfSBmcm9tIFwiLi9pbnRlcmZhY2VzL2Nvbm5lY3Rvci5qc1wiO1xuXG4vKipcbiAqIFF1ZXVlIG1lc3NhZ2luZyBwcm9wcyB3aXRoIHR5cGUgZGlzY3JpbWluYXRvci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJUXVldWVQcm9wcyB7XG4gIC8qKiBUeXBlIGRpc2NyaW1pbmF0b3IgZm9yIG1lc3NhZ2luZyB0eXBlLiAqL1xuICB0eXBlOiBcInF1ZXVlXCI7XG4gIHF1ZXVlVHlwZT86IFwic3RhbmRhcmRcIiB8IFwiZmlmb1wiO1xuICB2aXNpYmlsaXR5VGltZW91dD86IG51bWJlcjtcbiAgbWVzc2FnZVJldGVudGlvblBlcmlvZD86IG51bWJlcjtcbiAgcmVjZWl2ZU1lc3NhZ2VXYWl0VGltZT86IG51bWJlcjtcbiAgbWF4TWVzc2FnZVNpemU/OiBudW1iZXI7XG4gIGRlbGl2ZXJ5RGVsYXk/OiBudW1iZXI7XG4gIGRlYWRMZXR0ZXJRdWV1ZT86IHtcbiAgICBlbmFibGVkOiBib29sZWFuO1xuICAgIG1heFJlY2VpdmVDb3VudD86IG51bWJlcjtcbiAgfTtcbiAgZW5jcnlwdGlvbj86IFwiU1NFX1NRU1wiIHwgXCJTU0VfS01TXCIgfCBcIk5PTkVcIjtcbiAga21zS2V5QXJuPzogc3RyaW5nO1xuICBjb250ZW50QmFzZWREZWR1cGxpY2F0aW9uPzogYm9vbGVhbjtcbiAgZmlmb1Rocm91Z2hwdXRMaW1pdD86IFwicGVyUXVldWVcIiB8IFwicGVyTWVzc2FnZUdyb3VwSWRcIjtcbiAgZGVkdXBsaWNhdGlvblNjb3BlPzogXCJxdWV1ZVwiIHwgXCJtZXNzYWdlR3JvdXBcIjtcbiAgcmVtb3ZhbFBvbGljeT86IFwiREVTVFJPWVwiIHwgXCJSRVRBSU5cIjtcbn1cblxuLyoqXG4gKiBUb3BpYyBtZXNzYWdpbmcgcHJvcHMgd2l0aCB0eXBlIGRpc2NyaW1pbmF0b3IuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSVRvcGljUHJvcHMge1xuICAvKiogVHlwZSBkaXNjcmltaW5hdG9yIGZvciBtZXNzYWdpbmcgdHlwZS4gKi9cbiAgdHlwZTogXCJ0b3BpY1wiO1xuICB0b3BpY05hbWU/OiBzdHJpbmc7XG4gIGRpc3BsYXlOYW1lPzogc3RyaW5nO1xuICBmaWZvPzogYm9vbGVhbjtcbiAgY29udGVudEJhc2VkRGVkdXBsaWNhdGlvbj86IGJvb2xlYW47XG4gIHJlbW92YWxQb2xpY3k/OiBcIkRFU1RST1lcIiB8IFwiUkVUQUlOXCI7XG59XG5cbi8qKlxuICogRXZlbnRCdXMgbWVzc2FnaW5nIHByb3BzIHdpdGggdHlwZSBkaXNjcmltaW5hdG9yLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElFdmVudEJ1c1Byb3BzIHtcbiAgLyoqIFR5cGUgZGlzY3JpbWluYXRvciBmb3IgbWVzc2FnaW5nIHR5cGUuICovXG4gIHR5cGU6IFwiZXZlbnRCdXNcIjtcbiAgZXZlbnRCdXNOYW1lPzogc3RyaW5nO1xuICByZW1vdmFsUG9saWN5PzogXCJERVNUUk9ZXCIgfCBcIlJFVEFJTlwiO1xufVxuXG4vKipcbiAqIFVuaW9uIHR5cGUgZm9yIGFsbCBtZXNzYWdpbmcgcHJvcHMuXG4gKi9cbmV4cG9ydCB0eXBlIElNZXNzYWdpbmdQcm9wcyA9IElRdWV1ZVByb3BzIHwgSVRvcGljUHJvcHMgfCBJRXZlbnRCdXNQcm9wcztcblxuLyoqXG4gKiBWYWxpZGF0ZXMgU1FTIHByb3BzIGFuZCBsb2dzIHdhcm5pbmdzIGZvciBtaXNjb25maWd1cmVkIG9wdGlvbnMuXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlU1FTUHJvcHMocHJvcHM6IElRdWV1ZVByb3BzKTogdm9pZCB7XG4gIC8vIFZhbGlkYXRlIHZpc2liaWxpdHkgdGltZW91dCByYW5nZSAoMC00MzIwMCBzZWNvbmRzID0gMTIgaG91cnMpXG4gIGlmIChcbiAgICBwcm9wcy52aXNpYmlsaXR5VGltZW91dCAhPT0gdW5kZWZpbmVkICYmXG4gICAgKHByb3BzLnZpc2liaWxpdHlUaW1lb3V0IDwgMCB8fCBwcm9wcy52aXNpYmlsaXR5VGltZW91dCA+IDQzMjAwKVxuICApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBcInZpc2liaWxpdHlUaW1lb3V0IG11c3QgYmUgYmV0d2VlbiAwIGFuZCA0MzIwMCBzZWNvbmRzICgxMiBob3VycylcIlxuICAgICk7XG4gIH1cblxuICAvLyBWYWxpZGF0ZSBtZXNzYWdlIHJldGVudGlvbiBwZXJpb2QgKDYwLTEyMDk2MDAgc2Vjb25kcyA9IDEgbWludXRlIHRvIDE0IGRheXMpXG4gIGlmIChcbiAgICBwcm9wcy5tZXNzYWdlUmV0ZW50aW9uUGVyaW9kICE9PSB1bmRlZmluZWQgJiZcbiAgICAocHJvcHMubWVzc2FnZVJldGVudGlvblBlcmlvZCA8IDYwIHx8XG4gICAgICBwcm9wcy5tZXNzYWdlUmV0ZW50aW9uUGVyaW9kID4gMTIwOTYwMClcbiAgKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgXCJtZXNzYWdlUmV0ZW50aW9uUGVyaW9kIG11c3QgYmUgYmV0d2VlbiA2MCBhbmQgMTIwOTYwMCBzZWNvbmRzICgxIG1pbnV0ZSB0byAxNCBkYXlzKVwiXG4gICAgKTtcbiAgfVxuXG4gIC8vIFdhcm4gYWJvdXQgRklGTy1zcGVjaWZpYyBvcHRpb25zIG9uIHN0YW5kYXJkIHF1ZXVlc1xuICBpZiAocHJvcHMucXVldWVUeXBlICE9PSBcImZpZm9cIikge1xuICAgIGlmIChwcm9wcy5jb250ZW50QmFzZWREZWR1cGxpY2F0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIEZqYWxsTG9nZ2VyLndhcm4oXG4gICAgICAgIFwiJ2NvbnRlbnRCYXNlZERlZHVwbGljYXRpb24nIGlzIG9ubHkgYXBwbGljYWJsZSB0byBGSUZPIHF1ZXVlcy4gXCIgK1xuICAgICAgICAgIFwiVGhpcyBzZXR0aW5nIHdpbGwgYmUgaWdub3JlZCBmb3Igc3RhbmRhcmQgcXVldWVzLlwiXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAocHJvcHMuZmlmb1Rocm91Z2hwdXRMaW1pdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBGamFsbExvZ2dlci53YXJuKFxuICAgICAgICBcIidmaWZvVGhyb3VnaHB1dExpbWl0JyBpcyBvbmx5IGFwcGxpY2FibGUgdG8gRklGTyBxdWV1ZXMuIFwiICtcbiAgICAgICAgICBcIlRoaXMgc2V0dGluZyB3aWxsIGJlIGlnbm9yZWQgZm9yIHN0YW5kYXJkIHF1ZXVlcy5cIlxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHByb3BzLmRlZHVwbGljYXRpb25TY29wZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBGamFsbExvZ2dlci53YXJuKFxuICAgICAgICBcIidkZWR1cGxpY2F0aW9uU2NvcGUnIGlzIG9ubHkgYXBwbGljYWJsZSB0byBGSUZPIHF1ZXVlcy4gXCIgK1xuICAgICAgICAgIFwiVGhpcyBzZXR0aW5nIHdpbGwgYmUgaWdub3JlZCBmb3Igc3RhbmRhcmQgcXVldWVzLlwiXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8vIFZhbGlkYXRlIEtNUyBlbmNyeXB0aW9uXG4gIGlmIChwcm9wcy5rbXNLZXlBcm4gJiYgcHJvcHMuZW5jcnlwdGlvbiAhPT0gXCJTU0VfS01TXCIpIHtcbiAgICBGamFsbExvZ2dlci53YXJuKFxuICAgICAgXCIna21zS2V5QXJuJyBwcm92aWRlZCBidXQgJ2VuY3J5cHRpb24nIGlzIG5vdCBTU0VfS01TLiBcIiArXG4gICAgICAgIFwiVGhlIEtNUyBrZXkgd2lsbCBiZSBpZ25vcmVkLlwiXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIFZhbGlkYXRlcyBTTlMgVG9waWMgcHJvcHMuXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlVG9waWNQcm9wcyhwcm9wczogSVRvcGljUHJvcHMpOiB2b2lkIHtcbiAgLy8gV2FybiBhYm91dCBGSUZPLXNwZWNpZmljIG9wdGlvbnMgb24gc3RhbmRhcmQgdG9waWNzXG4gIGlmICghcHJvcHMuZmlmbyAmJiBwcm9wcy5jb250ZW50QmFzZWREZWR1cGxpY2F0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICBGamFsbExvZ2dlci53YXJuKFxuICAgICAgXCInY29udGVudEJhc2VkRGVkdXBsaWNhdGlvbicgaXMgb25seSBhcHBsaWNhYmxlIHRvIEZJRk8gdG9waWNzLiBcIiArXG4gICAgICAgIFwiVGhpcyBzZXR0aW5nIHdpbGwgYmUgaWdub3JlZCBmb3Igc3RhbmRhcmQgdG9waWNzLlwiXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIFNRUyBxdWV1ZSBtZXNzYWdpbmcgd3JhcHBlciBpbXBsZW1lbnRpbmcgSVF1ZXVlTWVzc2FnaW5nIGludGVyZmFjZS5cbiAqIFByb3ZpZGVzIGdyYW50IG1ldGhvZHMgYW5kIEZqYWxsIHBhdHRlcm5zIGZvciBxdWV1ZSBtZXNzYWdpbmcuXG4gKi9cbmV4cG9ydCBjbGFzcyBRdWV1ZU1lc3NhZ2luZ1xuICBleHRlbmRzIFNRU1F1ZXVlXG4gIGltcGxlbWVudHMgSVF1ZXVlTWVzc2FnaW5nLCBJUXVldWVDb25uZWN0b3JcbntcbiAgLyoqIFR5cGUgZGlzY3JpbWluYXRvciBmb3IgcnVudGltZSB0eXBlIG5hcnJvd2luZy4gKi9cbiAgcHVibGljIHJlYWRvbmx5IG1lc3NhZ2luZ1R5cGUgPSBcInF1ZXVlXCIgYXMgY29uc3Q7XG5cbiAgLyoqIFRoZSBjb25uZWN0b3IgdHlwZSBmb3IgdW5pZmllZCBjb25uZWN0aW9uIHByb2Nlc3NpbmcuICovXG4gIHB1YmxpYyByZWFkb25seSBjb25uZWN0b3JUeXBlID0gXCJxdWV1ZVwiIGFzIGNvbnN0O1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBJUXVldWVQcm9wcykge1xuICAgIGNvbnN0IHF1ZXVlUHJvcHM6IFNRU1F1ZXVlUHJvcHMgPSB7XG4gICAgICBxdWV1ZVR5cGU6IHByb3BzLnF1ZXVlVHlwZSxcbiAgICAgIHZpc2liaWxpdHlUaW1lb3V0OiBwcm9wcy52aXNpYmlsaXR5VGltZW91dCxcbiAgICAgIG1lc3NhZ2VSZXRlbnRpb25QZXJpb2Q6IHByb3BzLm1lc3NhZ2VSZXRlbnRpb25QZXJpb2QsXG4gICAgICByZWNlaXZlTWVzc2FnZVdhaXRUaW1lOiBwcm9wcy5yZWNlaXZlTWVzc2FnZVdhaXRUaW1lLFxuICAgICAgbWF4TWVzc2FnZVNpemU6IHByb3BzLm1heE1lc3NhZ2VTaXplLFxuICAgICAgZGVsaXZlcnlEZWxheTogcHJvcHMuZGVsaXZlcnlEZWxheSxcbiAgICAgIGRlYWRMZXR0ZXJRdWV1ZTogcHJvcHMuZGVhZExldHRlclF1ZXVlLFxuICAgICAgZW5jcnlwdGlvbjogcHJvcHMuZW5jcnlwdGlvbixcbiAgICAgIGttc0tleUFybjogcHJvcHMua21zS2V5QXJuLFxuICAgICAgY29udGVudEJhc2VkRGVkdXBsaWNhdGlvbjogcHJvcHMuY29udGVudEJhc2VkRGVkdXBsaWNhdGlvbixcbiAgICAgIGZpZm9UaHJvdWdocHV0TGltaXQ6IHByb3BzLmZpZm9UaHJvdWdocHV0TGltaXQsXG4gICAgICBkZWR1cGxpY2F0aW9uU2NvcGU6IHByb3BzLmRlZHVwbGljYXRpb25TY29wZSxcbiAgICAgIHJlbW92YWxQb2xpY3k6IHByb3BzLnJlbW92YWxQb2xpY3lcbiAgICB9O1xuICAgIHN1cGVyKHNjb3BlLCBpZCwgcXVldWVQcm9wcyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnQgc2VuZCBtZXNzYWdlIHBlcm1pc3Npb25zIHRvIHRoZSBncmFudGVlLlxuICAgKiBJbXBsZW1lbnRzIElRdWV1ZU1lc3NhZ2luZy5ncmFudFNlbmRNZXNzYWdlcy5cbiAgICovXG4gIHB1YmxpYyBncmFudFNlbmRNZXNzYWdlcyhncmFudGVlOiBJR3JhbnRhYmxlKTogR3JhbnQge1xuICAgIHJldHVybiB0aGlzLmdldFF1ZXVlKCkuZ3JhbnRTZW5kTWVzc2FnZXMoZ3JhbnRlZSk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnQgY29uc3VtZSAocmVjZWl2ZSBhbmQgZGVsZXRlKSBtZXNzYWdlIHBlcm1pc3Npb25zIHRvIHRoZSBncmFudGVlLlxuICAgKiBJbXBsZW1lbnRzIElRdWV1ZU1lc3NhZ2luZy5ncmFudENvbnN1bWVNZXNzYWdlcy5cbiAgICovXG4gIHB1YmxpYyBncmFudENvbnN1bWVNZXNzYWdlcyhncmFudGVlOiBJR3JhbnRhYmxlKTogR3JhbnQge1xuICAgIHJldHVybiB0aGlzLmdldFF1ZXVlKCkuZ3JhbnRDb25zdW1lTWVzc2FnZXMoZ3JhbnRlZSk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnQgcHVyZ2UgcGVybWlzc2lvbnMgdG8gdGhlIGdyYW50ZWUuXG4gICAqIEltcGxlbWVudHMgSVF1ZXVlTWVzc2FnaW5nLmdyYW50UHVyZ2UuXG4gICAqL1xuICBwdWJsaWMgZ3JhbnRQdXJnZShncmFudGVlOiBJR3JhbnRhYmxlKTogR3JhbnQge1xuICAgIHJldHVybiB0aGlzLmdldFF1ZXVlKCkuZ3JhbnRQdXJnZShncmFudGVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudCBzcGVjaWZpYyBhY3Rpb25zIHRvIHRoZSBncmFudGVlLlxuICAgKiBJbXBsZW1lbnRzIElRdWV1ZU1lc3NhZ2luZy5ncmFudC5cbiAgICovXG4gIHB1YmxpYyBncmFudChncmFudGVlOiBJR3JhbnRhYmxlLCAuLi5hY3Rpb25zOiBzdHJpbmdbXSk6IEdyYW50IHtcbiAgICByZXR1cm4gdGhpcy5nZXRRdWV1ZSgpLmdyYW50KGdyYW50ZWUsIC4uLmFjdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50IGZ1bGwgYWNjZXNzIChzZW5kIGFuZCBjb25zdW1lKSB0byB0aGUgZ3JhbnRlZS5cbiAgICogSW1wbGVtZW50cyBJUXVldWVNZXNzYWdpbmcuZ3JhbnRGdWxsIGFuZCBJUXVldWVDb25uZWN0b3IuZ3JhbnRGdWxsLlxuICAgKi9cbiAgcHVibGljIGdyYW50RnVsbChncmFudGVlOiBJR3JhbnRhYmxlKTogR3JhbnQge1xuICAgIHRoaXMuZ3JhbnRTZW5kTWVzc2FnZXMoZ3JhbnRlZSk7XG4gICAgcmV0dXJuIHRoaXMuZ3JhbnRDb25zdW1lTWVzc2FnZXMoZ3JhbnRlZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBTTlMgdG9waWMgbWVzc2FnaW5nIHdyYXBwZXIgaW1wbGVtZW50aW5nIElUb3BpY01lc3NhZ2luZyBpbnRlcmZhY2UuXG4gKiBQcm92aWRlcyBncmFudCBtZXRob2RzIGFuZCBGamFsbCBwYXR0ZXJucyBmb3IgdG9waWMgbWVzc2FnaW5nLlxuICovXG5leHBvcnQgY2xhc3MgVG9waWNNZXNzYWdpbmcgZXh0ZW5kcyBTTlNUb3BpYyBpbXBsZW1lbnRzIElUb3BpY01lc3NhZ2luZyB7XG4gIC8qKiBUeXBlIGRpc2NyaW1pbmF0b3IgZm9yIHJ1bnRpbWUgdHlwZSBuYXJyb3dpbmcuICovXG4gIHB1YmxpYyByZWFkb25seSBtZXNzYWdpbmdUeXBlID0gXCJ0b3BpY1wiIGFzIGNvbnN0O1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBJVG9waWNQcm9wcykge1xuICAgIGNvbnN0IHRvcGljUHJvcHM6IFNOU1RvcGljUHJvcHMgPSB7XG4gICAgICB0b3BpY05hbWU6IHByb3BzLnRvcGljTmFtZSxcbiAgICAgIGRpc3BsYXlOYW1lOiBwcm9wcy5kaXNwbGF5TmFtZSxcbiAgICAgIGZpZm86IHByb3BzLmZpZm8sXG4gICAgICBjb250ZW50QmFzZWREZWR1cGxpY2F0aW9uOiBwcm9wcy5jb250ZW50QmFzZWREZWR1cGxpY2F0aW9uLFxuICAgICAgcmVtb3ZhbFBvbGljeTogcHJvcHMucmVtb3ZhbFBvbGljeVxuICAgIH07XG4gICAgc3VwZXIoc2NvcGUsIGlkLCB0b3BpY1Byb3BzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudCBwdWJsaXNoIHBlcm1pc3Npb25zIHRvIHRoZSBncmFudGVlLlxuICAgKiBJbXBsZW1lbnRzIElUb3BpY01lc3NhZ2luZy5ncmFudFB1Ymxpc2guXG4gICAqL1xuICBwdWJsaWMgZ3JhbnRQdWJsaXNoKGdyYW50ZWU6IElHcmFudGFibGUpOiBHcmFudCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0VG9waWMoKS5ncmFudFB1Ymxpc2goZ3JhbnRlZSk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnQgc3Vic2NyaWJlIHBlcm1pc3Npb25zIHRvIHRoZSBncmFudGVlLlxuICAgKiBJbXBsZW1lbnRzIElUb3BpY01lc3NhZ2luZy5ncmFudFN1YnNjcmliZS5cbiAgICovXG4gIHB1YmxpYyBncmFudFN1YnNjcmliZShncmFudGVlOiBJR3JhbnRhYmxlKTogR3JhbnQge1xuICAgIHJldHVybiB0aGlzLmdldFRvcGljKCkuZ3JhbnRTdWJzY3JpYmUoZ3JhbnRlZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBFdmVudEJyaWRnZSBldmVudCBidXMgbWVzc2FnaW5nIHdyYXBwZXIgaW1wbGVtZW50aW5nIElFdmVudEJ1c01lc3NhZ2luZyBpbnRlcmZhY2UuXG4gKiBQcm92aWRlcyBncmFudCBtZXRob2RzIGFuZCBGamFsbCBwYXR0ZXJucyBmb3IgZXZlbnQtZHJpdmVuIG1lc3NhZ2luZy5cbiAqL1xuZXhwb3J0IGNsYXNzIEV2ZW50QnVzTWVzc2FnaW5nXG4gIGV4dGVuZHMgRXZlbnRCcmlkZ2VCdXNcbiAgaW1wbGVtZW50cyBJRXZlbnRCdXNNZXNzYWdpbmdcbntcbiAgLyoqIFR5cGUgZGlzY3JpbWluYXRvciBmb3IgcnVudGltZSB0eXBlIG5hcnJvd2luZy4gKi9cbiAgcHVibGljIHJlYWRvbmx5IG1lc3NhZ2luZ1R5cGUgPSBcImV2ZW50QnVzXCIgYXMgY29uc3Q7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IElFdmVudEJ1c1Byb3BzKSB7XG4gICAgY29uc3QgZXZlbnRCdXNQcm9wczogRXZlbnRCcmlkZ2VCdXNQcm9wcyA9IHtcbiAgICAgIGV2ZW50QnVzTmFtZTogcHJvcHMuZXZlbnRCdXNOYW1lLFxuICAgICAgcmVtb3ZhbFBvbGljeTogcHJvcHMucmVtb3ZhbFBvbGljeVxuICAgIH07XG4gICAgc3VwZXIoc2NvcGUsIGlkLCBldmVudEJ1c1Byb3BzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudCBwdXQgZXZlbnRzIHBlcm1pc3Npb25zIHRvIHRoZSBncmFudGVlLlxuICAgKiBJbXBsZW1lbnRzIElFdmVudEJ1c01lc3NhZ2luZy5ncmFudFB1dEV2ZW50c1RvLlxuICAgKi9cbiAgcHVibGljIGdyYW50UHV0RXZlbnRzVG8oZ3JhbnRlZTogSUdyYW50YWJsZSk6IEdyYW50IHtcbiAgICByZXR1cm4gdGhpcy5nZXRFdmVudEJ1cygpLmdyYW50UHV0RXZlbnRzVG8oZ3JhbnRlZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBGYWN0b3J5IGZvciBjcmVhdGluZyBtZXNzYWdpbmcgcmVzb3VyY2VzLlxuICpcbiAqIFN1cHBvcnRzOlxuICogLSBRdWV1ZSAoU1FTKVxuICogLSBUb3BpYyAoU05TKVxuICogLSBFdmVudEJ1cyAoRXZlbnRCcmlkZ2UpXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFN0YW5kYXJkIHF1ZXVlIHdpdGggRExRXG4gKiBjb25zdCBub3RpZmljYXRpb25zID0gYXBwLmFkZE1lc3NhZ2luZyhNZXNzYWdpbmdGYWN0b3J5LmJ1aWxkKFwiTm90aWZpY2F0aW9uc1wiLCB7XG4gKiAgIHR5cGU6IFwicXVldWVcIixcbiAqICAgcXVldWVUeXBlOiBcInN0YW5kYXJkXCIsXG4gKiAgIGRlYWRMZXR0ZXJRdWV1ZTogeyBlbmFibGVkOiB0cnVlLCBtYXhSZWNlaXZlQ291bnQ6IDMgfVxuICogfSkpO1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBTTlMgVG9waWMgZm9yIHB1Yi9zdWJcbiAqIGNvbnN0IGFsZXJ0cyA9IGFwcC5hZGRNZXNzYWdpbmcoTWVzc2FnaW5nRmFjdG9yeS5idWlsZChcIkFsZXJ0c1wiLCB7XG4gKiAgIHR5cGU6IFwidG9waWNcIixcbiAqICAgZGlzcGxheU5hbWU6IFwiQWxlcnQgTm90aWZpY2F0aW9uc1wiXG4gKiB9KSk7XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEV2ZW50QnJpZGdlIGZvciBldmVudC1kcml2ZW4gYXJjaGl0ZWN0dXJlXG4gKiBjb25zdCBldmVudHMgPSBhcHAuYWRkTWVzc2FnaW5nKE1lc3NhZ2luZ0ZhY3RvcnkuYnVpbGQoXCJEb21haW5FdmVudHNcIiwge1xuICogICB0eXBlOiBcImV2ZW50QnVzXCJcbiAqIH0pKTtcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gR3JhbnQgcGVybWlzc2lvbnNcbiAqIG5vdGlmaWNhdGlvbnMuZ3JhbnRTZW5kTWVzc2FnZXMocHJvZHVjZXJMYW1iZGEpO1xuICogYWxlcnRzLmdyYW50UHVibGlzaChhcGlTZXJ2aWNlKTtcbiAqIGV2ZW50cy5ncmFudFB1dEV2ZW50c1RvKG9yZGVyU2VydmljZSk7XG4gKi9cbmV4cG9ydCBjbGFzcyBNZXNzYWdpbmdGYWN0b3J5IHtcbiAgLyoqXG4gICAqIEJ1aWxkIGEgcXVldWUgbWVzc2FnaW5nIGZhY3RvcnkgZnVuY3Rpb24uXG4gICAqL1xuICBzdGF0aWMgYnVpbGQoXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwcm9wczogSVF1ZXVlUHJvcHNcbiAgKTogKGFwcDogQXBwLCBzY29wZTogQ29uc3RydWN0KSA9PiBRdWV1ZU1lc3NhZ2luZztcblxuICAvKipcbiAgICogQnVpbGQgYSB0b3BpYyBtZXNzYWdpbmcgZmFjdG9yeSBmdW5jdGlvbi5cbiAgICovXG4gIHN0YXRpYyBidWlsZChcbiAgICBpZDogc3RyaW5nLFxuICAgIHByb3BzOiBJVG9waWNQcm9wc1xuICApOiAoYXBwOiBBcHAsIHNjb3BlOiBDb25zdHJ1Y3QpID0+IFRvcGljTWVzc2FnaW5nO1xuXG4gIC8qKlxuICAgKiBCdWlsZCBhbiBldmVudCBidXMgbWVzc2FnaW5nIGZhY3RvcnkgZnVuY3Rpb24uXG4gICAqL1xuICBzdGF0aWMgYnVpbGQoXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwcm9wczogSUV2ZW50QnVzUHJvcHNcbiAgKTogKGFwcDogQXBwLCBzY29wZTogQ29uc3RydWN0KSA9PiBFdmVudEJ1c01lc3NhZ2luZztcblxuICAvKipcbiAgICogQnVpbGQgYSBtZXNzYWdpbmcgZmFjdG9yeSBmdW5jdGlvbiAoZ2VuZXJpYykuXG4gICAqL1xuICBzdGF0aWMgYnVpbGQoXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwcm9wczogSU1lc3NhZ2luZ1Byb3BzXG4gICk6IChhcHA6IEFwcCwgc2NvcGU6IENvbnN0cnVjdCkgPT4gQW55TWVzc2FnaW5nO1xuXG4gIC8qKlxuICAgKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgYnVpbGQgbWV0aG9kLlxuICAgKi9cbiAgc3RhdGljIGJ1aWxkKFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcHJvcHM6IElNZXNzYWdpbmdQcm9wc1xuICApOiAoYXBwOiBBcHAsIHNjb3BlOiBDb25zdHJ1Y3QpID0+IEFueU1lc3NhZ2luZyB7XG4gICAgcmV0dXJuIChfYXBwOiBBcHAsIHNjb3BlOiBDb25zdHJ1Y3QpOiBBbnlNZXNzYWdpbmcgPT4ge1xuICAgICAgc3dpdGNoIChwcm9wcy50eXBlKSB7XG4gICAgICAgIGNhc2UgXCJxdWV1ZVwiOlxuICAgICAgICAgIHZhbGlkYXRlU1FTUHJvcHMocHJvcHMpO1xuICAgICAgICAgIHJldHVybiBuZXcgUXVldWVNZXNzYWdpbmcoc2NvcGUsIGlkLCBwcm9wcyk7XG4gICAgICAgIGNhc2UgXCJ0b3BpY1wiOlxuICAgICAgICAgIHZhbGlkYXRlVG9waWNQcm9wcyhwcm9wcyk7XG4gICAgICAgICAgcmV0dXJuIG5ldyBUb3BpY01lc3NhZ2luZyhzY29wZSwgaWQsIHByb3BzKTtcbiAgICAgICAgY2FzZSBcImV2ZW50QnVzXCI6XG4gICAgICAgICAgcmV0dXJuIG5ldyBFdmVudEJ1c01lc3NhZ2luZyhzY29wZSwgaWQsIHByb3BzKTtcbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIGNvbnN0IF9leGhhdXN0aXZlOiBuZXZlciA9IHByb3BzO1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBVbnN1cHBvcnRlZCBtZXNzYWdpbmcgdHlwZTogJHsoX2V4aGF1c3RpdmUgYXMgSU1lc3NhZ2luZ1Byb3BzKS50eXBlfWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxufVxuXG4vLyBSZS1leHBvcnQgdHlwZXMgZm9yIGNvbnZlbmllbmNlXG5leHBvcnQgdHlwZSB7IFNRU1F1ZXVlUHJvcHMgfSBmcm9tIFwiLi4vLi4vcmVzb3VyY2VzL2F3cy9tZXNzYWdpbmcvc3FzXCI7XG5leHBvcnQgdHlwZSB7IFNOU1RvcGljUHJvcHMgfSBmcm9tIFwiLi4vLi4vcmVzb3VyY2VzL2F3cy9tZXNzYWdpbmcvc25zXCI7XG5leHBvcnQgdHlwZSB7IEV2ZW50QnJpZGdlQnVzUHJvcHMgfSBmcm9tIFwiLi4vLi4vcmVzb3VyY2VzL2F3cy9tZXNzYWdpbmcvZXZlbnRicmlkZ2VcIjtcblxuLy8gUmUtZXhwb3J0IGludGVyZmFjZSB0eXBlc1xuZXhwb3J0IHR5cGUge1xuICBJUXVldWVNZXNzYWdpbmcsXG4gIElUb3BpY01lc3NhZ2luZyxcbiAgSUV2ZW50QnVzTWVzc2FnaW5nLFxuICBBbnlNZXNzYWdpbmcsXG4gIElRdWV1ZSxcbiAgSVRvcGljLFxuICBJRXZlbnRCdXNcbn0gZnJvbSBcIi4vaW50ZXJmYWNlcy9tZXNzYWdpbmcuanNcIjtcblxuLy8gUmUtZXhwb3J0IHR5cGUgZ3VhcmRzXG5leHBvcnQge1xuICBpc1F1ZXVlTWVzc2FnaW5nLFxuICBpc1RvcGljTWVzc2FnaW5nLFxuICBpc0V2ZW50QnVzTWVzc2FnaW5nXG59IGZyb20gXCIuL2ludGVyZmFjZXMvbWVzc2FnaW5nLmpzXCI7XG4iXX0=
@@ -4,16 +4,17 @@ exports.Network = exports.NetworkFactory = void 0;
4
4
  const constructs_1 = require("constructs");
5
5
  const aws_cdk_lib_1 = require("aws-cdk-lib");
6
6
  const vpc_1 = require("../../resources/aws/networking/vpc");
7
+ const validationLogger_js_1 = require("../../utils/validationLogger.js");
7
8
  function validateNetworkProps(props) {
8
9
  if (props.maxAzs !== undefined && (props.maxAzs < 1 || props.maxAzs > 3)) {
9
- console.warn(`[Fjall] Warning: 'maxAzs' should be between 1 and 3. Got: ${props.maxAzs}.`);
10
+ validationLogger_js_1.FjallLogger.warn(`'maxAzs' should be between 1 and 3. Got: ${props.maxAzs}.`);
10
11
  }
11
12
  if (typeof props.natGateways === "object" &&
12
13
  props.natGateways !== null &&
13
14
  props.natGateways.count !== undefined) {
14
15
  const maxAzs = props.maxAzs ?? 3;
15
16
  if (props.natGateways.count > maxAzs) {
16
- console.warn(`[Fjall] Warning: 'natGateways.count' (${props.natGateways.count}) exceeds maxAzs (${maxAzs}).`);
17
+ validationLogger_js_1.FjallLogger.warn(`'natGateways.count' (${props.natGateways.count}) exceeds maxAzs (${maxAzs}).`);
17
18
  }
18
19
  }
19
20
  if (props.transitGateway && !props.transitGateway.id) {
@@ -78,7 +79,6 @@ class Network extends constructs_1.Construct {
78
79
  resolveEndpointsConfig(config) {
79
80
  if (config === false)
80
81
  return false;
81
- // Default: gateway endpoints enabled
82
82
  if (config === undefined) {
83
83
  return { gateway: { s3: true, dynamodb: true } };
84
84
  }
@@ -97,4 +97,4 @@ class Network extends constructs_1.Construct {
97
97
  }
98
98
  }
99
99
  exports.Network = Network;
100
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV0d29yay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9wYXR0ZXJucy9hd3MvbmV0d29yay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwyQ0FBdUM7QUFDdkMsNkNBQWlDO0FBSWpDLDREQUF3RTtBQXVFeEUsU0FBUyxvQkFBb0IsQ0FBQyxLQUFvQjtJQUNoRCxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssU0FBUyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3pFLE9BQU8sQ0FBQyxJQUFJLENBQ1YsNkRBQTZELEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FDN0UsQ0FBQztJQUNKLENBQUM7SUFFRCxJQUNFLE9BQU8sS0FBSyxDQUFDLFdBQVcsS0FBSyxRQUFRO1FBQ3JDLEtBQUssQ0FBQyxXQUFXLEtBQUssSUFBSTtRQUMxQixLQUFLLENBQUMsV0FBVyxDQUFDLEtBQUssS0FBSyxTQUFTLEVBQ3JDLENBQUM7UUFDRCxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQztRQUNqQyxJQUFJLEtBQUssQ0FBQyxXQUFXLENBQUMsS0FBSyxHQUFHLE1BQU0sRUFBRSxDQUFDO1lBQ3JDLE9BQU8sQ0FBQyxJQUFJLENBQ1YseUNBQXlDLEtBQUssQ0FBQyxXQUFXLENBQUMsS0FBSyxxQkFBcUIsTUFBTSxJQUFJLENBQ2hHLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztJQUVELElBQUksS0FBSyxDQUFDLGNBQWMsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDckQsTUFBTSxJQUFJLEtBQUssQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFDO0lBQ2xFLENBQUM7QUFDSCxDQUFDO0FBRUQsTUFBYSxjQUFjO0lBQ3pCLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFB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SUFBSSxNQUFNLEtBQUssS0FBSztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBRW5DLHFDQUFxQztRQUNyQyxJQUFJLE1BQU0sS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUN6QixPQUFPLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQztRQUNuRCxDQUFDO1FBRUQsT0FBTztZQUNMLE9BQU8sRUFDTCxNQUFNLENBQUMsT0FBTyxLQUFLLEtBQUs7Z0JBQ3RCLENBQUMsQ0FBQyxLQUFLO2dCQUNQLENBQUMsQ0FBQztvQkFDRSxFQUFFLEVBQUUsTUFBTSxDQUFDLE9BQU8sRUFBRSxFQUFFLElBQUksSUFBSTtvQkFDOUIsUUFBUSxFQUFFLE1BQU0sQ0FBQyxPQUFPLEVBQUUsUUFBUSxJQUFJLElBQUk7aUJBQzNDO1lBQ1AsU0FBUyxFQUFFLE1BQU0sQ0FBQyxTQUFTLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTO1NBQ2pFLENBQUM7SUFDSixDQUFDO0lBRUQsTUFBTTtRQUNKLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQztJQUNsQixDQUFDO0NBQ0Y7QUF0R0QsMEJBc0dDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IEZuIH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgeyB0eXBlIElWcGMgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVjMlwiO1xuXG5pbXBvcnQgdHlwZSBBcHAgZnJvbSBcIi4uLy4uL2FwcFwiO1xuaW1wb3J0IHsgVnBjLCB0eXBlIFZwY1Byb3BzIH0gZnJvbSBcIi4uLy4uL3Jlc291cmNlcy9hd3MvbmV0d29ya2luZy92cGNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBOYXRDb25maWcge1xuICBjb3VudD86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGbG93TG9nQ29uZmlnIHtcbiAgZGVzdGluYXRpb24/OiBcImNsb3Vkd2F0Y2hcIiB8IFwiczNcIjtcbiAgcmV0ZW50aW9uRGF5cz86IG51bWJlcjtcbiAgdHJhZmZpY1R5cGU/OiBcIkFMTFwiIHwgXCJBQ0NFUFRcIiB8IFwiUkVKRUNUXCI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2F0ZXdheUVuZHBvaW50c0NvbmZpZyB7XG4gIHMzPzogYm9vbGVhbjtcbiAgZHluYW1vZGI/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEludGVyZmFjZUVuZHBvaW50c0NvbmZpZyB7XG4gIGVjcj86IGJvb2xlYW47XG4gIHNlY3JldHNNYW5hZ2VyPzogYm9vbGVhbjtcbiAga21zPzogYm9vbGVhbjtcbiAgY2xvdWR3YXRjaExvZ3M/OiBib29sZWFuO1xuICBzc20/OiBib29sZWFuO1xuICBzdHM/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZwY0VuZHBvaW50c0NvbmZpZyB7XG4gIGdhdGV3YXk/OiBHYXRld2F5RW5kcG9pbnRzQ29uZmlnIHwgZmFsc2U7XG4gIGludGVyZmFjZT86IEludGVyZmFjZUVuZHBvaW50c0NvbmZpZyB8IGZhbHNlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN1Ym5ldENvbmZpZyB7XG4gIGNpZHJNYXNrPzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN1Ym5ldHNDb25maWcge1xuICBwdWJsaWM/OiBTdWJuZXRDb25maWc7XG4gIHByaXZhdGU/OiBTdWJuZXRDb25maWc7XG4gIGlzb2xhdGVkPzogU3VibmV0Q29uZmlnIHwgZmFsc2U7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNpdEdhdGV3YXlDb25maWcge1xuICBpZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIE5ldHdvcmsgKFZQQykgY29uZmlndXJhdGlvbi5cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gTWluaW1hbCBjb3N0IFZQQyAobm8gTkFULCBnYXRld2F5IGVuZHBvaW50cyBvbmx5KVxuICogeyBuYXRHYXRld2F5czogZmFsc2UgfVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBQcm9kdWN0aW9uIFZQQyB3aXRoIDEgTkFUIGdhdGV3YXlcbiAqIHsgbmF0R2F0ZXdheXM6IHsgY291bnQ6IDEgfSwgZmxvd0xvZ3M6IHt9IH1cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gSGlnaC1hdmFpbGFiaWxpdHkgVlBDIHdpdGggaW50ZXJmYWNlIGVuZHBvaW50c1xuICogeyBtYXhBenM6IDMsIG5hdEdhdGV3YXlzOiB7IGNvdW50OiAzIH0sIHZwY0VuZHBvaW50czogeyBpbnRlcmZhY2U6IHsgZWNyOiB0cnVlIH0gfSB9XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSU5ldHdvcmtQcm9wcyB7XG4gIHZwY05hbWU/OiBzdHJpbmc7XG4gIG1heEF6cz86IG51bWJlcjtcbiAgY2lkck1hc2s/OiBudW1iZXI7XG4gIG5hdEdhdGV3YXlzPzogTmF0Q29uZmlnIHwgZmFsc2U7XG4gIGZsb3dMb2dzPzogRmxvd0xvZ0NvbmZpZyB8IGZhbHNlO1xuICB2cGNFbmRwb2ludHM/OiBWcGNFbmRwb2ludHNDb25maWcgfCBmYWxzZTtcbiAgc3VibmV0cz86IFN1Ym5ldHNDb25maWc7XG4gIHRyYW5zaXRHYXRld2F5PzogVHJhbnNpdEdhdGV3YXlDb25maWc7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlTmV0d29ya1Byb3BzKHByb3BzOiBJTmV0d29ya1Byb3BzKTogdm9pZCB7XG4gIGlmIChwcm9wcy5tYXhBenMgIT09IHVuZGVmaW5lZCAmJiAocHJvcHMubWF4QXpzIDwgMSB8fCBwcm9wcy5tYXhBenMgPiAzKSkge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgIGBbRmphbGxdIFdhcm5pbmc6ICdtYXhBenMnIHNob3VsZCBiZSBiZXR3ZWVuIDEgYW5kIDMuIEdvdDogJHtwcm9wcy5tYXhBenN9LmBcbiAgICApO1xuICB9XG5cbiAgaWYgKFxuICAgIHR5cGVvZiBwcm9wcy5uYXRHYXRld2F5cyA9PT0gXCJvYmplY3RcIiAmJlxuICAgIHByb3BzLm5hdEdhdGV3YXlzICE9PSBudWxsICYmXG4gICAgcHJvcHMubmF0R2F0ZXdheXMuY291bnQgIT09IHVuZGVmaW5lZFxuICApIHtcbiAgICBjb25zdCBtYXhBenMgPSBwcm9wcy5tYXhBenMgPz8gMztcbiAgICBpZiAocHJvcHMubmF0R2F0ZXdheXMuY291bnQgPiBtYXhBenMpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYFtGamFsbF0gV2FybmluZzogJ25hdEdhdGV3YXlzLmNvdW50JyAoJHtwcm9wcy5uYXRHYXRld2F5cy5jb3VudH0pIGV4Y2VlZHMgbWF4QXpzICgke21heEF6c30pLmBcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHByb3BzLnRyYW5zaXRHYXRld2F5ICYmICFwcm9wcy50cmFuc2l0R2F0ZXdheS5pZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIlRyYW5zaXQgR2F0ZXdheSBjb25maWd1cmF0aW9uIHJlcXVpcmVzICdpZCcuXCIpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBOZXR3b3JrRmFjdG9yeSB7XG4gIHN0YXRpYyBidWlsZChpZDogc3RyaW5nLCBwcm9wczogSU5ldHdvcmtQcm9wcykge1xuICAgIHJldHVybiAoYXBwOiBBcHAsIHNjb3BlOiBDb25zdHJ1Y3QpID0+IHtcbiAgICAgIHZhbGlkYXRlTmV0d29ya1Byb3BzKHByb3BzKTtcbiAgICAgIHJldHVybiBuZXcgTmV0d29yayhzY29wZSwgaWQsIHByb3BzLCBhcHApO1xuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE5ldHdvcmsgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICBwdWJsaWMgcmVhZG9ubHkgdnBjOiBWcGM7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IElOZXR3b3JrUHJvcHMsIGFwcDogQXBwKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcbiAgICB0aGlzLnZwYyA9IHRoaXMuY3JlYXRlVnBjKGlkLCBwcm9wcywgYXBwKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlVnBjKGlkOiBzdHJpbmcsIHByb3BzOiBJTmV0d29ya1Byb3BzLCBhcHA6IEFwcCk6IFZwYyB7XG4gICAgY29uc3QgYWNjb3VudElkID1cbiAgICAgIGFwcC5ub2RlLnRyeUdldENvbnRleHQoXCJhY2NvdW50SWRcIikgfHwgcHJvY2Vzcy5lbnYuQ0RLX0RFRkFVTFRfQUNDT1VOVDtcbiAgICBjb25zdCByZWdpb24gPSBwcm9jZXNzLmVudi5DREtfREVGQVVMVF9SRUdJT047XG4gICAgY29uc3QgaXNNYW5hZ2VkQWNjb3VudCA9XG4gICAgICBhcHAubm9kZS50cnlHZXRDb250ZXh0KFwibWFuYWdlZEFjY291bnRcIikgPT09IFwidHJ1ZVwiO1xuXG4gICAgbGV0IGlwdjRJcGFtUG9vbElkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgaWYgKGlzTWFuYWdlZEFjY291bnQgJiYgYWNjb3VudElkICYmIHJlZ2lvbikge1xuICAgICAgY29uc3QgcmVnaW9uU3VmZml4ID0gcmVnaW9uLnJlcGxhY2UoLy0vZywgXCJcIik7XG4gICAgICBpcHY0SXBhbVBvb2xJZCA9IEZuLmltcG9ydFZhbHVlKGBJcGFtUG9vbElkJHthY2NvdW50SWR9JHtyZWdpb25TdWZmaXh9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgdnBjUHJvcHM6IFZwY1Byb3BzID0ge1xuICAgICAgdnBjTmFtZTogcHJvcHMudnBjTmFtZSxcbiAgICAgIGFjY291bnRJZCxcbiAgICAgIHJlZ2lvbixcbiAgICAgIGlwdjRJcGFtUG9vbElkLFxuICAgICAgbWF4QXpzOiBwcm9wcy5tYXhBenMsXG4gICAgICB2cGNDaWRyTWFzazogcHJvcHMuY2lkck1hc2ssXG4gICAgICBzdWJuZXRDaWRyTWFzazogcHJvcHMuc3VibmV0cz8ucHJpdmF0ZT8uY2lkck1hc2ssXG4gICAgICBuYXRHYXRld2F5Q29uZmlnOiB0aGlzLnJlc29sdmVOYXRDb25maWcocHJvcHMubmF0R2F0ZXdheXMpLFxuICAgICAgZmxvd0xvZ0NvbmZpZzogdGhpcy5yZXNvbHZlRmxvd0xvZ0NvbmZpZyhwcm9wcy5mbG93TG9ncyksXG4gICAgICBlbmRwb2ludHNDb25maWc6IHRoaXMucmVzb2x2ZUVuZHBvaW50c0NvbmZpZyhwcm9wcy52cGNFbmRwb2ludHMpXG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgVnBjKHRoaXMsIGlkLCB2cGNQcm9wcyk7XG4gIH1cblxuICBwcml2YXRlIHJlc29sdmVOYXRDb25maWcoXG4gICAgY29uZmlnOiBOYXRDb25maWcgfCBmYWxzZSB8IHVuZGVmaW5lZFxuICApOiB7IGNvdW50PzogbnVtYmVyIH0gfCBmYWxzZSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKGNvbmZpZyA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGlmIChjb25maWcgPT09IGZhbHNlKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHsgY291bnQ6IGNvbmZpZy5jb3VudCB9O1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlRmxvd0xvZ0NvbmZpZyhjb25maWc6IEZsb3dMb2dDb25maWcgfCBmYWxzZSB8IHVuZGVmaW5lZCk6XG4gICAgfCB7XG4gICAgICAgIGRlc3RpbmF0aW9uPzogXCJjbG91ZHdhdGNoXCIgfCBcInMzXCI7XG4gICAgICAgIHJldGVudGlvbkRheXM/OiBudW1iZXI7XG4gICAgICAgIHRyYWZmaWNUeXBlPzogXCJBTExcIiB8IFwiQUNDRVBUXCIgfCBcIlJFSkVDVFwiO1xuICAgICAgfVxuICAgIHwgZmFsc2VcbiAgICB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKGNvbmZpZyA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGlmIChjb25maWcgPT09IGZhbHNlKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRlc3RpbmF0aW9uOiBjb25maWcuZGVzdGluYXRpb24sXG4gICAgICByZXRlbnRpb25EYXlzOiBjb25maWcucmV0ZW50aW9uRGF5cyxcbiAgICAgIHRyYWZmaWNUeXBlOiBjb25maWcudHJhZmZpY1R5cGVcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlRW5kcG9pbnRzQ29uZmlnKFxuICAgIGNvbmZpZzogVnBjRW5kcG9pbnRzQ29uZmlnIHwgZmFsc2UgfCB1bmRlZmluZWRcbiAgKTpcbiAgICB8IHtcbiAgICAgICAgZ2F0ZXdheT86IHsgczM/OiBib29sZWFuOyBkeW5hbW9kYj86IGJvb2xlYW4gfSB8IGZhbHNlO1xuICAgICAgICBpbnRlcmZhY2U/OlxuICAgICAgICAgIHwge1xuICAgICAgICAgICAgICBlY3I/OiBib29sZWFuO1xuICAgICAgICAgICAgICBzZWNyZXRzTWFuYWdlcj86IGJvb2xlYW47XG4gICAgICAgICAgICAgIGttcz86IGJvb2xlYW47XG4gICAgICAgICAgICAgIGNsb3Vkd2F0Y2hMb2dzPzogYm9vbGVhbjtcbiAgICAgICAgICAgICAgc3NtPzogYm9vbGVhbjtcbiAgICAgICAgICAgICAgc3RzPzogYm9vbGVhbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB8IGZhbHNlO1xuICAgICAgfVxuICAgIHwgZmFsc2VcbiAgICB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKGNvbmZpZyA9PT0gZmFsc2UpIHJldHVybiBmYWxzZTtcblxuICAgIC8vIERlZmF1bHQ6IGdhdGV3YXkgZW5kcG9pbnRzIGVuYWJsZWRcbiAgICBpZiAoY29uZmlnID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB7IGdhdGV3YXk6IHsgczM6IHRydWUsIGR5bmFtb2RiOiB0cnVlIH0gfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgZ2F0ZXdheTpcbiAgICAgICAgY29uZmlnLmdhdGV3YXkgPT09IGZhbHNlXG4gICAgICAgICAgPyBmYWxzZVxuICAgICAgICAgIDoge1xuICAgICAgICAgICAgICBzMzogY29uZmlnLmdhdGV3YXk/LnMzID8/IHRydWUsXG4gICAgICAgICAgICAgIGR5bmFtb2RiOiBjb25maWcuZ2F0ZXdheT8uZHluYW1vZGIgPz8gdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgIGludGVyZmFjZTogY29uZmlnLmludGVyZmFjZSA9PT0gZmFsc2UgPyBmYWxzZSA6IGNvbmZpZy5pbnRlcmZhY2VcbiAgICB9O1xuICB9XG5cbiAgZ2V0VnBjKCk6IElWcGMge1xuICAgIHJldHVybiB0aGlzLnZwYztcbiAgfVxufVxuIl19
100
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV0d29yay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9wYXR0ZXJucy9hd3MvbmV0d29yay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwyQ0FBdUM7QUFDdkMsNkNBQWlDO0FBSWpDLDREQUF3RTtBQUN4RSx5RUFBOEQ7QUF1RTlELFNBQVMsb0JBQW9CLENBQUMsS0FBb0I7SUFDaEQsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLFNBQVMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUN6RSxpQ0FBVyxDQUFDLElBQUksQ0FDZCw0Q0FBNEMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUM1RCxDQUFDO0lBQ0osQ0FBQztJQUVELElBQ0UsT0FBTyxLQUFLLENBQUMsV0FBVyxLQUFLLFFBQVE7UUFDckMsS0FBSyxDQUFDLFdBQVcsS0FBSyxJQUFJO1FBQzFCLEtBQUssQ0FBQyxXQUFXLENBQUMsS0FBSyxLQUFLLFNBQVMsRUFDckMsQ0FBQztRQUNELE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDO1FBQ2pDLElBQUksS0FBSyxDQUFDLFdBQVcsQ0FBQyxLQUFLLEdBQUcsTUFBTSxFQUFFLENBQUM7WUFDckMsaUNBQVcsQ0FBQyxJQUFJLENBQ2Qsd0JBQXdCLEtBQUssQ0FBQyxXQUFXLENBQUMsS0FBSyxxQkFBcUIsTUFBTSxJQUFJLENBQy9FLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztJQUVELElBQUksS0FBSyxDQUFDLGNBQWMsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDckQsTUFBTSxJQUFJLEtBQUssQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFDO0lBQ2xFLENBQUM7QUFDSCxDQUFDO0FBRUQsTUFBYSxjQUFjO0lBQ3pCLE1BQU0sQ0FB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QixNQUE4QztRQWlCOUMsSUFBSSxNQUFNLEtBQUssS0FBSztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBRW5DLElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3pCLE9BQU8sRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDO1FBQ25ELENBQUM7UUFFRCxPQUFPO1lBQ0wsT0FBTyxFQUNMLE1BQU0sQ0FBQyxPQUFPLEtBQUssS0FBSztnQkFDdEIsQ0FBQyxDQUFDLEtBQUs7Z0JBQ1AsQ0FBQyxDQUFDO29CQUNFLEVBQUUsRUFBRSxNQUFNLENBQUMsT0FBTyxFQUFFLEVBQUUsSUFBSSxJQUFJO29CQUM5QixRQUFRLEVBQUUsTUFBTSxDQUFDLE9BQU8sRUFBRSxRQUFRLElBQUksSUFBSTtpQkFDM0M7WUFDUCxTQUFTLEVBQUUsTUFBTSxDQUFDLFNBQVMsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVM7U0FDakUsQ0FBQztJQUNKLENBQUM7SUFFRCxNQUFNO1FBQ0osT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDO0lBQ2xCLENBQUM7Q0FDRjtBQXJHRCwwQkFxR0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHsgRm4gfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7IHR5cGUgSVZwYyB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWMyXCI7XG5cbmltcG9ydCB0eXBlIEFwcCBmcm9tIFwiLi4vLi4vYXBwXCI7XG5pbXBvcnQgeyBWcGMsIHR5cGUgVnBjUHJvcHMgfSBmcm9tIFwiLi4vLi4vcmVzb3VyY2VzL2F3cy9uZXR3b3JraW5nL3ZwY1wiO1xuaW1wb3J0IHsgRmphbGxMb2dnZXIgfSBmcm9tIFwiLi4vLi4vdXRpbHMvdmFsaWRhdGlvbkxvZ2dlci5qc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIE5hdENvbmZpZyB7XG4gIGNvdW50PzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZsb3dMb2dDb25maWcge1xuICBkZXN0aW5hdGlvbj86IFwiY2xvdWR3YXRjaFwiIHwgXCJzM1wiO1xuICByZXRlbnRpb25EYXlzPzogbnVtYmVyO1xuICB0cmFmZmljVHlwZT86IFwiQUxMXCIgfCBcIkFDQ0VQVFwiIHwgXCJSRUpFQ1RcIjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHYXRld2F5RW5kcG9pbnRzQ29uZmlnIHtcbiAgczM/OiBib29sZWFuO1xuICBkeW5hbW9kYj86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW50ZXJmYWNlRW5kcG9pbnRzQ29uZmlnIHtcbiAgZWNyPzogYm9vbGVhbjtcbiAgc2VjcmV0c01hbmFnZXI/OiBib29sZWFuO1xuICBrbXM/OiBib29sZWFuO1xuICBjbG91ZHdhdGNoTG9ncz86IGJvb2xlYW47XG4gIHNzbT86IGJvb2xlYW47XG4gIHN0cz86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVnBjRW5kcG9pbnRzQ29uZmlnIHtcbiAgZ2F0ZXdheT86IEdhdGV3YXlFbmRwb2ludHNDb25maWcgfCBmYWxzZTtcbiAgaW50ZXJmYWNlPzogSW50ZXJmYWNlRW5kcG9pbnRzQ29uZmlnIHwgZmFsc2U7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3VibmV0Q29uZmlnIHtcbiAgY2lkck1hc2s/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3VibmV0c0NvbmZpZyB7XG4gIHB1YmxpYz86IFN1Ym5ldENvbmZpZztcbiAgcHJpdmF0ZT86IFN1Ym5ldENvbmZpZztcbiAgaXNvbGF0ZWQ/OiBTdWJuZXRDb25maWcgfCBmYWxzZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2l0R2F0ZXdheUNvbmZpZyB7XG4gIGlkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogTmV0d29yayAoVlBDKSBjb25maWd1cmF0aW9uLlxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBNaW5pbWFsIGNvc3QgVlBDIChubyBOQVQsIGdhdGV3YXkgZW5kcG9pbnRzIG9ubHkpXG4gKiB7IG5hdEdhdGV3YXlzOiBmYWxzZSB9XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFByb2R1Y3Rpb24gVlBDIHdpdGggMSBOQVQgZ2F0ZXdheVxuICogeyBuYXRHYXRld2F5czogeyBjb3VudDogMSB9LCBmbG93TG9nczoge30gfVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBIaWdoLWF2YWlsYWJpbGl0eSBWUEMgd2l0aCBpbnRlcmZhY2UgZW5kcG9pbnRzXG4gKiB7IG1heEF6czogMywgbmF0R2F0ZXdheXM6IHsgY291bnQ6IDMgfSwgdnBjRW5kcG9pbnRzOiB7IGludGVyZmFjZTogeyBlY3I6IHRydWUgfSB9IH1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJTmV0d29ya1Byb3BzIHtcbiAgdnBjTmFtZT86IHN0cmluZztcbiAgbWF4QXpzPzogbnVtYmVyO1xuICBjaWRyTWFzaz86IG51bWJlcjtcbiAgbmF0R2F0ZXdheXM/OiBOYXRDb25maWcgfCBmYWxzZTtcbiAgZmxvd0xvZ3M/OiBGbG93TG9nQ29uZmlnIHwgZmFsc2U7XG4gIHZwY0VuZHBvaW50cz86IFZwY0VuZHBvaW50c0NvbmZpZyB8IGZhbHNlO1xuICBzdWJuZXRzPzogU3VibmV0c0NvbmZpZztcbiAgdHJhbnNpdEdhdGV3YXk/OiBUcmFuc2l0R2F0ZXdheUNvbmZpZztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVOZXR3b3JrUHJvcHMocHJvcHM6IElOZXR3b3JrUHJvcHMpOiB2b2lkIHtcbiAgaWYgKHByb3BzLm1heEF6cyAhPT0gdW5kZWZpbmVkICYmIChwcm9wcy5tYXhBenMgPCAxIHx8IHByb3BzLm1heEF6cyA+IDMpKSB7XG4gICAgRmphbGxMb2dnZXIud2FybihcbiAgICAgIGAnbWF4QXpzJyBzaG91bGQgYmUgYmV0d2VlbiAxIGFuZCAzLiBHb3Q6ICR7cHJvcHMubWF4QXpzfS5gXG4gICAgKTtcbiAgfVxuXG4gIGlmIChcbiAgICB0eXBlb2YgcHJvcHMubmF0R2F0ZXdheXMgPT09IFwib2JqZWN0XCIgJiZcbiAgICBwcm9wcy5uYXRHYXRld2F5cyAhPT0gbnVsbCAmJlxuICAgIHByb3BzLm5hdEdhdGV3YXlzLmNvdW50ICE9PSB1bmRlZmluZWRcbiAgKSB7XG4gICAgY29uc3QgbWF4QXpzID0gcHJvcHMubWF4QXpzID8/IDM7XG4gICAgaWYgKHByb3BzLm5hdEdhdGV3YXlzLmNvdW50ID4gbWF4QXpzKSB7XG4gICAgICBGamFsbExvZ2dlci53YXJuKFxuICAgICAgICBgJ25hdEdhdGV3YXlzLmNvdW50JyAoJHtwcm9wcy5uYXRHYXRld2F5cy5jb3VudH0pIGV4Y2VlZHMgbWF4QXpzICgke21heEF6c30pLmBcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHByb3BzLnRyYW5zaXRHYXRld2F5ICYmICFwcm9wcy50cmFuc2l0R2F0ZXdheS5pZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIlRyYW5zaXQgR2F0ZXdheSBjb25maWd1cmF0aW9uIHJlcXVpcmVzICdpZCcuXCIpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBOZXR3b3JrRmFjdG9yeSB7XG4gIHN0YXRpYyBidWlsZChpZDogc3RyaW5nLCBwcm9wczogSU5ldHdvcmtQcm9wcykge1xuICAgIHJldHVybiAoYXBwOiBBcHAsIHNjb3BlOiBDb25zdHJ1Y3QpID0+IHtcbiAgICAgIHZhbGlkYXRlTmV0d29ya1Byb3BzKHByb3BzKTtcbiAgICAgIHJldHVybiBuZXcgTmV0d29yayhzY29wZSwgaWQsIHByb3BzLCBhcHApO1xuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE5ldHdvcmsgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICBwdWJsaWMgcmVhZG9ubHkgdnBjOiBWcGM7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IElOZXR3b3JrUHJvcHMsIGFwcDogQXBwKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcbiAgICB0aGlzLnZwYyA9IHRoaXMuY3JlYXRlVnBjKGlkLCBwcm9wcywgYXBwKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlVnBjKGlkOiBzdHJpbmcsIHByb3BzOiBJTmV0d29ya1Byb3BzLCBhcHA6IEFwcCk6IFZwYyB7XG4gICAgY29uc3QgYWNjb3VudElkID1cbiAgICAgIGFwcC5ub2RlLnRyeUdldENvbnRleHQoXCJhY2NvdW50SWRcIikgfHwgcHJvY2Vzcy5lbnYuQ0RLX0RFRkFVTFRfQUNDT1VOVDtcbiAgICBjb25zdCByZWdpb24gPSBwcm9jZXNzLmVudi5DREtfREVGQVVMVF9SRUdJT047XG4gICAgY29uc3QgaXNNYW5hZ2VkQWNjb3VudCA9XG4gICAgICBhcHAubm9kZS50cnlHZXRDb250ZXh0KFwibWFuYWdlZEFjY291bnRcIikgPT09IFwidHJ1ZVwiO1xuXG4gICAgbGV0IGlwdjRJcGFtUG9vbElkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgaWYgKGlzTWFuYWdlZEFjY291bnQgJiYgYWNjb3VudElkICYmIHJlZ2lvbikge1xuICAgICAgY29uc3QgcmVnaW9uU3VmZml4ID0gcmVnaW9uLnJlcGxhY2UoLy0vZywgXCJcIik7XG4gICAgICBpcHY0SXBhbVBvb2xJZCA9IEZuLmltcG9ydFZhbHVlKGBJcGFtUG9vbElkJHthY2NvdW50SWR9JHtyZWdpb25TdWZmaXh9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgdnBjUHJvcHM6IFZwY1Byb3BzID0ge1xuICAgICAgdnBjTmFtZTogcHJvcHMudnBjTmFtZSxcbiAgICAgIGFjY291bnRJZCxcbiAgICAgIHJlZ2lvbixcbiAgICAgIGlwdjRJcGFtUG9vbElkLFxuICAgICAgbWF4QXpzOiBwcm9wcy5tYXhBenMsXG4gICAgICB2cGNDaWRyTWFzazogcHJvcHMuY2lkck1hc2ssXG4gICAgICBzdWJuZXRDaWRyTWFzazogcHJvcHMuc3VibmV0cz8ucHJpdmF0ZT8uY2lkck1hc2ssXG4gICAgICBuYXRHYXRld2F5Q29uZmlnOiB0aGlzLnJlc29sdmVOYXRDb25maWcocHJvcHMubmF0R2F0ZXdheXMpLFxuICAgICAgZmxvd0xvZ0NvbmZpZzogdGhpcy5yZXNvbHZlRmxvd0xvZ0NvbmZpZyhwcm9wcy5mbG93TG9ncyksXG4gICAgICBlbmRwb2ludHNDb25maWc6IHRoaXMucmVzb2x2ZUVuZHBvaW50c0NvbmZpZyhwcm9wcy52cGNFbmRwb2ludHMpXG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgVnBjKHRoaXMsIGlkLCB2cGNQcm9wcyk7XG4gIH1cblxuICBwcml2YXRlIHJlc29sdmVOYXRDb25maWcoXG4gICAgY29uZmlnOiBOYXRDb25maWcgfCBmYWxzZSB8IHVuZGVmaW5lZFxuICApOiB7IGNvdW50PzogbnVtYmVyIH0gfCBmYWxzZSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKGNvbmZpZyA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGlmIChjb25maWcgPT09IGZhbHNlKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHsgY291bnQ6IGNvbmZpZy5jb3VudCB9O1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlRmxvd0xvZ0NvbmZpZyhjb25maWc6IEZsb3dMb2dDb25maWcgfCBmYWxzZSB8IHVuZGVmaW5lZCk6XG4gICAgfCB7XG4gICAgICAgIGRlc3RpbmF0aW9uPzogXCJjbG91ZHdhdGNoXCIgfCBcInMzXCI7XG4gICAgICAgIHJldGVudGlvbkRheXM/OiBudW1iZXI7XG4gICAgICAgIHRyYWZmaWNUeXBlPzogXCJBTExcIiB8IFwiQUNDRVBUXCIgfCBcIlJFSkVDVFwiO1xuICAgICAgfVxuICAgIHwgZmFsc2VcbiAgICB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKGNvbmZpZyA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGlmIChjb25maWcgPT09IGZhbHNlKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRlc3RpbmF0aW9uOiBjb25maWcuZGVzdGluYXRpb24sXG4gICAgICByZXRlbnRpb25EYXlzOiBjb25maWcucmV0ZW50aW9uRGF5cyxcbiAgICAgIHRyYWZmaWNUeXBlOiBjb25maWcudHJhZmZpY1R5cGVcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlRW5kcG9pbnRzQ29uZmlnKFxuICAgIGNvbmZpZzogVnBjRW5kcG9pbnRzQ29uZmlnIHwgZmFsc2UgfCB1bmRlZmluZWRcbiAgKTpcbiAgICB8IHtcbiAgICAgICAgZ2F0ZXdheT86IHsgczM/OiBib29sZWFuOyBkeW5hbW9kYj86IGJvb2xlYW4gfSB8IGZhbHNlO1xuICAgICAgICBpbnRlcmZhY2U/OlxuICAgICAgICAgIHwge1xuICAgICAgICAgICAgICBlY3I/OiBib29sZWFuO1xuICAgICAgICAgICAgICBzZWNyZXRzTWFuYWdlcj86IGJvb2xlYW47XG4gICAgICAgICAgICAgIGttcz86IGJvb2xlYW47XG4gICAgICAgICAgICAgIGNsb3Vkd2F0Y2hMb2dzPzogYm9vbGVhbjtcbiAgICAgICAgICAgICAgc3NtPzogYm9vbGVhbjtcbiAgICAgICAgICAgICAgc3RzPzogYm9vbGVhbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB8IGZhbHNlO1xuICAgICAgfVxuICAgIHwgZmFsc2VcbiAgICB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKGNvbmZpZyA9PT0gZmFsc2UpIHJldHVybiBmYWxzZTtcblxuICAgIGlmIChjb25maWcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHsgZ2F0ZXdheTogeyBzMzogdHJ1ZSwgZHluYW1vZGI6IHRydWUgfSB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBnYXRld2F5OlxuICAgICAgICBjb25maWcuZ2F0ZXdheSA9PT0gZmFsc2VcbiAgICAgICAgICA/IGZhbHNlXG4gICAgICAgICAgOiB7XG4gICAgICAgICAgICAgIHMzOiBjb25maWcuZ2F0ZXdheT8uczMgPz8gdHJ1ZSxcbiAgICAgICAgICAgICAgZHluYW1vZGI6IGNvbmZpZy5nYXRld2F5Py5keW5hbW9kYiA/PyB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgaW50ZXJmYWNlOiBjb25maWcuaW50ZXJmYWNlID09PSBmYWxzZSA/IGZhbHNlIDogY29uZmlnLmludGVyZmFjZVxuICAgIH07XG4gIH1cblxuICBnZXRWcGMoKTogSVZwYyB7XG4gICAgcmV0dXJuIHRoaXMudnBjO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Pattern Factory for High-Level Infrastructure Patterns.
3
+ *
4
+ * PatternFactory creates composite infrastructure patterns that encapsulate
5
+ * multiple related resources into a single, cohesive unit. This reduces
6
+ * boilerplate and ensures best practices for common deployment scenarios.
7
+ *
8
+ * Currently supported patterns:
9
+ * - `payload`: Payload CMS deployment with OpenNext
10
+ *
11
+ * @example
12
+ * // Minimal - works out of box
13
+ * const payload = app.addPattern(PatternFactory.build("PayloadApp", {
14
+ * type: "payload",
15
+ * name: "my-cms",
16
+ * source: "../.."
17
+ * }));
18
+ *
19
+ * @example
20
+ * // Customised with escape hatches
21
+ * const payload = app.addPattern(PatternFactory.build("PayloadApp", {
22
+ * type: "payload",
23
+ * name: "my-cms",
24
+ * source: "../..",
25
+ * database: { type: "Aurora", publiclyAccessible: false },
26
+ * compute: { memorySize: 2048 }
27
+ * }));
28
+ *
29
+ * // Access underlying resources for advanced customisation
30
+ * payload.getDatabase().grantConnect(otherLambda);
31
+ * payload.getServer().getLambdaFunction().addEnvironment("CUSTOM", "value");
32
+ */
33
+ import { type Construct } from "constructs";
34
+ import type App from "../../app.js";
35
+ import { Payload } from "./payload.js";
36
+ import { type IPayloadProps, type IPatternProps, type AnyPattern } from "./interfaces/pattern.js";
37
+ /**
38
+ * Factory for creating high-level infrastructure patterns.
39
+ *
40
+ * Uses discriminated union (type: "payload" | ...) to route to specific implementations.
41
+ * Each pattern type has specific props and returns a specific interface.
42
+ */
43
+ export declare class PatternFactory {
44
+ /**
45
+ * Build a Payload CMS pattern.
46
+ *
47
+ * Creates a complete Payload CMS infrastructure:
48
+ * - RDS PostgreSQL database (Aurora or Instance)
49
+ * - S3 buckets (assets, cache, media)
50
+ * - DynamoDB table (tag cache)
51
+ * - SQS FIFO queue (revalidation)
52
+ * - Lambda functions (server, image optimization, revalidation)
53
+ * - CloudFront distribution
54
+ *
55
+ * @param id - Construct ID (used for resource naming)
56
+ * @param props - Payload pattern configuration
57
+ * @returns Factory function to create the pattern
58
+ */
59
+ static build(id: string, props: IPayloadProps): (app: App, scope: Construct) => Payload;
60
+ /**
61
+ * Generic build method (implementation signature).
62
+ */
63
+ static build(id: string, props: IPatternProps): (app: App, scope: Construct) => AnyPattern;
64
+ }
65
+ export { Payload };
66
+ export type { IPayloadProps, IPatternProps, AnyPattern, IPayload, PayloadDatabaseConfig, PayloadComputeConfig, PayloadCdnConfig } from "./interfaces/pattern.js";
67
+ export { isPayloadPattern, isPattern } from "./interfaces/pattern.js";