@fjall/generator 0.88.4 → 0.89.2

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 (73) hide show
  1. package/LICENSE +21 -0
  2. package/dist/src/ast/astCdnParser.d.ts +15 -0
  3. package/dist/src/ast/astCdnParser.js +114 -0
  4. package/dist/src/ast/astCommonParser.d.ts +90 -0
  5. package/dist/src/ast/astCommonParser.js +351 -0
  6. package/dist/src/ast/astComputeParser.d.ts +14 -2
  7. package/dist/src/ast/astComputeParser.js +55 -9
  8. package/dist/src/ast/astDatabaseParser.d.ts +104 -0
  9. package/dist/src/ast/astDatabaseParser.js +275 -0
  10. package/dist/src/ast/astInfrastructureParser.d.ts +23 -277
  11. package/dist/src/ast/astInfrastructureParser.js +83 -1456
  12. package/dist/src/ast/astMessagingParser.d.ts +25 -0
  13. package/dist/src/ast/astMessagingParser.js +78 -0
  14. package/dist/src/ast/astNetworkParser.d.ts +70 -0
  15. package/dist/src/ast/astNetworkParser.js +219 -0
  16. package/dist/src/ast/astPatternParser.d.ts +80 -0
  17. package/dist/src/ast/astPatternParser.js +155 -0
  18. package/dist/src/ast/astStorageParser.d.ts +18 -0
  19. package/dist/src/ast/astStorageParser.js +164 -0
  20. package/dist/src/ast/index.d.ts +1 -0
  21. package/dist/src/ast/index.js +4 -0
  22. package/dist/src/dns/bindParser.d.ts +13 -0
  23. package/dist/src/dns/bindParser.js +224 -0
  24. package/dist/src/dns/bindWriter.d.ts +2 -0
  25. package/dist/src/dns/bindWriter.js +52 -0
  26. package/dist/src/dns/index.d.ts +4 -0
  27. package/dist/src/dns/index.js +4 -0
  28. package/dist/src/dns/infrastructureWriter.d.ts +2 -0
  29. package/dist/src/dns/infrastructureWriter.js +58 -0
  30. package/dist/src/dns/types.d.ts +82 -0
  31. package/dist/src/dns/types.js +52 -0
  32. package/dist/src/generation/common.d.ts +1 -16
  33. package/dist/src/generation/common.js +2 -28
  34. package/dist/src/generation/compute.js +77 -28
  35. package/dist/src/generation/index.d.ts +2 -1
  36. package/dist/src/generation/index.js +3 -1
  37. package/dist/src/generation/messagingConnections.d.ts +33 -0
  38. package/dist/src/generation/messagingConnections.js +73 -0
  39. package/dist/src/generation/storage.d.ts +5 -1
  40. package/dist/src/generation/storage.js +9 -1
  41. package/dist/src/generation/storageConnections.d.ts +3 -3
  42. package/dist/src/generation/storageConnections.js +8 -4
  43. package/dist/src/index.d.ts +1 -0
  44. package/dist/src/index.js +2 -0
  45. package/dist/src/planning/resourcePlanning.js +0 -2
  46. package/dist/src/presets/tierTypes.d.ts +4 -1
  47. package/dist/src/schemas/applicationSchemas.d.ts +854 -0
  48. package/dist/src/schemas/applicationSchemas.js +80 -0
  49. package/dist/src/schemas/baseSchemas.d.ts +206 -0
  50. package/dist/src/schemas/baseSchemas.js +248 -0
  51. package/dist/src/schemas/cdnSchemas.d.ts +61 -0
  52. package/dist/src/schemas/cdnSchemas.js +62 -0
  53. package/dist/src/schemas/computeSchemas.d.ts +723 -0
  54. package/dist/src/schemas/computeSchemas.js +727 -0
  55. package/dist/src/schemas/constants.d.ts +12 -8
  56. package/dist/src/schemas/constants.js +14 -4
  57. package/dist/src/schemas/databaseSchemas.d.ts +638 -0
  58. package/dist/src/schemas/databaseSchemas.js +366 -0
  59. package/dist/src/schemas/messagingSchemas.d.ts +20 -0
  60. package/dist/src/schemas/messagingSchemas.js +29 -0
  61. package/dist/src/schemas/networkSchemas.d.ts +246 -0
  62. package/dist/src/schemas/networkSchemas.js +125 -0
  63. package/dist/src/schemas/patternSchemas.d.ts +708 -0
  64. package/dist/src/schemas/patternSchemas.js +294 -0
  65. package/dist/src/schemas/resourceSchemas.d.ts +24 -3530
  66. package/dist/src/schemas/resourceSchemas.js +24 -2011
  67. package/dist/src/schemas/storageSchemas.d.ts +93 -0
  68. package/dist/src/schemas/storageSchemas.js +119 -0
  69. package/dist/src/util/errorUtils.d.ts +1 -2
  70. package/dist/src/util/errorUtils.js +1 -15
  71. package/dist/src/validation/patterns.d.ts +9 -0
  72. package/dist/src/validation/patterns.js +9 -0
  73. package/package.json +4 -3
@@ -0,0 +1,366 @@
1
+ import { z } from "zod";
2
+ import { VALIDATION_PATTERNS, VALIDATION_MESSAGES, } from "../validation/patterns.js";
3
+ import { DATABASE_TYPES, VALID_MONITORING_INTERVALS, constIncludes, } from "./constants.js";
4
+ import { optionalOrDisabled, ResourceNameSchema, AppNameSchema, ExtraPropertySchema, } from "./baseSchemas.js";
5
+ // ─── Reusable database-specific validation schemas ───────────────────────────
6
+ /** Reusable backup retention validation. Range: 1-35 days. */
7
+ export const BackupRetentionSchema = z
8
+ .number()
9
+ .int(VALIDATION_MESSAGES.BACKUP_RETENTION.INTEGER)
10
+ .min(1, VALIDATION_MESSAGES.BACKUP_RETENTION.MIN)
11
+ .max(35, VALIDATION_MESSAGES.BACKUP_RETENTION.MAX);
12
+ /** Reusable monitoring interval validation. Must be one of: 0, 1, 5, 10, 15, 30, 60. */
13
+ export const MonitoringIntervalSchema = z
14
+ .number()
15
+ .int(VALIDATION_MESSAGES.MONITORING_INTERVAL.INTEGER)
16
+ .refine((val) => constIncludes(VALID_MONITORING_INTERVALS, val), {
17
+ message: VALIDATION_MESSAGES.MONITORING_INTERVAL.VALUES,
18
+ });
19
+ /** Reusable database port validation. Range: 1024-65535. */
20
+ export const DatabasePortSchema = z
21
+ .number()
22
+ .int(VALIDATION_MESSAGES.DATABASE.PORT.INTEGER)
23
+ .min(1024, VALIDATION_MESSAGES.DATABASE.PORT.MIN)
24
+ .max(65535, VALIDATION_MESSAGES.DATABASE.PORT.MAX);
25
+ // ─── Database type ───────────────────────────────────────────────────────────
26
+ export const DatabaseTypeSchema = z
27
+ .enum(DATABASE_TYPES)
28
+ .describe(`Database type must be one of: ${DATABASE_TYPES.join(", ")}`);
29
+ // ─── Nested configuration schemas ────────────────────────────────────────────
30
+ export const ProxyConfigSchema = z
31
+ .object({
32
+ maxConnections: z
33
+ .number()
34
+ .int(VALIDATION_MESSAGES.MAX_CONNECTIONS.INTEGER)
35
+ .min(1, VALIDATION_MESSAGES.MAX_CONNECTIONS.MIN)
36
+ .max(100, VALIDATION_MESSAGES.MAX_CONNECTIONS.MAX)
37
+ .optional(),
38
+ maxIdleConnections: z
39
+ .number()
40
+ .int(VALIDATION_MESSAGES.PROXY_CONFIG.MAX_IDLE_CONNECTIONS.INTEGER)
41
+ .min(0, VALIDATION_MESSAGES.PROXY_CONFIG.MAX_IDLE_CONNECTIONS.MIN)
42
+ .max(100, VALIDATION_MESSAGES.PROXY_CONFIG.MAX_IDLE_CONNECTIONS.MAX)
43
+ .optional(),
44
+ connectionBorrowTimeout: z
45
+ .number()
46
+ .int(VALIDATION_MESSAGES.PROXY_CONFIG.BORROW_TIMEOUT.INTEGER)
47
+ .min(1, VALIDATION_MESSAGES.PROXY_CONFIG.BORROW_TIMEOUT.MIN)
48
+ .max(3600, VALIDATION_MESSAGES.PROXY_CONFIG.BORROW_TIMEOUT.MAX)
49
+ .optional(),
50
+ requireTLS: z.boolean().optional(),
51
+ })
52
+ .strict()
53
+ .describe("RDS Proxy configuration");
54
+ export const ReadReplicaConfigSchema = z
55
+ .object({
56
+ instanceType: z.string().optional(),
57
+ availabilityZone: z.string().optional(),
58
+ })
59
+ .strict()
60
+ .describe("Read replica configuration");
61
+ export const SecretRotationConfigSchema = z
62
+ .object({
63
+ automaticallyAfterDays: z
64
+ .number()
65
+ .int(VALIDATION_MESSAGES.ROTATION.INTEGER)
66
+ .min(1, VALIDATION_MESSAGES.ROTATION.MIN)
67
+ .max(365, VALIDATION_MESSAGES.ROTATION.MAX)
68
+ .optional(),
69
+ })
70
+ .strict()
71
+ .describe("Secret rotation configuration");
72
+ export const CredentialsConfigSchema = z
73
+ .object({
74
+ username: z
75
+ .string()
76
+ .min(1, VALIDATION_MESSAGES.REQUIRED.USERNAME)
77
+ .max(63, VALIDATION_MESSAGES.USERNAME.MAX_LENGTH)
78
+ .optional(),
79
+ secretRotation: SecretRotationConfigSchema.optional(),
80
+ })
81
+ .strict()
82
+ .describe("Database credentials configuration");
83
+ export const ProxyConfigOrFalseSchema = optionalOrDisabled(ProxyConfigSchema);
84
+ export const ReadReplicaConfigOrFalseSchema = optionalOrDisabled(ReadReplicaConfigSchema);
85
+ // ─── Aurora-specific nested configuration ────────────────────────────────────
86
+ export const AuroraReaderConfigSchema = z
87
+ .object({
88
+ scaleWithWriter: z.boolean().optional(),
89
+ enableDatabaseInsights: z.boolean().optional(),
90
+ identifierSuffix: z
91
+ .string()
92
+ .min(1, VALIDATION_MESSAGES.IDENTIFIER_SUFFIX.REQUIRED)
93
+ .max(50, VALIDATION_MESSAGES.IDENTIFIER_SUFFIX.MAX_LENGTH)
94
+ .optional(),
95
+ availabilityZone: z.string().optional(),
96
+ })
97
+ .strict()
98
+ .describe("Configuration for a single Aurora reader instance");
99
+ export const AuroraWriterConfigSchema = z
100
+ .object({
101
+ enableDatabaseInsights: z.boolean().optional(),
102
+ identifierSuffix: z
103
+ .string()
104
+ .min(1, VALIDATION_MESSAGES.IDENTIFIER_SUFFIX.REQUIRED)
105
+ .max(50, VALIDATION_MESSAGES.IDENTIFIER_SUFFIX.MAX_LENGTH)
106
+ .optional(),
107
+ availabilityZone: z.string().optional(),
108
+ })
109
+ .strict()
110
+ .describe("Configuration for Aurora writer instance");
111
+ export const AuroraReadersConfigSchema = z
112
+ .object({
113
+ count: z
114
+ .number()
115
+ .int(VALIDATION_MESSAGES.READER.COUNT.INTEGER)
116
+ .min(0, VALIDATION_MESSAGES.READER.COUNT.MIN)
117
+ .max(15, VALIDATION_MESSAGES.READER.COUNT.MAX)
118
+ .optional(),
119
+ instances: z
120
+ .array(AuroraReaderConfigSchema)
121
+ .max(15, VALIDATION_MESSAGES.READER_INSTANCES.MAX)
122
+ .optional(),
123
+ defaultEnableDatabaseInsights: z.boolean().optional(),
124
+ })
125
+ .strict()
126
+ .refine((data) => !(data.count !== undefined && data.instances !== undefined), {
127
+ message: VALIDATION_MESSAGES.READER_INSTANCES.COUNT_OR_INSTANCES,
128
+ path: ["count"],
129
+ })
130
+ .describe("Aurora readers configuration");
131
+ export const AuroraReadersConfigOrFalseSchema = optionalOrDisabled(AuroraReadersConfigSchema);
132
+ // ─── Encryption key specification ────────────────────────────────────────────
133
+ export const AwsManagedKeySchema = z
134
+ .object({
135
+ awsManaged: z.literal(true),
136
+ })
137
+ .strict();
138
+ export const CustomerManagedKeyMarkerSchema = z
139
+ .object({
140
+ useCMK: z.literal(true),
141
+ })
142
+ .strict();
143
+ export const EncryptionKeySpecSchema = z.union([
144
+ AwsManagedKeySchema,
145
+ CustomerManagedKeyMarkerSchema,
146
+ ]);
147
+ export const DatabaseInsightsConfigSchema = z
148
+ .object({
149
+ mode: z.enum(["standard", "advanced"]).optional(),
150
+ encryptionKey: EncryptionKeySpecSchema.optional(),
151
+ })
152
+ .strict()
153
+ .describe("Database Insights configuration");
154
+ export const DatabaseInsightsConfigOrFalseSchema = optionalOrDisabled(DatabaseInsightsConfigSchema);
155
+ export const EncryptionConfigSchema = z
156
+ .object({
157
+ storageKey: EncryptionKeySpecSchema.optional(),
158
+ })
159
+ .strict()
160
+ .describe("Encryption configuration (DESTRUCTIVE to change storageKey)");
161
+ // ─── Database resource plan ──────────────────────────────────────────────────
162
+ export const DatabaseResourcePlanSchema = z
163
+ .object({
164
+ name: ResourceNameSchema,
165
+ type: DatabaseTypeSchema,
166
+ databaseName: z.string().min(1, VALIDATION_MESSAGES.REQUIRED.DATABASE_NAME),
167
+ // Instance-specific props (only apply when type is "Instance")
168
+ instanceType: z.string().optional(),
169
+ multiAz: z.boolean().optional(),
170
+ publiclyAccessible: z.boolean().optional(),
171
+ enableSecretRotation: z.boolean().optional(),
172
+ // Shared props (Instance and Aurora)
173
+ databaseInsights: DatabaseInsightsConfigOrFalseSchema.optional(),
174
+ port: DatabasePortSchema.optional(),
175
+ deletionProtection: z.boolean().optional(),
176
+ // Nested configurations (presence-based: object = enabled, false = disabled)
177
+ proxy: ProxyConfigOrFalseSchema.optional(),
178
+ credentials: CredentialsConfigSchema.optional(),
179
+ // Instance-specific nested config
180
+ readReplica: ReadReplicaConfigOrFalseSchema.optional(),
181
+ // Shared encryption config (Instance and Aurora)
182
+ encryption: EncryptionConfigSchema.optional(),
183
+ // Aurora/GlobalAurora-specific props
184
+ writer: AuroraWriterConfigSchema.optional(),
185
+ readers: AuroraReadersConfigOrFalseSchema.optional(),
186
+ // Shared operational props (Instance, Aurora, GlobalAurora)
187
+ backupRetention: BackupRetentionSchema.optional(),
188
+ preferredMaintenanceWindow: z.string().optional(),
189
+ monitoringInterval: MonitoringIntervalSchema.optional(),
190
+ // GlobalAurora-specific props
191
+ primaryRegion: z.string().optional(),
192
+ secondaryRegions: z.array(z.string()).optional(),
193
+ globalClusterIdentifier: z.string().optional(),
194
+ enableGlobalWriteForwarding: z.boolean().optional(),
195
+ // Shared restore/snapshot props
196
+ snapshotIdentifier: z.string().optional(),
197
+ snapshotUsername: z.string().optional(),
198
+ // Round-trip preservation fields (set by AST parser, used by generator)
199
+ databaseEngine: z.enum(["postgresql", "mysql"]).optional(),
200
+ engineExpression: z.string().optional(),
201
+ variableName: z.string().optional(),
202
+ extraProperties: z.array(ExtraPropertySchema).optional(),
203
+ })
204
+ .strict();
205
+ // ─── Database generator schemas ──────────────────────────────────────────────
206
+ // Common fields shared across all database types
207
+ const DatabaseGeneratorBaseSchema = z
208
+ .object({
209
+ appName: AppNameSchema,
210
+ nameProvidedByFlag: z.boolean().optional(),
211
+ databaseName: z
212
+ .string()
213
+ .min(1, VALIDATION_MESSAGES.REQUIRED.DATABASE_NAME)
214
+ .max(63, VALIDATION_MESSAGES.MAX_LENGTH.DATABASE_NAME)
215
+ .regex(VALIDATION_PATTERNS.DATABASE_NAME, VALIDATION_MESSAGES.DATABASE_NAME),
216
+ resourceName: ResourceNameSchema.optional(),
217
+ connectionConfig: z
218
+ .object({
219
+ /** Connect to entire compute resources (legacy, cluster-level) */
220
+ connectToCompute: z.array(z.string()).optional(),
221
+ /** Connect to specific ECS services (format: "ClusterName/ServiceName") */
222
+ connectToServices: z.array(z.string()).optional(),
223
+ })
224
+ .strict()
225
+ .optional(),
226
+ // Shared fields (all database types)
227
+ databaseInsights: DatabaseInsightsConfigOrFalseSchema.optional(),
228
+ port: DatabasePortSchema.optional(),
229
+ proxy: ProxyConfigOrFalseSchema.optional(),
230
+ credentials: CredentialsConfigSchema.optional(),
231
+ encryption: EncryptionConfigSchema.optional(),
232
+ deletionProtection: z.boolean().optional(),
233
+ })
234
+ .strict();
235
+ // Type-specific field definitions shared between CLI and UI schemas
236
+ const instanceSpecificFields = {
237
+ databaseType: z.literal("Instance"),
238
+ instanceType: z.string().optional(),
239
+ multiAz: z.boolean().optional(),
240
+ readReplica: ReadReplicaConfigOrFalseSchema.optional(),
241
+ publiclyAccessible: z.boolean().optional(),
242
+ backupRetention: BackupRetentionSchema.optional(),
243
+ allocatedStorage: z.number().optional(),
244
+ snapshotIdentifier: z.string().optional(),
245
+ snapshotUsername: z.string().optional(),
246
+ };
247
+ const auroraSpecificFields = {
248
+ databaseType: z.literal("Aurora"),
249
+ writer: AuroraWriterConfigSchema.optional(),
250
+ readers: AuroraReadersConfigOrFalseSchema.optional(),
251
+ backupRetention: BackupRetentionSchema.optional(),
252
+ preferredMaintenanceWindow: z.string().optional(),
253
+ monitoringInterval: MonitoringIntervalSchema.optional(),
254
+ snapshotIdentifier: z.string().optional(),
255
+ snapshotUsername: z.string().optional(),
256
+ };
257
+ const globalAuroraSpecificFields = {
258
+ databaseType: z.literal("GlobalAurora"),
259
+ primaryRegion: z
260
+ .string()
261
+ .min(1, VALIDATION_MESSAGES.GLOBAL_AURORA.PRIMARY_REGION_REQUIRED),
262
+ secondaryRegions: z.array(z.string()).optional(),
263
+ globalClusterIdentifier: z.string().optional(),
264
+ enableGlobalWriteForwarding: z.boolean().optional(),
265
+ writer: AuroraWriterConfigSchema.optional(),
266
+ readers: AuroraReadersConfigOrFalseSchema.optional(),
267
+ backupRetention: BackupRetentionSchema.optional(),
268
+ preferredMaintenanceWindow: z.string().optional(),
269
+ monitoringInterval: MonitoringIntervalSchema.optional(),
270
+ snapshotIdentifier: z.string().optional(),
271
+ snapshotUsername: z.string().optional(),
272
+ };
273
+ const InstanceDatabaseGeneratorSchema = DatabaseGeneratorBaseSchema.extend(instanceSpecificFields).strict();
274
+ const AuroraDatabaseGeneratorSchema = DatabaseGeneratorBaseSchema.extend(auroraSpecificFields).strict();
275
+ const GlobalAuroraDatabaseGeneratorSchema = DatabaseGeneratorBaseSchema.extend(globalAuroraSpecificFields).strict();
276
+ /**
277
+ * Database generator schema using discriminated union.
278
+ * This ensures type-specific fields are only allowed for the correct database type:
279
+ * - Instance: instanceType, multiAz, readReplica
280
+ * - Aurora: writer, readers, backupRetention
281
+ * - GlobalAurora: primaryRegion (required!), secondaryRegions, enableGlobalWriteForwarding
282
+ */
283
+ export const DatabaseGeneratorSchema = z.discriminatedUnion("databaseType", [
284
+ InstanceDatabaseGeneratorSchema,
285
+ AuroraDatabaseGeneratorSchema,
286
+ GlobalAuroraDatabaseGeneratorSchema,
287
+ ]);
288
+ // Base schema with required resourceName for UI
289
+ const DatabaseGeneratorBaseSchemaFromUI = DatabaseGeneratorBaseSchema.extend({
290
+ resourceName: ResourceNameSchema,
291
+ }).strict();
292
+ /**
293
+ * Stricter schema for UI-originated database creation.
294
+ * Requires resourceName to prevent silent failures where
295
+ * the generator falls back to a default name that may conflict.
296
+ */
297
+ const InstanceDatabaseGeneratorSchemaFromUI = DatabaseGeneratorBaseSchemaFromUI.extend(instanceSpecificFields).strict();
298
+ const AuroraDatabaseGeneratorSchemaFromUI = DatabaseGeneratorBaseSchemaFromUI.extend(auroraSpecificFields).strict();
299
+ const GlobalAuroraDatabaseGeneratorSchemaFromUI = DatabaseGeneratorBaseSchemaFromUI.extend(globalAuroraSpecificFields).strict();
300
+ export const DatabaseGeneratorSchemaFromUI = z.discriminatedUnion("databaseType", [
301
+ InstanceDatabaseGeneratorSchemaFromUI,
302
+ AuroraDatabaseGeneratorSchemaFromUI,
303
+ GlobalAuroraDatabaseGeneratorSchemaFromUI,
304
+ ]);
305
+ /**
306
+ * Schema for adding RDS Proxy to an existing database.
307
+ * Used by the `fjall add proxy` command.
308
+ */
309
+ export const AddProxyGeneratorSchema = z
310
+ .object({
311
+ appName: AppNameSchema,
312
+ databaseName: z.string().min(1, VALIDATION_MESSAGES.REQUIRED.DATABASE_NAME),
313
+ maxConnections: z
314
+ .number()
315
+ .int(VALIDATION_MESSAGES.MAX_CONNECTIONS.INTEGER)
316
+ .min(1, VALIDATION_MESSAGES.MAX_CONNECTIONS.MIN)
317
+ .max(100, VALIDATION_MESSAGES.MAX_CONNECTIONS.MAX)
318
+ .optional(),
319
+ maxIdleConnections: z
320
+ .number()
321
+ .int(VALIDATION_MESSAGES.PROXY_CONFIG.MAX_IDLE_CONNECTIONS.INTEGER)
322
+ .min(0, VALIDATION_MESSAGES.PROXY_CONFIG.MAX_IDLE_CONNECTIONS.MIN)
323
+ .max(100, VALIDATION_MESSAGES.PROXY_CONFIG.MAX_IDLE_CONNECTIONS.MAX)
324
+ .optional(),
325
+ connectionBorrowTimeout: z
326
+ .number()
327
+ .int(VALIDATION_MESSAGES.PROXY_CONFIG.BORROW_TIMEOUT.INTEGER)
328
+ .min(1, VALIDATION_MESSAGES.PROXY_CONFIG.BORROW_TIMEOUT.MIN)
329
+ .max(3600, VALIDATION_MESSAGES.PROXY_CONFIG.BORROW_TIMEOUT.MAX)
330
+ .optional(),
331
+ requireTLS: z.boolean().optional(),
332
+ nameProvidedByFlag: z.boolean().optional(),
333
+ })
334
+ .strict();
335
+ // ─── DynamoDB schemas ────────────────────────────────────────────────────────
336
+ const DYNAMODB_ATTRIBUTE_TYPES = ["S", "N", "B"];
337
+ const DynamoDBKeySchema = z
338
+ .object({
339
+ name: z.string(),
340
+ type: z.enum(DYNAMODB_ATTRIBUTE_TYPES),
341
+ })
342
+ .strict();
343
+ /**
344
+ * DynamoDB table resource plan schema (for OpenNext patterns)
345
+ */
346
+ export const DynamoDBResourcePlanSchema = z
347
+ .object({
348
+ name: ResourceNameSchema,
349
+ partitionKey: DynamoDBKeySchema,
350
+ sortKey: DynamoDBKeySchema.optional(),
351
+ globalSecondaryIndexes: z
352
+ .array(z
353
+ .object({
354
+ indexName: z.string(),
355
+ partitionKey: DynamoDBKeySchema,
356
+ sortKey: DynamoDBKeySchema.optional(),
357
+ })
358
+ .strict())
359
+ .optional(),
360
+ ttlAttribute: z.string().optional(),
361
+ stream: z.boolean().optional(),
362
+ // Round-trip preservation
363
+ variableName: z.string().optional(),
364
+ extraProperties: z.array(ExtraPropertySchema).optional(),
365
+ })
366
+ .strict();
@@ -0,0 +1,20 @@
1
+ import { z } from "zod";
2
+ /**
3
+ * SQS queue resource plan schema (for OpenNext patterns)
4
+ */
5
+ export declare const SQSResourcePlanSchema: z.ZodObject<{
6
+ name: z.ZodString;
7
+ queueType: z.ZodDefault<z.ZodEnum<{
8
+ standard: "standard";
9
+ fifo: "fifo";
10
+ }>>;
11
+ visibilityTimeout: z.ZodOptional<z.ZodNumber>;
12
+ retentionPeriod: z.ZodOptional<z.ZodNumber>;
13
+ contentBasedDeduplication: z.ZodOptional<z.ZodBoolean>;
14
+ variableName: z.ZodOptional<z.ZodString>;
15
+ extraProperties: z.ZodOptional<z.ZodArray<z.ZodObject<{
16
+ key: z.ZodString;
17
+ sourceText: z.ZodString;
18
+ }, z.core.$strict>>>;
19
+ }, z.core.$strict>;
20
+ export type SQSResourcePlan = z.infer<typeof SQSResourcePlanSchema>;
@@ -0,0 +1,29 @@
1
+ import { z } from "zod";
2
+ import { VALIDATION_MESSAGES } from "../validation/patterns.js";
3
+ import { ResourceNameSchema, ExtraPropertySchema } from "./baseSchemas.js";
4
+ // ─── SQS resource plan ──────────────────────────────────────────────────────
5
+ /**
6
+ * SQS queue resource plan schema (for OpenNext patterns)
7
+ */
8
+ export const SQSResourcePlanSchema = z
9
+ .object({
10
+ name: ResourceNameSchema,
11
+ queueType: z.enum(["standard", "fifo"]).default("standard"),
12
+ visibilityTimeout: z
13
+ .number()
14
+ .int(VALIDATION_MESSAGES.SQS.VISIBILITY_TIMEOUT.INTEGER)
15
+ .min(0, VALIDATION_MESSAGES.SQS.VISIBILITY_TIMEOUT.MIN)
16
+ .max(43200, VALIDATION_MESSAGES.SQS.VISIBILITY_TIMEOUT.MAX)
17
+ .optional(),
18
+ retentionPeriod: z
19
+ .number()
20
+ .int(VALIDATION_MESSAGES.SQS.RETENTION_PERIOD.INTEGER)
21
+ .min(60, VALIDATION_MESSAGES.SQS.RETENTION_PERIOD.MIN)
22
+ .max(1209600, VALIDATION_MESSAGES.SQS.RETENTION_PERIOD.MAX)
23
+ .optional(),
24
+ contentBasedDeduplication: z.boolean().optional(),
25
+ // Round-trip preservation
26
+ variableName: z.string().optional(),
27
+ extraProperties: z.array(ExtraPropertySchema).optional(),
28
+ })
29
+ .strict();
@@ -0,0 +1,246 @@
1
+ import { z } from "zod";
2
+ export declare const NatConfigSchema: z.ZodObject<{
3
+ count: z.ZodOptional<z.ZodNumber>;
4
+ }, z.core.$strict>;
5
+ export declare const NatConfigOrFalseSchema: z.ZodUnion<[z.ZodLiteral<false>, z.ZodObject<{
6
+ count: z.ZodOptional<z.ZodNumber>;
7
+ }, z.core.$strict>]>;
8
+ export declare const FlowLogConfigSchema: z.ZodObject<{
9
+ destination: z.ZodOptional<z.ZodEnum<{
10
+ cloudwatch: "cloudwatch";
11
+ s3: "s3";
12
+ }>>;
13
+ retentionDays: z.ZodOptional<z.ZodNumber>;
14
+ trafficType: z.ZodOptional<z.ZodEnum<{
15
+ ALL: "ALL";
16
+ ACCEPT: "ACCEPT";
17
+ REJECT: "REJECT";
18
+ }>>;
19
+ }, z.core.$strict>;
20
+ export declare const FlowLogConfigOrFalseSchema: z.ZodUnion<[z.ZodLiteral<false>, z.ZodObject<{
21
+ destination: z.ZodOptional<z.ZodEnum<{
22
+ cloudwatch: "cloudwatch";
23
+ s3: "s3";
24
+ }>>;
25
+ retentionDays: z.ZodOptional<z.ZodNumber>;
26
+ trafficType: z.ZodOptional<z.ZodEnum<{
27
+ ALL: "ALL";
28
+ ACCEPT: "ACCEPT";
29
+ REJECT: "REJECT";
30
+ }>>;
31
+ }, z.core.$strict>]>;
32
+ export declare const GatewayEndpointsConfigSchema: z.ZodObject<{
33
+ s3: z.ZodOptional<z.ZodBoolean>;
34
+ dynamodb: z.ZodOptional<z.ZodBoolean>;
35
+ }, z.core.$strict>;
36
+ export declare const GatewayEndpointsConfigOrFalseSchema: z.ZodUnion<[z.ZodLiteral<false>, z.ZodObject<{
37
+ s3: z.ZodOptional<z.ZodBoolean>;
38
+ dynamodb: z.ZodOptional<z.ZodBoolean>;
39
+ }, z.core.$strict>]>;
40
+ export declare const InterfaceEndpointsConfigSchema: z.ZodObject<{
41
+ ecr: z.ZodOptional<z.ZodBoolean>;
42
+ secretsManager: z.ZodOptional<z.ZodBoolean>;
43
+ kms: z.ZodOptional<z.ZodBoolean>;
44
+ cloudwatchLogs: z.ZodOptional<z.ZodBoolean>;
45
+ ssm: z.ZodOptional<z.ZodBoolean>;
46
+ sts: z.ZodOptional<z.ZodBoolean>;
47
+ }, z.core.$strict>;
48
+ export declare const InterfaceEndpointsConfigOrFalseSchema: z.ZodUnion<[z.ZodLiteral<false>, z.ZodObject<{
49
+ ecr: z.ZodOptional<z.ZodBoolean>;
50
+ secretsManager: z.ZodOptional<z.ZodBoolean>;
51
+ kms: z.ZodOptional<z.ZodBoolean>;
52
+ cloudwatchLogs: z.ZodOptional<z.ZodBoolean>;
53
+ ssm: z.ZodOptional<z.ZodBoolean>;
54
+ sts: z.ZodOptional<z.ZodBoolean>;
55
+ }, z.core.$strict>]>;
56
+ export declare const VpcEndpointsConfigSchema: z.ZodObject<{
57
+ gateway: z.ZodOptional<z.ZodUnion<[z.ZodLiteral<false>, z.ZodObject<{
58
+ s3: z.ZodOptional<z.ZodBoolean>;
59
+ dynamodb: z.ZodOptional<z.ZodBoolean>;
60
+ }, z.core.$strict>]>>;
61
+ interface: z.ZodOptional<z.ZodUnion<[z.ZodLiteral<false>, z.ZodObject<{
62
+ ecr: z.ZodOptional<z.ZodBoolean>;
63
+ secretsManager: z.ZodOptional<z.ZodBoolean>;
64
+ kms: z.ZodOptional<z.ZodBoolean>;
65
+ cloudwatchLogs: z.ZodOptional<z.ZodBoolean>;
66
+ ssm: z.ZodOptional<z.ZodBoolean>;
67
+ sts: z.ZodOptional<z.ZodBoolean>;
68
+ }, z.core.$strict>]>>;
69
+ }, z.core.$strict>;
70
+ export declare const VpcEndpointsConfigOrFalseSchema: z.ZodUnion<[z.ZodLiteral<false>, z.ZodObject<{
71
+ gateway: z.ZodOptional<z.ZodUnion<[z.ZodLiteral<false>, z.ZodObject<{
72
+ s3: z.ZodOptional<z.ZodBoolean>;
73
+ dynamodb: z.ZodOptional<z.ZodBoolean>;
74
+ }, z.core.$strict>]>>;
75
+ interface: z.ZodOptional<z.ZodUnion<[z.ZodLiteral<false>, z.ZodObject<{
76
+ ecr: z.ZodOptional<z.ZodBoolean>;
77
+ secretsManager: z.ZodOptional<z.ZodBoolean>;
78
+ kms: z.ZodOptional<z.ZodBoolean>;
79
+ cloudwatchLogs: z.ZodOptional<z.ZodBoolean>;
80
+ ssm: z.ZodOptional<z.ZodBoolean>;
81
+ sts: z.ZodOptional<z.ZodBoolean>;
82
+ }, z.core.$strict>]>>;
83
+ }, z.core.$strict>]>;
84
+ export declare const NetworkResourcePlanSchema: z.ZodObject<{
85
+ maxAzs: z.ZodOptional<z.ZodNumber>;
86
+ natGateways: z.ZodOptional<z.ZodUnion<[z.ZodLiteral<false>, z.ZodObject<{
87
+ count: z.ZodOptional<z.ZodNumber>;
88
+ }, z.core.$strict>]>>;
89
+ flowLogs: z.ZodOptional<z.ZodUnion<[z.ZodLiteral<false>, z.ZodObject<{
90
+ destination: z.ZodOptional<z.ZodEnum<{
91
+ cloudwatch: "cloudwatch";
92
+ s3: "s3";
93
+ }>>;
94
+ retentionDays: z.ZodOptional<z.ZodNumber>;
95
+ trafficType: z.ZodOptional<z.ZodEnum<{
96
+ ALL: "ALL";
97
+ ACCEPT: "ACCEPT";
98
+ REJECT: "REJECT";
99
+ }>>;
100
+ }, z.core.$strict>]>>;
101
+ vpcEndpoints: z.ZodOptional<z.ZodUnion<[z.ZodLiteral<false>, z.ZodObject<{
102
+ gateway: z.ZodOptional<z.ZodUnion<[z.ZodLiteral<false>, z.ZodObject<{
103
+ s3: z.ZodOptional<z.ZodBoolean>;
104
+ dynamodb: z.ZodOptional<z.ZodBoolean>;
105
+ }, z.core.$strict>]>>;
106
+ interface: z.ZodOptional<z.ZodUnion<[z.ZodLiteral<false>, z.ZodObject<{
107
+ ecr: z.ZodOptional<z.ZodBoolean>;
108
+ secretsManager: z.ZodOptional<z.ZodBoolean>;
109
+ kms: z.ZodOptional<z.ZodBoolean>;
110
+ cloudwatchLogs: z.ZodOptional<z.ZodBoolean>;
111
+ ssm: z.ZodOptional<z.ZodBoolean>;
112
+ sts: z.ZodOptional<z.ZodBoolean>;
113
+ }, z.core.$strict>]>>;
114
+ }, z.core.$strict>]>>;
115
+ cidrMask: z.ZodOptional<z.ZodNumber>;
116
+ }, z.core.$strict>;
117
+ /**
118
+ * Additional network resource plan schema for app.addNetwork() VPCs.
119
+ * Extends NetworkResourcePlanSchema with a required name field.
120
+ */
121
+ export declare const AdditionalNetworkResourcePlanSchema: z.ZodObject<{
122
+ maxAzs: z.ZodOptional<z.ZodNumber>;
123
+ natGateways: z.ZodOptional<z.ZodUnion<[z.ZodLiteral<false>, z.ZodObject<{
124
+ count: z.ZodOptional<z.ZodNumber>;
125
+ }, z.core.$strict>]>>;
126
+ flowLogs: z.ZodOptional<z.ZodUnion<[z.ZodLiteral<false>, z.ZodObject<{
127
+ destination: z.ZodOptional<z.ZodEnum<{
128
+ cloudwatch: "cloudwatch";
129
+ s3: "s3";
130
+ }>>;
131
+ retentionDays: z.ZodOptional<z.ZodNumber>;
132
+ trafficType: z.ZodOptional<z.ZodEnum<{
133
+ ALL: "ALL";
134
+ ACCEPT: "ACCEPT";
135
+ REJECT: "REJECT";
136
+ }>>;
137
+ }, z.core.$strict>]>>;
138
+ vpcEndpoints: z.ZodOptional<z.ZodUnion<[z.ZodLiteral<false>, z.ZodObject<{
139
+ gateway: z.ZodOptional<z.ZodUnion<[z.ZodLiteral<false>, z.ZodObject<{
140
+ s3: z.ZodOptional<z.ZodBoolean>;
141
+ dynamodb: z.ZodOptional<z.ZodBoolean>;
142
+ }, z.core.$strict>]>>;
143
+ interface: z.ZodOptional<z.ZodUnion<[z.ZodLiteral<false>, z.ZodObject<{
144
+ ecr: z.ZodOptional<z.ZodBoolean>;
145
+ secretsManager: z.ZodOptional<z.ZodBoolean>;
146
+ kms: z.ZodOptional<z.ZodBoolean>;
147
+ cloudwatchLogs: z.ZodOptional<z.ZodBoolean>;
148
+ ssm: z.ZodOptional<z.ZodBoolean>;
149
+ sts: z.ZodOptional<z.ZodBoolean>;
150
+ }, z.core.$strict>]>>;
151
+ }, z.core.$strict>]>>;
152
+ cidrMask: z.ZodOptional<z.ZodNumber>;
153
+ name: z.ZodString;
154
+ }, z.core.$strict>;
155
+ /**
156
+ * Network configuration for App.getApp() options.
157
+ * - false: No network (S3-only apps)
158
+ * - object: Create VPC with specified configuration
159
+ */
160
+ export declare const NetworkConfigSchema: z.ZodUnion<[z.ZodLiteral<false>, z.ZodObject<{
161
+ maxAzs: z.ZodOptional<z.ZodNumber>;
162
+ natGateways: z.ZodOptional<z.ZodUnion<[z.ZodLiteral<false>, z.ZodObject<{
163
+ count: z.ZodOptional<z.ZodNumber>;
164
+ }, z.core.$strict>]>>;
165
+ flowLogs: z.ZodOptional<z.ZodUnion<[z.ZodLiteral<false>, z.ZodObject<{
166
+ destination: z.ZodOptional<z.ZodEnum<{
167
+ cloudwatch: "cloudwatch";
168
+ s3: "s3";
169
+ }>>;
170
+ retentionDays: z.ZodOptional<z.ZodNumber>;
171
+ trafficType: z.ZodOptional<z.ZodEnum<{
172
+ ALL: "ALL";
173
+ ACCEPT: "ACCEPT";
174
+ REJECT: "REJECT";
175
+ }>>;
176
+ }, z.core.$strict>]>>;
177
+ vpcEndpoints: z.ZodOptional<z.ZodUnion<[z.ZodLiteral<false>, z.ZodObject<{
178
+ gateway: z.ZodOptional<z.ZodUnion<[z.ZodLiteral<false>, z.ZodObject<{
179
+ s3: z.ZodOptional<z.ZodBoolean>;
180
+ dynamodb: z.ZodOptional<z.ZodBoolean>;
181
+ }, z.core.$strict>]>>;
182
+ interface: z.ZodOptional<z.ZodUnion<[z.ZodLiteral<false>, z.ZodObject<{
183
+ ecr: z.ZodOptional<z.ZodBoolean>;
184
+ secretsManager: z.ZodOptional<z.ZodBoolean>;
185
+ kms: z.ZodOptional<z.ZodBoolean>;
186
+ cloudwatchLogs: z.ZodOptional<z.ZodBoolean>;
187
+ ssm: z.ZodOptional<z.ZodBoolean>;
188
+ sts: z.ZodOptional<z.ZodBoolean>;
189
+ }, z.core.$strict>]>>;
190
+ }, z.core.$strict>]>>;
191
+ cidrMask: z.ZodOptional<z.ZodNumber>;
192
+ }, z.core.$strict>]>;
193
+ /**
194
+ * Network name schema for additional VPCs.
195
+ * Must be PascalCase as it's used as a CDK construct ID.
196
+ */
197
+ export declare const NetworkNameSchema: z.ZodString;
198
+ /**
199
+ * Network generator schema for configuring network infrastructure.
200
+ *
201
+ * Behaviour depends on whether networkName is provided:
202
+ * - With networkName: Adds an additional VPC via app.addNetwork()
203
+ * - Without networkName: Updates the primary network config in App.getApp()
204
+ */
205
+ export declare const NetworkGeneratorSchema: z.ZodObject<{
206
+ appName: z.ZodString;
207
+ networkName: z.ZodOptional<z.ZodString>;
208
+ maxAzs: z.ZodOptional<z.ZodNumber>;
209
+ natGateways: z.ZodOptional<z.ZodUnion<[z.ZodLiteral<false>, z.ZodObject<{
210
+ count: z.ZodOptional<z.ZodNumber>;
211
+ }, z.core.$strict>]>>;
212
+ flowLogs: z.ZodOptional<z.ZodUnion<[z.ZodLiteral<false>, z.ZodObject<{
213
+ destination: z.ZodOptional<z.ZodEnum<{
214
+ cloudwatch: "cloudwatch";
215
+ s3: "s3";
216
+ }>>;
217
+ retentionDays: z.ZodOptional<z.ZodNumber>;
218
+ trafficType: z.ZodOptional<z.ZodEnum<{
219
+ ALL: "ALL";
220
+ ACCEPT: "ACCEPT";
221
+ REJECT: "REJECT";
222
+ }>>;
223
+ }, z.core.$strict>]>>;
224
+ vpcEndpoints: z.ZodOptional<z.ZodUnion<[z.ZodLiteral<false>, z.ZodObject<{
225
+ gateway: z.ZodOptional<z.ZodUnion<[z.ZodLiteral<false>, z.ZodObject<{
226
+ s3: z.ZodOptional<z.ZodBoolean>;
227
+ dynamodb: z.ZodOptional<z.ZodBoolean>;
228
+ }, z.core.$strict>]>>;
229
+ interface: z.ZodOptional<z.ZodUnion<[z.ZodLiteral<false>, z.ZodObject<{
230
+ ecr: z.ZodOptional<z.ZodBoolean>;
231
+ secretsManager: z.ZodOptional<z.ZodBoolean>;
232
+ kms: z.ZodOptional<z.ZodBoolean>;
233
+ cloudwatchLogs: z.ZodOptional<z.ZodBoolean>;
234
+ ssm: z.ZodOptional<z.ZodBoolean>;
235
+ sts: z.ZodOptional<z.ZodBoolean>;
236
+ }, z.core.$strict>]>>;
237
+ }, z.core.$strict>]>>;
238
+ }, z.core.$strict>;
239
+ export type NatConfig = z.infer<typeof NatConfigSchema>;
240
+ export type FlowLogConfig = z.infer<typeof FlowLogConfigSchema>;
241
+ export type GatewayEndpointsConfig = z.infer<typeof GatewayEndpointsConfigSchema>;
242
+ export type InterfaceEndpointsConfig = z.infer<typeof InterfaceEndpointsConfigSchema>;
243
+ export type VpcEndpointsConfig = z.infer<typeof VpcEndpointsConfigSchema>;
244
+ export type NetworkResourcePlan = z.infer<typeof NetworkResourcePlanSchema>;
245
+ export type AdditionalNetworkResourcePlan = z.infer<typeof AdditionalNetworkResourcePlanSchema>;
246
+ export type NetworkGeneratorOptions = z.infer<typeof NetworkGeneratorSchema>;