├── .eslintignore ├── .eslintrc.cjs ├── .gitignore ├── .prettierrc.cjs ├── LICENSE ├── README.md ├── StackSets ├── CdkBootstrap.yml ├── PermissionsBoundary.yml ├── README.md └── RequiredTags.yml ├── cdk.json ├── cdk ├── README.md ├── __snapshots__ │ ├── delegated-zone-stack.spec.ts.snap │ ├── github-oidc-stack.spec.ts.snap │ └── hosted-zone-stack.spec.ts.snap ├── aws-organization-for-devs.ts ├── delegated-zone-stack.spec.ts ├── delegated-zone-stack.ts ├── github-oidc-stack.spec.ts ├── github-oidc-stack.ts ├── hosted-zone-stack.spec.ts └── hosted-zone-stack.ts ├── media └── organization for developers.drawio.png ├── package-lock.json ├── package.json ├── test └── setup.ts └── vitest.config.ts /.eslintignore: -------------------------------------------------------------------------------- 1 | cdk.out 2 | -------------------------------------------------------------------------------- /.eslintrc.cjs: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | env: { node: true }, 3 | extends: ['eslint:recommended', 'plugin:@typescript-eslint/recommended', 'plugin:prettier/recommended'], 4 | parser: '@typescript-eslint/parser', 5 | plugins: ['@typescript-eslint'], 6 | root: true, 7 | }; 8 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .vscode 2 | .DS_Store 3 | node_modules 4 | 5 | cdk.out 6 | coverage 7 | -------------------------------------------------------------------------------- /.prettierrc.cjs: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | semi: true, 3 | trailingComma: 'all', 4 | singleQuote: true, 5 | printWidth: 120, 6 | tabWidth: 2, 7 | }; 8 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 AWS Community Builders Projects 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # aws-organization-for-devs 2 | IaC to deploy and manage a best-practices developer ready AWS organization for building serverless projects on AWS. 3 | 4 | Our organization was set up using [superwerker](https://superwerker.cloud/). You may also wish to check out [OrgFormation](https://github.com/org-formation/org-formation-cli). 5 | 6 | ![Organization Diagram](media/organization%20for%20developers.drawio.png) 7 | 8 | # Accessing Accounts 9 | 10 | All human access is managed using [AWS IAM Identity Center](https://aws.amazon.com/iam/identity-center/) (formerly AWS SSO). IAM Users **are prohibited!** AWS IAM Identity Centers offers both console and cli access through a [portal](https://communitybuilders.awsapps.com/start#/) for Community Builders who have access. 11 | 12 | # CDK Developer Workflow 13 | 14 | Developers have broad access in the **Sandbox OU**. Although use of IaC is preferred, developers will have write access to most resources, enabling them to make rapid changes, force events, and debug integrations. Once a stack is stable, it should be connected to a CI/CD pipeline to deploy to the **Test** and **Production** OUs. Example follows. 15 | 16 | ## Hosted Zones 17 | 18 | There are environment-specific Hosted Zones available with wildcard certificates following the pattern of 19 | - *.sandbox.awscommunitybuilders.org 20 | - *.test.awscommunitybuilders.org 21 | - *.production.awscommunitybuilders.org 22 | 23 | This makes it easy to delegate DNS to `myapp..awscommunitybuilders.org`. See the [example](https://github.com/aws-community-projects/cicd/blob/main/cdk/cicd.awscommunitybuilders.org-stack.ts#L82) for more information. 24 | 25 | ## Permissions Boundary 26 | 27 | Use of the `developer-policy` [Permissions Boundary](https://aws.amazon.com/blogs/devops/secure-cdk-deployments-with-iam-permission-boundaries/) is required. It can be added to your [cdk.json](cdk.json#L50) file. 28 | 29 | ## CI/CD using GitHub Actions and OIDC 30 | 31 | See the [example](https://github.com/aws-community-projects/cicd). 32 | 33 | If you'd like to deploy using GitHub Actions and OIDC, it's as simple as [adding your aws-community-projects repo](./cdk/aws-organization-for-devs.ts#L32) to the stack with a pull request. 34 | 35 | Special thanks to [aripalo](https://twitter.com/aripalo) for making this easy with [aws-cdk-github-oidc](https://github.com/aripalo/aws-cdk-github-oidc). 36 | 37 | # Deploying CDK with Other Tools 38 | 39 | Don't want to use Github Actions? Open an [issue](https://github.com/aws-community-projects/aws-organization-for-devs/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc) and let's talk about it! 40 | 41 | # What about SAM, Serverless, etc? 42 | 43 | You want it? Let's discuss! Open an [issue](https://github.com/aws-community-projects/aws-organization-for-devs/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc). 44 | -------------------------------------------------------------------------------- /StackSets/CdkBootstrap.yml: -------------------------------------------------------------------------------- 1 | Description: This stack includes resources needed to deploy AWS CDK apps into this environment 2 | Parameters: 3 | TrustedAccounts: 4 | Description: List of AWS accounts that are trusted to publish assets and deploy stacks to this environment 5 | Default: "" 6 | Type: CommaDelimitedList 7 | TrustedAccountsForLookup: 8 | Description: List of AWS accounts that are trusted to look up values in this environment 9 | Default: "" 10 | Type: CommaDelimitedList 11 | CloudFormationExecutionPolicies: 12 | Description: List of the ManagedPolicy ARN(s) to attach to the CloudFormation deployment role 13 | Default: "" 14 | Type: CommaDelimitedList 15 | FileAssetsBucketName: 16 | Description: The name of the S3 bucket used for file assets 17 | Default: "" 18 | Type: String 19 | FileAssetsBucketKmsKeyId: 20 | Description: Empty to create a new key (default), 'AWS_MANAGED_KEY' to use a managed S3 key, or the ID/ARN of an existing key. 21 | Default: "" 22 | Type: String 23 | ContainerAssetsRepositoryName: 24 | Description: A user-provided custom name to use for the container assets ECR repository 25 | Default: "" 26 | Type: String 27 | Qualifier: 28 | Description: An identifier to distinguish multiple bootstrap stacks in the same environment 29 | Default: hnb659fds 30 | Type: String 31 | AllowedPattern: "[A-Za-z0-9_-]{1,10}" 32 | ConstraintDescription: Qualifier must be an alphanumeric identifier of at most 10 characters 33 | PublicAccessBlockConfiguration: 34 | Description: Whether or not to enable S3 Staging Bucket Public Access Block Configuration 35 | Default: "true" 36 | Type: String 37 | AllowedValues: 38 | - "true" 39 | - "false" 40 | InputPermissionsBoundary: 41 | Description: Whether or not to use either the CDK supplied or custom permissions boundary 42 | Default: "" 43 | Type: String 44 | UseExamplePermissionsBoundary: 45 | Default: "false" 46 | AllowedValues: 47 | - "true" 48 | - "false" 49 | Type: String 50 | BootstrapVariant: 51 | Type: String 52 | Default: "AWS CDK: Default Resources" 53 | Description: Describe the provenance of the resources in this bootstrap stack. Change this when you customize the template. To prevent accidents, the CDK CLI will not overwrite bootstrap stacks with a different variant. 54 | Conditions: 55 | HasTrustedAccounts: 56 | Fn::Not: 57 | - Fn::Equals: 58 | - "" 59 | - Fn::Join: 60 | - "" 61 | - Ref: TrustedAccounts 62 | HasTrustedAccountsForLookup: 63 | Fn::Not: 64 | - Fn::Equals: 65 | - "" 66 | - Fn::Join: 67 | - "" 68 | - Ref: TrustedAccountsForLookup 69 | HasCloudFormationExecutionPolicies: 70 | Fn::Not: 71 | - Fn::Equals: 72 | - "" 73 | - Fn::Join: 74 | - "" 75 | - Ref: CloudFormationExecutionPolicies 76 | HasCustomFileAssetsBucketName: 77 | Fn::Not: 78 | - Fn::Equals: 79 | - "" 80 | - Ref: FileAssetsBucketName 81 | CreateNewKey: 82 | Fn::Equals: 83 | - "" 84 | - Ref: FileAssetsBucketKmsKeyId 85 | UseAwsManagedKey: 86 | Fn::Equals: 87 | - AWS_MANAGED_KEY 88 | - Ref: FileAssetsBucketKmsKeyId 89 | ShouldCreatePermissionsBoundary: 90 | Fn::Equals: 91 | - "true" 92 | - Ref: UseExamplePermissionsBoundary 93 | PermissionsBoundarySet: 94 | Fn::Not: 95 | - Fn::Equals: 96 | - "" 97 | - Ref: InputPermissionsBoundary 98 | HasCustomContainerAssetsRepositoryName: 99 | Fn::Not: 100 | - Fn::Equals: 101 | - "" 102 | - Ref: ContainerAssetsRepositoryName 103 | UsePublicAccessBlockConfiguration: 104 | Fn::Equals: 105 | - "true" 106 | - Ref: PublicAccessBlockConfiguration 107 | Resources: 108 | FileAssetsBucketEncryptionKey: 109 | Type: AWS::KMS::Key 110 | Properties: 111 | KeyPolicy: 112 | Statement: 113 | - Action: 114 | - kms:Create* 115 | - kms:Describe* 116 | - kms:Enable* 117 | - kms:List* 118 | - kms:Put* 119 | - kms:Update* 120 | - kms:Revoke* 121 | - kms:Disable* 122 | - kms:Get* 123 | - kms:Delete* 124 | - kms:ScheduleKeyDeletion 125 | - kms:CancelKeyDeletion 126 | - kms:GenerateDataKey 127 | - kms:TagResource 128 | - kms:UntagResource 129 | Effect: Allow 130 | Principal: 131 | AWS: 132 | Ref: AWS::AccountId 133 | Resource: "*" 134 | - Action: 135 | - kms:Decrypt 136 | - kms:DescribeKey 137 | - kms:Encrypt 138 | - kms:ReEncrypt* 139 | - kms:GenerateDataKey* 140 | Effect: Allow 141 | Principal: 142 | AWS: "*" 143 | Resource: "*" 144 | Condition: 145 | StringEquals: 146 | kms:CallerAccount: 147 | Ref: AWS::AccountId 148 | kms:ViaService: 149 | - Fn::Sub: s3.${AWS::Region}.amazonaws.com 150 | - Action: 151 | - kms:Decrypt 152 | - kms:DescribeKey 153 | - kms:Encrypt 154 | - kms:ReEncrypt* 155 | - kms:GenerateDataKey* 156 | Effect: Allow 157 | Principal: 158 | AWS: 159 | Fn::Sub: ${FilePublishingRole.Arn} 160 | Resource: "*" 161 | Condition: CreateNewKey 162 | FileAssetsBucketEncryptionKeyAlias: 163 | Condition: CreateNewKey 164 | Type: AWS::KMS::Alias 165 | Properties: 166 | AliasName: 167 | Fn::Sub: alias/cdk-${Qualifier}-assets-key 168 | TargetKeyId: 169 | Ref: FileAssetsBucketEncryptionKey 170 | StagingBucket: 171 | Type: AWS::S3::Bucket 172 | Properties: 173 | BucketName: 174 | Fn::If: 175 | - HasCustomFileAssetsBucketName 176 | - Fn::Sub: ${FileAssetsBucketName} 177 | - Fn::Sub: cdk-${Qualifier}-assets-${AWS::AccountId}-${AWS::Region} 178 | AccessControl: Private 179 | BucketEncryption: 180 | ServerSideEncryptionConfiguration: 181 | - ServerSideEncryptionByDefault: 182 | SSEAlgorithm: aws:kms 183 | KMSMasterKeyID: 184 | Fn::If: 185 | - CreateNewKey 186 | - Fn::Sub: ${FileAssetsBucketEncryptionKey.Arn} 187 | - Fn::If: 188 | - UseAwsManagedKey 189 | - Ref: AWS::NoValue 190 | - Fn::Sub: ${FileAssetsBucketKmsKeyId} 191 | PublicAccessBlockConfiguration: 192 | Fn::If: 193 | - UsePublicAccessBlockConfiguration 194 | - BlockPublicAcls: true 195 | BlockPublicPolicy: true 196 | IgnorePublicAcls: true 197 | RestrictPublicBuckets: true 198 | - Ref: AWS::NoValue 199 | VersioningConfiguration: 200 | Status: Enabled 201 | LifecycleConfiguration: 202 | Rules: 203 | - Id: CleanupOldVersions 204 | Status: Enabled 205 | NoncurrentVersionExpiration: 206 | NoncurrentDays: 365 207 | UpdateReplacePolicy: Retain 208 | DeletionPolicy: Retain 209 | StagingBucketPolicy: 210 | Type: AWS::S3::BucketPolicy 211 | Properties: 212 | Bucket: 213 | Ref: StagingBucket 214 | PolicyDocument: 215 | Id: AccessControl 216 | Version: "2012-10-17" 217 | Statement: 218 | - Sid: AllowSSLRequestsOnly 219 | Action: s3:* 220 | Effect: Deny 221 | Resource: 222 | - Fn::Sub: ${StagingBucket.Arn} 223 | - Fn::Sub: ${StagingBucket.Arn}/* 224 | Condition: 225 | Bool: 226 | aws:SecureTransport: "false" 227 | Principal: "*" 228 | ContainerAssetsRepository: 229 | Type: AWS::ECR::Repository 230 | Properties: 231 | ImageTagMutability: IMMUTABLE 232 | RepositoryName: 233 | Fn::If: 234 | - HasCustomContainerAssetsRepositoryName 235 | - Fn::Sub: ${ContainerAssetsRepositoryName} 236 | - Fn::Sub: cdk-${Qualifier}-container-assets-${AWS::AccountId}-${AWS::Region} 237 | RepositoryPolicyText: 238 | Version: "2012-10-17" 239 | Statement: 240 | - Sid: LambdaECRImageRetrievalPolicy 241 | Effect: Allow 242 | Principal: 243 | Service: lambda.amazonaws.com 244 | Action: 245 | - ecr:BatchGetImage 246 | - ecr:GetDownloadUrlForLayer 247 | Condition: 248 | StringLike: 249 | aws:sourceArn: 250 | Fn::Sub: arn:${AWS::Partition}:lambda:${AWS::Region}:${AWS::AccountId}:function:* 251 | FilePublishingRole: 252 | Type: AWS::IAM::Role 253 | Properties: 254 | AssumeRolePolicyDocument: 255 | Statement: 256 | - Action: sts:AssumeRole 257 | Effect: Allow 258 | Principal: 259 | AWS: 260 | Ref: AWS::AccountId 261 | - Fn::If: 262 | - HasTrustedAccounts 263 | - Action: sts:AssumeRole 264 | Effect: Allow 265 | Principal: 266 | AWS: 267 | Ref: TrustedAccounts 268 | - Ref: AWS::NoValue 269 | RoleName: 270 | Fn::Sub: cdk-${Qualifier}-file-publishing-role-${AWS::AccountId}-${AWS::Region} 271 | Tags: 272 | - Key: aws-cdk:bootstrap-role 273 | Value: file-publishing 274 | ImagePublishingRole: 275 | Type: AWS::IAM::Role 276 | Properties: 277 | AssumeRolePolicyDocument: 278 | Statement: 279 | - Action: sts:AssumeRole 280 | Effect: Allow 281 | Principal: 282 | AWS: 283 | Ref: AWS::AccountId 284 | - Fn::If: 285 | - HasTrustedAccounts 286 | - Action: sts:AssumeRole 287 | Effect: Allow 288 | Principal: 289 | AWS: 290 | Ref: TrustedAccounts 291 | - Ref: AWS::NoValue 292 | RoleName: 293 | Fn::Sub: cdk-${Qualifier}-image-publishing-role-${AWS::AccountId}-${AWS::Region} 294 | Tags: 295 | - Key: aws-cdk:bootstrap-role 296 | Value: image-publishing 297 | LookupRole: 298 | Type: AWS::IAM::Role 299 | Properties: 300 | AssumeRolePolicyDocument: 301 | Statement: 302 | - Action: sts:AssumeRole 303 | Effect: Allow 304 | Principal: 305 | AWS: 306 | Ref: AWS::AccountId 307 | - Fn::If: 308 | - HasTrustedAccountsForLookup 309 | - Action: sts:AssumeRole 310 | Effect: Allow 311 | Principal: 312 | AWS: 313 | Ref: TrustedAccountsForLookup 314 | - Ref: AWS::NoValue 315 | - Fn::If: 316 | - HasTrustedAccounts 317 | - Action: sts:AssumeRole 318 | Effect: Allow 319 | Principal: 320 | AWS: 321 | Ref: TrustedAccounts 322 | - Ref: AWS::NoValue 323 | RoleName: 324 | Fn::Sub: cdk-${Qualifier}-lookup-role-${AWS::AccountId}-${AWS::Region} 325 | ManagedPolicyArns: 326 | - Fn::Sub: arn:${AWS::Partition}:iam::aws:policy/ReadOnlyAccess 327 | Policies: 328 | - PolicyDocument: 329 | Statement: 330 | - Sid: DontReadSecrets 331 | Effect: Deny 332 | Action: 333 | - kms:Decrypt 334 | Resource: "*" 335 | Version: "2012-10-17" 336 | PolicyName: LookupRolePolicy 337 | Tags: 338 | - Key: aws-cdk:bootstrap-role 339 | Value: lookup 340 | FilePublishingRoleDefaultPolicy: 341 | Type: AWS::IAM::Policy 342 | Properties: 343 | PolicyDocument: 344 | Statement: 345 | - Action: 346 | - s3:GetObject* 347 | - s3:GetBucket* 348 | - s3:GetEncryptionConfiguration 349 | - s3:List* 350 | - s3:DeleteObject* 351 | - s3:PutObject* 352 | - s3:Abort* 353 | Resource: 354 | - Fn::Sub: ${StagingBucket.Arn} 355 | - Fn::Sub: ${StagingBucket.Arn}/* 356 | Effect: Allow 357 | - Action: 358 | - kms:Decrypt 359 | - kms:DescribeKey 360 | - kms:Encrypt 361 | - kms:ReEncrypt* 362 | - kms:GenerateDataKey* 363 | Effect: Allow 364 | Resource: 365 | Fn::If: 366 | - CreateNewKey 367 | - Fn::Sub: ${FileAssetsBucketEncryptionKey.Arn} 368 | - Fn::Sub: arn:${AWS::Partition}:kms:${AWS::Region}:${AWS::AccountId}:key/${FileAssetsBucketKmsKeyId} 369 | Version: "2012-10-17" 370 | Roles: 371 | - Ref: FilePublishingRole 372 | PolicyName: 373 | Fn::Sub: cdk-${Qualifier}-file-publishing-role-default-policy-${AWS::AccountId}-${AWS::Region} 374 | ImagePublishingRoleDefaultPolicy: 375 | Type: AWS::IAM::Policy 376 | Properties: 377 | PolicyDocument: 378 | Statement: 379 | - Action: 380 | - ecr:PutImage 381 | - ecr:InitiateLayerUpload 382 | - ecr:UploadLayerPart 383 | - ecr:CompleteLayerUpload 384 | - ecr:BatchCheckLayerAvailability 385 | - ecr:DescribeRepositories 386 | - ecr:DescribeImages 387 | - ecr:BatchGetImage 388 | - ecr:GetDownloadUrlForLayer 389 | Resource: 390 | Fn::Sub: ${ContainerAssetsRepository.Arn} 391 | Effect: Allow 392 | - Action: 393 | - ecr:GetAuthorizationToken 394 | Resource: "*" 395 | Effect: Allow 396 | Version: "2012-10-17" 397 | Roles: 398 | - Ref: ImagePublishingRole 399 | PolicyName: 400 | Fn::Sub: cdk-${Qualifier}-image-publishing-role-default-policy-${AWS::AccountId}-${AWS::Region} 401 | DeploymentActionRole: 402 | Type: AWS::IAM::Role 403 | Properties: 404 | AssumeRolePolicyDocument: 405 | Statement: 406 | - Action: sts:AssumeRole 407 | Effect: Allow 408 | Principal: 409 | AWS: 410 | Ref: AWS::AccountId 411 | - Fn::If: 412 | - HasTrustedAccounts 413 | - Action: sts:AssumeRole 414 | Effect: Allow 415 | Principal: 416 | AWS: 417 | Ref: TrustedAccounts 418 | - Ref: AWS::NoValue 419 | Policies: 420 | - PolicyDocument: 421 | Statement: 422 | - Sid: CloudFormationPermissions 423 | Effect: Allow 424 | Action: 425 | - cloudformation:CreateChangeSet 426 | - cloudformation:DeleteChangeSet 427 | - cloudformation:DescribeChangeSet 428 | - cloudformation:DescribeStacks 429 | - cloudformation:ExecuteChangeSet 430 | - cloudformation:CreateStack 431 | - cloudformation:UpdateStack 432 | Resource: "*" 433 | - Sid: PipelineCrossAccountArtifactsBucket 434 | Effect: Allow 435 | Action: 436 | - s3:GetObject* 437 | - s3:GetBucket* 438 | - s3:List* 439 | - s3:Abort* 440 | - s3:DeleteObject* 441 | - s3:PutObject* 442 | Resource: "*" 443 | Condition: 444 | StringNotEquals: 445 | s3:ResourceAccount: 446 | Ref: AWS::AccountId 447 | - Sid: PipelineCrossAccountArtifactsKey 448 | Effect: Allow 449 | Action: 450 | - kms:Decrypt 451 | - kms:DescribeKey 452 | - kms:Encrypt 453 | - kms:ReEncrypt* 454 | - kms:GenerateDataKey* 455 | Resource: "*" 456 | Condition: 457 | StringEquals: 458 | kms:ViaService: 459 | Fn::Sub: s3.${AWS::Region}.amazonaws.com 460 | - Action: iam:PassRole 461 | Resource: 462 | Fn::Sub: ${CloudFormationExecutionRole.Arn} 463 | Effect: Allow 464 | - Sid: CliPermissions 465 | Action: 466 | - cloudformation:DescribeStackEvents 467 | - cloudformation:GetTemplate 468 | - cloudformation:DeleteStack 469 | - cloudformation:UpdateTerminationProtection 470 | - sts:GetCallerIdentity 471 | - cloudformation:GetTemplateSummary 472 | Resource: "*" 473 | Effect: Allow 474 | - Sid: CliStagingBucket 475 | Effect: Allow 476 | Action: 477 | - s3:GetObject* 478 | - s3:GetBucket* 479 | - s3:List* 480 | Resource: 481 | - Fn::Sub: ${StagingBucket.Arn} 482 | - Fn::Sub: ${StagingBucket.Arn}/* 483 | - Sid: ReadVersion 484 | Effect: Allow 485 | Action: 486 | - ssm:GetParameter 487 | Resource: 488 | - Fn::Sub: arn:${AWS::Partition}:ssm:${AWS::Region}:${AWS::AccountId}:parameter${CdkBootstrapVersion} 489 | Version: "2012-10-17" 490 | PolicyName: default 491 | RoleName: 492 | Fn::Sub: cdk-${Qualifier}-deploy-role-${AWS::AccountId}-${AWS::Region} 493 | Tags: 494 | - Key: aws-cdk:bootstrap-role 495 | Value: deploy 496 | CloudFormationExecutionRole: 497 | Type: AWS::IAM::Role 498 | Properties: 499 | AssumeRolePolicyDocument: 500 | Statement: 501 | - Action: sts:AssumeRole 502 | Effect: Allow 503 | Principal: 504 | Service: cloudformation.amazonaws.com 505 | Version: "2012-10-17" 506 | ManagedPolicyArns: 507 | Fn::If: 508 | - HasCloudFormationExecutionPolicies 509 | - Ref: CloudFormationExecutionPolicies 510 | - Fn::If: 511 | - HasTrustedAccounts 512 | - Ref: AWS::NoValue 513 | - - Fn::Sub: arn:${AWS::Partition}:iam::aws:policy/AdministratorAccess 514 | RoleName: 515 | Fn::Sub: cdk-${Qualifier}-cfn-exec-role-${AWS::AccountId}-${AWS::Region} 516 | PermissionsBoundary: 517 | Fn::If: 518 | - PermissionsBoundarySet 519 | - Fn::Sub: arn:${AWS::Partition}:iam::${AWS::AccountId}:policy/${InputPermissionsBoundary} 520 | - Ref: AWS::NoValue 521 | CdkBoostrapPermissionsBoundaryPolicy: 522 | Condition: ShouldCreatePermissionsBoundary 523 | Type: AWS::IAM::ManagedPolicy 524 | Properties: 525 | PolicyDocument: 526 | Statement: 527 | - Sid: ExplicitAllowAll 528 | Action: 529 | - "*" 530 | Effect: Allow 531 | Resource: "*" 532 | - Sid: DenyAccessIfRequiredPermBoundaryIsNotBeingApplied 533 | Action: 534 | - iam:CreateUser 535 | - iam:CreateRole 536 | - iam:PutRolePermissionsBoundary 537 | - iam:PutUserPermissionsBoundary 538 | Condition: 539 | StringNotEquals: 540 | iam:PermissionsBoundary: 541 | Fn::Sub: arn:${AWS::Partition}:iam::${AWS::AccountId}:policy/cdk-${Qualifier}-permissions-boundary-${AWS::AccountId}-${AWS::Region} 542 | Effect: Deny 543 | Resource: "*" 544 | - Sid: DenyPermBoundaryIAMPolicyAlteration 545 | Action: 546 | - iam:CreatePolicyVersion 547 | - iam:DeletePolicy 548 | - iam:DeletePolicyVersion 549 | - iam:SetDefaultPolicyVersion 550 | Effect: Deny 551 | Resource: 552 | Fn::Sub: arn:${AWS::Partition}:iam::${AWS::AccountId}:policy/cdk-${Qualifier}-permissions-boundary-${AWS::AccountId}-${AWS::Region} 553 | - Sid: DenyRemovalOfPermBoundaryFromAnyUserOrRole 554 | Action: 555 | - iam:DeleteUserPermissionsBoundary 556 | - iam:DeleteRolePermissionsBoundary 557 | Effect: Deny 558 | Resource: "*" 559 | Version: "2012-10-17" 560 | Description: Bootstrap Permission Boundary 561 | ManagedPolicyName: 562 | Fn::Sub: cdk-${Qualifier}-permissions-boundary-${AWS::AccountId}-${AWS::Region} 563 | Path: / 564 | CdkBootstrapVersion: 565 | Type: AWS::SSM::Parameter 566 | Properties: 567 | Type: String 568 | Name: 569 | Fn::Sub: /cdk-bootstrap/${Qualifier}/version 570 | Value: "15" 571 | Outputs: 572 | BucketName: 573 | Description: The name of the S3 bucket owned by the CDK toolkit stack 574 | Value: 575 | Fn::Sub: ${StagingBucket} 576 | BucketDomainName: 577 | Description: The domain name of the S3 bucket owned by the CDK toolkit stack 578 | Value: 579 | Fn::Sub: ${StagingBucket.RegionalDomainName} 580 | FileAssetKeyArn: 581 | Description: The ARN of the KMS key used to encrypt the asset bucket (deprecated) 582 | Value: 583 | Fn::If: 584 | - CreateNewKey 585 | - Fn::Sub: ${FileAssetsBucketEncryptionKey.Arn} 586 | - Fn::Sub: ${FileAssetsBucketKmsKeyId} 587 | Export: 588 | Name: 589 | Fn::Sub: CdkBootstrap-${Qualifier}-FileAssetKeyArn 590 | ImageRepositoryName: 591 | Description: The name of the ECR repository which hosts docker image assets 592 | Value: 593 | Fn::Sub: ${ContainerAssetsRepository} 594 | BootstrapVersion: 595 | Description: The version of the bootstrap resources that are currently mastered in this stack 596 | Value: 597 | Fn::GetAtt: 598 | - CdkBootstrapVersion 599 | - Value 600 | 601 | -------------------------------------------------------------------------------- /StackSets/PermissionsBoundary.yml: -------------------------------------------------------------------------------- 1 | AWSTemplateFormatVersion: 2010-09-09 2 | Description: https://aws.amazon.com/blogs/devops/secure-cdk-deployments-with-iam-permission-boundaries/ 3 | 4 | Resources: 5 | PermissionsBoundary: 6 | Type: AWS::IAM::ManagedPolicy 7 | Properties: 8 | PolicyDocument: 9 | Statement: 10 | # ----- Begin base policy --------------- 11 | # If permission boundaries do not have an explicit allow 12 | # then the effect is deny 13 | - Sid: ExplicitAllowAll 14 | Action: "*" 15 | Effect: Allow 16 | Resource: "*" 17 | # Default permissions to prevent privilege escalation 18 | - Sid: DenyAccessIfRequiredPermBoundaryIsNotBeingApplied 19 | Action: 20 | - iam:CreateUser 21 | - iam:CreateRole 22 | - iam:PutRolePermissionsBoundary 23 | - iam:PutUserPermissionsBoundary 24 | Condition: 25 | StringNotEquals: 26 | iam:PermissionsBoundary: 27 | Fn::Sub: arn:${AWS::Partition}:iam::${AWS::AccountId}:policy/developer-policy 28 | Effect: Deny 29 | Resource: "*" 30 | - Sid: DenyPermBoundaryIAMPolicyAlteration 31 | Action: 32 | - iam:CreatePolicyVersion 33 | - iam:DeletePolicy 34 | - iam:DeletePolicyVersion 35 | - iam:SetDefaultPolicyVersion 36 | Effect: Deny 37 | Resource: 38 | Fn::Sub: arn:${AWS::Partition}:iam::${AWS::AccountId}:policy/developer-policy 39 | - Sid: DenyRemovalOfPermBoundaryFromAnyUserOrRole 40 | Action: 41 | - iam:DeleteUserPermissionsBoundary 42 | - iam:DeleteRolePermissionsBoundary 43 | Effect: Deny 44 | Resource: "*" 45 | # ----- End base policy --------------- 46 | # -- Begin Custom Organization Policy -- 47 | - Sid: DenyModifyingConfig 48 | Effect: Deny 49 | Action: config:* 50 | Resource: "*" 51 | # -- End Custom Organization Policy -- 52 | Version: "2012-10-17" 53 | Description: "Bootstrap Permission Boundary" 54 | ManagedPolicyName: developer-policy 55 | Path: / -------------------------------------------------------------------------------- /StackSets/README.md: -------------------------------------------------------------------------------- 1 | # ConfigRules 2 | 3 | ## RequiredTags StackSet 4 | 5 | ```bash 6 | % aws cloudformation create-stack-set --stack-set-name required-tags --template-body file://./StackSets/RequiredTags.yml --region eu-west-1 --tags Key=acb:cost-allocation:env,Value=org Key=acb:cost-allocation:owner,Value=elthrasher@gmail.com Key=acb:cost-allocation:provider,Value=CloudFormation Key=acb:cost-allocation:service,Value=organization --permission-model SERVICE_MANAGED --auto-deployment Enabled=true,RetainStacksOnAccountRemoval=false 7 | ``` 8 | 9 | ```bash 10 | % aws cloudformation create-stack-instances --stack-set-name required-tags --deployment-targets OrganizationalUnitIds=ou-o1po-8t2jlg7y,ou-o1po-nc0nerid,ou-o1po-ei9sq3nv,ou-o1po-gc7tz6ee --regions eu-west-1 us-east-1 us-west-2 11 | ``` 12 | 13 | ## PermissionsBoundary StackSet 14 | 15 | ```bash 16 | % aws cloudformation create-stack-set --stack-set-name permissions-boundary --template-body file://./StackSets/PermissionsBoundary.yml --region eu-west-1 --tags Key=acb:cost-allocation:env,Value=org Key=acb:cost-allocation:owner,Value=elthrasher@gmail.com Key=acb:cost-allocation:provider,Value=CloudFormation Key=acb:cost-allocation:service,Value=organization --permission-model SERVICE_MANAGED --auto-deployment Enabled=true,RetainStacksOnAccountRemoval=false --capabilities CAPABILITY_NAMED_IAM 17 | ``` 18 | 19 | ```bash 20 | % aws cloudformation create-stack-instances --stack-set-name permissions-boundary --deployment-targets OrganizationalUnitIds=ou-o1po-8t2jlg7y,ou-o1po-nc0nerid,ou-o1po-ei9sq3nv,ou-o1po-gc7tz6ee --regions eu-west-1 21 | ``` 22 | 23 | ```bash 24 | aws cloudformation create-stack --stack-name permissions-boundary --template-body file://./StackSets/PermissionsBoundary.yml --region eu-west-1 --tags Key=acb:cost-allocation:env,Value=org Key=acb:cost-allocation:owner,Value=elthrasher@gmail.com Key=acb:cost-allocation:provider,Value=CloudFormation Key=acb:cost-allocation:service,Value=organization --capabilities CAPABILITY_NAMED_IAM 25 | ``` 26 | 27 | ## CDK Bootstrap StackSet 28 | 29 | ```bash 30 | % aws cloudformation create-stack-set --stack-set-name cdk-bootstrap --template-body file://./StackSets/CdkBootstrap.yml --region eu-west-1 --tags Key=acb:cost-allocation:env,Value=org Key=acb:cost-allocation:owner,Value=elthrasher@gmail.com Key=acb:cost-allocation:provider,Value=CloudFormation Key=acb:cost-allocation:service,Value=organization --permission-model SERVICE_MANAGED --auto-deployment Enabled=true,RetainStacksOnAccountRemoval=false --capabilities CAPABILITY_NAMED_IAM --parameters ParameterKey=InputPermissionsBoundary,ParameterValue=developer-policy ParameterKey=TrustedAccounts,ParameterValue=447002520154 ParameterKey=CloudFormationExecutionPolicies,ParameterValue=arn:aws:iam::aws:policy/AdministratorAccess 31 | ``` 32 | 33 | ```bash 34 | % aws cloudformation create-stack-instances --stack-set-name cdk-bootstrap --deployment-targets OrganizationalUnitIds=ou-o1po-8t2jlg7y,ou-o1po-nc0nerid,ou-o1po-ei9sq3nv,ou-o1po-gc7tz6ee --regions eu-west-1 us-east-1 us-west-2 35 | ``` 36 | 37 | ```bash 38 | % aws cloudformation create-stack --stack-name cdk-bootstrap --template-body file://./StackSets/CdkBootstrap.yml --region eu-west-1 --tags Key=acb:cost-allocation:env,Value=org Key=acb:cost-allocation:owner,Value=elthrasher@gmail.com Key=acb:cost-allocation:provider,Value=CloudFormation Key=acb:cost-allocation:service,Value=organization --capabilities CAPABILITY_NAMED_IAM --parameters ParameterKey=InputPermissionsBoundary,ParameterValue=developer-policy ParameterKey=TrustedAccounts,ParameterValue=447002520154 ParameterKey=CloudFormationExecutionPolicies,ParameterValue=arn:aws:iam::aws:policy/AdministratorAccess 39 | ``` 40 | 41 | ```bash 42 | % aws cloudformation create-stack --stack-name cdk-bootstrap --template-body file://./StackSets/CdkBootstrap.yml --region us-east-1 --tags Key=acb:cost-allocation:env,Value=org Key=acb:cost-allocation:owner,Value=elthrasher@gmail.com Key=acb:cost-allocation:provider,Value=CloudFormation Key=acb:cost-allocation:service,Value=organization --capabilities CAPABILITY_NAMED_IAM --parameters ParameterKey=InputPermissionsBoundary,ParameterValue=developer-policy ParameterKey=TrustedAccounts,ParameterValue=447002520154 ParameterKey=CloudFormationExecutionPolicies,ParameterValue=arn:aws:iam::aws:policy/AdministratorAccess 43 | ``` 44 | -------------------------------------------------------------------------------- /StackSets/RequiredTags.yml: -------------------------------------------------------------------------------- 1 | AWSTemplateFormatVersion: 2010-09-09 2 | Description: Require tags for all resources. 3 | 4 | Resources: 5 | RequiredTags: 6 | Type: AWS::Config::ConfigRule 7 | Properties: 8 | ConfigRuleName: RequiredTags 9 | Description: Config rule to enforce tagging 10 | InputParameters: 11 | tag1Key: acb:cost-allocation:env 12 | tag2Key: acb:cost-allocation:owner 13 | tag3Key: acb:cost-allocation:provider 14 | tag4Key: acb:cost-allocation:service 15 | Source: 16 | Owner: AWS 17 | SourceIdentifier: REQUIRED_TAGS -------------------------------------------------------------------------------- /cdk.json: -------------------------------------------------------------------------------- 1 | { 2 | "app": "npx ts-node --prefer-ts-exts cdk/aws-organization-for-devs.ts", 3 | "watch": { 4 | "include": [ 5 | "**" 6 | ], 7 | "exclude": [ 8 | "README.md", 9 | "cdk*.json", 10 | "**/*.d.ts", 11 | "**/*.js", 12 | "tsconfig.json", 13 | "package*.json", 14 | "yarn.lock", 15 | "node_modules", 16 | "test" 17 | ] 18 | }, 19 | "context": { 20 | "@aws-cdk/aws-lambda:recognizeLayerVersion": true, 21 | "@aws-cdk/core:checkSecretUsage": true, 22 | "@aws-cdk/core:target-partitions": [ 23 | "aws", 24 | "aws-cn" 25 | ], 26 | "@aws-cdk-containers/ecs-service-extensions:enableDefaultLogDriver": true, 27 | "@aws-cdk/aws-ec2:uniqueImdsv2TemplateName": true, 28 | "@aws-cdk/aws-ecs:arnFormatIncludesClusterName": true, 29 | "@aws-cdk/aws-iam:minimizePolicies": true, 30 | "@aws-cdk/core:validateSnapshotRemovalPolicy": true, 31 | "@aws-cdk/aws-codepipeline:crossAccountKeyAliasStackSafeResourceName": true, 32 | "@aws-cdk/aws-s3:createDefaultLoggingPolicy": true, 33 | "@aws-cdk/aws-sns-subscriptions:restrictSqsDescryption": true, 34 | "@aws-cdk/aws-apigateway:disableCloudWatchRole": true, 35 | "@aws-cdk/core:enablePartitionLiterals": true, 36 | "@aws-cdk/aws-events:eventsTargetQueueSameAccount": true, 37 | "@aws-cdk/aws-iam:standardizedServicePrincipals": true, 38 | "@aws-cdk/aws-ecs:disableExplicitDeploymentControllerForCircuitBreaker": true, 39 | "@aws-cdk/aws-iam:importedRoleStackSafeDefaultPolicyName": true, 40 | "@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy": true, 41 | "@aws-cdk/aws-route53-patters:useCertificate": true, 42 | "@aws-cdk/customresources:installLatestAwsSdkDefault": false, 43 | "@aws-cdk/aws-rds:databaseProxyUniqueResourceName": true, 44 | "@aws-cdk/aws-codedeploy:removeAlarmsFromDeploymentGroup": true, 45 | "@aws-cdk/aws-apigateway:authorizerChangeDeploymentLogicalId": true, 46 | "@aws-cdk/aws-ec2:launchTemplateDefaultUserData": true, 47 | "@aws-cdk/aws-secretsmanager:useAttachedSecretResourcePolicyForSecretTargetAttachments": true, 48 | "@aws-cdk/aws-redshift:columnId": true, 49 | "@aws-cdk/core:permissionsBoundary": { 50 | "name": "developer-policy" 51 | } 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /cdk/README.md: -------------------------------------------------------------------------------- 1 | # CDK Stacks 2 | 3 | ## Hosted Zone Stack 4 | 5 | Creates the root hosted zone for awscommunitybuilders.org and a delegation role that will allow stacks in other accounts to create subdomains. 6 | 7 | ## Delegated Zone Stack 8 | 9 | Creates an environment-specific subdomain and a wildcard certificate for that subdomain. The certificate arn is stored in Secrets Manager (and not Parameter Store because of region replication) so that other stacks can apply the arn to Cloudfront Distributions. 10 | -------------------------------------------------------------------------------- /cdk/__snapshots__/delegated-zone-stack.spec.ts.snap: -------------------------------------------------------------------------------- 1 | // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html 2 | 3 | exports[`Entire Stack > match a snapshot 1`] = ` 4 | { 5 | "Outputs": { 6 | "certArn": { 7 | "Description": "certificate arn", 8 | "Value": { 9 | "Ref": "DelegatedZoneCert71201BFD", 10 | }, 11 | }, 12 | "nameservers": { 13 | "Description": "nameservers", 14 | "Value": { 15 | "Fn::Join": [ 16 | ", ", 17 | { 18 | "Fn::GetAtt": [ 19 | "delegatedZone93B2A299", 20 | "NameServers", 21 | ], 22 | }, 23 | ], 24 | }, 25 | }, 26 | }, 27 | "Parameters": { 28 | "BootstrapVersion": { 29 | "Default": "/cdk-bootstrap/hnb659fds/version", 30 | "Description": "Version of the CDK Bootstrap resources in this environment, automatically retrieved from SSM Parameter Store. [cdk:skip]", 31 | "Type": "AWS::SSM::Parameter::Value", 32 | }, 33 | }, 34 | "Resources": { 35 | "AccountCerteArn7BFDEF53": { 36 | "DeletionPolicy": "Delete", 37 | "Properties": { 38 | "Name": "/account/certificateArn", 39 | "ReplicaRegions": [ 40 | { 41 | "Region": "eu-west-1", 42 | }, 43 | ], 44 | "SecretString": { 45 | "Ref": "DelegatedZoneCert71201BFD", 46 | }, 47 | }, 48 | "Type": "AWS::SecretsManager::Secret", 49 | "UpdateReplacePolicy": "Delete", 50 | }, 51 | "CustomCrossAccountZoneDelegationCustomResourceProviderHandler44A84265": { 52 | "DependsOn": [ 53 | "CustomCrossAccountZoneDelegationCustomResourceProviderRoleED64687B", 54 | ], 55 | "Properties": { 56 | "Code": {"S3Bucket":{"Fn::Sub":"cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}"},"S3Key":"[HASH REMOVED].zip"}, 57 | "Handler": "__entrypoint__.handler", 58 | "MemorySize": 128, 59 | "Role": { 60 | "Fn::GetAtt": [ 61 | "CustomCrossAccountZoneDelegationCustomResourceProviderRoleED64687B", 62 | "Arn", 63 | ], 64 | }, 65 | "Runtime": "nodejs14.x", 66 | "Timeout": 900, 67 | }, 68 | "Type": "AWS::Lambda::Function", 69 | }, 70 | "CustomCrossAccountZoneDelegationCustomResourceProviderRoleED64687B": { 71 | "Properties": { 72 | "AssumeRolePolicyDocument": { 73 | "Statement": [ 74 | { 75 | "Action": "sts:AssumeRole", 76 | "Effect": "Allow", 77 | "Principal": { 78 | "Service": "lambda.amazonaws.com", 79 | }, 80 | }, 81 | ], 82 | "Version": "2012-10-17", 83 | }, 84 | "ManagedPolicyArns": [ 85 | { 86 | "Fn::Sub": "arn:\${AWS::Partition}:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", 87 | }, 88 | ], 89 | }, 90 | "Type": "AWS::IAM::Role", 91 | }, 92 | "DelegatedZoneCert71201BFD": { 93 | "Properties": { 94 | "DomainName": "*.test.awscommunitybuilders.org", 95 | "DomainValidationOptions": [ 96 | { 97 | "DomainName": "*.test.awscommunitybuilders.org", 98 | "HostedZoneId": { 99 | "Ref": "delegatedZone93B2A299", 100 | }, 101 | }, 102 | ], 103 | "Tags": [ 104 | { 105 | "Key": "Name", 106 | "Value": "test-stack/DelegatedZoneCert", 107 | }, 108 | ], 109 | "ValidationMethod": "DNS", 110 | }, 111 | "Type": "AWS::CertificateManager::Certificate", 112 | }, 113 | "DelegationRecordCrossAccountZoneDelegationCustomResource3FB1AD46": { 114 | "DeletionPolicy": "Delete", 115 | "DependsOn": [ 116 | "DelegationRecordcrossaccountzonedelegationhandlerrolePolicy7B31DBF8", 117 | ], 118 | "Properties": { 119 | "AssumeRoleArn": { 120 | "Fn::Join": [ 121 | "", 122 | [ 123 | "arn:", 124 | { 125 | "Ref": "AWS::Partition", 126 | }, 127 | ":iam::9999:role/HostedZoneDelegationRole", 128 | ], 129 | ], 130 | }, 131 | "DelegatedZoneName": "test.awscommunitybuilders.org", 132 | "DelegatedZoneNameServers": { 133 | "Fn::GetAtt": [ 134 | "delegatedZone93B2A299", 135 | "NameServers", 136 | ], 137 | }, 138 | "ParentZoneName": "awscommunitybuilders.org", 139 | "ServiceToken": { 140 | "Fn::GetAtt": [ 141 | "CustomCrossAccountZoneDelegationCustomResourceProviderHandler44A84265", 142 | "Arn", 143 | ], 144 | }, 145 | "TTL": 172800, 146 | }, 147 | "Type": "Custom::CrossAccountZoneDelegation", 148 | "UpdateReplacePolicy": "Delete", 149 | }, 150 | "DelegationRecordcrossaccountzonedelegationhandlerrolePolicy7B31DBF8": { 151 | "Properties": { 152 | "PolicyDocument": { 153 | "Statement": [ 154 | { 155 | "Action": "sts:AssumeRole", 156 | "Effect": "Allow", 157 | "Resource": { 158 | "Fn::Join": [ 159 | "", 160 | [ 161 | "arn:", 162 | { 163 | "Ref": "AWS::Partition", 164 | }, 165 | ":iam::9999:role/HostedZoneDelegationRole", 166 | ], 167 | ], 168 | }, 169 | }, 170 | ], 171 | "Version": "2012-10-17", 172 | }, 173 | "PolicyName": "DelegationRecordcrossaccountzonedelegationhandlerrolePolicy7B31DBF8", 174 | "Roles": [ 175 | { 176 | "Fn::Select": [ 177 | 1, 178 | { 179 | "Fn::Split": [ 180 | "/", 181 | { 182 | "Fn::Select": [ 183 | 5, 184 | { 185 | "Fn::Split": [ 186 | ":", 187 | { 188 | "Fn::GetAtt": [ 189 | "CustomCrossAccountZoneDelegationCustomResourceProviderRoleED64687B", 190 | "Arn", 191 | ], 192 | }, 193 | ], 194 | }, 195 | ], 196 | }, 197 | ], 198 | }, 199 | ], 200 | }, 201 | ], 202 | }, 203 | "Type": "AWS::IAM::Policy", 204 | }, 205 | "delegatedZone93B2A299": { 206 | "Properties": { 207 | "Name": "test.awscommunitybuilders.org.", 208 | }, 209 | "Type": "AWS::Route53::HostedZone", 210 | }, 211 | }, 212 | "Rules": { 213 | "CheckBootstrapVersion": { 214 | "Assertions": [ 215 | { 216 | "Assert": { 217 | "Fn::Not": [ 218 | { 219 | "Fn::Contains": [ 220 | [ 221 | "1", 222 | "2", 223 | "3", 224 | "4", 225 | "5", 226 | ], 227 | { 228 | "Ref": "BootstrapVersion", 229 | }, 230 | ], 231 | }, 232 | ], 233 | }, 234 | "AssertDescription": "CDK bootstrap stack version 6 required. Please run 'cdk bootstrap' with a recent version of the CDK CLI.", 235 | }, 236 | ], 237 | }, 238 | }, 239 | } 240 | `; 241 | -------------------------------------------------------------------------------- /cdk/__snapshots__/github-oidc-stack.spec.ts.snap: -------------------------------------------------------------------------------- 1 | // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html 2 | 3 | exports[`Entire Stack > match a snapshot 1`] = ` 4 | { 5 | "Parameters": { 6 | "BootstrapVersion": { 7 | "Default": "/cdk-bootstrap/hnb659fds/version", 8 | "Description": "Version of the CDK Bootstrap resources in this environment, automatically retrieved from SSM Parameter Store. [cdk:skip]", 9 | "Type": "AWS::SSM::Parameter::Value", 10 | }, 11 | }, 12 | "Resources": { 13 | "CustomAWSCDKOpenIdConnectProviderCustomResourceProviderHandlerF2C543E0": { 14 | "DependsOn": [ 15 | "CustomAWSCDKOpenIdConnectProviderCustomResourceProviderRole517FED65", 16 | ], 17 | "Properties": { 18 | "Code": {"S3Bucket":{"Fn::Sub":"cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}"},"S3Key":"[HASH REMOVED].zip"}, 19 | "Handler": "__entrypoint__.handler", 20 | "MemorySize": 128, 21 | "Role": { 22 | "Fn::GetAtt": [ 23 | "CustomAWSCDKOpenIdConnectProviderCustomResourceProviderRole517FED65", 24 | "Arn", 25 | ], 26 | }, 27 | "Runtime": "nodejs16.x", 28 | "Timeout": 900, 29 | }, 30 | "Type": "AWS::Lambda::Function", 31 | }, 32 | "CustomAWSCDKOpenIdConnectProviderCustomResourceProviderRole517FED65": { 33 | "Properties": { 34 | "AssumeRolePolicyDocument": { 35 | "Statement": [ 36 | { 37 | "Action": "sts:AssumeRole", 38 | "Effect": "Allow", 39 | "Principal": { 40 | "Service": "lambda.amazonaws.com", 41 | }, 42 | }, 43 | ], 44 | "Version": "2012-10-17", 45 | }, 46 | "ManagedPolicyArns": [ 47 | { 48 | "Fn::Sub": "arn:\${AWS::Partition}:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", 49 | }, 50 | ], 51 | "Policies": [ 52 | { 53 | "PolicyDocument": { 54 | "Statement": [ 55 | { 56 | "Action": [ 57 | "iam:CreateOpenIDConnectProvider", 58 | "iam:DeleteOpenIDConnectProvider", 59 | "iam:UpdateOpenIDConnectProviderThumbprint", 60 | "iam:AddClientIDToOpenIDConnectProvider", 61 | "iam:RemoveClientIDFromOpenIDConnectProvider", 62 | ], 63 | "Effect": "Allow", 64 | "Resource": "*", 65 | }, 66 | ], 67 | "Version": "2012-10-17", 68 | }, 69 | "PolicyName": "Inline", 70 | }, 71 | ], 72 | }, 73 | "Type": "AWS::IAM::Role", 74 | }, 75 | "DeployRolerepooneD777995A": { 76 | "Properties": { 77 | "AssumeRolePolicyDocument": { 78 | "Statement": [ 79 | { 80 | "Action": "sts:AssumeRoleWithWebIdentity", 81 | "Condition": { 82 | "StringEquals": { 83 | "token.actions.githubusercontent.com:aud": "sts.amazonaws.com", 84 | }, 85 | "StringLike": { 86 | "token.actions.githubusercontent.com:sub": "repo:aws-community-projects/repoone:*", 87 | }, 88 | }, 89 | "Effect": "Allow", 90 | "Principal": { 91 | "Federated": { 92 | "Ref": "GithubProvider1CDE27EB", 93 | }, 94 | }, 95 | }, 96 | ], 97 | "Version": "2012-10-17", 98 | }, 99 | "PermissionsBoundary": { 100 | "Fn::Join": [ 101 | "", 102 | [ 103 | "arn:", 104 | { 105 | "Ref": "AWS::Partition", 106 | }, 107 | ":iam::", 108 | { 109 | "Ref": "AWS::AccountId", 110 | }, 111 | ":policy/developer-policy", 112 | ], 113 | ], 114 | }, 115 | "Policies": [ 116 | { 117 | "PolicyDocument": { 118 | "Statement": [ 119 | { 120 | "Action": "sts:AssumeRole", 121 | "Effect": "Allow", 122 | "Resource": "arn:aws:iam::*:role/cdk-*", 123 | }, 124 | ], 125 | "Version": "2012-10-17", 126 | }, 127 | "PolicyName": "assume-cdk", 128 | }, 129 | ], 130 | "RoleName": "github-deploy-role-repoone", 131 | }, 132 | "Type": "AWS::IAM::Role", 133 | }, 134 | "DeployRolerepotwo2A45E0FD": { 135 | "Properties": { 136 | "AssumeRolePolicyDocument": { 137 | "Statement": [ 138 | { 139 | "Action": "sts:AssumeRoleWithWebIdentity", 140 | "Condition": { 141 | "StringEquals": { 142 | "token.actions.githubusercontent.com:aud": "sts.amazonaws.com", 143 | }, 144 | "StringLike": { 145 | "token.actions.githubusercontent.com:sub": "repo:aws-community-projects/repotwo:*", 146 | }, 147 | }, 148 | "Effect": "Allow", 149 | "Principal": { 150 | "Federated": { 151 | "Ref": "GithubProvider1CDE27EB", 152 | }, 153 | }, 154 | }, 155 | ], 156 | "Version": "2012-10-17", 157 | }, 158 | "PermissionsBoundary": { 159 | "Fn::Join": [ 160 | "", 161 | [ 162 | "arn:", 163 | { 164 | "Ref": "AWS::Partition", 165 | }, 166 | ":iam::", 167 | { 168 | "Ref": "AWS::AccountId", 169 | }, 170 | ":policy/developer-policy", 171 | ], 172 | ], 173 | }, 174 | "Policies": [ 175 | { 176 | "PolicyDocument": { 177 | "Statement": [ 178 | { 179 | "Action": "sts:AssumeRole", 180 | "Effect": "Allow", 181 | "Resource": "arn:aws:iam::*:role/cdk-*", 182 | }, 183 | ], 184 | "Version": "2012-10-17", 185 | }, 186 | "PolicyName": "assume-cdk", 187 | }, 188 | ], 189 | "RoleName": "github-deploy-role-repotwo", 190 | }, 191 | "Type": "AWS::IAM::Role", 192 | }, 193 | "GithubProvider1CDE27EB": { 194 | "DeletionPolicy": "Delete", 195 | "Properties": { 196 | "ClientIDList": [ 197 | "sts.amazonaws.com", 198 | ], 199 | "CodeHash": "ffa3d5f3876afed62c60735ced8dafb4db2ccbd70a8b2f6b0d9e6eaa5823d631", 200 | "ServiceToken": { 201 | "Fn::GetAtt": [ 202 | "CustomAWSCDKOpenIdConnectProviderCustomResourceProviderHandlerF2C543E0", 203 | "Arn", 204 | ], 205 | }, 206 | "Url": "https://token.actions.githubusercontent.com", 207 | }, 208 | "Type": "Custom::AWSCDKOpenIdConnectProvider", 209 | "UpdateReplacePolicy": "Delete", 210 | }, 211 | }, 212 | "Rules": { 213 | "CheckBootstrapVersion": { 214 | "Assertions": [ 215 | { 216 | "Assert": { 217 | "Fn::Not": [ 218 | { 219 | "Fn::Contains": [ 220 | [ 221 | "1", 222 | "2", 223 | "3", 224 | "4", 225 | "5", 226 | ], 227 | { 228 | "Ref": "BootstrapVersion", 229 | }, 230 | ], 231 | }, 232 | ], 233 | }, 234 | "AssertDescription": "CDK bootstrap stack version 6 required. Please run 'cdk bootstrap' with a recent version of the CDK CLI.", 235 | }, 236 | ], 237 | }, 238 | }, 239 | } 240 | `; 241 | -------------------------------------------------------------------------------- /cdk/__snapshots__/hosted-zone-stack.spec.ts.snap: -------------------------------------------------------------------------------- 1 | // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html 2 | 3 | exports[`Entire Stack > match a snapshot 1`] = ` 4 | { 5 | "Parameters": { 6 | "BootstrapVersion": { 7 | "Default": "/cdk-bootstrap/hnb659fds/version", 8 | "Description": "Version of the CDK Bootstrap resources in this environment, automatically retrieved from SSM Parameter Store. [cdk:skip]", 9 | "Type": "AWS::SSM::Parameter::Value", 10 | }, 11 | }, 12 | "Resources": { 13 | "RootZone831A5F27": { 14 | "Properties": { 15 | "Name": "awscommunitybuilders.org.", 16 | }, 17 | "Type": "AWS::Route53::HostedZone", 18 | }, 19 | "RootZoneOrganizationRole5B7BD2F8": { 20 | "Properties": { 21 | "AssumeRolePolicyDocument": { 22 | "Statement": [ 23 | { 24 | "Action": "sts:AssumeRole", 25 | "Condition": { 26 | "StringEquals": { 27 | "aws:PrincipalOrgID": "o-vumqjghgoz", 28 | }, 29 | }, 30 | "Effect": "Allow", 31 | "Principal": { 32 | "AWS": "*", 33 | }, 34 | }, 35 | ], 36 | "Version": "2012-10-17", 37 | }, 38 | "RoleName": "HostedZoneDelegationRole", 39 | }, 40 | "Type": "AWS::IAM::Role", 41 | }, 42 | "RootZoneOrganizationRoleDefaultPolicyD1D7CC29": { 43 | "Properties": { 44 | "PolicyDocument": { 45 | "Statement": [ 46 | { 47 | "Action": "route53:ChangeResourceRecordSets", 48 | "Condition": { 49 | "ForAllValues:StringEquals": { 50 | "route53:ChangeResourceRecordSetsActions": [ 51 | "UPSERT", 52 | "DELETE", 53 | ], 54 | "route53:ChangeResourceRecordSetsRecordTypes": [ 55 | "NS", 56 | ], 57 | }, 58 | }, 59 | "Effect": "Allow", 60 | "Resource": { 61 | "Fn::Join": [ 62 | "", 63 | [ 64 | "arn:", 65 | { 66 | "Ref": "AWS::Partition", 67 | }, 68 | ":route53:::hostedzone/", 69 | { 70 | "Ref": "RootZone831A5F27", 71 | }, 72 | ], 73 | ], 74 | }, 75 | }, 76 | { 77 | "Action": "route53:ListHostedZonesByName", 78 | "Effect": "Allow", 79 | "Resource": "*", 80 | }, 81 | ], 82 | "Version": "2012-10-17", 83 | }, 84 | "PolicyName": "RootZoneOrganizationRoleDefaultPolicyD1D7CC29", 85 | "Roles": [ 86 | { 87 | "Ref": "RootZoneOrganizationRole5B7BD2F8", 88 | }, 89 | ], 90 | }, 91 | "Type": "AWS::IAM::Policy", 92 | }, 93 | }, 94 | "Rules": { 95 | "CheckBootstrapVersion": { 96 | "Assertions": [ 97 | { 98 | "Assert": { 99 | "Fn::Not": [ 100 | { 101 | "Fn::Contains": [ 102 | [ 103 | "1", 104 | "2", 105 | "3", 106 | "4", 107 | "5", 108 | ], 109 | { 110 | "Ref": "BootstrapVersion", 111 | }, 112 | ], 113 | }, 114 | ], 115 | }, 116 | "AssertDescription": "CDK bootstrap stack version 6 required. Please run 'cdk bootstrap' with a recent version of the CDK CLI.", 117 | }, 118 | ], 119 | }, 120 | }, 121 | } 122 | `; 123 | -------------------------------------------------------------------------------- /cdk/aws-organization-for-devs.ts: -------------------------------------------------------------------------------- 1 | import { App } from 'aws-cdk-lib'; 2 | 3 | import { DelegatedZoneStack } from './delegated-zone-stack'; 4 | import { HostedZoneStack } from './hosted-zone-stack'; 5 | import { GithubOidcStack } from './github-oidc-stack'; 6 | 7 | const app = new App(); 8 | 9 | const rootAccountId = '353228500194'; 10 | 11 | const accounts = [ 12 | { accountId: '799776970420', name: 'sandbox' }, 13 | { accountId: '012208286009', name: 'test' }, 14 | { accountId: '865725118528', name: 'production' }, 15 | ]; 16 | 17 | const rootStack = new HostedZoneStack(app, 'hosted-zone-stack', { 18 | env: { account: rootAccountId, region: 'us-east-1' }, 19 | }); 20 | 21 | const accountStacks = accounts.map( 22 | (account) => 23 | new DelegatedZoneStack(app, `delegated-zone-stack-${account.name}`, { 24 | env: { account: account.accountId, region: 'us-east-1' }, 25 | name: account.name, 26 | rootAccountId, 27 | }), 28 | ); 29 | 30 | new GithubOidcStack(app, 'github-oidc-stack', { 31 | env: { account: '447002520154', region: 'eu-west-1' }, 32 | repos: ['cicd'], 33 | }); 34 | 35 | accountStacks.forEach((accountStack) => accountStack.addDependency(rootStack)); 36 | -------------------------------------------------------------------------------- /cdk/delegated-zone-stack.spec.ts: -------------------------------------------------------------------------------- 1 | import { App } from 'aws-cdk-lib'; 2 | import { Template } from 'aws-cdk-lib/assertions'; 3 | import { describe, expect, test } from 'vitest'; 4 | 5 | import { DelegatedZoneStack } from './delegated-zone-stack'; 6 | 7 | describe('Entire Stack', () => { 8 | test('match a snapshot', () => { 9 | const app = new App(); 10 | const stack = new DelegatedZoneStack(app, 'test-stack', { 11 | name: 'test', 12 | rootAccountId: '9999', 13 | }); 14 | const template = Template.fromStack(stack); 15 | 16 | expect(template).toMatchSnapshot(); 17 | }); 18 | }); 19 | -------------------------------------------------------------------------------- /cdk/delegated-zone-stack.ts: -------------------------------------------------------------------------------- 1 | import { CfnOutput, Fn, RemovalPolicy, SecretValue, Stack, StackProps } from 'aws-cdk-lib'; 2 | import { Certificate, CertificateValidation } from 'aws-cdk-lib/aws-certificatemanager'; 3 | import { Role } from 'aws-cdk-lib/aws-iam'; 4 | import { CrossAccountZoneDelegationRecord, PublicHostedZone } from 'aws-cdk-lib/aws-route53'; 5 | import { Secret } from 'aws-cdk-lib/aws-secretsmanager'; 6 | import { Construct } from 'constructs'; 7 | 8 | interface DelegatedZoneStackProps extends StackProps { 9 | name: string; 10 | rootAccountId: string; 11 | } 12 | 13 | export class DelegatedZoneStack extends Stack { 14 | constructor(scope: Construct, id: string, props: DelegatedZoneStackProps) { 15 | super(scope, id, props); 16 | 17 | const { name, rootAccountId } = props; 18 | 19 | const domainName = `${name}.awscommunitybuilders.org`; 20 | 21 | const delegatedZone = new PublicHostedZone(this, 'delegatedZone', { 22 | zoneName: domainName, 23 | }); 24 | 25 | const delegationRoleArn = Stack.of(this).formatArn({ 26 | account: rootAccountId, 27 | region: '', 28 | resource: 'role', 29 | resourceName: 'HostedZoneDelegationRole', 30 | service: 'iam', 31 | }); 32 | const delegationRole = Role.fromRoleArn(this, 'DelegationRole', delegationRoleArn); 33 | 34 | new CrossAccountZoneDelegationRecord(this, 'DelegationRecord', { 35 | delegationRole, 36 | delegatedZone, 37 | parentHostedZoneName: 'awscommunitybuilders.org', 38 | }); 39 | 40 | const certificate = new Certificate(this, 'DelegatedZoneCert', { 41 | domainName: `*.${domainName}`, 42 | validation: CertificateValidation.fromDns(delegatedZone), 43 | }); 44 | 45 | new Secret(this, 'AccountCerteArn', { 46 | removalPolicy: RemovalPolicy.DESTROY, 47 | replicaRegions: [{ region: 'eu-west-1' }], 48 | secretName: '/account/certificateArn', 49 | secretStringValue: SecretValue.unsafePlainText(certificate.certificateArn), 50 | }); 51 | 52 | new CfnOutput(this, 'nameservers', { 53 | description: 'nameservers', 54 | value: Fn.join(', ', delegatedZone.hostedZoneNameServers!), 55 | }); 56 | 57 | new CfnOutput(this, 'certArn', { 58 | description: 'certificate arn', 59 | value: certificate.certificateArn, 60 | }); 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /cdk/github-oidc-stack.spec.ts: -------------------------------------------------------------------------------- 1 | import { App } from 'aws-cdk-lib'; 2 | import { Template } from 'aws-cdk-lib/assertions'; 3 | import { describe, expect, test } from 'vitest'; 4 | 5 | import { GithubOidcStack } from './github-oidc-stack'; 6 | 7 | describe('Entire Stack', () => { 8 | test('match a snapshot', () => { 9 | const app = new App(); 10 | const stack = new GithubOidcStack(app, 'test-stack', { 11 | repos: ['repoone', 'repotwo'], 12 | }); 13 | const template = Template.fromStack(stack); 14 | 15 | expect(template).toMatchSnapshot(); 16 | }); 17 | }); 18 | -------------------------------------------------------------------------------- /cdk/github-oidc-stack.ts: -------------------------------------------------------------------------------- 1 | import { GithubActionsIdentityProvider, GithubActionsRole } from 'aws-cdk-github-oidc'; 2 | import { Stack, StackProps } from 'aws-cdk-lib'; 3 | import { ManagedPolicy, PolicyDocument, PolicyStatement } from 'aws-cdk-lib/aws-iam'; 4 | import { Construct } from 'constructs'; 5 | 6 | interface GithubOidcStackProps extends StackProps { 7 | repos: string[]; 8 | } 9 | 10 | export class GithubOidcStack extends Stack { 11 | constructor(scope: Construct, id: string, props: GithubOidcStackProps) { 12 | super(scope, id, props); 13 | 14 | const { repos } = props; 15 | 16 | // see https://github.com/aripalo/aws-cdk-github-oidc/issues/24 17 | ( 18 | GithubActionsIdentityProvider as unknown as GithubActionsIdentityProvider & { thumbprints: undefined } 19 | ).thumbprints = undefined; 20 | 21 | const provider = new GithubActionsIdentityProvider(this, 'GithubProvider'); 22 | 23 | const permissionsBoundary = ManagedPolicy.fromManagedPolicyName(this, 'PermissionsBoundary', 'developer-policy'); 24 | 25 | repos.forEach( 26 | (repo) => 27 | new GithubActionsRole(this, `DeployRole-${repo}`, { 28 | inlinePolicies: { 29 | 'assume-cdk': new PolicyDocument({ 30 | statements: [ 31 | new PolicyStatement({ actions: ['sts:AssumeRole'], resources: ['arn:aws:iam::*:role/cdk-*'] }), 32 | ], 33 | }), 34 | }, 35 | owner: 'aws-community-projects', 36 | permissionsBoundary, 37 | provider, 38 | repo, 39 | roleName: `github-deploy-role-${repo}`, 40 | }), 41 | ); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /cdk/hosted-zone-stack.spec.ts: -------------------------------------------------------------------------------- 1 | import { App } from 'aws-cdk-lib'; 2 | import { Template } from 'aws-cdk-lib/assertions'; 3 | import { describe, expect, test } from 'vitest'; 4 | 5 | import { HostedZoneStack } from './hosted-zone-stack'; 6 | 7 | describe('Entire Stack', () => { 8 | test('match a snapshot', () => { 9 | const app = new App(); 10 | const stack = new HostedZoneStack(app, 'test-stack'); 11 | const template = Template.fromStack(stack); 12 | 13 | expect(template).toMatchSnapshot(); 14 | }); 15 | }); 16 | -------------------------------------------------------------------------------- /cdk/hosted-zone-stack.ts: -------------------------------------------------------------------------------- 1 | import { Stack, StackProps } from 'aws-cdk-lib'; 2 | import { OrganizationPrincipal, Role } from 'aws-cdk-lib/aws-iam'; 3 | import { PublicHostedZone } from 'aws-cdk-lib/aws-route53'; 4 | import { Construct } from 'constructs'; 5 | 6 | export class HostedZoneStack extends Stack { 7 | constructor(scope: Construct, id: string, props?: StackProps) { 8 | super(scope, id, props); 9 | 10 | const hostedZone = new PublicHostedZone(this, 'RootZone', { 11 | zoneName: 'awscommunitybuilders.org', 12 | }); 13 | 14 | const role = new Role(this, 'RootZoneOrganizationRole', { 15 | assumedBy: new OrganizationPrincipal('o-vumqjghgoz'), 16 | roleName: 'HostedZoneDelegationRole', 17 | }); 18 | 19 | hostedZone.grantDelegation(role); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /media/organization for developers.drawio.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws-community-projects/aws-organization-for-devs/5aafa9c03bc8f00ca9de4e574fce20a494718d63/media/organization for developers.drawio.png -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "aws-organization-for-devs", 3 | "version": "0.1.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "aws-organization-for-devs", 9 | "version": "0.1.0", 10 | "dependencies": { 11 | "aws-cdk-github-oidc": "^2.3.2", 12 | "aws-cdk-lib": "^2.76.0", 13 | "constructs": "^10.2.3" 14 | }, 15 | "devDependencies": { 16 | "@types/node": "^18.15.13", 17 | "@vitest/coverage-c8": "^0.30.1", 18 | "aws-cdk": "^2.76.0", 19 | "rimraf": "^5.0.0", 20 | "ts-node": "^10.9.1", 21 | "typescript": "^5.0.4", 22 | "vitest": "^0.30.1" 23 | } 24 | }, 25 | "node_modules/@aws-cdk/asset-awscli-v1": { 26 | "version": "2.2.135", 27 | "resolved": "https://registry.npmjs.org/@aws-cdk/asset-awscli-v1/-/asset-awscli-v1-2.2.135.tgz", 28 | "integrity": "sha512-fdkrAjs/RQ9AmapA09cY5Gr9A+N+zYvUj0fuLYqeXjpl2BxLIpvkyfsL9IBxI/9lAUHHriLj6z84N6wZCgHscg==" 29 | }, 30 | "node_modules/@aws-cdk/asset-kubectl-v20": { 31 | "version": "2.1.1", 32 | "resolved": "https://registry.npmjs.org/@aws-cdk/asset-kubectl-v20/-/asset-kubectl-v20-2.1.1.tgz", 33 | "integrity": "sha512-U1ntiX8XiMRRRH5J1IdC+1t5CE89015cwyt5U63Cpk0GnMlN5+h9WsWMlKlPXZR4rdq/m806JRlBMRpBUB2Dhw==" 34 | }, 35 | "node_modules/@aws-cdk/asset-node-proxy-agent-v5": { 36 | "version": "2.0.111", 37 | "resolved": "https://registry.npmjs.org/@aws-cdk/asset-node-proxy-agent-v5/-/asset-node-proxy-agent-v5-2.0.111.tgz", 38 | "integrity": "sha512-qfHTsN6E94gpAjc833KRoonZ+hN/n3IAvU5/LW1CLV0WGx56phThXo7rgUusOXI/Yna7K8FPgcmMDwSq0hD3WA==" 39 | }, 40 | "node_modules/@bcoe/v8-coverage": { 41 | "version": "0.2.3", 42 | "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", 43 | "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", 44 | "dev": true 45 | }, 46 | "node_modules/@cspotcode/source-map-support": { 47 | "version": "0.8.1", 48 | "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", 49 | "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", 50 | "dev": true, 51 | "dependencies": { 52 | "@jridgewell/trace-mapping": "0.3.9" 53 | }, 54 | "engines": { 55 | "node": ">=12" 56 | } 57 | }, 58 | "node_modules/@esbuild/android-arm": { 59 | "version": "0.17.18", 60 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.18.tgz", 61 | "integrity": "sha512-EmwL+vUBZJ7mhFCs5lA4ZimpUH3WMAoqvOIYhVQwdIgSpHC8ImHdsRyhHAVxpDYUSm0lWvd63z0XH1IlImS2Qw==", 62 | "cpu": [ 63 | "arm" 64 | ], 65 | "dev": true, 66 | "optional": true, 67 | "os": [ 68 | "android" 69 | ], 70 | "engines": { 71 | "node": ">=12" 72 | } 73 | }, 74 | "node_modules/@esbuild/android-arm64": { 75 | "version": "0.17.18", 76 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.18.tgz", 77 | "integrity": "sha512-/iq0aK0eeHgSC3z55ucMAHO05OIqmQehiGay8eP5l/5l+iEr4EIbh4/MI8xD9qRFjqzgkc0JkX0LculNC9mXBw==", 78 | "cpu": [ 79 | "arm64" 80 | ], 81 | "dev": true, 82 | "optional": true, 83 | "os": [ 84 | "android" 85 | ], 86 | "engines": { 87 | "node": ">=12" 88 | } 89 | }, 90 | "node_modules/@esbuild/android-x64": { 91 | "version": "0.17.18", 92 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.18.tgz", 93 | "integrity": "sha512-x+0efYNBF3NPW2Xc5bFOSFW7tTXdAcpfEg2nXmxegm4mJuVeS+i109m/7HMiOQ6M12aVGGFlqJX3RhNdYM2lWg==", 94 | "cpu": [ 95 | "x64" 96 | ], 97 | "dev": true, 98 | "optional": true, 99 | "os": [ 100 | "android" 101 | ], 102 | "engines": { 103 | "node": ">=12" 104 | } 105 | }, 106 | "node_modules/@esbuild/darwin-arm64": { 107 | "version": "0.17.18", 108 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.18.tgz", 109 | "integrity": "sha512-6tY+djEAdF48M1ONWnQb1C+6LiXrKjmqjzPNPWXhu/GzOHTHX2nh8Mo2ZAmBFg0kIodHhciEgUBtcYCAIjGbjQ==", 110 | "cpu": [ 111 | "arm64" 112 | ], 113 | "dev": true, 114 | "optional": true, 115 | "os": [ 116 | "darwin" 117 | ], 118 | "engines": { 119 | "node": ">=12" 120 | } 121 | }, 122 | "node_modules/@esbuild/darwin-x64": { 123 | "version": "0.17.18", 124 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.18.tgz", 125 | "integrity": "sha512-Qq84ykvLvya3dO49wVC9FFCNUfSrQJLbxhoQk/TE1r6MjHo3sFF2tlJCwMjhkBVq3/ahUisj7+EpRSz0/+8+9A==", 126 | "cpu": [ 127 | "x64" 128 | ], 129 | "dev": true, 130 | "optional": true, 131 | "os": [ 132 | "darwin" 133 | ], 134 | "engines": { 135 | "node": ">=12" 136 | } 137 | }, 138 | "node_modules/@esbuild/freebsd-arm64": { 139 | "version": "0.17.18", 140 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.18.tgz", 141 | "integrity": "sha512-fw/ZfxfAzuHfaQeMDhbzxp9mc+mHn1Y94VDHFHjGvt2Uxl10mT4CDavHm+/L9KG441t1QdABqkVYwakMUeyLRA==", 142 | "cpu": [ 143 | "arm64" 144 | ], 145 | "dev": true, 146 | "optional": true, 147 | "os": [ 148 | "freebsd" 149 | ], 150 | "engines": { 151 | "node": ">=12" 152 | } 153 | }, 154 | "node_modules/@esbuild/freebsd-x64": { 155 | "version": "0.17.18", 156 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.18.tgz", 157 | "integrity": "sha512-FQFbRtTaEi8ZBi/A6kxOC0V0E9B/97vPdYjY9NdawyLd4Qk5VD5g2pbWN2VR1c0xhzcJm74HWpObPszWC+qTew==", 158 | "cpu": [ 159 | "x64" 160 | ], 161 | "dev": true, 162 | "optional": true, 163 | "os": [ 164 | "freebsd" 165 | ], 166 | "engines": { 167 | "node": ">=12" 168 | } 169 | }, 170 | "node_modules/@esbuild/linux-arm": { 171 | "version": "0.17.18", 172 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.18.tgz", 173 | "integrity": "sha512-jW+UCM40LzHcouIaqv3e/oRs0JM76JfhHjCavPxMUti7VAPh8CaGSlS7cmyrdpzSk7A+8f0hiedHqr/LMnfijg==", 174 | "cpu": [ 175 | "arm" 176 | ], 177 | "dev": true, 178 | "optional": true, 179 | "os": [ 180 | "linux" 181 | ], 182 | "engines": { 183 | "node": ">=12" 184 | } 185 | }, 186 | "node_modules/@esbuild/linux-arm64": { 187 | "version": "0.17.18", 188 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.18.tgz", 189 | "integrity": "sha512-R7pZvQZFOY2sxUG8P6A21eq6q+eBv7JPQYIybHVf1XkQYC+lT7nDBdC7wWKTrbvMXKRaGudp/dzZCwL/863mZQ==", 190 | "cpu": [ 191 | "arm64" 192 | ], 193 | "dev": true, 194 | "optional": true, 195 | "os": [ 196 | "linux" 197 | ], 198 | "engines": { 199 | "node": ">=12" 200 | } 201 | }, 202 | "node_modules/@esbuild/linux-ia32": { 203 | "version": "0.17.18", 204 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.18.tgz", 205 | "integrity": "sha512-ygIMc3I7wxgXIxk6j3V00VlABIjq260i967Cp9BNAk5pOOpIXmd1RFQJQX9Io7KRsthDrQYrtcx7QCof4o3ZoQ==", 206 | "cpu": [ 207 | "ia32" 208 | ], 209 | "dev": true, 210 | "optional": true, 211 | "os": [ 212 | "linux" 213 | ], 214 | "engines": { 215 | "node": ">=12" 216 | } 217 | }, 218 | "node_modules/@esbuild/linux-loong64": { 219 | "version": "0.17.18", 220 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.18.tgz", 221 | "integrity": "sha512-bvPG+MyFs5ZlwYclCG1D744oHk1Pv7j8psF5TfYx7otCVmcJsEXgFEhQkbhNW8otDHL1a2KDINW20cfCgnzgMQ==", 222 | "cpu": [ 223 | "loong64" 224 | ], 225 | "dev": true, 226 | "optional": true, 227 | "os": [ 228 | "linux" 229 | ], 230 | "engines": { 231 | "node": ">=12" 232 | } 233 | }, 234 | "node_modules/@esbuild/linux-mips64el": { 235 | "version": "0.17.18", 236 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.18.tgz", 237 | "integrity": "sha512-oVqckATOAGuiUOa6wr8TXaVPSa+6IwVJrGidmNZS1cZVx0HqkTMkqFGD2HIx9H1RvOwFeWYdaYbdY6B89KUMxA==", 238 | "cpu": [ 239 | "mips64el" 240 | ], 241 | "dev": true, 242 | "optional": true, 243 | "os": [ 244 | "linux" 245 | ], 246 | "engines": { 247 | "node": ">=12" 248 | } 249 | }, 250 | "node_modules/@esbuild/linux-ppc64": { 251 | "version": "0.17.18", 252 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.18.tgz", 253 | "integrity": "sha512-3dLlQO+b/LnQNxgH4l9rqa2/IwRJVN9u/bK63FhOPB4xqiRqlQAU0qDU3JJuf0BmaH0yytTBdoSBHrb2jqc5qQ==", 254 | "cpu": [ 255 | "ppc64" 256 | ], 257 | "dev": true, 258 | "optional": true, 259 | "os": [ 260 | "linux" 261 | ], 262 | "engines": { 263 | "node": ">=12" 264 | } 265 | }, 266 | "node_modules/@esbuild/linux-riscv64": { 267 | "version": "0.17.18", 268 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.18.tgz", 269 | "integrity": "sha512-/x7leOyDPjZV3TcsdfrSI107zItVnsX1q2nho7hbbQoKnmoeUWjs+08rKKt4AUXju7+3aRZSsKrJtaRmsdL1xA==", 270 | "cpu": [ 271 | "riscv64" 272 | ], 273 | "dev": true, 274 | "optional": true, 275 | "os": [ 276 | "linux" 277 | ], 278 | "engines": { 279 | "node": ">=12" 280 | } 281 | }, 282 | "node_modules/@esbuild/linux-s390x": { 283 | "version": "0.17.18", 284 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.18.tgz", 285 | "integrity": "sha512-cX0I8Q9xQkL/6F5zWdYmVf5JSQt+ZfZD2bJudZrWD+4mnUvoZ3TDDXtDX2mUaq6upMFv9FlfIh4Gfun0tbGzuw==", 286 | "cpu": [ 287 | "s390x" 288 | ], 289 | "dev": true, 290 | "optional": true, 291 | "os": [ 292 | "linux" 293 | ], 294 | "engines": { 295 | "node": ">=12" 296 | } 297 | }, 298 | "node_modules/@esbuild/linux-x64": { 299 | "version": "0.17.18", 300 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.18.tgz", 301 | "integrity": "sha512-66RmRsPlYy4jFl0vG80GcNRdirx4nVWAzJmXkevgphP1qf4dsLQCpSKGM3DUQCojwU1hnepI63gNZdrr02wHUA==", 302 | "cpu": [ 303 | "x64" 304 | ], 305 | "dev": true, 306 | "optional": true, 307 | "os": [ 308 | "linux" 309 | ], 310 | "engines": { 311 | "node": ">=12" 312 | } 313 | }, 314 | "node_modules/@esbuild/netbsd-x64": { 315 | "version": "0.17.18", 316 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.18.tgz", 317 | "integrity": "sha512-95IRY7mI2yrkLlTLb1gpDxdC5WLC5mZDi+kA9dmM5XAGxCME0F8i4bYH4jZreaJ6lIZ0B8hTrweqG1fUyW7jbg==", 318 | "cpu": [ 319 | "x64" 320 | ], 321 | "dev": true, 322 | "optional": true, 323 | "os": [ 324 | "netbsd" 325 | ], 326 | "engines": { 327 | "node": ">=12" 328 | } 329 | }, 330 | "node_modules/@esbuild/openbsd-x64": { 331 | "version": "0.17.18", 332 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.18.tgz", 333 | "integrity": "sha512-WevVOgcng+8hSZ4Q3BKL3n1xTv5H6Nb53cBrtzzEjDbbnOmucEVcZeGCsCOi9bAOcDYEeBZbD2SJNBxlfP3qiA==", 334 | "cpu": [ 335 | "x64" 336 | ], 337 | "dev": true, 338 | "optional": true, 339 | "os": [ 340 | "openbsd" 341 | ], 342 | "engines": { 343 | "node": ">=12" 344 | } 345 | }, 346 | "node_modules/@esbuild/sunos-x64": { 347 | "version": "0.17.18", 348 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.18.tgz", 349 | "integrity": "sha512-Rzf4QfQagnwhQXVBS3BYUlxmEbcV7MY+BH5vfDZekU5eYpcffHSyjU8T0xucKVuOcdCsMo+Ur5wmgQJH2GfNrg==", 350 | "cpu": [ 351 | "x64" 352 | ], 353 | "dev": true, 354 | "optional": true, 355 | "os": [ 356 | "sunos" 357 | ], 358 | "engines": { 359 | "node": ">=12" 360 | } 361 | }, 362 | "node_modules/@esbuild/win32-arm64": { 363 | "version": "0.17.18", 364 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.18.tgz", 365 | "integrity": "sha512-Kb3Ko/KKaWhjeAm2YoT/cNZaHaD1Yk/pa3FTsmqo9uFh1D1Rfco7BBLIPdDOozrObj2sahslFuAQGvWbgWldAg==", 366 | "cpu": [ 367 | "arm64" 368 | ], 369 | "dev": true, 370 | "optional": true, 371 | "os": [ 372 | "win32" 373 | ], 374 | "engines": { 375 | "node": ">=12" 376 | } 377 | }, 378 | "node_modules/@esbuild/win32-ia32": { 379 | "version": "0.17.18", 380 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.18.tgz", 381 | "integrity": "sha512-0/xUMIdkVHwkvxfbd5+lfG7mHOf2FRrxNbPiKWg9C4fFrB8H0guClmaM3BFiRUYrznVoyxTIyC/Ou2B7QQSwmw==", 382 | "cpu": [ 383 | "ia32" 384 | ], 385 | "dev": true, 386 | "optional": true, 387 | "os": [ 388 | "win32" 389 | ], 390 | "engines": { 391 | "node": ">=12" 392 | } 393 | }, 394 | "node_modules/@esbuild/win32-x64": { 395 | "version": "0.17.18", 396 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.18.tgz", 397 | "integrity": "sha512-qU25Ma1I3NqTSHJUOKi9sAH1/Mzuvlke0ioMJRthLXKm7JiSKVwFghlGbDLOO2sARECGhja4xYfRAZNPAkooYg==", 398 | "cpu": [ 399 | "x64" 400 | ], 401 | "dev": true, 402 | "optional": true, 403 | "os": [ 404 | "win32" 405 | ], 406 | "engines": { 407 | "node": ">=12" 408 | } 409 | }, 410 | "node_modules/@istanbuljs/schema": { 411 | "version": "0.1.3", 412 | "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", 413 | "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", 414 | "dev": true, 415 | "engines": { 416 | "node": ">=8" 417 | } 418 | }, 419 | "node_modules/@jridgewell/resolve-uri": { 420 | "version": "3.1.1", 421 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", 422 | "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", 423 | "dev": true, 424 | "engines": { 425 | "node": ">=6.0.0" 426 | } 427 | }, 428 | "node_modules/@jridgewell/sourcemap-codec": { 429 | "version": "1.4.15", 430 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", 431 | "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", 432 | "dev": true 433 | }, 434 | "node_modules/@jridgewell/trace-mapping": { 435 | "version": "0.3.9", 436 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", 437 | "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", 438 | "dev": true, 439 | "dependencies": { 440 | "@jridgewell/resolve-uri": "^3.0.3", 441 | "@jridgewell/sourcemap-codec": "^1.4.10" 442 | } 443 | }, 444 | "node_modules/@tsconfig/node10": { 445 | "version": "1.0.9", 446 | "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", 447 | "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", 448 | "dev": true 449 | }, 450 | "node_modules/@tsconfig/node12": { 451 | "version": "1.0.11", 452 | "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", 453 | "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", 454 | "dev": true 455 | }, 456 | "node_modules/@tsconfig/node14": { 457 | "version": "1.0.3", 458 | "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", 459 | "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", 460 | "dev": true 461 | }, 462 | "node_modules/@tsconfig/node16": { 463 | "version": "1.0.3", 464 | "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", 465 | "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", 466 | "dev": true 467 | }, 468 | "node_modules/@types/chai": { 469 | "version": "4.3.4", 470 | "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.4.tgz", 471 | "integrity": "sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==", 472 | "dev": true 473 | }, 474 | "node_modules/@types/chai-subset": { 475 | "version": "1.3.3", 476 | "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.3.tgz", 477 | "integrity": "sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==", 478 | "dev": true, 479 | "dependencies": { 480 | "@types/chai": "*" 481 | } 482 | }, 483 | "node_modules/@types/istanbul-lib-coverage": { 484 | "version": "2.0.4", 485 | "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", 486 | "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", 487 | "dev": true 488 | }, 489 | "node_modules/@types/node": { 490 | "version": "18.15.13", 491 | "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.13.tgz", 492 | "integrity": "sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==", 493 | "dev": true 494 | }, 495 | "node_modules/@vitest/coverage-c8": { 496 | "version": "0.30.1", 497 | "resolved": "https://registry.npmjs.org/@vitest/coverage-c8/-/coverage-c8-0.30.1.tgz", 498 | "integrity": "sha512-/Wa3dtSuckpdngAmiCwowaEXXgJkqPrtfvrs9HTB9QoEfNbZWPu4E4cjEn4lJZb4qcGf4fxFtUA2f9DnDNAzBA==", 499 | "dev": true, 500 | "dependencies": { 501 | "c8": "^7.13.0", 502 | "picocolors": "^1.0.0", 503 | "std-env": "^3.3.2" 504 | }, 505 | "funding": { 506 | "url": "https://github.com/sponsors/antfu" 507 | }, 508 | "peerDependencies": { 509 | "vitest": ">=0.30.0 <1" 510 | } 511 | }, 512 | "node_modules/@vitest/expect": { 513 | "version": "0.30.1", 514 | "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-0.30.1.tgz", 515 | "integrity": "sha512-c3kbEtN8XXJSeN81iDGq29bUzSjQhjES2WR3aColsS4lPGbivwLtas4DNUe0jD9gg/FYGIteqOenfU95EFituw==", 516 | "dev": true, 517 | "dependencies": { 518 | "@vitest/spy": "0.30.1", 519 | "@vitest/utils": "0.30.1", 520 | "chai": "^4.3.7" 521 | } 522 | }, 523 | "node_modules/@vitest/runner": { 524 | "version": "0.30.1", 525 | "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-0.30.1.tgz", 526 | "integrity": "sha512-W62kT/8i0TF1UBCNMRtRMOBWJKRnNyv9RrjIgdUryEe0wNpGZvvwPDLuzYdxvgSckzjp54DSpv1xUbv4BQ0qVA==", 527 | "dev": true, 528 | "dependencies": { 529 | "@vitest/utils": "0.30.1", 530 | "concordance": "^5.0.4", 531 | "p-limit": "^4.0.0", 532 | "pathe": "^1.1.0" 533 | } 534 | }, 535 | "node_modules/@vitest/runner/node_modules/p-limit": { 536 | "version": "4.0.0", 537 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", 538 | "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", 539 | "dev": true, 540 | "dependencies": { 541 | "yocto-queue": "^1.0.0" 542 | }, 543 | "engines": { 544 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 545 | }, 546 | "funding": { 547 | "url": "https://github.com/sponsors/sindresorhus" 548 | } 549 | }, 550 | "node_modules/@vitest/runner/node_modules/yocto-queue": { 551 | "version": "1.0.0", 552 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", 553 | "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", 554 | "dev": true, 555 | "engines": { 556 | "node": ">=12.20" 557 | }, 558 | "funding": { 559 | "url": "https://github.com/sponsors/sindresorhus" 560 | } 561 | }, 562 | "node_modules/@vitest/snapshot": { 563 | "version": "0.30.1", 564 | "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-0.30.1.tgz", 565 | "integrity": "sha512-fJZqKrE99zo27uoZA/azgWyWbFvM1rw2APS05yB0JaLwUIg9aUtvvnBf4q7JWhEcAHmSwbrxKFgyBUga6tq9Tw==", 566 | "dev": true, 567 | "dependencies": { 568 | "magic-string": "^0.30.0", 569 | "pathe": "^1.1.0", 570 | "pretty-format": "^27.5.1" 571 | } 572 | }, 573 | "node_modules/@vitest/spy": { 574 | "version": "0.30.1", 575 | "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-0.30.1.tgz", 576 | "integrity": "sha512-YfJeIf37GvTZe04ZKxzJfnNNuNSmTEGnla2OdL60C8od16f3zOfv9q9K0nNii0NfjDJRt/CVN/POuY5/zTS+BA==", 577 | "dev": true, 578 | "dependencies": { 579 | "tinyspy": "^2.1.0" 580 | } 581 | }, 582 | "node_modules/@vitest/utils": { 583 | "version": "0.30.1", 584 | "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-0.30.1.tgz", 585 | "integrity": "sha512-/c8Xv2zUVc+rnNt84QF0Y0zkfxnaGhp87K2dYJMLtLOIckPzuxLVzAtFCicGFdB4NeBHNzTRr1tNn7rCtQcWFA==", 586 | "dev": true, 587 | "dependencies": { 588 | "concordance": "^5.0.4", 589 | "loupe": "^2.3.6", 590 | "pretty-format": "^27.5.1" 591 | } 592 | }, 593 | "node_modules/acorn": { 594 | "version": "8.8.2", 595 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", 596 | "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", 597 | "dev": true, 598 | "bin": { 599 | "acorn": "bin/acorn" 600 | }, 601 | "engines": { 602 | "node": ">=0.4.0" 603 | } 604 | }, 605 | "node_modules/acorn-walk": { 606 | "version": "8.2.0", 607 | "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", 608 | "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", 609 | "dev": true, 610 | "engines": { 611 | "node": ">=0.4.0" 612 | } 613 | }, 614 | "node_modules/ansi-regex": { 615 | "version": "5.0.1", 616 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 617 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 618 | "dev": true, 619 | "engines": { 620 | "node": ">=8" 621 | } 622 | }, 623 | "node_modules/ansi-styles": { 624 | "version": "5.2.0", 625 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", 626 | "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", 627 | "dev": true, 628 | "engines": { 629 | "node": ">=10" 630 | }, 631 | "funding": { 632 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 633 | } 634 | }, 635 | "node_modules/arg": { 636 | "version": "4.1.3", 637 | "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", 638 | "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", 639 | "dev": true 640 | }, 641 | "node_modules/assertion-error": { 642 | "version": "1.1.0", 643 | "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", 644 | "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", 645 | "dev": true, 646 | "engines": { 647 | "node": "*" 648 | } 649 | }, 650 | "node_modules/aws-cdk": { 651 | "version": "2.76.0", 652 | "resolved": "https://registry.npmjs.org/aws-cdk/-/aws-cdk-2.76.0.tgz", 653 | "integrity": "sha512-y6VHtqUpYenn6mGIBFbcGGXIoXfKA3o0eGL/eeD/gUJ9TcPrgMLQM1NxSMb5JVsOk5BPPXzGmvB0gBu40utGqg==", 654 | "dev": true, 655 | "bin": { 656 | "cdk": "bin/cdk" 657 | }, 658 | "engines": { 659 | "node": ">= 14.15.0" 660 | }, 661 | "optionalDependencies": { 662 | "fsevents": "2.3.2" 663 | } 664 | }, 665 | "node_modules/aws-cdk-github-oidc": { 666 | "version": "2.3.2", 667 | "resolved": "https://registry.npmjs.org/aws-cdk-github-oidc/-/aws-cdk-github-oidc-2.3.2.tgz", 668 | "integrity": "sha512-mJKVKr4n5lF5fV8jyV/ozPo8fXnMYnp60QIu/PSepP5LfxR2ba7RV90yTV1L7X9LqovW9vG55ac/T0RgUXtWPA==", 669 | "engines": { 670 | "node": ">= 14.21.1" 671 | }, 672 | "peerDependencies": { 673 | "aws-cdk-lib": "^2.24.1", 674 | "constructs": "^10.0.0" 675 | } 676 | }, 677 | "node_modules/aws-cdk-lib": { 678 | "version": "2.76.0", 679 | "resolved": "https://registry.npmjs.org/aws-cdk-lib/-/aws-cdk-lib-2.76.0.tgz", 680 | "integrity": "sha512-EYWdHh/qJA7v+jD6SeW+BOEChI7oe6IYPHHap+SoJMUrKBVSDKnIGJ8wTP5eV6F27aYaUQiA7rWTKcCWoda8ag==", 681 | "bundleDependencies": [ 682 | "@balena/dockerignore", 683 | "case", 684 | "fs-extra", 685 | "ignore", 686 | "jsonschema", 687 | "minimatch", 688 | "punycode", 689 | "semver", 690 | "table", 691 | "yaml" 692 | ], 693 | "dependencies": { 694 | "@aws-cdk/asset-awscli-v1": "^2.2.97", 695 | "@aws-cdk/asset-kubectl-v20": "^2.1.1", 696 | "@aws-cdk/asset-node-proxy-agent-v5": "^2.0.77", 697 | "@balena/dockerignore": "^1.0.2", 698 | "case": "1.6.3", 699 | "fs-extra": "^9.1.0", 700 | "ignore": "^5.2.4", 701 | "jsonschema": "^1.4.1", 702 | "minimatch": "^3.1.2", 703 | "punycode": "^2.3.0", 704 | "semver": "^7.3.8", 705 | "table": "^6.8.1", 706 | "yaml": "1.10.2" 707 | }, 708 | "engines": { 709 | "node": ">= 14.15.0" 710 | }, 711 | "peerDependencies": { 712 | "constructs": "^10.0.0" 713 | } 714 | }, 715 | "node_modules/aws-cdk-lib/node_modules/@balena/dockerignore": { 716 | "version": "1.0.2", 717 | "inBundle": true, 718 | "license": "Apache-2.0" 719 | }, 720 | "node_modules/aws-cdk-lib/node_modules/ajv": { 721 | "version": "8.12.0", 722 | "inBundle": true, 723 | "license": "MIT", 724 | "dependencies": { 725 | "fast-deep-equal": "^3.1.1", 726 | "json-schema-traverse": "^1.0.0", 727 | "require-from-string": "^2.0.2", 728 | "uri-js": "^4.2.2" 729 | }, 730 | "funding": { 731 | "type": "github", 732 | "url": "https://github.com/sponsors/epoberezkin" 733 | } 734 | }, 735 | "node_modules/aws-cdk-lib/node_modules/ansi-regex": { 736 | "version": "5.0.1", 737 | "inBundle": true, 738 | "license": "MIT", 739 | "engines": { 740 | "node": ">=8" 741 | } 742 | }, 743 | "node_modules/aws-cdk-lib/node_modules/ansi-styles": { 744 | "version": "4.3.0", 745 | "inBundle": true, 746 | "license": "MIT", 747 | "dependencies": { 748 | "color-convert": "^2.0.1" 749 | }, 750 | "engines": { 751 | "node": ">=8" 752 | }, 753 | "funding": { 754 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 755 | } 756 | }, 757 | "node_modules/aws-cdk-lib/node_modules/astral-regex": { 758 | "version": "2.0.0", 759 | "inBundle": true, 760 | "license": "MIT", 761 | "engines": { 762 | "node": ">=8" 763 | } 764 | }, 765 | "node_modules/aws-cdk-lib/node_modules/at-least-node": { 766 | "version": "1.0.0", 767 | "inBundle": true, 768 | "license": "ISC", 769 | "engines": { 770 | "node": ">= 4.0.0" 771 | } 772 | }, 773 | "node_modules/aws-cdk-lib/node_modules/balanced-match": { 774 | "version": "1.0.2", 775 | "inBundle": true, 776 | "license": "MIT" 777 | }, 778 | "node_modules/aws-cdk-lib/node_modules/brace-expansion": { 779 | "version": "1.1.11", 780 | "inBundle": true, 781 | "license": "MIT", 782 | "dependencies": { 783 | "balanced-match": "^1.0.0", 784 | "concat-map": "0.0.1" 785 | } 786 | }, 787 | "node_modules/aws-cdk-lib/node_modules/case": { 788 | "version": "1.6.3", 789 | "inBundle": true, 790 | "license": "(MIT OR GPL-3.0-or-later)", 791 | "engines": { 792 | "node": ">= 0.8.0" 793 | } 794 | }, 795 | "node_modules/aws-cdk-lib/node_modules/color-convert": { 796 | "version": "2.0.1", 797 | "inBundle": true, 798 | "license": "MIT", 799 | "dependencies": { 800 | "color-name": "~1.1.4" 801 | }, 802 | "engines": { 803 | "node": ">=7.0.0" 804 | } 805 | }, 806 | "node_modules/aws-cdk-lib/node_modules/color-name": { 807 | "version": "1.1.4", 808 | "inBundle": true, 809 | "license": "MIT" 810 | }, 811 | "node_modules/aws-cdk-lib/node_modules/concat-map": { 812 | "version": "0.0.1", 813 | "inBundle": true, 814 | "license": "MIT" 815 | }, 816 | "node_modules/aws-cdk-lib/node_modules/emoji-regex": { 817 | "version": "8.0.0", 818 | "inBundle": true, 819 | "license": "MIT" 820 | }, 821 | "node_modules/aws-cdk-lib/node_modules/fast-deep-equal": { 822 | "version": "3.1.3", 823 | "inBundle": true, 824 | "license": "MIT" 825 | }, 826 | "node_modules/aws-cdk-lib/node_modules/fs-extra": { 827 | "version": "9.1.0", 828 | "inBundle": true, 829 | "license": "MIT", 830 | "dependencies": { 831 | "at-least-node": "^1.0.0", 832 | "graceful-fs": "^4.2.0", 833 | "jsonfile": "^6.0.1", 834 | "universalify": "^2.0.0" 835 | }, 836 | "engines": { 837 | "node": ">=10" 838 | } 839 | }, 840 | "node_modules/aws-cdk-lib/node_modules/graceful-fs": { 841 | "version": "4.2.10", 842 | "inBundle": true, 843 | "license": "ISC" 844 | }, 845 | "node_modules/aws-cdk-lib/node_modules/ignore": { 846 | "version": "5.2.4", 847 | "inBundle": true, 848 | "license": "MIT", 849 | "engines": { 850 | "node": ">= 4" 851 | } 852 | }, 853 | "node_modules/aws-cdk-lib/node_modules/is-fullwidth-code-point": { 854 | "version": "3.0.0", 855 | "inBundle": true, 856 | "license": "MIT", 857 | "engines": { 858 | "node": ">=8" 859 | } 860 | }, 861 | "node_modules/aws-cdk-lib/node_modules/json-schema-traverse": { 862 | "version": "1.0.0", 863 | "inBundle": true, 864 | "license": "MIT" 865 | }, 866 | "node_modules/aws-cdk-lib/node_modules/jsonfile": { 867 | "version": "6.1.0", 868 | "inBundle": true, 869 | "license": "MIT", 870 | "dependencies": { 871 | "universalify": "^2.0.0" 872 | }, 873 | "optionalDependencies": { 874 | "graceful-fs": "^4.1.6" 875 | } 876 | }, 877 | "node_modules/aws-cdk-lib/node_modules/jsonschema": { 878 | "version": "1.4.1", 879 | "inBundle": true, 880 | "license": "MIT", 881 | "engines": { 882 | "node": "*" 883 | } 884 | }, 885 | "node_modules/aws-cdk-lib/node_modules/lodash.truncate": { 886 | "version": "4.4.2", 887 | "inBundle": true, 888 | "license": "MIT" 889 | }, 890 | "node_modules/aws-cdk-lib/node_modules/lru-cache": { 891 | "version": "6.0.0", 892 | "inBundle": true, 893 | "license": "ISC", 894 | "dependencies": { 895 | "yallist": "^4.0.0" 896 | }, 897 | "engines": { 898 | "node": ">=10" 899 | } 900 | }, 901 | "node_modules/aws-cdk-lib/node_modules/minimatch": { 902 | "version": "3.1.2", 903 | "inBundle": true, 904 | "license": "ISC", 905 | "dependencies": { 906 | "brace-expansion": "^1.1.7" 907 | }, 908 | "engines": { 909 | "node": "*" 910 | } 911 | }, 912 | "node_modules/aws-cdk-lib/node_modules/punycode": { 913 | "version": "2.3.0", 914 | "inBundle": true, 915 | "license": "MIT", 916 | "engines": { 917 | "node": ">=6" 918 | } 919 | }, 920 | "node_modules/aws-cdk-lib/node_modules/require-from-string": { 921 | "version": "2.0.2", 922 | "inBundle": true, 923 | "license": "MIT", 924 | "engines": { 925 | "node": ">=0.10.0" 926 | } 927 | }, 928 | "node_modules/aws-cdk-lib/node_modules/semver": { 929 | "version": "7.3.8", 930 | "inBundle": true, 931 | "license": "ISC", 932 | "dependencies": { 933 | "lru-cache": "^6.0.0" 934 | }, 935 | "bin": { 936 | "semver": "bin/semver.js" 937 | }, 938 | "engines": { 939 | "node": ">=10" 940 | } 941 | }, 942 | "node_modules/aws-cdk-lib/node_modules/slice-ansi": { 943 | "version": "4.0.0", 944 | "inBundle": true, 945 | "license": "MIT", 946 | "dependencies": { 947 | "ansi-styles": "^4.0.0", 948 | "astral-regex": "^2.0.0", 949 | "is-fullwidth-code-point": "^3.0.0" 950 | }, 951 | "engines": { 952 | "node": ">=10" 953 | }, 954 | "funding": { 955 | "url": "https://github.com/chalk/slice-ansi?sponsor=1" 956 | } 957 | }, 958 | "node_modules/aws-cdk-lib/node_modules/string-width": { 959 | "version": "4.2.3", 960 | "inBundle": true, 961 | "license": "MIT", 962 | "dependencies": { 963 | "emoji-regex": "^8.0.0", 964 | "is-fullwidth-code-point": "^3.0.0", 965 | "strip-ansi": "^6.0.1" 966 | }, 967 | "engines": { 968 | "node": ">=8" 969 | } 970 | }, 971 | "node_modules/aws-cdk-lib/node_modules/strip-ansi": { 972 | "version": "6.0.1", 973 | "inBundle": true, 974 | "license": "MIT", 975 | "dependencies": { 976 | "ansi-regex": "^5.0.1" 977 | }, 978 | "engines": { 979 | "node": ">=8" 980 | } 981 | }, 982 | "node_modules/aws-cdk-lib/node_modules/table": { 983 | "version": "6.8.1", 984 | "inBundle": true, 985 | "license": "BSD-3-Clause", 986 | "dependencies": { 987 | "ajv": "^8.0.1", 988 | "lodash.truncate": "^4.4.2", 989 | "slice-ansi": "^4.0.0", 990 | "string-width": "^4.2.3", 991 | "strip-ansi": "^6.0.1" 992 | }, 993 | "engines": { 994 | "node": ">=10.0.0" 995 | } 996 | }, 997 | "node_modules/aws-cdk-lib/node_modules/universalify": { 998 | "version": "2.0.0", 999 | "inBundle": true, 1000 | "license": "MIT", 1001 | "engines": { 1002 | "node": ">= 10.0.0" 1003 | } 1004 | }, 1005 | "node_modules/aws-cdk-lib/node_modules/uri-js": { 1006 | "version": "4.4.1", 1007 | "inBundle": true, 1008 | "license": "BSD-2-Clause", 1009 | "dependencies": { 1010 | "punycode": "^2.1.0" 1011 | } 1012 | }, 1013 | "node_modules/aws-cdk-lib/node_modules/yallist": { 1014 | "version": "4.0.0", 1015 | "inBundle": true, 1016 | "license": "ISC" 1017 | }, 1018 | "node_modules/aws-cdk-lib/node_modules/yaml": { 1019 | "version": "1.10.2", 1020 | "inBundle": true, 1021 | "license": "ISC", 1022 | "engines": { 1023 | "node": ">= 6" 1024 | } 1025 | }, 1026 | "node_modules/balanced-match": { 1027 | "version": "1.0.2", 1028 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 1029 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 1030 | "dev": true 1031 | }, 1032 | "node_modules/blueimp-md5": { 1033 | "version": "2.19.0", 1034 | "resolved": "https://registry.npmjs.org/blueimp-md5/-/blueimp-md5-2.19.0.tgz", 1035 | "integrity": "sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w==", 1036 | "dev": true 1037 | }, 1038 | "node_modules/brace-expansion": { 1039 | "version": "2.0.1", 1040 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", 1041 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 1042 | "dev": true, 1043 | "dependencies": { 1044 | "balanced-match": "^1.0.0" 1045 | } 1046 | }, 1047 | "node_modules/c8": { 1048 | "version": "7.13.0", 1049 | "resolved": "https://registry.npmjs.org/c8/-/c8-7.13.0.tgz", 1050 | "integrity": "sha512-/NL4hQTv1gBL6J6ei80zu3IiTrmePDKXKXOTLpHvcIWZTVYQlDhVWjjWvkhICylE8EwwnMVzDZugCvdx0/DIIA==", 1051 | "dev": true, 1052 | "dependencies": { 1053 | "@bcoe/v8-coverage": "^0.2.3", 1054 | "@istanbuljs/schema": "^0.1.3", 1055 | "find-up": "^5.0.0", 1056 | "foreground-child": "^2.0.0", 1057 | "istanbul-lib-coverage": "^3.2.0", 1058 | "istanbul-lib-report": "^3.0.0", 1059 | "istanbul-reports": "^3.1.4", 1060 | "rimraf": "^3.0.2", 1061 | "test-exclude": "^6.0.0", 1062 | "v8-to-istanbul": "^9.0.0", 1063 | "yargs": "^16.2.0", 1064 | "yargs-parser": "^20.2.9" 1065 | }, 1066 | "bin": { 1067 | "c8": "bin/c8.js" 1068 | }, 1069 | "engines": { 1070 | "node": ">=10.12.0" 1071 | } 1072 | }, 1073 | "node_modules/c8/node_modules/brace-expansion": { 1074 | "version": "1.1.11", 1075 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 1076 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 1077 | "dev": true, 1078 | "dependencies": { 1079 | "balanced-match": "^1.0.0", 1080 | "concat-map": "0.0.1" 1081 | } 1082 | }, 1083 | "node_modules/c8/node_modules/glob": { 1084 | "version": "7.2.3", 1085 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 1086 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 1087 | "dev": true, 1088 | "dependencies": { 1089 | "fs.realpath": "^1.0.0", 1090 | "inflight": "^1.0.4", 1091 | "inherits": "2", 1092 | "minimatch": "^3.1.1", 1093 | "once": "^1.3.0", 1094 | "path-is-absolute": "^1.0.0" 1095 | }, 1096 | "engines": { 1097 | "node": "*" 1098 | }, 1099 | "funding": { 1100 | "url": "https://github.com/sponsors/isaacs" 1101 | } 1102 | }, 1103 | "node_modules/c8/node_modules/minimatch": { 1104 | "version": "3.1.2", 1105 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 1106 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 1107 | "dev": true, 1108 | "dependencies": { 1109 | "brace-expansion": "^1.1.7" 1110 | }, 1111 | "engines": { 1112 | "node": "*" 1113 | } 1114 | }, 1115 | "node_modules/c8/node_modules/rimraf": { 1116 | "version": "3.0.2", 1117 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 1118 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 1119 | "dev": true, 1120 | "dependencies": { 1121 | "glob": "^7.1.3" 1122 | }, 1123 | "bin": { 1124 | "rimraf": "bin.js" 1125 | }, 1126 | "funding": { 1127 | "url": "https://github.com/sponsors/isaacs" 1128 | } 1129 | }, 1130 | "node_modules/cac": { 1131 | "version": "6.7.14", 1132 | "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", 1133 | "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", 1134 | "dev": true, 1135 | "engines": { 1136 | "node": ">=8" 1137 | } 1138 | }, 1139 | "node_modules/chai": { 1140 | "version": "4.3.7", 1141 | "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", 1142 | "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", 1143 | "dev": true, 1144 | "dependencies": { 1145 | "assertion-error": "^1.1.0", 1146 | "check-error": "^1.0.2", 1147 | "deep-eql": "^4.1.2", 1148 | "get-func-name": "^2.0.0", 1149 | "loupe": "^2.3.1", 1150 | "pathval": "^1.1.1", 1151 | "type-detect": "^4.0.5" 1152 | }, 1153 | "engines": { 1154 | "node": ">=4" 1155 | } 1156 | }, 1157 | "node_modules/check-error": { 1158 | "version": "1.0.2", 1159 | "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", 1160 | "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", 1161 | "dev": true, 1162 | "engines": { 1163 | "node": "*" 1164 | } 1165 | }, 1166 | "node_modules/cliui": { 1167 | "version": "7.0.4", 1168 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", 1169 | "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", 1170 | "dev": true, 1171 | "dependencies": { 1172 | "string-width": "^4.2.0", 1173 | "strip-ansi": "^6.0.0", 1174 | "wrap-ansi": "^7.0.0" 1175 | } 1176 | }, 1177 | "node_modules/color-convert": { 1178 | "version": "2.0.1", 1179 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 1180 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 1181 | "dev": true, 1182 | "dependencies": { 1183 | "color-name": "~1.1.4" 1184 | }, 1185 | "engines": { 1186 | "node": ">=7.0.0" 1187 | } 1188 | }, 1189 | "node_modules/color-name": { 1190 | "version": "1.1.4", 1191 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 1192 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 1193 | "dev": true 1194 | }, 1195 | "node_modules/concat-map": { 1196 | "version": "0.0.1", 1197 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 1198 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 1199 | "dev": true 1200 | }, 1201 | "node_modules/concordance": { 1202 | "version": "5.0.4", 1203 | "resolved": "https://registry.npmjs.org/concordance/-/concordance-5.0.4.tgz", 1204 | "integrity": "sha512-OAcsnTEYu1ARJqWVGwf4zh4JDfHZEaSNlNccFmt8YjB2l/n19/PF2viLINHc57vO4FKIAFl2FWASIGZZWZ2Kxw==", 1205 | "dev": true, 1206 | "dependencies": { 1207 | "date-time": "^3.1.0", 1208 | "esutils": "^2.0.3", 1209 | "fast-diff": "^1.2.0", 1210 | "js-string-escape": "^1.0.1", 1211 | "lodash": "^4.17.15", 1212 | "md5-hex": "^3.0.1", 1213 | "semver": "^7.3.2", 1214 | "well-known-symbols": "^2.0.0" 1215 | }, 1216 | "engines": { 1217 | "node": ">=10.18.0 <11 || >=12.14.0 <13 || >=14" 1218 | } 1219 | }, 1220 | "node_modules/concordance/node_modules/lru-cache": { 1221 | "version": "6.0.0", 1222 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 1223 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 1224 | "dev": true, 1225 | "dependencies": { 1226 | "yallist": "^4.0.0" 1227 | }, 1228 | "engines": { 1229 | "node": ">=10" 1230 | } 1231 | }, 1232 | "node_modules/concordance/node_modules/semver": { 1233 | "version": "7.5.0", 1234 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz", 1235 | "integrity": "sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==", 1236 | "dev": true, 1237 | "dependencies": { 1238 | "lru-cache": "^6.0.0" 1239 | }, 1240 | "bin": { 1241 | "semver": "bin/semver.js" 1242 | }, 1243 | "engines": { 1244 | "node": ">=10" 1245 | } 1246 | }, 1247 | "node_modules/constructs": { 1248 | "version": "10.2.3", 1249 | "resolved": "https://registry.npmjs.org/constructs/-/constructs-10.2.3.tgz", 1250 | "integrity": "sha512-9mmO/2ISq9IiQyGOs46mNf0WMDRJ+ok4qC1hzXUtVY8rQVRfxAtQaH1M0b8TX9MKE52DBGk8vOX9icavGl7Bbg==", 1251 | "engines": { 1252 | "node": ">= 14.17.0" 1253 | } 1254 | }, 1255 | "node_modules/convert-source-map": { 1256 | "version": "1.9.0", 1257 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", 1258 | "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", 1259 | "dev": true 1260 | }, 1261 | "node_modules/create-require": { 1262 | "version": "1.1.1", 1263 | "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", 1264 | "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", 1265 | "dev": true 1266 | }, 1267 | "node_modules/cross-spawn": { 1268 | "version": "7.0.3", 1269 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", 1270 | "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", 1271 | "dev": true, 1272 | "dependencies": { 1273 | "path-key": "^3.1.0", 1274 | "shebang-command": "^2.0.0", 1275 | "which": "^2.0.1" 1276 | }, 1277 | "engines": { 1278 | "node": ">= 8" 1279 | } 1280 | }, 1281 | "node_modules/date-time": { 1282 | "version": "3.1.0", 1283 | "resolved": "https://registry.npmjs.org/date-time/-/date-time-3.1.0.tgz", 1284 | "integrity": "sha512-uqCUKXE5q1PNBXjPqvwhwJf9SwMoAHBgWJ6DcrnS5o+W2JOiIILl0JEdVD8SGujrNS02GGxgwAg2PN2zONgtjg==", 1285 | "dev": true, 1286 | "dependencies": { 1287 | "time-zone": "^1.0.0" 1288 | }, 1289 | "engines": { 1290 | "node": ">=6" 1291 | } 1292 | }, 1293 | "node_modules/debug": { 1294 | "version": "4.3.4", 1295 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 1296 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 1297 | "dev": true, 1298 | "dependencies": { 1299 | "ms": "2.1.2" 1300 | }, 1301 | "engines": { 1302 | "node": ">=6.0" 1303 | }, 1304 | "peerDependenciesMeta": { 1305 | "supports-color": { 1306 | "optional": true 1307 | } 1308 | } 1309 | }, 1310 | "node_modules/deep-eql": { 1311 | "version": "4.1.3", 1312 | "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", 1313 | "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", 1314 | "dev": true, 1315 | "dependencies": { 1316 | "type-detect": "^4.0.0" 1317 | }, 1318 | "engines": { 1319 | "node": ">=6" 1320 | } 1321 | }, 1322 | "node_modules/diff": { 1323 | "version": "4.0.2", 1324 | "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", 1325 | "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", 1326 | "dev": true, 1327 | "engines": { 1328 | "node": ">=0.3.1" 1329 | } 1330 | }, 1331 | "node_modules/emoji-regex": { 1332 | "version": "8.0.0", 1333 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 1334 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 1335 | "dev": true 1336 | }, 1337 | "node_modules/esbuild": { 1338 | "version": "0.17.18", 1339 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.18.tgz", 1340 | "integrity": "sha512-z1lix43jBs6UKjcZVKOw2xx69ffE2aG0PygLL5qJ9OS/gy0Ewd1gW/PUQIOIQGXBHWNywSc0floSKoMFF8aK2w==", 1341 | "dev": true, 1342 | "hasInstallScript": true, 1343 | "bin": { 1344 | "esbuild": "bin/esbuild" 1345 | }, 1346 | "engines": { 1347 | "node": ">=12" 1348 | }, 1349 | "optionalDependencies": { 1350 | "@esbuild/android-arm": "0.17.18", 1351 | "@esbuild/android-arm64": "0.17.18", 1352 | "@esbuild/android-x64": "0.17.18", 1353 | "@esbuild/darwin-arm64": "0.17.18", 1354 | "@esbuild/darwin-x64": "0.17.18", 1355 | "@esbuild/freebsd-arm64": "0.17.18", 1356 | "@esbuild/freebsd-x64": "0.17.18", 1357 | "@esbuild/linux-arm": "0.17.18", 1358 | "@esbuild/linux-arm64": "0.17.18", 1359 | "@esbuild/linux-ia32": "0.17.18", 1360 | "@esbuild/linux-loong64": "0.17.18", 1361 | "@esbuild/linux-mips64el": "0.17.18", 1362 | "@esbuild/linux-ppc64": "0.17.18", 1363 | "@esbuild/linux-riscv64": "0.17.18", 1364 | "@esbuild/linux-s390x": "0.17.18", 1365 | "@esbuild/linux-x64": "0.17.18", 1366 | "@esbuild/netbsd-x64": "0.17.18", 1367 | "@esbuild/openbsd-x64": "0.17.18", 1368 | "@esbuild/sunos-x64": "0.17.18", 1369 | "@esbuild/win32-arm64": "0.17.18", 1370 | "@esbuild/win32-ia32": "0.17.18", 1371 | "@esbuild/win32-x64": "0.17.18" 1372 | } 1373 | }, 1374 | "node_modules/escalade": { 1375 | "version": "3.1.1", 1376 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 1377 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", 1378 | "dev": true, 1379 | "engines": { 1380 | "node": ">=6" 1381 | } 1382 | }, 1383 | "node_modules/esutils": { 1384 | "version": "2.0.3", 1385 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 1386 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 1387 | "dev": true, 1388 | "engines": { 1389 | "node": ">=0.10.0" 1390 | } 1391 | }, 1392 | "node_modules/fast-diff": { 1393 | "version": "1.2.0", 1394 | "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", 1395 | "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", 1396 | "dev": true 1397 | }, 1398 | "node_modules/find-up": { 1399 | "version": "5.0.0", 1400 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", 1401 | "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 1402 | "dev": true, 1403 | "dependencies": { 1404 | "locate-path": "^6.0.0", 1405 | "path-exists": "^4.0.0" 1406 | }, 1407 | "engines": { 1408 | "node": ">=10" 1409 | }, 1410 | "funding": { 1411 | "url": "https://github.com/sponsors/sindresorhus" 1412 | } 1413 | }, 1414 | "node_modules/foreground-child": { 1415 | "version": "2.0.0", 1416 | "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", 1417 | "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", 1418 | "dev": true, 1419 | "dependencies": { 1420 | "cross-spawn": "^7.0.0", 1421 | "signal-exit": "^3.0.2" 1422 | }, 1423 | "engines": { 1424 | "node": ">=8.0.0" 1425 | } 1426 | }, 1427 | "node_modules/fs.realpath": { 1428 | "version": "1.0.0", 1429 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 1430 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", 1431 | "dev": true 1432 | }, 1433 | "node_modules/fsevents": { 1434 | "version": "2.3.2", 1435 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 1436 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 1437 | "dev": true, 1438 | "hasInstallScript": true, 1439 | "optional": true, 1440 | "os": [ 1441 | "darwin" 1442 | ], 1443 | "engines": { 1444 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 1445 | } 1446 | }, 1447 | "node_modules/get-caller-file": { 1448 | "version": "2.0.5", 1449 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 1450 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 1451 | "dev": true, 1452 | "engines": { 1453 | "node": "6.* || 8.* || >= 10.*" 1454 | } 1455 | }, 1456 | "node_modules/get-func-name": { 1457 | "version": "2.0.0", 1458 | "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", 1459 | "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", 1460 | "dev": true, 1461 | "engines": { 1462 | "node": "*" 1463 | } 1464 | }, 1465 | "node_modules/glob": { 1466 | "version": "10.0.0", 1467 | "resolved": "https://registry.npmjs.org/glob/-/glob-10.0.0.tgz", 1468 | "integrity": "sha512-zmp9ZDC6NpDNLujV2W2n+3lH+BafIVZ4/ct+Yj3BMZTH/+bgm/eVjHzeFLwxJrrIGgjjS2eiQLlpurHsNlEAtQ==", 1469 | "dev": true, 1470 | "dependencies": { 1471 | "fs.realpath": "^1.0.0", 1472 | "minimatch": "^9.0.0", 1473 | "minipass": "^5.0.0", 1474 | "path-scurry": "^1.6.4" 1475 | }, 1476 | "engines": { 1477 | "node": ">=16 || 14 >=14.17" 1478 | }, 1479 | "funding": { 1480 | "url": "https://github.com/sponsors/isaacs" 1481 | } 1482 | }, 1483 | "node_modules/has-flag": { 1484 | "version": "4.0.0", 1485 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 1486 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 1487 | "dev": true, 1488 | "engines": { 1489 | "node": ">=8" 1490 | } 1491 | }, 1492 | "node_modules/html-escaper": { 1493 | "version": "2.0.2", 1494 | "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", 1495 | "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", 1496 | "dev": true 1497 | }, 1498 | "node_modules/inflight": { 1499 | "version": "1.0.6", 1500 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1501 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 1502 | "dev": true, 1503 | "dependencies": { 1504 | "once": "^1.3.0", 1505 | "wrappy": "1" 1506 | } 1507 | }, 1508 | "node_modules/inherits": { 1509 | "version": "2.0.4", 1510 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1511 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 1512 | "dev": true 1513 | }, 1514 | "node_modules/is-fullwidth-code-point": { 1515 | "version": "3.0.0", 1516 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 1517 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 1518 | "dev": true, 1519 | "engines": { 1520 | "node": ">=8" 1521 | } 1522 | }, 1523 | "node_modules/isexe": { 1524 | "version": "2.0.0", 1525 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1526 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 1527 | "dev": true 1528 | }, 1529 | "node_modules/istanbul-lib-coverage": { 1530 | "version": "3.2.0", 1531 | "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", 1532 | "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", 1533 | "dev": true, 1534 | "engines": { 1535 | "node": ">=8" 1536 | } 1537 | }, 1538 | "node_modules/istanbul-lib-report": { 1539 | "version": "3.0.0", 1540 | "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", 1541 | "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", 1542 | "dev": true, 1543 | "dependencies": { 1544 | "istanbul-lib-coverage": "^3.0.0", 1545 | "make-dir": "^3.0.0", 1546 | "supports-color": "^7.1.0" 1547 | }, 1548 | "engines": { 1549 | "node": ">=8" 1550 | } 1551 | }, 1552 | "node_modules/istanbul-reports": { 1553 | "version": "3.1.5", 1554 | "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", 1555 | "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", 1556 | "dev": true, 1557 | "dependencies": { 1558 | "html-escaper": "^2.0.0", 1559 | "istanbul-lib-report": "^3.0.0" 1560 | }, 1561 | "engines": { 1562 | "node": ">=8" 1563 | } 1564 | }, 1565 | "node_modules/js-string-escape": { 1566 | "version": "1.0.1", 1567 | "resolved": "https://registry.npmjs.org/js-string-escape/-/js-string-escape-1.0.1.tgz", 1568 | "integrity": "sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg==", 1569 | "dev": true, 1570 | "engines": { 1571 | "node": ">= 0.8" 1572 | } 1573 | }, 1574 | "node_modules/jsonc-parser": { 1575 | "version": "3.2.0", 1576 | "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", 1577 | "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", 1578 | "dev": true 1579 | }, 1580 | "node_modules/local-pkg": { 1581 | "version": "0.4.3", 1582 | "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz", 1583 | "integrity": "sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==", 1584 | "dev": true, 1585 | "engines": { 1586 | "node": ">=14" 1587 | }, 1588 | "funding": { 1589 | "url": "https://github.com/sponsors/antfu" 1590 | } 1591 | }, 1592 | "node_modules/locate-path": { 1593 | "version": "6.0.0", 1594 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", 1595 | "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 1596 | "dev": true, 1597 | "dependencies": { 1598 | "p-locate": "^5.0.0" 1599 | }, 1600 | "engines": { 1601 | "node": ">=10" 1602 | }, 1603 | "funding": { 1604 | "url": "https://github.com/sponsors/sindresorhus" 1605 | } 1606 | }, 1607 | "node_modules/lodash": { 1608 | "version": "4.17.21", 1609 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 1610 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", 1611 | "dev": true 1612 | }, 1613 | "node_modules/loupe": { 1614 | "version": "2.3.6", 1615 | "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", 1616 | "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", 1617 | "dev": true, 1618 | "dependencies": { 1619 | "get-func-name": "^2.0.0" 1620 | } 1621 | }, 1622 | "node_modules/lru-cache": { 1623 | "version": "9.0.1", 1624 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-9.0.1.tgz", 1625 | "integrity": "sha512-C8QsKIN1UIXeOs3iWmiZ1lQY+EnKDojWd37fXy1aSbJvH4iSma1uy2OWuoB3m4SYRli5+CUjDv3Dij5DVoetmg==", 1626 | "dev": true, 1627 | "engines": { 1628 | "node": "14 || >=16.14" 1629 | } 1630 | }, 1631 | "node_modules/magic-string": { 1632 | "version": "0.30.0", 1633 | "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.0.tgz", 1634 | "integrity": "sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==", 1635 | "dev": true, 1636 | "dependencies": { 1637 | "@jridgewell/sourcemap-codec": "^1.4.13" 1638 | }, 1639 | "engines": { 1640 | "node": ">=12" 1641 | } 1642 | }, 1643 | "node_modules/make-dir": { 1644 | "version": "3.1.0", 1645 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", 1646 | "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", 1647 | "dev": true, 1648 | "dependencies": { 1649 | "semver": "^6.0.0" 1650 | }, 1651 | "engines": { 1652 | "node": ">=8" 1653 | }, 1654 | "funding": { 1655 | "url": "https://github.com/sponsors/sindresorhus" 1656 | } 1657 | }, 1658 | "node_modules/make-error": { 1659 | "version": "1.3.6", 1660 | "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", 1661 | "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", 1662 | "dev": true 1663 | }, 1664 | "node_modules/md5-hex": { 1665 | "version": "3.0.1", 1666 | "resolved": "https://registry.npmjs.org/md5-hex/-/md5-hex-3.0.1.tgz", 1667 | "integrity": "sha512-BUiRtTtV39LIJwinWBjqVsU9xhdnz7/i889V859IBFpuqGAj6LuOvHv5XLbgZ2R7ptJoJaEcxkv88/h25T7Ciw==", 1668 | "dev": true, 1669 | "dependencies": { 1670 | "blueimp-md5": "^2.10.0" 1671 | }, 1672 | "engines": { 1673 | "node": ">=8" 1674 | } 1675 | }, 1676 | "node_modules/minimatch": { 1677 | "version": "9.0.0", 1678 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.0.tgz", 1679 | "integrity": "sha512-0jJj8AvgKqWN05mrwuqi8QYKx1WmYSUoKSxu5Qhs9prezTz10sxAHGNZe9J9cqIJzta8DWsleh2KaVaLl6Ru2w==", 1680 | "dev": true, 1681 | "dependencies": { 1682 | "brace-expansion": "^2.0.1" 1683 | }, 1684 | "engines": { 1685 | "node": ">=16 || 14 >=14.17" 1686 | }, 1687 | "funding": { 1688 | "url": "https://github.com/sponsors/isaacs" 1689 | } 1690 | }, 1691 | "node_modules/minipass": { 1692 | "version": "5.0.0", 1693 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", 1694 | "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", 1695 | "dev": true, 1696 | "engines": { 1697 | "node": ">=8" 1698 | } 1699 | }, 1700 | "node_modules/mlly": { 1701 | "version": "1.2.0", 1702 | "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.2.0.tgz", 1703 | "integrity": "sha512-+c7A3CV0KGdKcylsI6khWyts/CYrGTrRVo4R/I7u/cUsy0Conxa6LUhiEzVKIw14lc2L5aiO4+SeVe4TeGRKww==", 1704 | "dev": true, 1705 | "dependencies": { 1706 | "acorn": "^8.8.2", 1707 | "pathe": "^1.1.0", 1708 | "pkg-types": "^1.0.2", 1709 | "ufo": "^1.1.1" 1710 | } 1711 | }, 1712 | "node_modules/ms": { 1713 | "version": "2.1.2", 1714 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1715 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 1716 | "dev": true 1717 | }, 1718 | "node_modules/nanoid": { 1719 | "version": "3.3.6", 1720 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", 1721 | "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", 1722 | "dev": true, 1723 | "funding": [ 1724 | { 1725 | "type": "github", 1726 | "url": "https://github.com/sponsors/ai" 1727 | } 1728 | ], 1729 | "bin": { 1730 | "nanoid": "bin/nanoid.cjs" 1731 | }, 1732 | "engines": { 1733 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 1734 | } 1735 | }, 1736 | "node_modules/once": { 1737 | "version": "1.4.0", 1738 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1739 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 1740 | "dev": true, 1741 | "dependencies": { 1742 | "wrappy": "1" 1743 | } 1744 | }, 1745 | "node_modules/p-limit": { 1746 | "version": "3.1.0", 1747 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 1748 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 1749 | "dev": true, 1750 | "dependencies": { 1751 | "yocto-queue": "^0.1.0" 1752 | }, 1753 | "engines": { 1754 | "node": ">=10" 1755 | }, 1756 | "funding": { 1757 | "url": "https://github.com/sponsors/sindresorhus" 1758 | } 1759 | }, 1760 | "node_modules/p-locate": { 1761 | "version": "5.0.0", 1762 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", 1763 | "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 1764 | "dev": true, 1765 | "dependencies": { 1766 | "p-limit": "^3.0.2" 1767 | }, 1768 | "engines": { 1769 | "node": ">=10" 1770 | }, 1771 | "funding": { 1772 | "url": "https://github.com/sponsors/sindresorhus" 1773 | } 1774 | }, 1775 | "node_modules/path-exists": { 1776 | "version": "4.0.0", 1777 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 1778 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 1779 | "dev": true, 1780 | "engines": { 1781 | "node": ">=8" 1782 | } 1783 | }, 1784 | "node_modules/path-is-absolute": { 1785 | "version": "1.0.1", 1786 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1787 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 1788 | "dev": true, 1789 | "engines": { 1790 | "node": ">=0.10.0" 1791 | } 1792 | }, 1793 | "node_modules/path-key": { 1794 | "version": "3.1.1", 1795 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 1796 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 1797 | "dev": true, 1798 | "engines": { 1799 | "node": ">=8" 1800 | } 1801 | }, 1802 | "node_modules/path-scurry": { 1803 | "version": "1.6.4", 1804 | "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.6.4.tgz", 1805 | "integrity": "sha512-Qp/9IHkdNiXJ3/Kon++At2nVpnhRiPq/aSvQN+H3U1WZbvNRK0RIQK/o4HMqPoXjpuGJUEWpHSs6Mnjxqh3TQg==", 1806 | "dev": true, 1807 | "dependencies": { 1808 | "lru-cache": "^9.0.0", 1809 | "minipass": "^5.0.0" 1810 | }, 1811 | "engines": { 1812 | "node": ">=16 || 14 >=14.17" 1813 | }, 1814 | "funding": { 1815 | "url": "https://github.com/sponsors/isaacs" 1816 | } 1817 | }, 1818 | "node_modules/pathe": { 1819 | "version": "1.1.0", 1820 | "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.0.tgz", 1821 | "integrity": "sha512-ODbEPR0KKHqECXW1GoxdDb+AZvULmXjVPy4rt+pGo2+TnjJTIPJQSVS6N63n8T2Ip+syHhbn52OewKicV0373w==", 1822 | "dev": true 1823 | }, 1824 | "node_modules/pathval": { 1825 | "version": "1.1.1", 1826 | "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", 1827 | "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", 1828 | "dev": true, 1829 | "engines": { 1830 | "node": "*" 1831 | } 1832 | }, 1833 | "node_modules/picocolors": { 1834 | "version": "1.0.0", 1835 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", 1836 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", 1837 | "dev": true 1838 | }, 1839 | "node_modules/pkg-types": { 1840 | "version": "1.0.2", 1841 | "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.2.tgz", 1842 | "integrity": "sha512-hM58GKXOcj8WTqUXnsQyJYXdeAPbythQgEF3nTcEo+nkD49chjQ9IKm/QJy9xf6JakXptz86h7ecP2024rrLaQ==", 1843 | "dev": true, 1844 | "dependencies": { 1845 | "jsonc-parser": "^3.2.0", 1846 | "mlly": "^1.1.1", 1847 | "pathe": "^1.1.0" 1848 | } 1849 | }, 1850 | "node_modules/postcss": { 1851 | "version": "8.4.23", 1852 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.23.tgz", 1853 | "integrity": "sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA==", 1854 | "dev": true, 1855 | "funding": [ 1856 | { 1857 | "type": "opencollective", 1858 | "url": "https://opencollective.com/postcss/" 1859 | }, 1860 | { 1861 | "type": "tidelift", 1862 | "url": "https://tidelift.com/funding/github/npm/postcss" 1863 | }, 1864 | { 1865 | "type": "github", 1866 | "url": "https://github.com/sponsors/ai" 1867 | } 1868 | ], 1869 | "dependencies": { 1870 | "nanoid": "^3.3.6", 1871 | "picocolors": "^1.0.0", 1872 | "source-map-js": "^1.0.2" 1873 | }, 1874 | "engines": { 1875 | "node": "^10 || ^12 || >=14" 1876 | } 1877 | }, 1878 | "node_modules/pretty-format": { 1879 | "version": "27.5.1", 1880 | "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", 1881 | "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", 1882 | "dev": true, 1883 | "dependencies": { 1884 | "ansi-regex": "^5.0.1", 1885 | "ansi-styles": "^5.0.0", 1886 | "react-is": "^17.0.1" 1887 | }, 1888 | "engines": { 1889 | "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" 1890 | } 1891 | }, 1892 | "node_modules/react-is": { 1893 | "version": "17.0.2", 1894 | "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", 1895 | "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", 1896 | "dev": true 1897 | }, 1898 | "node_modules/require-directory": { 1899 | "version": "2.1.1", 1900 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 1901 | "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", 1902 | "dev": true, 1903 | "engines": { 1904 | "node": ">=0.10.0" 1905 | } 1906 | }, 1907 | "node_modules/rimraf": { 1908 | "version": "5.0.0", 1909 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.0.tgz", 1910 | "integrity": "sha512-Jf9llaP+RvaEVS5nPShYFhtXIrb3LRKP281ib3So0KkeZKo2wIKyq0Re7TOSwanasA423PSr6CCIL4bP6T040g==", 1911 | "dev": true, 1912 | "dependencies": { 1913 | "glob": "^10.0.0" 1914 | }, 1915 | "bin": { 1916 | "rimraf": "dist/cjs/src/bin.js" 1917 | }, 1918 | "engines": { 1919 | "node": ">=14" 1920 | }, 1921 | "funding": { 1922 | "url": "https://github.com/sponsors/isaacs" 1923 | } 1924 | }, 1925 | "node_modules/rollup": { 1926 | "version": "3.20.7", 1927 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.20.7.tgz", 1928 | "integrity": "sha512-P7E2zezKSLhWnTz46XxjSmInrbOCiul1yf+kJccMxT56vxjHwCbDfoLbiqFgu+WQoo9ij2PkraYaBstgB2prBA==", 1929 | "dev": true, 1930 | "bin": { 1931 | "rollup": "dist/bin/rollup" 1932 | }, 1933 | "engines": { 1934 | "node": ">=14.18.0", 1935 | "npm": ">=8.0.0" 1936 | }, 1937 | "optionalDependencies": { 1938 | "fsevents": "~2.3.2" 1939 | } 1940 | }, 1941 | "node_modules/semver": { 1942 | "version": "6.3.0", 1943 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 1944 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", 1945 | "dev": true, 1946 | "bin": { 1947 | "semver": "bin/semver.js" 1948 | } 1949 | }, 1950 | "node_modules/shebang-command": { 1951 | "version": "2.0.0", 1952 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 1953 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 1954 | "dev": true, 1955 | "dependencies": { 1956 | "shebang-regex": "^3.0.0" 1957 | }, 1958 | "engines": { 1959 | "node": ">=8" 1960 | } 1961 | }, 1962 | "node_modules/shebang-regex": { 1963 | "version": "3.0.0", 1964 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 1965 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 1966 | "dev": true, 1967 | "engines": { 1968 | "node": ">=8" 1969 | } 1970 | }, 1971 | "node_modules/siginfo": { 1972 | "version": "2.0.0", 1973 | "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", 1974 | "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", 1975 | "dev": true 1976 | }, 1977 | "node_modules/signal-exit": { 1978 | "version": "3.0.7", 1979 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", 1980 | "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", 1981 | "dev": true 1982 | }, 1983 | "node_modules/source-map": { 1984 | "version": "0.6.1", 1985 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 1986 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 1987 | "dev": true, 1988 | "engines": { 1989 | "node": ">=0.10.0" 1990 | } 1991 | }, 1992 | "node_modules/source-map-js": { 1993 | "version": "1.0.2", 1994 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", 1995 | "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", 1996 | "dev": true, 1997 | "engines": { 1998 | "node": ">=0.10.0" 1999 | } 2000 | }, 2001 | "node_modules/stackback": { 2002 | "version": "0.0.2", 2003 | "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", 2004 | "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", 2005 | "dev": true 2006 | }, 2007 | "node_modules/std-env": { 2008 | "version": "3.3.2", 2009 | "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.3.2.tgz", 2010 | "integrity": "sha512-uUZI65yrV2Qva5gqE0+A7uVAvO40iPo6jGhs7s8keRfHCmtg+uB2X6EiLGCI9IgL1J17xGhvoOqSz79lzICPTA==", 2011 | "dev": true 2012 | }, 2013 | "node_modules/string-width": { 2014 | "version": "4.2.3", 2015 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 2016 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 2017 | "dev": true, 2018 | "dependencies": { 2019 | "emoji-regex": "^8.0.0", 2020 | "is-fullwidth-code-point": "^3.0.0", 2021 | "strip-ansi": "^6.0.1" 2022 | }, 2023 | "engines": { 2024 | "node": ">=8" 2025 | } 2026 | }, 2027 | "node_modules/strip-ansi": { 2028 | "version": "6.0.1", 2029 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 2030 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 2031 | "dev": true, 2032 | "dependencies": { 2033 | "ansi-regex": "^5.0.1" 2034 | }, 2035 | "engines": { 2036 | "node": ">=8" 2037 | } 2038 | }, 2039 | "node_modules/strip-literal": { 2040 | "version": "1.0.1", 2041 | "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-1.0.1.tgz", 2042 | "integrity": "sha512-QZTsipNpa2Ppr6v1AmJHESqJ3Uz247MUS0OjrnnZjFAvEoWqxuyFuXn2xLgMtRnijJShAa1HL0gtJyUs7u7n3Q==", 2043 | "dev": true, 2044 | "dependencies": { 2045 | "acorn": "^8.8.2" 2046 | }, 2047 | "funding": { 2048 | "url": "https://github.com/sponsors/antfu" 2049 | } 2050 | }, 2051 | "node_modules/supports-color": { 2052 | "version": "7.2.0", 2053 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 2054 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 2055 | "dev": true, 2056 | "dependencies": { 2057 | "has-flag": "^4.0.0" 2058 | }, 2059 | "engines": { 2060 | "node": ">=8" 2061 | } 2062 | }, 2063 | "node_modules/test-exclude": { 2064 | "version": "6.0.0", 2065 | "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", 2066 | "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", 2067 | "dev": true, 2068 | "dependencies": { 2069 | "@istanbuljs/schema": "^0.1.2", 2070 | "glob": "^7.1.4", 2071 | "minimatch": "^3.0.4" 2072 | }, 2073 | "engines": { 2074 | "node": ">=8" 2075 | } 2076 | }, 2077 | "node_modules/test-exclude/node_modules/brace-expansion": { 2078 | "version": "1.1.11", 2079 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 2080 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 2081 | "dev": true, 2082 | "dependencies": { 2083 | "balanced-match": "^1.0.0", 2084 | "concat-map": "0.0.1" 2085 | } 2086 | }, 2087 | "node_modules/test-exclude/node_modules/glob": { 2088 | "version": "7.2.3", 2089 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 2090 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 2091 | "dev": true, 2092 | "dependencies": { 2093 | "fs.realpath": "^1.0.0", 2094 | "inflight": "^1.0.4", 2095 | "inherits": "2", 2096 | "minimatch": "^3.1.1", 2097 | "once": "^1.3.0", 2098 | "path-is-absolute": "^1.0.0" 2099 | }, 2100 | "engines": { 2101 | "node": "*" 2102 | }, 2103 | "funding": { 2104 | "url": "https://github.com/sponsors/isaacs" 2105 | } 2106 | }, 2107 | "node_modules/test-exclude/node_modules/minimatch": { 2108 | "version": "3.1.2", 2109 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 2110 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 2111 | "dev": true, 2112 | "dependencies": { 2113 | "brace-expansion": "^1.1.7" 2114 | }, 2115 | "engines": { 2116 | "node": "*" 2117 | } 2118 | }, 2119 | "node_modules/time-zone": { 2120 | "version": "1.0.0", 2121 | "resolved": "https://registry.npmjs.org/time-zone/-/time-zone-1.0.0.tgz", 2122 | "integrity": "sha512-TIsDdtKo6+XrPtiTm1ssmMngN1sAhyKnTO2kunQWqNPWIVvCm15Wmw4SWInwTVgJ5u/Tr04+8Ei9TNcw4x4ONA==", 2123 | "dev": true, 2124 | "engines": { 2125 | "node": ">=4" 2126 | } 2127 | }, 2128 | "node_modules/tinybench": { 2129 | "version": "2.4.0", 2130 | "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.4.0.tgz", 2131 | "integrity": "sha512-iyziEiyFxX4kyxSp+MtY1oCH/lvjH3PxFN8PGCDeqcZWAJ/i+9y+nL85w99PxVzrIvew/GSkSbDYtiGVa85Afg==", 2132 | "dev": true 2133 | }, 2134 | "node_modules/tinypool": { 2135 | "version": "0.4.0", 2136 | "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.4.0.tgz", 2137 | "integrity": "sha512-2ksntHOKf893wSAH4z/+JbPpi92esw8Gn9N2deXX+B0EO92hexAVI9GIZZPx7P5aYo5KULfeOSt3kMOmSOy6uA==", 2138 | "dev": true, 2139 | "engines": { 2140 | "node": ">=14.0.0" 2141 | } 2142 | }, 2143 | "node_modules/tinyspy": { 2144 | "version": "2.1.0", 2145 | "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.1.0.tgz", 2146 | "integrity": "sha512-7eORpyqImoOvkQJCSkL0d0mB4NHHIFAy4b1u8PHdDa7SjGS2njzl6/lyGoZLm+eyYEtlUmFGE0rFj66SWxZgQQ==", 2147 | "dev": true, 2148 | "engines": { 2149 | "node": ">=14.0.0" 2150 | } 2151 | }, 2152 | "node_modules/ts-node": { 2153 | "version": "10.9.1", 2154 | "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", 2155 | "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", 2156 | "dev": true, 2157 | "dependencies": { 2158 | "@cspotcode/source-map-support": "^0.8.0", 2159 | "@tsconfig/node10": "^1.0.7", 2160 | "@tsconfig/node12": "^1.0.7", 2161 | "@tsconfig/node14": "^1.0.0", 2162 | "@tsconfig/node16": "^1.0.2", 2163 | "acorn": "^8.4.1", 2164 | "acorn-walk": "^8.1.1", 2165 | "arg": "^4.1.0", 2166 | "create-require": "^1.1.0", 2167 | "diff": "^4.0.1", 2168 | "make-error": "^1.1.1", 2169 | "v8-compile-cache-lib": "^3.0.1", 2170 | "yn": "3.1.1" 2171 | }, 2172 | "bin": { 2173 | "ts-node": "dist/bin.js", 2174 | "ts-node-cwd": "dist/bin-cwd.js", 2175 | "ts-node-esm": "dist/bin-esm.js", 2176 | "ts-node-script": "dist/bin-script.js", 2177 | "ts-node-transpile-only": "dist/bin-transpile.js", 2178 | "ts-script": "dist/bin-script-deprecated.js" 2179 | }, 2180 | "peerDependencies": { 2181 | "@swc/core": ">=1.2.50", 2182 | "@swc/wasm": ">=1.2.50", 2183 | "@types/node": "*", 2184 | "typescript": ">=2.7" 2185 | }, 2186 | "peerDependenciesMeta": { 2187 | "@swc/core": { 2188 | "optional": true 2189 | }, 2190 | "@swc/wasm": { 2191 | "optional": true 2192 | } 2193 | } 2194 | }, 2195 | "node_modules/type-detect": { 2196 | "version": "4.0.8", 2197 | "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", 2198 | "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", 2199 | "dev": true, 2200 | "engines": { 2201 | "node": ">=4" 2202 | } 2203 | }, 2204 | "node_modules/typescript": { 2205 | "version": "5.0.4", 2206 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", 2207 | "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", 2208 | "dev": true, 2209 | "bin": { 2210 | "tsc": "bin/tsc", 2211 | "tsserver": "bin/tsserver" 2212 | }, 2213 | "engines": { 2214 | "node": ">=12.20" 2215 | } 2216 | }, 2217 | "node_modules/ufo": { 2218 | "version": "1.1.1", 2219 | "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.1.1.tgz", 2220 | "integrity": "sha512-MvlCc4GHrmZdAllBc0iUDowff36Q9Ndw/UzqmEKyrfSzokTd9ZCy1i+IIk5hrYKkjoYVQyNbrw7/F8XJ2rEwTg==", 2221 | "dev": true 2222 | }, 2223 | "node_modules/v8-compile-cache-lib": { 2224 | "version": "3.0.1", 2225 | "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", 2226 | "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", 2227 | "dev": true 2228 | }, 2229 | "node_modules/v8-to-istanbul": { 2230 | "version": "9.1.0", 2231 | "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz", 2232 | "integrity": "sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==", 2233 | "dev": true, 2234 | "dependencies": { 2235 | "@jridgewell/trace-mapping": "^0.3.12", 2236 | "@types/istanbul-lib-coverage": "^2.0.1", 2237 | "convert-source-map": "^1.6.0" 2238 | }, 2239 | "engines": { 2240 | "node": ">=10.12.0" 2241 | } 2242 | }, 2243 | "node_modules/v8-to-istanbul/node_modules/@jridgewell/resolve-uri": { 2244 | "version": "3.1.0", 2245 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", 2246 | "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", 2247 | "dev": true, 2248 | "engines": { 2249 | "node": ">=6.0.0" 2250 | } 2251 | }, 2252 | "node_modules/v8-to-istanbul/node_modules/@jridgewell/sourcemap-codec": { 2253 | "version": "1.4.14", 2254 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", 2255 | "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", 2256 | "dev": true 2257 | }, 2258 | "node_modules/v8-to-istanbul/node_modules/@jridgewell/trace-mapping": { 2259 | "version": "0.3.18", 2260 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", 2261 | "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", 2262 | "dev": true, 2263 | "dependencies": { 2264 | "@jridgewell/resolve-uri": "3.1.0", 2265 | "@jridgewell/sourcemap-codec": "1.4.14" 2266 | } 2267 | }, 2268 | "node_modules/vite": { 2269 | "version": "4.3.1", 2270 | "resolved": "https://registry.npmjs.org/vite/-/vite-4.3.1.tgz", 2271 | "integrity": "sha512-EPmfPLAI79Z/RofuMvkIS0Yr091T2ReUoXQqc5ppBX/sjFRhHKiPPF/R46cTdoci/XgeQpB23diiJxq5w30vdg==", 2272 | "dev": true, 2273 | "dependencies": { 2274 | "esbuild": "^0.17.5", 2275 | "postcss": "^8.4.21", 2276 | "rollup": "^3.20.2" 2277 | }, 2278 | "bin": { 2279 | "vite": "bin/vite.js" 2280 | }, 2281 | "engines": { 2282 | "node": "^14.18.0 || >=16.0.0" 2283 | }, 2284 | "optionalDependencies": { 2285 | "fsevents": "~2.3.2" 2286 | }, 2287 | "peerDependencies": { 2288 | "@types/node": ">= 14", 2289 | "less": "*", 2290 | "sass": "*", 2291 | "stylus": "*", 2292 | "sugarss": "*", 2293 | "terser": "^5.4.0" 2294 | }, 2295 | "peerDependenciesMeta": { 2296 | "@types/node": { 2297 | "optional": true 2298 | }, 2299 | "less": { 2300 | "optional": true 2301 | }, 2302 | "sass": { 2303 | "optional": true 2304 | }, 2305 | "stylus": { 2306 | "optional": true 2307 | }, 2308 | "sugarss": { 2309 | "optional": true 2310 | }, 2311 | "terser": { 2312 | "optional": true 2313 | } 2314 | } 2315 | }, 2316 | "node_modules/vite-node": { 2317 | "version": "0.30.1", 2318 | "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-0.30.1.tgz", 2319 | "integrity": "sha512-vTikpU/J7e6LU/8iM3dzBo8ZhEiKZEKRznEMm+mJh95XhWaPrJQraT/QsT2NWmuEf+zgAoMe64PKT7hfZ1Njmg==", 2320 | "dev": true, 2321 | "dependencies": { 2322 | "cac": "^6.7.14", 2323 | "debug": "^4.3.4", 2324 | "mlly": "^1.2.0", 2325 | "pathe": "^1.1.0", 2326 | "picocolors": "^1.0.0", 2327 | "vite": "^3.0.0 || ^4.0.0" 2328 | }, 2329 | "bin": { 2330 | "vite-node": "vite-node.mjs" 2331 | }, 2332 | "engines": { 2333 | "node": ">=v14.18.0" 2334 | }, 2335 | "funding": { 2336 | "url": "https://github.com/sponsors/antfu" 2337 | } 2338 | }, 2339 | "node_modules/vitest": { 2340 | "version": "0.30.1", 2341 | "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.30.1.tgz", 2342 | "integrity": "sha512-y35WTrSTlTxfMLttgQk4rHcaDkbHQwDP++SNwPb+7H8yb13Q3cu2EixrtHzF27iZ8v0XCciSsLg00RkPAzB/aA==", 2343 | "dev": true, 2344 | "dependencies": { 2345 | "@types/chai": "^4.3.4", 2346 | "@types/chai-subset": "^1.3.3", 2347 | "@types/node": "*", 2348 | "@vitest/expect": "0.30.1", 2349 | "@vitest/runner": "0.30.1", 2350 | "@vitest/snapshot": "0.30.1", 2351 | "@vitest/spy": "0.30.1", 2352 | "@vitest/utils": "0.30.1", 2353 | "acorn": "^8.8.2", 2354 | "acorn-walk": "^8.2.0", 2355 | "cac": "^6.7.14", 2356 | "chai": "^4.3.7", 2357 | "concordance": "^5.0.4", 2358 | "debug": "^4.3.4", 2359 | "local-pkg": "^0.4.3", 2360 | "magic-string": "^0.30.0", 2361 | "pathe": "^1.1.0", 2362 | "picocolors": "^1.0.0", 2363 | "source-map": "^0.6.1", 2364 | "std-env": "^3.3.2", 2365 | "strip-literal": "^1.0.1", 2366 | "tinybench": "^2.4.0", 2367 | "tinypool": "^0.4.0", 2368 | "vite": "^3.0.0 || ^4.0.0", 2369 | "vite-node": "0.30.1", 2370 | "why-is-node-running": "^2.2.2" 2371 | }, 2372 | "bin": { 2373 | "vitest": "vitest.mjs" 2374 | }, 2375 | "engines": { 2376 | "node": ">=v14.18.0" 2377 | }, 2378 | "funding": { 2379 | "url": "https://github.com/sponsors/antfu" 2380 | }, 2381 | "peerDependencies": { 2382 | "@edge-runtime/vm": "*", 2383 | "@vitest/browser": "*", 2384 | "@vitest/ui": "*", 2385 | "happy-dom": "*", 2386 | "jsdom": "*", 2387 | "playwright": "*", 2388 | "safaridriver": "*", 2389 | "webdriverio": "*" 2390 | }, 2391 | "peerDependenciesMeta": { 2392 | "@edge-runtime/vm": { 2393 | "optional": true 2394 | }, 2395 | "@vitest/browser": { 2396 | "optional": true 2397 | }, 2398 | "@vitest/ui": { 2399 | "optional": true 2400 | }, 2401 | "happy-dom": { 2402 | "optional": true 2403 | }, 2404 | "jsdom": { 2405 | "optional": true 2406 | }, 2407 | "playwright": { 2408 | "optional": true 2409 | }, 2410 | "safaridriver": { 2411 | "optional": true 2412 | }, 2413 | "webdriverio": { 2414 | "optional": true 2415 | } 2416 | } 2417 | }, 2418 | "node_modules/well-known-symbols": { 2419 | "version": "2.0.0", 2420 | "resolved": "https://registry.npmjs.org/well-known-symbols/-/well-known-symbols-2.0.0.tgz", 2421 | "integrity": "sha512-ZMjC3ho+KXo0BfJb7JgtQ5IBuvnShdlACNkKkdsqBmYw3bPAaJfPeYUo6tLUaT5tG/Gkh7xkpBhKRQ9e7pyg9Q==", 2422 | "dev": true, 2423 | "engines": { 2424 | "node": ">=6" 2425 | } 2426 | }, 2427 | "node_modules/which": { 2428 | "version": "2.0.2", 2429 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 2430 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 2431 | "dev": true, 2432 | "dependencies": { 2433 | "isexe": "^2.0.0" 2434 | }, 2435 | "bin": { 2436 | "node-which": "bin/node-which" 2437 | }, 2438 | "engines": { 2439 | "node": ">= 8" 2440 | } 2441 | }, 2442 | "node_modules/why-is-node-running": { 2443 | "version": "2.2.2", 2444 | "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.2.2.tgz", 2445 | "integrity": "sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==", 2446 | "dev": true, 2447 | "dependencies": { 2448 | "siginfo": "^2.0.0", 2449 | "stackback": "0.0.2" 2450 | }, 2451 | "bin": { 2452 | "why-is-node-running": "cli.js" 2453 | }, 2454 | "engines": { 2455 | "node": ">=8" 2456 | } 2457 | }, 2458 | "node_modules/wrap-ansi": { 2459 | "version": "7.0.0", 2460 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 2461 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 2462 | "dev": true, 2463 | "dependencies": { 2464 | "ansi-styles": "^4.0.0", 2465 | "string-width": "^4.1.0", 2466 | "strip-ansi": "^6.0.0" 2467 | }, 2468 | "engines": { 2469 | "node": ">=10" 2470 | }, 2471 | "funding": { 2472 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 2473 | } 2474 | }, 2475 | "node_modules/wrap-ansi/node_modules/ansi-styles": { 2476 | "version": "4.3.0", 2477 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 2478 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 2479 | "dev": true, 2480 | "dependencies": { 2481 | "color-convert": "^2.0.1" 2482 | }, 2483 | "engines": { 2484 | "node": ">=8" 2485 | }, 2486 | "funding": { 2487 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 2488 | } 2489 | }, 2490 | "node_modules/wrappy": { 2491 | "version": "1.0.2", 2492 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 2493 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 2494 | "dev": true 2495 | }, 2496 | "node_modules/y18n": { 2497 | "version": "5.0.8", 2498 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", 2499 | "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", 2500 | "dev": true, 2501 | "engines": { 2502 | "node": ">=10" 2503 | } 2504 | }, 2505 | "node_modules/yallist": { 2506 | "version": "4.0.0", 2507 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 2508 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", 2509 | "dev": true 2510 | }, 2511 | "node_modules/yargs": { 2512 | "version": "16.2.0", 2513 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", 2514 | "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", 2515 | "dev": true, 2516 | "dependencies": { 2517 | "cliui": "^7.0.2", 2518 | "escalade": "^3.1.1", 2519 | "get-caller-file": "^2.0.5", 2520 | "require-directory": "^2.1.1", 2521 | "string-width": "^4.2.0", 2522 | "y18n": "^5.0.5", 2523 | "yargs-parser": "^20.2.2" 2524 | }, 2525 | "engines": { 2526 | "node": ">=10" 2527 | } 2528 | }, 2529 | "node_modules/yargs-parser": { 2530 | "version": "20.2.9", 2531 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", 2532 | "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", 2533 | "dev": true, 2534 | "engines": { 2535 | "node": ">=10" 2536 | } 2537 | }, 2538 | "node_modules/yn": { 2539 | "version": "3.1.1", 2540 | "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", 2541 | "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", 2542 | "dev": true, 2543 | "engines": { 2544 | "node": ">=6" 2545 | } 2546 | }, 2547 | "node_modules/yocto-queue": { 2548 | "version": "0.1.0", 2549 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 2550 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 2551 | "dev": true, 2552 | "engines": { 2553 | "node": ">=10" 2554 | }, 2555 | "funding": { 2556 | "url": "https://github.com/sponsors/sindresorhus" 2557 | } 2558 | } 2559 | } 2560 | } 2561 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "aws-organization-for-devs", 3 | "version": "0.1.0", 4 | "scripts": { 5 | "build": "vite build", 6 | "clean": "rimraf cdk.out coverage dist", 7 | "deploy": "npm run clean && cdk deploy --all --require-approval never", 8 | "destroy": "cdk destroy", 9 | "diff": "cdk diff", 10 | "synth": "cdk synth", 11 | "test": "vitest run --coverage --silent" 12 | }, 13 | "dependencies": { 14 | "aws-cdk-github-oidc": "^2.3.2", 15 | "aws-cdk-lib": "^2.76.0", 16 | "constructs": "^10.2.3" 17 | }, 18 | "devDependencies": { 19 | "@types/node": "^18.15.13", 20 | "@vitest/coverage-c8": "^0.30.1", 21 | "aws-cdk": "^2.76.0", 22 | "rimraf": "^5.0.0", 23 | "ts-node": "^10.9.1", 24 | "typescript": "^5.0.4", 25 | "vitest": "^0.30.1" 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /test/setup.ts: -------------------------------------------------------------------------------- 1 | import { expect } from 'vitest'; 2 | 3 | expect.addSnapshotSerializer({ 4 | serialize: (val) => JSON.stringify({ ...val, S3Key: '[HASH REMOVED].zip' }), 5 | test: (val) => val && Object.prototype.hasOwnProperty.call(val, 'S3Key'), 6 | }); 7 | -------------------------------------------------------------------------------- /vitest.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vitest/config'; 2 | 3 | export default defineConfig({ 4 | test: { 5 | coverage: { 6 | all: true, 7 | exclude: ['**/*.spec.ts', 'cdk/aws-organization-for-devs.ts'], 8 | include: ['cdk'], 9 | }, 10 | deps: { 11 | inline: ['vitest-mock-process'], 12 | }, 13 | setupFiles: './test/setup.ts', 14 | threads: false, 15 | }, 16 | }); 17 | --------------------------------------------------------------------------------