diff --git a/examples/alb/index.ts b/examples/alb/index.ts index 78d95c62..22af2cbe 100644 --- a/examples/alb/index.ts +++ b/examples/alb/index.ts @@ -3,24 +3,23 @@ import * as ec2 from 'aws-cdk-lib/aws-ec2'; import * as elbv2 from 'aws-cdk-lib/aws-elasticloadbalancingv2'; import * as pulumi from '@pulumi/pulumi'; import * as pulumicdk from '@pulumi/cdk'; +import { CfnOutput } from 'aws-cdk-lib'; class AlbStack extends pulumicdk.Stack { url: pulumi.Output; - constructor(id: string, options?: pulumicdk.StackOptions) { - super(id, options); - // necessary for local testing - const t = this as any; + constructor(app: pulumicdk.App, id: string) { + super(app, id); - const vpc = new ec2.Vpc(t, 'VPC'); + const vpc = new ec2.Vpc(this, 'VPC'); - const asg = new autoscaling.AutoScalingGroup(t, 'ASG', { + const asg = new autoscaling.AutoScalingGroup(this, 'ASG', { vpc, instanceType: ec2.InstanceType.of(ec2.InstanceClass.T2, ec2.InstanceSize.MICRO), machineImage: new ec2.AmazonLinuxImage(), }); - const lb = new elbv2.ApplicationLoadBalancer(t, 'LB', { + const lb = new elbv2.ApplicationLoadBalancer(this, 'LB', { vpc, internetFacing: true, }); @@ -45,10 +44,18 @@ class AlbStack extends pulumicdk.Stack { }); this.url = this.asOutput(lb.loadBalancerDnsName); + } +} - this.synth(); +class MyApp extends pulumicdk.App { + constructor() { + super('app', (scope: pulumicdk.App): pulumicdk.AppOutputs => { + const stack = new AlbStack(scope, 'teststack'); + return { url: stack.url }; + }); } } -const stack = new AlbStack('teststack'); -export const url = stack.url; +const app = new MyApp(); + +export const url = app.outputs['url']; diff --git a/examples/api-websocket-lambda-dynamodb/index.ts b/examples/api-websocket-lambda-dynamodb/index.ts index 3ee11bff..3eabb1ac 100644 --- a/examples/api-websocket-lambda-dynamodb/index.ts +++ b/examples/api-websocket-lambda-dynamodb/index.ts @@ -10,8 +10,8 @@ import { LogGroup, RetentionDays } from 'aws-cdk-lib/aws-logs'; class ChatAppStack extends pulumicdk.Stack { public readonly url: Output; public readonly table: Output; - constructor(id: string) { - super(id); + constructor(app: pulumicdk.App, id: string) { + super(app, id); // initialise api const name = id + '-api'; @@ -93,11 +93,21 @@ class ChatAppStack extends pulumicdk.Stack { this.table = this.asOutput(table.tableName); this.url = this.asOutput(stage.url); + } +} - this.synth(); +class MyApp extends pulumicdk.App { + constructor() { + super('app', (scope: pulumicdk.App): pulumicdk.AppOutputs => { + const stack = new ChatAppStack(scope, 'chat-app'); + return { + url: stack.url, + table: stack.table, + }; + }); } } -const stack = new ChatAppStack('chat-app'); -export const url = stack.url; -export const table = stack.table; +const app = new MyApp(); +export const url = app.outputs['url']; +export const table = app.outputs['table']; diff --git a/examples/apprunner/index.ts b/examples/apprunner/index.ts index 2777ca17..958aafab 100644 --- a/examples/apprunner/index.ts +++ b/examples/apprunner/index.ts @@ -1,15 +1,12 @@ -import * as ecs from 'aws-cdk-lib/aws-ecs'; import * as pulumi from '@pulumi/pulumi'; import * as pulumicdk from '@pulumi/cdk'; -import { Construct } from 'constructs'; import { Service, Source } from '@aws-cdk/aws-apprunner-alpha'; -import { CfnOutput } from 'aws-cdk-lib'; class AppRunnerStack extends pulumicdk.Stack { url: pulumi.Output; - constructor(id: string) { - super(id); + constructor(app: pulumicdk.App, id: string) { + super(app, id); const service = new Service(this, 'service', { source: Source.fromEcrPublic({ @@ -19,10 +16,17 @@ class AppRunnerStack extends pulumicdk.Stack { }); this.url = this.asOutput(service.serviceUrl); + } +} - this.synth(); +class MyApp extends pulumicdk.App { + constructor() { + super('app', (scope: pulumicdk.App): pulumicdk.AppOutputs => { + const stack = new AppRunnerStack(scope, 'teststack'); + return { url: stack.url }; + }); } } -const stack = new AppRunnerStack('teststack'); -export const url = stack.url; +const app = new MyApp(); +export const url = app.outputs['url']; diff --git a/examples/appsvc/index.ts b/examples/appsvc/index.ts index 6c010313..fb752c31 100644 --- a/examples/appsvc/index.ts +++ b/examples/appsvc/index.ts @@ -20,8 +20,8 @@ const azs = aws.getAvailabilityZonesOutput({ class ClusterStack extends pulumicdk.Stack { serviceName: pulumi.Output; - constructor(name: string) { - super(name); + constructor(app: pulumicdk.App, name: string) { + super(app, name); const vpc = ec2.Vpc.fromVpcAttributes(this, 'Vpc', { vpcId: pulumicdk.asString(defaultVpc.id), @@ -80,11 +80,18 @@ class ClusterStack extends pulumicdk.Stack { ], }); - this.synth(); - this.serviceName = this.asOutput(service.serviceName); } } -const stack = new ClusterStack('teststack'); -export const serviceName = stack.serviceName; +class MyApp extends pulumicdk.App { + constructor() { + super('app', (scope: pulumicdk.App): pulumicdk.AppOutputs => { + const stack = new ClusterStack(scope, 'teststack'); + return { serviceName: stack.serviceName }; + }); + } +} + +const app = new MyApp(); +export const serviceName = app.outputs['serviceName']; diff --git a/examples/cron-lambda/index.ts b/examples/cron-lambda/index.ts index 644fe821..1f16c520 100644 --- a/examples/cron-lambda/index.ts +++ b/examples/cron-lambda/index.ts @@ -9,8 +9,8 @@ import * as pulumicdk from '@pulumi/cdk'; class LambdaStack extends pulumicdk.Stack { lambdaArn: pulumi.Output; - constructor(id: string, options?: pulumicdk.StackOptions) { - super(id, options); + constructor(app: pulumicdk.App, id: string) { + super(app, id); // Use the AWS CDK Lambda Function API directly. const lambdaFn = new aws_lambda.Function(this, 'lambda', { @@ -31,10 +31,17 @@ class LambdaStack extends pulumicdk.Stack { // Export the Lambda function's ARN as an output. this.lambdaArn = this.asOutput(lambdaFn.functionArn); + } +} - this.synth(); +class MyApp extends pulumicdk.App { + constructor() { + super('app', (scope: pulumicdk.App): pulumicdk.AppOutputs => { + const stack = new LambdaStack(scope, 'teststack'); + return { lambdaArn: stack.lambdaArn }; + }); } } -const stack = new LambdaStack('teststack'); -export const lambdaArn = stack.lambdaArn; +const app = new MyApp(); +export const lambdaArn = app.outputs['lambdaArn']; diff --git a/examples/ec2-instance/index.ts b/examples/ec2-instance/index.ts index 613c2ebe..08274a42 100644 --- a/examples/ec2-instance/index.ts +++ b/examples/ec2-instance/index.ts @@ -6,8 +6,8 @@ import * as pulumicdk from '@pulumi/cdk'; import { Asset } from 'aws-cdk-lib/aws-s3-assets'; export class Ec2CdkStack extends pulumicdk.Stack { - constructor(id: string) { - super(id); + constructor(app: pulumicdk.App, id: string) { + super(app, id); // Create a Key Pair to be used with this EC2 Instance // Temporarily disabled since `cdk-ec2-key-pair` is not yet CDK v2 compatible @@ -80,12 +80,19 @@ export class Ec2CdkStack extends pulumicdk.Stack { new cdk.CfnOutput(this, 'ssh command', { value: 'ssh -i cdk-key.pem -o IdentitiesOnly=yes ec2-user@' + ec2Instance.instancePublicIp, }); + } +} - this.synth(); +class MyApp extends pulumicdk.App { + constructor() { + super('app', (scope: pulumicdk.App) => { + new Ec2CdkStack(scope, 'teststack'); + }); } } -const stack = new Ec2CdkStack('teststack'); -export const ipAddress = stack.outputs['IP Address']; -export const keyCommand = stack.outputs['Download Key Command']; -export const sshCommand = stack.outputs['sshCommand']; +const app = new MyApp(); + +export const ipAddress = app.outputs['IP Address']; +export const keyCommand = app.outputs['Download Key Command']; +export const sshCommand = app.outputs['sshCommand']; diff --git a/examples/ecscluster/Pulumi.yaml b/examples/ecscluster/Pulumi.yaml deleted file mode 100644 index 83e1803e..00000000 --- a/examples/ecscluster/Pulumi.yaml +++ /dev/null @@ -1,3 +0,0 @@ -name: pulumi-cdk-ecscluster -runtime: nodejs -description: ECS Cluster diff --git a/examples/ecscluster/index.ts b/examples/ecscluster/index.ts deleted file mode 100644 index fdc97b69..00000000 --- a/examples/ecscluster/index.ts +++ /dev/null @@ -1,34 +0,0 @@ -import * as ecs from 'aws-cdk-lib/aws-ecs'; -import * as pulumi from '@pulumi/pulumi'; -import * as pulumicdk from '@pulumi/cdk'; -import * as ec2 from 'aws-cdk-lib/aws-ec2'; -import * as pulumiaws from "@pulumi/aws-native"; - -class ECSClusterStack extends pulumicdk.Stack { - clusterArn: pulumi.Output; - - constructor(id: string, options?: pulumicdk.StackOptions) { - super(id, options); - - const vpc = ec2.Vpc.fromLookup(this, 'MyVpc', { - isDefault: true, - }) - const cluster = new ecs.Cluster(this, 'fargate-service-autoscaling', { vpc }); - - this.clusterArn = this.asOutput(cluster.clusterArn); - - this.synth(); - } -} - -export const clusterArn = pulumiaws.getAccountId().then(account => { - const stack = new ECSClusterStack('teststack', { - props: { - env: { - region: pulumiaws.config.region, - account: account.accountId, - } - } - }); - return stack.clusterArn; -}); diff --git a/examples/ecscluster/package.json b/examples/ecscluster/package.json deleted file mode 100644 index c226e7d6..00000000 --- a/examples/ecscluster/package.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "name": "pulumi-aws-cdk", - "devDependencies": { - "@types/node": "^10.0.0" - }, - "dependencies": { - "@pulumi/aws": "^4.6.0", - "@pulumi/aws-native": "^0.117.0", - "@pulumi/pulumi": "^3.0.0", - "aws-cdk-lib": "2.149.0", - "constructs": "^10.0.111", - "@pulumi/cdk": "^0.5.0" - } -} diff --git a/examples/ecscluster/tsconfig.json b/examples/ecscluster/tsconfig.json deleted file mode 100644 index c7c2de61..00000000 --- a/examples/ecscluster/tsconfig.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "compilerOptions": { - "strict": true, - "outDir": "bin", - "target": "es2016", - "module": "commonjs", - "moduleResolution": "node", - "sourceMap": true, - "experimentalDecorators": true, - "pretty": true, - "noFallthroughCasesInSwitch": true, - "noImplicitReturns": true, - "forceConsistentCasingInFileNames": true - }, - "files": [ - "index.ts" - ] -} diff --git a/examples/examples_nodejs_test.go b/examples/examples_nodejs_test.go index faa29c11..b13af422 100644 --- a/examples/examples_nodejs_test.go +++ b/examples/examples_nodejs_test.go @@ -34,15 +34,6 @@ func TestAppSvc(t *testing.T) { integration.ProgramTest(t, &test) } -func TestECSCluster(t *testing.T) { - test := getJSBaseOptions(t). - With(integration.ProgramTestOptions{ - Dir: filepath.Join(getCwd(t), "ecscluster"), - }) - - integration.ProgramTest(t, &test) -} - func TestAppRunner(t *testing.T) { test := getJSBaseOptions(t). With(integration.ProgramTestOptions{ @@ -102,6 +93,18 @@ func TestEC2Instance(t *testing.T) { integration.ProgramTest(t, &test) } +func TestLookups(t *testing.T) { + test := getJSBaseOptions(t). + With(integration.ProgramTestOptions{ + Dir: filepath.Join(getCwd(t), "lookups"), + Config: map[string]string{ + "zoneName": "coolcompany.io", + }, + }) + + integration.ProgramTest(t, &test) +} + func TestAPIWebsocketLambdaDynamoDB(t *testing.T) { test := getJSBaseOptions(t). With(integration.ProgramTestOptions{ diff --git a/examples/fargate/index.ts b/examples/fargate/index.ts index bcbc98cf..372bc81a 100644 --- a/examples/fargate/index.ts +++ b/examples/fargate/index.ts @@ -10,8 +10,8 @@ import { CfnTargetGroup } from 'aws-cdk-lib/aws-elasticloadbalancingv2'; class FargateStack extends pulumicdk.Stack { loadBalancerDNS: pulumi.Output; - constructor(id: string, options?: pulumicdk.StackOptions) { - super(id, options); + constructor(app: pulumicdk.App, id: string) { + super(app, id); // Create VPC and Fargate Cluster // NOTE: Limit AZs to avoid reaching resource quotas @@ -46,11 +46,17 @@ class FargateStack extends pulumicdk.Stack { }); this.loadBalancerDNS = this.asOutput(fargateService.loadBalancer.loadBalancerDnsName); + } +} - // Finalize the stack and deploy its resources. - this.synth(); +class MyApp extends pulumicdk.App { + constructor() { + super('app', (scope: pulumicdk.App): pulumicdk.AppOutputs => { + const stack = new FargateStack(scope, 'fargatestack'); + return { loadBalancerURL: stack.loadBalancerDNS }; + }); } } -const stack = new FargateStack('fargatestack'); -export const loadBalancerURL = stack.loadBalancerDNS; +const app = new MyApp(); +export const loadBalancerURL = app.outputs['loadBalancerURL']; diff --git a/examples/lookups/index.ts b/examples/lookups/index.ts index 765ccc09..fef0aed2 100644 --- a/examples/lookups/index.ts +++ b/examples/lookups/index.ts @@ -1,24 +1,24 @@ import * as pulumi from '@pulumi/pulumi'; -import { MockCallArgs, MockResourceArgs } from '@pulumi/pulumi/runtime'; -// import * as aws from '@pulumi/aws'; +import * as aws from '@pulumi/aws'; import * as pulumicdk from '@pulumi/cdk'; import * as native from '@pulumi/aws-native'; import * as ec2 from 'aws-cdk-lib/aws-ec2'; import { - aws_ec2, aws_elasticloadbalancingv2, aws_elasticloadbalancingv2_targets, - aws_kms, aws_route53, aws_route53_targets, CfnOutput, } from 'aws-cdk-lib'; +const config = new pulumi.Config(); +const zoneName = config.require('zoneName'); + export class Ec2CdkStack extends pulumicdk.Stack { constructor(app: pulumicdk.App, id: string) { super(app, id, { props: { - env: { region: process.env.AWS_REGION, account: process.env.AWS_ACCOUNT }, + env: { region: aws.config.region }, }, }); @@ -34,24 +34,23 @@ export class Ec2CdkStack extends pulumicdk.Stack { ], }); - // const ami = aws.ec2.getAmiOutput({ - // owners: ['amazon'], - // mostRecent: true, - // filters: [ - // { - // name: 'name', - // values: ['al2023-ami-2023.*.*.*.*-arm64'], - // }, - // ], - // }); - - const machineImage = new ec2.LookupMachineImage({ - name: 'al2023-ami-2023.*.*.*.*-arm64', + // use getAmiOutput to lookup the AMI instead of ec2.LookupMachineImage + const ami = aws.ec2.getAmiOutput({ + owners: ['amazon'], + mostRecent: true, + filters: [ + { + name: 'name', + values: ['al2023-ami-2023.*.*.*.*-arm64'], + }, + ], + }); + + const region = aws.config.requireRegion(); + const machineImage = ec2.MachineImage.genericLinux({ + [region]: pulumicdk.asString(ami.imageId), }); - // const machineImage = ec2.MachineImage.genericLinux({ - // 'us-east-2': pulumicdk.asString(ami.imageId), - // }); const instance = new ec2.Instance(this, 'Instance', { vpc, instanceType: ec2.InstanceType.of(ec2.InstanceClass.T4G, ec2.InstanceSize.MICRO), @@ -61,31 +60,38 @@ export class Ec2CdkStack extends pulumicdk.Stack { const lb = new aws_elasticloadbalancingv2.ApplicationLoadBalancer(this, 'lb', { vpc, }); + const listener = lb.addListener('http', { protocol: aws_elasticloadbalancingv2.ApplicationProtocol.HTTP, }); - listener.addTargets('instance', { + + const tg = listener.addTargets('instance', { protocol: aws_elasticloadbalancingv2.ApplicationProtocol.HTTP, targets: [new aws_elasticloadbalancingv2_targets.InstanceTarget(instance)], }); + // workaround for https://github.com/pulumi/pulumi-cdk/issues/62 + const cfnTargetGroup = tg.node.defaultChild as aws_elasticloadbalancingv2.CfnTargetGroup; + cfnTargetGroup.overrideLogicalId('LBListenerTG'); - // const zone = aws.route53.getZoneOutput( - // { - // name: 'pulumi-demos.net', - // }, - // { parent: app }, - // ); - // - // const hostedZone = aws_route53.HostedZone.fromHostedZoneAttributes(this, 'hosted-zone', { - // zoneName: pulumicdk.asString(zone.name), - // hostedZoneId: pulumicdk.asString(zone.zoneId), - // }); - // - // new aws_route53.AaaaRecord(this, 'record', { - // zone: hostedZone, - // target: aws_route53.RecordTarget.fromAlias(new aws_route53_targets.LoadBalancerTarget(lb)), - // }); + // use pulumi getZoneOutput and HostedZone.fromHostedZoneAttributes instead of HostedZone.fromLookup + const zone = aws.route53.getZoneOutput( + { + name: zoneName, + }, + { parent: app }, + ); + + const hostedZone = aws_route53.HostedZone.fromHostedZoneAttributes(this, 'hosted-zone', { + zoneName: pulumicdk.asString(zone.name), + hostedZoneId: pulumicdk.asString(zone.zoneId), + }); + + new aws_route53.AaaaRecord(this, 'record', { + zone: hostedZone, + target: aws_route53.RecordTarget.fromAlias(new aws_route53_targets.LoadBalancerTarget(lb)), + }); + // use pulumi native resources side-by-side with CDK resources new native.ssm.Parameter( 'instance-param', { @@ -106,10 +112,6 @@ export class Ec2CdkStack extends pulumicdk.Stack { new CfnOutput(this, 'instanceId', { value: instance.instanceId }); new CfnOutput(this, 'imageId', { value: machineImage.getImage(this).imageId }); } - - // get availabilityZones(): string[] { - // return ['us-east-2a', 'us-east-2b']; - // } } const app = new pulumicdk.App( @@ -118,30 +120,28 @@ const app = new pulumicdk.App( new Ec2CdkStack(scope, 'teststack'); }, { - // remapCloudControlResource(logicalId, typeName, props, options) { - // switch (typeName) { - // case 'AWS::Route53::RecordSet': - // return new aws.route53.Record(logicalId, { - // zoneId: props.HostedZoneId, - // aliases: [ - // { - // name: props.AliasTarget.DNSName, - // zoneId: props.AliasTarget.HostedZoneId, - // evaluateTargetHealth: props.AliasTarget.EvaluateTargetHealth, - // }, - // ], - // name: props.Name, - // type: props.Type, - // records: props.ResourceRecords, - // }); - // default: - // return undefined; - // } - // }, + remapCloudControlResource(logicalId, typeName, props, options) { + switch (typeName) { + case 'AWS::Route53::RecordSet': + return new aws.route53.Record(logicalId, { + zoneId: props.HostedZoneId, + aliases: [ + { + name: props.AliasTarget.DNSName, + zoneId: props.AliasTarget.HostedZoneId, + evaluateTargetHealth: props.AliasTarget.EvaluateTargetHealth ?? false, + }, + ], + name: props.Name, + type: props.Type, + records: props.ResourceRecords, + }); + default: + return undefined; + } + }, }, ); -// export const imageId = app.outputs.apply((output) => output['imageId']); -// export const instanceId = app.outputs.apply((output) => output['instanceId']); export const imageId = app.outputs['imageId']; export const instanceId = app.outputs['instanceId']; diff --git a/examples/s3-object-lambda/index.ts b/examples/s3-object-lambda/index.ts index 4754b8bb..0b661160 100644 --- a/examples/s3-object-lambda/index.ts +++ b/examples/s3-object-lambda/index.ts @@ -1,7 +1,19 @@ +import * as pulumi from '@pulumi/pulumi'; +import * as pulumicdk from '@pulumi/cdk'; +import type { AppOutputs } from '@pulumi/cdk'; import { S3ObjectLambdaStack } from './src/s3-object-lambda-stack'; -const s = new S3ObjectLambdaStack('stack'); -export const exampleBucketArn = s.exampleBucketArn; -export const objectLambdaArn = s.objectLambdaArn; -export const objectLambdaAccessPointArn = s.objectLambdaAccessPointArn; -export const objectLambdaAccessPointUrl = s.objectLambdaAccessPointUrl; +const app = new pulumicdk.App('app', (scope: pulumicdk.App): AppOutputs => { + const s = new S3ObjectLambdaStack(scope, 'stack'); + return { + exampleBucketArn: s.exampleBucketArn, + objectLambdaArn: s.objectLambdaArn, + objectLambdaAccessPointArn: s.objectLambdaAccessPointArn, + objectLambdaAccessPointUrl: s.objectLambdaAccessPointUrl, + }; +}); +export const exampleBucketArn = app.outputs['exampleBucketArn']; +export const objectLambdaArn = app.outputs['objectLambdaArn']; +export const objectLambdaAccessPointArn = app.outputs['objectLambdaAccessPointArn']; +export const objectLambdaAccessPointUrl = app.outputs['objectLambdaAccessPointUrl']; +export const bucketName = app.outputs['BucketName']; diff --git a/examples/s3-object-lambda/src/s3-object-lambda-stack.ts b/examples/s3-object-lambda/src/s3-object-lambda-stack.ts index 84398f3d..ccf009be 100644 --- a/examples/s3-object-lambda/src/s3-object-lambda-stack.ts +++ b/examples/s3-object-lambda/src/s3-object-lambda-stack.ts @@ -17,8 +17,8 @@ export class S3ObjectLambdaStack extends pulumicdk.Stack { objectLambdaAccessPointArn: pulumi.Output; objectLambdaAccessPointUrl: pulumi.Output; - constructor(id: string) { - super(id); + constructor(app: pulumicdk.App, id: string) { + super(app, id); const accessPoint = `arn:aws:s3:${cdk.Aws.REGION}:${cdk.Aws.ACCOUNT_ID}:accesspoint/${S3_ACCESS_POINT_NAME}`; @@ -108,13 +108,12 @@ export class S3ObjectLambdaStack extends pulumicdk.Stack { }, }); + new cdk.CfnOutput(this, 'BucketName', { value: bucket.bucketName }); this.exampleBucketArn = this.asOutput(bucket.bucketArn); this.objectLambdaArn = this.asOutput(retrieveTransformedObjectLambda.functionArn); this.objectLambdaAccessPointArn = this.asOutput(objectLambdaAP.attrArn); this.objectLambdaAccessPointUrl = this.asOutput( `https://console.aws.amazon.com/s3/olap/${cdk.Aws.ACCOUNT_ID}/${OBJECT_LAMBDA_ACCESS_POINT_NAME}?region=${cdk.Aws.REGION}`, ); - - this.synth(); } } diff --git a/src/stack.ts b/src/stack.ts index 79b69c08..b3ed0fba 100644 --- a/src/stack.ts +++ b/src/stack.ts @@ -17,58 +17,29 @@ import * as pulumi from '@pulumi/pulumi'; import { AppComponent, AppOptions, PulumiStack } from './types'; import { AppConverter, StackConverter } from './converters/app-converter'; import { AwsCdkCli, ICloudAssemblyDirectoryProducer } from '@aws-cdk/cli-lib-alpha'; -import { MockCallArgs, MockMonitor, MockResourceArgs, setMocks } from '@pulumi/pulumi/runtime/mocks'; -import { setMockOptions } from '@pulumi/pulumi/runtime'; import { error } from '@pulumi/pulumi/log'; export type AppOutputs = { [outputId: string]: pulumi.Output }; const STACK_SYMBOL = Symbol.for('@pulumi/cdk.Stack'); export type create = (scope: App) => AppOutputs; -// setMocks( -// { -// call: async (args: MockCallArgs) => { -// return {}; -// }, -// newResource: async (args: MockResourceArgs) => { -// console.error(args.type); -// switch (args.type) { -// case 'cdk:index:App': -// return { id: 'app', state: { outputs: {} } }; -// case 'aws-native:ssm:Parameter': -// return { -// id: `${args.name}${Math.random()}`, -// state: { -// ...args.inputs, -// name: `${args.name}${Math.random()}`, -// id: `${args.name}${Math.random()}`, -// }, -// }; -// default: -// return { -// id: `${args.name}${Math.random()}`, -// state: { -// ...args.inputs, -// }, -// }; -// } -// }, -// }, -// pulumi.runtime.getProject(), -// pulumi.runtime.getStack(), -// pulumi.runtime.isDryRun(), -// ); export class App extends AppComponent implements ICloudAssemblyDirectoryProducer { public name: string; + /** + * + */ public assemblyDir!: string; - // /** @internal */ - converter: Promise; + /** @internal */ + public converter: Promise; private _app?: cdk.App; + /** + * @internal + */ public appOptions?: AppOptions; public get app(): cdk.App { @@ -82,12 +53,10 @@ export class App extends AppComponent implements ICloudAssemblyDir * The collection of outputs from the AWS CDK Stack represented as Pulumi Outputs. * Each CfnOutput defined in the AWS CDK Stack will populate a value in the outputs. */ - // public outputs: pulumi.Output<{ [outputId: string]: pulumi.Output }>; public outputs: { [outputId: string]: pulumi.Output } = {}; private readonly createFunc: (scope: App) => AppOutputs | void; private appProps?: cdk.AppProps; - // private stacks: pulumi.Output>; constructor(id: string, createFunc: (scope: App) => void | AppOutputs, props?: AppOptions) { super(id, props); @@ -131,6 +100,7 @@ export class App extends AppComponent implements ICloudAssemblyDir 'Context lookups have been disabled. Make sure all necessary context is already in "cdk.context.json". \n' + 'Missing context keys: ' + missingParts[1], + this, ); } else { error(e.message, this); @@ -160,6 +130,7 @@ export class App extends AppComponent implements ICloudAssemblyDir this.stacks[child.artifactId] = child; } }); + return app.synth().directory; } } @@ -219,6 +190,7 @@ export class Stack extends PulumiStack { constructor(app: App, name: string, options?: StackOptions) { super(app.app, name, options?.props); Object.defineProperty(this, STACK_SYMBOL, { value: true }); + this.pulumiApp = app; this.options = options;