@relkit/cloud-aws 0.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (155) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +5 -0
  3. package/dist/components/RelkitApplicationService/container.d.ts +4 -0
  4. package/dist/components/RelkitApplicationService/container.d.ts.map +1 -0
  5. package/dist/components/RelkitApplicationService/container.js +64 -0
  6. package/dist/components/RelkitApplicationService/container.js.map +1 -0
  7. package/dist/components/RelkitApplicationService/foundation.d.ts +11 -0
  8. package/dist/components/RelkitApplicationService/foundation.d.ts.map +1 -0
  9. package/dist/components/RelkitApplicationService/foundation.js +44 -0
  10. package/dist/components/RelkitApplicationService/foundation.js.map +1 -0
  11. package/dist/components/RelkitApplicationService/index.d.ts +22 -0
  12. package/dist/components/RelkitApplicationService/index.d.ts.map +1 -0
  13. package/dist/components/RelkitApplicationService/index.js +147 -0
  14. package/dist/components/RelkitApplicationService/index.js.map +1 -0
  15. package/dist/components/RelkitApplicationService/types.d.ts +30 -0
  16. package/dist/components/RelkitApplicationService/types.d.ts.map +1 -0
  17. package/dist/components/RelkitApplicationService/types.js +2 -0
  18. package/dist/components/RelkitApplicationService/types.js.map +1 -0
  19. package/dist/components/RelkitBuckets/index.d.ts +11 -0
  20. package/dist/components/RelkitBuckets/index.d.ts.map +1 -0
  21. package/dist/components/RelkitBuckets/index.js +48 -0
  22. package/dist/components/RelkitBuckets/index.js.map +1 -0
  23. package/dist/components/RelkitBuckets/types.d.ts +23 -0
  24. package/dist/components/RelkitBuckets/types.d.ts.map +1 -0
  25. package/dist/components/RelkitBuckets/types.js +2 -0
  26. package/dist/components/RelkitBuckets/types.js.map +1 -0
  27. package/dist/components/RelkitBuckets/validation.d.ts +10 -0
  28. package/dist/components/RelkitBuckets/validation.d.ts.map +1 -0
  29. package/dist/components/RelkitBuckets/validation.js +22 -0
  30. package/dist/components/RelkitBuckets/validation.js.map +1 -0
  31. package/dist/components/RelkitCaches/client.d.ts +20 -0
  32. package/dist/components/RelkitCaches/client.d.ts.map +1 -0
  33. package/dist/components/RelkitCaches/client.js +42 -0
  34. package/dist/components/RelkitCaches/client.js.map +1 -0
  35. package/dist/components/RelkitCaches/index.d.ts +12 -0
  36. package/dist/components/RelkitCaches/index.d.ts.map +1 -0
  37. package/dist/components/RelkitCaches/index.js +71 -0
  38. package/dist/components/RelkitCaches/index.js.map +1 -0
  39. package/dist/components/RelkitCaches/types.d.ts +31 -0
  40. package/dist/components/RelkitCaches/types.d.ts.map +1 -0
  41. package/dist/components/RelkitCaches/types.js +2 -0
  42. package/dist/components/RelkitCaches/types.js.map +1 -0
  43. package/dist/components/RelkitCaches/validation.d.ts +11 -0
  44. package/dist/components/RelkitCaches/validation.d.ts.map +1 -0
  45. package/dist/components/RelkitCaches/validation.js +34 -0
  46. package/dist/components/RelkitCaches/validation.js.map +1 -0
  47. package/dist/components/RelkitContainerRegistry/index.d.ts +19 -0
  48. package/dist/components/RelkitContainerRegistry/index.d.ts.map +1 -0
  49. package/dist/components/RelkitContainerRegistry/index.js +29 -0
  50. package/dist/components/RelkitContainerRegistry/index.js.map +1 -0
  51. package/dist/components/RelkitEventBus/index.d.ts +24 -0
  52. package/dist/components/RelkitEventBus/index.d.ts.map +1 -0
  53. package/dist/components/RelkitEventBus/index.js +71 -0
  54. package/dist/components/RelkitEventBus/index.js.map +1 -0
  55. package/dist/components/RelkitEventBus/names.d.ts +2 -0
  56. package/dist/components/RelkitEventBus/names.d.ts.map +1 -0
  57. package/dist/components/RelkitEventBus/names.js +9 -0
  58. package/dist/components/RelkitEventBus/names.js.map +1 -0
  59. package/dist/components/RelkitEventBus/policies.d.ts +7 -0
  60. package/dist/components/RelkitEventBus/policies.d.ts.map +1 -0
  61. package/dist/components/RelkitEventBus/policies.js +59 -0
  62. package/dist/components/RelkitEventBus/policies.js.map +1 -0
  63. package/dist/components/RelkitEventBus/resources.d.ts +5 -0
  64. package/dist/components/RelkitEventBus/resources.d.ts.map +1 -0
  65. package/dist/components/RelkitEventBus/resources.js +120 -0
  66. package/dist/components/RelkitEventBus/resources.js.map +1 -0
  67. package/dist/components/RelkitEventBus/types.d.ts +76 -0
  68. package/dist/components/RelkitEventBus/types.d.ts.map +1 -0
  69. package/dist/components/RelkitEventBus/types.js +2 -0
  70. package/dist/components/RelkitEventBus/types.js.map +1 -0
  71. package/dist/components/RelkitEventBus/validation.d.ts +30 -0
  72. package/dist/components/RelkitEventBus/validation.d.ts.map +1 -0
  73. package/dist/components/RelkitEventBus/validation.js +145 -0
  74. package/dist/components/RelkitEventBus/validation.js.map +1 -0
  75. package/dist/components/RelkitJobQueues/index.d.ts +21 -0
  76. package/dist/components/RelkitJobQueues/index.d.ts.map +1 -0
  77. package/dist/components/RelkitJobQueues/index.js +139 -0
  78. package/dist/components/RelkitJobQueues/index.js.map +1 -0
  79. package/dist/components/RelkitJobQueues/policies.d.ts +8 -0
  80. package/dist/components/RelkitJobQueues/policies.d.ts.map +1 -0
  81. package/dist/components/RelkitJobQueues/policies.js +73 -0
  82. package/dist/components/RelkitJobQueues/policies.js.map +1 -0
  83. package/dist/components/RelkitJobQueues/resources.d.ts +11 -0
  84. package/dist/components/RelkitJobQueues/resources.d.ts.map +1 -0
  85. package/dist/components/RelkitJobQueues/resources.js +64 -0
  86. package/dist/components/RelkitJobQueues/resources.js.map +1 -0
  87. package/dist/components/RelkitJobQueues/types.d.ts +77 -0
  88. package/dist/components/RelkitJobQueues/types.d.ts.map +1 -0
  89. package/dist/components/RelkitJobQueues/types.js +2 -0
  90. package/dist/components/RelkitJobQueues/types.js.map +1 -0
  91. package/dist/components/RelkitJobQueues/validation.d.ts +32 -0
  92. package/dist/components/RelkitJobQueues/validation.d.ts.map +1 -0
  93. package/dist/components/RelkitJobQueues/validation.js +142 -0
  94. package/dist/components/RelkitJobQueues/validation.js.map +1 -0
  95. package/dist/components/RelkitNetwork/index.d.ts +25 -0
  96. package/dist/components/RelkitNetwork/index.d.ts.map +1 -0
  97. package/dist/components/RelkitNetwork/index.js +70 -0
  98. package/dist/components/RelkitNetwork/index.js.map +1 -0
  99. package/dist/components/RelkitObservability/index.d.ts +15 -0
  100. package/dist/components/RelkitObservability/index.d.ts.map +1 -0
  101. package/dist/components/RelkitObservability/index.js +62 -0
  102. package/dist/components/RelkitObservability/index.js.map +1 -0
  103. package/dist/components/RelkitObservability/types.d.ts +25 -0
  104. package/dist/components/RelkitObservability/types.d.ts.map +1 -0
  105. package/dist/components/RelkitObservability/types.js +2 -0
  106. package/dist/components/RelkitObservability/types.js.map +1 -0
  107. package/dist/components/common.d.ts +34 -0
  108. package/dist/components/common.d.ts.map +1 -0
  109. package/dist/components/common.js +109 -0
  110. package/dist/components/common.js.map +1 -0
  111. package/dist/components/index.d.ts +9 -0
  112. package/dist/components/index.d.ts.map +1 -0
  113. package/dist/components/index.js +9 -0
  114. package/dist/components/index.js.map +1 -0
  115. package/dist/index.d.ts +3 -0
  116. package/dist/index.d.ts.map +1 -0
  117. package/dist/index.js +3 -0
  118. package/dist/index.js.map +1 -0
  119. package/dist/runtime/buckets.d.ts +3 -0
  120. package/dist/runtime/buckets.d.ts.map +1 -0
  121. package/dist/runtime/buckets.js +2 -0
  122. package/dist/runtime/buckets.js.map +1 -0
  123. package/dist/runtime/cache.d.ts +3 -0
  124. package/dist/runtime/cache.d.ts.map +1 -0
  125. package/dist/runtime/cache.js +2 -0
  126. package/dist/runtime/cache.js.map +1 -0
  127. package/dist/runtime/config.d.ts +7 -0
  128. package/dist/runtime/config.d.ts.map +1 -0
  129. package/dist/runtime/config.js +10 -0
  130. package/dist/runtime/config.js.map +1 -0
  131. package/dist/runtime/events.d.ts +16 -0
  132. package/dist/runtime/events.d.ts.map +1 -0
  133. package/dist/runtime/events.js +69 -0
  134. package/dist/runtime/events.js.map +1 -0
  135. package/dist/runtime/factory.d.ts +3 -0
  136. package/dist/runtime/factory.d.ts.map +1 -0
  137. package/dist/runtime/factory.js +78 -0
  138. package/dist/runtime/factory.js.map +1 -0
  139. package/dist/runtime/http.d.ts +14 -0
  140. package/dist/runtime/http.d.ts.map +1 -0
  141. package/dist/runtime/http.js +98 -0
  142. package/dist/runtime/http.js.map +1 -0
  143. package/dist/runtime/index.d.ts +8 -0
  144. package/dist/runtime/index.d.ts.map +1 -0
  145. package/dist/runtime/index.js +8 -0
  146. package/dist/runtime/index.js.map +1 -0
  147. package/dist/runtime/jobs.d.ts +15 -0
  148. package/dist/runtime/jobs.d.ts.map +1 -0
  149. package/dist/runtime/jobs.js +133 -0
  150. package/dist/runtime/jobs.js.map +1 -0
  151. package/dist/runtime/observability.d.ts +13 -0
  152. package/dist/runtime/observability.d.ts.map +1 -0
  153. package/dist/runtime/observability.js +16 -0
  154. package/dist/runtime/observability.js.map +1 -0
  155. package/package.json +56 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 rel-kit
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,5 @@
1
+ # @relkit/cloud-aws
2
+
3
+ Unsupported internal AWS deployment components for RELKIT; use @relkit/cli.
4
+
5
+ See [@relkit/app](https://github.com/rel-kit/relkit) for supported application APIs.
@@ -0,0 +1,4 @@
1
+ import * as pulumi from "@pulumi/pulumi";
2
+ import { type RelkitEnvironmentInput, type RelkitSecretInput } from "../common.js";
3
+ export declare function containerDefinitions(image: pulumi.Input<string>, logGroupName: pulumi.Input<string>, port: number, livenessPath: string, stopTimeout: number, containerName: string, environmentInput?: RelkitEnvironmentInput, secretsInput?: RelkitSecretInput): pulumi.Output<string>;
4
+ //# sourceMappingURL=container.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../../../src/components/RelkitApplicationService/container.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,MAAM,gBAAgB,CAAC;AACzC,OAAO,EAIL,KAAK,sBAAsB,EAC3B,KAAK,iBAAiB,EACvB,MAAM,cAAc,CAAC;AAEtB,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAC3B,YAAY,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAClC,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,MAAM,EACrB,gBAAgB,CAAC,EAAE,sBAAsB,EACzC,YAAY,CAAC,EAAE,iBAAiB,GAC/B,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CA2DvB"}
@@ -0,0 +1,64 @@
1
+ import * as aws from "@pulumi/aws";
2
+ import * as pulumi from "@pulumi/pulumi";
3
+ import { environmentEntries, secretEntries, validateMappings, } from "../common.js";
4
+ export function containerDefinitions(image, logGroupName, port, livenessPath, stopTimeout, containerName, environmentInput, secretsInput) {
5
+ const region = aws.getRegionOutput().name;
6
+ const environment = [...environmentEntries(environmentInput)];
7
+ if (!environment.some(({ name }) => name === "AWS_REGION"))
8
+ environment.push({ name: "AWS_REGION", value: region });
9
+ const secrets = secretEntries(secretsInput);
10
+ validateMappings(environment, secrets);
11
+ return pulumi
12
+ .all([
13
+ image,
14
+ logGroupName,
15
+ region,
16
+ ...environment.map(({ value }) => value),
17
+ ...secrets.map(({ valueFrom }) => valueFrom),
18
+ ])
19
+ .apply((values) => {
20
+ const resolvedImage = values[0];
21
+ const resolvedLogGroup = values[1];
22
+ const resolvedRegion = values[2];
23
+ const environmentValues = environment.map(({ name }, index) => ({
24
+ name,
25
+ value: values[index + 3],
26
+ }));
27
+ const secretValues = secrets.map(({ name }, index) => ({
28
+ name,
29
+ valueFrom: values[index + 3 + environment.length],
30
+ }));
31
+ return JSON.stringify([
32
+ {
33
+ name: containerName,
34
+ image: resolvedImage,
35
+ essential: true,
36
+ user: "1000",
37
+ readonlyRootFilesystem: true,
38
+ stopTimeout,
39
+ portMappings: [{ containerPort: port, hostPort: port, protocol: "tcp" }],
40
+ environment: environmentValues,
41
+ secrets: secretValues,
42
+ healthCheck: {
43
+ command: [
44
+ "CMD-SHELL",
45
+ `bun -e "fetch('http://127.0.0.1:${port}${livenessPath}').then((r) => process.exit(r.ok ? 0 : 1)).catch(() => process.exit(1))"`,
46
+ ],
47
+ interval: 30,
48
+ timeout: 5,
49
+ retries: 3,
50
+ startPeriod: 30,
51
+ },
52
+ logConfiguration: {
53
+ logDriver: "awslogs",
54
+ options: {
55
+ "awslogs-group": resolvedLogGroup,
56
+ "awslogs-region": resolvedRegion,
57
+ "awslogs-stream-prefix": "relkit",
58
+ },
59
+ },
60
+ },
61
+ ]);
62
+ });
63
+ }
64
+ //# sourceMappingURL=container.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"container.js","sourceRoot":"","sources":["../../../src/components/RelkitApplicationService/container.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import * as aws from "@pulumi/aws";
2
+ import * as pulumi from "@pulumi/pulumi";
3
+ export interface ServiceFoundation {
4
+ readonly cluster: aws.ecs.Cluster;
5
+ readonly executionRole: aws.iam.Role;
6
+ readonly executionAttachment: aws.iam.RolePolicyAttachment;
7
+ readonly taskRole: aws.iam.Role;
8
+ readonly logGroup: aws.cloudwatch.LogGroup;
9
+ }
10
+ export declare function createFoundation(componentName: string, tags: pulumi.Input<Record<string, pulumi.Input<string>>>, retentionInDays: pulumi.Input<number>, parent: pulumi.ComponentResource): ServiceFoundation;
11
+ //# sourceMappingURL=foundation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"foundation.d.ts","sourceRoot":"","sources":["../../../src/components/RelkitApplicationService/foundation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,aAAa,CAAC;AACnC,OAAO,KAAK,MAAM,MAAM,gBAAgB,CAAC;AAgBzC,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC;IAClC,QAAQ,CAAC,aAAa,EAAE,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC;IACrC,QAAQ,CAAC,mBAAmB,EAAE,GAAG,CAAC,GAAG,CAAC,oBAAoB,CAAC;IAC3D,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC;CAC5C;AAED,wBAAgB,gBAAgB,CAC9B,aAAa,EAAE,MAAM,EACrB,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EACxD,eAAe,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EACrC,MAAM,EAAE,MAAM,CAAC,iBAAiB,GAC/B,iBAAiB,CAgDnB"}
@@ -0,0 +1,44 @@
1
+ import * as aws from "@pulumi/aws";
2
+ import * as pulumi from "@pulumi/pulumi";
3
+ import { iamRoleName } from "../common.js";
4
+ const EXECUTION_POLICY_ARN = "arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy";
5
+ const ASSUME_ROLE_POLICY = JSON.stringify({
6
+ Version: "2012-10-17",
7
+ Statement: [
8
+ {
9
+ Effect: "Allow",
10
+ Principal: { Service: "ecs-tasks.amazonaws.com" },
11
+ Action: "sts:AssumeRole",
12
+ },
13
+ ],
14
+ });
15
+ export function createFoundation(componentName, tags, retentionInDays, parent) {
16
+ const executionRoleName = iamRoleName(componentName, "execution-role");
17
+ const taskRoleName = iamRoleName(componentName, "task-role");
18
+ const cluster = new aws.ecs.Cluster(`${componentName}-cluster`, {
19
+ name: `${componentName}-cluster`,
20
+ settings: [{ name: "containerInsights", value: "enabled" }],
21
+ tags,
22
+ }, { parent });
23
+ const executionRole = new aws.iam.Role(executionRoleName, {
24
+ name: executionRoleName,
25
+ assumeRolePolicy: ASSUME_ROLE_POLICY,
26
+ tags,
27
+ }, { parent });
28
+ const executionAttachment = new aws.iam.RolePolicyAttachment(`${componentName}-execution-policy`, {
29
+ role: executionRole.name,
30
+ policyArn: EXECUTION_POLICY_ARN,
31
+ }, { parent });
32
+ const taskRole = new aws.iam.Role(taskRoleName, {
33
+ name: taskRoleName,
34
+ assumeRolePolicy: ASSUME_ROLE_POLICY,
35
+ tags,
36
+ }, { parent });
37
+ const logGroup = new aws.cloudwatch.LogGroup(`${componentName}-logs`, {
38
+ name: `/relkit/${componentName}`,
39
+ retentionInDays,
40
+ tags,
41
+ }, { parent });
42
+ return { cluster, executionRole, executionAttachment, taskRole, logGroup };
43
+ }
44
+ //# sourceMappingURL=foundation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"foundation.js","sourceRoot":"","sources":["../../../src/components/RelkitApplicationService/foundation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,aAAa,CAAC;AACnC,OAAO,KAAK,MAAM,MAAM,gBAAgB,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,MAAM,oBAAoB,GACxB,uEAAuE,CAAC;AAC1E,MAAM,kBAAkB,GAAG,IAAI,CAAC,SAAS,CAAC;IACxC,OAAO,EAAE,YAAY;IACrB,SAAS,EAAE;QACT;YACE,MAAM,EAAE,OAAO;YACf,SAAS,EAAE,EAAE,OAAO,EAAE,yBAAyB,EAAE;YACjD,MAAM,EAAE,gBAAgB;SACzB;KACF;CACF,CAAC,CAAC;AAUH,MAAM,UAAU,gBAAgB,CAC9B,aAAqB,EACrB,IAAwD,EACxD,eAAqC,EACrC,MAAgC;IAEhC,MAAM,iBAAiB,GAAG,WAAW,CAAC,aAAa,EAAE,gBAAgB,CAAC,CAAC;IACvE,MAAM,YAAY,GAAG,WAAW,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;IAC7D,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,OAAO,CACjC,GAAG,aAAa,UAAU,EAC1B;QACE,IAAI,EAAE,GAAG,aAAa,UAAU;QAChC,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;QAC3D,IAAI;KACL,EACD,EAAE,MAAM,EAAE,CACX,CAAC;IACF,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,CACpC,iBAAiB,EACjB;QACE,IAAI,EAAE,iBAAiB;QACvB,gBAAgB,EAAE,kBAAkB;QACpC,IAAI;KACL,EACD,EAAE,MAAM,EAAE,CACX,CAAC;IACF,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,oBAAoB,CAC1D,GAAG,aAAa,mBAAmB,EACnC;QACE,IAAI,EAAE,aAAa,CAAC,IAAI;QACxB,SAAS,EAAE,oBAAoB;KAChC,EACD,EAAE,MAAM,EAAE,CACX,CAAC;IACF,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,CAC/B,YAAY,EACZ;QACE,IAAI,EAAE,YAAY;QAClB,gBAAgB,EAAE,kBAAkB;QACpC,IAAI;KACL,EACD,EAAE,MAAM,EAAE,CACX,CAAC;IACF,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,QAAQ,CAC1C,GAAG,aAAa,OAAO,EACvB;QACE,IAAI,EAAE,WAAW,aAAa,EAAE;QAChC,eAAe;QACf,IAAI;KACL,EACD,EAAE,MAAM,EAAE,CACX,CAAC;IACF,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;AAC7E,CAAC"}
@@ -0,0 +1,22 @@
1
+ import * as aws from "@pulumi/aws";
2
+ import * as pulumi from "@pulumi/pulumi";
3
+ import type { RelkitApplicationServiceArgs } from "./types.js";
4
+ export type { RelkitApplicationServiceArgs } from "./types.js";
5
+ /** ECS/Fargate application behind an internet-facing ALB with safe deployment defaults. */
6
+ export declare class RelkitApplicationService extends pulumi.ComponentResource {
7
+ readonly cluster: aws.ecs.Cluster;
8
+ readonly loadBalancer: aws.lb.LoadBalancer;
9
+ readonly targetGroup: aws.lb.TargetGroup;
10
+ readonly listener: aws.lb.Listener;
11
+ readonly logGroup: aws.cloudwatch.LogGroup;
12
+ readonly executionRole: aws.iam.Role;
13
+ readonly taskRole: aws.iam.Role;
14
+ readonly taskDefinition: aws.ecs.TaskDefinition;
15
+ readonly service: aws.ecs.Service;
16
+ readonly scalableTarget: aws.appautoscaling.Target;
17
+ readonly scalingPolicy: aws.appautoscaling.Policy;
18
+ readonly image: pulumi.Output<string>;
19
+ readonly tags: pulumi.Output<Record<string, string>>;
20
+ constructor(name: string, args: RelkitApplicationServiceArgs, opts?: pulumi.ComponentResourceOptions);
21
+ }
22
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/RelkitApplicationService/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,aAAa,CAAC;AACnC,OAAO,KAAK,MAAM,MAAM,gBAAgB,CAAC;AAUzC,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,YAAY,CAAC;AAI/D,YAAY,EAAE,4BAA4B,EAAE,MAAM,YAAY,CAAC;AAC/D,2FAA2F;AAC3F,qBAAa,wBAAyB,SAAQ,MAAM,CAAC,iBAAiB;IACpE,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC;IAClC,QAAQ,CAAC,YAAY,EAAE,GAAG,CAAC,EAAE,CAAC,YAAY,CAAC;IAC3C,QAAQ,CAAC,WAAW,EAAE,GAAG,CAAC,EAAE,CAAC,WAAW,CAAC;IACzC,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE,CAAC,QAAQ,CAAC;IACnC,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC;IAC3C,QAAQ,CAAC,aAAa,EAAE,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC;IACrC,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC;IAChC,QAAQ,CAAC,cAAc,EAAE,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC;IAChD,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC;IAClC,QAAQ,CAAC,cAAc,EAAE,GAAG,CAAC,cAAc,CAAC,MAAM,CAAC;IACnD,QAAQ,CAAC,aAAa,EAAE,GAAG,CAAC,cAAc,CAAC,MAAM,CAAC;IAClD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACtC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;gBAEnD,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,4BAA4B,EAClC,IAAI,GAAE,MAAM,CAAC,wBAA6B;CAqK7C"}
@@ -0,0 +1,147 @@
1
+ import * as aws from "@pulumi/aws";
2
+ import * as pulumi from "@pulumi/pulumi";
3
+ import { DEFAULT_LIVENESS_PATH, DEFAULT_READINESS_PATH, DEFAULT_SERVICE_PORT, resourceName, tagsFor, validatePath, validatePort, } from "../common.js";
4
+ import { containerDefinitions } from "./container.js";
5
+ import { createFoundation } from "./foundation.js";
6
+ /** ECS/Fargate application behind an internet-facing ALB with safe deployment defaults. */
7
+ export class RelkitApplicationService extends pulumi.ComponentResource {
8
+ cluster;
9
+ loadBalancer;
10
+ targetGroup;
11
+ listener;
12
+ logGroup;
13
+ executionRole;
14
+ taskRole;
15
+ taskDefinition;
16
+ service;
17
+ scalableTarget;
18
+ scalingPolicy;
19
+ image;
20
+ tags;
21
+ constructor(name, args, opts = {}) {
22
+ const componentName = resourceName(name, "service", args);
23
+ super("relkit:cloud-aws:RelkitApplicationService", componentName, {}, opts);
24
+ const tags = tagsFor(name, args);
25
+ const port = args.containerPort ?? DEFAULT_SERVICE_PORT;
26
+ const containerName = args.containerName ?? "app";
27
+ const livenessPath = args.livenessPath ?? DEFAULT_LIVENESS_PATH;
28
+ const readinessPath = args.readinessPath ?? DEFAULT_READINESS_PATH;
29
+ const stopTimeout = args.stopTimeoutSeconds ?? 30;
30
+ const deregistrationDelay = args.deregistrationDelaySeconds ?? 30;
31
+ validatePort(port, "containerPort");
32
+ validatePath(livenessPath, "livenessPath");
33
+ validatePath(readinessPath, "readinessPath");
34
+ if (!Number.isSafeInteger(stopTimeout) || stopTimeout < 2 || stopTimeout > 120)
35
+ throw new RangeError("stopTimeoutSeconds must be an integer between 2 and 120.");
36
+ if (!Number.isSafeInteger(deregistrationDelay) ||
37
+ deregistrationDelay < 0 ||
38
+ deregistrationDelay > 3600)
39
+ throw new RangeError("deregistrationDelaySeconds must be an integer between 0 and 3600.");
40
+ this.tags = tags;
41
+ const foundation = createFoundation(componentName, tags, args.logRetentionDays ?? 30, this);
42
+ this.cluster = foundation.cluster;
43
+ this.executionRole = foundation.executionRole;
44
+ this.taskRole = foundation.taskRole;
45
+ this.logGroup = foundation.logGroup;
46
+ this.image = pulumi.output(args.image ?? args.registry.imageUri(args.imageTag ?? "latest"));
47
+ this.targetGroup = new aws.lb.TargetGroup(`${componentName}-target`, {
48
+ name: resourceName(name, "target", args, 32),
49
+ vpcId: args.network.vpcId,
50
+ targetType: "ip",
51
+ port,
52
+ protocol: "HTTP",
53
+ deregistrationDelay,
54
+ healthCheck: {
55
+ enabled: true,
56
+ path: readinessPath,
57
+ protocol: "HTTP",
58
+ matcher: "200-399",
59
+ interval: 30,
60
+ timeout: 5,
61
+ healthyThreshold: 2,
62
+ unhealthyThreshold: 3,
63
+ },
64
+ tags,
65
+ }, { parent: this });
66
+ this.loadBalancer = new aws.lb.LoadBalancer(`${componentName}-alb`, {
67
+ name: resourceName(name, "alb", args, 32),
68
+ loadBalancerType: "application",
69
+ internal: args.internalLoadBalancer ?? false,
70
+ securityGroups: [args.network.loadBalancerSecurityGroupId],
71
+ subnets: args.network.publicSubnetIds,
72
+ enableDeletionProtection: false,
73
+ tags,
74
+ }, { parent: this });
75
+ this.listener = new aws.lb.Listener(`${componentName}-listener`, {
76
+ loadBalancerArn: this.loadBalancer.arn,
77
+ port: 80,
78
+ protocol: "HTTP",
79
+ defaultActions: [{ type: "forward", targetGroupArn: this.targetGroup.arn }],
80
+ }, { parent: this });
81
+ this.taskDefinition = new aws.ecs.TaskDefinition(`${componentName}-task`, {
82
+ family: `${componentName}-task`,
83
+ requiresCompatibilities: ["FARGATE"],
84
+ networkMode: "awsvpc",
85
+ cpu: args.cpu ?? "256",
86
+ memory: args.memory ?? "512",
87
+ executionRoleArn: this.executionRole.arn,
88
+ taskRoleArn: this.taskRole.arn,
89
+ containerDefinitions: containerDefinitions(this.image, this.logGroup.name, port, livenessPath, stopTimeout, containerName, args.environment, args.secrets),
90
+ tags,
91
+ }, { parent: this, dependsOn: [foundation.executionAttachment] });
92
+ this.service = new aws.ecs.Service(`${componentName}-service`, {
93
+ name: `${componentName}-service`,
94
+ cluster: this.cluster.arn,
95
+ taskDefinition: this.taskDefinition.arn,
96
+ launchType: "FARGATE",
97
+ desiredCount: args.desiredCount ?? 1,
98
+ healthCheckGracePeriodSeconds: args.healthCheckGracePeriodSeconds ?? 60,
99
+ deploymentCircuitBreaker: { enable: true, rollback: true },
100
+ deploymentMinimumHealthyPercent: 100,
101
+ deploymentMaximumPercent: 200,
102
+ enableEcsManagedTags: true,
103
+ propagateTags: "SERVICE",
104
+ networkConfiguration: {
105
+ assignPublicIp: false,
106
+ subnets: args.network.privateSubnetIds,
107
+ securityGroups: [args.network.serviceSecurityGroupId],
108
+ },
109
+ loadBalancers: [
110
+ {
111
+ targetGroupArn: this.targetGroup.arn,
112
+ containerName,
113
+ containerPort: port,
114
+ },
115
+ ],
116
+ tags,
117
+ }, { parent: this, dependsOn: [this.listener] });
118
+ this.scalableTarget = new aws.appautoscaling.Target(`${componentName}-scalable-target`, {
119
+ serviceNamespace: "ecs",
120
+ scalableDimension: "ecs:service:DesiredCount",
121
+ resourceId: pulumi.interpolate `service/${this.cluster.name}/${this.service.name}`,
122
+ minCapacity: args.minCapacity ?? 1,
123
+ maxCapacity: args.maxCapacity ?? 4,
124
+ tags,
125
+ }, { parent: this, dependsOn: [this.service] });
126
+ this.scalingPolicy = new aws.appautoscaling.Policy(`${componentName}-cpu-scaling`, {
127
+ serviceNamespace: "ecs",
128
+ scalableDimension: "ecs:service:DesiredCount",
129
+ resourceId: this.scalableTarget.resourceId,
130
+ policyType: "TargetTrackingScaling",
131
+ targetTrackingScalingPolicyConfiguration: {
132
+ targetValue: args.cpuTargetPercent ?? 70,
133
+ predefinedMetricSpecification: {
134
+ predefinedMetricType: "ECSServiceAverageCPUUtilization",
135
+ },
136
+ scaleInCooldown: 60,
137
+ scaleOutCooldown: 60,
138
+ },
139
+ }, { parent: this, dependsOn: [this.scalableTarget] });
140
+ this.registerOutputs({
141
+ service: this.service,
142
+ loadBalancer: this.loadBalancer,
143
+ image: this.image,
144
+ });
145
+ }
146
+ }
147
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/RelkitApplicationService/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import type * as pulumi from "@pulumi/pulumi";
2
+ import type { RelkitContainerRegistry } from "../RelkitContainerRegistry/index.js";
3
+ import type { RelkitNetwork } from "../RelkitNetwork/index.js";
4
+ import type { RelkitComponentArgs, RelkitEnvironmentInput, RelkitSecretInput } from "../common.js";
5
+ export interface RelkitApplicationServiceArgs extends RelkitComponentArgs {
6
+ readonly network: RelkitNetwork;
7
+ readonly registry: RelkitContainerRegistry;
8
+ readonly image?: pulumi.Input<string>;
9
+ readonly imageTag?: pulumi.Input<string>;
10
+ readonly containerName?: string;
11
+ readonly containerPort?: number;
12
+ readonly livenessPath?: string;
13
+ readonly readinessPath?: string;
14
+ readonly cpu?: pulumi.Input<string>;
15
+ readonly memory?: pulumi.Input<string>;
16
+ readonly desiredCount?: pulumi.Input<number>;
17
+ readonly minCapacity?: pulumi.Input<number>;
18
+ readonly maxCapacity?: pulumi.Input<number>;
19
+ readonly cpuTargetPercent?: pulumi.Input<number>;
20
+ readonly stopTimeoutSeconds?: number;
21
+ readonly healthCheckGracePeriodSeconds?: pulumi.Input<number>;
22
+ readonly deregistrationDelaySeconds?: number;
23
+ readonly logRetentionDays?: pulumi.Input<number>;
24
+ readonly internalLoadBalancer?: pulumi.Input<boolean>;
25
+ /** Non-secret values injected into the application container by deployment. */
26
+ readonly environment?: RelkitEnvironmentInput;
27
+ /** Secret source identifiers injected as ECS `valueFrom` mappings. */
28
+ readonly secrets?: RelkitSecretInput;
29
+ }
30
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/RelkitApplicationService/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,MAAM,gBAAgB,CAAC;AAC9C,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,qCAAqC,CAAC;AACnF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,KAAK,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEnG,MAAM,WAAW,4BAA6B,SAAQ,mBAAmB;IACvE,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,uBAAuB,CAAC;IAC3C,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACtC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACzC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACpC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACvC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC7C,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC5C,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC5C,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACjD,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,6BAA6B,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC9D,QAAQ,CAAC,0BAA0B,CAAC,EAAE,MAAM,CAAC;IAC7C,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACjD,QAAQ,CAAC,oBAAoB,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACtD,+EAA+E;IAC/E,QAAQ,CAAC,WAAW,CAAC,EAAE,sBAAsB,CAAC;IAC9C,sEAAsE;IACtE,QAAQ,CAAC,OAAO,CAAC,EAAE,iBAAiB,CAAC;CACtC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/components/RelkitApplicationService/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,11 @@
1
+ import * as pulumi from "@pulumi/pulumi";
2
+ import type { RelkitBucketResource, RelkitBucketsArgs } from "./types.js";
3
+ export * from "./types.js";
4
+ /** Maps logical buckets to stable, private-by-default S3 buckets. */
5
+ export declare class RelkitBuckets extends pulumi.ComponentResource {
6
+ readonly buckets: readonly RelkitBucketResource[];
7
+ readonly bucketResources: readonly RelkitBucketResource[];
8
+ readonly tags: pulumi.Output<Record<string, string>>;
9
+ constructor(name: string, args: RelkitBucketsArgs, opts?: pulumi.ComponentResourceOptions);
10
+ }
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/RelkitBuckets/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,MAAM,gBAAgB,CAAC;AAGzC,OAAO,KAAK,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE1E,cAAc,YAAY,CAAC;AAE3B,qEAAqE;AACrE,qBAAa,aAAc,SAAQ,MAAM,CAAC,iBAAiB;IACzD,QAAQ,CAAC,OAAO,EAAE,SAAS,oBAAoB,EAAE,CAAC;IAClD,QAAQ,CAAC,eAAe,EAAE,SAAS,oBAAoB,EAAE,CAAC;IAC1D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;gBAEzC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,GAAE,MAAM,CAAC,wBAA6B;CAwC9F"}
@@ -0,0 +1,48 @@
1
+ import * as aws from "@pulumi/aws";
2
+ import * as pulumi from "@pulumi/pulumi";
3
+ import { awsRegion, environmentName, resourceName, tagsFor } from "../common.js";
4
+ import { normalizeBuckets } from "./validation.js";
5
+ export * from "./types.js";
6
+ /** Maps logical buckets to stable, private-by-default S3 buckets. */
7
+ export class RelkitBuckets extends pulumi.ComponentResource {
8
+ buckets;
9
+ bucketResources;
10
+ tags;
11
+ constructor(name, args, opts = {}) {
12
+ const definitions = normalizeBuckets(args);
13
+ const componentName = resourceName(name, "buckets", args, 64);
14
+ super("relkit:cloud-aws:RelkitBuckets", componentName, {}, opts);
15
+ this.tags = tagsFor(name, args);
16
+ const region = awsRegion(args);
17
+ this.buckets = definitions.map((definition) => {
18
+ const childName = resourceName(name, `${definition.id}-bucket`, args, 63);
19
+ const bucket = new aws.s3.Bucket(childName, {
20
+ bucket: definition.bucketName ?? childName,
21
+ acl: definition.visibility === "public" ? "public-read" : "private",
22
+ forceDestroy: definition.forceDestroy ?? false,
23
+ ...(definition.versioned === undefined
24
+ ? {}
25
+ : { versioning: { enabled: definition.versioned } }),
26
+ region,
27
+ tags: this.tags,
28
+ }, { parent: this });
29
+ return {
30
+ id: definition.id,
31
+ bucket,
32
+ arn: bucket.arn,
33
+ name: bucket.bucket,
34
+ visibility: definition.visibility,
35
+ environment: {
36
+ name: environmentName("bucket", definition.id, "NAME"),
37
+ value: bucket.bucket,
38
+ },
39
+ };
40
+ });
41
+ this.bucketResources = this.buckets;
42
+ this.registerOutputs({
43
+ bucketArns: this.buckets.map(({ arn }) => arn),
44
+ bucketNames: this.buckets.map(({ name }) => name),
45
+ });
46
+ }
47
+ }
48
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/RelkitBuckets/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,aAAa,CAAC;AACnC,OAAO,KAAK,MAAM,MAAM,gBAAgB,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACjF,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAGnD,cAAc,YAAY,CAAC;AAE3B,qEAAqE;AACrE,MAAM,OAAO,aAAc,SAAQ,MAAM,CAAC,iBAAiB;IAChD,OAAO,CAAkC;IACzC,eAAe,CAAkC;IACjD,IAAI,CAAwC;IAErD,YAAY,IAAY,EAAE,IAAuB,EAAE,OAAwC,EAAE;QAC3F,MAAM,WAAW,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;QAC3C,MAAM,aAAa,GAAG,YAAY,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;QAC9D,KAAK,CAAC,gCAAgC,EAAE,aAAa,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;QACjE,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAChC,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;QAC/B,IAAI,CAAC,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE;YAC5C,MAAM,SAAS,GAAG,YAAY,CAAC,IAAI,EAAE,GAAG,UAAU,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;YAC1E,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,EAAE,CAAC,MAAM,CAC9B,SAAS,EACT;gBACE,MAAM,EAAE,UAAU,CAAC,UAAU,IAAI,SAAS;gBAC1C,GAAG,EAAE,UAAU,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS;gBACnE,YAAY,EAAE,UAAU,CAAC,YAAY,IAAI,KAAK;gBAC9C,GAAG,CAAC,UAAU,CAAC,SAAS,KAAK,SAAS;oBACpC,CAAC,CAAC,EAAE;oBACJ,CAAC,CAAC,EAAE,UAAU,EAAE,EAAE,OAAO,EAAE,UAAU,CAAC,SAAS,EAAE,EAAE,CAAC;gBACtD,MAAM;gBACN,IAAI,EAAE,IAAI,CAAC,IAAI;aAChB,EACD,EAAE,MAAM,EAAE,IAAI,EAAE,CACjB,CAAC;YACF,OAAO;gBACL,EAAE,EAAE,UAAU,CAAC,EAAE;gBACjB,MAAM;gBACN,GAAG,EAAE,MAAM,CAAC,GAAG;gBACf,IAAI,EAAE,MAAM,CAAC,MAAM;gBACnB,UAAU,EAAE,UAAU,CAAC,UAAU;gBACjC,WAAW,EAAE;oBACX,IAAI,EAAE,eAAe,CAAC,QAAQ,EAAE,UAAU,CAAC,EAAE,EAAE,MAAM,CAAC;oBACtD,KAAK,EAAE,MAAM,CAAC,MAAM;iBACrB;aACF,CAAC;QACJ,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC;QACpC,IAAI,CAAC,eAAe,CAAC;YACnB,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC;YAC9C,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC;SAClD,CAAC,CAAC;IACL,CAAC;CACF"}
@@ -0,0 +1,23 @@
1
+ import type * as aws from "@pulumi/aws";
2
+ import type * as pulumi from "@pulumi/pulumi";
3
+ import type { RelkitComponentArgs, RelkitEnvironmentVariable } from "../common.js";
4
+ export type RelkitBucketVisibility = "private" | "public";
5
+ export interface RelkitBucketDefinition {
6
+ readonly id: string;
7
+ readonly visibility?: RelkitBucketVisibility;
8
+ readonly bucketName?: pulumi.Input<string>;
9
+ readonly forceDestroy?: pulumi.Input<boolean>;
10
+ readonly versioned?: pulumi.Input<boolean>;
11
+ }
12
+ export interface RelkitBucketsArgs extends RelkitComponentArgs {
13
+ readonly buckets: readonly RelkitBucketDefinition[];
14
+ }
15
+ export interface RelkitBucketResource {
16
+ readonly id: string;
17
+ readonly bucket: aws.s3.Bucket;
18
+ readonly arn: pulumi.Output<string>;
19
+ readonly name: pulumi.Output<string>;
20
+ readonly visibility: RelkitBucketVisibility;
21
+ readonly environment: RelkitEnvironmentVariable;
22
+ }
23
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/RelkitBuckets/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,GAAG,MAAM,aAAa,CAAC;AACxC,OAAO,KAAK,KAAK,MAAM,MAAM,gBAAgB,CAAC;AAC9C,OAAO,KAAK,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AAEnF,MAAM,MAAM,sBAAsB,GAAG,SAAS,GAAG,QAAQ,CAAC;AAE1D,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,UAAU,CAAC,EAAE,sBAAsB,CAAC;IAC7C,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC3C,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC9C,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;CAC5C;AAED,MAAM,WAAW,iBAAkB,SAAQ,mBAAmB;IAC5D,QAAQ,CAAC,OAAO,EAAE,SAAS,sBAAsB,EAAE,CAAC;CACrD;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC;IAC/B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACpC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACrC,QAAQ,CAAC,UAAU,EAAE,sBAAsB,CAAC;IAC5C,QAAQ,CAAC,WAAW,EAAE,yBAAyB,CAAC;CACjD"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/components/RelkitBuckets/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,10 @@
1
+ import type { RelkitBucketDefinition, RelkitBucketsArgs } from "./types.js";
2
+ export interface NormalizedBucket {
3
+ readonly id: string;
4
+ readonly visibility: "private" | "public";
5
+ readonly bucketName?: RelkitBucketDefinition["bucketName"];
6
+ readonly forceDestroy?: RelkitBucketDefinition["forceDestroy"];
7
+ readonly versioned?: RelkitBucketDefinition["versioned"];
8
+ }
9
+ export declare function normalizeBuckets(args: RelkitBucketsArgs): readonly NormalizedBucket[];
10
+ //# sourceMappingURL=validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../../src/components/RelkitBuckets/validation.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE5E,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,UAAU,EAAE,SAAS,GAAG,QAAQ,CAAC;IAC1C,QAAQ,CAAC,UAAU,CAAC,EAAE,sBAAsB,CAAC,YAAY,CAAC,CAAC;IAC3D,QAAQ,CAAC,YAAY,CAAC,EAAE,sBAAsB,CAAC,cAAc,CAAC,CAAC;IAC/D,QAAQ,CAAC,SAAS,CAAC,EAAE,sBAAsB,CAAC,WAAW,CAAC,CAAC;CAC1D;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,iBAAiB,GAAG,SAAS,gBAAgB,EAAE,CAkBrF"}
@@ -0,0 +1,22 @@
1
+ import { normalizeId } from "@relkit/contracts";
2
+ export function normalizeBuckets(args) {
3
+ const ids = new Set();
4
+ return args.buckets.map((definition) => {
5
+ const id = normalizeId(definition.id);
6
+ if (!ids.add(id))
7
+ throw new TypeError(`Duplicate AWS bucket "${id}".`);
8
+ const visibility = definition.visibility ?? "private";
9
+ if (visibility !== "private" && visibility !== "public")
10
+ throw new TypeError(`AWS bucket "${id}" visibility is invalid.`);
11
+ if (typeof definition.bucketName === "string" && definition.bucketName.trim() === "")
12
+ throw new TypeError(`AWS bucket "${id}" bucketName must not be empty.`);
13
+ return {
14
+ id,
15
+ visibility,
16
+ ...(definition.bucketName === undefined ? {} : { bucketName: definition.bucketName }),
17
+ ...(definition.forceDestroy === undefined ? {} : { forceDestroy: definition.forceDestroy }),
18
+ ...(definition.versioned === undefined ? {} : { versioned: definition.versioned }),
19
+ };
20
+ });
21
+ }
22
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../../src/components/RelkitBuckets/validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAWhD,MAAM,UAAU,gBAAgB,CAAC,IAAuB;IACtD,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAC;IAC9B,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE;QACrC,MAAM,EAAE,GAAG,WAAW,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QACtC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,MAAM,IAAI,SAAS,CAAC,yBAAyB,EAAE,IAAI,CAAC,CAAC;QACvE,MAAM,UAAU,GAAG,UAAU,CAAC,UAAU,IAAI,SAAS,CAAC;QACtD,IAAI,UAAU,KAAK,SAAS,IAAI,UAAU,KAAK,QAAQ;YACrD,MAAM,IAAI,SAAS,CAAC,eAAe,EAAE,0BAA0B,CAAC,CAAC;QACnE,IAAI,OAAO,UAAU,CAAC,UAAU,KAAK,QAAQ,IAAI,UAAU,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE;YAClF,MAAM,IAAI,SAAS,CAAC,eAAe,EAAE,iCAAiC,CAAC,CAAC;QAC1E,OAAO;YACL,EAAE;YACF,UAAU;YACV,GAAG,CAAC,UAAU,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,UAAU,CAAC,UAAU,EAAE,CAAC;YACrF,GAAG,CAAC,UAAU,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,UAAU,CAAC,YAAY,EAAE,CAAC;YAC3F,GAAG,CAAC,UAAU,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,UAAU,CAAC,SAAS,EAAE,CAAC;SACnF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,20 @@
1
+ export interface RelkitValkeyClientOptions {
2
+ readonly url: string;
3
+ readonly tls?: boolean;
4
+ readonly connectionTimeoutMs?: number;
5
+ }
6
+ /** Promise-only cache operations backed by Bun's native RedisClient. */
7
+ export interface RelkitValkeyClient {
8
+ readonly connected: boolean;
9
+ connect(): Promise<void>;
10
+ close(): void;
11
+ ping(): Promise<boolean>;
12
+ get(key: string): Promise<string | null>;
13
+ set(key: string, value: string, ttlMs?: number): Promise<void>;
14
+ delete(key: string): Promise<number>;
15
+ has(key: string): Promise<boolean>;
16
+ increment(key: string, amount?: number): Promise<number>;
17
+ }
18
+ /** Creates a private native Valkey client without exporting its Bun type. */
19
+ export declare function createValkeyClient(options: RelkitValkeyClientOptions): RelkitValkeyClient;
20
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/components/RelkitCaches/client.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC;CACvC;AAED,wEAAwE;AACxE,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB,KAAK,IAAI,IAAI,CAAC;IACd,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IACzB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACzC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/D,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACrC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACnC,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAC1D;AAED,6EAA6E;AAC7E,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,yBAAyB,GAAG,kBAAkB,CAsCzF"}