@venturekit/infra 0.0.0-dev.20260515022321 → 0.0.0-dev.20260515033511

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.
@@ -1,389 +0,0 @@
1
- /**
2
- * VentureStack — CDK Stack for VentureKit applications
3
- *
4
- * Translates VentureKit infrastructure intents into CloudFormation resources.
5
- * This is the single entry point for `vk deploy`.
6
- *
7
- * Consumers never see this file — it's invoked by the generated CDK app in .vk/cdk/.
8
- */
9
- import * as cdk from 'aws-cdk-lib';
10
- import { Construct } from 'constructs';
11
- import type { VentureIntent, EnvConfig } from '@venturekit/core';
12
- /**
13
- * One discovered HTTP route, ready to be wired to a Lambda + HttpRoute.
14
- */
15
- export interface DiscoveredRoute {
16
- /** HTTP method ('GET' / 'POST' / 'PUT' / 'PATCH' / 'DELETE'). */
17
- method: string;
18
- /**
19
- * API Gateway path with `{param}` segments, e.g. `/users/{id}`.
20
- * The root route (`src/routes/get.ts`) maps to `/`.
21
- */
22
- apiPath: string;
23
- /**
24
- * Stable slug derived from the file path, used for the Lambda's
25
- * function name and CDK construct id.
26
- *
27
- * src/routes/health/get.ts → 'health-get'
28
- * src/routes/users/[id]/put.ts → 'users-id-put'
29
- * src/routes/admin/users/[id]/delete.ts → 'admin-users-id-delete'
30
- */
31
- slug: string;
32
- /** Absolute path to the route handler file (.ts or .js). */
33
- handlerFile: string;
34
- }
35
- /**
36
- * Recursively discover HTTP route files under `src/routes/`.
37
- *
38
- * Walks the directory tree applying the same filesystem convention as the
39
- * local dev server:
40
- * - File name (without extension) determines the HTTP method via
41
- * {@link ROUTE_FILENAME_TO_METHOD}. Files whose name doesn't match a
42
- * known method (e.g. `helpers.ts`, `_middleware.ts`) are silently
43
- * skipped — they're treated as colocated implementation detail.
44
- * - Directory `[param]` becomes `{param}` in the API path and `param`
45
- * in the slug. Plain directories appear verbatim in both.
46
- * - Test/spec/declaration files (`*.test.ts`, `*.spec.ts`, `*.d.ts`)
47
- * are skipped.
48
- *
49
- * Exported so unit tests can assert the convention without spinning up a
50
- * full CDK stack, and so external tooling can reuse it.
51
- */
52
- export declare function discoverRouteFiles(routesDir: string): DiscoveredRoute[];
53
- /**
54
- * Map a route slug to a nested-stack slot index in `[0, numSlots)`.
55
- * `numSlots` MUST be a power of two so the bitwise-AND modulo
56
- * distributes the hash output evenly. Exported for unit tests
57
- * asserting bucketing stability across route-set changes.
58
- */
59
- export declare function stableSlotFor(slug: string, numSlots: number): number;
60
- export interface VentureStackProps extends cdk.StackProps {
61
- projectName: string;
62
- stage: string;
63
- routesDir: string;
64
- /** Directory containing standalone Lambda functions */
65
- functionsDir?: string;
66
- /** Directory containing queue consumer handlers */
67
- queuesDir?: string;
68
- /** Directory containing cron/scheduled task handlers */
69
- cronsDir?: string;
70
- infrastructure?: VentureIntent;
71
- projectDir: string;
72
- /** Preset name — when 'free', uses only free-tier AWS resources */
73
- preset?: string;
74
- /**
75
- * Pinned `@venturekit/cli` + `@venturekit/data` version installed by the
76
- * in-VPC CodeBuild migration runner. Resolved by `cdk-bridge.ts` from the
77
- * consumer's `node_modules/@venturekit/cli/package.json` so build-time
78
- * behavior matches what the operator tested locally. Falls back to
79
- * `'latest'` when unknown (warned at synth time).
80
- */
81
- vkCliVersion?: string;
82
- /**
83
- * Fully resolved environment configuration from presets + user overrides.
84
- * When provided, all resource sizing is driven by this config.
85
- * When absent, falls back to legacy behavior using `preset` string.
86
- */
87
- envConfig?: EnvConfig;
88
- /**
89
- * @internal
90
- *
91
- * Tests-only escape hatch that swaps esbuild bundling for an inline
92
- * Lambda stub, so unit tests can synth a stack containing route /
93
- * function / queue / cron handlers without invoking esbuild. Never
94
- * set this in production CDK apps — the resulting Lambdas would
95
- * respond with the stub body, not your handler code.
96
- */
97
- _skipBundling?: boolean;
98
- }
99
- export declare class VentureStack extends cdk.Stack {
100
- readonly outputs: Record<string, cdk.CfnOutput>;
101
- /** Resolved environment configuration driving all resource sizing */
102
- private readonly envConfig;
103
- /** Data safety configuration for removal policies */
104
- private readonly dataSafetyConfig;
105
- /** Whether this is a free-tier deployment */
106
- private readonly isFreeTier;
107
- /** Standard tags applied to all taggable resources */
108
- private readonly standardTags;
109
- /**
110
- * Per-project HMAC secret used to sign internal Lambda-to-Lambda calls.
111
- * Auto-generated on first deploy and preserved across subsequent deploys by
112
- * CloudFormation. Injected as `VENTURE_INTERNAL_HMAC_SECRET` into every
113
- * Lambda function the stack creates, so `invoke()` callers and handler
114
- * receivers share the same key.
115
- */
116
- private readonly internalHmacSecret;
117
- /** Base environment variables applied to every VentureKit Lambda. */
118
- private readonly ventureBaseEnv;
119
- /** @internal — when true, all Lambda code uses an inline stub instead of Docker bundling. Tests only. */
120
- private readonly skipBundling;
121
- /**
122
- * Absolute path to the consumer project's root (the directory that
123
- * holds `package.json` + `node_modules`). Used as the bundling asset
124
- * root so esbuild can resolve handler imports against the project's
125
- * installed dependencies.
126
- */
127
- private readonly projectDir;
128
- /**
129
- * Cognito User Pools created by `createAuth`, kept around so the
130
- * shared Lambda execution role can be granted admin actions on them
131
- * once the role exists (the role is created later in the constructor,
132
- * after every infrastructure intent has been processed).
133
- */
134
- private readonly userPools;
135
- /**
136
- * Secrets Manager placeholders provisioned by `createAuth` for
137
- * `AuthIntent.federated` providers (Google / Facebook / Apple OAuth
138
- * client id + secret). Tracked so the shared Lambda role can be
139
- * granted `secretsmanager:GetSecretValue` on each one once the role
140
- * exists. The ARNs are also injected as
141
- * `COGNITO_FEDERATED_<PROVIDER>_SECRET_ARN` env vars on every Lambda.
142
- */
143
- private readonly federatedAuthSecrets;
144
- /**
145
- * S3 buckets created by `createStorage`, kept around so the shared
146
- * Lambda execution role can be granted `s3:Get*` / `s3:Put*` on them
147
- * once the role exists, and so the *first* bucket's name can be
148
- * injected as `VENTURE_STORAGE_BUCKET` for `createStorageClientFromEnv()`.
149
- * Without this wiring, every Lambda calling `@venturekit/storage` would
150
- * throw `Storage bucket not configured` at runtime even though the
151
- * bucket exists in CloudFormation.
152
- */
153
- private readonly storageBuckets;
154
- /**
155
- * Notify configurations created by `createNotify`. Tracked so the
156
- * shared Lambda role can be granted `ses:SendEmail` on the
157
- * configuration set + identity ARNs once the role exists, and so
158
- * env vars (`VENTURE_NOTIFY_FROM`, `VENTURE_NOTIFY_CONFIG_SET`, …)
159
- * land on every Lambda — `@venturekit/notify`'s
160
- * `createSesEmailProvider` reads them at cold start. Also drives
161
- * the auto-provisioning of dispatcher + bounce-handler Lambdas
162
- * after the rest of the stack is wired (we need the shared role
163
- * + VPC + SG to exist first).
164
- */
165
- private readonly notifyConfigs;
166
- /**
167
- * Absolute paths to `migrations/` directories shipped by installed
168
- * `@venturekit/*` packages (e.g. `@venturekit/notify`,
169
- * `@venturekit/auth`). Resolved once at the top of the constructor
170
- * via declarative `vk.migrations` discovery so `createDatabase` can
171
- * pass the merged list to `MigrationRunner` without re-walking
172
- * `node_modules` per database.
173
- *
174
- * Discovery mirrors the CLI side
175
- * (`@venturekit/cli`'s `discoverPackageMigrationDirs`) so a `vk deploy`
176
- * and a local `vk migrate` always materialize the same merged schema.
177
- * Empty when no installed venturekit package opts in via
178
- * `"vk": { "migrations": "<dir>" }` in its `package.json`.
179
- */
180
- private readonly packageMigrationsDirs;
181
- constructor(scope: Construct, id: string, props: VentureStackProps);
182
- /**
183
- * Well-Architected: Reliability — RDS with stable logical ID so preset
184
- * changes (e.g. nano→medium) perform an in-place instance class modify,
185
- * not a replacement. Data is preserved because the CloudFormation resource
186
- * identity stays the same.
187
- *
188
- * Well-Architected: Security — encrypted at rest, credentials in Secrets Manager
189
- * Well-Architected: Reliability — automated backups, optional multi-AZ
190
- * Well-Architected: Performance — instance type driven by intent.size
191
- * Well-Architected: Operational Excellence — auto minor version upgrades
192
- */
193
- private createDatabase;
194
- /**
195
- * Well-Architected: Security — block public access by default, SSE encryption
196
- * Well-Architected: Reliability — versioning for backups, dataSafety removal policy
197
- * Well-Architected: Cost — lifecycle rules for logs/backups to reduce storage cost
198
- * Well-Architected: Sustainability — intelligent tiering for infrequent access
199
- */
200
- private createStorage;
201
- /**
202
- * Well-Architected: Security — Cognito with advanced security features,
203
- * stable logical ID for safe preset upgrades.
204
- * Well-Architected: Reliability — dataSafety-driven removal policy
205
- */
206
- private createAuth;
207
- /**
208
- * Provision SES + outbox infrastructure for one `NotifyIntent`.
209
- *
210
- * Resources created here:
211
- * - One SES email or domain identity (drives DKIM + verified-from).
212
- * - One SES configuration set with an event destination publishing
213
- * bounce / complaint / delivery / open / click events to an
214
- * SNS topic.
215
- * - The SNS topic itself (`{project}-{stage}-notify-{id}-events`).
216
- * - A Secrets Manager secret for the WhatsApp Cloud API token,
217
- * when `'whatsapp'` is in `channels`. The value is left as a
218
- * placeholder; the operator pastes the Meta token after first
219
- * deploy via the AWS console (the secret rotation knob would be
220
- * a Phase 2 enhancement once token rotation is part of the API).
221
- * - When `domain` AND `hostedZoneId` are both set, Route53 CNAME
222
- * records for the three SES DKIM tokens, plus an MX + TXT record
223
- * on the MAIL FROM subdomain. Without `hostedZoneId`, the
224
- * records are emitted as stack outputs and the operator
225
- * publishes them manually.
226
- *
227
- * Resources NOT created here: dispatcher cron Lambda, bounce-handler
228
- * Lambda, IAM grants on the shared role. Those need the role + VPC
229
- * + SG which only exist later in the constructor — see
230
- * `provisionNotifyHandlers` below.
231
- */
232
- private createNotify;
233
- /**
234
- * Auto-provision the dispatcher cron Lambda + the bounce-handler
235
- * Lambda subscribed to the SES events SNS topic, for every notify
236
- * intent.
237
- *
238
- * Implementation notes:
239
- *
240
- * - The Lambdas import a stub shipped inside `@venturekit/notify`
241
- * (`runtime/dispatcher-stub.ts`, `runtime/bounce-handler-stub.ts`).
242
- * At synth time we copy the stub into the project's `.vk/` dir
243
- * alongside a generated `notify-client-import.ts` shim that
244
- * re-exports the consumer's `notify` instance from
245
- * `VENTURE_NOTIFY_CLIENT_MODULE` (default `src/lib/notify.ts`).
246
- * esbuild then bundles the whole closure into the Lambda — the
247
- * consumer's notify config + every provider + the @venturekit
248
- * runtime, all in one deploy artefact.
249
- *
250
- * - We re-use the shared Lambda role for these handlers. Permissions:
251
- * - SES + secrets grants are already attached above
252
- * (`provisionNotifyHandlers` is called from the same block).
253
- * - SNS topic subscription + invocation perms are added by CDK
254
- * when we wire `topic.addSubscription(LambdaSubscription)`.
255
- *
256
- * - VPC attachment: yes, when the project has a VPC. The dispatcher
257
- * needs DB access (Postgres outbox + preferences); the bounce
258
- * handler also writes `notification_event_log`.
259
- */
260
- private provisionNotifyHandlers;
261
- /**
262
- * Well-Architected: Reliability — DLQ by default, stable logical ID
263
- * Well-Architected: Security — encryption at rest with SQS managed keys
264
- * Well-Architected: Performance — visibility timeout derived from handler timeout
265
- */
266
- private createQueue;
267
- /**
268
- * Well-Architected: Security — VPC-only access, SG least-privilege
269
- * Well-Architected: Performance — cache node type driven by intent.size
270
- * Well-Architected: Reliability — encrypted in transit, snapshot retention for prod
271
- */
272
- private createCache;
273
- private createMonitoring;
274
- private createSecret;
275
- private createDomain;
276
- /**
277
- * Free-tier alternative to RDS: create a DynamoDB table.
278
- * DynamoDB offers 25 GB + 25 RCU/WCU in the always-free tier.
279
- *
280
- * Well-Architected: Security — encryption at rest (default)
281
- * Well-Architected: Reliability — PITR for strict dataSafety
282
- * Well-Architected: Cost — PAY_PER_REQUEST for unpredictable workloads
283
- */
284
- private createDynamoDBTable;
285
- /**
286
- * Free-tier rate limit table using DynamoDB (always-free tier).
287
- * Used by createDefaultRateLimiter() from @venturekit/runtime.
288
- */
289
- private createRateLimitTable;
290
- /**
291
- * Map ResourceSize to RDS instance type.
292
- * Uses Graviton (T4G) instances for cost efficiency.
293
- * Changing size triggers an in-place modify, NOT a replacement.
294
- */
295
- private sizeToInstanceType;
296
- /**
297
- * Map ResourceSize to ElastiCache node type.
298
- * Uses Graviton (T4G) instances for cost efficiency.
299
- * Changing size triggers an in-place modify, NOT a replacement.
300
- */
301
- private sizeToCacheNodeType;
302
- /**
303
- * Convert dataSafety config to CDK RemovalPolicy.
304
- * Well-Architected: Reliability — prevent accidental data loss.
305
- */
306
- private toRemovalPolicy;
307
- /**
308
- * Convert days to CDK logs.RetentionDays enum.
309
- * Well-Architected: Cost — don't over-retain logs.
310
- */
311
- private toLogRetention;
312
- /**
313
- * Resolve Lambda runtime from preset config.
314
- */
315
- private toLambdaRuntime;
316
- /**
317
- * Resolve Lambda architecture from preset config.
318
- */
319
- private toLambdaArchitecture;
320
- /**
321
- * Recursively discover function files under the functions directory.
322
- * Returns an array of { name, handlerFile } where name is the
323
- * dash-delimited path (e.g. `order/create-order.ts` → `order-create-order`).
324
- */
325
- private discoverFunctionFiles;
326
- /**
327
- * Build the `lambda.Code` for a handler file.
328
- *
329
- * Production path: bundle the handler in-process via esbuild's
330
- * synchronous API — see `bundleHandlerCodeWithEsbuild` for the
331
- * rationale (no Docker, native Node module resolution, sub-second
332
- * per handler).
333
- *
334
- * Test path (`_skipBundling: true`): return an inline stub so unit
335
- * tests can synth Lambdas without invoking esbuild.
336
- */
337
- private bundleHandlerCode;
338
- /**
339
- * Create one Lambda + HTTP API integration + HttpRoute for a discovered
340
- * route file.
341
- *
342
- * Function name: `{project}-{stage}-route-{slug}`. Lambda function names
343
- * are capped at 64 chars; we truncate + append a 6-char content hash if
344
- * the full name overflows so deeply nested routes
345
- * (e.g. `promoter/groups/[id]/images/[imageId]/delete.ts`) still fit.
346
- *
347
- * Well-Architected: Performance — memory/timeout from preset config
348
- * Well-Architected: Sustainability — ARM64 Graviton by default
349
- * Well-Architected: Reliability — VPC-attached when DBs exist so routes
350
- * can reach RDS without timing out at the API Gateway 30 s deadline
351
- * Well-Architected: Cost — shared role + SG across all route Lambdas
352
- * keeps CFN resource count linear in the number of routes
353
- */
354
- private createRouteFunction;
355
- /**
356
- * Tiny non-cryptographic 6-char hex hash. Used only to disambiguate
357
- * Lambda function names that would otherwise overflow the 64-char
358
- * limit; collision risk is acceptable because the truncated prefix
359
- * already encodes most of the route path.
360
- */
361
- private shortHash;
362
- /**
363
- * Create a standalone Lambda function.
364
- * Naming convention: {project}-{stage}-fn-{name}
365
- *
366
- * Well-Architected: Performance — memory/timeout from preset config
367
- * Well-Architected: Sustainability — ARM64 Graviton by default
368
- * Well-Architected: Operational Excellence — structured env vars, log retention from preset
369
- * Well-Architected: Security — X-Ray tracing from preset config
370
- */
371
- private createStandaloneFunction;
372
- /**
373
- * Create a queue consumer Lambda function wired to an SQS queue.
374
- * Naming convention: {project}-{stage}-queue-{name}
375
- *
376
- * Well-Architected: Reliability — DLQ on consumer queue, encrypted
377
- * Well-Architected: Performance — batch size and visibility timeout
378
- */
379
- private createQueueConsumer;
380
- /**
381
- * Create a cron/scheduled task Lambda function wired to an EventBridge rule.
382
- * Naming convention: {project}-{stage}-cron-{name}
383
- *
384
- * Well-Architected: Performance — memory/timeout from preset
385
- * Well-Architected: Operational Excellence — log retention, tracing from preset
386
- */
387
- private createCronHandler;
388
- }
389
- //# sourceMappingURL=stack.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"stack.d.ts","sourceRoot":"","sources":["../../src/cdk/stack.ts"],"names":[],"mappings":"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"}