diff --git a/src/assembly/manifest.ts b/src/assembly/manifest.ts index 479ee2d3..ebfaa2eb 100644 --- a/src/assembly/manifest.ts +++ b/src/assembly/manifest.ts @@ -2,11 +2,9 @@ import * as path from 'path'; import { AssemblyManifest, Manifest, ArtifactType, ArtifactMetadataEntryType } from '@aws-cdk/cloud-assembly-schema'; import * as fs from 'fs-extra'; import { CloudFormationTemplate } from '../cfn'; -import { ArtifactManifest, AssetManifestProperties, LogicalIdMetadataEntry } from 'aws-cdk-lib/cloud-assembly-schema'; -import { AssetManifest, DockerImageManifestEntry, FileManifestEntry } from 'cdk-assets'; +import { ArtifactManifest, LogicalIdMetadataEntry } from 'aws-cdk-lib/cloud-assembly-schema'; import { StackManifest } from './stack'; -import { ConstructTree, StackAsset, StackMetadata } from './types'; -import { warn } from '@pulumi/pulumi/log'; +import { ConstructTree, StackMetadata } from './types'; /** * Reads a Cloud Assembly manifest @@ -76,20 +74,18 @@ export class AssemblyManifestReader { const metadata = this.getMetadata(artifact); - const assets = this.getAssetsForStack(artifactId); if (!this.tree.children) { throw new Error('Invalid tree.json found'); } const stackTree = this.tree.children[artifactId]; - const stackManifest = new StackManifest( - this.directory, - artifactId, - templateFile, + const stackManifest = new StackManifest({ + id: artifactId, + templatePath: templateFile, metadata, - stackTree, + tree: stackTree, template, - assets, - ); + dependencies: artifact.dependencies ?? [], + }); this._stackManifests.set(artifactId, stackManifest); } } @@ -123,52 +119,4 @@ export class AssemblyManifestReader { public get stackManifests(): StackManifest[] { return Array.from(this._stackManifests.values()); } - - /** - * Return a list of assets for a given stack - * - * @param stackId - The artifactId of the stack to find assets for - * @returns a list of `StackAsset` for the given stack - */ - private getAssetsForStack(stackId: string): StackAsset[] { - const assets: (FileManifestEntry | DockerImageManifestEntry)[] = []; - for (const artifact of Object.values(this.manifest.artifacts ?? {})) { - if ( - artifact.type === ArtifactType.ASSET_MANIFEST && - (artifact.properties as AssetManifestProperties)?.file === `${stackId}.assets.json` - ) { - assets.push(...this.assetsFromAssetManifest(artifact)); - } - } - return assets; - } - - /** - * Get a list of assets from the asset manifest. - * - * @param artifact - An ArtifactManifest to extract individual assets from - * @returns a list of file and docker assets found in the manifest - */ - private assetsFromAssetManifest(artifact: ArtifactManifest): StackAsset[] { - const assets: (FileManifestEntry | DockerImageManifestEntry)[] = []; - const fileName = (artifact.properties as AssetManifestProperties).file; - const assetManifest = AssetManifest.fromFile(path.join(this.directory, fileName)); - assetManifest.entries.forEach((entry) => { - if (entry.type === 'file') { - const source = (entry as FileManifestEntry).source; - // This will ignore template assets - if (source.path && source.path.startsWith('asset.')) { - assets.push(entry as FileManifestEntry); - } - } else if (entry.type === 'docker-image') { - const source = (entry as DockerImageManifestEntry).source; - if (source.directory && source.directory.startsWith('asset.')) { - assets.push(entry as DockerImageManifestEntry); - } - } else { - warn(`found unexpected asset type: ${entry.type}`); - } - }); - return assets; - } } diff --git a/src/assembly/stack.ts b/src/assembly/stack.ts index 8c4abffd..9c91fc00 100644 --- a/src/assembly/stack.ts +++ b/src/assembly/stack.ts @@ -1,7 +1,7 @@ import * as path from 'path'; import { DestinationIdentifier, FileManifestEntry } from 'cdk-assets'; import { CloudFormationParameter, CloudFormationResource, CloudFormationTemplate } from '../cfn'; -import { ConstructTree, StackAsset, StackMetadata } from './types'; +import { ConstructTree, StackMetadata } from './types'; import { FileAssetPackaging, FileDestination } from 'aws-cdk-lib/cloud-assembly-schema'; /** @@ -41,6 +41,38 @@ export class FileAssetManifest { } } +export interface StackManifestProps { + /** + * The artifactId of the stack + */ + readonly id: string; + + /** + * The path to the CloudFormation template file within the assembly + */ + readonly templatePath: string; + + /** + * The StackMetadata for the stack + */ + readonly metadata: StackMetadata; + + /** + * The construct tree for the App + */ + readonly tree: ConstructTree; + + /** + * The actual CloudFormation template being processed + */ + readonly template: CloudFormationTemplate; + + /** + * A list of artifact ids that this stack depends on + */ + readonly dependencies: string[]; +} + /** * StackManifest represents a single Stack that needs to be converted * It contains all the necessary information for this library to fully convert @@ -81,42 +113,21 @@ export class StackManifest { * */ private readonly metadata: StackMetadata; - private readonly assets: StackAsset[]; - private readonly directory: string; - constructor( - directory: string, - id: string, - templatePath: string, - metadata: StackMetadata, - tree: ConstructTree, - template: CloudFormationTemplate, - assets: StackAsset[], - ) { - this.directory = directory; - this.assets = assets; - this.outputs = template.Outputs; - this.parameters = template.Parameters; - this.metadata = metadata; - this.templatePath = templatePath; - this.id = id; - this.constructTree = tree; - if (!template.Resources) { + public readonly dependencies: string[]; + constructor(props: StackManifestProps) { + this.dependencies = props.dependencies; + this.outputs = props.template.Outputs; + this.parameters = props.template.Parameters; + this.metadata = props.metadata; + this.templatePath = props.templatePath; + this.id = props.id; + this.constructTree = props.tree; + if (!props.template.Resources) { throw new Error('CloudFormation template has no resources!'); } - this.resources = template.Resources; + this.resources = props.template.Resources; } - public get fileAssets(): FileAssetManifest[] { - return this.assets - .filter((asset) => asset.type === 'file') - .flatMap((asset) => new FileAssetManifest(this.directory, asset)); - } - - // TODO: implement docker assets - // public get dockerAssets(): DockerAssetManifest[] { - // - // } - /** * Get the CloudFormation logicalId for the CFN resource at the given Construct path * diff --git a/src/converters/app-converter.ts b/src/converters/app-converter.ts index 6702ee1c..65cade6c 100644 --- a/src/converters/app-converter.ts +++ b/src/converters/app-converter.ts @@ -2,7 +2,7 @@ import * as pulumi from '@pulumi/pulumi'; import { AssemblyManifestReader, StackManifest } from '../assembly'; import { ConstructInfo, GraphBuilder } from '../graph'; import { StackComponentResource, lift, Mapping } from '../types'; -import { ArtifactConverter, FileAssetManifestConverter } from './artifact-converter'; +import { ArtifactConverter } from './artifact-converter'; import { CdkConstruct, ResourceMapping } from '../interop'; import { debug } from '@pulumi/pulumi/log'; import { @@ -35,30 +35,51 @@ export class AppConverter { } convert() { + const assetStackIds = this.host.dependencies.flatMap((dep) => dep.name); + const stackManifests: StackManifest[] = []; for (const stackManifest of this.manifestReader.stackManifests) { + // Don't process artifact manifests + if (assetStackIds.includes(stackManifest.id)) continue; + stackManifests.push(stackManifest); + const stackConverter = new StackConverter(this.host, stackManifest); this.stacks.set(stackManifest.id, stackConverter); - this.convertStackManifest(stackManifest); + } + + for (const stack of stackManifests) { + const done: { [artifactId: string]: StackConverter } = {}; + this.convertStackManifest(stack, done); } } - private convertStackManifest(artifact: StackManifest): void { - const dependencies = new Set(); - for (const file of artifact.fileAssets) { - const converter = new FileAssetManifestConverter(this.host, file); - converter.convert(); - dependencies.add(converter); + private convertStackManifest( + artifact: StackManifest, + done: { [artifactId: string]: StackConverter }, + ): StackConverter | undefined { + if (artifact.id in done) { + return done[artifact.id]; } - // TODO add docker asset converter - // for (const image of artifact.dockerAssets) { - // } + const dependencies = new Set(); + for (const d of artifact.dependencies) { + const converter = this.stacks.get(d); + if (!converter) { + throw new Error(`Could not convert artifact with id ${d}`); + } + const c = this.convertStackManifest(converter.stack, done); + if (c !== undefined) { + debug(`${artifact.id} depends on ${d}`); + dependencies.add(c); + } + } const stackConverter = this.stacks.get(artifact.id); if (!stackConverter) { throw new Error(`missing CDK Stack for artifact ${artifact.id}`); } stackConverter.convert(dependencies); + done[artifact.id] = stackConverter; + return stackConverter; } } @@ -70,7 +91,16 @@ export class StackConverter extends ArtifactConverter { readonly resources = new Map>(); readonly constructs = new Map(); - constructor(host: StackComponentResource, readonly stack: StackManifest) { + private _stackResource?: CdkConstruct; + + public get stackResource(): CdkConstruct { + if (!this._stackResource) { + throw new Error('StackConverter has no stack resource'); + } + return this._stackResource; + } + + constructor(private readonly host: StackComponentResource, readonly stack: StackManifest) { super(host); } @@ -84,11 +114,11 @@ export class StackConverter extends ArtifactConverter { for (const n of dependencyGraphNodes) { if (n.construct.id === this.stack.id) { - const stackResource = new CdkConstruct( + this._stackResource = new CdkConstruct( `${this.stackComponent.name}/${n.construct.path}`, n.construct.id, { - parent: this.stackComponent, + parent: this.stackComponent.component, // NOTE: Currently we make the stack depend on all the assets and then all resources // have the parent as the stack. This means we deploy all assets before we deploy any resources // we might be able better and have individual resources depend on individual assets, but CDK @@ -96,7 +126,7 @@ export class StackConverter extends ArtifactConverter { dependsOn: this.stackDependsOn(dependencies), }, ); - this.constructs.set(n.construct, stackResource); + this.constructs.set(n.construct, this._stackResource); continue; } @@ -147,12 +177,11 @@ export class StackConverter extends ArtifactConverter { private stackDependsOn(dependencies: Set): pulumi.Resource[] { const dependsOn: pulumi.Resource[] = []; + dependsOn.push(...this.host.dependencies); for (const d of dependencies) { - if (d instanceof FileAssetManifestConverter) { - this.resources.set(d.id, { resource: d.file, resourceType: d.resourceType }); - dependsOn.push(d.file); + if (d instanceof StackConverter) { + dependsOn.push(d.stackResource); } - // TODO: handle docker images } return dependsOn; } @@ -180,7 +209,7 @@ export class StackConverter extends ArtifactConverter { return key; } - this.parameters.set(logicalId, parameterValue(this.stackComponent)); + this.parameters.set(logicalId, parameterValue(this.stackComponent.component)); } private mapResource( @@ -341,15 +370,15 @@ export class StackConverter extends ArtifactConverter { switch (target) { case 'AWS::AccountId': - return getAccountId({ parent: this.stackComponent }).then((r) => r.accountId); + return getAccountId({ parent: this.stackComponent.component }).then((r) => r.accountId); case 'AWS::NoValue': return undefined; case 'AWS::Partition': - return getPartition({ parent: this.stackComponent }).then((p) => p.partition); + return getPartition({ parent: this.stackComponent.component }).then((p) => p.partition); case 'AWS::Region': - return getRegion({ parent: this.stackComponent }).then((r) => r.region); + return getRegion({ parent: this.stackComponent.component }).then((r) => r.region); case 'AWS::URLSuffix': - return getUrlSuffix({ parent: this.stackComponent }).then((r) => r.urlSuffix); + return getUrlSuffix({ parent: this.stackComponent.component }).then((r) => r.urlSuffix); case 'AWS::NotificationARNs': case 'AWS::StackId': case 'AWS::StackName': diff --git a/src/converters/artifact-converter.ts b/src/converters/artifact-converter.ts index 224b5a7c..0725ed0d 100644 --- a/src/converters/artifact-converter.ts +++ b/src/converters/artifact-converter.ts @@ -1,9 +1,5 @@ -import * as aws from '@pulumi/aws'; import * as cx from 'aws-cdk-lib/cx-api'; import { getAccountId, getPartition, getRegion } from '@pulumi/aws-native'; -import { FileAssetManifest } from '../assembly'; -import { FileAssetPackaging } from 'aws-cdk-lib/cloud-assembly-schema'; -import { zipDirectory } from '../zip'; import { StackComponentResource } from '../types'; /** @@ -22,70 +18,16 @@ export abstract class ArtifactConverter { const host = this.stackComponent; return cx.EnvironmentPlaceholders.replaceAsync(s, { async region(): Promise { - return getRegion({ parent: host }).then((r) => r.region); + return getRegion({ parent: host.component }).then((r) => r.region); }, async accountId(): Promise { - return getAccountId({ parent: host }).then((r) => r.accountId); + return getAccountId({ parent: host.component }).then((r) => r.accountId); }, async partition(): Promise { - return getPartition({ parent: host }).then((p) => p.partition); + return getPartition({ parent: host.component }).then((p) => p.partition); }, }); } } - -/** - * FileAssetManifestConverter handles converting CDK assets into Pulumi resources - */ -export class FileAssetManifestConverter extends ArtifactConverter { - private _file?: aws.s3.BucketObjectv2; - public _id?: string; - public resourceType: string = 'aws:s3:BucketObjectv2'; - - constructor(host: StackComponentResource, readonly manifest: FileAssetManifest) { - super(host); - } - - public get id(): string { - if (!this._id) { - throw new Error('must call convert before accessing file'); - } - return this._id; - } - - /** - * @returns the underlying bucket object pulumi resource - */ - public get file(): aws.s3.BucketObjectv2 { - if (!this._file) { - throw new Error('must call convert before accessing file'); - } - return this._file; - } - - /** - * Converts a CDK file asset into a Pulumi aws.s3.BucketObjectv2 resource - */ - public convert(): void { - const name = this.manifest.id.assetId; - const id = this.manifest.id.destinationId; - this._id = `${this.stackComponent.name}/${name}/${id}`; - - const outputPath = - this.manifest.packaging === FileAssetPackaging.FILE - ? Promise.resolve(this.manifest.path) - : zipDirectory(this.manifest.path, this.manifest.path + '.zip'); - - this._file = new aws.s3.BucketObjectv2( - this._id, - { - source: outputPath, - bucket: this.resolvePlaceholders(this.manifest.destination.bucketName), - key: this.resolvePlaceholders(this.manifest.destination.objectKey), - }, - { parent: this.stackComponent }, - ); - } -} diff --git a/src/interop.ts b/src/interop.ts index 63b94ec6..b903259d 100644 --- a/src/interop.ts +++ b/src/interop.ts @@ -14,11 +14,10 @@ import * as pulumi from '@pulumi/pulumi'; import { debug } from '@pulumi/pulumi/log'; -import { IConstruct } from 'constructs'; import { normalizeObject } from './pulumi-metadata'; import { toSdkName, typeToken } from './naming'; import { PulumiProvider } from './types'; -import { ConstructInfo, PulumiResourceType } from './graph'; +import { PulumiResourceType } from './graph'; export function firstToLower(str: string) { return str.replace(/\w\S*/g, function (txt) { @@ -90,7 +89,7 @@ export class CfnResource extends pulumi.CustomResource { } export class CdkConstruct extends pulumi.ComponentResource { - constructor(name: string, type?: PulumiResourceType, options?: pulumi.ComponentResourceOptions) { + constructor(public readonly name: PulumiResourceType, type?: string, options?: pulumi.ComponentResourceOptions) { const constructType = type ?? 'Construct'; const constructName = name; diff --git a/src/stack.ts b/src/stack.ts index b919748e..90fb7d79 100644 --- a/src/stack.ts +++ b/src/stack.ts @@ -17,7 +17,14 @@ import * as pulumi from '@pulumi/pulumi'; import { debug } from '@pulumi/pulumi/log'; import { StackComponentResource, StackOptions } from './types'; import { AppConverter, StackConverter } from './converters/app-converter'; +import { PulumiSynthesizer } from './synthesizer'; +import { CdkConstruct } from './interop'; +/** + * StackComponentResource is the underlying pulumi ComponentResource for each pulumicdk.Stack + * This exists because pulumicdk.Stack needs to extend cdk.Stack, but we also want it to represent a + * pulumi ComponentResource so we create this `StackComponentResource` to hold the pulumi logic + */ class StackComponent extends pulumi.ComponentResource implements StackComponentResource { /** @internal */ name: string; @@ -25,14 +32,32 @@ class StackComponent extends pulumi.ComponentResource implements StackComponentR /** @internal */ converter: AppConverter; - /** @internal */ - assemblyDir: string; + /** + * @internal + */ + readonly component: pulumi.ComponentResource; + + /** + * The directory to which cdk synthesizes the CloudAssembly + * @internal + */ + public assemblyDir: string; - options?: StackOptions; + /** + * Any stack options that are supplied by the user + * @internal + */ + public options?: StackOptions; + + /** + * @internal + */ + public dependencies: CdkConstruct[] = []; constructor(public readonly stack: Stack) { super('cdk:index:Stack', stack.node.id, {}, stack.options); this.options = stack.options; + this.dependencies.push(stack.pulumiSynthesizer.stagingStack); this.name = stack.node.id; @@ -46,6 +71,7 @@ class StackComponent extends pulumi.ComponentResource implements StackComponentR this.converter.convert(); this.registerOutputs(stack.outputs); + this.component = this; } /** @internal */ @@ -87,6 +113,11 @@ export class Stack extends cdk.Stack { resolveConverter!: (converter: StackConverter) => void; rejectConverter!: (error: any) => void; + /** + * @internal + */ + public readonly pulumiSynthesizer: PulumiSynthesizer; + /** * Create and register an AWS CDK stack deployed with Pulumi. * @@ -94,7 +125,14 @@ export class Stack extends cdk.Stack { * @param options A bag of options that control this resource's behavior. */ constructor(name: string, options?: StackOptions) { + const appId = options?.appId ?? generateAppId(); + + // TODO: allow the user to customize this https://github.com/pulumi/pulumi-cdk/issues/180 + const synthesizer = new PulumiSynthesizer({ + appId, + }); const app = new cdk.App({ + defaultStackSynthesizer: synthesizer, context: { // Ask CDK to attach 'aws:asset:*' metadata to resources in generated stack templates. Although this // metadata is not currently used, it may be useful in the future to map between assets and the @@ -110,6 +148,7 @@ export class Stack extends cdk.Stack { }); super(app, name, options?.props); + this.pulumiSynthesizer = synthesizer; this.app = app; this.options = options; @@ -177,3 +216,19 @@ function debugArtifact(artifact: cx.CloudArtifact): any { messages: artifact.messages, }; } + +/** + * Generate a unique app id based on the project and stack. We need some uniqueness + * in case multiple stacks/projects are deployed to the same AWS environment. + * + * This will be used in resource names (e.g. S3 Bucket names) so there + * are some limitations. + */ +function generateAppId(): string { + const stack = pulumi.runtime.getStack(); + const project = pulumi.runtime.getProject(); + return `${project}-${stack}` + .toLowerCase() + .replace(/[^a-z0-9-.]/g, '-') + .slice(-17); +} diff --git a/src/synthesizer.ts b/src/synthesizer.ts new file mode 100644 index 00000000..9a9be1eb --- /dev/null +++ b/src/synthesizer.ts @@ -0,0 +1,420 @@ +import * as path from 'path'; +import * as pulumi from '@pulumi/pulumi'; +import * as cdk from 'aws-cdk-lib/core'; +import { translateCfnTokenToAssetToken } from 'aws-cdk-lib/core/lib/helpers-internal'; +import * as aws from '@pulumi/aws'; +import { CdkConstruct } from './interop'; +import { zipDirectory } from './zip'; + +/** + * Deploy time assets will be put in this S3 bucket prefix + * so that separate lifecycle rules can apply + */ +const DEPLOY_TIME_PREFIX = 'deploy-time/'; + +export interface PulumiSynthesizerOptions { + /** + * A unique identifier for the application that the staging stack belongs to. + * + * This identifier will be used in the name of staging resources + * created for this application, and should be unique across CDK apps. + * + * The identifier should include lowercase characters, numbers, periods (.) and dashes ('-') only + * and have a maximum of 17 characters. + */ + readonly appId: string; + + /** + * Explicit name for the staging bucket + * + * @default - a well-known name unique to this app/env. + */ + readonly stagingBucketName?: string; + + /** + * The lifetime for deploy time file assets. + * + * Assets that are only necessary at deployment time (for instance, + * CloudFormation templates and Lambda source code bundles) will be + * automatically deleted after this many days. Assets that may be + * read from the staging bucket during your application's run time + * will not be deleted. + * + * Set this to the length of time you wish to be able to roll back to + * previous versions of your application without having to do a new + * `cdk synth` and re-upload of assets. + * + * @default - Duration.days(30) + */ + readonly deployTimeFileAssetLifetime?: cdk.Duration; + + /** + * Specify a custom prefix to be used as the staging stack name and + * construct ID. The prefix will be appended before the appId, which + * is required to be part of the stack name and construct ID to + * ensure uniqueness. + * + * @default 'staging-stack' + */ + readonly stagingStackNamePrefix?: string; + + /** + * Auto deletes objects in the staging S3 bucket and images in the + * staging ECR repositories. + * + * This will also delete the S3 buckets and ECR repositories themselves when + * all objects / images are removed. + * + * @default true + */ + readonly autoDeleteStagingAssets?: boolean; +} + +/** + * This is a custom synthesizer that determines how the CDK stack should be synthesized. + * + * In our case, since we can create Pulumi resources directly, we don't need a separate bootstrap step. + * This is very similar to how the AppStagingSynthesizer works, but is simpler because we don't need to + * manage/create a separate CDK stack to manage the resources. + * + * As CDK applications register assets this synthesizer will dynamically create the necessary staging + * resources and deploy the assets themselves. + * + * @see Recommended reading https://github.com/aws/aws-cdk/wiki/Security-And-Safety-Dev-Guide#controlling-the-permissions-used-by-cdk-deployments + * @see https://docs.aws.amazon.com/cdk/api/v2/docs/app-staging-synthesizer-alpha-readme.html + */ +export class PulumiSynthesizer extends cdk.StackSynthesizer implements cdk.IReusableStackSynthesizer { + /** + * The Pulumi ComponentResource wrapper which contains all of the + * staging resources. This can be added to the `dependsOn` of the main + * stack to ensure the staging assets are created first + */ + public readonly stagingStack: CdkConstruct; + + /** + * The app-scoped, environment-keyed staging bucket. + */ + public stagingBucket?: aws.s3.BucketV2; + + /** + * The app-scoped, environment-keyed ecr repositories associated with this app. + */ + public readonly stagingRepos: Record = {}; + + private readonly appId: string; + + /** + * A value to use as an override for the bucket name + */ + private readonly _stagingBucketName?: string; + private readonly autoDeleteStagingAssets: boolean; + + /** + * The final CDK name of the asset S3 bucket. This may contain CDK tokens + */ + private cdkBucketName?: string; + + /** + * The final Pulumi name of the asset S3 bucket + */ + private pulumiBucketName?: string | pulumi.Output; + + /** + * The region from the pulumi provider + */ + private readonly pulumiRegion: pulumi.Output; + + /** + * The account id from the pulumi provider + */ + private readonly pulumiAccount: pulumi.Output; + + /** + * The accountId which may contain CDK tokens + */ + private cdkAccount?: string; + + /** + * The region that may contain CDK tokens + */ + private cdkRegion?: string; + + /** + * The resources that any file assets need to depend on + */ + private readonly fileDependencies: pulumi.Resource[] = []; + + private readonly assetManifest = new cdk.AssetManifestBuilder(); + + /** + * The output directory which contains the asset files. + * Can be used to generate the absolute path to the asset + */ + private outdir?: string; + + constructor(props: PulumiSynthesizerOptions) { + super(); + const stackPrefix = props.stagingStackNamePrefix ?? 'staging-stack'; + this._stagingBucketName = props.stagingBucketName; + this.autoDeleteStagingAssets = props.autoDeleteStagingAssets ?? true; + this.appId = this.validateAppId(props.appId); + + // TODO: inherit the provider from the app component https://github.com/pulumi/pulumi-cdk/issues/181 + const account = aws.getCallerIdentity().then((id) => id.accountId); + this.pulumiAccount = pulumi.output(account); + const region = aws.getRegion().then((r) => r.name); + this.pulumiRegion = pulumi.output(region); + const id = `${stackPrefix}-${this.appId}`; + // create a wrapper component resource that we can depend on + this.stagingStack = new CdkConstruct(id, 'StagingStack', {}); + this.stagingStack.done(); + } + + private validateAppId(id: string) { + const errors = []; + if (id.length > 17) { + errors.push(`appId expected no more than 17 characters but got ${id.length} characters.`); + } + if (id !== id.toLocaleLowerCase()) { + errors.push('appId only accepts lowercase characters.'); + } + if (!/^[a-z0-9-.]*$/.test(id)) { + errors.push("appId expects only letters, numbers, periods ('.'), and dashes ('-')"); + } + + if (errors.length > 0) { + throw new Error([`appId ${id} has errors:`, ...errors].join('\n')); + } + return id; + } + + /** + * Create a S3 Bucket which will be used to store any file assets that are created in the + * CDK application. + */ + private getCreateBucket(): aws.s3.BucketV2 { + // The pulumi resources can use the actual output values for account/region + this.pulumiBucketName = + this._stagingBucketName ?? + pulumi.interpolate`pulumi-cdk-${this.appId}-staging-${this.pulumiAccount}-${this.pulumiRegion}`; + + if (!this.stagingBucket) { + this.stagingBucket = new aws.s3.BucketV2( + 'pulumi-cdk-staging-bucket', + { + bucket: this.pulumiBucketName, + forceDestroy: this.autoDeleteStagingAssets, + }, + { + retainOnDelete: !this.autoDeleteStagingAssets, + parent: this.stagingStack, + }, + ); + + const encryption = new aws.s3.BucketServerSideEncryptionConfigurationV2( + 'staging-bucket-encryption', + { + bucket: this.stagingBucket.bucket, + rules: [ + { + applyServerSideEncryptionByDefault: { + sseAlgorithm: 'AES256', + }, + }, + ], + }, + { parent: this.stagingStack }, + ); + + // Many AWS account safety checkers will complain when buckets aren't versioned + const versioning = new aws.s3.BucketVersioningV2( + 'staging-bucket-versioning', + { + bucket: this.stagingBucket.bucket, + versioningConfiguration: { + status: 'Enabled', + }, + }, + { parent: this.stagingStack }, + ); + + const lifecycle = new aws.s3.BucketLifecycleConfigurationV2( + 'staging-bucket-lifecycle', + { + bucket: this.stagingBucket.bucket, + rules: [ + { + // Objects should never be overwritten, but let's make sure we have a lifecycle policy + // for it anyway. + id: 'expire-old-versions', + noncurrentVersionExpiration: { + noncurrentDays: 365, + }, + status: 'Enabled', + }, + { + filter: { + prefix: 'deploy-time/', + }, + id: 'expire-deploy-time-objects', + expiration: { days: 30 }, + status: 'Enabled', + }, + ], + }, + { parent: this.stagingStack, dependsOn: [versioning] }, + ); + + // Many AWS account safety checkers will complain when SSL isn't enforced + const policyDoc = pulumi.jsonStringify({ + Version: '2012-10-17', + Id: 'require-ssl', + Statement: [ + { + Sid: 'ssl', + Action: ['s3:*'], + Condition: { + Bool: { + 'aws:SecureTransport': false, + }, + }, + Effect: 'Deny', + Principal: '*', + Resource: [this.stagingBucket.arn, pulumi.interpolate`${this.stagingBucket.arn}/*`], + }, + ], + }); + const policy = new aws.s3.BucketPolicy( + 'staging-bucket-policy', + { + bucket: this.stagingBucket.bucket, + policy: policyDoc, + }, + { parent: this.stagingStack }, + ); + this.fileDependencies.push(this.stagingBucket, encryption, versioning, lifecycle, policy); + } + return this.stagingBucket; + } + + /** + * Produce a bound Stack Synthesizer for the given stack. + * + * This method may be called more than once on the same object. + * + * NOTE: For our purposes we, we don't need to worry about calling this, + * it will automatically get called by the underlying CDK stack construct + * Also, we currently only support a single stack so we don't have to worry + * about this being created multiple times. If we change the way this library + * works and allow for multiple stacks we will have to revisit this + */ + public reusableBind(stack: cdk.Stack): cdk.IBoundStackSynthesizer { + // Create a copy of the current object and bind that + const copy = Object.create(this); + copy.bind(stack); + return copy; + } + + /** + * Bind to the stack this environment is going to be used on + * + * Must be called before any of the other methods are called. + * + * NOTE: For our purposes we, we don't need to worry about calling this, + * it will automatically get called by the underlying CDK stack construct + */ + public bind(stack: cdk.Stack) { + super.bind(stack); + const app = cdk.App.of(stack); + if (!cdk.App.isApp(app)) { + throw new Error(`Stack ${stack.stackName} must be created within an App`); + } + this.outdir = app.assetOutdir; + this.cdkRegion = stack.region; + this.cdkAccount = stack.account; + } + + /** + * This method is called by CDK constructs to add a file asset to the stack + * Usually the default synthesizers will then take the data and add it to the asset manifest + * for the stack. In our case we can just directly upload the files and then we don't have to + * later post-process the assets from the manifest + */ + public addFileAsset(asset: cdk.FileAssetSource): cdk.FileAssetLocation { + assertBound(this.cdkAccount); + assertBound(this.cdkRegion); + // The name that CDK uses needs to include CDK intrinsics so we use the CDK account/region + this.cdkBucketName = + this._stagingBucketName ?? `pulumi-cdk-${this.appId}-staging-${this.cdkAccount}-${this.cdkRegion}`; + if (asset.fileName === this.boundStack.templateFile) { + return this.cloudFormationLocationFromFileAsset( + this.assetManifest.defaultAddFileAsset(this.boundStack, asset, { + bucketName: translateCfnTokenToAssetToken(this.cdkBucketName), + bucketPrefix: asset.deployTime ? DEPLOY_TIME_PREFIX : undefined, + }), + ); + } + const stagingBucket = this.getCreateBucket(); + assertBound(this.outdir); + + if (asset.executable || !asset.fileName) { + throw new Error(`file assets produced by commands are not yet supported`); + } + + const location = this.assetManifest.defaultAddFileAsset(this.boundStack, asset, { + bucketName: translateCfnTokenToAssetToken(this.cdkBucketName), + bucketPrefix: asset.deployTime ? DEPLOY_TIME_PREFIX : undefined, + }); + + // Don't upload the CloudFormation template + if (asset.fileName !== this.boundStack.templateFile) { + const assetFile = path.join(this.outdir, asset.fileName); + const outputPath = + asset.packaging === cdk.FileAssetPackaging.ZIP_DIRECTORY + ? zipDirectory(assetFile, assetFile + '.zip') + : assetFile; + + new aws.s3.BucketObjectv2( + `${this.stagingStack.name}/${asset.sourceHash}`, + { + source: outputPath, + bucket: stagingBucket.bucket, + key: location.objectKey, + }, + { parent: this.stagingStack, dependsOn: this.fileDependencies }, + ); + } + return this.cloudFormationLocationFromFileAsset(location); + } + + addDockerImageAsset(asset: cdk.DockerImageAssetSource): cdk.DockerImageAssetLocation { + throw new Error('Docker image assets are not supported yet'); + } + + /** + * We synthesize the template and the asset manifest + */ + synthesize(session: cdk.ISynthesisSession): void { + const templateAssetSource = this.synthesizeTemplate(session); + const templateAsset = this.addFileAsset(templateAssetSource); + + // We still emit the asset manifest for debugging purposes + // but we don't register the dependency on the stack + this.assetManifest.emitManifest(this.boundStack, session); + + this.emitArtifact(session, { + stackTemplateAssetObjectUrl: templateAsset.s3ObjectUrlWithPlaceholders, + }); + } +} + +/** + * Throw an error message about binding() if we don't have a value for x. + * + * This replaces the ! assertions we would need everywhere otherwise. + */ +export function assertBound(x: A | undefined): asserts x is NonNullable { + if (x === null && x === undefined) { + throw new Error('You must call bindStack() first'); + } +} diff --git a/src/types.ts b/src/types.ts index 3c35ce45..9785ef7c 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1,6 +1,6 @@ import * as pulumi from '@pulumi/pulumi'; import { Stack, StackProps } from 'aws-cdk-lib/core'; -import { ResourceMapping } from './interop'; +import { CdkConstruct, ResourceMapping } from './interop'; /** * Options specific to the Stack component. */ @@ -10,6 +10,19 @@ export interface StackOptions extends pulumi.ComponentResourceOptions { */ props?: StackProps; + /** + * A unique identifier for the application that the asset staging stack belongs to. + * + * This identifier will be used in the name of staging resources + * created for this application, and should be unique across apps. + * + * The identifier should include lowercase characters, numbers, periods (.) and dashes ('-') only + * and have a maximum of 17 characters. + * + * @default - generated from the pulumi project and stack name + */ + appId?: string; + /** * Defines a mapping to override and/or provide an implementation for a CloudFormation resource * type that is not (yet) implemented in the AWS Cloud Control API (and thus not yet available in @@ -46,35 +59,49 @@ export enum PulumiProvider { * This exists because pulumicdk.Stack needs to extend cdk.Stack, but we also want it to represent a * pulumi ComponentResource so we create this `StackComponentResource` to hold the pulumi logic */ -export abstract class StackComponentResource extends pulumi.ComponentResource { - public abstract name: string; +export interface StackComponentResource { + /** + * The name of the component resource + * @internal + */ + name: string; /** * The directory to which cdk synthesizes the CloudAssembly + * @internal */ - public abstract assemblyDir: string; + assemblyDir: string; /** - * The Stack that creates this component + * The CDK stack associated with the component resource */ - public abstract stack: Stack; + readonly stack: Stack; /** * Any stack options that are supplied by the user * @internal */ - public abstract options?: StackOptions; + options?: StackOptions; /** - * Register pulumi outputs to the stack + * The Resources that the component resource depends on + * This will typically be the staging resources + * * @internal */ - abstract registerOutput(outputId: string, output: any): void; + readonly dependencies: CdkConstruct[]; - constructor(id: string, options?: pulumi.ComponentResourceOptions) { - super('cdk:index:Stack', id, {}, options); - } + /** + * @internal + */ + readonly component: pulumi.ComponentResource; + + /** + * @internal + */ + registerOutput(outputId: string, outupt: any): void; } + export type Mapping = { resource: T; resourceType: string; diff --git a/tests/assembly/manifest.test.ts b/tests/assembly/manifest.test.ts index 3b33dbbe..a935ee4b 100644 --- a/tests/assembly/manifest.test.ts +++ b/tests/assembly/manifest.test.ts @@ -134,9 +134,8 @@ describe('cloud assembly manifest reader', () => { const manifest = AssemblyManifestReader.fromDirectory(path.dirname(manifestFile)); expect(manifest.stackManifests[0]).toEqual({ - assets: expect.anything(), constructTree: { id: 'test-stack', path: 'test-stack' }, - directory: '/tmp/foo/bar/does/not/exist', + dependencies: [], id: 'test-stack', metadata: { 'test-stack/MyFunction1/Resource': 'MyFunction12A744C2E', @@ -150,18 +149,5 @@ describe('cloud assembly manifest reader', () => { }, templatePath: 'test-stack.template.json', }); - expect(manifest.stackManifests[0].fileAssets.length).toEqual(1); - expect(manifest.stackManifests[0].fileAssets[0]).toEqual({ - destination: { - bucketName: 'cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}', - objectKey: 'abe4e2f4fcc1aaaf53db4829c23a5cf08795d36cce0f68a3321c1c8d728fec44.zip', - }, - id: { - assetId: 'abe4e2f4fcc1aaaf53db4829c23a5cf08795d36cce0f68a3321c1c8d728fec44', - destinationId: 'current_account-current_region', - }, - packaging: 'zip', - path: '/tmp/foo/bar/does/not/exist/asset.abe4e2f4fcc1aaaf53db4829c23a5cf08795d36cce0f68a3321c1c8d728fec44', - }); }); }); diff --git a/tests/assembly/stack.test.ts b/tests/assembly/stack.test.ts index fd7d53ef..dda80d77 100644 --- a/tests/assembly/stack.test.ts +++ b/tests/assembly/stack.test.ts @@ -3,73 +3,29 @@ import { StackManifest } from '../../src/assembly'; describe('StackManifest', () => { test('Throws if template has no resources', () => { expect(() => { - new StackManifest('dir', 'id', 'path', {}, { id: 'id', path: 'path' }, {}, []); + new StackManifest({ + id: 'id', + templatePath: 'path', + metadata: {}, + tree: { id: 'id', path: 'path' }, + template: {}, + dependencies: [], + }); }).toThrow(/CloudFormation template has no resources/); }); - test('get file assets', () => { - const stack = new StackManifest( - 'dir', - 'id', - 'path', - {}, - { id: 'id', path: 'path' }, - { - Resources: { SomeResource: { Type: 'sometype', Properties: {} } }, - }, - [ - { - id: { - assetId: 'asset', - destinationId: 'dest', - }, - type: 'file', - source: { path: 'somepath' }, - destination: { objectKey: 'abc', bucketName: 'bucket' }, - genericSource: {}, - genericDestination: {}, - }, - { - id: { - assetId: 'asset2', - destinationId: 'dest2', - }, - type: 'docker-image', - source: {}, - destination: { imageTag: 'tag', repositoryName: 'repop' }, - genericSource: {}, - genericDestination: {}, - }, - ], - ); - expect(stack.fileAssets.length).toEqual(1); - expect(stack.fileAssets[0]).toEqual({ - destination: { - bucketName: 'bucket', - objectKey: 'abc', - }, - id: { - assetId: 'asset', - destinationId: 'dest', - }, - packaging: 'file', - path: 'dir/somepath', - }); - }); - test('can get logicalId for path', () => { - const stack = new StackManifest( - 'dir', - 'id', - 'path', - { + const stack = new StackManifest({ + id: 'id', + templatePath: 'path', + metadata: { 'stack/bucket': 'SomeBucket', }, - { + tree: { id: 'id', path: 'path', }, - { + template: { Resources: { SomeBucket: { Type: 'AWS::S3::Bucket', @@ -77,24 +33,23 @@ describe('StackManifest', () => { }, }, }, - [], - ); + dependencies: [], + }); expect(stack.logicalIdForPath('stack/bucket')).toEqual('SomeBucket'); }); test('can get resource for path', () => { - const stack = new StackManifest( - 'dir', - 'id', - 'path', - { + const stack = new StackManifest({ + id: 'id', + templatePath: 'path', + metadata: { 'stack/bucket': 'SomeBucket', }, - { + tree: { id: 'id', path: 'path', }, - { + template: { Resources: { SomeBucket: { Type: 'AWS::S3::Bucket', @@ -102,8 +57,8 @@ describe('StackManifest', () => { }, }, }, - [], - ); + dependencies: [], + }); expect(stack.resourceWithPath('stack/bucket')).toEqual({ Type: 'AWS::S3::Bucket', Properties: { Key: 'Value' }, @@ -111,18 +66,17 @@ describe('StackManifest', () => { }); test('can get resource for logicalId', () => { - const stack = new StackManifest( - 'dir', - 'id', - 'path', - { + const stack = new StackManifest({ + id: 'id', + templatePath: 'path', + metadata: { 'stack/bucket': 'SomeBucket', }, - { + tree: { id: 'id', path: 'path', }, - { + template: { Resources: { SomeBucket: { Type: 'AWS::S3::Bucket', @@ -130,8 +84,8 @@ describe('StackManifest', () => { }, }, }, - [], - ); + dependencies: [], + }); expect(stack.resourceWithLogicalId('SomeBucket')).toEqual({ Type: 'AWS::S3::Bucket', Properties: { Key: 'Value' }, diff --git a/tests/basic.test.ts b/tests/basic.test.ts index b911b481..3c788a02 100644 --- a/tests/basic.test.ts +++ b/tests/basic.test.ts @@ -11,52 +11,17 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. - import * as pulumi from '@pulumi/pulumi'; import * as s3 from 'aws-cdk-lib/aws-s3'; import { Stack } from '../src/stack'; import { Construct } from 'constructs'; import * as output from '../src/output'; -import { MockCallArgs, MockResourceArgs } from '@pulumi/pulumi/runtime'; - -function arn(service: string, type: string): string { - const [region, account] = service === 's3' ? ['', ''] : ['us-west-2', '123456789012']; - return `arn:aws:${service}:${region}:${account}:${type}`; -} - -function setMocks() { - pulumi.runtime.setMocks({ - call: (args: MockCallArgs) => { - return {}; - }, - newResource: (args: MockResourceArgs): { id: string; state: any } => { - switch (args.type) { - case 'cdk:index:Stack': - return { id: '', state: {} }; - case 'cdk:construct:TestStack': - return { id: '', state: {} }; - case 'cdk:construct:teststack': - return { id: '', state: {} }; - case 'cdk:index:Component': - return { id: '', state: {} }; - case 'cdk:construct:aws-cdk-lib/aws_s3:Bucket': - return { id: '', state: {} }; - case 'aws-native:s3:Bucket': - return { - id: args.name, - state: { - ...args.inputs, - arn: arn('s3', args.inputs['bucketName']), - }, - }; - default: - throw new Error(`unrecognized resource type ${args.type}`); - } - }, - }); -} +import { promiseOf, setMocks } from './mocks'; +import { ApplicationLoadBalancer } from 'aws-cdk-lib/aws-elasticloadbalancingv2'; +import { Vpc } from 'aws-cdk-lib/aws-ec2'; +import { aws_ssm } from 'aws-cdk-lib'; -function testStack(fn: (scope: Construct) => void, done: any) { +function testStack(id: string, fn: (scope: Construct) => void): Stack { class TestStack extends Stack { constructor(id: string) { super(id); @@ -67,24 +32,46 @@ function testStack(fn: (scope: Construct) => void, done: any) { } } - const s = new TestStack('teststack'); - s.urn.apply(() => done()); + const s = new TestStack(id); + return s; } +beforeAll(() => { + setMocks(); +}); + describe('Basic tests', () => { - beforeEach(() => { - setMocks(); - }); - test('Checking single resource registration', (done) => { - testStack((adapter) => { + test('Checking single resource registration', async () => { + const stack = testStack('test1', (adapter) => { new s3.Bucket(adapter, 'MyFirstBucket', { versioned: true }); - }, done); + }); + const urn = await promiseOf(stack.urn); + expect(urn).toEqual('urn:pulumi:stack::project::cdk:index:Stack::test1'); }); - test('Supports Output', (done) => { + test('Supports Output', async () => { const o = pulumi.output('the-bucket-name'); - testStack((adapter) => { + const stack = testStack('test2', (adapter) => { new s3.Bucket(adapter, 'MyFirstBucket', { bucketName: output.asString(o) }); - }, done); + }); + const urn = await promiseOf(stack.urn); + expect(urn).toEqual('urn:pulumi:stack::project::cdk:index:Stack::test2'); + }); + test('LoadBalancer dnsName attribute does not throw', async () => { + const stack = testStack('test3', (scope) => { + const vpc = new Vpc(scope, 'vpc'); + const alb = new ApplicationLoadBalancer(scope, 'alb', { + vpc, + }); + + new aws_ssm.StringParameter(scope, 'param', { + // Referencing the `dnsName` attribute of the LoadBalancer resource. + // This tests that the reference is correctly mapped, otherwise this test + // throws an error + stringValue: alb.loadBalancerDnsName, + }); + }); + const urn = await promiseOf(stack.urn); + expect(urn).toEqual('urn:pulumi:stack::project::cdk:index:Stack::test3'); }); }); diff --git a/tests/cdk-resource.test.ts b/tests/cdk-resource.test.ts index 436a0520..6e4ad78f 100644 --- a/tests/cdk-resource.test.ts +++ b/tests/cdk-resource.test.ts @@ -1,119 +1,18 @@ -import * as pulumi from '@pulumi/pulumi'; import * as dynamodb from 'aws-cdk-lib/aws-dynamodb'; import { TableArgs } from '@pulumi/aws-native/dynamodb'; -import { Stack } from '../src/stack'; -import { Construct } from 'constructs'; -import { MockCallArgs, MockResourceArgs } from '@pulumi/pulumi/runtime'; import { Key } from 'aws-cdk-lib/aws-kms'; -import { ApplicationLoadBalancer } from 'aws-cdk-lib/aws-elasticloadbalancingv2'; -import { Vpc } from 'aws-cdk-lib/aws-ec2'; -import { aws_ssm } from 'aws-cdk-lib'; - -function setMocks(assertFn: (args: MockResourceArgs) => void) { - pulumi.runtime.setMocks( - { - call: (_args: MockCallArgs) => { - return {}; - }, - newResource: (args: MockResourceArgs): { id: string; state: any } => { - switch (args.type) { - case 'cdk:index:Stack': - return { id: '', state: {} }; - case 'cdk:construct:TestStack': - return { id: '', state: {} }; - case 'cdk:index:Component': - return { id: '', state: {} }; - default: - assertFn(args); - return { - id: args.name + '_id', - state: args.inputs, - }; - } - }, - }, - 'project', - 'stack', - false, - ); -} - -function testStack(fn: (scope: Construct) => void, done: any) { - class TestStack extends Stack { - constructor(id: string) { - super(id, { - props: { - env: { - region: 'us-east-1', - account: '12345678912', - }, - }, - }); - - fn(this); - - this.synth(); - } - } - - const s = new TestStack('teststack'); - s.urn.apply(() => done()); -} +import { setMocks, testStack } from './mocks'; +import { MockResourceArgs } from '@pulumi/pulumi/runtime'; describe('CDK Construct tests', () => { // DynamoDB table was previously mapped to the `aws` provider // otherwise this level of testing wouldn't be necessary. // We also don't need to do this type of testing for _every_ resource - test('dynamodb table', (done) => { - setMocks((args) => { - if (args.type === 'aws-native:dynamodb:Table') { - expect(args.inputs).toEqual({ - keySchema: [ - { attributeName: 'pk', keyType: 'HASH' }, - { attributeName: 'sort', keyType: 'RANGE' }, - ], - sseSpecification: { - kmsMasterKeyId: 'arn:aws:kms:us-west-2:123456789012:key/abcdefg', - sseEnabled: true, - sseType: 'KMS', - }, - attributeDefinitions: [ - { attributeName: 'pk', attributeType: 'S' }, - { attributeName: 'sort', attributeType: 'S' }, - { attributeName: 'lsiSort', attributeType: 'S' }, - { attributeName: 'gsiKey', attributeType: 'S' }, - ], - provisionedThroughput: { - readCapacityUnits: 5, - writeCapacityUnits: 5, - }, - globalSecondaryIndexes: [ - { - provisionedThroughput: { - readCapacityUnits: 5, - writeCapacityUnits: 5, - }, - indexName: 'gsi', - keySchema: [{ attributeName: 'gsiKey', keyType: 'HASH' }], - projection: { - projectionType: 'ALL', - }, - }, - ], - localSecondaryIndexes: [ - { - projection: { projectionType: 'ALL' }, - keySchema: [ - { attributeName: 'pk', keyType: 'HASH' }, - { attributeName: 'lsiSort', keyType: 'RANGE' }, - ], - indexName: 'lsi', - }, - ], - } as TableArgs); - } - }); - testStack((scope) => { + test('dynamodb table', async () => { + const resources: MockResourceArgs[] = []; + setMocks(resources); + + await testStack((scope) => { const key = Key.fromKeyArn(scope, 'key', 'arn:aws:kms:us-west-2:123456789012:key/abcdefg'); const table = new dynamodb.Table(scope, 'Table', { encryption: dynamodb.TableEncryption.CUSTOMER_MANAGED, @@ -141,23 +40,53 @@ describe('CDK Construct tests', () => { type: dynamodb.AttributeType.STRING, }, }); - }, done); - }); - - test('LoadBalancer dnsName attribute does not throw', (done) => { - setMocks((_args) => {}); - testStack((scope) => { - const vpc = new Vpc(scope, 'vpc'); - const alb = new ApplicationLoadBalancer(scope, 'alb', { - vpc, - }); + }); - new aws_ssm.StringParameter(scope, 'param', { - // Referencing the `dnsName` attribute of the LoadBalancer resource. - // This tests that the reference is correctly mapped, otherwise this test - // throws an error - stringValue: alb.loadBalancerDnsName, - }); - }, done); + const db = resources.find((res) => res.type === 'aws-native:dynamodb:Table'); + expect(db).toBeDefined(); + expect(db!.inputs).toEqual({ + keySchema: [ + { attributeName: 'pk', keyType: 'HASH' }, + { attributeName: 'sort', keyType: 'RANGE' }, + ], + sseSpecification: { + kmsMasterKeyId: 'arn:aws:kms:us-west-2:123456789012:key/abcdefg', + sseEnabled: true, + sseType: 'KMS', + }, + attributeDefinitions: [ + { attributeName: 'pk', attributeType: 'S' }, + { attributeName: 'sort', attributeType: 'S' }, + { attributeName: 'lsiSort', attributeType: 'S' }, + { attributeName: 'gsiKey', attributeType: 'S' }, + ], + provisionedThroughput: { + readCapacityUnits: 5, + writeCapacityUnits: 5, + }, + globalSecondaryIndexes: [ + { + provisionedThroughput: { + readCapacityUnits: 5, + writeCapacityUnits: 5, + }, + indexName: 'gsi', + keySchema: [{ attributeName: 'gsiKey', keyType: 'HASH' }], + projection: { + projectionType: 'ALL', + }, + }, + ], + localSecondaryIndexes: [ + { + projection: { projectionType: 'ALL' }, + keySchema: [ + { attributeName: 'pk', keyType: 'HASH' }, + { attributeName: 'lsiSort', keyType: 'RANGE' }, + ], + indexName: 'lsi', + }, + ], + } as TableArgs); }); }); diff --git a/tests/converters/app-converter.test.ts b/tests/converters/app-converter.test.ts index b947d2a0..23377f20 100644 --- a/tests/converters/app-converter.test.ts +++ b/tests/converters/app-converter.test.ts @@ -4,63 +4,20 @@ import { StackComponentResource, StackOptions } from '../../src/types'; import * as path from 'path'; import * as mockfs from 'mock-fs'; import * as pulumi from '@pulumi/pulumi'; -import { MockCallArgs, MockResourceArgs } from '@pulumi/pulumi/runtime'; -import { Bucket, BucketPolicy } from '@pulumi/aws-native/s3'; +import { BucketPolicy } from '@pulumi/aws-native/s3'; import { createStackManifest } from '../utils'; +import { promiseOf, setMocks } from '../mocks'; +import { CdkConstruct } from '../../src/interop'; -// Convert a pulumi.Output to a promise of the same type. -function promiseOf(output: pulumi.Output): Promise { - return new Promise((resolve) => output.apply(resolve)); -} - -function setMocks() { - pulumi.runtime.setMocks( - { - call: (args: MockCallArgs): { [id: string]: any } => { - switch (args.token) { - case 'aws-native:index:getAccountId': - return { - accountId: '12345678910', - }; - case 'aws-native:index:getRegion': - return { - region: 'us-east-2', - }; - case 'aws-native:index:getPartition': - return { - partition: 'aws', - }; - case 'aws-native:index:getAzs': - return { - azs: ['us-east-1a', 'us-east-1b'], - }; - default: - return {}; - } - }, - newResource: (args: MockResourceArgs): { id: string; state: any } => { - return { - id: args.name + '_id', - state: { - ...args.inputs, - arn: args.name + '_arn', - }, - }; - }, - }, - 'project', - 'stack', - false, - ); -} - -class MockStackComponent extends StackComponentResource { +class MockStackComponent extends pulumi.ComponentResource implements StackComponentResource { public readonly name = 'stack'; public readonly assemblyDir: string; + component: pulumi.ComponentResource; public stack: Stack; public options?: StackOptions | undefined; + public dependencies: CdkConstruct[] = []; constructor(dir: string) { - super('stack'); + super('cdk:index:Stack', 'stack', {}, {}); this.assemblyDir = dir; this.registerOutputs(); } @@ -68,6 +25,10 @@ class MockStackComponent extends StackComponentResource { registerOutput(outputId: string, output: any): void {} } +beforeAll(() => { + setMocks(); +}); + describe('App Converter', () => { const manifestFile = '/tmp/foo/bar/does/not/exist/manifest.json'; const manifestStack = '/tmp/foo/bar/does/not/exist/test-stack.template.json'; @@ -215,7 +176,6 @@ describe('App Converter', () => { mockfs.restore(); }); test('can convert', async () => { - setMocks(); const mockStackComponent = new MockStackComponent('/tmp/foo/bar/does/not/exist'); const converter = new AppConverter(mockStackComponent); converter.convert(); @@ -229,7 +189,6 @@ describe('App Converter', () => { }); const urns = await Promise.all(urnPromises); expect(urns).toEqual([ - 'urn:pulumi:stack::project::cdk:index:Stack$aws:s3/bucketObjectv2:BucketObjectv2::stack/abe4e2f4fcc1aaaf53db4829c23a5cf08795d36cce0f68a3321c1c8d728fec44/current_account-current_region', createUrn('Bucket', 'examplebucketc9dfa43e'), createUrn('BucketPolicy', 'examplebucketPolicyE09B485E'), ]); @@ -285,7 +244,6 @@ describe('App Converter', () => { ])( 'intrinsics %s', async (_name, stackManifest, expected) => { - setMocks(); const mockStackComponent = new MockStackComponent('/tmp/foo/bar/does/not/exist'); const converter = new StackConverter(mockStackComponent, stackManifest); converter.convert(new Set()); diff --git a/tests/converters/artifact-converter.test.ts b/tests/converters/artifact-converter.test.ts deleted file mode 100644 index 8a8f039f..00000000 --- a/tests/converters/artifact-converter.test.ts +++ /dev/null @@ -1,100 +0,0 @@ -import { FileAssetPackaging, Stack } from 'aws-cdk-lib/core'; -import { FileAssetManifestConverter } from '../../src/converters/artifact-converter'; -import { StackComponentResource, StackOptions } from '../../src/types'; -import { FileAssetManifest } from '../../src/assembly'; -import * as pulumi from '@pulumi/pulumi'; -import { MockCallArgs, MockResourceArgs } from '@pulumi/pulumi/runtime'; - -function setMocks(assertFn: (args: MockResourceArgs) => void) { - pulumi.runtime.setMocks( - { - call: (args: MockCallArgs): { [id: string]: any } => { - switch (args.token) { - case 'aws-native:index:getAccountId': - return { - accountId: '12345678910', - }; - case 'aws-native:index:getRegion': - return { - region: 'us-east-2', - }; - case 'aws-native:index:getPartition': - return { - partition: 'aws', - }; - default: - return {}; - } - }, - newResource: (args: MockResourceArgs): { id: string; state: any } => { - switch (args.type) { - case 'cdk:index:stack': - return { id: '', state: {} }; - default: - assertFn(args); - return { - id: args.name + '_id', - state: args.inputs, - }; - } - }, - }, - 'project', - 'stack', - false, - ); -} - -class MockStackComponent extends StackComponentResource { - public readonly name = 'stack'; - public readonly assemblyDir: string = 'dir'; - public stack: Stack; - public options?: StackOptions | undefined; - constructor() { - super('stack'); - this.registerOutputs(); - } - - registerOutput(outputId: string, output: any): void {} -} - -describe('Artifact Converters', () => { - test('can convert file artifacts', (done) => { - setMocks((args) => { - if (args.type === 'aws:s3/bucketObjectv2:BucketObjectv2') { - expect(args.id).toEqual(''); - expect(args.name).toEqual( - 'stack/abe4e2f4fcc1aaaf53db4829c23a5cf08795d36cce0f68a3321c1c8d728fec44/current_account-current_region', - ); - expect(args.inputs).toEqual({ - bucket: 'cdk-hnb659fds-assets-12345678910-us-east-2', - key: 'abe4e2f4fcc1aaaf53db4829c23a5cf08795d36cce0f68a3321c1c8d728fec44', - source: 'dir/asset.abe4e2f4fcc1aaaf53db4829c23a5cf08795d36cce0f68a3321c1c8d728fec44', - }); - } - }); - const mockStackComponent = new MockStackComponent(); - const converter = new FileAssetManifestConverter( - mockStackComponent, - new FileAssetManifest('dir', { - genericDestination: undefined, - genericSource: undefined, - destination: { - bucketName: 'cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}', - objectKey: 'abe4e2f4fcc1aaaf53db4829c23a5cf08795d36cce0f68a3321c1c8d728fec44', - }, - source: { - path: 'asset.abe4e2f4fcc1aaaf53db4829c23a5cf08795d36cce0f68a3321c1c8d728fec44', - packaging: FileAssetPackaging.FILE, - }, - type: 'file', - id: { - destinationId: 'current_account-current_region', - assetId: 'abe4e2f4fcc1aaaf53db4829c23a5cf08795d36cce0f68a3321c1c8d728fec44', - }, - }), - ); - converter.convert(); - mockStackComponent.urn.apply(() => done()); - }); -}); diff --git a/tests/graph.test.ts b/tests/graph.test.ts index ab2c0cfc..42c72590 100644 --- a/tests/graph.test.ts +++ b/tests/graph.test.ts @@ -16,23 +16,26 @@ import { GraphBuilder, GraphNode } from '../src/graph'; import { StackManifest } from '../src/assembly'; import { createStackManifest } from './utils'; -describe('Graph tests', () => { +describe('GraphBuilder', () => { const nodes = GraphBuilder.build( - new StackManifest( - 'test', - 'stack', - 'test/stack', - { + new StackManifest({ + id: 'stack', + templatePath: 'test/stack', + metadata: { 'stack/example-bucket/Resource': 'examplebucketC9DFA43E', 'stack/example-bucket/Policy/Resource': 'examplebucketPolicyE09B485E', }, - { + tree: { path: 'stack', id: 'stack', children: { 'example-bucket': { id: 'example-bucket', path: 'stack/example-bucket', + constructInfo: { + fqn: 'aws-cdk-lib.aws_s3.Bucket', + version: '2.149.0', + }, children: { Resource: { id: 'Resource', @@ -67,10 +70,6 @@ describe('Graph tests', () => { }, }, }, - constructInfo: { - fqn: 'aws-cdk-lib.aws_s3.Bucket', - version: '2.149.0', - }, }, }, constructInfo: { @@ -78,7 +77,7 @@ describe('Graph tests', () => { version: '2.149.0', }, }, - { + template: { Resources: { examplebucketC9DFA43E: { Type: 'AWS::S3::Bucket', @@ -94,8 +93,8 @@ describe('Graph tests', () => { }, }, }, - [], - ), + dependencies: [], + }), ); test.each([ [ @@ -240,15 +239,14 @@ test('pulumi resource type name fallsback when fqn not available', () => { const bucketId = 'example-bucket'; const policyResourceId = 'Policy'; const nodes = GraphBuilder.build( - new StackManifest( - 'test', - 'stack', - 'test/stack', - { + new StackManifest({ + id: 'stack', + templatePath: 'test/stack', + metadata: { 'stack/example-bucket/Resource': 'examplebucketC9DFA43E', 'stack/example-bucket/Policy/Resource': 'examplebucketPolicyE09B485E', }, - { + tree: { path: 'stack', id: 'stack', children: { @@ -292,7 +290,7 @@ test('pulumi resource type name fallsback when fqn not available', () => { version: '2.149.0', }, }, - { + template: { Resources: { examplebucketC9DFA43E: { Type: 'AWS::S3::Bucket', @@ -308,8 +306,8 @@ test('pulumi resource type name fallsback when fqn not available', () => { }, }, }, - [], - ), + dependencies: [], + }), ); expect(nodes[0].construct.type).toEqual('aws-cdk-lib:Stack'); diff --git a/tests/mocks.ts b/tests/mocks.ts new file mode 100644 index 00000000..9fdcd7bd --- /dev/null +++ b/tests/mocks.ts @@ -0,0 +1,93 @@ +import * as pulumi from '@pulumi/pulumi'; +import { Stack } from '../src/stack'; +import { Construct } from 'constructs'; +import { MockCallArgs, MockResourceArgs } from '@pulumi/pulumi/runtime'; + +// Convert a pulumi.Output to a promise of the same type. +export function promiseOf(output: pulumi.Output): Promise { + return new Promise((resolve) => output.apply(resolve)); +} +export async function testStack(fn: (scope: Construct) => void) { + class TestStack extends Stack { + constructor(id: string) { + super(id, { + props: { + env: { + region: 'us-east-1', + account: '12345678912', + }, + }, + }); + + fn(this); + + this.synth(); + } + } + + const s = new TestStack('teststack'); + const converter = await s.converter; + await Promise.all(Array.from(converter.constructs.values()).flatMap((v) => promiseOf(v.urn))); + await promiseOf(s.urn); + await promiseOf(s.pulumiSynthesizer.stagingStack.urn); +} + +export function setMocks(resources?: MockResourceArgs[]) { + const mocks: pulumi.runtime.Mocks = { + call: (args: MockCallArgs): { [id: string]: any } => { + switch (args.token) { + case 'aws-native:index:getAccountId': + return { + accountId: '12345678910', + }; + case 'aws-native:index:getRegion': + return { + region: 'us-east-2', + }; + case 'aws-native:index:getPartition': + return { + partition: 'aws', + }; + case 'aws-native:index:getAzs': + return { + azs: ['us-east-1a', 'us-east-1b'], + }; + case 'aws:index/getCallerIdentity:getCallerIdentity': + return { + accountId: '12345678910', + }; + case 'aws:index/getRegion:getRegion': + return { + name: 'us-east-2', + }; + default: + return {}; + } + }, + newResource: (args: MockResourceArgs): { id: string; state: any } => { + switch (args.type) { + case 'cdk:index:App': + return { id: '', state: {} }; + case 'cdk:index:Stack': + return { id: '', state: {} }; + case 'cdk:construct:TestStack': + return { id: '', state: {} }; + case 'cdk:construct:teststack': + return { id: '', state: {} }; + case 'cdk:index:Component': + return { id: '', state: {} }; + default: + resources?.push(args); + return { + id: args.name + '_id', + state: { + ...args.inputs, + arn: args.name + '_arn', + }, + }; + } + }, + }; + + pulumi.runtime.setMocks(mocks, 'project', 'stack', false); +} diff --git a/tests/synthesizer.test.ts b/tests/synthesizer.test.ts new file mode 100644 index 00000000..b9082868 --- /dev/null +++ b/tests/synthesizer.test.ts @@ -0,0 +1,95 @@ +import * as path from 'path'; +import { Asset } from 'aws-cdk-lib/aws-s3-assets'; +import { setMocks, testStack } from './mocks'; +import { MockResourceArgs } from '@pulumi/pulumi/runtime'; +import { CfnBucket } from 'aws-cdk-lib/aws-s3'; + +describe('Synthesizer', () => { + test('no assets = no staging resources', async () => { + const resources: MockResourceArgs[] = []; + setMocks(resources); + + await testStack((scope) => { + new CfnBucket(scope, 'Bucket'); + }); + expect(resources).toEqual([ + expect.objectContaining({ + name: 'staging-stack-project-stack', + type: 'cdk:construct:StagingStack', + }), + expect.objectContaining({ + name: 'bucket', + type: 'aws-native:s3:Bucket', + }), + ]); + }); + + test('assets = staging resources created', async () => { + const resources: MockResourceArgs[] = []; + setMocks(resources); + + await testStack((scope) => { + new CfnBucket(scope, 'Bucket'); + new Asset(scope, 'asset', { + path: path.join(__dirname, 'synthesizer.test.ts'), + }); + }); + expect(resources).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + name: 'staging-stack-project-stack', + type: 'cdk:construct:StagingStack', + }), + expect.objectContaining({ + name: 'pulumi-cdk-staging-bucket', + type: 'aws:s3/bucketV2:BucketV2', + }), + expect.objectContaining({ + name: 'staging-bucket-versioning', + type: 'aws:s3/bucketVersioningV2:BucketVersioningV2', + }), + expect.objectContaining({ + name: 'staging-bucket-encryption', + type: 'aws:s3/bucketServerSideEncryptionConfigurationV2:BucketServerSideEncryptionConfigurationV2', + }), + expect.objectContaining({ + name: 'staging-bucket-policy', + type: 'aws:s3/bucketPolicy:BucketPolicy', + }), + expect.objectContaining({ + name: 'staging-bucket-lifecycle', + type: 'aws:s3/bucketLifecycleConfigurationV2:BucketLifecycleConfigurationV2', + }), + expect.objectContaining({ + type: 'aws:s3/bucketObjectv2:BucketObjectv2', + inputs: expect.objectContaining({ + key: expect.not.stringMatching(/^deploy-time\/*/), + }), + }), + ]), + ); + }); + + test('deploy time assets', async () => { + const resources: MockResourceArgs[] = []; + setMocks(resources); + + await testStack((scope) => { + new CfnBucket(scope, 'Bucket'); + new Asset(scope, 'deploy-time-asset', { + deployTime: true, + path: path.join(__dirname, 'synthesizer.test.ts'), + }); + }); + expect(resources).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + type: 'aws:s3/bucketObjectv2:BucketObjectv2', + inputs: expect.objectContaining({ + key: expect.stringMatching(/^deploy-time\/*/), + }), + }), + ]), + ); + }); +}); diff --git a/tests/utils.ts b/tests/utils.ts index 92c8dd2e..e760a99f 100644 --- a/tests/utils.ts +++ b/tests/utils.ts @@ -6,15 +6,14 @@ export function createStackManifest( resource2DependsOn?: string | string[], resource1DependsOn?: string | string[], ): StackManifest { - return new StackManifest( - 'dir', - 'stack', - 'template', - { + return new StackManifest({ + id: 'stack', + templatePath: 'template', + metadata: { 'stack/resource-1': 'resource1', 'stack/resource-2': 'resource2', }, - { + tree: { path: 'stack', id: 'stack', children: { @@ -34,7 +33,7 @@ export function createStackManifest( }, }, }, - { + template: { Resources: { resource1: { Type: 'AWS::S3::Bucket', @@ -48,6 +47,6 @@ export function createStackManifest( }, }, }, - [], - ); + dependencies: [], + }); } diff --git a/yarn.lock b/yarn.lock index 2096b9ac..532d08d0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -11,19 +11,19 @@ "@jridgewell/trace-mapping" "^0.3.24" "@aws-cdk/asset-awscli-v1@^2.2.202": - version "2.2.202" - resolved "https://registry.yarnpkg.com/@aws-cdk/asset-awscli-v1/-/asset-awscli-v1-2.2.202.tgz#4627201d71f6a5c60db36385ce09cb81005f4b32" - integrity sha512-JqlF0D4+EVugnG5dAsNZMqhu3HW7ehOXm5SDMxMbXNDMdsF0pxtQKNHRl52z1U9igsHmaFpUgSGjbhAJ+0JONg== + version "2.2.208" + resolved "https://registry.yarnpkg.com/@aws-cdk/asset-awscli-v1/-/asset-awscli-v1-2.2.208.tgz#1675c6ba6061c0541ad0d258b42f0101d5ee10cf" + integrity sha512-r4CuHZaiBioU6waWhCNdEL4MO1+rfbcYVS/Ndz1XNGB5cxIRZwAS0Si6qD2D6nsgpPojiruFl67T1t5M9Va8kQ== "@aws-cdk/asset-kubectl-v20@^2.1.2": - version "2.1.2" - resolved "https://registry.yarnpkg.com/@aws-cdk/asset-kubectl-v20/-/asset-kubectl-v20-2.1.2.tgz#d8e20b5f5dc20128ea2000dc479ca3c7ddc27248" - integrity sha512-3M2tELJOxQv0apCIiuKQ4pAbncz9GuLwnKFqxifWfe77wuMxyTRPmxssYHs42ePqzap1LT6GDcPygGs+hHstLg== + version "2.1.3" + resolved "https://registry.yarnpkg.com/@aws-cdk/asset-kubectl-v20/-/asset-kubectl-v20-2.1.3.tgz#80e09004be173995e91614e34d947da11dd9ff4d" + integrity sha512-cDG1w3ieM6eOT9mTefRuTypk95+oyD7P5X/wRltwmYxU7nZc3+076YEVS6vrjDKr3ADYbfn0lDKpfB1FBtO9CQ== "@aws-cdk/asset-node-proxy-agent-v6@^2.0.3": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@aws-cdk/asset-node-proxy-agent-v6/-/asset-node-proxy-agent-v6-2.0.3.tgz#9b5d213b5ce5ad4461f6a4720195ff8de72e6523" - integrity sha512-twhuEG+JPOYCYPx/xy5uH2+VUsIEhPTzDY0F1KuB+ocjWWB/KEDiOVL19nHvbPCB6fhWnkykXEMJ4HHcKvjtvg== + version "2.1.0" + resolved "https://registry.yarnpkg.com/@aws-cdk/asset-node-proxy-agent-v6/-/asset-node-proxy-agent-v6-2.1.0.tgz#6d3c7860354d4856a7e75375f2f0ecab313b4989" + integrity sha512-7bY3J8GCVxLupn/kNmpPc5VJz8grx+4RKfnnJiO1LG+uxkZfANZG3RMHhE+qQxxwkyQ9/MfPtTpf748UhR425A== "@aws-cdk/aws-apprunner-alpha@2.20.0-alpha.0": version "2.20.0-alpha.0" @@ -38,166 +38,138 @@ jsonschema "^1.4.1" semver "^7.6.3" -"@aws-cdk/cx-api@^2.160.0": - version "2.160.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/cx-api/-/cx-api-2.160.0.tgz#08d4599690a39768bb944c411f1141166e313b59" - integrity sha512-ujXT/UoUDquCwxJ14jkRzIFeMabMyLATWP32Jv0WJjWpxrGJCa+Lua+CByOyikC1QeSVxq8pZcrx0jjYyG0qzw== +"@aws-cdk/cx-api@^2.163.1": + version "2.163.1" + resolved "https://registry.yarnpkg.com/@aws-cdk/cx-api/-/cx-api-2.163.1.tgz#ef55da9f471c963d877b23d3201ca4560d656b2e" + integrity sha512-0bVL/pX0UcliCdXVcgtLVL3W5EHAp4RgW7JN3prz1dIOmLZzZ30DW0qWSc0D0EVE3rVG6RVgfIiuFBFK6WFZ+w== dependencies: semver "^7.6.3" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.7.tgz#882fd9e09e8ee324e496bd040401c6f046ef4465" - integrity sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.25.9.tgz#895b6c7e04a7271a0cbfd575d2e8131751914cc7" + integrity sha512-z88xeGxnzehn2sqZ8UdGQEvYErF1odv2CftxInpSYJt6uHuPe9YjahKZITGs3l5LeI9d2ROG+obuDAoSlqbNfQ== dependencies: - "@babel/highlight" "^7.24.7" + "@babel/highlight" "^7.25.9" picocolors "^1.0.0" -"@babel/compat-data@^7.24.8": - version "7.24.9" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.9.tgz#53eee4e68f1c1d0282aa0eb05ddb02d033fc43a0" - integrity sha512-e701mcfApCJqMMueQI0Fb68Amflj83+dvAvHawoBpAz+GDjCIyGHzNwnefjsWJ3xiYAqqiQFoWbspGYBdb2/ng== +"@babel/compat-data@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.25.9.tgz#24b01c5db6a3ebf85661b4fb4a946a9bccc72ac8" + integrity sha512-yD+hEuJ/+wAJ4Ox2/rpNv5HIuPG82x3ZlQvYVn8iYCprdxzE7P1udpGF1jyjQVBU4dgznN+k2h103vxZ7NdPyw== "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.23.9": - version "7.24.9" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.9.tgz#dc07c9d307162c97fa9484ea997ade65841c7c82" - integrity sha512-5e3FI4Q3M3Pbr21+5xJwCv6ZT6KmGkI0vw3Tozy5ODAQFTIWe37iT8Cr7Ice2Ntb+M3iSKCEWMB1MBgKrW3whg== + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.25.9.tgz#855a4cddcec4158f3f7afadacdab2a7de8af7434" + integrity sha512-WYvQviPw+Qyib0v92AwNIrdLISTp7RfDkM7bPqBvpbnhY4wq8HvHBZREVdYDXk98C8BkOIVnHAY3yvj7AVISxQ== dependencies: "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.24.7" - "@babel/generator" "^7.24.9" - "@babel/helper-compilation-targets" "^7.24.8" - "@babel/helper-module-transforms" "^7.24.9" - "@babel/helpers" "^7.24.8" - "@babel/parser" "^7.24.8" - "@babel/template" "^7.24.7" - "@babel/traverse" "^7.24.8" - "@babel/types" "^7.24.9" + "@babel/code-frame" "^7.25.9" + "@babel/generator" "^7.25.9" + "@babel/helper-compilation-targets" "^7.25.9" + "@babel/helper-module-transforms" "^7.25.9" + "@babel/helpers" "^7.25.9" + "@babel/parser" "^7.25.9" + "@babel/template" "^7.25.9" + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.25.9" convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.2.3" semver "^6.3.1" -"@babel/generator@^7.24.8", "@babel/generator@^7.24.9", "@babel/generator@^7.7.2": - version "7.24.10" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.10.tgz#a4ab681ec2a78bbb9ba22a3941195e28a81d8e76" - integrity sha512-o9HBZL1G2129luEUlG1hB4N/nlYNWHnpwlND9eOMclRqqu1YDy2sSYVCFUZwl8I1Gxh+QSRrP2vD7EpUmFVXxg== +"@babel/generator@^7.25.9", "@babel/generator@^7.7.2": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.25.9.tgz#c7e828ebe0c2baba103b712924699c9e8a6e32f0" + integrity sha512-omlUGkr5EaoIJrhLf9CJ0TvjBRpd9+AXRG//0GEQ9THSo8wPiTlbpy1/Ow8ZTrbXpjd9FHXfbFQx32I04ht0FA== dependencies: - "@babel/types" "^7.24.9" + "@babel/types" "^7.25.9" "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.25" - jsesc "^2.5.1" + jsesc "^3.0.2" -"@babel/helper-compilation-targets@^7.24.8": - version "7.24.8" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.8.tgz#b607c3161cd9d1744977d4f97139572fe778c271" - integrity sha512-oU+UoqCHdp+nWVDkpldqIQL/i/bvAv53tRqLG/s+cOXxe66zOYLU7ar/Xs3LdmBihrUMEUhwu6dMZwbNOYDwvw== +"@babel/helper-compilation-targets@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz#55af025ce365be3cdc0c1c1e56c6af617ce88875" + integrity sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ== dependencies: - "@babel/compat-data" "^7.24.8" - "@babel/helper-validator-option" "^7.24.8" - browserslist "^4.23.1" + "@babel/compat-data" "^7.25.9" + "@babel/helper-validator-option" "^7.25.9" + browserslist "^4.24.0" lru-cache "^5.1.1" semver "^6.3.1" -"@babel/helper-environment-visitor@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz#4b31ba9551d1f90781ba83491dd59cf9b269f7d9" - integrity sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ== - dependencies: - "@babel/types" "^7.24.7" - -"@babel/helper-function-name@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz#75f1e1725742f39ac6584ee0b16d94513da38dd2" - integrity sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA== - dependencies: - "@babel/template" "^7.24.7" - "@babel/types" "^7.24.7" - -"@babel/helper-hoist-variables@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz#b4ede1cde2fd89436397f30dc9376ee06b0f25ee" - integrity sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ== - dependencies: - "@babel/types" "^7.24.7" - -"@babel/helper-module-imports@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz#f2f980392de5b84c3328fc71d38bd81bbb83042b" - integrity sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA== - dependencies: - "@babel/traverse" "^7.24.7" - "@babel/types" "^7.24.7" - -"@babel/helper-module-transforms@^7.24.9": - version "7.24.9" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.24.9.tgz#e13d26306b89eea569180868e652e7f514de9d29" - integrity sha512-oYbh+rtFKj/HwBQkFlUzvcybzklmVdVV3UU+mN7n2t/q3yGHbuVdNxyFvSBO1tfvjyArpHNcWMAzsSPdyI46hw== - dependencies: - "@babel/helper-environment-visitor" "^7.24.7" - "@babel/helper-module-imports" "^7.24.7" - "@babel/helper-simple-access" "^7.24.7" - "@babel/helper-split-export-declaration" "^7.24.7" - "@babel/helper-validator-identifier" "^7.24.7" - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.24.7", "@babel/helper-plugin-utils@^7.8.0": - version "7.24.8" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz#94ee67e8ec0e5d44ea7baeb51e571bd26af07878" - integrity sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg== - -"@babel/helper-simple-access@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz#bcade8da3aec8ed16b9c4953b74e506b51b5edb3" - integrity sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg== - dependencies: - "@babel/traverse" "^7.24.7" - "@babel/types" "^7.24.7" - -"@babel/helper-split-export-declaration@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz#83949436890e07fa3d6873c61a96e3bbf692d856" - integrity sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA== - dependencies: - "@babel/types" "^7.24.7" - -"@babel/helper-string-parser@^7.24.8": - version "7.24.8" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz#5b3329c9a58803d5df425e5785865881a81ca48d" - integrity sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ== - -"@babel/helper-validator-identifier@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz#75b889cfaf9e35c2aaf42cf0d72c8e91719251db" - integrity sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w== - -"@babel/helper-validator-option@^7.24.8": - version "7.24.8" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz#3725cdeea8b480e86d34df15304806a06975e33d" - integrity sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q== - -"@babel/helpers@^7.24.8": - version "7.24.8" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.8.tgz#2820d64d5d6686cca8789dd15b074cd862795873" - integrity sha512-gV2265Nkcz7weJJfvDoAEVzC1e2OTDpkGbEsebse8koXUJUXPsCMi7sRo/+SPMuMZ9MtUPnGwITTnQnU5YjyaQ== - dependencies: - "@babel/template" "^7.24.7" - "@babel/types" "^7.24.8" - -"@babel/highlight@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.7.tgz#a05ab1df134b286558aae0ed41e6c5f731bf409d" - integrity sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw== - dependencies: - "@babel/helper-validator-identifier" "^7.24.7" +"@babel/helper-module-imports@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz#e7f8d20602ebdbf9ebbea0a0751fb0f2a4141715" + integrity sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw== + dependencies: + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.25.9" + +"@babel/helper-module-transforms@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.25.9.tgz#12e4fb2969197ef6d78ea8a2f24375ce85b425fb" + integrity sha512-TvLZY/F3+GvdRYFZFyxMvnsKi+4oJdgZzU3BoGN9Uc2d9C6zfNwJcKKhjqLAhK8i46mv93jsO74fDh3ih6rpHA== + dependencies: + "@babel/helper-module-imports" "^7.25.9" + "@babel/helper-simple-access" "^7.25.9" + "@babel/helper-validator-identifier" "^7.25.9" + "@babel/traverse" "^7.25.9" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.25.9", "@babel/helper-plugin-utils@^7.8.0": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz#9cbdd63a9443a2c92a725cca7ebca12cc8dd9f46" + integrity sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw== + +"@babel/helper-simple-access@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.25.9.tgz#6d51783299884a2c74618d6ef0f86820ec2e7739" + integrity sha512-c6WHXuiaRsJTyHYLJV75t9IqsmTbItYfdj99PnzYGQZkYKvan5/2jKJ7gu31J3/BJ/A18grImSPModuyG/Eo0Q== + dependencies: + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.25.9" + +"@babel/helper-string-parser@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz#1aabb72ee72ed35789b4bbcad3ca2862ce614e8c" + integrity sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA== + +"@babel/helper-validator-identifier@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz#24b64e2c3ec7cd3b3c547729b8d16871f22cbdc7" + integrity sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ== + +"@babel/helper-validator-option@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz#86e45bd8a49ab7e03f276577f96179653d41da72" + integrity sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw== + +"@babel/helpers@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.25.9.tgz#9e26aa6fbefdbca4f8c8a1d66dc6f1c00ddadb0a" + integrity sha512-oKWp3+usOJSzDZOucZUAMayhPz/xVjzymyDzUN8dk0Wd3RWMlGLXi07UCQ/CgQVb8LvXx3XBajJH4XGgkt7H7g== + dependencies: + "@babel/template" "^7.25.9" + "@babel/types" "^7.25.9" + +"@babel/highlight@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.25.9.tgz#8141ce68fc73757946f983b343f1231f4691acc6" + integrity sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw== + dependencies: + "@babel/helper-validator-identifier" "^7.25.9" chalk "^2.4.2" js-tokens "^4.0.0" picocolors "^1.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.24.7", "@babel/parser@^7.24.8": - version "7.24.8" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.8.tgz#58a4dbbcad7eb1d48930524a3fd93d93e9084c6f" - integrity sha512-WzfbgXOkGzZiXXCqk43kKwZjzwx4oulxZi3nq2TYL9mOjQv6kYwul9mz6ID36njuL7Xkp6nJEfok848Zj10j/w== +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.25.9.tgz#8fcaa079ac7458facfddc5cd705cc8005e4d3817" + integrity sha512-aI3jjAAO1fh7vY/pBGsn1i9LDbRP43+asrRlkPuTXW5yHXtd1NgTEMudbBoDDxrf1daEEfPJqR+JBMakzrR4Dg== + dependencies: + "@babel/types" "^7.25.9" "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" @@ -213,14 +185,28 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-class-properties@^7.8.3": +"@babel/plugin-syntax-class-properties@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== dependencies: "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-syntax-import-meta@^7.8.3": +"@babel/plugin-syntax-class-static-block@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" + integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-import-attributes@^7.24.7": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.25.9.tgz#29c9643445deea4533c05e6ac6c39d15424bbe78" + integrity sha512-u3EN9ub8LyYvgTnrgp8gboElouayiwPdnM7x5tcnW3iSt09/lQYPwMNK40I9IUxo7QOZhAsPHCmmuO7EPdruqg== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-syntax-import-meta@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== @@ -235,13 +221,13 @@ "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-jsx@^7.7.2": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz#39a1fa4a7e3d3d7f34e2acc6be585b718d30e02d" - integrity sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ== + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz#a34313a178ea56f1951599b929c1ceacee719290" + integrity sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-syntax-logical-assignment-operators@^7.8.3": +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== @@ -255,7 +241,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-numeric-separator@^7.8.3": +"@babel/plugin-syntax-numeric-separator@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== @@ -283,7 +269,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-top-level-await@^7.8.3": +"@babel/plugin-syntax-private-property-in-object@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" + integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-top-level-await@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== @@ -291,45 +284,41 @@ "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-typescript@^7.7.2": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.7.tgz#58d458271b4d3b6bb27ee6ac9525acbb259bad1c" - integrity sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA== - dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - -"@babel/template@^7.24.7", "@babel/template@^7.3.3": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.24.7.tgz#02efcee317d0609d2c07117cb70ef8fb17ab7315" - integrity sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig== - dependencies: - "@babel/code-frame" "^7.24.7" - "@babel/parser" "^7.24.7" - "@babel/types" "^7.24.7" - -"@babel/traverse@^7.24.7", "@babel/traverse@^7.24.8": - version "7.24.8" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.8.tgz#6c14ed5232b7549df3371d820fbd9abfcd7dfab7" - integrity sha512-t0P1xxAPzEDcEPmjprAQq19NWum4K0EQPjMwZQZbHt+GiZqvjCHjj755Weq1YRPVzBI+3zSfvScfpnuIecVFJQ== - dependencies: - "@babel/code-frame" "^7.24.7" - "@babel/generator" "^7.24.8" - "@babel/helper-environment-visitor" "^7.24.7" - "@babel/helper-function-name" "^7.24.7" - "@babel/helper-hoist-variables" "^7.24.7" - "@babel/helper-split-export-declaration" "^7.24.7" - "@babel/parser" "^7.24.8" - "@babel/types" "^7.24.8" + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz#67dda2b74da43727cf21d46cf9afef23f4365399" + integrity sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/template@^7.25.9", "@babel/template@^7.3.3": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.9.tgz#ecb62d81a8a6f5dc5fe8abfc3901fc52ddf15016" + integrity sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg== + dependencies: + "@babel/code-frame" "^7.25.9" + "@babel/parser" "^7.25.9" + "@babel/types" "^7.25.9" + +"@babel/traverse@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.25.9.tgz#a50f8fe49e7f69f53de5bea7e413cd35c5e13c84" + integrity sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw== + dependencies: + "@babel/code-frame" "^7.25.9" + "@babel/generator" "^7.25.9" + "@babel/parser" "^7.25.9" + "@babel/template" "^7.25.9" + "@babel/types" "^7.25.9" debug "^4.3.1" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.24.7", "@babel/types@^7.24.8", "@babel/types@^7.24.9", "@babel/types@^7.3.3": - version "7.24.9" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.9.tgz#228ce953d7b0d16646e755acf204f4cf3d08cc73" - integrity sha512-xm8XrMKz0IlUdocVbYJe0Z9xEgidU7msskG8BbhnTPK/HZ2z/7FP7ykqPgrUH+C+r414mNfNWam1f2vqOjqjYQ== +"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.25.9", "@babel/types@^7.3.3": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.25.9.tgz#620f35ea1f4233df529ec9a2668d2db26574deee" + integrity sha512-OwS2CM5KocvQ/k7dFJa8i5bNGJP0hXWfVCfDkqRFP1IreH1JDC7wG6eCYCi0+McbfT8OR/kNqsI0UU0xP9H6PQ== dependencies: - "@babel/helper-string-parser" "^7.24.8" - "@babel/helper-validator-identifier" "^7.24.7" - to-fast-properties "^2.0.0" + "@babel/helper-string-parser" "^7.25.9" + "@babel/helper-validator-identifier" "^7.25.9" "@balena/dockerignore@^1.0.2": version "1.0.2" @@ -356,9 +345,9 @@ eslint-visitor-keys "^3.3.0" "@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.6.1": - version "4.11.0" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.11.0.tgz#b0ffd0312b4a3fd2d6f77237e7248a5ad3a680ae" - integrity sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A== + version "4.11.1" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.11.1.tgz#a547badfc719eb3e5f4b556325e542fbe9d7a18f" + integrity sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q== "@eslint/eslintrc@^2.1.4": version "2.1.4" @@ -375,15 +364,15 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@8.57.0": - version "8.57.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.0.tgz#a5417ae8427873f1dd08b70b3574b453e67b5f7f" - integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== +"@eslint/js@8.57.1": + version "8.57.1" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.1.tgz#de633db3ec2ef6a3c89e2f19038063e8a122e2c2" + integrity sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q== "@grpc/grpc-js@^1.10.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.11.1.tgz#a92f33e98f1959feffcd1b25a33b113d2c977b70" - integrity sha512-gyt/WayZrVPH2w/UTLansS7F9Nwld472JxxaETamrM8HNlsa+jSLNyKAZmhxI2Me4c3mQHFiS1wWHDY1g1Kthw== + version "1.12.2" + resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.12.2.tgz#97eda82dd49bb9c24eaf6434ea8d7de446e95aac" + integrity sha512-bgxdZmgTrJZX50OjyVwz3+mNEnCTNkh3cIqGPWVNeW9jX6bn1ZkU80uPd+67/ZpIJIjRQ9qaHCjhavyoWYxumg== dependencies: "@grpc/proto-loader" "^0.7.13" "@js-sdsl/ordered-map" "^4.4.2" @@ -398,12 +387,12 @@ protobufjs "^7.2.5" yargs "^17.7.2" -"@humanwhocodes/config-array@^0.11.14": - version "0.11.14" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" - integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg== +"@humanwhocodes/config-array@^0.13.0": + version "0.13.0" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.13.0.tgz#fb907624df3256d04b9aa2df50d7aa97ec648748" + integrity sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw== dependencies: - "@humanwhocodes/object-schema" "^2.0.2" + "@humanwhocodes/object-schema" "^2.0.3" debug "^4.3.1" minimatch "^3.0.5" @@ -412,7 +401,7 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== -"@humanwhocodes/object-schema@^2.0.2": +"@humanwhocodes/object-schema@^2.0.3": version "2.0.3" resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== @@ -827,9 +816,9 @@ integrity sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA== "@npmcli/package-json@^5.0.0", "@npmcli/package-json@^5.1.0": - version "5.2.0" - resolved "https://registry.yarnpkg.com/@npmcli/package-json/-/package-json-5.2.0.tgz#a1429d3111c10044c7efbfb0fce9f2c501f4cfad" - integrity sha512-qe/kiqqkW0AGtvBjL8TJKZk/eBBSpnJkUWvHdQ9jM2lKHXRYYJuyNpJPlJw3c8QjC2ow6NZYiLExhUaeJelbxQ== + version "5.2.1" + resolved "https://registry.yarnpkg.com/@npmcli/package-json/-/package-json-5.2.1.tgz#df69477b1023b81ff8503f2b9db4db4faea567ed" + integrity sha512-f7zYC6kQautXHvNbLEWgD/uGu1+xCn9izgqBfgItWSx22U0ZDekxN08A1vM8cTxj/cRVe0Q94Ode+tdoYmIOOQ== dependencies: "@npmcli/git" "^5.0.0" glob "^10.2.2" @@ -1042,24 +1031,24 @@ "@pulumi/pulumi" "^3.136.0" "@pulumi/aws@^6.32.0": - version "6.45.0" - resolved "https://registry.yarnpkg.com/@pulumi/aws/-/aws-6.45.0.tgz#f3cf0fea34214906cf2e35f7ab57d6195b4d668a" - integrity sha512-EhRlYs0Ig53nHRNv3NSgb5TPpJuDmA+N0HCUkPhODUT9n1KTahQnoLbMc+hbvJKPngx6hgye7fagARPO3kWPVw== + version "6.56.1" + resolved "https://registry.yarnpkg.com/@pulumi/aws/-/aws-6.56.1.tgz#528692aff97ecc554fad68872d6a5699ff4cbec3" + integrity sha512-fnYs39xUPjT0cipdl28Eiw7B5ZLlHyXBd8lV7dOedKCrrfDLr/nwsh6FMPgj5nUDklR3RAzMFPUW37gMaznPoA== dependencies: - "@pulumi/pulumi" "^3.0.0" + "@pulumi/pulumi" "^3.136.0" builtin-modules "3.0.0" mime "^2.0.0" resolve "^1.7.1" "@pulumi/docker@^4.5.0": - version "4.5.4" - resolved "https://registry.yarnpkg.com/@pulumi/docker/-/docker-4.5.4.tgz#8a9a8418f4cd666118a7f8c99159cdc5dc2f8c3f" - integrity sha512-0R978Se7+NZIocYIoCAMC2q2sovar7O743zfnVQBSZRFLB+2pdZFqmpHWniM6rZtq/h5rwHsMfbJ/E6UJhihfw== + version "4.5.7" + resolved "https://registry.yarnpkg.com/@pulumi/docker/-/docker-4.5.7.tgz#56ec0782a1a52b5a1dc16230dcd7e07c0b94be01" + integrity sha512-z0rr1PoJXemafrNl0oPjQJlGRNbMKN0z50cKhmcuMVsiNTt36cDLXw7kpclgddgdwkM6ZU5zMRyaA1rcNuXTlg== dependencies: - "@pulumi/pulumi" "^3.0.0" + "@pulumi/pulumi" "^3.136.0" semver "^5.4.0" -"@pulumi/pulumi@3.121.0", "@pulumi/pulumi@^3.0.0", "@pulumi/pulumi@^3.136.0": +"@pulumi/pulumi@3.121.0", "@pulumi/pulumi@^3.136.0": version "3.121.0" resolved "https://registry.yarnpkg.com/@pulumi/pulumi/-/pulumi-3.121.0.tgz#0671a73a56d4cdf6614837e4a9e2d1e531c9d44b" integrity sha512-fv9sY1e7nPeGpvlHIMZcErHeZAsbdqOi0Jcb1oxi0NvTU3jy1EZa70q+JdE0dmqYlr43HaSL8SU5+G0/S08wGA== @@ -1211,9 +1200,9 @@ minimatch "^9.0.4" "@types/archiver@^6.0.2": - version "6.0.2" - resolved "https://registry.yarnpkg.com/@types/archiver/-/archiver-6.0.2.tgz#0daf8c83359cbde69de1e4b33dcade6a48a929e2" - integrity sha512-KmROQqbQzKGuaAbmK+ZcytkJ51+YqDa7NmbXjmtC5YBLSyQYo21YaUnQ3HbaPFKL1ooo6RQ6OPYPIDyxfpDDXw== + version "6.0.3" + resolved "https://registry.yarnpkg.com/@types/archiver/-/archiver-6.0.3.tgz#074eb6f4febc0128c25a205a8263da3d4688df53" + integrity sha512-a6wUll6k3zX6qs5KlxIggs1P1JcYJaTCx2gnlr+f0S1yd2DoaEwoIK10HmBaLnZwWneBz+JBm0dwcZu0zECBcQ== dependencies: "@types/readdir-glob" "*" @@ -1313,9 +1302,9 @@ "@types/istanbul-lib-report" "*" "@types/jest@^29.5.2": - version "29.5.12" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.12.tgz#7f7dc6eb4cf246d2474ed78744b05d06ce025544" - integrity sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw== + version "29.5.14" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.14.tgz#2b910912fa1d6856cadcd0c1f95af7df1d6049e5" + integrity sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ== dependencies: expect "^29.0.0" pretty-format "^29.0.0" @@ -1346,12 +1335,19 @@ dependencies: "@types/node" "*" -"@types/node@*", "@types/node@>=13.7.0", "@types/node@^20.12.13": - version "20.14.11" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.14.11.tgz#09b300423343460455043ddd4d0ded6ac579b74b" - integrity sha512-kprQpL8MMeszbz6ojB5/tU8PLN4kesnN8Gjzw349rDlNgsSzg90lAVj3llK99Dh7JON+t9AuscPPFW6mPbTnSA== +"@types/node@*", "@types/node@>=13.7.0": + version "22.7.9" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.7.9.tgz#2bf2797b5e84702d8262ea2cf843c3c3c880d0e9" + integrity sha512-jrTfRC7FM6nChvU7X2KqcrgquofrWLFDeYC1hKfwNWomVvrn7JIksqf344WN2X/y8xrgqBd2dJATZV4GbatBfg== dependencies: - undici-types "~5.26.4" + undici-types "~6.19.2" + +"@types/node@^20.12.13": + version "20.17.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.17.0.tgz#d0620ba0fe4cf2a0f12351c7bdd805fc4e1f036b" + integrity sha512-a7zRo0f0eLo9K5X9Wp5cAqTUNGzuFLDG2R7C4HY2BhcMAsxgSPuRvAC1ZB6QkuUQXf0YZAgfOX2ZyrBa2n4nHQ== + dependencies: + undici-types "~6.19.2" "@types/readdir-glob@*": version "1.1.5" @@ -1388,68 +1384,68 @@ integrity sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ== "@types/yargs@^17.0.8": - version "17.0.32" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.32.tgz#030774723a2f7faafebf645f4e5a48371dca6229" - integrity sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog== + version "17.0.33" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.33.tgz#8c32303da83eec050a84b3c7ae7b9f922d13e32d" + integrity sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA== dependencies: "@types/yargs-parser" "*" -"@typescript-eslint/eslint-plugin@7.16.1": - version "7.16.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.16.1.tgz#f5f5da52db674b1f2cdb9d5f3644e5b2ec750465" - integrity sha512-SxdPak/5bO0EnGktV05+Hq8oatjAYVY3Zh2bye9pGZy6+jwyR3LG3YKkV4YatlsgqXP28BTeVm9pqwJM96vf2A== +"@typescript-eslint/eslint-plugin@7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.18.0.tgz#b16d3cf3ee76bf572fdf511e79c248bdec619ea3" + integrity sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw== dependencies: "@eslint-community/regexpp" "^4.10.0" - "@typescript-eslint/scope-manager" "7.16.1" - "@typescript-eslint/type-utils" "7.16.1" - "@typescript-eslint/utils" "7.16.1" - "@typescript-eslint/visitor-keys" "7.16.1" + "@typescript-eslint/scope-manager" "7.18.0" + "@typescript-eslint/type-utils" "7.18.0" + "@typescript-eslint/utils" "7.18.0" + "@typescript-eslint/visitor-keys" "7.18.0" graphemer "^1.4.0" ignore "^5.3.1" natural-compare "^1.4.0" ts-api-utils "^1.3.0" -"@typescript-eslint/parser@7.16.1": - version "7.16.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-7.16.1.tgz#84c581cf86c8b2becd48d33ddc41a6303d57b274" - integrity sha512-u+1Qx86jfGQ5i4JjK33/FnawZRpsLxRnKzGE6EABZ40KxVT/vWsiZFEBBHjFOljmmV3MBYOHEKi0Jm9hbAOClA== +"@typescript-eslint/parser@7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-7.18.0.tgz#83928d0f1b7f4afa974098c64b5ce6f9051f96a0" + integrity sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg== dependencies: - "@typescript-eslint/scope-manager" "7.16.1" - "@typescript-eslint/types" "7.16.1" - "@typescript-eslint/typescript-estree" "7.16.1" - "@typescript-eslint/visitor-keys" "7.16.1" + "@typescript-eslint/scope-manager" "7.18.0" + "@typescript-eslint/types" "7.18.0" + "@typescript-eslint/typescript-estree" "7.18.0" + "@typescript-eslint/visitor-keys" "7.18.0" debug "^4.3.4" -"@typescript-eslint/scope-manager@7.16.1": - version "7.16.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.16.1.tgz#2b43041caabf8ddd74512b8b550b9fc53ca3afa1" - integrity sha512-nYpyv6ALte18gbMz323RM+vpFpTjfNdyakbf3nsLvF43uF9KeNC289SUEW3QLZ1xPtyINJ1dIsZOuWuSRIWygw== +"@typescript-eslint/scope-manager@7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz#c928e7a9fc2c0b3ed92ab3112c614d6bd9951c83" + integrity sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA== dependencies: - "@typescript-eslint/types" "7.16.1" - "@typescript-eslint/visitor-keys" "7.16.1" + "@typescript-eslint/types" "7.18.0" + "@typescript-eslint/visitor-keys" "7.18.0" -"@typescript-eslint/type-utils@7.16.1": - version "7.16.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-7.16.1.tgz#4d7ae4f3d9e3c8cbdabae91609b1a431de6aa6ca" - integrity sha512-rbu/H2MWXN4SkjIIyWcmYBjlp55VT+1G3duFOIukTNFxr9PI35pLc2ydwAfejCEitCv4uztA07q0QWanOHC7dA== +"@typescript-eslint/type-utils@7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-7.18.0.tgz#2165ffaee00b1fbbdd2d40aa85232dab6998f53b" + integrity sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA== dependencies: - "@typescript-eslint/typescript-estree" "7.16.1" - "@typescript-eslint/utils" "7.16.1" + "@typescript-eslint/typescript-estree" "7.18.0" + "@typescript-eslint/utils" "7.18.0" debug "^4.3.4" ts-api-utils "^1.3.0" -"@typescript-eslint/types@7.16.1": - version "7.16.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.16.1.tgz#bbab066276d18e398bc64067b23f1ce84dfc6d8c" - integrity sha512-AQn9XqCzUXd4bAVEsAXM/Izk11Wx2u4H3BAfQVhSfzfDOm/wAON9nP7J5rpkCxts7E5TELmN845xTUCQrD1xIQ== +"@typescript-eslint/types@7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.18.0.tgz#b90a57ccdea71797ffffa0321e744f379ec838c9" + integrity sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ== -"@typescript-eslint/typescript-estree@7.16.1": - version "7.16.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.16.1.tgz#9b145ba4fd1dde1986697e1ce57dc501a1736dd3" - integrity sha512-0vFPk8tMjj6apaAZ1HlwM8w7jbghC8jc1aRNJG5vN8Ym5miyhTQGMqU++kuBFDNKe9NcPeZ6x0zfSzV8xC1UlQ== +"@typescript-eslint/typescript-estree@7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz#b5868d486c51ce8f312309ba79bdb9f331b37931" + integrity sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA== dependencies: - "@typescript-eslint/types" "7.16.1" - "@typescript-eslint/visitor-keys" "7.16.1" + "@typescript-eslint/types" "7.18.0" + "@typescript-eslint/visitor-keys" "7.18.0" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" @@ -1457,22 +1453,22 @@ semver "^7.6.0" ts-api-utils "^1.3.0" -"@typescript-eslint/utils@7.16.1": - version "7.16.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-7.16.1.tgz#df42dc8ca5a4603016fd102db0346cdab415cdb7" - integrity sha512-WrFM8nzCowV0he0RlkotGDujx78xudsxnGMBHI88l5J8wEhED6yBwaSLP99ygfrzAjsQvcYQ94quDwI0d7E1fA== +"@typescript-eslint/utils@7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-7.18.0.tgz#bca01cde77f95fc6a8d5b0dbcbfb3d6ca4be451f" + integrity sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw== dependencies: "@eslint-community/eslint-utils" "^4.4.0" - "@typescript-eslint/scope-manager" "7.16.1" - "@typescript-eslint/types" "7.16.1" - "@typescript-eslint/typescript-estree" "7.16.1" + "@typescript-eslint/scope-manager" "7.18.0" + "@typescript-eslint/types" "7.18.0" + "@typescript-eslint/typescript-estree" "7.18.0" -"@typescript-eslint/visitor-keys@7.16.1": - version "7.16.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.16.1.tgz#4287bcf44c34df811ff3bb4d269be6cfc7d8c74b" - integrity sha512-Qlzzx4sE4u3FsHTPQAAQFJFNOuqtuY0LFrZHwQ8IHK705XxBiWOFkfKRWu6niB7hwfgnwIpO4jTC75ozW1PHWg== +"@typescript-eslint/visitor-keys@7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz#0564629b6124d67607378d0f0332a0495b25e7d7" + integrity sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg== dependencies: - "@typescript-eslint/types" "7.16.1" + "@typescript-eslint/types" "7.18.0" eslint-visitor-keys "^3.4.3" "@ungap/structured-clone@^1.2.0": @@ -1498,16 +1494,16 @@ acorn-jsx@^5.3.2: integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== acorn-walk@^8.1.1: - version "8.3.3" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.3.tgz#9caeac29eefaa0c41e3d4c65137de4d6f34df43e" - integrity sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw== + version "8.3.4" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.4.tgz#794dd169c3977edf4ba4ea47583587c5866236b7" + integrity sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g== dependencies: acorn "^8.11.0" acorn@^8.11.0, acorn@^8.4.1, acorn@^8.9.0: - version "8.12.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.12.1.tgz#71616bdccbe25e27a54439e0046e89ca76df2248" - integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg== + version "8.13.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.13.0.tgz#2a30d670818ad16ddd6a35d3842dacec9e5d7ca3" + integrity sha512-8zSiw54Oxrdym50NlZ9sUusyO1Z1ZchgRLWRaK6c86XJFClyCgFKetdowBg5bKxyp/u+CDBJG4Mpp0m3HLZl9w== agent-base@^7.0.2, agent-base@^7.1.0, agent-base@^7.1.1: version "7.1.1" @@ -1562,9 +1558,9 @@ ansi-regex@^5.0.1: integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== ansi-regex@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" - integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== + version "6.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.1.0.tgz#95ec409c69619d6cb1b8b34f14b660ef28ebd654" + integrity sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA== ansi-styles@^3.2.1: version "3.2.1" @@ -1692,9 +1688,9 @@ astral-regex@^2.0.0: integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== async@^3.2.3, async@^3.2.4: - version "3.2.5" - resolved "https://registry.yarnpkg.com/async/-/async-3.2.5.tgz#ebd52a8fdaf7a2289a24df399f8d8485c8a46b66" - integrity sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg== + version "3.2.6" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.6.tgz#1b0728e14929d51b85b449b7f06e27c1145e38ce" + integrity sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA== available-typed-arrays@^1.0.7: version "1.0.7" @@ -1740,9 +1736,9 @@ aws-sdk@^2.1691.0: xml2js "0.6.2" b4a@^1.6.4: - version "1.6.6" - resolved "https://registry.yarnpkg.com/b4a/-/b4a-1.6.6.tgz#a4cc349a3851987c3c4ac2d7785c18744f6da9ba" - integrity sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg== + version "1.6.7" + resolved "https://registry.yarnpkg.com/b4a/-/b4a-1.6.7.tgz#a99587d4ebbfbd5a6e3b21bdb5d5fa385767abe4" + integrity sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg== babel-jest@^29.7.0: version "29.7.0" @@ -1779,22 +1775,25 @@ babel-plugin-jest-hoist@^29.6.3: "@types/babel__traverse" "^7.0.6" babel-preset-current-node-syntax@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" - integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== + version "1.1.0" + resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz#9a929eafece419612ef4ae4f60b1862ebad8ef30" + integrity sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw== dependencies: "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-syntax-bigint" "^7.8.3" - "@babel/plugin-syntax-class-properties" "^7.8.3" - "@babel/plugin-syntax-import-meta" "^7.8.3" + "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/plugin-syntax-import-attributes" "^7.24.7" + "@babel/plugin-syntax-import-meta" "^7.10.4" "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" "@babel/plugin-syntax-object-rest-spread" "^7.8.3" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-top-level-await" "^7.8.3" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/plugin-syntax-top-level-await" "^7.14.5" babel-preset-jest@^29.6.3: version "29.6.3" @@ -1810,9 +1809,9 @@ balanced-match@^1.0.0: integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== bare-events@^2.2.0: - version "2.4.2" - resolved "https://registry.yarnpkg.com/bare-events/-/bare-events-2.4.2.tgz#3140cca7a0e11d49b3edc5041ab560659fd8e1f8" - integrity sha512-qMKFd2qG/36aA4GwvKq8MxnPgCQAmBWmSyLWsJcbn8v03wvIPQ/hG1Ms8bPzndZxMDoHpxez5VOS+gC9Yi24/Q== + version "2.5.0" + resolved "https://registry.yarnpkg.com/bare-events/-/bare-events-2.5.0.tgz#305b511e262ffd8b9d5616b056464f8e1b3329cc" + integrity sha512-/E8dDe9dsbLyh2qrZ64PEPadOQ0F4gbl1sUJOrmph7xOiIxfY8vwab/4bFLh4Y88/Hk/ujKcrQKc+ps0mv873A== base64-js@^1.0.2, base64-js@^1.3.1: version "1.5.1" @@ -1860,17 +1859,17 @@ braces@^3.0.3: dependencies: fill-range "^7.1.1" -browserslist@^4.23.1: - version "4.23.2" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.2.tgz#244fe803641f1c19c28c48c4b6ec9736eb3d32ed" - integrity sha512-qkqSyistMYdxAcw+CzbZwlBy8AGmS/eEWs+sEV5TnLRGDOL+C5M2EnH6tlZyg0YoAxGJAFKh61En9BR941GnHA== +browserslist@^4.24.0: + version "4.24.2" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.2.tgz#f5845bc91069dbd55ee89faf9822e1d885d16580" + integrity sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg== dependencies: - caniuse-lite "^1.0.30001640" - electron-to-chromium "^1.4.820" - node-releases "^2.0.14" - update-browserslist-db "^1.1.0" + caniuse-lite "^1.0.30001669" + electron-to-chromium "^1.5.41" + node-releases "^2.0.18" + update-browserslist-db "^1.1.1" -bs-logger@0.x: +bs-logger@^0.2.6: version "0.2.6" resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== @@ -1991,10 +1990,10 @@ camelcase@^6.2.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -caniuse-lite@^1.0.30001640: - version "1.0.30001642" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001642.tgz#6aa6610eb24067c246d30c57f055a9d0a7f8d05f" - integrity sha512-3XQ0DoRgLijXJErLSl+bLnJ+Et4KqV1PY6JJBGAFlsNsz31zeAIncyeZfLCabHK/jtSh+671RM9YMldxjUPZtA== +caniuse-lite@^1.0.30001669: + version "1.0.30001669" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001669.tgz#fda8f1d29a8bfdc42de0c170d7f34a9cf19ed7a3" + integrity sha512-DlWzFDJqstqtIVx1zeSpIMLjunf5SmwOw0N2Ck/QSQdS8PLS4+9HrLaYei4w8BIAL7IB/UEDu889d8vhCTPA0w== case@1.6.3: version "1.6.3" @@ -2002,12 +2001,12 @@ case@1.6.3: integrity sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ== cdk-assets@^2.154.8: - version "2.154.8" - resolved "https://registry.yarnpkg.com/cdk-assets/-/cdk-assets-2.154.8.tgz#58cccc1ff4f040173f615c400c565eaf6665be90" - integrity sha512-mjqDhWDnf0NciVO2Q+eqDFmbhGa42OgudEN/V8D2YNzgBrt4Lk/ogF3z4mKPM6yAucQ8tslYh0JzWuO4wS29hg== + version "2.155.16" + resolved "https://registry.yarnpkg.com/cdk-assets/-/cdk-assets-2.155.16.tgz#dca1d76f926f5a63a62809a34d1cbb1f9a325e2e" + integrity sha512-jGfgfKWqmCSsrN9tzmYsnfdR25ERSvsrFjaAcx6lLtNJ/nkJQ75GCy+crS15P90TbdSOrWKQZ8fa5QGDu8mpSg== dependencies: "@aws-cdk/cloud-assembly-schema" "^38.0.1" - "@aws-cdk/cx-api" "^2.160.0" + "@aws-cdk/cx-api" "^2.163.1" archiver "^5.3.2" aws-sdk "^2.1691.0" glob "^7.2.3" @@ -2047,9 +2046,9 @@ ci-info@^3.2.0: integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== cjs-module-lexer@^1.0.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.3.1.tgz#c485341ae8fd999ca4ee5af2d7a1c9ae01e0099c" - integrity sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q== + version "1.4.1" + resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz#707413784dbb3a72aa11c2f2b042a0bef4004170" + integrity sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA== clean-stack@^2.0.0: version "2.2.0" @@ -2220,11 +2219,11 @@ cssesc@^3.0.0: integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: - version "4.3.5" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.5.tgz#e83444eceb9fedd4a1da56d671ae2446a01a6e1e" - integrity sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg== + version "4.3.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" + integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== dependencies: - ms "2.1.2" + ms "^2.1.3" decompress-response@^6.0.0: version "6.0.0" @@ -2291,17 +2290,17 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" -ejs@^3.0.0: +ejs@^3.1.10: version "3.1.10" resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.10.tgz#69ab8358b14e896f80cc39e62087b88500c3ac3b" integrity sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA== dependencies: jake "^10.8.5" -electron-to-chromium@^1.4.820: - version "1.4.829" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.829.tgz#3034a865b5eac9064c9db8b38ba99b60a446bb73" - integrity sha512-5qp1N2POAfW0u1qGAxXEtz6P7bO1m6gpZr5hdf5ve6lxpLM7MpiM4jIPz7xcrNlClQMafbyUDDWjlIQZ1Mw0Rw== +electron-to-chromium@^1.5.41: + version "1.5.43" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.43.tgz#d9e69fc709ddebd521416de9d17cdef81d2d4718" + integrity sha512-NxnmFBHDl5Sachd2P46O7UJiMaMHMLSofoIWVJq3mj8NJgG0umiSeljAVP9lGzjI0UDLJJ5jjoGjcrB8RSbjLQ== emittery@^0.13.1: version "0.13.1" @@ -2356,10 +2355,10 @@ es-errors@^1.3.0: resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== -escalade@^3.1.1, escalade@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" - integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== +escalade@^3.1.1, escalade@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" + integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== escape-string-regexp@^1.0.5: version "1.0.5" @@ -2395,15 +2394,15 @@ eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4 integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== eslint@^8.57.0: - version "8.57.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.0.tgz#c786a6fd0e0b68941aaf624596fb987089195668" - integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ== + version "8.57.1" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.1.tgz#7df109654aba7e3bbe5c8eae533c5e461d3c6ca9" + integrity sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA== dependencies: "@eslint-community/eslint-utils" "^4.2.0" "@eslint-community/regexpp" "^4.6.1" "@eslint/eslintrc" "^2.1.4" - "@eslint/js" "8.57.0" - "@humanwhocodes/config-array" "^0.11.14" + "@eslint/js" "8.57.1" + "@humanwhocodes/config-array" "^0.13.0" "@humanwhocodes/module-importer" "^1.0.1" "@nodelib/fs.walk" "^1.2.8" "@ungap/structured-clone" "^1.2.0" @@ -2559,9 +2558,9 @@ fast-levenshtein@^2.0.6: integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== fast-uri@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.0.1.tgz#cddd2eecfc83a71c1be2cc2ef2061331be8a7134" - integrity sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw== + version "3.0.3" + resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.0.3.tgz#892a1c91802d5d7860de728f18608a0573142241" + integrity sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw== fastq@^1.6.0: version "1.17.1" @@ -2578,9 +2577,9 @@ fb-watchman@^2.0.0: bser "2.1.1" fdir@^6.1.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.1.1.tgz#316b58145a05223b75c8b371e80bb3bad8f1441e" - integrity sha512-QfKBVg453Dyn3mr0Q0O+Tkr1r79lOTAKSi9f/Ot4+qVEwxWhav2Z+SudrG9vQjM2aYRMQQZ2/Q1zdA8ACM1pDg== + version "6.4.2" + resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.4.2.tgz#ddaa7ce1831b161bc3657bb99cb36e1622702689" + integrity sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ== file-entry-cache@^6.0.1: version "6.0.1" @@ -2649,9 +2648,9 @@ for-each@^0.3.3: is-callable "^1.1.3" foreground-child@^3.1.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.2.1.tgz#767004ccf3a5b30df39bed90718bab43fe0a59f7" - integrity sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA== + version "3.3.0" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.0.tgz#0ac8644c06e431439f8561db8ecf29a7b5519c77" + integrity sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg== dependencies: cross-spawn "^7.0.0" signal-exit "^4.0.1" @@ -2950,9 +2949,9 @@ ignore-walk@^6.0.4: minimatch "^9.0.0" ignore@^5.2.0, ignore@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" - integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== + version "5.3.2" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" + integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== import-fresh@^3.2.1: version "3.3.0" @@ -2963,9 +2962,9 @@ import-fresh@^3.2.1: resolve-from "^4.0.0" import-local@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" - integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== + version "3.2.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.2.0.tgz#c3d5c745798c02a6f8b897726aba5100186ee260" + integrity sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA== dependencies: pkg-dir "^4.2.0" resolve-cwd "^3.0.0" @@ -3030,9 +3029,9 @@ is-callable@^1.1.3: integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== is-core-module@^2.13.0: - version "2.15.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.15.0.tgz#71c72ec5442ace7e76b306e9d48db361f22699ea" - integrity sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA== + version "2.15.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.15.1.tgz#a7363a25bee942fefab0de13bf6aa372c82dcc37" + integrity sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ== dependencies: hasown "^2.0.2" @@ -3170,9 +3169,9 @@ jackspeak@^3.1.2: "@pkgjs/parseargs" "^0.11.0" jake@^10.8.5: - version "10.9.1" - resolved "https://registry.yarnpkg.com/jake/-/jake-10.9.1.tgz#8dc96b7fcc41cb19aa502af506da4e1d56f5e62b" - integrity sha512-61btcOHNnLnsOdtLgA5efqQWjnSi/vow5HbI7HMdKKWqvrKR1bLK3BPlJn9gcSaP2ewuamUSMB5XEy76KUIS2w== + version "10.9.2" + resolved "https://registry.yarnpkg.com/jake/-/jake-10.9.2.tgz#6ae487e6a69afec3a5e167628996b59f35ae2b7f" + integrity sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA== dependencies: async "^3.2.3" chalk "^4.0.2" @@ -3577,10 +3576,10 @@ jsbn@1.1.0: resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-1.1.0.tgz#b01307cb29b618a1ed26ec79e911f803c4da0040" integrity sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A== -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== +jsesc@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.0.2.tgz#bb8b09a6597ba426425f2e4a07245c3d00b9343e" + integrity sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g== json-buffer@3.0.1: version "3.0.1" @@ -3734,7 +3733,7 @@ lodash.isplainobject@^4.0.6: resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" integrity sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA== -lodash.memoize@4.x: +lodash.memoize@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== @@ -3788,7 +3787,7 @@ make-dir@^4.0.0: dependencies: semver "^7.5.3" -make-error@1.x, make-error@^1.1.1: +make-error@^1.1.1, make-error@^1.3.6: version "1.3.6" resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== @@ -3964,19 +3963,19 @@ mkdirp@^1.0.3, mkdirp@^1.0.4: integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== mock-fs@^5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/mock-fs/-/mock-fs-5.3.0.tgz#7dfc95ce5528aff8e10fa117161b91d8129e0e9e" - integrity sha512-IMvz1X+RF7vf+ur7qUenXMR7/FSKSIqS3HqFHXcyNI7G0FbpFO8L5lfsUJhl+bhK1AiulVHWKUSxebWauPA+xQ== + version "5.4.0" + resolved "https://registry.yarnpkg.com/mock-fs/-/mock-fs-5.4.0.tgz#c1d91d6d8dc19269a0fe86e8b777521d990c2ed7" + integrity sha512-3ROPnEMgBOkusBMYQUW2rnT3wZwsgfOKzJDLvx/TZ7FL1WmWvwSwn3j4aDR5fLDGtgcc1WF0Z1y0di7c9L4FKw== module-details-from-path@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/module-details-from-path/-/module-details-from-path-1.0.3.tgz#114c949673e2a8a35e9d35788527aa37b679da2b" integrity sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A== -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== +ms@^2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== natural-compare@^1.4.0: version "1.4.0" @@ -3984,9 +3983,9 @@ natural-compare@^1.4.0: integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== negotiator@^0.6.3: - version "0.6.3" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" - integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + version "0.6.4" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.4.tgz#777948e2452651c570b712dd01c23e262713fff7" + integrity sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w== node-gyp@^10.0.0: version "10.2.0" @@ -4009,10 +4008,10 @@ node-int64@^0.4.0: resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== -node-releases@^2.0.14: - version "2.0.17" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.17.tgz#d74bc4fec38d839eec5db2a3c9c963d4f33cb366" - integrity sha512-Ww6ZlOiEQfPfXM45v17oabk77Z7mg5bOt7AjDyzy7RjK9OrLrLC8dyZQoAPEOtFX9SaNf1Tdvr5gRJWdTJj7GA== +node-releases@^2.0.18: + version "2.0.18" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.18.tgz#f010e8d35e2fe8d6b2944f03f70213ecedc4ca3f" + integrity sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g== nopt@^7.0.0, nopt@^7.2.1: version "7.2.1" @@ -4060,9 +4059,9 @@ npm-normalize-package-bin@^3.0.0: integrity sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ== npm-package-arg@^11.0.0, npm-package-arg@^11.0.2: - version "11.0.2" - resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-11.0.2.tgz#1ef8006c4a9e9204ddde403035f7ff7d718251ca" - integrity sha512-IGN0IAwmhDJwy13Wc8k+4PEbTPhpJnMtfR53ZbOyjkvmEcLS4nCwp6mvMWjS5sUjeiW3mpx6cHmuhKEu9XmcQw== + version "11.0.3" + resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-11.0.3.tgz#dae0c21199a99feca39ee4bfb074df3adac87e2d" + integrity sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw== dependencies: hosted-git-info "^7.0.0" proc-log "^4.0.0" @@ -4193,9 +4192,9 @@ p-try@^2.0.0: integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== package-json-from-dist@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz#e501cd3094b278495eb4258d4c9f6d5ac3019f00" - integrity sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw== + version "1.0.1" + resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz#4f1471a010827a86f94cfd9b0727e36d267de505" + integrity sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw== pacote@^18.0.0, pacote@^18.0.6: version "18.0.6" @@ -4284,10 +4283,10 @@ path-type@^4.0.0: resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== -picocolors@^1.0.0, picocolors@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1" - integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew== +picocolors@^1.0.0, picocolors@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" + integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== picomatch@^2.0.4, picomatch@^2.2.3, picomatch@^2.3.1: version "2.3.1" @@ -4324,9 +4323,9 @@ possible-typed-array-names@^1.0.0: integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== postcss-selector-parser@^6.0.10: - version "6.1.1" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.1.1.tgz#5be94b277b8955904476a2400260002ce6c56e38" - integrity sha512-b4dlw/9V8A71rLIDsSwVmak9z2DuBUB7CA1/wSdelNEzqsjoSPeADTWNO09lpH49Diy3/JIZ2bSPB1dI3LJCHg== + version "6.1.2" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz#27ecb41fb0e3b6ba7a1ec84fff347f734c7929de" + integrity sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg== dependencies: cssesc "^3.0.0" util-deprecate "^1.0.2" @@ -4376,9 +4375,9 @@ promise-all-reject-late@^1.0.0: integrity sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw== promise-call-limit@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/promise-call-limit/-/promise-call-limit-3.0.1.tgz#3570f7a3f2aaaf8e703623a552cd74749688cf19" - integrity sha512-utl+0x8gIDasV5X+PI5qWEPqH6fJS0pFtQ/4gZ95xfEFb/89dmh+/b895TbFDBLiafBvxD/PGTKfvxl4kH/pQg== + version "3.0.2" + resolved "https://registry.yarnpkg.com/promise-call-limit/-/promise-call-limit-3.0.2.tgz#524b7f4b97729ff70417d93d24f46f0265efa4f9" + integrity sha512-mRPQO2T1QQVw11E7+UdCJu7S61eJVWknzml9sC1heAdj1jxl0fWMBypIt9ZOcLFf8FkG995ZD7RnVk7HH72fZw== promise-inflight@^1.0.1: version "1.0.1" @@ -4402,9 +4401,9 @@ prompts@^2.0.1: sisteransi "^1.0.5" protobufjs@^7.2.5: - version "7.3.2" - resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.3.2.tgz#60f3b7624968868f6f739430cfbc8c9370e26df4" - integrity sha512-RXyHaACeqXeqAKGLDl68rQKbmObRsTIn4TYVUUug1KfS47YWCo5MacGITEryugIgZqORCvJWEk4l449POg5Txg== + version "7.4.0" + resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.4.0.tgz#7efe324ce9b3b61c82aae5de810d287bc08a248a" + integrity sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw== dependencies: "@protobufjs/aspromise" "^1.1.2" "@protobufjs/base64" "^1.1.2" @@ -4420,9 +4419,9 @@ protobufjs@^7.2.5: long "^5.0.0" pump@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" - integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + version "3.0.2" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.2.tgz#836f3edd6bc2ee599256c924ffe0d88573ddcbf8" + integrity sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw== dependencies: end-of-stream "^1.1.0" once "^1.3.1" @@ -4781,9 +4780,9 @@ spdx-expression-parse@^3.0.0: spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.18" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.18.tgz#22aa922dcf2f2885a6494a261f2d8b75345d0326" - integrity sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ== + version "3.0.20" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz#e44ed19ed318dd1e5888f93325cee800f0f51b89" + integrity sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw== sprintf-js@^1.1.3: version "1.1.3" @@ -4810,9 +4809,9 @@ stack-utils@^2.0.3: escape-string-regexp "^2.0.0" streamx@^2.15.0: - version "2.18.0" - resolved "https://registry.yarnpkg.com/streamx/-/streamx-2.18.0.tgz#5bc1a51eb412a667ebfdcd4e6cf6a6fc65721ac7" - integrity sha512-LLUC1TWdjVdn1weXGcSxyTR3T4+acB6tVGXT95y0nGbca4t4o/ng1wKAGTljm9VicuCVLvRlqFYXYy5GwgM7sQ== + version "2.20.1" + resolved "https://registry.yarnpkg.com/streamx/-/streamx-2.20.1.tgz#471c4f8b860f7b696feb83d5b125caab2fdbb93c" + integrity sha512-uTa0mU6WUC65iUvzKH4X9hEdvSW7rbPxPtwfWiLMSj3qTdQbAiUboZTxauKfpFuGIGa1C2BYijZ7wgdUXICJhA== dependencies: fast-fifo "^1.3.2" queue-tick "^1.0.1" @@ -4982,11 +4981,9 @@ test-exclude@^6.0.0: minimatch "^3.0.4" text-decoder@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/text-decoder/-/text-decoder-1.1.1.tgz#5df9c224cebac4a7977720b9f083f9efa1aefde8" - integrity sha512-8zll7REEv4GDD3x4/0pW+ppIxSNs7H1J10IKFZsuOMscumCdM2a+toDGLPA3T+1+fLBql4zbt5z83GEQGGV5VA== - dependencies: - b4a "^1.6.4" + version "1.2.1" + resolved "https://registry.yarnpkg.com/text-decoder/-/text-decoder-1.2.1.tgz#e173f5121d97bfa3ff8723429ad5ba92e1ead67e" + integrity sha512-x9v3H/lTKIJKQQe7RPQkLfKAnc9lUTkWDypIQgTzPJAq+5/GCDHonmshfvlsNSj58yyshbIJJDLmU15qNERrXQ== text-table@^0.2.0: version "0.2.0" @@ -5003,11 +5000,6 @@ tmpl@1.0.5: resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== - to-regex-range@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" @@ -5026,19 +5018,19 @@ ts-api-utils@^1.3.0: integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ== ts-jest@^29.1.0: - version "29.2.2" - resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.2.2.tgz#0d2387bb04d39174b20a05172a968f258aedff4d" - integrity sha512-sSW7OooaKT34AAngP6k1VS669a0HdLxkQZnlC7T76sckGCokXFnvJ3yRlQZGRTAoV5K19HfSgCiSwWOSIfcYlg== + version "29.2.5" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.2.5.tgz#591a3c108e1f5ebd013d3152142cb5472b399d63" + integrity sha512-KD8zB2aAZrcKIdGk4OwpJggeLcH1FgrICqDSROWqlnJXGCXK4Mn6FcdK2B6670Xr73lHMG1kHw8R87A0ecZ+vA== dependencies: - bs-logger "0.x" - ejs "^3.0.0" - fast-json-stable-stringify "2.x" + bs-logger "^0.2.6" + ejs "^3.1.10" + fast-json-stable-stringify "^2.1.0" jest-util "^29.0.0" json5 "^2.2.3" - lodash.memoize "4.x" - make-error "1.x" - semver "^7.5.3" - yargs-parser "^21.0.1" + lodash.memoize "^4.1.2" + make-error "^1.3.6" + semver "^7.6.3" + yargs-parser "^21.1.1" ts-node@^10.9.2: version "10.9.2" @@ -5091,23 +5083,23 @@ type-fest@^0.21.3: integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== typescript-eslint@^7.16.1: - version "7.16.1" - resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-7.16.1.tgz#4855e11985b3dbd13a94b4e7e6523b2ec5d1c759" - integrity sha512-889oE5qELj65q/tGeOSvlreNKhimitFwZqQ0o7PcWC7/lgRkAMknznsCsV8J8mZGTP/Z+cIbX8accf2DE33hrA== + version "7.18.0" + resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-7.18.0.tgz#e90d57649b2ad37a7475875fa3e834a6d9f61eb2" + integrity sha512-PonBkP603E3tt05lDkbOMyaxJjvKqQrXsnow72sVeOFINDE/qNmnnd+f9b4N+U7W6MXnnYyrhtmF2t08QWwUbA== dependencies: - "@typescript-eslint/eslint-plugin" "7.16.1" - "@typescript-eslint/parser" "7.16.1" - "@typescript-eslint/utils" "7.16.1" + "@typescript-eslint/eslint-plugin" "7.18.0" + "@typescript-eslint/parser" "7.18.0" + "@typescript-eslint/utils" "7.18.0" typescript@^5.4.5: - version "5.5.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.5.3.tgz#e1b0a3c394190838a0b168e771b0ad56a0af0faa" - integrity sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ== + version "5.6.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.6.3.tgz#5f3449e31c9d94febb17de03cc081dd56d81db5b" + integrity sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw== -undici-types@~5.26.4: - version "5.26.5" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" - integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== +undici-types@~6.19.2: + version "6.19.8" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" + integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== unique-filename@^3.0.0: version "3.0.0" @@ -5133,13 +5125,13 @@ upath@^1.1.0: resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== -update-browserslist-db@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz#7ca61c0d8650766090728046e416a8cde682859e" - integrity sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ== +update-browserslist-db@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz#80846fba1d79e82547fb661f8d141e0945755fe5" + integrity sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A== dependencies: - escalade "^3.1.2" - picocolors "^1.0.1" + escalade "^3.2.0" + picocolors "^1.1.0" uri-js@^4.2.2: version "4.4.1" @@ -5333,7 +5325,7 @@ yargs-parser@^20.2.2: resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== -yargs-parser@^21.0.1, yargs-parser@^21.1.1: +yargs-parser@^21.1.1: version "21.1.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==