@fjall/generator 0.96.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 (81) 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/astComputeParser.js +1 -1
  5. package/dist/src/ast/astComputeParserHelpers.js +1 -1
  6. package/dist/src/ast/astDatabaseParser.d.ts +5 -2
  7. package/dist/src/ast/astDatabaseParser.js +1 -1
  8. package/dist/src/ast/astInfrastructureParser.d.ts +6 -0
  9. package/dist/src/ast/astInfrastructureParser.js +1 -1
  10. package/dist/src/ast/astPlanConverter.js +2 -2
  11. package/dist/src/ast/astScheduleParser.d.ts +18 -0
  12. package/dist/src/ast/astScheduleParser.js +1 -0
  13. package/dist/src/ast/astTestHelpers.d.ts +40 -6
  14. package/dist/src/codemod/edits/crossPlanConnection.d.ts +2 -6
  15. package/dist/src/codemod/edits/vpcPeer.d.ts +2 -6
  16. package/dist/src/codemod/edits/vpcPeerAccepter.d.ts +2 -5
  17. package/dist/src/codemod/edits/vpcPeerAccepter.js +1 -1
  18. package/dist/src/codemod/index.d.ts +1 -1
  19. package/dist/src/codemod/llmFallback/prompt.js +13 -13
  20. package/dist/src/codemod/llmFallback/tierRunner.js +1 -1
  21. package/dist/src/codemod/types.d.ts +5 -0
  22. package/dist/src/detection/index.d.ts +148 -0
  23. package/dist/src/detection/index.js +1 -0
  24. package/dist/src/generation/common.d.ts +22 -0
  25. package/dist/src/generation/common.js +5 -4
  26. package/dist/src/generation/compute/ec2.d.ts +2 -0
  27. package/dist/src/generation/compute/ec2.js +4 -0
  28. package/dist/src/generation/compute/ecs.d.ts +2 -0
  29. package/dist/src/generation/compute/ecs.js +42 -0
  30. package/dist/src/generation/compute/lambda.d.ts +3 -0
  31. package/dist/src/generation/compute/lambda.js +26 -0
  32. package/dist/src/generation/compute/shared.d.ts +22 -0
  33. package/dist/src/generation/compute/shared.js +4 -0
  34. package/dist/src/generation/compute.d.ts +4 -5
  35. package/dist/src/generation/compute.js +6 -86
  36. package/dist/src/generation/database.d.ts +11 -0
  37. package/dist/src/generation/database.js +23 -12
  38. package/dist/src/generation/index.d.ts +1 -1
  39. package/dist/src/generation/index.js +1 -1
  40. package/dist/src/generation/infrastructure.js +5 -5
  41. package/dist/src/generation/storage.js +30 -30
  42. package/dist/src/index.d.ts +1 -1
  43. package/dist/src/index.js +1 -1
  44. package/dist/src/planning/resourceAddition.d.ts +5 -1
  45. package/dist/src/planning/resourceAddition.js +1 -1
  46. package/dist/src/planning/resourcePlanning.js +1 -1
  47. package/dist/src/presets/clickhouseTierPreset.d.ts +35 -0
  48. package/dist/src/presets/clickhouseTierPreset.js +0 -0
  49. package/dist/src/presets/tierPresets.d.ts +5 -12
  50. package/dist/src/presets/tierPresets.js +1 -1
  51. package/dist/src/presets/tierTypes.d.ts +9 -19
  52. package/dist/src/schemas/applicationSchemas.d.ts +51 -8
  53. package/dist/src/schemas/applicationSchemas.js +1 -1
  54. package/dist/src/schemas/baseSchemas.d.ts +16 -0
  55. package/dist/src/schemas/baseSchemas.js +2 -2
  56. package/dist/src/schemas/computeSchemas.d.ts +108 -14
  57. package/dist/src/schemas/computeSchemas.js +1 -1
  58. package/dist/src/schemas/constants.d.ts +14 -0
  59. package/dist/src/schemas/constants.js +1 -1
  60. package/dist/src/schemas/databaseSchemas.d.ts +80 -0
  61. package/dist/src/schemas/databaseSchemas.js +1 -1
  62. package/dist/src/schemas/networkSchemas.d.ts +7 -6
  63. package/dist/src/schemas/networkSchemas.js +1 -1
  64. package/dist/src/schemas/patternSchemas.js +1 -1
  65. package/dist/src/schemas/sharedTypes.d.ts +1 -1
  66. package/dist/src/schemas/sharedTypes.js +1 -1
  67. package/dist/src/validation/patterns.d.ts +1 -1
  68. package/dist/src/validation/patterns.js +1 -1
  69. package/dist/src/validation/validationMessages.d.ts +5 -4
  70. package/dist/src/validation/validationMessages.js +1 -1
  71. package/dist/src/validation/validationPatterns.d.ts +14 -0
  72. package/dist/src/validation/validationPatterns.js +1 -1
  73. package/dist/src/version.d.ts +1 -1
  74. package/dist/src/version.js +1 -1
  75. package/package.json +19 -13
  76. package/dist/src/codemod/drift/__tests__/fixtures.d.ts +0 -55
  77. package/dist/src/codemod/drift/__tests__/fixtures.js +0 -2
  78. package/dist/src/codemod/llmFallback/__tests__/fixtures.d.ts +0 -5
  79. package/dist/src/codemod/llmFallback/__tests__/fixtures.js +0 -7
  80. package/dist/src/codemod/telemetry/__tests__/errorKinds.fixture.d.ts +0 -1
  81. package/dist/src/codemod/telemetry/__tests__/errorKinds.fixture.js +0 -1
@@ -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};
@@ -29,6 +29,20 @@ export declare const DEPLOYMENT_TYPE: Readonly<{
29
29
  export declare const COMPUTE_ARCHITECTURES: readonly ["ARM_64", "X86_64"];
30
30
  export type ComputeArchitecture = (typeof COMPUTE_ARCHITECTURES)[number];
31
31
  export declare const DEFAULT_COMPUTE_ARCHITECTURE: ComputeArchitecture;
32
+ export declare const FUNCTION_URL_AUTH_TYPES: readonly ["NONE", "AWS_IAM"];
33
+ export type FunctionUrlAuthType = (typeof FUNCTION_URL_AUTH_TYPES)[number];
34
+ export declare const LOAD_BALANCER_TYPES: readonly ["public", "internal"];
35
+ export type LoadBalancerType = (typeof LOAD_BALANCER_TYPES)[number];
36
+ export declare const SCALING_TYPES: readonly ["CPU", "MEMORY"];
37
+ export type ScalingType = (typeof SCALING_TYPES)[number];
38
+ export declare const AMI_HARDWARE_TYPES: readonly ["ARM", "STANDARD"];
39
+ export type AmiHardwareType = (typeof AMI_HARDWARE_TYPES)[number];
40
+ export declare const PATTERN_DATABASE_TYPES: readonly ["Instance", "Aurora"];
41
+ export type PatternDatabaseType = (typeof PATTERN_DATABASE_TYPES)[number];
42
+ export declare const DATABASE_ENGINES: readonly ["postgresql", "mysql"];
43
+ export type DatabaseEngine = (typeof DATABASE_ENGINES)[number];
44
+ export declare const GOVERNANCE_PRESETS: readonly ["foundation", "compliance", "hardened"];
45
+ export type GovernancePreset = (typeof GOVERNANCE_PRESETS)[number];
32
46
  export { ECS_CAPACITY_PROVIDERS, type EcsCapacityProvider, } from "./sharedTypes.js";
33
47
  import type { EcsCapacityProvider } from "./sharedTypes.js";
34
48
  export declare const DEFAULT_CAPACITY_PROVIDER: EcsCapacityProvider;
@@ -1 +1 @@
1
- const g=Object.freeze({RESOURCE_SUFFIXES:Object.freeze({storage:"Storage",database:"Database",cluster:"Cluster",function:"Function",instance:"Instance",compute:"Compute"})});import{DATABASE_TYPES as X}from"./sharedTypes.js";const t=["ecs","lambda","ec2"],x=Object.freeze({ECS:"ecs",LAMBDA:"lambda",EC2:"ec2"}),l=["code","container"],o=Object.freeze({CODE:"code",CONTAINER:"container"}),c=["ARM_64","X86_64"],E="ARM_64";import{ECS_CAPACITY_PROVIDERS as V}from"./sharedTypes.js";const T="FARGATE",a=["payload","nextjs"],_=new Set(a);import{APP_TYPES as G,CUSTOM_TIER as z}from"./sharedTypes.js";const A=["t3.nano","t3.micro","t3.small","t3.medium","t3.large","t3.xlarge","t3.2xlarge","t3a.nano","t3a.micro","t3a.small","t3a.medium","t3a.large","t3a.xlarge","t3a.2xlarge","t4g.nano","t4g.micro","t4g.small","t4g.medium","t4g.large","t4g.xlarge","t4g.2xlarge","c5.large","c5.xlarge","c5.2xlarge","c5.4xlarge","c5.9xlarge","c5.12xlarge","c5.18xlarge","c5.24xlarge","c5a.large","c5a.xlarge","c5a.2xlarge","c5a.4xlarge","c5a.8xlarge","c5a.12xlarge","c5a.16xlarge","c5a.24xlarge","c6g.medium","c6g.large","c6g.xlarge","c6g.2xlarge","c6g.4xlarge","c6g.8xlarge","c6g.12xlarge","c6g.16xlarge","r5.large","r5.xlarge","r5.2xlarge","r5.4xlarge","r5.8xlarge","r5.12xlarge","r5.16xlarge","r5.24xlarge","r5a.large","r5a.xlarge","r5a.2xlarge","r5a.4xlarge","r5a.8xlarge","r5a.12xlarge","r5a.16xlarge","r5a.24xlarge","r6g.medium","r6g.large","r6g.xlarge","r6g.2xlarge","r6g.4xlarge","r6g.8xlarge","r6g.12xlarge","r6g.16xlarge","i3.large","i3.xlarge","i3.2xlarge","i3.4xlarge","i3.8xlarge","i3.16xlarge","p3.2xlarge","p3.8xlarge","p3.16xlarge","g4dn.xlarge","g4dn.2xlarge","g4dn.4xlarge","g4dn.8xlarge","g4dn.12xlarge","g4dn.16xlarge","m5.large","m5.xlarge","m5.2xlarge","m5.4xlarge","m5.8xlarge","m5.12xlarge","m5.16xlarge","m5.24xlarge","m5a.large","m5a.xlarge","m5a.2xlarge","m5a.4xlarge","m5a.8xlarge","m5a.12xlarge","m5a.16xlarge","m5a.24xlarge"],n=[0,1,5,10,15,30,60];function s(e,r){return e.includes(r)}const P=1,p=65535,S=35255,O=128,m=10240,C=1,M=900,I=1,R=1e3,D=100,N=100,L=1,U=!0,i=3e3,Y="t4g.micro",d=30,u=["GET","POST","PUT","DELETE","HEAD","OPTIONS","PATCH"],F=["standard","assets","upload","website"],f=["AES256","KMS"];import{BACKUP_VAULT_TIERS as w}from"./sharedTypes.js";export{G as APP_TYPES,w as BACKUP_VAULT_TIERS,c as COMPUTE_ARCHITECTURES,x as COMPUTE_TYPE,t as COMPUTE_TYPES,z as CUSTOM_TIER,X as DATABASE_TYPES,g as DEFAULTS,T as DEFAULT_CAPACITY_PROVIDER,E as DEFAULT_COMPUTE_ARCHITECTURE,i as DEFAULT_CONTAINER_PORT,S as DEFAULT_DATABASE_PORT,Y as DEFAULT_EC2_INSTANCE_TYPE,d as DEFAULT_SECRET_ROTATION_DAYS,L as DEFAULT_WARM_POOL_MIN_SIZE,U as DEFAULT_WARM_POOL_REUSE_ON_SCALE_IN,o as DEPLOYMENT_TYPE,l as DEPLOYMENT_TYPES,A as EC2_INSTANCE_TYPES,V as ECS_CAPACITY_PROVIDERS,u as HTTP_METHODS,R as MAX_ECS_CAPACITY,m as MAX_LAMBDA_MEMORY,M as MAX_LAMBDA_TIMEOUT,p as MAX_PORT,D as MAX_SCALING_CAPACITY,N as MAX_WARM_POOL_SIZE,I as MIN_ECS_CAPACITY,O as MIN_LAMBDA_MEMORY,C as MIN_LAMBDA_TIMEOUT,P as MIN_PORT,_ as PATTERN_TYPES,a as PATTERN_TYPE_VALUES,f as S3_ENCRYPTION_TYPES,F as STORAGE_PRESET_TYPES,n as VALID_MONITORING_INTERVALS,s as constIncludes};
1
+ const t=Object.freeze({RESOURCE_SUFFIXES:Object.freeze({storage:"Storage",database:"Database",cluster:"Cluster",function:"Function",instance:"Instance",compute:"Compute"})});import{DATABASE_TYPES as q}from"./sharedTypes.js";const g=["ecs","lambda","ec2"],x=Object.freeze({ECS:"ecs",LAMBDA:"lambda",EC2:"ec2"}),o=["code","container"],l=Object.freeze({CODE:"code",CONTAINER:"container"}),E=["ARM_64","X86_64"],c="ARM_64",A=["NONE","AWS_IAM"],T=["public","internal"],_=["CPU","MEMORY"],n=["ARM","STANDARD"],s=["Instance","Aurora"],S=["postgresql","mysql"],p=["foundation","compliance","hardened"];import{ECS_CAPACITY_PROVIDERS as y}from"./sharedTypes.js";const P="FARGATE",a=["payload","nextjs"],O=new Set(a);import{APP_TYPES as Z,CUSTOM_TIER as h}from"./sharedTypes.js";const R=["t3.nano","t3.micro","t3.small","t3.medium","t3.large","t3.xlarge","t3.2xlarge","t3a.nano","t3a.micro","t3a.small","t3a.medium","t3a.large","t3a.xlarge","t3a.2xlarge","t4g.nano","t4g.micro","t4g.small","t4g.medium","t4g.large","t4g.xlarge","t4g.2xlarge","c5.large","c5.xlarge","c5.2xlarge","c5.4xlarge","c5.9xlarge","c5.12xlarge","c5.18xlarge","c5.24xlarge","c5a.large","c5a.xlarge","c5a.2xlarge","c5a.4xlarge","c5a.8xlarge","c5a.12xlarge","c5a.16xlarge","c5a.24xlarge","c6g.medium","c6g.large","c6g.xlarge","c6g.2xlarge","c6g.4xlarge","c6g.8xlarge","c6g.12xlarge","c6g.16xlarge","r5.large","r5.xlarge","r5.2xlarge","r5.4xlarge","r5.8xlarge","r5.12xlarge","r5.16xlarge","r5.24xlarge","r5a.large","r5a.xlarge","r5a.2xlarge","r5a.4xlarge","r5a.8xlarge","r5a.12xlarge","r5a.16xlarge","r5a.24xlarge","r6g.medium","r6g.large","r6g.xlarge","r6g.2xlarge","r6g.4xlarge","r6g.8xlarge","r6g.12xlarge","r6g.16xlarge","i3.large","i3.xlarge","i3.2xlarge","i3.4xlarge","i3.8xlarge","i3.16xlarge","p3.2xlarge","p3.8xlarge","p3.16xlarge","g4dn.xlarge","g4dn.2xlarge","g4dn.4xlarge","g4dn.8xlarge","g4dn.12xlarge","g4dn.16xlarge","m5.large","m5.xlarge","m5.2xlarge","m5.4xlarge","m5.8xlarge","m5.12xlarge","m5.16xlarge","m5.24xlarge","m5a.large","m5a.xlarge","m5a.2xlarge","m5a.4xlarge","m5a.8xlarge","m5a.12xlarge","m5a.16xlarge","m5a.24xlarge"],C=[0,1,5,10,15,30,60];function m(e,r){return e.includes(r)}const I=1,M=65535,N=35255,D=128,L=10240,U=1,Y=900,i=1,d=1e3,u=100,F=100,f=1,B=!0,b=3e3,G="t4g.micro",H=30,X=["GET","POST","PUT","DELETE","HEAD","OPTIONS","PATCH"],V=["standard","assets","upload","website"],j=["AES256","KMS"];import{BACKUP_VAULT_TIERS as v}from"./sharedTypes.js";export{n as AMI_HARDWARE_TYPES,Z as APP_TYPES,v as BACKUP_VAULT_TIERS,E as COMPUTE_ARCHITECTURES,x as COMPUTE_TYPE,g as COMPUTE_TYPES,h as CUSTOM_TIER,S as DATABASE_ENGINES,q as DATABASE_TYPES,t as DEFAULTS,P as DEFAULT_CAPACITY_PROVIDER,c as DEFAULT_COMPUTE_ARCHITECTURE,b as DEFAULT_CONTAINER_PORT,N as DEFAULT_DATABASE_PORT,G as DEFAULT_EC2_INSTANCE_TYPE,H as DEFAULT_SECRET_ROTATION_DAYS,f as DEFAULT_WARM_POOL_MIN_SIZE,B as DEFAULT_WARM_POOL_REUSE_ON_SCALE_IN,l as DEPLOYMENT_TYPE,o as DEPLOYMENT_TYPES,R as EC2_INSTANCE_TYPES,y as ECS_CAPACITY_PROVIDERS,A as FUNCTION_URL_AUTH_TYPES,p as GOVERNANCE_PRESETS,X as HTTP_METHODS,T as LOAD_BALANCER_TYPES,d as MAX_ECS_CAPACITY,L as MAX_LAMBDA_MEMORY,Y as MAX_LAMBDA_TIMEOUT,M as MAX_PORT,u as MAX_SCALING_CAPACITY,F as MAX_WARM_POOL_SIZE,i as MIN_ECS_CAPACITY,D as MIN_LAMBDA_MEMORY,U as MIN_LAMBDA_TIMEOUT,I as MIN_PORT,s as PATTERN_DATABASE_TYPES,O as PATTERN_TYPES,a as PATTERN_TYPE_VALUES,j as S3_ENCRYPTION_TYPES,_ as SCALING_TYPES,V as STORAGE_PRESET_TYPES,C as VALID_MONITORING_INTERVALS,m as constIncludes};
@@ -1,4 +1,5 @@
1
1
  import { z } from "zod";
2
+ export type { DatabaseType } from "./constants.js";
2
3
  /** Reusable backup retention validation. Range: 1-35 days. */
3
4
  export declare const BackupRetentionSchema: z.ZodNumber;
4
5
  /** Reusable monitoring interval validation. Must be one of: 0, 1, 5, 10, 15, 30, 60. */
@@ -9,6 +10,7 @@ export declare const DatabaseTypeSchema: z.ZodEnum<{
9
10
  Aurora: "Aurora";
10
11
  Instance: "Instance";
11
12
  GlobalAurora: "GlobalAurora";
13
+ ClickHouse: "ClickHouse";
12
14
  }>;
13
15
  export declare const ProxyConfigSchema: z.ZodObject<{
14
16
  maxConnections: z.ZodOptional<z.ZodNumber>;
@@ -116,6 +118,7 @@ export declare const DatabaseResourcePlanSchema: z.ZodObject<{
116
118
  Aurora: "Aurora";
117
119
  Instance: "Instance";
118
120
  GlobalAurora: "GlobalAurora";
121
+ ClickHouse: "ClickHouse";
119
122
  }>;
120
123
  databaseName: z.ZodString;
121
124
  instanceType: z.ZodOptional<z.ZodString>;
@@ -204,6 +207,7 @@ export declare const DatabaseResourcePlanSchema: z.ZodObject<{
204
207
  * - Instance: instanceType, multiAz, readReplica
205
208
  * - Aurora: writer, readers, backupRetention
206
209
  * - GlobalAurora: primaryRegion (required!), secondaryRegions, enableGlobalWriteForwarding
210
+ * - ClickHouse: instanceType, coldTier, optimiseSchedule, backupSchedule, backupRetentionDays
207
211
  */
208
212
  export declare const DatabaseGeneratorSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
209
213
  appName: z.ZodString;
@@ -386,6 +390,23 @@ export declare const DatabaseGeneratorSchema: z.ZodDiscriminatedUnion<[z.ZodObje
386
390
  monitoringInterval: z.ZodOptional<z.ZodNumber>;
387
391
  snapshotIdentifier: z.ZodOptional<z.ZodString>;
388
392
  snapshotUsername: z.ZodOptional<z.ZodString>;
393
+ }, z.core.$strict>, z.ZodObject<{
394
+ appName: z.ZodString;
395
+ nameProvidedByFlag: z.ZodOptional<z.ZodBoolean>;
396
+ databaseName: z.ZodString;
397
+ resourceName: z.ZodOptional<z.ZodString>;
398
+ connectionConfig: z.ZodOptional<z.ZodObject<{
399
+ connectToCompute: z.ZodOptional<z.ZodArray<z.ZodString>>;
400
+ connectToServices: z.ZodOptional<z.ZodArray<z.ZodString>>;
401
+ }, z.core.$strict>>;
402
+ databaseType: z.ZodLiteral<"ClickHouse">;
403
+ instanceType: z.ZodOptional<z.ZodString>;
404
+ coldTier: z.ZodOptional<z.ZodUnion<readonly [z.ZodObject<{
405
+ mode: z.ZodLiteral<"s3">;
406
+ }, z.core.$strict>, z.ZodLiteral<false>]>>;
407
+ optimiseSchedule: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodLiteral<false>]>>;
408
+ backupSchedule: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodLiteral<false>]>>;
409
+ backupRetentionDays: z.ZodOptional<z.ZodNumber>;
389
410
  }, z.core.$strict>], "databaseType">;
390
411
  export declare const DatabaseGeneratorSchemaFromUI: z.ZodDiscriminatedUnion<[z.ZodObject<{
391
412
  appName: z.ZodString;
@@ -568,6 +589,23 @@ export declare const DatabaseGeneratorSchemaFromUI: z.ZodDiscriminatedUnion<[z.Z
568
589
  monitoringInterval: z.ZodOptional<z.ZodNumber>;
569
590
  snapshotIdentifier: z.ZodOptional<z.ZodString>;
570
591
  snapshotUsername: z.ZodOptional<z.ZodString>;
592
+ }, z.core.$strict>, z.ZodObject<{
593
+ appName: z.ZodString;
594
+ nameProvidedByFlag: z.ZodOptional<z.ZodBoolean>;
595
+ databaseName: z.ZodString;
596
+ connectionConfig: z.ZodOptional<z.ZodObject<{
597
+ connectToCompute: z.ZodOptional<z.ZodArray<z.ZodString>>;
598
+ connectToServices: z.ZodOptional<z.ZodArray<z.ZodString>>;
599
+ }, z.core.$strict>>;
600
+ resourceName: z.ZodString;
601
+ databaseType: z.ZodLiteral<"ClickHouse">;
602
+ instanceType: z.ZodOptional<z.ZodString>;
603
+ coldTier: z.ZodOptional<z.ZodUnion<readonly [z.ZodObject<{
604
+ mode: z.ZodLiteral<"s3">;
605
+ }, z.core.$strict>, z.ZodLiteral<false>]>>;
606
+ optimiseSchedule: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodLiteral<false>]>>;
607
+ backupSchedule: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodLiteral<false>]>>;
608
+ backupRetentionDays: z.ZodOptional<z.ZodNumber>;
571
609
  }, z.core.$strict>], "databaseType">;
572
610
  /**
573
611
  * Schema for adding RDS Proxy to an existing database.
@@ -630,6 +668,39 @@ export declare const DynamoDBResourcePlanSchema: z.ZodObject<{
630
668
  sourceText: z.ZodString;
631
669
  }, z.core.$strict>>>;
632
670
  }, z.core.$strict>;
671
+ /**
672
+ * ClickHouse analytics database resource plan schema.
673
+ *
674
+ * Parallel to `DatabaseResourcePlanSchema` rather than extending it — RDS
675
+ * fields (multiAz, proxy, readReplica, readers, writer) do not apply to
676
+ * ClickHouse per the 2026-05-05 ClickHouse Database Factory promotion design
677
+ * (D24). The top-level `type` discriminator is `"ClickHouse"` per D2.
678
+ *
679
+ * The R2 cold tier from the original construct was dropped per D12; only the
680
+ * S3 cold tier (`{ mode: "s3" }`) is valid. Use `coldTier: false` to disable
681
+ * cold-tier storage entirely.
682
+ *
683
+ * Sidecar schedule props (`optimiseSchedule`, `backupSchedule`) are accepted
684
+ * as raw cron strings here and validated at the EventBridge `Schedule`
685
+ * boundary post-cutover per D19 + D20.
686
+ */
687
+ export declare const ClickHouseResourcePlanSchema: z.ZodObject<{
688
+ name: z.ZodString;
689
+ type: z.ZodLiteral<"ClickHouse">;
690
+ databaseName: z.ZodString;
691
+ instanceType: z.ZodOptional<z.ZodString>;
692
+ coldTier: z.ZodOptional<z.ZodUnion<readonly [z.ZodObject<{
693
+ mode: z.ZodLiteral<"s3">;
694
+ }, z.core.$strict>, z.ZodLiteral<false>]>>;
695
+ optimiseSchedule: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodLiteral<false>]>>;
696
+ backupSchedule: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodLiteral<false>]>>;
697
+ backupRetentionDays: z.ZodOptional<z.ZodNumber>;
698
+ variableName: z.ZodOptional<z.ZodString>;
699
+ extraProperties: z.ZodOptional<z.ZodArray<z.ZodObject<{
700
+ key: z.ZodString;
701
+ sourceText: z.ZodString;
702
+ }, z.core.$strict>>>;
703
+ }, z.core.$strict>;
633
704
  export type ProxyConfig = z.infer<typeof ProxyConfigSchema>;
634
705
  export type ReadReplicaConfig = z.infer<typeof ReadReplicaConfigSchema>;
635
706
  export type CredentialsConfig = z.infer<typeof CredentialsConfigSchema>;
@@ -639,5 +710,14 @@ export type AuroraWriterConfig = z.infer<typeof AuroraWriterConfigSchema>;
639
710
  export type AuroraReadersConfig = z.infer<typeof AuroraReadersConfigSchema>;
640
711
  export type DatabaseResourcePlan = z.infer<typeof DatabaseResourcePlanSchema>;
641
712
  export type DynamoDBResourcePlan = z.infer<typeof DynamoDBResourcePlanSchema>;
713
+ export type ClickHouseResourcePlan = z.infer<typeof ClickHouseResourcePlanSchema>;
642
714
  export type DatabaseGeneratorOptions = z.infer<typeof DatabaseGeneratorSchema>;
643
715
  export type AddProxyGeneratorOptions = z.infer<typeof AddProxyGeneratorSchema>;
716
+ export type BackupRetention = z.infer<typeof BackupRetentionSchema>;
717
+ export type MonitoringInterval = z.infer<typeof MonitoringIntervalSchema>;
718
+ export type DatabasePort = z.infer<typeof DatabasePortSchema>;
719
+ export type SecretRotationConfig = z.infer<typeof SecretRotationConfigSchema>;
720
+ export type AuroraReaderConfig = z.infer<typeof AuroraReaderConfigSchema>;
721
+ export type AwsManagedKey = z.infer<typeof AwsManagedKeySchema>;
722
+ export type CustomerManagedKeyMarker = z.infer<typeof CustomerManagedKeyMarkerSchema>;
723
+ export type EncryptionKeySpec = z.infer<typeof EncryptionKeySpecSchema>;
@@ -1 +1 @@
1
- import{z as o}from"zod";import{VALIDATION_PATTERNS as _,VALIDATION_MESSAGES as t}from"../validation/patterns.js";import{DATABASE_TYPES as I,VALID_MONITORING_INTERVALS as x,constIncludes as D}from"./constants.js";import{optionalOrDisabled as a,ResourceNameSchema as n,AppNameSchema as E,ExtraPropertySchema as N}from"./baseSchemas.js";import{RdsAlarmConfigSchema as M}from"./alarmSchemas.js";const i=o.number().int(t.BACKUP_RETENTION.INTEGER).min(1,t.BACKUP_RETENTION.MIN).max(35,t.BACKUP_RETENTION.MAX),c=o.number().int(t.MONITORING_INTERVAL.INTEGER).refine(e=>D(x,e),{message:t.MONITORING_INTERVAL.VALUES}),b=o.number().int(t.DATABASE.PORT.INTEGER).min(1024,t.DATABASE.PORT.MIN).max(65535,t.DATABASE.PORT.MAX),y=o.enum(I).describe(`Database type must be one of: ${I.join(", ")}`),h=o.object({maxConnections:o.number().int(t.MAX_CONNECTIONS.INTEGER).min(1,t.MAX_CONNECTIONS.MIN).max(100,t.MAX_CONNECTIONS.MAX).optional(),maxIdleConnections:o.number().int(t.PROXY_CONFIG.MAX_IDLE_CONNECTIONS.INTEGER).min(0,t.PROXY_CONFIG.MAX_IDLE_CONNECTIONS.MIN).max(100,t.PROXY_CONFIG.MAX_IDLE_CONNECTIONS.MAX).optional(),connectionBorrowTimeout:o.number().int(t.PROXY_CONFIG.BORROW_TIMEOUT.INTEGER).min(1,t.PROXY_CONFIG.BORROW_TIMEOUT.MIN).max(3600,t.PROXY_CONFIG.BORROW_TIMEOUT.MAX).optional(),requireTLS:o.boolean().optional()}).strict().describe("RDS Proxy configuration"),f=o.object({instanceType:o.string().optional(),availabilityZone:o.string().optional()}).strict().describe("Read replica configuration"),G=o.object({automaticallyAfterDays:o.number().int(t.ROTATION.INTEGER).min(1,t.ROTATION.MIN).max(365,t.ROTATION.MAX).optional()}).strict().describe("Secret rotation configuration"),A=o.object({username:o.string().min(1,t.REQUIRED.USERNAME).max(63,t.USERNAME.MAX_LENGTH).optional(),secretRotation:G.optional()}).strict().describe("Database credentials configuration"),R=a(h),T=a(f),X=o.object({scaleWithWriter:o.boolean().optional(),enableDatabaseInsights:o.boolean().optional(),identifierSuffix:o.string().min(1,t.IDENTIFIER_SUFFIX.REQUIRED).max(50,t.IDENTIFIER_SUFFIX.MAX_LENGTH).optional(),availabilityZone:o.string().optional()}).strict().describe("Configuration for a single Aurora reader instance"),l=o.object({enableDatabaseInsights:o.boolean().optional(),identifierSuffix:o.string().min(1,t.IDENTIFIER_SUFFIX.REQUIRED).max(50,t.IDENTIFIER_SUFFIX.MAX_LENGTH).optional(),availabilityZone:o.string().optional()}).strict().describe("Configuration for Aurora writer instance"),U=o.object({count:o.number().int(t.READER.COUNT.INTEGER).min(0,t.READER.COUNT.MIN).max(15,t.READER.COUNT.MAX).optional(),instances:o.array(X).max(15,t.READER_INSTANCES.MAX).optional(),defaultEnableDatabaseInsights:o.boolean().optional()}).strict().refine(e=>!(e.count!==void 0&&e.instances!==void 0),{message:t.READER_INSTANCES.COUNT_OR_INSTANCES,path:["count"]}).describe("Aurora readers configuration"),p=a(U),F=o.object({awsManaged:o.literal(!0)}).strict(),P=o.object({useCMK:o.literal(!0)}).strict(),d=o.union([F,P]),B=o.object({mode:o.enum(["standard","advanced"]).optional(),encryptionKey:d.optional()}).strict().describe("Database Insights configuration"),g=a(B),O=o.object({storageKey:d.optional()}).strict().describe("Encryption configuration (DESTRUCTIVE to change storageKey)"),z=o.object({name:n,type:y,databaseName:o.string().min(1,t.REQUIRED.DATABASE_NAME),instanceType:o.string().optional(),allocatedStorage:o.number().optional(),multiAz:o.boolean().optional(),publiclyAccessible:o.boolean().optional(),databaseInsights:g.optional(),port:b.optional(),deletionProtection:o.boolean().optional(),proxy:R.optional(),credentials:A.optional(),readReplica:T.optional(),encryption:O.optional(),writer:l.optional(),readers:p.optional(),backupRetention:i.optional(),preferredMaintenanceWindow:o.string().optional(),monitoringInterval:c.optional(),primaryRegion:o.string().optional(),secondaryRegions:o.array(o.string()).optional(),globalClusterIdentifier:o.string().optional(),enableGlobalWriteForwarding:o.boolean().optional(),snapshotIdentifier:o.string().optional(),snapshotUsername:o.string().optional(),databaseEngine:o.enum(["postgresql","mysql"]).optional(),engineExpression:o.string().optional(),variableName:o.string().optional(),extraProperties:o.array(N).optional(),alarms:M.optional()}).strict(),r=o.object({appName:E,nameProvidedByFlag:o.boolean().optional(),databaseName:o.string().min(1,t.REQUIRED.DATABASE_NAME).max(63,t.MAX_LENGTH.DATABASE_NAME).regex(_.DATABASE_NAME,t.DATABASE_NAME),resourceName:n.optional(),connectionConfig:o.object({connectToCompute:o.array(o.string()).optional(),connectToServices:o.array(o.string()).optional()}).strict().optional(),databaseInsights:g.optional(),port:b.optional(),proxy:R.optional(),credentials:A.optional(),encryption:O.optional(),deletionProtection:o.boolean().optional()}).strict(),S={databaseType:o.literal("Instance"),instanceType:o.string().optional(),multiAz:o.boolean().optional(),readReplica:T.optional(),publiclyAccessible:o.boolean().optional(),backupRetention:i.optional(),allocatedStorage:o.number().optional(),snapshotIdentifier:o.string().optional(),snapshotUsername:o.string().optional()},u={databaseType:o.literal("Aurora"),writer:l.optional(),readers:p.optional(),backupRetention:i.optional(),preferredMaintenanceWindow:o.string().optional(),monitoringInterval:c.optional(),snapshotIdentifier:o.string().optional(),snapshotUsername:o.string().optional()},C={databaseType:o.literal("GlobalAurora"),primaryRegion:o.string().min(1,t.GLOBAL_AURORA.PRIMARY_REGION_REQUIRED),secondaryRegions:o.array(o.string()).optional(),globalClusterIdentifier:o.string().optional(),enableGlobalWriteForwarding:o.boolean().optional(),writer:l.optional(),readers:p.optional(),backupRetention:i.optional(),preferredMaintenanceWindow:o.string().optional(),monitoringInterval:c.optional(),snapshotIdentifier:o.string().optional(),snapshotUsername:o.string().optional()},L=r.extend(S).strict(),j=r.extend(u).strict(),Y=r.extend(C).strict(),Z=o.discriminatedUnion("databaseType",[L,j,Y]),m=r.extend({resourceName:n}).strict(),K=m.extend(S).strict(),W=m.extend(u).strict(),v=m.extend(C).strict(),$=o.discriminatedUnion("databaseType",[K,W,v]),J=o.object({appName:E,databaseName:o.string().min(1,t.REQUIRED.DATABASE_NAME),maxConnections:o.number().int(t.MAX_CONNECTIONS.INTEGER).min(1,t.MAX_CONNECTIONS.MIN).max(100,t.MAX_CONNECTIONS.MAX).optional(),maxIdleConnections:o.number().int(t.PROXY_CONFIG.MAX_IDLE_CONNECTIONS.INTEGER).min(0,t.PROXY_CONFIG.MAX_IDLE_CONNECTIONS.MIN).max(100,t.PROXY_CONFIG.MAX_IDLE_CONNECTIONS.MAX).optional(),connectionBorrowTimeout:o.number().int(t.PROXY_CONFIG.BORROW_TIMEOUT.INTEGER).min(1,t.PROXY_CONFIG.BORROW_TIMEOUT.MIN).max(3600,t.PROXY_CONFIG.BORROW_TIMEOUT.MAX).optional(),requireTLS:o.boolean().optional(),nameProvidedByFlag:o.boolean().optional()}).strict(),w=["S","N","B"],s=o.object({name:o.string(),type:o.enum(w)}).strict(),oo=o.object({name:n,partitionKey:s,sortKey:s.optional(),globalSecondaryIndexes:o.array(o.object({indexName:o.string(),partitionKey:s,sortKey:s.optional()}).strict()).optional(),ttlAttribute:o.string().optional(),stream:o.boolean().optional(),variableName:o.string().optional(),extraProperties:o.array(N).optional()}).strict();export{J as AddProxyGeneratorSchema,X as AuroraReaderConfigSchema,p as AuroraReadersConfigOrFalseSchema,U as AuroraReadersConfigSchema,l as AuroraWriterConfigSchema,F as AwsManagedKeySchema,i as BackupRetentionSchema,A as CredentialsConfigSchema,P as CustomerManagedKeyMarkerSchema,Z as DatabaseGeneratorSchema,$ as DatabaseGeneratorSchemaFromUI,g as DatabaseInsightsConfigOrFalseSchema,B as DatabaseInsightsConfigSchema,b as DatabasePortSchema,z as DatabaseResourcePlanSchema,y as DatabaseTypeSchema,oo as DynamoDBResourcePlanSchema,O as EncryptionConfigSchema,d as EncryptionKeySpecSchema,c as MonitoringIntervalSchema,R as ProxyConfigOrFalseSchema,h as ProxyConfigSchema,T as ReadReplicaConfigOrFalseSchema,f as ReadReplicaConfigSchema,G as SecretRotationConfigSchema};
1
+ import{z as e}from"zod";import{VALIDATION_PATTERNS as I,VALIDATION_MESSAGES as o}from"../validation/patterns.js";import{DATABASE_TYPES as A,VALID_MONITORING_INTERVALS as M,DATABASE_ENGINES as y,constIncludes as h}from"./constants.js";import{optionalOrDisabled as i,ResourceNameSchema as t,AppNameSchema as c,DatabaseNameSchema as f,ExtraPropertySchema as l}from"./baseSchemas.js";import{RdsAlarmConfigSchema as G}from"./alarmSchemas.js";const a=e.number().int(o.BACKUP_RETENTION.INTEGER).min(1,o.BACKUP_RETENTION.MIN).max(35,o.BACKUP_RETENTION.MAX),p=e.number().int(o.MONITORING_INTERVAL.INTEGER).refine(n=>h(M,n),{message:o.MONITORING_INTERVAL.VALUES}),b=e.number().int(o.DATABASE.PORT.INTEGER).min(1024,o.DATABASE.PORT.MIN).max(65535,o.DATABASE.PORT.MAX),F=e.enum(A).describe(`Database type must be one of: ${A.join(", ")}`),U=e.object({maxConnections:e.number().int(o.MAX_CONNECTIONS.INTEGER).min(1,o.MAX_CONNECTIONS.MIN).max(100,o.MAX_CONNECTIONS.MAX).optional(),maxIdleConnections:e.number().int(o.PROXY_CONFIG.MAX_IDLE_CONNECTIONS.INTEGER).min(0,o.PROXY_CONFIG.MAX_IDLE_CONNECTIONS.MIN).max(100,o.PROXY_CONFIG.MAX_IDLE_CONNECTIONS.MAX).optional(),connectionBorrowTimeout:e.number().int(o.PROXY_CONFIG.BORROW_TIMEOUT.INTEGER).min(1,o.PROXY_CONFIG.BORROW_TIMEOUT.MIN).max(3600,o.PROXY_CONFIG.BORROW_TIMEOUT.MAX).optional(),requireTLS:e.boolean().optional()}).strict().describe("RDS Proxy configuration"),X=e.object({instanceType:e.string().optional(),availabilityZone:e.string().optional()}).strict().describe("Read replica configuration"),B=e.object({automaticallyAfterDays:e.number().int(o.ROTATION.INTEGER).min(1,o.ROTATION.MIN).max(365,o.ROTATION.MAX).optional()}).strict().describe("Secret rotation configuration"),T=e.object({username:e.string().min(1,o.REQUIRED.USERNAME).max(63,o.USERNAME.MAX_LENGTH).optional(),secretRotation:B.optional()}).strict().describe("Database credentials configuration"),R=i(U),d=i(X),P=e.object({scaleWithWriter:e.boolean().optional(),enableDatabaseInsights:e.boolean().optional(),identifierSuffix:e.string().min(1,o.IDENTIFIER_SUFFIX.REQUIRED).max(50,o.IDENTIFIER_SUFFIX.MAX_LENGTH).optional(),availabilityZone:e.string().optional()}).strict().describe("Configuration for a single Aurora reader instance"),m=e.object({enableDatabaseInsights:e.boolean().optional(),identifierSuffix:e.string().min(1,o.IDENTIFIER_SUFFIX.REQUIRED).max(50,o.IDENTIFIER_SUFFIX.MAX_LENGTH).optional(),availabilityZone:e.string().optional()}).strict().describe("Configuration for Aurora writer instance"),j=e.object({count:e.number().int(o.READER.COUNT.INTEGER).min(0,o.READER.COUNT.MIN).max(15,o.READER.COUNT.MAX).optional(),instances:e.array(P).max(15,o.READER_INSTANCES.MAX).optional(),defaultEnableDatabaseInsights:e.boolean().optional()}).strict().refine(n=>!(n.count!==void 0&&n.instances!==void 0),{message:o.READER_INSTANCES.COUNT_OR_INSTANCES,path:["count"]}).describe("Aurora readers configuration"),E=i(j),L=e.object({awsManaged:e.literal(!0)}).strict(),k=e.object({useCMK:e.literal(!0)}).strict(),S=e.union([L,k]),v=e.object({mode:e.enum(["standard","advanced"]).optional(),encryptionKey:S.optional()}).strict().describe("Database Insights configuration"),g=i(v),u=e.object({storageKey:S.optional()}).strict().describe("Encryption configuration (DESTRUCTIVE to change storageKey)"),ne=e.object({name:t,type:F,databaseName:e.string().min(1,o.REQUIRED.DATABASE_NAME),instanceType:e.string().optional(),allocatedStorage:e.number().optional(),multiAz:e.boolean().optional(),publiclyAccessible:e.boolean().optional(),databaseInsights:g.optional(),port:b.optional(),deletionProtection:e.boolean().optional(),proxy:R.optional(),credentials:T.optional(),readReplica:d.optional(),encryption:u.optional(),writer:m.optional(),readers:E.optional(),backupRetention:a.optional(),preferredMaintenanceWindow:e.string().optional(),monitoringInterval:p.optional(),primaryRegion:e.string().optional(),secondaryRegions:e.array(e.string()).optional(),globalClusterIdentifier:e.string().optional(),enableGlobalWriteForwarding:e.boolean().optional(),snapshotIdentifier:e.string().optional(),snapshotUsername:e.string().optional(),databaseEngine:e.enum(y).optional(),engineExpression:e.string().optional(),variableName:e.string().optional(),extraProperties:e.array(l).optional(),alarms:G.optional()}).strict(),r=e.object({appName:c,nameProvidedByFlag:e.boolean().optional(),databaseName:e.string().min(1,o.REQUIRED.DATABASE_NAME).max(63,o.MAX_LENGTH.DATABASE_NAME).regex(I.DATABASE_NAME,o.DATABASE_NAME),resourceName:t.optional(),connectionConfig:e.object({connectToCompute:e.array(e.string()).optional(),connectToServices:e.array(e.string()).optional()}).strict().optional(),databaseInsights:g.optional(),port:b.optional(),proxy:R.optional(),credentials:T.optional(),encryption:u.optional(),deletionProtection:e.boolean().optional()}).strict(),O={databaseType:e.literal("Instance"),instanceType:e.string().optional(),multiAz:e.boolean().optional(),readReplica:d.optional(),publiclyAccessible:e.boolean().optional(),backupRetention:a.optional(),allocatedStorage:e.number().optional(),snapshotIdentifier:e.string().optional(),snapshotUsername:e.string().optional()},C={databaseType:e.literal("Aurora"),writer:m.optional(),readers:E.optional(),backupRetention:a.optional(),preferredMaintenanceWindow:e.string().optional(),monitoringInterval:p.optional(),snapshotIdentifier:e.string().optional(),snapshotUsername:e.string().optional()},D={databaseType:e.literal("GlobalAurora"),primaryRegion:e.string().min(1,o.GLOBAL_AURORA.PRIMARY_REGION_REQUIRED),secondaryRegions:e.array(e.string()).optional(),globalClusterIdentifier:e.string().optional(),enableGlobalWriteForwarding:e.boolean().optional(),writer:m.optional(),readers:E.optional(),backupRetention:a.optional(),preferredMaintenanceWindow:e.string().optional(),monitoringInterval:p.optional(),snapshotIdentifier:e.string().optional(),snapshotUsername:e.string().optional()},_=e.object({appName:c,nameProvidedByFlag:e.boolean().optional(),databaseName:e.string().min(1,o.REQUIRED.DATABASE_NAME).max(63,o.MAX_LENGTH.DATABASE_NAME).regex(I.DATABASE_NAME,o.DATABASE_NAME),resourceName:t.optional(),connectionConfig:e.object({connectToCompute:e.array(e.string()).optional(),connectToServices:e.array(e.string()).optional()}).strict().optional()}).strict(),x={databaseType:e.literal("ClickHouse"),instanceType:e.string().optional(),coldTier:e.union([e.object({mode:e.literal("s3")}).strict(),e.literal(!1)]).optional(),optimiseSchedule:e.union([e.string(),e.literal(!1)]).optional(),backupSchedule:e.union([e.string(),e.literal(!1)]).optional(),backupRetentionDays:a.optional()},Y=r.extend(O).strict(),K=r.extend(C).strict(),W=r.extend(D).strict(),w=_.extend(x).strict(),ie=e.discriminatedUnion("databaseType",[Y,K,W,w]),N=r.extend({resourceName:t}).strict(),H=N.extend(O).strict(),Q=N.extend(C).strict(),V=N.extend(D).strict(),z=_.extend({resourceName:t}).strict(),Z=z.extend(x).strict(),re=e.discriminatedUnion("databaseType",[H,Q,V,Z]),se=e.object({appName:c,databaseName:e.string().min(1,o.REQUIRED.DATABASE_NAME),maxConnections:e.number().int(o.MAX_CONNECTIONS.INTEGER).min(1,o.MAX_CONNECTIONS.MIN).max(100,o.MAX_CONNECTIONS.MAX).optional(),maxIdleConnections:e.number().int(o.PROXY_CONFIG.MAX_IDLE_CONNECTIONS.INTEGER).min(0,o.PROXY_CONFIG.MAX_IDLE_CONNECTIONS.MIN).max(100,o.PROXY_CONFIG.MAX_IDLE_CONNECTIONS.MAX).optional(),connectionBorrowTimeout:e.number().int(o.PROXY_CONFIG.BORROW_TIMEOUT.INTEGER).min(1,o.PROXY_CONFIG.BORROW_TIMEOUT.MIN).max(3600,o.PROXY_CONFIG.BORROW_TIMEOUT.MAX).optional(),requireTLS:e.boolean().optional(),nameProvidedByFlag:e.boolean().optional()}).strict(),q=["S","N","B"],s=e.object({name:e.string(),type:e.enum(q)}).strict(),ce=e.object({name:t,partitionKey:s,sortKey:s.optional(),globalSecondaryIndexes:e.array(e.object({indexName:e.string(),partitionKey:s,sortKey:s.optional()}).strict()).optional(),ttlAttribute:e.string().optional(),stream:e.boolean().optional(),variableName:e.string().optional(),extraProperties:e.array(l).optional()}).strict(),$=e.object({mode:e.literal("s3")}).strict(),le=e.object({name:t,type:e.literal("ClickHouse"),databaseName:f,instanceType:e.string().optional(),coldTier:e.union([$,e.literal(!1)]).optional(),optimiseSchedule:e.union([e.string(),e.literal(!1)]).optional(),backupSchedule:e.union([e.string(),e.literal(!1)]).optional(),backupRetentionDays:a.optional(),variableName:e.string().optional(),extraProperties:e.array(l).optional()}).strict();export{se as AddProxyGeneratorSchema,P as AuroraReaderConfigSchema,E as AuroraReadersConfigOrFalseSchema,j as AuroraReadersConfigSchema,m as AuroraWriterConfigSchema,L as AwsManagedKeySchema,a as BackupRetentionSchema,le as ClickHouseResourcePlanSchema,T as CredentialsConfigSchema,k as CustomerManagedKeyMarkerSchema,ie as DatabaseGeneratorSchema,re as DatabaseGeneratorSchemaFromUI,g as DatabaseInsightsConfigOrFalseSchema,v as DatabaseInsightsConfigSchema,b as DatabasePortSchema,ne as DatabaseResourcePlanSchema,F as DatabaseTypeSchema,ce as DynamoDBResourcePlanSchema,u as EncryptionConfigSchema,S as EncryptionKeySpecSchema,p as MonitoringIntervalSchema,R as ProxyConfigOrFalseSchema,U as ProxyConfigSchema,d as ReadReplicaConfigOrFalseSchema,X as ReadReplicaConfigSchema,B as SecretRotationConfigSchema};
@@ -7,8 +7,8 @@ export declare const NatConfigOrFalseSchema: z.ZodUnion<[z.ZodLiteral<false>, z.
7
7
  }, z.core.$strict>]>;
8
8
  export declare const FlowLogConfigSchema: z.ZodObject<{
9
9
  destination: z.ZodOptional<z.ZodEnum<{
10
- cloudwatch: "cloudwatch";
11
10
  s3: "s3";
11
+ cloudwatch: "cloudwatch";
12
12
  }>>;
13
13
  retentionDays: z.ZodOptional<z.ZodNumber>;
14
14
  trafficType: z.ZodOptional<z.ZodEnum<{
@@ -19,8 +19,8 @@ export declare const FlowLogConfigSchema: z.ZodObject<{
19
19
  }, z.core.$strict>;
20
20
  export declare const FlowLogConfigOrFalseSchema: z.ZodUnion<[z.ZodLiteral<false>, z.ZodObject<{
21
21
  destination: z.ZodOptional<z.ZodEnum<{
22
- cloudwatch: "cloudwatch";
23
22
  s3: "s3";
23
+ cloudwatch: "cloudwatch";
24
24
  }>>;
25
25
  retentionDays: z.ZodOptional<z.ZodNumber>;
26
26
  trafficType: z.ZodOptional<z.ZodEnum<{
@@ -88,8 +88,8 @@ export declare const NetworkResourcePlanSchema: z.ZodObject<{
88
88
  }, z.core.$strict>]>>;
89
89
  flowLogs: z.ZodOptional<z.ZodUnion<[z.ZodLiteral<false>, z.ZodObject<{
90
90
  destination: z.ZodOptional<z.ZodEnum<{
91
- cloudwatch: "cloudwatch";
92
91
  s3: "s3";
92
+ cloudwatch: "cloudwatch";
93
93
  }>>;
94
94
  retentionDays: z.ZodOptional<z.ZodNumber>;
95
95
  trafficType: z.ZodOptional<z.ZodEnum<{
@@ -133,8 +133,8 @@ export declare const AdditionalNetworkResourcePlanSchema: z.ZodObject<{
133
133
  }, z.core.$strict>]>>;
134
134
  flowLogs: z.ZodOptional<z.ZodUnion<[z.ZodLiteral<false>, z.ZodObject<{
135
135
  destination: z.ZodOptional<z.ZodEnum<{
136
- cloudwatch: "cloudwatch";
137
136
  s3: "s3";
137
+ cloudwatch: "cloudwatch";
138
138
  }>>;
139
139
  retentionDays: z.ZodOptional<z.ZodNumber>;
140
140
  trafficType: z.ZodOptional<z.ZodEnum<{
@@ -172,8 +172,8 @@ export declare const NetworkConfigSchema: z.ZodUnion<[z.ZodLiteral<false>, z.Zod
172
172
  }, z.core.$strict>]>>;
173
173
  flowLogs: z.ZodOptional<z.ZodUnion<[z.ZodLiteral<false>, z.ZodObject<{
174
174
  destination: z.ZodOptional<z.ZodEnum<{
175
- cloudwatch: "cloudwatch";
176
175
  s3: "s3";
176
+ cloudwatch: "cloudwatch";
177
177
  }>>;
178
178
  retentionDays: z.ZodOptional<z.ZodNumber>;
179
179
  trafficType: z.ZodOptional<z.ZodEnum<{
@@ -214,8 +214,8 @@ export declare const NetworkGeneratorSchema: z.ZodObject<{
214
214
  }, z.core.$strict>]>>;
215
215
  flowLogs: z.ZodOptional<z.ZodUnion<[z.ZodLiteral<false>, z.ZodObject<{
216
216
  destination: z.ZodOptional<z.ZodEnum<{
217
- cloudwatch: "cloudwatch";
218
217
  s3: "s3";
218
+ cloudwatch: "cloudwatch";
219
219
  }>>;
220
220
  retentionDays: z.ZodOptional<z.ZodNumber>;
221
221
  trafficType: z.ZodOptional<z.ZodEnum<{
@@ -350,6 +350,7 @@ export type GatewayEndpointsConfig = z.infer<typeof GatewayEndpointsConfigSchema
350
350
  export type InterfaceEndpointsConfig = z.infer<typeof InterfaceEndpointsConfigSchema>;
351
351
  export type VpcEndpointsConfig = z.infer<typeof VpcEndpointsConfigSchema>;
352
352
  export type NetworkName = z.infer<typeof NetworkNameSchema>;
353
+ export type CidrString = z.infer<typeof CidrStringSchema>;
353
354
  export type NetworkResourcePlan = z.infer<typeof NetworkResourcePlanSchema>;
354
355
  export type AdditionalNetworkResourcePlan = z.infer<typeof AdditionalNetworkResourcePlanSchema>;
355
356
  export type NetworkGeneratorOptions = z.infer<typeof NetworkGeneratorSchema>;
@@ -1 +1 @@
1
- import{z as o}from"zod";import{VALIDATION_PATTERNS as t,VALIDATION_MESSAGES as e}from"../validation/patterns.js";import{optionalOrDisabled as n,AppNameSchema as m,ResourceNameSchema as a}from"./baseSchemas.js";const l=o.object({count:o.number().int(e.NAT_GATEWAY.INTEGER).min(0,e.NAT_GATEWAY.MIN).max(3,e.NAT_GATEWAY.MAX).optional()}).strict().describe("NAT gateway configuration"),i=n(l),R=o.object({destination:o.enum(["cloudwatch","s3"]).optional(),retentionDays:o.number().int(e.RETENTION_DAYS.INTEGER).min(1,e.RETENTION_DAYS.MIN).max(365,e.RETENTION_DAYS.MAX).optional(),trafficType:o.enum(["ALL","ACCEPT","REJECT"]).optional()}).strict().describe("VPC flow log configuration"),c=n(R),A=o.object({s3:o.boolean().optional(),dynamodb:o.boolean().optional()}).strict().describe("Gateway VPC endpoints (FREE)"),N=n(A),S=o.object({ecr:o.boolean().optional(),secretsManager:o.boolean().optional(),kms:o.boolean().optional(),cloudwatchLogs:o.boolean().optional(),ssm:o.boolean().optional(),sts:o.boolean().optional()}).strict().describe("Interface VPC endpoints (cost per hour)"),I=n(S),C=o.object({gateway:N.optional(),interface:I.optional()}).strict().describe("VPC endpoints configuration"),s=n(C),E=o.object({maxAzs:o.number().int(e.MAX_AZS.INTEGER).min(1,e.MAX_AZS.MIN).max(3,e.MAX_AZS.MAX).optional(),natGateways:i.optional(),flowLogs:c.optional(),vpcEndpoints:s.optional(),cidrMask:o.number().int(e.CIDR_MASK.INTEGER).min(16,e.CIDR_MASK.MIN).max(28,e.CIDR_MASK.MAX).optional()}).strict(),p=o.string().min(1,e.REQUIRED.NETWORK_NAME).max(50,e.MAX_LENGTH.NETWORK_NAME).regex(t.RESOURCE_NAME,e.RESOURCE_NAME),u=E.extend({name:p}).strict(),D=n(E),O=o.object({appName:m,networkName:p.optional(),maxAzs:o.number().int(e.MAX_AZS.INTEGER).min(1,e.MAX_AZS.MIN).max(3,e.MAX_AZS.MAX).optional(),natGateways:i.optional(),flowLogs:c.optional(),vpcEndpoints:s.optional()}).strict(),_=t.CIDR,r=o.string().regex(_,e.CIDR),d=o.object({kind:o.literal("database"),resource:o.string().min(1,e.REQUIRED.RESOURCE_REFERENCE),name:a,allowedFromCidrs:o.array(r),access:o.enum(["read","write","readWrite"]).optional()}).strict(),g=o.object({kind:o.literal("ecsService"),resource:o.string().min(1,e.REQUIRED.RESOURCE_REFERENCE),serviceName:o.string().min(1,e.REQUIRED.SERVICE_NAME),name:a,allowedFromCidrs:o.array(r),port:o.number().int(e.PORT.INTEGER).min(1,e.PORT.MIN).max(65535,e.PORT.MAX).optional()}).strict(),T=o.discriminatedUnion("kind",[d,g]),h=o.object({name:a,peerAppName:o.string().min(1,e.REQUIRED.APP_NAME),peerAccountId:o.string().regex(t.AWS_ACCOUNT_ID,e.AWS_ACCOUNT_ID),peerRegion:o.string().min(1,e.VPC_PEER.REGION_REQUIRED).optional(),peerVpcId:o.string().regex(t.VPC_ID,e.VPC_ID).optional(),peerVpcCidr:r.optional(),peerRoleArn:o.string().regex(t.ROLE_ARN,e.ROLE_ARN).optional(),peerRouteTableIds:o.array(o.string().min(1,e.VPC_PEER.ROUTE_TABLE_ID_REQUIRED)).optional(),localVpcName:o.string().min(1,e.REQUIRED.NETWORK_NAME).optional(),enableDnsResolution:o.boolean().optional()}).strict(),f=o.object({name:a,requesterAccountIds:o.array(o.string().regex(t.AWS_ACCOUNT_ID,e.AWS_ACCOUNT_ID)).min(1,e.VPC_PEER.MIN_REQUESTER_ACCOUNTS),localVpcName:o.string().min(1,e.REQUIRED.NETWORK_NAME).optional(),publishToSsm:o.boolean().optional(),exposedResources:o.array(T).optional()}).strict();export{u as AdditionalNetworkResourcePlanSchema,_ as CIDR_REGEX,r as CidrStringSchema,d as DatabaseExposedResourceSchema,g as EcsServiceExposedResourceSchema,T as ExposedResourceSchema,c as FlowLogConfigOrFalseSchema,R as FlowLogConfigSchema,N as GatewayEndpointsConfigOrFalseSchema,A as GatewayEndpointsConfigSchema,I as InterfaceEndpointsConfigOrFalseSchema,S as InterfaceEndpointsConfigSchema,i as NatConfigOrFalseSchema,l as NatConfigSchema,D as NetworkConfigSchema,O as NetworkGeneratorSchema,p as NetworkNameSchema,E as NetworkResourcePlanSchema,s as VpcEndpointsConfigOrFalseSchema,C as VpcEndpointsConfigSchema,f as VpcPeerAccepterResourcePlanSchema,h as VpcPeerResourcePlanSchema};
1
+ import{z as o}from"zod";import{VALIDATION_PATTERNS as t,VALIDATION_MESSAGES as e}from"../validation/patterns.js";import{optionalOrDisabled as n,AppNameSchema as l,ResourceNameSchema as a,PortSchema as m}from"./baseSchemas.js";const R=o.object({count:o.number().int(e.NAT_GATEWAY.INTEGER).min(0,e.NAT_GATEWAY.MIN).max(3,e.NAT_GATEWAY.MAX).optional()}).strict().describe("NAT gateway configuration"),i=n(R),A=o.object({destination:o.enum(["cloudwatch","s3"]).optional(),retentionDays:o.number().int(e.RETENTION_DAYS.INTEGER).min(1,e.RETENTION_DAYS.MIN).max(365,e.RETENTION_DAYS.MAX).optional(),trafficType:o.enum(["ALL","ACCEPT","REJECT"]).optional()}).strict().describe("VPC flow log configuration"),c=n(A),N=o.object({s3:o.boolean().optional(),dynamodb:o.boolean().optional()}).strict().describe("Gateway VPC endpoints (FREE)"),S=n(N),C=o.object({ecr:o.boolean().optional(),secretsManager:o.boolean().optional(),kms:o.boolean().optional(),cloudwatchLogs:o.boolean().optional(),ssm:o.boolean().optional(),sts:o.boolean().optional()}).strict().describe("Interface VPC endpoints (cost per hour)"),_=n(C),I=o.object({gateway:S.optional(),interface:_.optional()}).strict().describe("VPC endpoints configuration"),s=n(I),p=o.object({maxAzs:o.number().int(e.MAX_AZS.INTEGER).min(1,e.MAX_AZS.MIN).max(3,e.MAX_AZS.MAX).optional(),natGateways:i.optional(),flowLogs:c.optional(),vpcEndpoints:s.optional(),cidrMask:o.number().int(e.CIDR_MASK.INTEGER).min(16,e.CIDR_MASK.MIN).max(28,e.CIDR_MASK.MAX).optional()}).strict(),E=o.string().min(1,e.REQUIRED.NETWORK_NAME).max(50,e.MAX_LENGTH.NETWORK_NAME).regex(t.RESOURCE_NAME,e.RESOURCE_NAME),D=p.extend({name:E}).strict(),h=n(p),O=o.object({appName:l,networkName:E.optional(),maxAzs:o.number().int(e.MAX_AZS.INTEGER).min(1,e.MAX_AZS.MIN).max(3,e.MAX_AZS.MAX).optional(),natGateways:i.optional(),flowLogs:c.optional(),vpcEndpoints:s.optional()}).strict(),d=t.CIDR,r=o.string().regex(d,e.CIDR),g=o.object({kind:o.literal("database"),resource:o.string().min(1,e.REQUIRED.RESOURCE_REFERENCE),name:a,allowedFromCidrs:o.array(r),access:o.enum(["read","write","readWrite"]).optional()}).strict(),x=o.object({kind:o.literal("ecsService"),resource:o.string().min(1,e.REQUIRED.RESOURCE_REFERENCE),serviceName:o.string().min(1,e.REQUIRED.SERVICE_NAME),name:a,allowedFromCidrs:o.array(r),port:m.optional()}).strict(),T=o.discriminatedUnion("kind",[g,x]),f=o.object({name:a,peerAppName:o.string().min(1,e.REQUIRED.APP_NAME),peerAccountId:o.string().regex(t.AWS_ACCOUNT_ID,e.AWS_ACCOUNT_ID),peerRegion:o.string().min(1,e.VPC_PEER.REGION_REQUIRED).optional(),peerVpcId:o.string().regex(t.VPC_ID,e.VPC_ID).optional(),peerVpcCidr:r.optional(),peerRoleArn:o.string().regex(t.ROLE_ARN,e.ROLE_ARN).optional(),peerRouteTableIds:o.array(o.string().min(1,e.VPC_PEER.ROUTE_TABLE_ID_REQUIRED)).optional(),localVpcName:o.string().min(1,e.REQUIRED.NETWORK_NAME).optional(),enableDnsResolution:o.boolean().optional()}).strict(),w=o.object({name:a,requesterAccountIds:o.array(o.string().regex(t.AWS_ACCOUNT_ID,e.AWS_ACCOUNT_ID)).min(1,e.VPC_PEER.MIN_REQUESTER_ACCOUNTS),localVpcName:o.string().min(1,e.REQUIRED.NETWORK_NAME).optional(),publishToSsm:o.boolean().optional(),exposedResources:o.array(T).optional()}).strict();export{D as AdditionalNetworkResourcePlanSchema,d as CIDR_REGEX,r as CidrStringSchema,g as DatabaseExposedResourceSchema,x as EcsServiceExposedResourceSchema,T as ExposedResourceSchema,c as FlowLogConfigOrFalseSchema,A as FlowLogConfigSchema,S as GatewayEndpointsConfigOrFalseSchema,N as GatewayEndpointsConfigSchema,_ as InterfaceEndpointsConfigOrFalseSchema,C as InterfaceEndpointsConfigSchema,i as NatConfigOrFalseSchema,R as NatConfigSchema,h as NetworkConfigSchema,O as NetworkGeneratorSchema,E as NetworkNameSchema,p as NetworkResourcePlanSchema,s as VpcEndpointsConfigOrFalseSchema,I as VpcEndpointsConfigSchema,w as VpcPeerAccepterResourcePlanSchema,f as VpcPeerResourcePlanSchema};