import { Construct, IConstruct } from 'constructs';
import { Stack, App } from 'aws-cdk-lib/core';
import * as s3 from 'aws-cdk-lib/aws-s3';
import * as logs from 'aws-cdk-lib/aws-logs';
import * as lambda from 'aws-cdk-lib/aws-lambda';
import * as dynamodb from 'aws-cdk-lib/aws-dynamodb';
import * as cloudfront from 'aws-cdk-lib/aws-cloudfront';
import * as origins from 'aws-cdk-lib/aws-cloudfront-origins';
import * as iam from 'aws-cdk-lib/aws-iam';

import { Mixins, Mixin, IConstructSelector, Shims, Aspects } from 'aws-cdk-lib/core';
import { IMixin } from 'constructs';
import { IAspect } from 'aws-cdk-lib/core';
import { BucketAutoDeleteObjects, BucketBlockPublicAccess } from 'aws-cdk-lib/aws-s3/mixins';

declare const scope: Construct;
declare const stack: Stack;
declare const selector: IConstructSelector;

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

class CustomBucket extends Construct {}

class EnableBucketVersioning implements IAspect {
  visit(node: IConstruct): void {}
}

declare const bucketAccessLogsMixin: IMixin;
declare const bucket: s3.CfnBucket;
declare const queue: Construct;

interface MyEncryptionAtRestProps {
  bucketKey?: string;
  algorithm?: string;
}

function isKmsEncrypted(x: any): boolean {
  return true;
}

/// here
