Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(cx-api): cannot detect CloudAssembly across different libraries #32998

Draft
wants to merge 1 commit into
base: main
Choose a base branch
from

Conversation

mrgrain
Copy link
Contributor

@mrgrain mrgrain commented Jan 17, 2025

Reason for this change

We are publishing the cx-api package twice: Once as a standalone package @aws-cdk/cx-api and once as part of the construct library under aws-cdk-lib/cx-api. The code is copied during the release and the same versions of the packages will have the same code.

However this makes it difficult for other packages to take a type dependency on types from this package. The most common class that's used from cx-api is CloudAssembly - the result of app.synth(). Previously a package had to take a dependency on the very large aws-cdk-lib just to use a single type. It would be better if other packages could instead depend on the smaller, much more focused @aws-cdk/cx-api package.

Description of changes

This adds the same mechanism to CloudAssembly to detect cross-library compatibility, that we already use for constructs like Stack or App. In TypeScript, it's now possible for a consuming package to receive an object from either package and check at runtime if it satisfies the requirements.

We cannot get around type checking with this. Instead we introduce a new type ICloudAssembly into the Cloud Assembly Schema package (cdklabs/cloud-assembly-schema#133). This interface only declares a single property: directory. Consumers can use this type to indicate where they would like to receive a CloudAssembly. They can then use runtime code to either confirm a provided object already satisfies the requirements or fallback to creating a new CloudAssembly from the directory.

Because the CloudAssembly in cxapi implements the new interface, this approach will work in all jsii languages. In TypeScript it's even compatible with older version of aws-cdk-lib. Jsii language will only support this going forward.

Describe any new or updated permissions being added

n/a

Description of how you validated changes

Unit tests.

Checklist


By submitting this pull request, I confirm that my contribution is made under the terms of the Apache-2.0 license

@aws-cdk-automation aws-cdk-automation requested a review from a team January 17, 2025 21:40
@github-actions github-actions bot added the p2 label Jan 17, 2025
@mrgrain mrgrain changed the title fix(cx-api): cannot detect CloudAssembly across different library ver… fix(cx-api): cannot detect CloudAssembly across different libraries Jan 17, 2025
@mergify mergify bot added the contribution/core This is a PR that came from AWS. label Jan 17, 2025
Copy link
Collaborator

@aws-cdk-automation aws-cdk-automation left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The pull request linter fails with the following errors:

❌ Fixes must contain a change to an integration test file and the resulting snapshot.

If you believe this pull request should receive an exemption, please comment and provide a justification. A comment requesting an exemption should contain the text Exemption Request. Additionally, if clarification is needed, add Clarification Request to a comment.

@mrgrain mrgrain force-pushed the mrgrain/feat/toolkit/assembly-return branch from 2680942 to ed53139 Compare January 17, 2025 21:54
Copy link

codecov bot commented Jan 17, 2025

Codecov Report

All modified and coverable lines are covered by tests ✅

Project coverage is 81.44%. Comparing base (ebe9580) to head (ed53139).
Report is 3 commits behind head on main.

Additional details and impacted files
@@           Coverage Diff           @@
##             main   #32998   +/-   ##
=======================================
  Coverage   81.44%   81.44%           
=======================================
  Files         225      225           
  Lines       13702    13702           
  Branches     2404     2404           
=======================================
  Hits        11160    11160           
  Misses       2267     2267           
  Partials      275      275           
Flag Coverage Δ
suite.unit 81.44% <ø> (ø)

Flags with carried forward coverage won't be shown. Click here to find out more.

Components Coverage Δ
packages/aws-cdk 80.81% <ø> (ø)
packages/aws-cdk-lib/core 82.10% <ø> (ø)

@aws-cdk-automation
Copy link
Collaborator

AWS CodeBuild CI Report

  • CodeBuild project: AutoBuildv2Project1C6BFA3F-wQm2hXv2jqQv
  • Commit ID: ed53139
  • Result: SUCCEEDED
  • Build Logs (available for 30 days)

Powered by github-codebuild-logs, available on the AWS Serverless Application Repository

mergify bot pushed a commit to cdklabs/cloud-assembly-schema that referenced this pull request Jan 20, 2025
### Issue

Relates to aws/aws-cdk#32998

### Reason for this change

We are publishing the `cx-api` package twice: Once as a standalone package `@aws-cdk/cx-api` and once as part of the construct library under `aws-cdk-lib/cx-api`. The code is copied during the release and the same versions of the packages will have the same code. 

However this makes it difficult for other packages to take a type dependency on types from this package. The most common class that's used from `cx-api` is `CloudAssembly` - the result of `app.synth()`. Previously a package had to take a dependency on the very large `aws-cdk-lib` just to use a single type. It would be better if other packages could instead depend on the smaller, much more focused `@aws-cdk/cx-api` package.


### Description of changes

In aws/aws-cdk#32998 we are adding a mechanism to detect cross-library compatibility of the `CloudAssembly` class. **However, that alone doesn't help us with type checking.** Instead we introduce a new type `ICloudAssembly` into the Cloud Assembly Schema. This interface only declares a single property: `directory`. Consumers can use this type to indicate where they would like to receive a `CloudAssembly`. They can then use runtime code to either confirm a provided object already satisfies the requirements or fallback to creating a new `CloudAssembly` from the directory.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
contribution/core This is a PR that came from AWS. p2
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants