@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.
- package/dist/.minified +1 -1
- package/dist/src/ast/astClickHouseParser.d.ts +25 -0
- package/dist/src/ast/astClickHouseParser.js +1 -0
- package/dist/src/ast/astCodeInjection.d.ts +9 -0
- package/dist/src/ast/astCodeInjection.js +8 -0
- package/dist/src/ast/astComputeParser.js +1 -1
- package/dist/src/ast/astComputeParserHelpers.js +1 -1
- package/dist/src/ast/astDatabaseParser.d.ts +5 -2
- package/dist/src/ast/astDatabaseParser.js +1 -1
- package/dist/src/ast/astInfrastructureParser.d.ts +7 -1
- package/dist/src/ast/astInfrastructureParser.js +1 -1
- package/dist/src/ast/astPlanConverter.js +2 -2
- package/dist/src/ast/astScheduleParser.d.ts +18 -0
- package/dist/src/ast/astScheduleParser.js +1 -0
- package/dist/src/ast/astStatementClassifier.d.ts +2 -2
- package/dist/src/ast/astStatementClassifier.js +1 -1
- package/dist/src/ast/astStatementQueries.d.ts +4 -4
- package/dist/src/ast/astStatementQueries.js +3 -3
- package/dist/src/ast/astSurgicalModification.d.ts +14 -12
- package/dist/src/ast/astSurgicalModification.js +6 -13
- package/dist/src/ast/astTestHelpers.d.ts +41 -7
- package/dist/src/ast/index.d.ts +3 -2
- package/dist/src/ast/index.js +1 -1
- package/dist/src/codemod/_internal.d.ts +6 -1
- package/dist/src/codemod/_internal.js +1 -1
- package/dist/src/codemod/drift/detect.d.ts +11 -0
- package/dist/src/codemod/drift/detect.js +1 -0
- package/dist/src/codemod/drift/index.d.ts +4 -0
- package/dist/src/codemod/drift/index.js +1 -0
- package/dist/src/codemod/drift/merge.d.ts +19 -0
- package/dist/src/codemod/drift/merge.js +1 -0
- package/dist/src/codemod/drift/snapshot.d.ts +4 -0
- package/dist/src/codemod/drift/snapshot.js +1 -0
- package/dist/src/codemod/drift/types.d.ts +60 -0
- package/dist/src/codemod/drift/types.js +1 -0
- package/dist/src/codemod/edits/addResource/propertyBuilder.d.ts +1 -1
- package/dist/src/codemod/edits/addResource/propertyBuilder.js +1 -1
- package/dist/src/codemod/edits/addResource.d.ts +8 -3
- package/dist/src/codemod/edits/addResource.js +1 -1
- package/dist/src/codemod/edits/controlFlowPolicy.d.ts +19 -0
- package/dist/src/codemod/edits/controlFlowPolicy.js +1 -0
- package/dist/src/codemod/edits/crossPlanConnection.d.ts +20 -0
- package/dist/src/codemod/edits/crossPlanConnection.js +1 -0
- package/dist/src/codemod/edits/driftPolicy.d.ts +7 -0
- package/dist/src/codemod/edits/driftPolicy.js +1 -0
- package/dist/src/codemod/edits/findInsertionPosition.js +1 -1
- package/dist/src/codemod/edits/index.d.ts +3 -0
- package/dist/src/codemod/edits/index.js +1 -1
- package/dist/src/codemod/edits/modifyResource.d.ts +9 -3
- package/dist/src/codemod/edits/modifyResource.js +1 -1
- package/dist/src/codemod/edits/removeResource.d.ts +2 -2
- package/dist/src/codemod/edits/removeResource.js +1 -1
- package/dist/src/codemod/edits/vpcPeer.d.ts +24 -0
- package/dist/src/codemod/edits/vpcPeer.js +1 -0
- package/dist/src/codemod/edits/vpcPeerAccepter.d.ts +20 -0
- package/dist/src/codemod/edits/vpcPeerAccepter.js +1 -0
- package/dist/src/codemod/index.d.ts +16 -4
- package/dist/src/codemod/index.js +1 -1
- package/dist/src/codemod/llmFallback/apply.d.ts +10 -0
- package/dist/src/codemod/llmFallback/apply.js +1 -0
- package/dist/src/codemod/llmFallback/claudeTier.d.ts +6 -0
- package/dist/src/codemod/llmFallback/claudeTier.js +1 -0
- package/dist/src/codemod/llmFallback/egressGate.d.ts +5 -0
- package/dist/src/codemod/llmFallback/egressGate.js +1 -0
- package/dist/src/codemod/llmFallback/egressGate.types.d.ts +9 -0
- package/dist/src/codemod/llmFallback/egressGate.types.js +0 -0
- package/dist/src/codemod/llmFallback/index.d.ts +6 -0
- package/dist/src/codemod/llmFallback/index.js +1 -0
- package/dist/src/codemod/llmFallback/morphTier.d.ts +2 -0
- package/dist/src/codemod/llmFallback/morphTier.js +3 -0
- package/dist/src/codemod/llmFallback/prompt.d.ts +12 -0
- package/dist/src/codemod/llmFallback/prompt.js +36 -0
- package/dist/src/codemod/llmFallback/runFallback.d.ts +13 -0
- package/dist/src/codemod/llmFallback/runFallback.js +1 -0
- package/dist/src/codemod/llmFallback/shouldTryFallback.d.ts +13 -0
- package/dist/src/codemod/llmFallback/shouldTryFallback.js +1 -0
- package/dist/src/codemod/llmFallback/signals.d.ts +4 -0
- package/dist/src/codemod/llmFallback/signals.js +1 -0
- package/dist/src/codemod/llmFallback/telemetryEvents.d.ts +141 -0
- package/dist/src/codemod/llmFallback/telemetryEvents.js +1 -0
- package/dist/src/codemod/llmFallback/tierRunner.d.ts +7 -0
- package/dist/src/codemod/llmFallback/tierRunner.js +1 -0
- package/dist/src/codemod/llmFallback/types.d.ts +104 -0
- package/dist/src/codemod/llmFallback/types.js +1 -0
- package/dist/src/codemod/registry.d.ts +4 -1
- package/dist/src/codemod/registry.js +1 -1
- package/dist/src/codemod/semanticIndex/classifyControlFlow.d.ts +2 -0
- package/dist/src/codemod/semanticIndex/classifyControlFlow.js +1 -0
- package/dist/src/codemod/semanticIndex/findReferences.js +2 -2
- package/dist/src/codemod/telemetry/errorKinds.d.ts +2 -0
- package/dist/src/codemod/telemetry/errorKinds.js +1 -0
- package/dist/src/codemod/types.d.ts +110 -1
- package/dist/src/codemod/types.js +1 -1
- package/dist/src/codemod/validationGate/gates/classify.d.ts +2 -0
- package/dist/src/codemod/validationGate/gates/classify.js +1 -0
- package/dist/src/codemod/validationGate/gates/drift.d.ts +2 -0
- package/dist/src/codemod/validationGate/gates/drift.js +1 -0
- package/dist/src/codemod/validationGate/gates/locate.d.ts +7 -0
- package/dist/src/codemod/validationGate/gates/locate.js +1 -0
- package/dist/src/codemod/validationGate/gates/parse.d.ts +2 -0
- package/dist/src/codemod/validationGate/gates/parse.js +1 -0
- package/dist/src/codemod/validationGate/gates/schema.d.ts +2 -0
- package/dist/src/codemod/validationGate/gates/schema.js +1 -0
- package/dist/src/codemod/validationGate/index.d.ts +6 -0
- package/dist/src/codemod/validationGate/index.js +1 -0
- package/dist/src/codemod/validationGate/types.d.ts +35 -0
- package/dist/src/codemod/validationGate/types.js +1 -0
- package/dist/src/detection/index.d.ts +148 -0
- package/dist/src/detection/index.js +1 -0
- package/dist/src/generation/common.d.ts +22 -0
- package/dist/src/generation/common.js +5 -4
- package/dist/src/generation/compute/ec2.d.ts +2 -0
- package/dist/src/generation/compute/ec2.js +4 -0
- package/dist/src/generation/compute/ecs.d.ts +2 -0
- package/dist/src/generation/compute/ecs.js +42 -0
- package/dist/src/generation/compute/lambda.d.ts +3 -0
- package/dist/src/generation/compute/lambda.js +26 -0
- package/dist/src/generation/compute/shared.d.ts +22 -0
- package/dist/src/generation/compute/shared.js +4 -0
- package/dist/src/generation/compute.d.ts +4 -5
- package/dist/src/generation/compute.js +6 -86
- package/dist/src/generation/database.d.ts +11 -0
- package/dist/src/generation/database.js +23 -12
- package/dist/src/generation/index.d.ts +1 -1
- package/dist/src/generation/index.js +1 -1
- package/dist/src/generation/infrastructure.js +5 -5
- package/dist/src/generation/storage.js +30 -30
- package/dist/src/index.d.ts +1 -1
- package/dist/src/index.js +1 -1
- package/dist/src/planning/index.d.ts +2 -1
- package/dist/src/planning/index.js +1 -1
- package/dist/src/planning/openNextPlanning.d.ts +38 -0
- package/dist/src/planning/openNextPlanning.js +1 -0
- package/dist/src/planning/resourceAddition.d.ts +5 -1
- package/dist/src/planning/resourceAddition.js +1 -1
- package/dist/src/planning/resourcePlanning.d.ts +0 -46
- package/dist/src/planning/resourcePlanning.js +1 -1
- package/dist/src/presets/clickhouseTierPreset.d.ts +35 -0
- package/dist/src/presets/clickhouseTierPreset.js +0 -0
- package/dist/src/presets/tierPresets.d.ts +5 -12
- package/dist/src/presets/tierPresets.js +1 -1
- package/dist/src/presets/tierTypes.d.ts +9 -19
- package/dist/src/schemas/applicationSchemas.d.ts +67 -8
- package/dist/src/schemas/applicationSchemas.js +1 -1
- package/dist/src/schemas/baseSchemas.d.ts +24 -5
- package/dist/src/schemas/baseSchemas.js +2 -2
- package/dist/src/schemas/computeSchemas.d.ts +108 -14
- package/dist/src/schemas/computeSchemas.js +1 -1
- package/dist/src/schemas/constants.d.ts +14 -0
- package/dist/src/schemas/constants.js +1 -1
- package/dist/src/schemas/databaseSchemas.d.ts +80 -0
- package/dist/src/schemas/databaseSchemas.js +1 -1
- package/dist/src/schemas/networkSchemas.d.ts +126 -11
- package/dist/src/schemas/networkSchemas.js +1 -1
- package/dist/src/schemas/patternSchemas.js +1 -1
- package/dist/src/schemas/sharedTypes.d.ts +1 -1
- package/dist/src/schemas/sharedTypes.js +1 -1
- package/dist/src/validation/patterns.d.ts +2 -318
- package/dist/src/validation/patterns.js +1 -1
- package/dist/src/validation/validationMessages.d.ts +315 -0
- package/dist/src/validation/validationMessages.js +1 -0
- package/dist/src/validation/validationPatterns.d.ts +34 -0
- package/dist/src/validation/validationPatterns.js +1 -0
- package/dist/src/version.d.ts +1 -1
- package/dist/src/version.js +1 -1
- 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?:
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
497
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
2
|
-
`)}export{
|
|
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.
|
|
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
|
-
|
|
129
|
-
|
|
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.
|
|
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
|
-
|
|
243
|
-
|
|
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
|
-
|
|
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
|
-
|
|
525
|
-
|
|
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.
|
|
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
|
-
|
|
552
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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};
|