@fjall/generator 0.95.0 → 0.99.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (166) hide show
  1. package/dist/.minified +1 -1
  2. package/dist/src/ast/astClickHouseParser.d.ts +25 -0
  3. package/dist/src/ast/astClickHouseParser.js +1 -0
  4. package/dist/src/ast/astCodeInjection.d.ts +9 -0
  5. package/dist/src/ast/astCodeInjection.js +8 -0
  6. package/dist/src/ast/astComputeParser.js +1 -1
  7. package/dist/src/ast/astComputeParserHelpers.js +1 -1
  8. package/dist/src/ast/astDatabaseParser.d.ts +5 -2
  9. package/dist/src/ast/astDatabaseParser.js +1 -1
  10. package/dist/src/ast/astInfrastructureParser.d.ts +7 -1
  11. package/dist/src/ast/astInfrastructureParser.js +1 -1
  12. package/dist/src/ast/astPlanConverter.js +2 -2
  13. package/dist/src/ast/astScheduleParser.d.ts +18 -0
  14. package/dist/src/ast/astScheduleParser.js +1 -0
  15. package/dist/src/ast/astStatementClassifier.d.ts +2 -2
  16. package/dist/src/ast/astStatementClassifier.js +1 -1
  17. package/dist/src/ast/astStatementQueries.d.ts +4 -4
  18. package/dist/src/ast/astStatementQueries.js +3 -3
  19. package/dist/src/ast/astSurgicalModification.d.ts +14 -12
  20. package/dist/src/ast/astSurgicalModification.js +6 -13
  21. package/dist/src/ast/astTestHelpers.d.ts +41 -7
  22. package/dist/src/ast/index.d.ts +3 -2
  23. package/dist/src/ast/index.js +1 -1
  24. package/dist/src/codemod/_internal.d.ts +6 -1
  25. package/dist/src/codemod/_internal.js +1 -1
  26. package/dist/src/codemod/drift/detect.d.ts +11 -0
  27. package/dist/src/codemod/drift/detect.js +1 -0
  28. package/dist/src/codemod/drift/index.d.ts +4 -0
  29. package/dist/src/codemod/drift/index.js +1 -0
  30. package/dist/src/codemod/drift/merge.d.ts +19 -0
  31. package/dist/src/codemod/drift/merge.js +1 -0
  32. package/dist/src/codemod/drift/snapshot.d.ts +4 -0
  33. package/dist/src/codemod/drift/snapshot.js +1 -0
  34. package/dist/src/codemod/drift/types.d.ts +60 -0
  35. package/dist/src/codemod/drift/types.js +1 -0
  36. package/dist/src/codemod/edits/addResource/propertyBuilder.d.ts +1 -1
  37. package/dist/src/codemod/edits/addResource/propertyBuilder.js +1 -1
  38. package/dist/src/codemod/edits/addResource.d.ts +8 -3
  39. package/dist/src/codemod/edits/addResource.js +1 -1
  40. package/dist/src/codemod/edits/controlFlowPolicy.d.ts +19 -0
  41. package/dist/src/codemod/edits/controlFlowPolicy.js +1 -0
  42. package/dist/src/codemod/edits/crossPlanConnection.d.ts +20 -0
  43. package/dist/src/codemod/edits/crossPlanConnection.js +1 -0
  44. package/dist/src/codemod/edits/driftPolicy.d.ts +7 -0
  45. package/dist/src/codemod/edits/driftPolicy.js +1 -0
  46. package/dist/src/codemod/edits/findInsertionPosition.js +1 -1
  47. package/dist/src/codemod/edits/index.d.ts +3 -0
  48. package/dist/src/codemod/edits/index.js +1 -1
  49. package/dist/src/codemod/edits/modifyResource.d.ts +9 -3
  50. package/dist/src/codemod/edits/modifyResource.js +1 -1
  51. package/dist/src/codemod/edits/removeResource.d.ts +2 -2
  52. package/dist/src/codemod/edits/removeResource.js +1 -1
  53. package/dist/src/codemod/edits/vpcPeer.d.ts +24 -0
  54. package/dist/src/codemod/edits/vpcPeer.js +1 -0
  55. package/dist/src/codemod/edits/vpcPeerAccepter.d.ts +20 -0
  56. package/dist/src/codemod/edits/vpcPeerAccepter.js +1 -0
  57. package/dist/src/codemod/index.d.ts +16 -4
  58. package/dist/src/codemod/index.js +1 -1
  59. package/dist/src/codemod/llmFallback/apply.d.ts +10 -0
  60. package/dist/src/codemod/llmFallback/apply.js +1 -0
  61. package/dist/src/codemod/llmFallback/claudeTier.d.ts +6 -0
  62. package/dist/src/codemod/llmFallback/claudeTier.js +1 -0
  63. package/dist/src/codemod/llmFallback/egressGate.d.ts +5 -0
  64. package/dist/src/codemod/llmFallback/egressGate.js +1 -0
  65. package/dist/src/codemod/llmFallback/egressGate.types.d.ts +9 -0
  66. package/dist/src/codemod/llmFallback/egressGate.types.js +0 -0
  67. package/dist/src/codemod/llmFallback/index.d.ts +6 -0
  68. package/dist/src/codemod/llmFallback/index.js +1 -0
  69. package/dist/src/codemod/llmFallback/morphTier.d.ts +2 -0
  70. package/dist/src/codemod/llmFallback/morphTier.js +3 -0
  71. package/dist/src/codemod/llmFallback/prompt.d.ts +12 -0
  72. package/dist/src/codemod/llmFallback/prompt.js +36 -0
  73. package/dist/src/codemod/llmFallback/runFallback.d.ts +13 -0
  74. package/dist/src/codemod/llmFallback/runFallback.js +1 -0
  75. package/dist/src/codemod/llmFallback/shouldTryFallback.d.ts +13 -0
  76. package/dist/src/codemod/llmFallback/shouldTryFallback.js +1 -0
  77. package/dist/src/codemod/llmFallback/signals.d.ts +4 -0
  78. package/dist/src/codemod/llmFallback/signals.js +1 -0
  79. package/dist/src/codemod/llmFallback/telemetryEvents.d.ts +141 -0
  80. package/dist/src/codemod/llmFallback/telemetryEvents.js +1 -0
  81. package/dist/src/codemod/llmFallback/tierRunner.d.ts +7 -0
  82. package/dist/src/codemod/llmFallback/tierRunner.js +1 -0
  83. package/dist/src/codemod/llmFallback/types.d.ts +104 -0
  84. package/dist/src/codemod/llmFallback/types.js +1 -0
  85. package/dist/src/codemod/registry.d.ts +4 -1
  86. package/dist/src/codemod/registry.js +1 -1
  87. package/dist/src/codemod/semanticIndex/classifyControlFlow.d.ts +2 -0
  88. package/dist/src/codemod/semanticIndex/classifyControlFlow.js +1 -0
  89. package/dist/src/codemod/semanticIndex/findReferences.js +2 -2
  90. package/dist/src/codemod/telemetry/errorKinds.d.ts +2 -0
  91. package/dist/src/codemod/telemetry/errorKinds.js +1 -0
  92. package/dist/src/codemod/types.d.ts +110 -1
  93. package/dist/src/codemod/types.js +1 -1
  94. package/dist/src/codemod/validationGate/gates/classify.d.ts +2 -0
  95. package/dist/src/codemod/validationGate/gates/classify.js +1 -0
  96. package/dist/src/codemod/validationGate/gates/drift.d.ts +2 -0
  97. package/dist/src/codemod/validationGate/gates/drift.js +1 -0
  98. package/dist/src/codemod/validationGate/gates/locate.d.ts +7 -0
  99. package/dist/src/codemod/validationGate/gates/locate.js +1 -0
  100. package/dist/src/codemod/validationGate/gates/parse.d.ts +2 -0
  101. package/dist/src/codemod/validationGate/gates/parse.js +1 -0
  102. package/dist/src/codemod/validationGate/gates/schema.d.ts +2 -0
  103. package/dist/src/codemod/validationGate/gates/schema.js +1 -0
  104. package/dist/src/codemod/validationGate/index.d.ts +6 -0
  105. package/dist/src/codemod/validationGate/index.js +1 -0
  106. package/dist/src/codemod/validationGate/types.d.ts +35 -0
  107. package/dist/src/codemod/validationGate/types.js +1 -0
  108. package/dist/src/detection/index.d.ts +148 -0
  109. package/dist/src/detection/index.js +1 -0
  110. package/dist/src/generation/common.d.ts +22 -0
  111. package/dist/src/generation/common.js +5 -4
  112. package/dist/src/generation/compute/ec2.d.ts +2 -0
  113. package/dist/src/generation/compute/ec2.js +4 -0
  114. package/dist/src/generation/compute/ecs.d.ts +2 -0
  115. package/dist/src/generation/compute/ecs.js +42 -0
  116. package/dist/src/generation/compute/lambda.d.ts +3 -0
  117. package/dist/src/generation/compute/lambda.js +26 -0
  118. package/dist/src/generation/compute/shared.d.ts +22 -0
  119. package/dist/src/generation/compute/shared.js +4 -0
  120. package/dist/src/generation/compute.d.ts +4 -5
  121. package/dist/src/generation/compute.js +6 -86
  122. package/dist/src/generation/database.d.ts +11 -0
  123. package/dist/src/generation/database.js +23 -12
  124. package/dist/src/generation/index.d.ts +1 -1
  125. package/dist/src/generation/index.js +1 -1
  126. package/dist/src/generation/infrastructure.js +5 -5
  127. package/dist/src/generation/storage.js +30 -30
  128. package/dist/src/index.d.ts +1 -1
  129. package/dist/src/index.js +1 -1
  130. package/dist/src/planning/index.d.ts +2 -1
  131. package/dist/src/planning/index.js +1 -1
  132. package/dist/src/planning/openNextPlanning.d.ts +38 -0
  133. package/dist/src/planning/openNextPlanning.js +1 -0
  134. package/dist/src/planning/resourceAddition.d.ts +5 -1
  135. package/dist/src/planning/resourceAddition.js +1 -1
  136. package/dist/src/planning/resourcePlanning.d.ts +0 -46
  137. package/dist/src/planning/resourcePlanning.js +1 -1
  138. package/dist/src/presets/clickhouseTierPreset.d.ts +35 -0
  139. package/dist/src/presets/clickhouseTierPreset.js +0 -0
  140. package/dist/src/presets/tierPresets.d.ts +5 -12
  141. package/dist/src/presets/tierPresets.js +1 -1
  142. package/dist/src/presets/tierTypes.d.ts +9 -19
  143. package/dist/src/schemas/applicationSchemas.d.ts +67 -8
  144. package/dist/src/schemas/applicationSchemas.js +1 -1
  145. package/dist/src/schemas/baseSchemas.d.ts +24 -5
  146. package/dist/src/schemas/baseSchemas.js +2 -2
  147. package/dist/src/schemas/computeSchemas.d.ts +108 -14
  148. package/dist/src/schemas/computeSchemas.js +1 -1
  149. package/dist/src/schemas/constants.d.ts +14 -0
  150. package/dist/src/schemas/constants.js +1 -1
  151. package/dist/src/schemas/databaseSchemas.d.ts +80 -0
  152. package/dist/src/schemas/databaseSchemas.js +1 -1
  153. package/dist/src/schemas/networkSchemas.d.ts +126 -11
  154. package/dist/src/schemas/networkSchemas.js +1 -1
  155. package/dist/src/schemas/patternSchemas.js +1 -1
  156. package/dist/src/schemas/sharedTypes.d.ts +1 -1
  157. package/dist/src/schemas/sharedTypes.js +1 -1
  158. package/dist/src/validation/patterns.d.ts +2 -318
  159. package/dist/src/validation/patterns.js +1 -1
  160. package/dist/src/validation/validationMessages.d.ts +315 -0
  161. package/dist/src/validation/validationMessages.js +1 -0
  162. package/dist/src/validation/validationPatterns.d.ts +34 -0
  163. package/dist/src/validation/validationPatterns.js +1 -0
  164. package/dist/src/version.d.ts +1 -1
  165. package/dist/src/version.js +1 -1
  166. package/package.json +19 -13
@@ -5,7 +5,10 @@
5
5
  * consumers. Extracted from tierPresets.ts for maintainability.
6
6
  */
7
7
  import type { EcsCapacityProvider, BackupVaultTier } from "../schemas/sharedTypes.js";
8
- import type { WarmPool } from "../schemas/computeSchemas.js";
8
+ import type { WarmPool, EcsRoutingConfig, ApplicationServiceRouting, EcsClusterConfig } from "../schemas/computeSchemas.js";
9
+ import type { DockerBuildPartial } from "@fjall/util/manifest/schemas";
10
+ import type { ClickHouseTierPreset } from "./clickhouseTierPreset.js";
11
+ export type { ClickHouseTierPreset } from "./clickhouseTierPreset.js";
9
12
  /**
10
13
  * Proxy configuration for tier presets
11
14
  * Presence = enabled. Use `false` to explicitly disable.
@@ -131,7 +134,7 @@ export interface TierClusterConfig {
131
134
  * - "public": Internet-facing ALB (default)
132
135
  * - "internal": VPC-only ALB
133
136
  */
134
- loadBalancer?: false | "public" | "internal";
137
+ loadBalancer?: EcsClusterConfig["loadBalancer"];
135
138
  }
136
139
  /**
137
140
  * Service configuration for ECS tier presets.
@@ -161,15 +164,7 @@ export interface TierEcsServiceConfig {
161
164
  /** Maximum capacity for autoscaling. Default: 5 */
162
165
  maxCapacity?: number;
163
166
  /** Routing rules for this service on the cluster's ALB */
164
- routing?: {
165
- path?: string;
166
- host?: string;
167
- priority?: number;
168
- } | Array<{
169
- path?: string;
170
- host?: string;
171
- priority?: number;
172
- }>;
167
+ routing?: Pick<EcsRoutingConfig, "path" | "host" | "priority"> | Array<Pick<EcsRoutingConfig, "path" | "host" | "priority">>;
173
168
  }
174
169
  /**
175
170
  * ECS tier preset configuration.
@@ -273,6 +268,7 @@ export interface TierPreset {
273
268
  Instance: DatabaseTierPreset | null;
274
269
  Aurora: DatabaseTierPreset | null;
275
270
  GlobalAurora: DatabaseTierPreset | null;
271
+ ClickHouse: ClickHouseTierPreset | null;
276
272
  };
277
273
  /** Compute presets */
278
274
  compute: {
@@ -291,14 +287,8 @@ export interface TierPreset {
291
287
  */
292
288
  export interface UserServiceConfig {
293
289
  name: string;
294
- dockerfilePath?: string;
290
+ docker?: DockerBuildPartial;
295
291
  containerPort?: number;
296
292
  needsDatabaseConnection?: boolean;
297
- routing?: {
298
- path: string;
299
- priority?: number;
300
- } | Array<{
301
- path: string;
302
- priority?: number;
303
- }>;
293
+ routing?: ApplicationServiceRouting | ApplicationServiceRouting[];
304
294
  }
@@ -271,8 +271,8 @@ export declare const ApplicationResourcePlanSchema: z.ZodObject<{
271
271
  }, z.core.$strict>]>>;
272
272
  flowLogs: z.ZodOptional<z.ZodUnion<[z.ZodLiteral<false>, z.ZodObject<{
273
273
  destination: z.ZodOptional<z.ZodEnum<{
274
- cloudwatch: "cloudwatch";
275
274
  s3: "s3";
275
+ cloudwatch: "cloudwatch";
276
276
  }>>;
277
277
  retentionDays: z.ZodOptional<z.ZodNumber>;
278
278
  trafficType: z.ZodOptional<z.ZodEnum<{
@@ -314,8 +314,8 @@ export declare const ApplicationResourcePlanSchema: z.ZodObject<{
314
314
  }, z.core.$strict>]>>;
315
315
  flowLogs: z.ZodOptional<z.ZodUnion<[z.ZodLiteral<false>, z.ZodObject<{
316
316
  destination: z.ZodOptional<z.ZodEnum<{
317
- cloudwatch: "cloudwatch";
318
317
  s3: "s3";
318
+ cloudwatch: "cloudwatch";
319
319
  }>>;
320
320
  retentionDays: z.ZodOptional<z.ZodNumber>;
321
321
  trafficType: z.ZodOptional<z.ZodEnum<{
@@ -347,6 +347,7 @@ export declare const ApplicationResourcePlanSchema: z.ZodObject<{
347
347
  Aurora: "Aurora";
348
348
  Instance: "Instance";
349
349
  GlobalAurora: "GlobalAurora";
350
+ ClickHouse: "ClickHouse";
350
351
  }>;
351
352
  databaseName: z.ZodString;
352
353
  instanceType: z.ZodOptional<z.ZodString>;
@@ -488,13 +489,24 @@ export declare const ApplicationResourcePlanSchema: z.ZodObject<{
488
489
  connectedMessaging: z.ZodOptional<z.ZodArray<z.ZodString>>;
489
490
  cluster: z.ZodOptional<z.ZodObject<{
490
491
  domain: z.ZodOptional<z.ZodString>;
491
- loadBalancer: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<false>, z.ZodLiteral<"public">, z.ZodLiteral<"internal">]>>;
492
+ loadBalancer: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<false>, z.ZodEnum<{
493
+ public: "public";
494
+ internal: "internal";
495
+ }>]>>;
492
496
  directAccess: z.ZodOptional<z.ZodBoolean>;
497
+ extraProperties: z.ZodOptional<z.ZodArray<z.ZodObject<{
498
+ key: z.ZodString;
499
+ sourceText: z.ZodString;
500
+ }, z.core.$strict>>>;
493
501
  }, z.core.$strict>>;
494
502
  services: z.ZodOptional<z.ZodArray<z.ZodObject<{
495
503
  name: z.ZodString;
496
- dockerfilePath: z.ZodOptional<z.ZodString>;
497
- dockerTarget: z.ZodOptional<z.ZodString>;
504
+ docker: z.ZodOptional<z.ZodObject<{
505
+ path: z.ZodString;
506
+ context: z.ZodOptional<z.ZodString>;
507
+ target: z.ZodOptional<z.ZodString>;
508
+ buildArgs: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
509
+ }, z.core.$strict>>;
498
510
  needsDatabaseConnection: z.ZodOptional<z.ZodBoolean>;
499
511
  needsStorageConnection: z.ZodOptional<z.ZodBoolean>;
500
512
  needsMessagingConnection: z.ZodOptional<z.ZodBoolean>;
@@ -572,6 +584,10 @@ export declare const ApplicationResourcePlanSchema: z.ZodObject<{
572
584
  minSize: z.ZodOptional<z.ZodNumber>;
573
585
  reuseOnScaleIn: z.ZodOptional<z.ZodBoolean>;
574
586
  }, z.core.$strict>>;
587
+ extraProperties: z.ZodOptional<z.ZodArray<z.ZodObject<{
588
+ key: z.ZodString;
589
+ sourceText: z.ZodString;
590
+ }, z.core.$strict>>>;
575
591
  }, z.core.$strict>>;
576
592
  ssmSecretsPath: z.ZodOptional<z.ZodString>;
577
593
  extraProperties: z.ZodOptional<z.ZodArray<z.ZodObject<{
@@ -585,7 +601,12 @@ export declare const ApplicationResourcePlanSchema: z.ZodObject<{
585
601
  http5xxThreshold: z.ZodOptional<z.ZodNumber>;
586
602
  }, z.core.$strict>]>>;
587
603
  }, z.core.$strict>>>;
588
- dockerfilePath: z.ZodOptional<z.ZodString>;
604
+ docker: z.ZodOptional<z.ZodObject<{
605
+ path: z.ZodOptional<z.ZodString>;
606
+ context: z.ZodOptional<z.ZodOptional<z.ZodString>>;
607
+ target: z.ZodOptional<z.ZodOptional<z.ZodString>>;
608
+ buildArgs: z.ZodOptional<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>>;
609
+ }, z.core.$strict>>;
589
610
  deployment: z.ZodOptional<z.ZodEnum<{
590
611
  code: "code";
591
612
  container: "container";
@@ -700,6 +721,23 @@ export declare const ApplicationResourcePlanSchema: z.ZodObject<{
700
721
  sourceText: z.ZodString;
701
722
  }, z.core.$strict>>>;
702
723
  }, z.core.$strict>>>;
724
+ clickhouse: z.ZodOptional<z.ZodArray<z.ZodObject<{
725
+ name: z.ZodString;
726
+ type: z.ZodLiteral<"ClickHouse">;
727
+ databaseName: z.ZodString;
728
+ instanceType: z.ZodOptional<z.ZodString>;
729
+ coldTier: z.ZodOptional<z.ZodUnion<readonly [z.ZodObject<{
730
+ mode: z.ZodLiteral<"s3">;
731
+ }, z.core.$strict>, z.ZodLiteral<false>]>>;
732
+ optimiseSchedule: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodLiteral<false>]>>;
733
+ backupSchedule: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodLiteral<false>]>>;
734
+ backupRetentionDays: z.ZodOptional<z.ZodNumber>;
735
+ variableName: z.ZodOptional<z.ZodString>;
736
+ extraProperties: z.ZodOptional<z.ZodArray<z.ZodObject<{
737
+ key: z.ZodString;
738
+ sourceText: z.ZodString;
739
+ }, z.core.$strict>>>;
740
+ }, z.core.$strict>>>;
703
741
  sqs: z.ZodOptional<z.ZodArray<z.ZodObject<{
704
742
  name: z.ZodString;
705
743
  queueType: z.ZodDefault<z.ZodEnum<{
@@ -761,6 +799,9 @@ export declare const ApplicationResourcePlanSchema: z.ZodObject<{
761
799
  network: "network";
762
800
  messaging: "messaging";
763
801
  cdn: "cdn";
802
+ "vpc-peer": "vpc-peer";
803
+ "vpc-peer-accepter": "vpc-peer-accepter";
804
+ "cross-plan-connection": "cross-plan-connection";
764
805
  }>;
765
806
  name: z.ZodOptional<z.ZodString>;
766
807
  }, z.core.$strict>>;
@@ -824,8 +865,8 @@ export declare const ApplicationGeneratorSchema: z.ZodObject<{
824
865
  }, z.core.$strict>]>>;
825
866
  flowLogs: z.ZodOptional<z.ZodUnion<[z.ZodLiteral<false>, z.ZodObject<{
826
867
  destination: z.ZodOptional<z.ZodEnum<{
827
- cloudwatch: "cloudwatch";
828
868
  s3: "s3";
869
+ cloudwatch: "cloudwatch";
829
870
  }>>;
830
871
  retentionDays: z.ZodOptional<z.ZodNumber>;
831
872
  trafficType: z.ZodOptional<z.ZodEnum<{
@@ -852,7 +893,12 @@ export declare const ApplicationGeneratorSchema: z.ZodObject<{
852
893
  }, z.core.$strict>]>>;
853
894
  services: z.ZodOptional<z.ZodArray<z.ZodObject<{
854
895
  name: z.ZodString;
855
- dockerfilePath: z.ZodOptional<z.ZodString>;
896
+ docker: z.ZodOptional<z.ZodObject<{
897
+ path: z.ZodOptional<z.ZodString>;
898
+ context: z.ZodOptional<z.ZodOptional<z.ZodString>>;
899
+ target: z.ZodOptional<z.ZodOptional<z.ZodString>>;
900
+ buildArgs: z.ZodOptional<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>>;
901
+ }, z.core.$strict>>;
856
902
  containerPort: z.ZodOptional<z.ZodNumber>;
857
903
  needsDatabaseConnection: z.ZodOptional<z.ZodBoolean>;
858
904
  routing: z.ZodOptional<z.ZodUnion<readonly [z.ZodObject<{
@@ -866,5 +912,18 @@ export declare const ApplicationGeneratorSchema: z.ZodObject<{
866
912
  snapshotIdentifier: z.ZodOptional<z.ZodString>;
867
913
  snapshotUsername: z.ZodOptional<z.ZodString>;
868
914
  }, z.core.$strict>;
915
+ export declare const CrossPlanConnectionResourcePlanSchema: z.ZodObject<{
916
+ name: z.ZodString;
917
+ localResource: z.ZodString;
918
+ remoteApp: z.ZodString;
919
+ remoteResource: z.ZodString;
920
+ permission: z.ZodEnum<{
921
+ read: "read";
922
+ write: "write";
923
+ "read-write": "read-write";
924
+ }>;
925
+ remoteArn: z.ZodOptional<z.ZodString>;
926
+ }, z.core.$strict>;
869
927
  export type ApplicationResourcePlan = z.infer<typeof ApplicationResourcePlanSchema>;
870
928
  export type ApplicationGeneratorOptions = z.infer<typeof ApplicationGeneratorSchema>;
929
+ export type CrossPlanConnectionResourcePlan = z.infer<typeof CrossPlanConnectionResourcePlanSchema>;
@@ -1 +1 @@
1
- import{z as o}from"zod";import{VALIDATION_MESSAGES as a}from"../validation/patterns.js";import{AppNameSchema as t,AppTypeSchema as e,PatternSchema as r,CustomCodeBlockSchema as n,BackupConfigSchema as i,TunnelConfigSchema as p}from"./baseSchemas.js";import{DatabaseResourcePlanSchema as m}from"./databaseSchemas.js";import{NetworkResourcePlanSchema as c,AdditionalNetworkResourcePlanSchema as s,NetworkConfigSchema as l}from"./networkSchemas.js";import{S3ResourcePlanSchema as S}from"./storageSchemas.js";import{SQSResourcePlanSchema as u}from"./messagingSchemas.js";import{CDNResourcePlanSchema as h}from"./cdnSchemas.js";import{ComputeResourcePlanSchema as g,ApplicationServiceConfigSchema as d}from"./computeSchemas.js";import{DynamoDBResourcePlanSchema as f}from"./databaseSchemas.js";import{PatternConfigSchema as A,PatternTierSchema as y,CustomPatternDatabaseSchema as C,CustomPatternComputeSchema as P}from"./patternSchemas.js";const v=o.object({appName:t,type:e,pattern:r.optional(),patternConfig:A.optional(),owner:o.string().optional(),tags:o.record(o.string(),o.string()).optional(),vpcId:o.string().optional(),network:c.optional(),backup:i.optional(),tunnel:p.optional(),additionalNetworks:o.array(s).optional(),database:o.array(m),s3:o.array(S),compute:o.array(g),dynamodb:o.array(f).optional(),sqs:o.array(u).optional(),cdn:h.optional(),customCodeBlocks:o.array(n).optional(),additionalManagedImports:o.array(o.object({moduleSpecifier:o.string(),namedImports:o.array(o.string()),defaultImport:o.string().optional()}).strict()).optional()}).strict(),j=o.object({name:t,type:e,pattern:r.optional(),patternTier:y.optional(),patternDomain:o.string().optional(),customDatabase:C.optional(),customCompute:P.optional(),region:o.string().optional(),owner:o.string().optional(),includeDatabase:o.boolean().optional(),databaseName:o.string().min(1,a.DATABASE.NAME.REQUIRED).max(63,a.DATABASE.NAME.MAX_LENGTH).optional(),vpcId:o.string().optional(),network:l.optional(),services:o.array(d).optional(),snapshotIdentifier:o.string().optional(),snapshotUsername:o.string().optional()}).strict();export{j as ApplicationGeneratorSchema,v as ApplicationResourcePlanSchema};
1
+ import{z as o}from"zod";import{VALIDATION_MESSAGES as a}from"../validation/patterns.js";import{AppNameSchema as t,AppTypeSchema as e,PatternSchema as r,CustomCodeBlockSchema as n,BackupConfigSchema as i,TunnelConfigSchema as m,ResourceNameSchema as p}from"./baseSchemas.js";import{DatabaseResourcePlanSchema as c,ClickHouseResourcePlanSchema as s}from"./databaseSchemas.js";import{NetworkResourcePlanSchema as l,AdditionalNetworkResourcePlanSchema as S,NetworkConfigSchema as u}from"./networkSchemas.js";import{S3ResourcePlanSchema as h}from"./storageSchemas.js";import{SQSResourcePlanSchema as g}from"./messagingSchemas.js";import{CDNResourcePlanSchema as d}from"./cdnSchemas.js";import{ComputeResourcePlanSchema as f,ApplicationServiceConfigSchema as A}from"./computeSchemas.js";import{DynamoDBResourcePlanSchema as C}from"./databaseSchemas.js";import{PatternConfigSchema as P,PatternTierSchema as y,CustomPatternDatabaseSchema as R,CustomPatternComputeSchema as b}from"./patternSchemas.js";const x=o.object({appName:t,type:e,pattern:r.optional(),patternConfig:P.optional(),owner:o.string().optional(),tags:o.record(o.string(),o.string()).optional(),vpcId:o.string().optional(),network:l.optional(),backup:i.optional(),tunnel:m.optional(),additionalNetworks:o.array(S).optional(),database:o.array(c),s3:o.array(h),compute:o.array(f),dynamodb:o.array(C).optional(),clickhouse:o.array(s).optional(),sqs:o.array(g).optional(),cdn:d.optional(),customCodeBlocks:o.array(n).optional(),additionalManagedImports:o.array(o.object({moduleSpecifier:o.string(),namedImports:o.array(o.string()),defaultImport:o.string().optional()}).strict()).optional()}).strict(),G=o.object({name:t,type:e,pattern:r.optional(),patternTier:y.optional(),patternDomain:o.string().optional(),customDatabase:R.optional(),customCompute:b.optional(),region:o.string().optional(),owner:o.string().optional(),includeDatabase:o.boolean().optional(),databaseName:o.string().min(1,a.DATABASE.NAME.REQUIRED).max(63,a.DATABASE.NAME.MAX_LENGTH).optional(),vpcId:o.string().optional(),network:u.optional(),services:o.array(A).optional(),snapshotIdentifier:o.string().optional(),snapshotUsername:o.string().optional()}).strict(),H=o.object({name:p,localResource:o.string().min(1),remoteApp:o.string().min(1),remoteResource:o.string().min(1),permission:o.enum(["read","write","read-write"]),remoteArn:o.string().optional()}).strict();export{G as ApplicationGeneratorSchema,x as ApplicationResourcePlanSchema,H as CrossPlanConnectionResourcePlanSchema};
@@ -1,4 +1,5 @@
1
1
  import { z } from "zod";
2
+ export type { AppType } from "./constants.js";
2
3
  export declare const optionalOrDisabled: <T extends z.ZodTypeAny>(schema: T) => z.ZodUnion<[z.ZodLiteral<false>, T]>;
3
4
  /** Reusable capacity validation: ensures minCapacity <= maxCapacity. */
4
5
  export declare const CAPACITY_REFINEMENT: {
@@ -108,10 +109,7 @@ export declare const CustomCodePositionSchema: z.ZodEnum<{
108
109
  "after-resource": "after-resource";
109
110
  "end-of-file": "end-of-file";
110
111
  }>;
111
- /**
112
- * Statement type for managed resources.
113
- */
114
- export declare const StatementTypeSchema: z.ZodEnum<{
112
+ export declare const AstStatementTypeSchema: z.ZodEnum<{
115
113
  custom: "custom";
116
114
  storage: "storage";
117
115
  database: "database";
@@ -123,6 +121,9 @@ export declare const StatementTypeSchema: z.ZodEnum<{
123
121
  network: "network";
124
122
  messaging: "messaging";
125
123
  cdn: "cdn";
124
+ "vpc-peer": "vpc-peer";
125
+ "vpc-peer-accepter": "vpc-peer-accepter";
126
+ "cross-plan-connection": "cross-plan-connection";
126
127
  }>;
127
128
  /**
128
129
  * Custom code block schema.
@@ -152,6 +153,9 @@ export declare const CustomCodeBlockSchema: z.ZodObject<{
152
153
  network: "network";
153
154
  messaging: "messaging";
154
155
  cdn: "cdn";
156
+ "vpc-peer": "vpc-peer";
157
+ "vpc-peer-accepter": "vpc-peer-accepter";
158
+ "cross-plan-connection": "cross-plan-connection";
155
159
  }>;
156
160
  name: z.ZodOptional<z.ZodString>;
157
161
  }, z.core.$strict>>;
@@ -183,6 +187,7 @@ export declare const TunnelConfigSchema: z.ZodUnion<readonly [z.ZodObject<{
183
187
  instanceType: z.ZodOptional<z.ZodString>;
184
188
  }, z.core.$strict>, z.ZodLiteral<false>]>;
185
189
  export declare const OrganisationNameSchema: z.ZodString;
190
+ export type OrganisationName = z.infer<typeof OrganisationNameSchema>;
186
191
  export declare const EmailSchema: z.ZodString;
187
192
  export declare const RegionSchema: z.ZodString;
188
193
  export declare const OrganisationGeneratorSchema: z.ZodObject<{
@@ -199,13 +204,27 @@ export declare const OrganisationGeneratorSchema: z.ZodObject<{
199
204
  force: z.ZodOptional<z.ZodBoolean>;
200
205
  }, z.core.$strict>;
201
206
  export declare function getZodErrorMessage(error: z.ZodError<unknown>): string;
207
+ export type ResourceName = z.infer<typeof ResourceNameSchema>;
208
+ export type BucketName = z.infer<typeof BucketNameSchema>;
209
+ export type DatabaseName = z.infer<typeof DatabaseNameSchema>;
210
+ export type AppName = z.infer<typeof AppNameSchema>;
211
+ export type Port = z.infer<typeof PortSchema>;
202
212
  export type IdentifierValue = z.infer<typeof IdentifierValueSchema>;
203
213
  export type ExpressionValue = z.infer<typeof ExpressionValueSchema>;
204
214
  export type CallValue = z.infer<typeof CallValueSchema>;
205
215
  export type SpecialValue = z.infer<typeof SpecialValueSchema>;
206
216
  export type EnvironmentValue = z.infer<typeof EnvironmentValueSchema>;
207
217
  export type CustomCodePosition = z.infer<typeof CustomCodePositionSchema>;
208
- export type StatementType = z.infer<typeof StatementTypeSchema>;
218
+ export type AstStatementType = z.infer<typeof AstStatementTypeSchema>;
209
219
  export type CustomCodeBlock = z.infer<typeof CustomCodeBlockSchema>;
210
220
  export type ExtraProperty = z.infer<typeof ExtraPropertySchema>;
211
221
  export type OrganisationGeneratorOptions = z.infer<typeof OrganisationGeneratorSchema>;
222
+ export type EnvironmentRecord = z.infer<typeof EnvironmentRecordSchema>;
223
+ export type SecretImport = z.infer<typeof SecretImportSchema>;
224
+ export type SecretsImportRecord = z.infer<typeof SecretsImportRecordSchema>;
225
+ export type MetadataRecord = z.infer<typeof MetadataRecordSchema>;
226
+ export type Pattern = z.infer<typeof PatternSchema>;
227
+ export type BackupConfig = z.infer<typeof BackupConfigSchema>;
228
+ export type TunnelConfig = z.infer<typeof TunnelConfigSchema>;
229
+ export type Email = z.infer<typeof EmailSchema>;
230
+ export type Region = z.infer<typeof RegionSchema>;
@@ -1,2 +1,2 @@
1
- import{z as e}from"zod";import{VALIDATION_PATTERNS as o,VALIDATION_MESSAGES as t}from"../validation/patterns.js";import{APP_TYPES as a,PATTERN_TYPE_VALUES as i,MIN_PORT as c,MAX_PORT as m,BACKUP_VAULT_TIERS as E}from"./constants.js";import{regions as p}from"../aws/regions.js";const O=n=>e.union([e.literal(!1),n]),b={check:n=>n.minCapacity!==void 0&&n.maxCapacity!==void 0?n.minCapacity<=n.maxCapacity:!0,params:{message:t.CAPACITY_CONSTRAINT.MIN_LTE_MAX,path:["maxCapacity"]}},P=n=>e.number().int(t.MEMORY_LIMIT.INTEGER).min(n,n===128?t.MEMORY_LIMIT.MIN_128:t.MEMORY_LIMIT.MIN_512).max(30720,t.MEMORY_LIMIT.MAX),D=e.string().min(1,t.REQUIRED.RESOURCE_NAME).max(63,t.MAX_LENGTH.RESOURCE_NAME).regex(o.RESOURCE_NAME,t.RESOURCE_NAME),L=e.string().min(1,t.REQUIRED.BUCKET_NAME).max(63,t.MAX_LENGTH.BUCKET_NAME).regex(o.BUCKET_NAME,t.BUCKET_NAME),y=e.string().min(1,t.REQUIRED.DATABASE_NAME).max(63,t.MAX_LENGTH.DATABASE_NAME).regex(o.DATABASE_NAME,t.DATABASE_NAME),U=e.string().min(2,t.IDENTIFIER_MIN_LENGTH).max(50,t.MAX_LENGTH.APP_NAME).regex(o.IDENTIFIER,t.IDENTIFIER).refine(n=>!n.endsWith("-"),{message:t.IDENTIFIER_NO_TRAILING_HYPHEN}).refine(n=>!n.includes("--"),{message:t.IDENTIFIER_NO_CONSECUTIVE_HYPHENS}),G=e.number().int(t.PORT.INTEGER).min(c,t.PORT.MIN).max(m,t.PORT.MAX),H=e.object({key:e.string(),sourceText:e.string()}).strict(),I=e.object({__identifier:e.string()}).strict(),N=e.object({__expression:e.string()}).strict(),T=e.object({__call:e.string()}).strict(),A=e.union([I,N,T]),_=e.union([e.string(),e.number(),e.boolean(),A]),j=e.record(e.string(),_),g=e.object({id:e.string(),name:e.string(),field:e.string().optional()}).strict(),B=e.record(e.string(),g),Y=e.record(e.string(),e.unknown()),F=e.enum(a).describe(`Application type must be one of: ${a.join(", ")}`),V=e.enum(i).describe(`OpenNext deployment pattern: ${i.join(", ")}`),l=e.enum(["before-imports","after-imports","after-app-init","after-tags","after-resource","end-of-file"]),R=e.enum(["import","app-init","tags","database","compute","storage","network","messaging","cdn","pattern","custom"]),X=e.object({sourceText:e.string(),position:l,afterManagedResource:e.object({type:R,name:e.string().optional()}).strict().optional(),originalLine:e.number().int().optional(),leadingComments:e.array(e.string()).optional(),orphaned:e.boolean().optional(),orphanedComment:e.string().optional()}).strict(),k=e.union([e.object({tier:e.enum(E)}).strict(),e.literal(!1)]),K=e.union([e.object({instanceType:e.string().optional()}).strict(),e.literal(!1)]),S=e.string().min(2,t.IDENTIFIER_MIN_LENGTH).max(50,t.MAX_LENGTH.ORGANISATION_NAME).regex(o.IDENTIFIER,t.IDENTIFIER).refine(n=>!n.endsWith("-"),{message:t.IDENTIFIER_NO_TRAILING_HYPHEN}).refine(n=>!n.includes("--"),{message:t.IDENTIFIER_NO_CONSECUTIVE_HYPHENS}),x=e.string().email(t.EMAIL),s=e.string().refine(n=>p.includes(n),{message:t.REGION}),$=e.object({name:S,email:x,accountName:e.string().optional(),primaryRegion:s.optional().default("us-east-1"),secondaryRegions:e.array(s).optional(),security:e.enum(["foundation","compliance","hardened"]).optional(),force:e.boolean().optional()}).strict();function Q(n){return n.issues.map(r=>`${r.path.length>0?`${r.path.join(".")}: `:""}${r.message}`).join(`
2
- `)}export{U as AppNameSchema,F as AppTypeSchema,k as BackupConfigSchema,L as BucketNameSchema,b as CAPACITY_REFINEMENT,T as CallValueSchema,X as CustomCodeBlockSchema,l as CustomCodePositionSchema,y as DatabaseNameSchema,x as EmailSchema,j as EnvironmentRecordSchema,_ as EnvironmentValueSchema,N as ExpressionValueSchema,H as ExtraPropertySchema,I as IdentifierValueSchema,Y as MetadataRecordSchema,$ as OrganisationGeneratorSchema,S as OrganisationNameSchema,V as PatternSchema,G as PortSchema,s as RegionSchema,D as ResourceNameSchema,g as SecretImportSchema,B as SecretsImportRecordSchema,A as SpecialValueSchema,R as StatementTypeSchema,K as TunnelConfigSchema,Q as getZodErrorMessage,P as memoryLimitMiBSchema,O as optionalOrDisabled};
1
+ import{z as e}from"zod";import{VALIDATION_PATTERNS as o,VALIDATION_MESSAGES as t}from"../validation/patterns.js";import{APP_TYPES as i,PATTERN_TYPE_VALUES as s,MIN_PORT as p,MAX_PORT as E,BACKUP_VAULT_TIERS as A,GOVERNANCE_PRESETS as N}from"./constants.js";import{regions as _}from"../aws/regions.js";const P=n=>e.union([e.literal(!1),n]),L={check:n=>n.minCapacity!==void 0&&n.maxCapacity!==void 0?n.minCapacity<=n.maxCapacity:!0,params:{message:t.CAPACITY_CONSTRAINT.MIN_LTE_MAX,path:["maxCapacity"]}},y=n=>e.number().int(t.MEMORY_LIMIT.INTEGER).min(n,n===128?t.MEMORY_LIMIT.MIN_128:t.MEMORY_LIMIT.MIN_512).max(30720,t.MEMORY_LIMIT.MAX),D=e.string().min(1,t.REQUIRED.RESOURCE_NAME).max(63,t.MAX_LENGTH.RESOURCE_NAME).regex(o.RESOURCE_NAME,t.RESOURCE_NAME),U=e.string().min(1,t.REQUIRED.BUCKET_NAME).max(63,t.MAX_LENGTH.BUCKET_NAME).regex(o.BUCKET_NAME,t.BUCKET_NAME),V=e.string().min(1,t.REQUIRED.DATABASE_NAME).max(63,t.MAX_LENGTH.DATABASE_NAME).regex(o.DATABASE_NAME,t.DATABASE_NAME);function c(n){return e.string().min(2,t.IDENTIFIER_MIN_LENGTH).max(50,n).regex(o.IDENTIFIER,t.IDENTIFIER).refine(r=>!r.endsWith("-"),{message:t.IDENTIFIER_NO_TRAILING_HYPHEN}).refine(r=>!r.includes("--"),{message:t.IDENTIFIER_NO_CONSECUTIVE_HYPHENS})}const j=c(t.MAX_LENGTH.APP_NAME),G=e.number().int(t.PORT.INTEGER).min(p,t.PORT.MIN).max(E,t.PORT.MAX),B=e.object({key:e.string(),sourceText:e.string()}).strict(),g=e.object({__identifier:e.string()}).strict(),T=e.object({__expression:e.string()}).strict(),I=e.object({__call:e.string()}).strict(),S=e.union([g,T,I]),l=e.union([e.string(),e.number(),e.boolean(),S]),H=e.record(e.string().regex(o.ENV_VAR_NAME,t.ENV_VAR_NAME),l),x=e.object({id:e.string(),name:e.string(),field:e.string().optional()}).strict(),Y=e.record(e.string(),x),X=e.record(e.string(),e.unknown()),k=e.enum(i).describe(`Application type must be one of: ${i.join(", ")}`),F=e.enum(s).describe(`OpenNext deployment pattern: ${s.join(", ")}`),M=e.enum(["before-imports","after-imports","after-app-init","after-tags","after-resource","end-of-file"]),R=e.enum(["import","app-init","tags","database","compute","storage","network","messaging","cdn","pattern","vpc-peer","vpc-peer-accepter","cross-plan-connection","custom"]),K=e.object({sourceText:e.string(),position:M,afterManagedResource:e.object({type:R,name:e.string().optional()}).strict().optional(),originalLine:e.number().int().optional(),leadingComments:e.array(e.string()).optional(),orphaned:e.boolean().optional(),orphanedComment:e.string().optional()}).strict(),$=e.union([e.object({tier:e.enum(A)}).strict(),e.literal(!1)]),v=e.union([e.object({instanceType:e.string().optional()}).strict(),e.literal(!1)]),u=c(t.MAX_LENGTH.ORGANISATION_NAME),h=e.string().regex(o.EMAIL,t.EMAIL),m=e.string().refine(n=>_.includes(n),{message:t.REGION}),Q=e.object({name:u,email:h,accountName:e.string().optional(),primaryRegion:m.optional().default("us-east-1"),secondaryRegions:e.array(m).optional(),security:e.enum(N).optional(),force:e.boolean().optional()}).strict();function w(n){return n.issues.map(a=>`${a.path.length>0?`${a.path.join(".")}: `:""}${a.message}`).join(`
2
+ `)}export{j as AppNameSchema,k as AppTypeSchema,R as AstStatementTypeSchema,$ as BackupConfigSchema,U as BucketNameSchema,L as CAPACITY_REFINEMENT,I as CallValueSchema,K as CustomCodeBlockSchema,M as CustomCodePositionSchema,V as DatabaseNameSchema,h as EmailSchema,H as EnvironmentRecordSchema,l as EnvironmentValueSchema,T as ExpressionValueSchema,B as ExtraPropertySchema,g as IdentifierValueSchema,X as MetadataRecordSchema,Q as OrganisationGeneratorSchema,u as OrganisationNameSchema,F as PatternSchema,G as PortSchema,m as RegionSchema,D as ResourceNameSchema,x as SecretImportSchema,Y as SecretsImportRecordSchema,S as SpecialValueSchema,v as TunnelConfigSchema,w as getZodErrorMessage,y as memoryLimitMiBSchema,P as optionalOrDisabled};
@@ -1,6 +1,17 @@
1
1
  import { z } from "zod";
2
+ export type { ComputeType, EcsCapacityProvider } from "./constants.js";
2
3
  /** Reusable Lambda memory validation with multiple-of-64 constraint. */
3
4
  export declare const LambdaMemorySchema: z.ZodNumber;
5
+ /**
6
+ * Reusable Lambda runtime validator. Two consumer schemas
7
+ * (`ComputeResourcePlanSchema`, `LambdaComputeGeneratorSchema`) must enforce
8
+ * the same regex — drift would silently let one accept a runtime the other
9
+ * rejects. See `.claude/rules/code-quality.md § "Coupled Numeric Defaults
10
+ * Need a Shared Source at 2 Occurrences"` (extends to coupled regex
11
+ * validators).
12
+ */
13
+ export declare const LambdaRuntimeSchema: z.ZodString;
14
+ export type LambdaRuntime = z.infer<typeof LambdaRuntimeSchema>;
4
15
  export declare const WarmPoolSchema: z.ZodObject<{
5
16
  minSize: z.ZodOptional<z.ZodNumber>;
6
17
  reuseOnScaleIn: z.ZodOptional<z.ZodBoolean>;
@@ -18,6 +29,10 @@ export declare const Ec2ConfigSchema: z.ZodObject<{
18
29
  minSize: z.ZodOptional<z.ZodNumber>;
19
30
  reuseOnScaleIn: z.ZodOptional<z.ZodBoolean>;
20
31
  }, z.core.$strict>>;
32
+ extraProperties: z.ZodOptional<z.ZodArray<z.ZodObject<{
33
+ key: z.ZodString;
34
+ sourceText: z.ZodString;
35
+ }, z.core.$strict>>>;
21
36
  }, z.core.$strict>;
22
37
  export declare const ComputeTypeSchema: z.ZodEnum<{
23
38
  ecs: "ecs";
@@ -94,8 +109,15 @@ export declare const EcsServiceNameSchema: z.ZodString;
94
109
  */
95
110
  export declare const EcsClusterConfigSchema: z.ZodObject<{
96
111
  domain: z.ZodOptional<z.ZodString>;
97
- loadBalancer: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<false>, z.ZodLiteral<"public">, z.ZodLiteral<"internal">]>>;
112
+ loadBalancer: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<false>, z.ZodEnum<{
113
+ public: "public";
114
+ internal: "internal";
115
+ }>]>>;
98
116
  directAccess: z.ZodOptional<z.ZodBoolean>;
117
+ extraProperties: z.ZodOptional<z.ZodArray<z.ZodObject<{
118
+ key: z.ZodString;
119
+ sourceText: z.ZodString;
120
+ }, z.core.$strict>>>;
99
121
  }, z.core.$strict>;
100
122
  /**
101
123
  * Routing configuration for path/host-based routing on the ALB.
@@ -125,8 +147,12 @@ export declare const EcsScalingConfigSchema: z.ZodObject<{
125
147
  */
126
148
  export declare const EcsServiceConfigSchema: z.ZodObject<{
127
149
  name: z.ZodString;
128
- dockerfilePath: z.ZodOptional<z.ZodString>;
129
- dockerTarget: z.ZodOptional<z.ZodString>;
150
+ docker: z.ZodOptional<z.ZodObject<{
151
+ path: z.ZodString;
152
+ context: z.ZodOptional<z.ZodString>;
153
+ target: z.ZodOptional<z.ZodString>;
154
+ buildArgs: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
155
+ }, z.core.$strict>>;
130
156
  needsDatabaseConnection: z.ZodOptional<z.ZodBoolean>;
131
157
  needsStorageConnection: z.ZodOptional<z.ZodBoolean>;
132
158
  needsMessagingConnection: z.ZodOptional<z.ZodBoolean>;
@@ -204,6 +230,10 @@ export declare const EcsServiceConfigSchema: z.ZodObject<{
204
230
  minSize: z.ZodOptional<z.ZodNumber>;
205
231
  reuseOnScaleIn: z.ZodOptional<z.ZodBoolean>;
206
232
  }, z.core.$strict>>;
233
+ extraProperties: z.ZodOptional<z.ZodArray<z.ZodObject<{
234
+ key: z.ZodString;
235
+ sourceText: z.ZodString;
236
+ }, z.core.$strict>>>;
207
237
  }, z.core.$strict>>;
208
238
  ssmSecretsPath: z.ZodOptional<z.ZodString>;
209
239
  extraProperties: z.ZodOptional<z.ZodArray<z.ZodObject<{
@@ -234,13 +264,24 @@ export declare const ComputeResourcePlanSchema: z.ZodObject<{
234
264
  connectedMessaging: z.ZodOptional<z.ZodArray<z.ZodString>>;
235
265
  cluster: z.ZodOptional<z.ZodObject<{
236
266
  domain: z.ZodOptional<z.ZodString>;
237
- loadBalancer: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<false>, z.ZodLiteral<"public">, z.ZodLiteral<"internal">]>>;
267
+ loadBalancer: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<false>, z.ZodEnum<{
268
+ public: "public";
269
+ internal: "internal";
270
+ }>]>>;
238
271
  directAccess: z.ZodOptional<z.ZodBoolean>;
272
+ extraProperties: z.ZodOptional<z.ZodArray<z.ZodObject<{
273
+ key: z.ZodString;
274
+ sourceText: z.ZodString;
275
+ }, z.core.$strict>>>;
239
276
  }, z.core.$strict>>;
240
277
  services: z.ZodOptional<z.ZodArray<z.ZodObject<{
241
278
  name: z.ZodString;
242
- dockerfilePath: z.ZodOptional<z.ZodString>;
243
- dockerTarget: z.ZodOptional<z.ZodString>;
279
+ docker: z.ZodOptional<z.ZodObject<{
280
+ path: z.ZodString;
281
+ context: z.ZodOptional<z.ZodString>;
282
+ target: z.ZodOptional<z.ZodString>;
283
+ buildArgs: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
284
+ }, z.core.$strict>>;
244
285
  needsDatabaseConnection: z.ZodOptional<z.ZodBoolean>;
245
286
  needsStorageConnection: z.ZodOptional<z.ZodBoolean>;
246
287
  needsMessagingConnection: z.ZodOptional<z.ZodBoolean>;
@@ -318,6 +359,10 @@ export declare const ComputeResourcePlanSchema: z.ZodObject<{
318
359
  minSize: z.ZodOptional<z.ZodNumber>;
319
360
  reuseOnScaleIn: z.ZodOptional<z.ZodBoolean>;
320
361
  }, z.core.$strict>>;
362
+ extraProperties: z.ZodOptional<z.ZodArray<z.ZodObject<{
363
+ key: z.ZodString;
364
+ sourceText: z.ZodString;
365
+ }, z.core.$strict>>>;
321
366
  }, z.core.$strict>>;
322
367
  ssmSecretsPath: z.ZodOptional<z.ZodString>;
323
368
  extraProperties: z.ZodOptional<z.ZodArray<z.ZodObject<{
@@ -331,7 +376,12 @@ export declare const ComputeResourcePlanSchema: z.ZodObject<{
331
376
  http5xxThreshold: z.ZodOptional<z.ZodNumber>;
332
377
  }, z.core.$strict>]>>;
333
378
  }, z.core.$strict>>>;
334
- dockerfilePath: z.ZodOptional<z.ZodString>;
379
+ docker: z.ZodOptional<z.ZodObject<{
380
+ path: z.ZodOptional<z.ZodString>;
381
+ context: z.ZodOptional<z.ZodOptional<z.ZodString>>;
382
+ target: z.ZodOptional<z.ZodOptional<z.ZodString>>;
383
+ buildArgs: z.ZodOptional<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>>;
384
+ }, z.core.$strict>>;
335
385
  deployment: z.ZodOptional<z.ZodEnum<{
336
386
  code: "code";
337
387
  container: "container";
@@ -431,6 +481,10 @@ export declare const ECSGeneratorSchema: z.ZodObject<{
431
481
  minSize: z.ZodOptional<z.ZodNumber>;
432
482
  reuseOnScaleIn: z.ZodOptional<z.ZodBoolean>;
433
483
  }, z.core.$strict>>;
484
+ extraProperties: z.ZodOptional<z.ZodArray<z.ZodObject<{
485
+ key: z.ZodString;
486
+ sourceText: z.ZodString;
487
+ }, z.core.$strict>>>;
434
488
  }, z.core.$strict>>;
435
489
  connectionConfig: z.ZodOptional<z.ZodObject<{
436
490
  connectToDatabase: z.ZodOptional<z.ZodArray<z.ZodString>>;
@@ -509,6 +563,10 @@ export declare const AddServiceGeneratorSchema: z.ZodObject<{
509
563
  minSize: z.ZodOptional<z.ZodNumber>;
510
564
  reuseOnScaleIn: z.ZodOptional<z.ZodBoolean>;
511
565
  }, z.core.$strict>>;
566
+ extraProperties: z.ZodOptional<z.ZodArray<z.ZodObject<{
567
+ key: z.ZodString;
568
+ sourceText: z.ZodString;
569
+ }, z.core.$strict>>>;
512
570
  }, z.core.$strict>>;
513
571
  routing: z.ZodOptional<z.ZodUnion<readonly [z.ZodObject<{
514
572
  path: z.ZodOptional<z.ZodString>;
@@ -521,8 +579,12 @@ export declare const AddServiceGeneratorSchema: z.ZodObject<{
521
579
  priority: z.ZodOptional<z.ZodNumber>;
522
580
  healthCheckPath: z.ZodOptional<z.ZodString>;
523
581
  }, z.core.$strict>>]>>;
524
- dockerfilePath: z.ZodOptional<z.ZodString>;
525
- dockerTarget: z.ZodOptional<z.ZodString>;
582
+ docker: z.ZodOptional<z.ZodObject<{
583
+ path: z.ZodOptional<z.ZodString>;
584
+ context: z.ZodOptional<z.ZodOptional<z.ZodString>>;
585
+ target: z.ZodOptional<z.ZodOptional<z.ZodString>>;
586
+ buildArgs: z.ZodOptional<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>>;
587
+ }, z.core.$strict>>;
526
588
  nameProvidedByFlag: z.ZodOptional<z.ZodBoolean>;
527
589
  connectionConfig: z.ZodOptional<z.ZodObject<{
528
590
  connectToDatabase: z.ZodOptional<z.ZodArray<z.ZodString>>;
@@ -543,13 +605,24 @@ export declare const ComputeGeneratorSchema: z.ZodDiscriminatedUnion<[z.ZodObjec
543
605
  type: z.ZodLiteral<"ecs">;
544
606
  cluster: z.ZodOptional<z.ZodObject<{
545
607
  domain: z.ZodOptional<z.ZodString>;
546
- loadBalancer: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<false>, z.ZodLiteral<"public">, z.ZodLiteral<"internal">]>>;
608
+ loadBalancer: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<false>, z.ZodEnum<{
609
+ public: "public";
610
+ internal: "internal";
611
+ }>]>>;
547
612
  directAccess: z.ZodOptional<z.ZodBoolean>;
613
+ extraProperties: z.ZodOptional<z.ZodArray<z.ZodObject<{
614
+ key: z.ZodString;
615
+ sourceText: z.ZodString;
616
+ }, z.core.$strict>>>;
548
617
  }, z.core.$strict>>;
549
618
  services: z.ZodArray<z.ZodObject<{
550
619
  name: z.ZodString;
551
- dockerfilePath: z.ZodOptional<z.ZodString>;
552
- dockerTarget: z.ZodOptional<z.ZodString>;
620
+ docker: z.ZodOptional<z.ZodObject<{
621
+ path: z.ZodString;
622
+ context: z.ZodOptional<z.ZodString>;
623
+ target: z.ZodOptional<z.ZodString>;
624
+ buildArgs: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
625
+ }, z.core.$strict>>;
553
626
  needsDatabaseConnection: z.ZodOptional<z.ZodBoolean>;
554
627
  needsStorageConnection: z.ZodOptional<z.ZodBoolean>;
555
628
  needsMessagingConnection: z.ZodOptional<z.ZodBoolean>;
@@ -627,6 +700,10 @@ export declare const ComputeGeneratorSchema: z.ZodDiscriminatedUnion<[z.ZodObjec
627
700
  minSize: z.ZodOptional<z.ZodNumber>;
628
701
  reuseOnScaleIn: z.ZodOptional<z.ZodBoolean>;
629
702
  }, z.core.$strict>>;
703
+ extraProperties: z.ZodOptional<z.ZodArray<z.ZodObject<{
704
+ key: z.ZodString;
705
+ sourceText: z.ZodString;
706
+ }, z.core.$strict>>>;
630
707
  }, z.core.$strict>>;
631
708
  ssmSecretsPath: z.ZodOptional<z.ZodString>;
632
709
  extraProperties: z.ZodOptional<z.ZodArray<z.ZodObject<{
@@ -640,7 +717,12 @@ export declare const ComputeGeneratorSchema: z.ZodDiscriminatedUnion<[z.ZodObjec
640
717
  http5xxThreshold: z.ZodOptional<z.ZodNumber>;
641
718
  }, z.core.$strict>]>>;
642
719
  }, z.core.$strict>>;
643
- dockerfilePath: z.ZodOptional<z.ZodString>;
720
+ docker: z.ZodOptional<z.ZodObject<{
721
+ path: z.ZodOptional<z.ZodString>;
722
+ context: z.ZodOptional<z.ZodOptional<z.ZodString>>;
723
+ target: z.ZodOptional<z.ZodOptional<z.ZodString>>;
724
+ buildArgs: z.ZodOptional<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>>;
725
+ }, z.core.$strict>>;
644
726
  }, z.core.$strict>, z.ZodObject<{
645
727
  appName: z.ZodString;
646
728
  computeName: z.ZodString;
@@ -717,7 +799,12 @@ export declare const ApplicationServiceRoutingSchema: z.ZodObject<{
717
799
  */
718
800
  export declare const ApplicationServiceConfigSchema: z.ZodObject<{
719
801
  name: z.ZodString;
720
- dockerfilePath: z.ZodOptional<z.ZodString>;
802
+ docker: z.ZodOptional<z.ZodObject<{
803
+ path: z.ZodOptional<z.ZodString>;
804
+ context: z.ZodOptional<z.ZodOptional<z.ZodString>>;
805
+ target: z.ZodOptional<z.ZodOptional<z.ZodString>>;
806
+ buildArgs: z.ZodOptional<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>>;
807
+ }, z.core.$strict>>;
721
808
  containerPort: z.ZodOptional<z.ZodNumber>;
722
809
  needsDatabaseConnection: z.ZodOptional<z.ZodBoolean>;
723
810
  routing: z.ZodOptional<z.ZodUnion<readonly [z.ZodObject<{
@@ -743,3 +830,10 @@ export type ComputeGeneratorOptions = z.infer<typeof ComputeGeneratorSchema>;
743
830
  export type TunnelGeneratorOptions = z.infer<typeof TunnelGeneratorSchema>;
744
831
  export type WarmPool = z.infer<typeof WarmPoolSchema>;
745
832
  export type Ec2Config = z.infer<typeof Ec2ConfigSchema>;
833
+ export type LambdaMemory = z.infer<typeof LambdaMemorySchema>;
834
+ export type InstanceType = z.infer<typeof InstanceTypeSchema>;
835
+ export type EcsServiceName = z.infer<typeof EcsServiceNameSchema>;
836
+ export type ECSGenerator = z.infer<typeof ECSGeneratorSchema>;
837
+ export type LambdaGenerator = z.infer<typeof LambdaGeneratorSchema>;
838
+ export type EC2Generator = z.infer<typeof EC2GeneratorSchema>;
839
+ export type ApplicationServiceRouting = z.infer<typeof ApplicationServiceRoutingSchema>;
@@ -1 +1 @@
1
- import{z as e}from"zod";import{VALIDATION_PATTERNS as l,VALIDATION_MESSAGES as o}from"../validation/patterns.js";import{COMPUTE_TYPES as _,ECS_CAPACITY_PROVIDERS as P,EC2_INSTANCE_TYPES as v,HTTP_METHODS as U,MIN_LAMBDA_MEMORY as X,MAX_LAMBDA_MEMORY as B,MIN_LAMBDA_TIMEOUT as M,MAX_LAMBDA_TIMEOUT as u,MIN_ECS_CAPACITY as h,MAX_ECS_CAPACITY as f,MAX_SCALING_CAPACITY as p,MAX_WARM_POOL_SIZE as j,constIncludes as W,COMPUTE_ARCHITECTURES as k}from"./constants.js";import{validateArchitectureMatch as w,getArchitectureForInstanceType as V}from"./instanceTypeArchitecture.js";import{optionalOrDisabled as K,CAPACITY_REFINEMENT as r,memoryLimitMiBSchema as E,ResourceNameSchema as c,AppNameSchema as s,PortSchema as A,ExtraPropertySchema as g,EnvironmentRecordSchema as m,SecretsImportRecordSchema as F}from"./baseSchemas.js";import{EcsServiceAlarmConfigSchema as Z,LambdaAlarmConfigSchema as z}from"./alarmSchemas.js";const O=e.number().int(o.CAPACITY.MIN.INTEGER).min(h,o.GENERATOR_CAPACITY.MIN.MIN).max(f,o.GENERATOR_CAPACITY.MIN.MAX),x=e.number().int(o.CAPACITY.MAX.INTEGER).min(h,o.GENERATOR_CAPACITY.MAX.MIN).max(f,o.GENERATOR_CAPACITY.MAX.MAX),R=e.number().int(o.LAMBDA.MEMORY.INTEGER).min(X,o.LAMBDA.MEMORY.MIN).max(B,o.LAMBDA.MEMORY.MAX).refine(t=>t===128||t%64===0,o.LAMBDA.MEMORY.MULTIPLE),S=e.number().int(o.CPU.INTEGER).min(256,o.CPU.MIN).max(4096,o.CPU.MAX),C=e.number().int(o.CAPACITY.DESIRED.INTEGER).min(0,o.CAPACITY.DESIRED.MIN).max(p,o.CAPACITY.DESIRED.MAX),Q=e.object({minSize:e.number().int(o.CAPACITY.WARM_POOL.MIN_SIZE.INTEGER).min(0,o.CAPACITY.WARM_POOL.MIN_SIZE.MIN).max(j,o.CAPACITY.WARM_POOL.MIN_SIZE.MAX).optional(),reuseOnScaleIn:e.boolean().optional()}).strict(),N=e.object({instanceType:e.string().optional(),amiHardwareType:e.enum(["ARM","STANDARD"]).optional(),minCapacity:e.number().int(o.CAPACITY.MIN.INTEGER).min(0,o.CAPACITY.MIN.MIN_0).max(p,o.CAPACITY.MIN.MAX).optional(),maxCapacity:e.number().int(o.CAPACITY.MAX.INTEGER).min(1,o.CAPACITY.MAX.MIN_1).max(p,o.CAPACITY.MAX.MAX).optional(),memoryLimitMiB:E(128).optional(),warmPool:Q.optional()}).strict().superRefine((t,i)=>{if(!t.instanceType||!t.amiHardwareType)return;const n=w(t.instanceType,t.amiHardwareType);n.valid||i.addIssue({code:"custom",message:n.message??o.ARCHITECTURE_MISMATCH,path:["instanceType"]})}).superRefine((t,i)=>{t.minCapacity===0&&!t.warmPool&&i.addIssue({code:"custom",message:o.CAPACITY.WARM_POOL_REQUIRED,path:["minCapacity"]}),t.warmPool?.minSize!==void 0&&t.maxCapacity!==void 0&&t.warmPool.minSize>t.maxCapacity&&i.addIssue({code:"custom",message:o.CAPACITY.WARM_POOL.MIN_SIZE_EXCEEDS_MAX_CAPACITY,path:["warmPool","minSize"]})}),$=e.enum(_).describe(`Compute type must be one of: ${_.join(", ")}`),d=e.enum(P).describe(`ECS capacity provider must be one of: ${P.join(", ")}`),b=e.string().refine(t=>W(v,t),{message:o.INSTANCE_TYPE}),H=e.object({sourceType:e.enum(["sqs","dynamodb","eventbridge"]),sourceRef:e.string().describe("Name of the source resource"),batchSize:e.number().int(o.BATCH_SIZE.INTEGER).min(1,o.BATCH_SIZE.MIN).max(1e4,o.BATCH_SIZE.MAX).optional(),startingPosition:e.enum(["TRIM_HORIZON","LATEST"]).optional(),maxBatchingWindow:e.number().int(o.BATCHING_WINDOW.INTEGER).min(0,o.BATCHING_WINDOW.MIN).max(300,o.BATCHING_WINDOW.MAX).optional(),reportBatchItemFailures:e.boolean().optional()}).strict(),q=e.object({name:e.string().min(1,o.REQUIRED.CONTAINER_NAME).optional(),image:e.string().optional(),port:A.optional(),environment:m.optional(),secretsImport:F.optional(),command:e.array(e.string()).optional(),entryPoint:e.array(e.string()).optional(),essential:e.boolean().optional(),healthCheck:e.object({command:e.array(e.string()),interval:e.number().int(o.HEALTH_CHECK.INTERVAL.INTEGER).min(5,o.HEALTH_CHECK.INTERVAL.MIN).max(300,o.HEALTH_CHECK.INTERVAL.MAX).optional(),timeout:e.number().int(o.HEALTH_CHECK.TIMEOUT.INTEGER).min(2,o.HEALTH_CHECK.TIMEOUT.MIN).max(60,o.HEALTH_CHECK.TIMEOUT.MAX).optional(),retries:e.number().int(o.HEALTH_CHECK.RETRIES.INTEGER).min(1,o.HEALTH_CHECK.RETRIES.MIN).max(10,o.HEALTH_CHECK.RETRIES.MAX).optional(),startPeriod:e.number().int(o.HEALTH_CHECK.START_PERIOD.INTEGER).min(0,o.HEALTH_CHECK.START_PERIOD.MIN).max(300,o.HEALTH_CHECK.START_PERIOD.MAX).optional()}).strict().optional(),ssmSecrets:e.array(e.string().regex(l.SECRET_NAME,o.SECRET_NAME)).optional(),extraProperties:e.array(g).optional()}).strict(),L=e.string().min(1,o.REQUIRED.SERVICE_NAME).max(255,o.MAX_LENGTH.SERVICE_NAME).regex(l.ECS_SERVICE_NAME,o.ECS_SERVICE_NAME),D=e.object({domain:e.string().optional(),loadBalancer:e.union([e.literal(!1),e.literal("public"),e.literal("internal")]).optional(),directAccess:e.boolean().optional()}).strict().refine(t=>!(t.directAccess&&t.domain),{message:o.DIRECT_ACCESS.NO_DOMAIN,path:["directAccess"]}).refine(t=>!(t.directAccess&&typeof t.loadBalancer=="string"),{message:o.DIRECT_ACCESS.NO_LOAD_BALANCER}).describe("Cluster-level configuration"),I=e.object({path:e.string().optional(),host:e.string().optional(),priority:e.number().int(o.PRIORITY.INTEGER).min(1,o.PRIORITY.MIN).max(5e4,o.PRIORITY.MAX).optional(),healthCheckPath:e.string().optional()}).strict().describe("Path/host-based routing configuration"),J=e.object({desiredCount:C.optional(),minCapacity:e.number().int(o.CAPACITY.MIN.INTEGER).min(0,o.CAPACITY.MIN.MIN_0).max(p,o.CAPACITY.MIN.MAX).optional(),maxCapacity:e.number().int(o.CAPACITY.MAX.INTEGER).min(1,o.CAPACITY.MAX.MIN_1).max(p,o.CAPACITY.MAX.MAX).optional(),scalingType:e.enum(["CPU","MEMORY"]).optional()}).strict().refine(r.check,r.params).describe("ECS service scaling configuration"),G=e.object({name:L,dockerfilePath:e.string().optional(),dockerTarget:e.string().optional(),needsDatabaseConnection:e.boolean().optional(),needsStorageConnection:e.boolean().optional(),needsMessagingConnection:e.boolean().optional(),image:e.string().optional(),containers:e.array(q).optional(),routing:e.union([I,e.array(I).min(1)]).optional(),cpu:S.optional(),memoryLimitMiB:E(512).optional(),desiredCount:C.optional(),scaling:K(J).optional(),capacityProvider:d,ec2Config:N.optional(),ssmSecretsPath:e.string().regex(l.SSM_PATH,o.SSM_PATH).optional(),extraProperties:e.array(g).optional(),alarms:Z.optional()}).strict().describe("Configuration for a service in an ECS cluster"),pe=e.object({name:c,type:$,needsConnection:e.boolean(),connectedDatabase:e.array(e.string()).optional(),connectedStorage:e.array(e.string()).optional(),connectedMessaging:e.array(e.string()).optional(),cluster:D.optional(),services:e.array(G).optional(),dockerfilePath:e.string().optional(),deployment:e.enum(["container","code"]).optional(),codePath:e.string().optional(),timeout:e.number().int(o.LAMBDA.TIMEOUT.INTEGER).min(M,o.LAMBDA.TIMEOUT.MIN).max(u,o.LAMBDA.TIMEOUT.MAX).optional(),memory:R.optional(),handler:e.string().optional(),runtime:e.string().optional(),environment:m.optional(),secrets:m.optional(),eventSources:e.array(H).optional(),functionUrl:e.object({authType:e.enum(["NONE","AWS_IAM"])}).strict().optional(),description:e.string().optional(),scheduleExpression:e.string().optional(),architecture:e.enum(k).optional(),ephemeralStorageSize:e.number().int(o.EPHEMERAL_STORAGE.INTEGER).min(512,o.EPHEMERAL_STORAGE.MIN).max(10240,o.EPHEMERAL_STORAGE.MAX).optional(),functionName:e.string().optional(),ssmSecrets:e.array(e.string()).optional(),ssmSecretsPath:e.string().optional(),alarms:z.optional(),instanceType:b.optional(),enableSSH:e.boolean().optional(),keyName:e.string().optional(),userData:e.string().optional(),securityGroups:e.array(e.string()).optional(),variableName:e.string().optional(),extraProperties:e.array(g).optional()}).strict().superRefine((t,i)=>{if(t.type==="ecs"&&t.services)for(let n=0;n<t.services.length;n++){const a=t.services[n];a?.ec2Config?.instanceType&&!a.ec2Config.amiHardwareType&&V(a.ec2Config.instanceType)!=="ARM"&&i.addIssue({code:"custom",message:`Service '${a.name??n}' uses instance type '${a.ec2Config.instanceType}' (x86), which requires Docker images built for linux/amd64. The default build targets linux/arm64 (Graviton). Use a Graviton instance type (t4g, c6g, r6g, m6g, etc.) or set amiHardwareType: "STANDARD" to acknowledge x86.`,path:["services",n,"ec2Config","instanceType"]})}t.type==="lambda"&&t.deployment==="container"&&t.architecture==="X86_64"&&i.addIssue({code:"custom",message:"Lambda architecture 'X86_64' requires Docker images built for linux/amd64, but the default build targets linux/arm64. Use 'ARM_64' for Graviton Lambdas (recommended) or ensure your build pipeline targets linux/amd64.",path:["architecture"]})}),me=e.object({appName:s,clusterName:c,containerPort:A,nameProvidedByFlag:e.boolean().optional(),ecrRepository:e.string().optional(),capacityProvider:d.optional(),useAppEcr:e.boolean().optional(),desiredCount:C.optional(),cpu:S.optional(),memoryLimitMiB:E(512).optional(),minCapacity:O.optional(),maxCapacity:x.optional(),ec2Config:N.optional(),connectionConfig:e.object({connectToDatabase:e.array(e.string()).optional()}).strict().optional()}).strict().refine(r.check,r.params),le=e.object({appName:s,functionName:c,nameProvidedByFlag:e.boolean().optional(),lambdaType:e.enum(["basic","web","custom"]).optional(),ecrRepository:e.string().optional(),timeout:e.number().int(o.LAMBDA.TIMEOUT.INTEGER).min(M,o.LAMBDA.TIMEOUT.MIN).max(u,o.LAMBDA.TIMEOUT.MAX).optional(),memory:R.optional(),enableFunctionUrl:e.boolean().optional(),description:e.string().optional(),enableCors:e.boolean().optional(),corsOrigins:e.string().optional(),corsHeaders:e.string().optional(),corsMethods:e.array(e.enum(U)).optional(),corsCredentials:e.boolean().optional(),connectionConfig:e.object({connectToDatabase:e.array(e.string()).optional()}).strict().optional()}).strict(),Ee=e.object({appName:s,instanceName:c,nameProvidedByFlag:e.boolean().optional(),instanceType:b.optional(),enableSSH:e.boolean().optional(),minCapacity:O.optional(),maxCapacity:x.optional(),connectionConfig:e.object({connectToDatabase:e.array(e.string()).optional()}).strict().optional()}).strict().refine(r.check,r.params),Ae=e.object({appName:s,clusterName:c,serviceName:L,capacityProvider:d,containerPort:A.optional(),cpu:S.optional(),memoryLimitMiB:E(512).optional(),desiredCount:C.optional(),ec2Config:N.optional(),routing:e.union([I,e.array(I).min(1)]).optional(),dockerfilePath:e.string().optional(),dockerTarget:e.string().optional(),nameProvidedByFlag:e.boolean().optional(),connectionConfig:e.object({connectToDatabase:e.array(e.string()).optional()}).strict().optional()}).strict(),y=e.object({appName:s,computeName:c,nameProvidedByFlag:e.boolean().optional(),connectionConfig:e.object({connectToDatabase:e.array(e.string()).optional()}).strict().optional()}).strict(),ee=y.extend({type:e.literal("ecs"),cluster:D.optional(),services:e.array(G).min(1,o.SERVICE.MIN_REQUIRED),dockerfilePath:e.string().optional()}).strict().refine(t=>{const i=t.services.filter(n=>n.containers?.some(a=>a.port));return i.length>1?i.every(n=>(Array.isArray(n.routing)?n.routing:n.routing?[n.routing]:[]).some(T=>T.path||T.host)):!0},{message:o.SERVICE.ROUTING_REQUIRED}).refine(t=>{const i=t.services.map(n=>n.name);return new Set(i).size===i.length},{message:o.SERVICE.UNIQUE_WITHIN_CLUSTER}),oe=y.extend({type:e.literal("lambda"),timeout:e.number().int(o.LAMBDA.TIMEOUT.INTEGER).min(M,o.LAMBDA.TIMEOUT.MIN).max(u,o.LAMBDA.TIMEOUT.MAX).optional(),memory:R.optional(),handler:e.string().optional(),runtime:e.string().optional(),environment:m.optional(),secrets:m.optional(),description:e.string().optional(),functionUrl:e.union([e.object({authType:e.enum(["AWS_IAM","NONE"]).optional()}).strict(),e.literal(!1)]).optional(),eventSources:e.array(H).optional()}).strict(),te=y.extend({type:e.literal("ec2"),instanceType:b.optional(),enableSSH:e.boolean().optional(),keyName:e.string().optional(),userData:e.string().optional(),securityGroups:e.array(e.string()).optional()}).strict(),Ce=e.discriminatedUnion("type",[ee,oe,te]),Y=e.object({path:e.string().min(1,o.REQUIRED.ROUTING_PATH),priority:e.number().int(o.PRIORITY.INTEGER).min(1,o.PRIORITY.MIN).max(5e4,o.PRIORITY.MAX).optional()}).strict(),Ie=e.object({name:e.string().min(1,o.REQUIRED.SERVICE_NAME).max(255,o.MAX_LENGTH.SERVICE_NAME).regex(l.RESOURCE_NAME,o.RESOURCE_NAME),dockerfilePath:e.string().optional(),containerPort:A.optional(),needsDatabaseConnection:e.boolean().optional(),routing:e.union([Y,e.array(Y).min(1)]).optional()}).strict(),Te=e.object({appName:s,instanceType:e.string().optional()}).strict();export{Ae as AddServiceGeneratorSchema,Ie as ApplicationServiceConfigSchema,Y as ApplicationServiceRoutingSchema,Ce as ComputeGeneratorSchema,pe as ComputeResourcePlanSchema,$ as ComputeTypeSchema,q as ContainerConfigSchema,Ee as EC2GeneratorSchema,me as ECSGeneratorSchema,N as Ec2ConfigSchema,d as EcsCapacityProviderSchema,D as EcsClusterConfigSchema,I as EcsRoutingConfigSchema,J as EcsScalingConfigSchema,G as EcsServiceConfigSchema,L as EcsServiceNameSchema,b as InstanceTypeSchema,H as LambdaEventSourceSchema,le as LambdaGeneratorSchema,R as LambdaMemorySchema,Te as TunnelGeneratorSchema,Q as WarmPoolSchema};
1
+ import{z as e}from"zod";import{VALIDATION_PATTERNS as m,VALIDATION_MESSAGES as o}from"../validation/patterns.js";import{COMPUTE_TYPES as h,ECS_CAPACITY_PROVIDERS as f,EC2_INSTANCE_TYPES as j,HTTP_METHODS as k,MIN_LAMBDA_MEMORY as W,MAX_LAMBDA_MEMORY as w,MIN_LAMBDA_TIMEOUT as S,MAX_LAMBDA_TIMEOUT as g,MIN_ECS_CAPACITY as x,MAX_ECS_CAPACITY as O,MAX_SCALING_CAPACITY as p,MAX_WARM_POOL_SIZE as V,constIncludes as K,COMPUTE_ARCHITECTURES as F,FUNCTION_URL_AUTH_TYPES as L,DEPLOYMENT_TYPES as Z,AMI_HARDWARE_TYPES as z,LOAD_BALANCER_TYPES as Q,SCALING_TYPES as $}from"./constants.js";import{validateArchitectureMatch as q,getArchitectureForInstanceType as J}from"./instanceTypeArchitecture.js";import{optionalOrDisabled as ee,CAPACITY_REFINEMENT as r,memoryLimitMiBSchema as I,ResourceNameSchema as c,AppNameSchema as s,PortSchema as T,ExtraPropertySchema as l,EnvironmentRecordSchema as E,SecretsImportRecordSchema as oe}from"./baseSchemas.js";import{DockerBuildSchema as A}from"@fjall/util/manifest/schemas";import{EcsServiceAlarmConfigSchema as ne,LambdaAlarmConfigSchema as te}from"./alarmSchemas.js";function ie(n){return!(n.image!==void 0&&n.docker!==void 0)}const H=e.number().int(o.CAPACITY.MIN.INTEGER).min(x,o.GENERATOR_CAPACITY.MIN.MIN).max(O,o.GENERATOR_CAPACITY.MIN.MAX),D=e.number().int(o.CAPACITY.MAX.INTEGER).min(x,o.GENERATOR_CAPACITY.MAX.MIN).max(O,o.GENERATOR_CAPACITY.MAX.MAX),N=e.number().int(o.LAMBDA.MEMORY.INTEGER).min(W,o.LAMBDA.MEMORY.MIN).max(w,o.LAMBDA.MEMORY.MAX).refine(n=>n===128||n%64===0,o.LAMBDA.MEMORY.MULTIPLE),G=e.string().regex(m.LAMBDA_RUNTIME_IDENTIFIER,o.LAMBDA.RUNTIME),d=e.number().int(o.CPU.INTEGER).min(256,o.CPU.MIN).max(4096,o.CPU.MAX),M=e.number().int(o.CAPACITY.DESIRED.INTEGER).min(0,o.CAPACITY.DESIRED.MIN).max(p,o.CAPACITY.DESIRED.MAX),C=e.object({connectToDatabase:e.array(e.string()).optional()}).strict(),ae=e.object({minSize:e.number().int(o.CAPACITY.WARM_POOL.MIN_SIZE.INTEGER).min(0,o.CAPACITY.WARM_POOL.MIN_SIZE.MIN).max(V,o.CAPACITY.WARM_POOL.MIN_SIZE.MAX).optional(),reuseOnScaleIn:e.boolean().optional()}).strict(),_=e.object({instanceType:e.string().optional(),amiHardwareType:e.enum(z).optional(),minCapacity:e.number().int(o.CAPACITY.MIN.INTEGER).min(0,o.CAPACITY.MIN.MIN_0).max(p,o.CAPACITY.MIN.MAX).optional(),maxCapacity:e.number().int(o.CAPACITY.MAX.INTEGER).min(1,o.CAPACITY.MAX.MIN_1).max(p,o.CAPACITY.MAX.MAX).optional(),memoryLimitMiB:I(128).optional(),warmPool:ae.optional(),extraProperties:e.array(l).optional()}).strict().superRefine((n,i)=>{if(!n.instanceType||!n.amiHardwareType)return;const t=q(n.instanceType,n.amiHardwareType);t.valid||i.addIssue({code:"custom",message:t.message??o.ARCHITECTURE_MISMATCH,path:["instanceType"]})}).superRefine((n,i)=>{n.minCapacity===0&&!n.warmPool&&i.addIssue({code:"custom",message:o.CAPACITY.WARM_POOL_REQUIRED,path:["minCapacity"]}),n.warmPool?.minSize!==void 0&&n.maxCapacity!==void 0&&n.warmPool.minSize>n.maxCapacity&&i.addIssue({code:"custom",message:o.CAPACITY.WARM_POOL.MIN_SIZE_EXCEEDS_MAX_CAPACITY,path:["warmPool","minSize"]})}),re=e.enum(h).describe(`Compute type must be one of: ${h.join(", ")}`),y=e.enum(f).describe(`ECS capacity provider must be one of: ${f.join(", ")}`),b=e.string().refine(n=>K(j,n),{message:o.INSTANCE_TYPE}),Y=e.object({sourceType:e.enum(["sqs","dynamodb","eventbridge"]),sourceRef:e.string().describe("Name of the source resource"),batchSize:e.number().int(o.BATCH_SIZE.INTEGER).min(1,o.BATCH_SIZE.MIN).max(1e4,o.BATCH_SIZE.MAX).optional(),startingPosition:e.enum(["TRIM_HORIZON","LATEST"]).optional(),maxBatchingWindow:e.number().int(o.BATCHING_WINDOW.INTEGER).min(0,o.BATCHING_WINDOW.MIN).max(300,o.BATCHING_WINDOW.MAX).optional(),reportBatchItemFailures:e.boolean().optional()}).strict(),ce=e.object({name:e.string().min(1,o.REQUIRED.CONTAINER_NAME).optional(),image:e.string().optional(),port:T.optional(),environment:E.optional(),secretsImport:oe.optional(),command:e.array(e.string()).optional(),entryPoint:e.array(e.string()).optional(),essential:e.boolean().optional(),healthCheck:e.object({command:e.array(e.string()),interval:e.number().int(o.HEALTH_CHECK.INTERVAL.INTEGER).min(5,o.HEALTH_CHECK.INTERVAL.MIN).max(300,o.HEALTH_CHECK.INTERVAL.MAX).optional(),timeout:e.number().int(o.HEALTH_CHECK.TIMEOUT.INTEGER).min(2,o.HEALTH_CHECK.TIMEOUT.MIN).max(60,o.HEALTH_CHECK.TIMEOUT.MAX).optional(),retries:e.number().int(o.HEALTH_CHECK.RETRIES.INTEGER).min(1,o.HEALTH_CHECK.RETRIES.MIN).max(10,o.HEALTH_CHECK.RETRIES.MAX).optional(),startPeriod:e.number().int(o.HEALTH_CHECK.START_PERIOD.INTEGER).min(0,o.HEALTH_CHECK.START_PERIOD.MIN).max(300,o.HEALTH_CHECK.START_PERIOD.MAX).optional()}).strict().optional(),ssmSecrets:e.array(e.string().regex(m.SECRET_NAME,o.SECRET_NAME)).optional(),extraProperties:e.array(l).optional()}).strict(),U=e.string().min(1,o.REQUIRED.SERVICE_NAME).max(255,o.MAX_LENGTH.SERVICE_NAME).regex(m.ECS_SERVICE_NAME,o.ECS_SERVICE_NAME),v=e.object({domain:e.string().optional(),loadBalancer:e.union([e.literal(!1),e.enum(Q)]).optional(),directAccess:e.boolean().optional(),extraProperties:e.array(l).optional()}).strict().refine(n=>!(n.directAccess&&n.domain),{message:o.DIRECT_ACCESS.NO_DOMAIN,path:["directAccess"]}).refine(n=>!(n.directAccess&&typeof n.loadBalancer=="string"),{message:o.DIRECT_ACCESS.NO_LOAD_BALANCER}).describe("Cluster-level configuration"),u=e.object({path:e.string().optional(),host:e.string().optional(),priority:e.number().int(o.PRIORITY.INTEGER).min(1,o.PRIORITY.MIN).max(5e4,o.PRIORITY.MAX).optional(),healthCheckPath:e.string().optional()}).strict().describe("Path/host-based routing configuration"),se=e.object({desiredCount:M.optional(),minCapacity:e.number().int(o.CAPACITY.MIN.INTEGER).min(0,o.CAPACITY.MIN.MIN_0).max(p,o.CAPACITY.MIN.MAX).optional(),maxCapacity:e.number().int(o.CAPACITY.MAX.INTEGER).min(1,o.CAPACITY.MAX.MIN_1).max(p,o.CAPACITY.MAX.MAX).optional(),scalingType:e.enum($).optional()}).strict().refine(r.check,r.params).describe("ECS service scaling configuration"),B=e.object({name:U,docker:A.optional(),needsDatabaseConnection:e.boolean().optional(),needsStorageConnection:e.boolean().optional(),needsMessagingConnection:e.boolean().optional(),image:e.string().optional(),containers:e.array(ce).optional(),routing:e.union([u,e.array(u).min(1)]).optional(),cpu:d.optional(),memoryLimitMiB:I(512).optional(),desiredCount:M.optional(),scaling:ee(se).optional(),capacityProvider:y,ec2Config:_.optional(),ssmSecretsPath:e.string().regex(m.SSM_PATH,o.SSM_PATH).optional(),extraProperties:e.array(l).optional(),alarms:ne.optional()}).strict().superRefine((n,i)=>{ie(n)||i.addIssue({code:"custom",path:["docker"],message:o.IMAGE_DOCKER_MUTEX})}).describe("Configuration for a service in an ECS cluster"),Re=e.object({name:c,type:re,needsConnection:e.boolean(),connectedDatabase:e.array(e.string()).optional(),connectedStorage:e.array(e.string()).optional(),connectedMessaging:e.array(e.string()).optional(),cluster:v.optional(),services:e.array(B).optional(),docker:A.partial().optional(),deployment:e.enum(Z).optional(),codePath:e.string().optional(),timeout:e.number().int(o.LAMBDA.TIMEOUT.INTEGER).min(S,o.LAMBDA.TIMEOUT.MIN).max(g,o.LAMBDA.TIMEOUT.MAX).optional(),memory:N.optional(),handler:e.string().optional(),runtime:G.optional(),environment:E.optional(),secrets:E.optional(),eventSources:e.array(Y).optional(),functionUrl:e.object({authType:e.enum(L)}).strict().optional(),description:e.string().optional(),scheduleExpression:e.string().optional(),architecture:e.enum(F).optional(),ephemeralStorageSize:e.number().int(o.EPHEMERAL_STORAGE.INTEGER).min(512,o.EPHEMERAL_STORAGE.MIN).max(10240,o.EPHEMERAL_STORAGE.MAX).optional(),functionName:e.string().optional(),ssmSecrets:e.array(e.string()).optional(),ssmSecretsPath:e.string().optional(),alarms:te.optional(),instanceType:b.optional(),enableSSH:e.boolean().optional(),keyName:e.string().optional(),userData:e.string().optional(),securityGroups:e.array(e.string()).optional(),variableName:e.string().optional(),extraProperties:e.array(l).optional()}).strict().superRefine((n,i)=>{if(n.type==="ecs"&&n.services)for(let t=0;t<n.services.length;t++){const a=n.services[t];a?.ec2Config?.instanceType&&!a.ec2Config.amiHardwareType&&J(a.ec2Config.instanceType)!=="ARM"&&i.addIssue({code:"custom",message:`Service '${a.name??t}' uses instance type '${a.ec2Config.instanceType}' (x86), which requires Docker images built for linux/amd64. The default build targets linux/arm64 (Graviton). Use a Graviton instance type (t4g, c6g, r6g, m6g, etc.) or set amiHardwareType: "STANDARD" to acknowledge x86.`,path:["services",t,"ec2Config","instanceType"]})}n.type==="lambda"&&n.deployment==="container"&&n.architecture==="X86_64"&&i.addIssue({code:"custom",message:"Lambda architecture 'X86_64' requires Docker images built for linux/amd64, but the default build targets linux/arm64. Use 'ARM_64' for Graviton Lambdas (recommended) or ensure your build pipeline targets linux/amd64.",path:["architecture"]})}),Se=e.object({appName:s,clusterName:c,containerPort:T,nameProvidedByFlag:e.boolean().optional(),ecrRepository:e.string().optional(),capacityProvider:y.optional(),useAppEcr:e.boolean().optional(),desiredCount:M.optional(),cpu:d.optional(),memoryLimitMiB:I(512).optional(),minCapacity:H.optional(),maxCapacity:D.optional(),ec2Config:_.optional(),connectionConfig:C.optional()}).strict().refine(r.check,r.params),ge=e.object({appName:s,functionName:c,nameProvidedByFlag:e.boolean().optional(),lambdaType:e.enum(["basic","web","custom"]).optional(),ecrRepository:e.string().optional(),timeout:e.number().int(o.LAMBDA.TIMEOUT.INTEGER).min(S,o.LAMBDA.TIMEOUT.MIN).max(g,o.LAMBDA.TIMEOUT.MAX).optional(),memory:N.optional(),enableFunctionUrl:e.boolean().optional(),description:e.string().optional(),enableCors:e.boolean().optional(),corsOrigins:e.string().optional(),corsHeaders:e.string().optional(),corsMethods:e.array(e.enum(k)).optional(),corsCredentials:e.boolean().optional(),connectionConfig:C.optional()}).strict(),Ne=e.object({appName:s,instanceName:c,nameProvidedByFlag:e.boolean().optional(),instanceType:b.optional(),enableSSH:e.boolean().optional(),minCapacity:H.optional(),maxCapacity:D.optional(),connectionConfig:C.optional()}).strict().refine(r.check,r.params),de=e.object({appName:s,clusterName:c,serviceName:U,capacityProvider:y,containerPort:T.optional(),cpu:d.optional(),memoryLimitMiB:I(512).optional(),desiredCount:M.optional(),ec2Config:_.optional(),routing:e.union([u,e.array(u).min(1)]).optional(),docker:A.partial().optional(),nameProvidedByFlag:e.boolean().optional(),connectionConfig:C.optional()}).strict(),P=e.object({appName:s,computeName:c,nameProvidedByFlag:e.boolean().optional(),connectionConfig:C.optional()}).strict(),me=P.extend({type:e.literal("ecs"),cluster:v.optional(),services:e.array(B).min(1,o.SERVICE.MIN_REQUIRED),docker:A.partial().optional()}).strict().refine(n=>{const i=n.services.filter(t=>t.containers?.some(a=>a.port));return i.length>1?i.every(t=>(Array.isArray(t.routing)?t.routing:t.routing?[t.routing]:[]).some(R=>R.path||R.host)):!0},{message:o.SERVICE.ROUTING_REQUIRED}).refine(n=>{const i=n.services.map(t=>t.name);return new Set(i).size===i.length},{message:o.SERVICE.UNIQUE_WITHIN_CLUSTER}),pe=P.extend({type:e.literal("lambda"),timeout:e.number().int(o.LAMBDA.TIMEOUT.INTEGER).min(S,o.LAMBDA.TIMEOUT.MIN).max(g,o.LAMBDA.TIMEOUT.MAX).optional(),memory:N.optional(),handler:e.string().optional(),runtime:G.optional(),environment:E.optional(),secrets:E.optional(),description:e.string().optional(),functionUrl:e.union([e.object({authType:e.enum(L).optional()}).strict(),e.literal(!1)]).optional(),eventSources:e.array(Y).optional()}).strict(),le=P.extend({type:e.literal("ec2"),instanceType:b.optional(),enableSSH:e.boolean().optional(),keyName:e.string().optional(),userData:e.string().optional(),securityGroups:e.array(e.string()).optional()}).strict(),_e=e.discriminatedUnion("type",[me,pe,le]),X=e.object({path:e.string().min(1,o.REQUIRED.ROUTING_PATH),priority:e.number().int(o.PRIORITY.INTEGER).min(1,o.PRIORITY.MIN).max(5e4,o.PRIORITY.MAX).optional()}).strict(),ye=e.object({name:e.string().min(1,o.REQUIRED.SERVICE_NAME).max(255,o.MAX_LENGTH.SERVICE_NAME).regex(m.RESOURCE_NAME,o.RESOURCE_NAME),docker:A.partial().optional(),containerPort:T.optional(),needsDatabaseConnection:e.boolean().optional(),routing:e.union([X,e.array(X).min(1)]).optional()}).strict(),be=e.object({appName:s,instanceType:e.string().optional()}).strict();export{de as AddServiceGeneratorSchema,ye as ApplicationServiceConfigSchema,X as ApplicationServiceRoutingSchema,_e as ComputeGeneratorSchema,Re as ComputeResourcePlanSchema,re as ComputeTypeSchema,ce as ContainerConfigSchema,Ne as EC2GeneratorSchema,Se as ECSGeneratorSchema,_ as Ec2ConfigSchema,y as EcsCapacityProviderSchema,v as EcsClusterConfigSchema,u as EcsRoutingConfigSchema,se as EcsScalingConfigSchema,B as EcsServiceConfigSchema,U as EcsServiceNameSchema,b as InstanceTypeSchema,Y as LambdaEventSourceSchema,ge as LambdaGeneratorSchema,N as LambdaMemorySchema,G as LambdaRuntimeSchema,be as TunnelGeneratorSchema,ae as WarmPoolSchema};