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 * as api from 'aws-cdk-lib/aws-apigateway';
import * as rds from 'aws-cdk-lib/aws-rds';
import * as logs from 'aws-cdk-lib/aws-logs';
import { propertyInjectable } from 'aws-cdk-lib/core/lib/prop-injectable';
import { InjectionContext, IPropertyInjector, PropertyInjectors } from 'aws-cdk-lib/core';
import {
  Annotations,
  ArnFormat,
  App,
  Aspects,
  AspectApplication,
  AspectPriority,
  Aws,
  CfnCondition,
  CfnDynamicReference,
  CfnDynamicReferenceService,
  CfnInclude,
  CfnJson,
  CfnMapping,
  CfnOutput,
  CfnParameter,
  CfnResource,
  CfnResourceProps,
  ConstructSelector,
  CustomResource,
  CustomResourceProvider,
  CustomResourceProviderRuntime,
  DefaultStackSynthesizer,
  Duration,
  Bitrate,
  Fn,
  IAspect,
  ITaggable,
  PermissionsBoundary,
  RemovalPolicy,
  RemovalPolicies,
  Mixin,
  Mixins,
  MissingRemovalPolicies,
  Resource,
  SecretValue,
  Size,
  SizeRoundingBehavior,
  Stack,
  StackProps,
  Stage,
  TagManager,
  TagType,
  Tags,
  Token,
} from 'aws-cdk-lib';
import {
  IConstruct,
  IMixin,
  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 MyAspect implements IAspect {
  visit(node: IConstruct) {}
}

class MyMixin extends Mixin {
  supports(_construct: IConstruct): boolean { return true; }
  applyTo(_construct: IConstruct): void { }
}

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

    /// here
  }
}
