import * as cfn from 'aws-cdk-lib/aws-cloudformation';
import * as cloudfront from 'aws-cdk-lib/aws-cloudfront';
import * as acm from 'aws-cdk-lib/aws-certificatemanager';
import * as appstream from 'aws-cdk-lib/aws-appstream';
import * as route53 from 'aws-cdk-lib/aws-route53';
import * as origins from 'aws-cdk-lib/aws-cloudfront-origins';
import * as customresources from 'aws-cdk-lib/custom-resources';
import * as iam from 'aws-cdk-lib/aws-iam';
import * as lambda from 'aws-cdk-lib/aws-lambda';
import * as sns from 'aws-cdk-lib/aws-sns';
import * as sqs from 'aws-cdk-lib/aws-sqs';
import * as s3 from 'aws-cdk-lib/aws-s3';
import {
  Annotations,
  ArnFormat,
  App,
  Aws,
  CfnCondition,
  CfnDynamicReference,
  CfnDynamicReferenceService,
  CfnInclude,
  CfnJson,
  CfnMapping,
  CfnOutput,
  CfnParameter,
  CfnResource,
  CfnResourceProps,
  CustomResource,
  CustomResourceProvider,
  CustomResourceProviderRuntime,
  DefaultStackSynthesizer,
  Duration,
  Fn,
  ITaggable,
  PermissionsBoundary,
  RemovalPolicy,
  Resource,
  SecretValue,
  Size,
  SizeRoundingBehavior,
  Stack,
  StackProps,
  Stage,
  TagManager,
  TagType,
  Token,
} from 'aws-cdk-lib';
import {
  IConstruct,
  Construct,
  DependencyGroup,
} from 'constructs';

declare const app: App;
declare const arn: 'arn:partition:service:region:account-id:resource-id';
declare const cfnResource: CfnResource;
declare const construct: Construct;
declare const constructA: Construct;
declare const constructB: Construct;
declare const constructC: Construct;
declare const functionProps: lambda.SingletonFunctionProps;
declare const isCompleteHandler: lambda.Function;
declare const myBucket: s3.IBucket;
declare const myFunction: lambda.IFunction;
declare const myTopic: sns.ITopic;
declare const onEventHandler: lambda.Function;
declare const resourceProps: CfnResourceProps;

declare class MyStack extends Stack {}
declare class YourStack extends Stack {}

class StackThatProvidesABucket extends Stack {
  public readonly bucket!: s3.IBucket;
}

interface StackThatExpectsABucketProps extends StackProps {
  readonly bucket: s3.IBucket;
}

class StackThatExpectsABucket extends Stack {
  constructor(scope: Construct, id: string, props: StackThatExpectsABucketProps) {
    super(scope, id, props);
  }
}

class fixture$construct extends Construct {
  public constructor(scope: Construct, id: string) {
    super(scope, id);

    /// here
  }
}
