Multi-Stack Projects
chant supports splitting resources across multiple stacks with automatic cross-stack reference resolution.
When resources in different stacks reference each other, chant generates cross-stack outputs and imports using the appropriate provider-specific mechanism.
Child projects (nested stacks)
Section titled “Child projects (nested stacks)”chant supports child projects — subdirectories that build to separate, independently-valid templates. The parent references a child project via a lexicon-specific function, and cross-stack outputs are declared explicitly with stackOutput().
For example, the AWS lexicon’s nestedStack() function references a child project directory and produces separate CloudFormation child templates:
src/ app.ts # parent resources network/ # ← child project vpc.ts # child resources outputs.ts # stackOutput() declarations/** * Cross-stack outputs — values the parent can reference */
import { stackOutput } from "@intentius/chant";import { vpc, subnet } from "./vpc";import { lambdaSg } from "./security";
export const vpcId = stackOutput(vpc.VpcId, { description: "VPC ID",});export const subnetId = stackOutput(subnet.SubnetId, { description: "Public subnet ID",});export const lambdaSgId = stackOutput(lambdaSg.GroupId, { description: "Lambda security group ID",});/** * App layer — Lambda function in the parent template that references * the network nested stack's outputs via cross-stack references */
import { Function, Sub, AWS, Ref, nestedStack } from "@intentius/chant-lexicon-aws";
// nestedStack() references a child project directoryconst network = nestedStack("network", import.meta.dirname + "/network", { parameters: { Environment: "prod" },});
export const handler = new Function({ FunctionName: Sub`${AWS.StackName}-handler`, Runtime: "nodejs20.x", Handler: "index.handler", Role: Ref("LambdaExecutionRole"), Code: { ZipFile: "exports.handler = async () => ({ statusCode: 200 });" }, VpcConfig: { SubnetIds: [network.outputs.subnetId], SecurityGroupIds: [network.outputs.lambdaSgId], },});
// Re-export so discovery picks it up as an entityexport { network };The child can be built independently (chant build src/network/), and the parent build produces multiple template files. See your lexicon’s documentation for details — for AWS, see the Nested Stacks guide.
For details on how multi-stack serialization works, see Multi-Stack Output.