Repository: open-constructs/aws-cdk-library (language: python)

Issue:
(codeartifact) Add support for L2 constructs Domain & Repository
**Is your feature request related to a problem? Please describe.**

Managing CodeArtifact repositories and domains through AWS CDK currently requires the use of L1 constructs. This makes it harder to manage these resources with a more streamlined, high-level abstraction, resulting in more code and complexity for users who wish to leverage AWS CodeArtifact for package management.

**Would you be willing to help with a PR?**
- [x] Yes, absolutely
- [ ] Yes, with some guidance
- [ ] Unfortunately no time :'-(

## Describe the solution you'd like

I propose the creation of L2 construct to manage Repository and Domain resources. 

Features could include:

- Domain L2 construct:
  - Support for domain-level permissions management
  - Methods to associate repositories within the domain.
  - Support domain encryption 
- Repository L2 construct:
  - Enable cross-account repository sharing and replication features.
  - Repository-level permissions management
  - Allow configuration of upstream repositories for proxying dependencies from external repositories 

## Describe alternatives you've considered
N/A

## Additional context

:information_source: This is basically created with AI, from the API.md of the constructs we use internally.


This proposal introduces two core constructs:

- `Domain` Construct:
  - Implements: `IDomain`, `ITaggableV2`
  - Properties:
    - `domainName` (string, required): The name of the domain.
    - `encryptionKeyArn` (string, optional): The key used to encrypt the domain.
    - `domainOwner` (string): The AWS account owner.
    - `domainArn` (string): The ARN of the domain.
  - Methods:
    - `grant(grantee: IGrantable, actions: ...string[])`: Grants permissions to interact with the domain.
    - `addToResourcePolicy(statement: PolicyStatement, allowNoOp?: boolean)`: Adds statements to the domain resource policy.
- `Repository` Construct:
  - Implements: `IRepository`, `ITaggableV2`
  - Properties:
    - `repositoryName` (string, required): The name of the repository.
    - `domain` (IDomain, required): The domain containing the repository.
    - `description` (string, optional): A description of the repository.
    - `repositoryArn` (string): The ARN of the repository.
    - `externalConnection` (RepositoryConnection, optional): Connection to external repositories like PyPI or npm.
  - Methods:
    - `grantRead(grantee: IGrantable)`: Grants read access to the repository.
    - `grantReadAndPublish(grantee: IGrantable)`: Grants read and publish access.

**Usage**

Developers will be able to instantiate these constructs in their CDK applications as follows:

```ts
const domain = new Domain(this, 'MyDomain', {
  domainName: 'my-artifacts-domain',
  //(optional) encryptionKey: kmsKey, 
});

const repository = new Repository(this, 'MyRepo', {
  repositoryName: 'my-repo',
  domain: domain,
  description: 'Repository for npm packages',
  externalConnection: RepositoryConnection.NPM,
});
```


Discussion / hints:
@bweigel I have this as L2 already as well. We can pair on it, if you want. 
@moltar that sounds good! Do you want to share some feedback on my proposal above? Maybe you have some completely different design decisions or thoughts on the interface.

Fix patch:
diff --git a/API.md b/API.md
index 00afabc..2d2fd02 100644
--- a/API.md
+++ b/API.md
@@ -246,62 +246,744 @@ The S3 bucket that stores the cost report.
 ---
 
 
+### Domain <a name="Domain" id="@open-constructs/aws-cdk.aws_codeartifact.Domain"></a>
+
+- *Implements:* @open-constructs/aws-cdk.aws_codeartifact.IDomain
+
+Deploys a CodeArtifact domain.
+
+#### Initializers <a name="Initializers" id="@open-constructs/aws-cdk.aws_codeartifact.Domain.Initializer"></a>
+
+```typescript
+import { aws_codeartifact } from '@open-constructs/aws-cdk'
+
+new aws_codeartifact.Domain(scope: Construct, id: string, props: DomainProps)
+```
+
+| **Name** | **Type** | **Description** |
+| --- | --- | --- |
+| <code><a href="#@open-constructs/aws-cdk.aws_codeartifact.Domain.Initializer.parameter.scope">scope</a></code> | <code>constructs.Construct</code> | *No description.* |
+| <code><a href="#@open-constructs/aws-cdk.aws_codeartifact.Domain.Initializer.parameter.id">id</a></code> | <code>string</code> | *No description.* |
+| <code><a href="#@open-constructs/aws-cdk.aws_codeartifact.Domain.Initializer.parameter.props">props</a></code> | <code>@open-constructs/aws-cdk.aws_codeartifact.DomainProps</code> | *No description.* |
+
+---
+
+##### `scope`<sup>Required</sup> <a name="scope" id="@open-constructs/aws-cdk.aws_codeartifact.Domain.Initializer.parameter.scope"></a>
+
+- *Type:* constructs.Construct
+
+---
+
+##### `id`<sup>Required</sup> <a name="id" id="@open-constructs/aws-cdk.aws_codeartifact.Domain.Initializer.parameter.id"></a>
+
+- *Type:* string
+
+---
+
+##### `props`<sup>Required</sup> <a name="props" id="@open-constructs/aws-cdk.aws_codeartifact.Domain.Initializer.parameter.props"></a>
+
+- *Type:* @open-constructs/aws-cdk.aws_codeartifact.DomainProps
+
+---
+
+#### Methods <a name="Methods" id="Methods"></a>
+
+| **Name** | **Description** |
+| --- | --- |
+| <code><a href="#@open-constructs/aws-cdk.aws_codeartifact.Domain.toString">toString</a></code> | Returns a string representation of this construct. |
+| <code><a href="#@open-constructs/aws-cdk.aws_codeartifact.Domain.applyRemovalPolicy">applyRemovalPolicy</a></code> | Apply the given removal policy to this resource. |
+| <code><a href="#@open-constructs/aws-cdk.aws_codeartifact.Domain.addToResourcePolicy">addToResourcePolicy</a></code> | Adds a statement to the Codeartifact domain resource policy. |
+| <code><a href="#@open-constructs/aws-cdk.aws_codeartifact.Domain.grant">grant</a></code> | Grants permissions to the specified grantee on this CodeArtifact domain. |
+| <code><a href="#@open-constructs/aws-cdk.aws_codeartifact.Domain.grantContribute">grantContribute</a></code> | Grants contribute permissions to the specified grantee on this CodeArtifact domain. |
+
+---
+
+##### `toString` <a name="toString" id="@open-constructs/aws-cdk.aws_codeartifact.Domain.toString"></a>
+
+```typescript
+public toString(): string
+```
+
+Returns a string representation of this construct.
+
+##### `applyRemovalPolicy` <a name="applyRemovalPolicy" id="@open-constructs/aws-cdk.aws_codeartifact.Domain.applyRemovalPolicy"></a>
+
+```typescript
+public applyRemovalPolicy(policy: RemovalPolicy): void
+```
+
+Apply the given removal policy to this resource.
+
+The Removal Policy controls what happens to this resource when it stops
+being managed by CloudFormation, either because you've removed it from the
+CDK application or because you've made a change that requires the resource
+to be replaced.
+
+The resource can be deleted (`RemovalPolicy.DESTROY`), or left in your AWS
+account for data recovery and cleanup later (`RemovalPolicy.RETAIN`).
+
+###### `policy`<sup>Required</sup> <a name="policy" id="@open-constructs/aws-cdk.aws_codeartifact.Domain.applyRemovalPolicy.parameter.policy"></a>
+
+- *Type:* aws-cdk-lib.RemovalPolicy
+
+---
+
+##### `addToResourcePolicy` <a name="addToResourcePolicy" id="@open-constructs/aws-cdk.aws_codeartifact.Domain.addToResourcePolicy"></a>
+
+```typescript
+public addToResourcePolicy(statement: PolicyStatement): AddToResourcePolicyResult
+```
+
+Adds a statement to the Codeartifact domain resource policy.
+
+###### `statement`<sup>Required</sup> <a name="statement" id="@open-constructs/aws-cdk.aws_codeartifact.Domain.addToResourcePolicy.parameter.statement"></a>
+
+- *Type:* aws-cdk-lib.aws_iam.PolicyStatement
+
+The policy statement to add.
+
+---
+
+##### `grant` <a name="grant" id="@open-constructs/aws-cdk.aws_codeartifact.Domain.grant"></a>
+
+```typescript
+public grant(grantee: IGrantable, actions: ...string[]): Grant
+```
+
+Grants permissions to the specified grantee on this CodeArtifact domain.
+
+It handles both same-environment and cross-environment scenarios:
+- For same-environment grants, it adds the permissions to the principal or resource.
+- For cross-environment grants, it adds the permissions to both the principal and the resource.
+
+###### `grantee`<sup>Required</sup> <a name="grantee" id="@open-constructs/aws-cdk.aws_codeartifact.Domain.grant.parameter.grantee"></a>
+
+- *Type:* aws-cdk-lib.aws_iam.IGrantable
+
+The principal to grant permissions to.
+
+---
+
+###### `actions`<sup>Required</sup> <a name="actions" id="@open-constructs/aws-cdk.aws_codeartifact.Domain.grant.parameter.actions"></a>
+
+- *Type:* ...string[]
+
+The actions to grant.
+
+These should be valid CodeArtifact actions.
+
+---
+
+##### `grantContribute` <a name="grantContribute" id="@open-constructs/aws-cdk.aws_codeartifact.Domain.grantContribute"></a>
+
+```typescript
+public grantContribute(grantee: IGrantable): Grant
+```
+
+Grants contribute permissions to the specified grantee on this CodeArtifact domain.
+
+###### `grantee`<sup>Required</sup> <a name="grantee" id="@open-constructs/aws-cdk.aws_codeartifact.Domain.grantContribute.parameter.grantee"></a>
+
+- *Type:* aws-cdk-lib.aws_iam.IGrantable
+
+The principal to grant contribute permissions to.
+
+---
+
+#### Static Functions <a name="Static Functions" id="Static Functions"></a>
+
+| **Name** | **Description** |
+| --- | --- |
+| <code><a href="#@open-constructs/aws-cdk.aws_codeartifact.Domain.isConstruct">isConstruct</a></code> | Checks if `x` is a construct. |
+| <code><a href="#@open-constructs/aws-cdk.aws_codeartifact.Domain.isOwnedResource">isOwnedResource</a></code> | Returns true if the construct was created by CDK, and false otherwise. |
+| <code><a href="#@open-constructs/aws-cdk.aws_codeartifact.Domain.isResource">isResource</a></code> | Check whether the given construct is a Resource. |
+| <code><a href="#@open-constructs/aws-cdk.aws_codeartifact.Domain.fromDomainArn">fromDomainArn</a></code> | Creates an IDomain object from an existing CodeArtifact domain ARN. |
+| <code><a href="#@open-constructs/aws-cdk.aws_codeartifact.Domain.fromDomainAttributes">fromDomainAttributes</a></code> | Creates a Domain object from existing domain attributes. |
+
+---
+
+##### `isConstruct` <a name="isConstruct" id="@open-constructs/aws-cdk.aws_codeartifact.Domain.isConstruct"></a>
+
+```typescript
+import { aws_codeartifact } from '@open-constructs/aws-cdk'
+
+aws_codeartifact.Domain.isConstruct(x: any)
+```
+
+Checks if `x` is a construct.
+
+Use this method instead of `instanceof` to properly detect `Construct`
+instances, even when the construct library is symlinked.
+
+Explanation: in JavaScript, multiple copies of the `constructs` library on
+disk are seen as independent, completely different libraries. As a
+consequence, the class `Construct` in each copy of the `constructs` library
+is seen as a different class, and an instance of one class will not test as
+`instanceof` the other class. `npm install` will not create installations
+like this, but users may manually symlink construct libraries together or
+use a monorepo tool: in those cases, multiple copies of the `constructs`
+library can be accidentally installed, and `instanceof` will behave
+unpredictably. It is safest to avoid using `instanceof`, and using
+this type-testing method instead.
+
+###### `x`<sup>Required</sup> <a name="x" id="@open-constructs/aws-cdk.aws_codeartifact.Domain.isConstruct.parameter.x"></a>
+
+- *Type:* any
+
+Any object.
+
+---
+
+##### `isOwnedResource` <a name="isOwnedResource" id="@open-constructs/aws-cdk.aws_codeartifact.Domain.isOwnedResource"></a>
+
+```typescript
+import { aws_codeartifact } from '@open-constructs/aws-cdk'
+
+aws_codeartifact.Domain.isOwnedResource(construct: IConstruct)
+```
+
+Returns true if the construct was created by CDK, and false otherwise.
+
+###### `construct`<sup>Required</sup> <a name="construct" id="@open-constructs/aws-cdk.aws_codeartifact.Domain.isOwnedResource.parameter.construct"></a>
+
+- *Type:* constructs.IConstruct
+
+---
+
+##### `isResource` <a name="isResource" id="@open-constructs/aws-cdk.aws_codeartifact.Domain.isResource"></a>
+
+```typescript
+import { aws_codeartifact } from '@open-constructs/aws-cdk'
+
+aws_codeartifact.Domain.isResource(construct: IConstruct)
+```
+
+Check whether the given construct is a Resource.
+
+###### `construct`<sup>Required</sup> <a name="construct" id="@open-constructs/aws-cdk.aws_codeartifact.Domain.isResource.parameter.construct"></a>
+
+- *Type:* constructs.IConstruct
+
+---
+
+##### `fromDomainArn` <a name="fromDomainArn" id="@open-constructs/aws-cdk.aws_codeartifact.Domain.fromDomainArn"></a>
+
+```typescript
+import { aws_codeartifact } from '@open-constructs/aws-cdk'
+
+aws_codeartifact.Domain.fromDomainArn(scope: Construct, id: string, domainArn: string)
+```
+
+Creates an IDomain object from an existing CodeArtifact domain ARN.
+
+###### `scope`<sup>Required</sup> <a name="scope" id="@open-constructs/aws-cdk.aws_codeartifact.Domain.fromDomainArn.parameter.scope"></a>
+
+- *Type:* constructs.Construct
+
+The parent construct.
+
+---
+
+###### `id`<sup>Required</sup> <a name="id" id="@open-constructs/aws-cdk.aws_codeartifact.Domain.fromDomainArn.parameter.id"></a>
+
+- *Type:* string
+
+The construct id.
+
+---
+
+###### `domainArn`<sup>Required</sup> <a name="domainArn" id="@open-constructs/aws-cdk.aws_codeartifact.Domain.fromDomainArn.parameter.domainArn"></a>
+
+- *Type:* string
+
+The ARN (Amazon Resource Name) of the existing CodeArtifact domain.
+
+---
+
+##### `fromDomainAttributes` <a name="fromDomainAttributes" id="@open-constructs/aws-cdk.aws_codeartifact.Domain.fromDomainAttributes"></a>
+
+```typescript
+import { aws_codeartifact } from '@open-constructs/aws-cdk'
+
+aws_codeartifact.Domain.fromDomainAttributes(scope: Construct, id: string, attrs: DomainAttributes)
+```
+
+Creates a Domain object from existing domain attributes.
+
+###### `scope`<sup>Required</sup> <a name="scope" id="@open-constructs/aws-cdk.aws_codeartifact.Domain.fromDomainAttributes.parameter.scope"></a>
+
+- *Type:* constructs.Construct
+
+The parent construct.
+
+---
+
+###### `id`<sup>Required</sup> <a name="id" id="@open-constructs/aws-cdk.aws_codeartifact.Domain.fromDomainAttributes.parameter.id"></a>
+
+- *Type:* string
+
+The construct id.
+
+---
+
+###### `attrs`<sup>Required</sup> <a name="attrs" id="@open-constructs/aws-cdk.aws_codeartifact.Domain.fromDomainAttributes.parameter.attrs"></a>
+
+- *Type:* @open-constructs/aws-cdk.aws_codeartifact.DomainAttributes
+
+The attributes of the domain to import.
+
+---
+
+#### Properties <a name="Properties" id="Properties"></a>
+
+| **Name** | **Type** | **Description** |
+| --- | --- | --- |
+| <code><a href="#@open-constructs/aws-cdk.aws_codeartifact.Domain.property.node">node</a></code> | <code>constructs.Node</code> | The tree node. |
+| <code><a href="#@open-constructs/aws-cdk.aws_codeartifact.Domain.property.env">env</a></code> | <code>aws-cdk-lib.ResourceEnvironment</code> | The environment this resource belongs to. |
+| <code><a href="#@open-constructs/aws-cdk.aws_codeartifact.Domain.property.stack">stack</a></code> | <code>aws-cdk-lib.Stack</code> | The stack in which this resource is defined. |
+| <code><a href="#@open-constructs/aws-cdk.aws_codeartifact.Domain.property.domainArn">domainArn</a></code> | <code>string</code> | The ARN (Amazon Resource Name) of this CodeArtifact domain. |
+| <code><a href="#@open-constructs/aws-cdk.aws_codeartifact.Domain.property.domainName">domainName</a></code> | <code>string</code> | The name of this CodeArtifact domain. |
+| <code><a href="#@open-constructs/aws-cdk.aws_codeartifact.Domain.property.domainOwner">domainOwner</a></code> | <code>string</code> | The AWS account ID that owns this domain. |
+| <code><a href="#@open-constructs/aws-cdk.aws_codeartifact.Domain.property.domainEncryptionKey">domainEncryptionKey</a></code> | <code>string</code> | The ARN of the key used to encrypt the Domain. |
+| <code><a href="#@open-constructs/aws-cdk.aws_codeartifact.Domain.property.encryptionKey">encryptionKey</a></code> | <code>aws-cdk-lib.aws_kms.IKey</code> | The AWS KMS encryption key associated with this domain, if any. |
+
+---
+
+##### `node`<sup>Required</sup> <a name="node" id="@open-constructs/aws-cdk.aws_codeartifact.Domain.property.node"></a>
+
+```typescript
+public readonly node: Node;
+```
+
+- *Type:* constructs.Node
+
+The tree node.
+
+---
+
+##### `env`<sup>Required</sup> <a name="env" id="@open-constructs/aws-cdk.aws_codeartifact.Domain.property.env"></a>
+
+```typescript
+public readonly env: ResourceEnvironment;
+```
+
+- *Type:* aws-cdk-lib.ResourceEnvironment
+
+The environment this resource belongs to.
+
+For resources that are created and managed by the CDK
+(generally, those created by creating new class instances like Role, Bucket, etc.),
+this is always the same as the environment of the stack they belong to;
+however, for imported resources
+(those obtained from static methods like fromRoleArn, fromBucketName, etc.),
+that might be different than the stack they were imported into.
+
+---
+
+##### `stack`<sup>Required</sup> <a name="stack" id="@open-constructs/aws-cdk.aws_codeartifact.Domain.property.stack"></a>
+
+```typescript
+public readonly stack: Stack;
+```
+
+- *Type:* aws-cdk-lib.Stack
+
+The stack in which this resource is defined.
+
+---
+
+##### `domainArn`<sup>Required</sup> <a name="domainArn" id="@open-constructs/aws-cdk.aws_codeartifact.Domain.property.domainArn"></a>
+
+```typescript
+public readonly domainArn: string;
+```
+
+- *Type:* string
+
+The ARN (Amazon Resource Name) of this CodeArtifact domain.
+
+---
+
+##### `domainName`<sup>Required</sup> <a name="domainName" id="@open-constructs/aws-cdk.aws_codeartifact.Domain.property.domainName"></a>
+
+```typescript
+public readonly domainName: string;
+```
+
+- *Type:* string
+
+The name of this CodeArtifact domain.
+
+---
+
+##### `domainOwner`<sup>Required</sup> <a name="domainOwner" id="@open-constructs/aws-cdk.aws_codeartifact.Domain.property.domainOwner"></a>
+
+```typescript
+public readonly domainOwner: string;
+```
+
+- *Type:* string
+
+The AWS account ID that owns this domain.
+
+---
+
+##### `domainEncryptionKey`<sup>Optional</sup> <a name="domainEncryptionKey" id="@open-constructs/aws-cdk.aws_codeartifact.Domain.property.domainEncryptionKey"></a>
+
+```typescript
+public readonly domainEncryptionKey: string;
+```
+
+- *Type:* string
+
+The ARN of the key used to encrypt the Domain.
+
+---
+
+##### `encryptionKey`<sup>Optional</sup> <a name="encryptionKey" id="@open-constructs/aws-cdk.aws_codeartifact.Domain.property.encryptionKey"></a>
+
+```typescript
+public readonly encryptionKey: IKey;
+```
+
+- *Type:* aws-cdk-lib.aws_kms.IKey
+
+The AWS KMS encryption key associated with this domain, if any.
+
+---
+
+
 ### InstanceConnectEndpoint <a name="InstanceConnectEndpoint" id="@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpoint"></a>
 
-- *Implements:* @open-constructs/aws-cdk.aws_ec2.IInstanceConnectEndpoint
+- *Implements:* @open-constructs/aws-cdk.aws_ec2.IInstanceConnectEndpoint
+
+Represents an EC2 Instance Connect Endpoint construct in AWS CDK.
+
+*Example*
+
+```typescript
+declare const securityGroups: aws_ec2.ISecurityGroup[];
+declare const vpc: aws_ec2.IVpc;
+
+const instanceConnectEndpoint = new InstanceConnectEndpoint(
+  stack,
+  'InstanceConnectEndpoint',
+  {
+    clientToken: 'my-client-token',
+    preserveClientIp: true,
+    securityGroups,
+    vpc,
+  },
+);
+```
+
+
+#### Initializers <a name="Initializers" id="@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpoint.Initializer"></a>
+
+```typescript
+import { aws_ec2 } from '@open-constructs/aws-cdk'
+
+new aws_ec2.InstanceConnectEndpoint(scope: Construct, id: string, props: InstanceConnectEndpointProps)
+```
+
+| **Name** | **Type** | **Description** |
+| --- | --- | --- |
+| <code><a href="#@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpoint.Initializer.parameter.scope">scope</a></code> | <code>constructs.Construct</code> | *No description.* |
+| <code><a href="#@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpoint.Initializer.parameter.id">id</a></code> | <code>string</code> | *No description.* |
+| <code><a href="#@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpoint.Initializer.parameter.props">props</a></code> | <code>@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpointProps</code> | *No description.* |
+
+---
+
+##### `scope`<sup>Required</sup> <a name="scope" id="@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpoint.Initializer.parameter.scope"></a>
+
+- *Type:* constructs.Construct
+
+---
+
+##### `id`<sup>Required</sup> <a name="id" id="@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpoint.Initializer.parameter.id"></a>
+
+- *Type:* string
+
+---
+
+##### `props`<sup>Required</sup> <a name="props" id="@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpoint.Initializer.parameter.props"></a>
+
+- *Type:* @open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpointProps
+
+---
+
+#### Methods <a name="Methods" id="Methods"></a>
+
+| **Name** | **Description** |
+| --- | --- |
+| <code><a href="#@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpoint.toString">toString</a></code> | Returns a string representation of this construct. |
+| <code><a href="#@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpoint.applyRemovalPolicy">applyRemovalPolicy</a></code> | Apply the given removal policy to this resource. |
+
+---
 
-Represents an EC2 Instance Connect Endpoint construct in AWS CDK.
+##### `toString` <a name="toString" id="@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpoint.toString"></a>
 
-*Example*
+```typescript
+public toString(): string
+```
+
+Returns a string representation of this construct.
+
+##### `applyRemovalPolicy` <a name="applyRemovalPolicy" id="@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpoint.applyRemovalPolicy"></a>
 
 ```typescript
-declare const securityGroups: aws_ec2.ISecurityGroup[];
-declare const vpc: aws_ec2.IVpc;
+public applyRemovalPolicy(policy: RemovalPolicy): void
+```
 
-const instanceConnectEndpoint = new InstanceConnectEndpoint(
+Apply the given removal policy to this resource.
+
+The Removal Policy controls what happens to this resource when it stops
+being managed by CloudFormation, either because you've removed it from the
+CDK application or because you've made a change that requires the resource
+to be replaced.
+
+The resource can be deleted (`RemovalPolicy.DESTROY`), or left in your AWS
+account for data recovery and cleanup later (`RemovalPolicy.RETAIN`).
+
+###### `policy`<sup>Required</sup> <a name="policy" id="@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpoint.applyRemovalPolicy.parameter.policy"></a>
+
+- *Type:* aws-cdk-lib.RemovalPolicy
+
+---
+
+#### Static Functions <a name="Static Functions" id="Static Functions"></a>
+
+| **Name** | **Description** |
+| --- | --- |
+| <code><a href="#@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpoint.isConstruct">isConstruct</a></code> | Checks if `x` is a construct. |
+| <code><a href="#@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpoint.isOwnedResource">isOwnedResource</a></code> | Returns true if the construct was created by CDK, and false otherwise. |
+| <code><a href="#@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpoint.isResource">isResource</a></code> | Check whether the given construct is a Resource. |
+| <code><a href="#@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpoint.fromInstanceConnectEndpointAttributes">fromInstanceConnectEndpointAttributes</a></code> | Import an existing endpoint to the stack from its attributes. |
+
+---
+
+##### `isConstruct` <a name="isConstruct" id="@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpoint.isConstruct"></a>
+
+```typescript
+import { aws_ec2 } from '@open-constructs/aws-cdk'
+
+aws_ec2.InstanceConnectEndpoint.isConstruct(x: any)
+```
+
+Checks if `x` is a construct.
+
+Use this method instead of `instanceof` to properly detect `Construct`
+instances, even when the construct library is symlinked.
+
+Explanation: in JavaScript, multiple copies of the `constructs` library on
+disk are seen as independent, completely different libraries. As a
+consequence, the class `Construct` in each copy of the `constructs` library
+is seen as a different class, and an instance of one class will not test as
+`instanceof` the other class. `npm install` will not create installations
+like this, but users may manually symlink construct libraries together or
+use a monorepo tool: in those cases, multiple copies of the `constructs`
+library can be accidentally installed, and `instanceof` will behave
+unpredictably. It is safest to avoid using `instanceof`, and using
+this type-testing method instead.
+
+###### `x`<sup>Required</sup> <a name="x" id="@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpoint.isConstruct.parameter.x"></a>
+
+- *Type:* any
+
+Any object.
+
+---
+
+##### `isOwnedResource` <a name="isOwnedResource" id="@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpoint.isOwnedResource"></a>
+
+```typescript
+import { aws_ec2 } from '@open-constructs/aws-cdk'
+
+aws_ec2.InstanceConnectEndpoint.isOwnedResource(construct: IConstruct)
+```
+
+Returns true if the construct was created by CDK, and false otherwise.
+
+###### `construct`<sup>Required</sup> <a name="construct" id="@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpoint.isOwnedResource.parameter.construct"></a>
+
+- *Type:* constructs.IConstruct
+
+---
+
+##### `isResource` <a name="isResource" id="@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpoint.isResource"></a>
+
+```typescript
+import { aws_ec2 } from '@open-constructs/aws-cdk'
+
+aws_ec2.InstanceConnectEndpoint.isResource(construct: IConstruct)
+```
+
+Check whether the given construct is a Resource.
+
+###### `construct`<sup>Required</sup> <a name="construct" id="@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpoint.isResource.parameter.construct"></a>
+
+- *Type:* constructs.IConstruct
+
+---
+
+##### `fromInstanceConnectEndpointAttributes` <a name="fromInstanceConnectEndpointAttributes" id="@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpoint.fromInstanceConnectEndpointAttributes"></a>
+
+```typescript
+import { aws_ec2 } from '@open-constructs/aws-cdk'
+
+aws_ec2.InstanceConnectEndpoint.fromInstanceConnectEndpointAttributes(scope: Construct, id: string, attrs: InstanceConnectEndpointAttributes)
+```
+
+Import an existing endpoint to the stack from its attributes.
+
+###### `scope`<sup>Required</sup> <a name="scope" id="@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpoint.fromInstanceConnectEndpointAttributes.parameter.scope"></a>
+
+- *Type:* constructs.Construct
+
+---
+
+###### `id`<sup>Required</sup> <a name="id" id="@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpoint.fromInstanceConnectEndpointAttributes.parameter.id"></a>
+
+- *Type:* string
+
+---
+
+###### `attrs`<sup>Required</sup> <a name="attrs" id="@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpoint.fromInstanceConnectEndpointAttributes.parameter.attrs"></a>
+
+- *Type:* @open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpointAttributes
+
+---
+
+#### Properties <a name="Properties" id="Properties"></a>
+
+| **Name** | **Type** | **Description** |
+| --- | --- | --- |
+| <code><a href="#@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpoint.property.node">node</a></code> | <code>constructs.Node</code> | The tree node. |
+| <code><a href="#@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpoint.property.env">env</a></code> | <code>aws-cdk-lib.ResourceEnvironment</code> | The environment this resource belongs to. |
+| <code><a href="#@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpoint.property.stack">stack</a></code> | <code>aws-cdk-lib.Stack</code> | The stack in which this resource is defined. |
+| <code><a href="#@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpoint.property.connections">connections</a></code> | <code>aws-cdk-lib.aws_ec2.Connections</code> | The connection object associated with the EC2 Instance Connect Endpoint. |
+| <code><a href="#@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpoint.property.instanceConnectEndpointId">instanceConnectEndpointId</a></code> | <code>string</code> | The ID of the EC2 Instance Connect Endpoint. |
+
+---
+
+##### `node`<sup>Required</sup> <a name="node" id="@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpoint.property.node"></a>
+
+```typescript
+public readonly node: Node;
+```
+
+- *Type:* constructs.Node
+
+The tree node.
+
+---
+
+##### `env`<sup>Required</sup> <a name="env" id="@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpoint.property.env"></a>
+
+```typescript
+public readonly env: ResourceEnvironment;
+```
+
+- *Type:* aws-cdk-lib.ResourceEnvironment
+
+The environment this resource belongs to.
+
+For resources that are created and managed by the CDK
+(generally, those created by creating new class instances like Role, Bucket, etc.),
+this is always the same as the environment of the stack they belong to;
+however, for imported resources
+(those obtained from static methods like fromRoleArn, fromBucketName, etc.),
+that might be different than the stack they were imported into.
+
+---
+
+##### `stack`<sup>Required</sup> <a name="stack" id="@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpoint.property.stack"></a>
+
+```typescript
+public readonly stack: Stack;
+```
+
+- *Type:* aws-cdk-lib.Stack
+
+The stack in which this resource is defined.
+
+---
+
+##### `connections`<sup>Required</sup> <a name="connections" id="@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpoint.property.connections"></a>
+
+```typescript
+public readonly connections: Connections;
+```
+
+- *Type:* aws-cdk-lib.aws_ec2.Connections
+
+The connection object associated with the EC2 Instance Connect Endpoint.
+
+---
+
+##### `instanceConnectEndpointId`<sup>Required</sup> <a name="instanceConnectEndpointId" id="@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpoint.property.instanceConnectEndpointId"></a>
+
+```typescript
+public readonly instanceConnectEndpointId: string;
+```
+
+- *Type:* string
+
+The ID of the EC2 Instance Connect Endpoint.
+
+---
+
+
+### Namespace <a name="Namespace" id="@open-constructs/aws-cdk.aws_redshiftserverless.Namespace"></a>
+
+- *Implements:* @open-constructs/aws-cdk.aws_redshiftserverless.INamespace
+
+Represents a Redshift Serverless Namespace construct in AWS CDK.
+
+*Example*
+
+```typescript
+const nameSpace = new Namespace(
   stack,
-  'InstanceConnectEndpoint',
+  'Namespace',
   {
-    clientToken: 'my-client-token',
-    preserveClientIp: true,
-    securityGroups,
-    vpc,
+    namespaceName: 'my-namespace',
   },
 );
 ```
 
 
-#### Initializers <a name="Initializers" id="@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpoint.Initializer"></a>
+#### Initializers <a name="Initializers" id="@open-constructs/aws-cdk.aws_redshiftserverless.Namespace.Initializer"></a>
 
 ```typescript
-import { aws_ec2 } from '@open-constructs/aws-cdk'
+import { aws_redshiftserverless } from '@open-constructs/aws-cdk'
 
-new aws_ec2.InstanceConnectEndpoint(scope: Construct, id: string, props: InstanceConnectEndpointProps)
+new aws_redshiftserverless.Namespace(scope: Construct, id: string, props: NamespaceProps)
 ```
 
 | **Name** | **Type** | **Description** |
 | --- | --- | --- |
-| <code><a href="#@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpoint.Initializer.parameter.scope">scope</a></code> | <code>constructs.Construct</code> | *No description.* |
-| <code><a href="#@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpoint.Initializer.parameter.id">id</a></code> | <code>string</code> | *No description.* |
-| <code><a href="#@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpoint.Initializer.parameter.props">props</a></code> | <code>@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpointProps</code> | *No description.* |
+| <code><a href="#@open-constructs/aws-cdk.aws_redshiftserverless.Namespace.Initializer.parameter.scope">scope</a></code> | <code>constructs.Construct</code> | *No description.* |
+| <code><a href="#@open-constructs/aws-cdk.aws_redshiftserverless.Namespace.Initializer.parameter.id">id</a></code> | <code>string</code> | *No description.* |
+| <code><a href="#@open-constructs/aws-cdk.aws_redshiftserverless.Namespace.Initializer.parameter.props">props</a></code> | <code>@open-constructs/aws-cdk.aws_redshiftserverless.NamespaceProps</code> | *No description.* |
 
 ---
 
-##### `scope`<sup>Required</sup> <a name="scope" id="@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpoint.Initializer.parameter.scope"></a>
+##### `scope`<sup>Required</sup> <a name="scope" id="@open-constructs/aws-cdk.aws_redshiftserverless.Namespace.Initializer.parameter.scope"></a>
 
 - *Type:* constructs.Construct
 
 ---
 
-##### `id`<sup>Required</sup> <a name="id" id="@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpoint.Initializer.parameter.id"></a>
+##### `id`<sup>Required</sup> <a name="id" id="@open-constructs/aws-cdk.aws_redshiftserverless.Namespace.Initializer.parameter.id"></a>
 
 - *Type:* string
 
 ---
 
-##### `props`<sup>Required</sup> <a name="props" id="@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpoint.Initializer.parameter.props"></a>
+##### `props`<sup>Required</sup> <a name="props" id="@open-constructs/aws-cdk.aws_redshiftserverless.Namespace.Initializer.parameter.props"></a>
 
-- *Type:* @open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpointProps
+- *Type:* @open-constructs/aws-cdk.aws_redshiftserverless.NamespaceProps
 
 ---
 
@@ -309,12 +991,13 @@ new aws_ec2.InstanceConnectEndpoint(scope: Construct, id: string, props: Instanc
 
 | **Name** | **Description** |
 | --- | --- |
-| <code><a href="#@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpoint.toString">toString</a></code> | Returns a string representation of this construct. |
-| <code><a href="#@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpoint.applyRemovalPolicy">applyRemovalPolicy</a></code> | Apply the given removal policy to this resource. |
+| <code><a href="#@open-constructs/aws-cdk.aws_redshiftserverless.Namespace.toString">toString</a></code> | Returns a string representation of this construct. |
+| <code><a href="#@open-constructs/aws-cdk.aws_redshiftserverless.Namespace.applyRemovalPolicy">applyRemovalPolicy</a></code> | Apply the given removal policy to this resource. |
+| <code><a href="#@open-constructs/aws-cdk.aws_redshiftserverless.Namespace.addIamRole">addIamRole</a></code> | Adds a role to the namespace. |
 
 ---
 
-##### `toString` <a name="toString" id="@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpoint.toString"></a>
+##### `toString` <a name="toString" id="@open-constructs/aws-cdk.aws_redshiftserverless.Namespace.toString"></a>
 
 ```typescript
 public toString(): string
@@ -322,7 +1005,7 @@ public toString(): string
 
 Returns a string representation of this construct.
 
-##### `applyRemovalPolicy` <a name="applyRemovalPolicy" id="@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpoint.applyRemovalPolicy"></a>
+##### `applyRemovalPolicy` <a name="applyRemovalPolicy" id="@open-constructs/aws-cdk.aws_redshiftserverless.Namespace.applyRemovalPolicy"></a>
 
 ```typescript
 public applyRemovalPolicy(policy: RemovalPolicy): void
@@ -338,29 +1021,45 @@ to be replaced.
 The resource can be deleted (`RemovalPolicy.DESTROY`), or left in your AWS
 account for data recovery and cleanup later (`RemovalPolicy.RETAIN`).
 
-###### `policy`<sup>Required</sup> <a name="policy" id="@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpoint.applyRemovalPolicy.parameter.policy"></a>
+###### `policy`<sup>Required</sup> <a name="policy" id="@open-constructs/aws-cdk.aws_redshiftserverless.Namespace.applyRemovalPolicy.parameter.policy"></a>
 
 - *Type:* aws-cdk-lib.RemovalPolicy
 
 ---
 
+##### `addIamRole` <a name="addIamRole" id="@open-constructs/aws-cdk.aws_redshiftserverless.Namespace.addIamRole"></a>
+
+```typescript
+public addIamRole(role: IRole): void
+```
+
+Adds a role to the namespace.
+
+###### `role`<sup>Required</sup> <a name="role" id="@open-constructs/aws-cdk.aws_redshiftserverless.Namespace.addIamRole.parameter.role"></a>
+
+- *Type:* aws-cdk-lib.aws_iam.IRole
+
+the role to add.
+
+---
+
 #### Static Functions <a name="Static Functions" id="Static Functions"></a>
 
 | **Name** | **Description** |
 | --- | --- |
-| <code><a href="#@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpoint.isConstruct">isConstruct</a></code> | Checks if `x` is a construct. |
-| <code><a href="#@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpoint.isOwnedResource">isOwnedResource</a></code> | Returns true if the construct was created by CDK, and false otherwise. |
-| <code><a href="#@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpoint.isResource">isResource</a></code> | Check whether the given construct is a Resource. |
-| <code><a href="#@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpoint.fromInstanceConnectEndpointAttributes">fromInstanceConnectEndpointAttributes</a></code> | Import an existing endpoint to the stack from its attributes. |
+| <code><a href="#@open-constructs/aws-cdk.aws_redshiftserverless.Namespace.isConstruct">isConstruct</a></code> | Checks if `x` is a construct. |
+| <code><a href="#@open-constructs/aws-cdk.aws_redshiftserverless.Namespace.isOwnedResource">isOwnedResource</a></code> | Returns true if the construct was created by CDK, and false otherwise. |
+| <code><a href="#@open-constructs/aws-cdk.aws_redshiftserverless.Namespace.isResource">isResource</a></code> | Check whether the given construct is a Resource. |
+| <code><a href="#@open-constructs/aws-cdk.aws_redshiftserverless.Namespace.fromNamespaceAttributes">fromNamespaceAttributes</a></code> | Imports an existing Namespace from attributes. |
 
 ---
 
-##### `isConstruct` <a name="isConstruct" id="@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpoint.isConstruct"></a>
+##### `isConstruct` <a name="isConstruct" id="@open-constructs/aws-cdk.aws_redshiftserverless.Namespace.isConstruct"></a>
 
 ```typescript
-import { aws_ec2 } from '@open-constructs/aws-cdk'
+import { aws_redshiftserverless } from '@open-constructs/aws-cdk'
 
-aws_ec2.InstanceConnectEndpoint.isConstruct(x: any)
+aws_redshiftserverless.Namespace.isConstruct(x: any)
 ```
 
 Checks if `x` is a construct.
@@ -379,7 +1078,7 @@ library can be accidentally installed, and `instanceof` will behave
 unpredictably. It is safest to avoid using `instanceof`, and using
 this type-testing method instead.
 
-###### `x`<sup>Required</sup> <a name="x" id="@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpoint.isConstruct.parameter.x"></a>
+###### `x`<sup>Required</sup> <a name="x" id="@open-constructs/aws-cdk.aws_redshiftserverless.Namespace.isConstruct.parameter.x"></a>
 
 - *Type:* any
 
@@ -387,63 +1086,63 @@ Any object.
 
 ---
 
-##### `isOwnedResource` <a name="isOwnedResource" id="@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpoint.isOwnedResource"></a>
+##### `isOwnedResource` <a name="isOwnedResource" id="@open-constructs/aws-cdk.aws_redshiftserverless.Namespace.isOwnedResource"></a>
 
 ```typescript
-import { aws_ec2 } from '@open-constructs/aws-cdk'
+import { aws_redshiftserverless } from '@open-constructs/aws-cdk'
 
-aws_ec2.InstanceConnectEndpoint.isOwnedResource(construct: IConstruct)
+aws_redshiftserverless.Namespace.isOwnedResource(construct: IConstruct)
 ```
 
 Returns true if the construct was created by CDK, and false otherwise.
 
-###### `construct`<sup>Required</sup> <a name="construct" id="@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpoint.isOwnedResource.parameter.construct"></a>
+###### `construct`<sup>Required</sup> <a name="construct" id="@open-constructs/aws-cdk.aws_redshiftserverless.Namespace.isOwnedResource.parameter.construct"></a>
 
 - *Type:* constructs.IConstruct
 
 ---
 
-##### `isResource` <a name="isResource" id="@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpoint.isResource"></a>
+##### `isResource` <a name="isResource" id="@open-constructs/aws-cdk.aws_redshiftserverless.Namespace.isResource"></a>
 
 ```typescript
-import { aws_ec2 } from '@open-constructs/aws-cdk'
+import { aws_redshiftserverless } from '@open-constructs/aws-cdk'
 
-aws_ec2.InstanceConnectEndpoint.isResource(construct: IConstruct)
+aws_redshiftserverless.Namespace.isResource(construct: IConstruct)
 ```
 
 Check whether the given construct is a Resource.
 
-###### `construct`<sup>Required</sup> <a name="construct" id="@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpoint.isResource.parameter.construct"></a>
+###### `construct`<sup>Required</sup> <a name="construct" id="@open-constructs/aws-cdk.aws_redshiftserverless.Namespace.isResource.parameter.construct"></a>
 
 - *Type:* constructs.IConstruct
 
 ---
 
-##### `fromInstanceConnectEndpointAttributes` <a name="fromInstanceConnectEndpointAttributes" id="@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpoint.fromInstanceConnectEndpointAttributes"></a>
+##### `fromNamespaceAttributes` <a name="fromNamespaceAttributes" id="@open-constructs/aws-cdk.aws_redshiftserverless.Namespace.fromNamespaceAttributes"></a>
 
 ```typescript
-import { aws_ec2 } from '@open-constructs/aws-cdk'
+import { aws_redshiftserverless } from '@open-constructs/aws-cdk'
 
-aws_ec2.InstanceConnectEndpoint.fromInstanceConnectEndpointAttributes(scope: Construct, id: string, attrs: InstanceConnectEndpointAttributes)
+aws_redshiftserverless.Namespace.fromNamespaceAttributes(scope: Construct, id: string, attrs: NamespaceAttributes)
 ```
 
-Import an existing endpoint to the stack from its attributes.
+Imports an existing Namespace from attributes.
 
-###### `scope`<sup>Required</sup> <a name="scope" id="@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpoint.fromInstanceConnectEndpointAttributes.parameter.scope"></a>
+###### `scope`<sup>Required</sup> <a name="scope" id="@open-constructs/aws-cdk.aws_redshiftserverless.Namespace.fromNamespaceAttributes.parameter.scope"></a>
 
 - *Type:* constructs.Construct
 
 ---
 
-###### `id`<sup>Required</sup> <a name="id" id="@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpoint.fromInstanceConnectEndpointAttributes.parameter.id"></a>
+###### `id`<sup>Required</sup> <a name="id" id="@open-constructs/aws-cdk.aws_redshiftserverless.Namespace.fromNamespaceAttributes.parameter.id"></a>
 
 - *Type:* string
 
 ---
 
-###### `attrs`<sup>Required</sup> <a name="attrs" id="@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpoint.fromInstanceConnectEndpointAttributes.parameter.attrs"></a>
+###### `attrs`<sup>Required</sup> <a name="attrs" id="@open-constructs/aws-cdk.aws_redshiftserverless.Namespace.fromNamespaceAttributes.parameter.attrs"></a>
 
-- *Type:* @open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpointAttributes
+- *Type:* @open-constructs/aws-cdk.aws_redshiftserverless.NamespaceAttributes
 
 ---
 
@@ -451,15 +1150,16 @@ Import an existing endpoint to the stack from its attributes.
 
 | **Name** | **Type** | **Description** |
 | --- | --- | --- |
-| <code><a href="#@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpoint.property.node">node</a></code> | <code>constructs.Node</code> | The tree node. |
-| <code><a href="#@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpoint.property.env">env</a></code> | <code>aws-cdk-lib.ResourceEnvironment</code> | The environment this resource belongs to. |
-| <code><a href="#@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpoint.property.stack">stack</a></code> | <code>aws-cdk-lib.Stack</code> | The stack in which this resource is defined. |
-| <code><a href="#@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpoint.property.connections">connections</a></code> | <code>aws-cdk-lib.aws_ec2.Connections</code> | The connection object associated with the EC2 Instance Connect Endpoint. |
-| <code><a href="#@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpoint.property.instanceConnectEndpointId">instanceConnectEndpointId</a></code> | <code>string</code> | The ID of the EC2 Instance Connect Endpoint. |
+| <code><a href="#@open-constructs/aws-cdk.aws_redshiftserverless.Namespace.property.node">node</a></code> | <code>constructs.Node</code> | The tree node. |
+| <code><a href="#@open-constructs/aws-cdk.aws_redshiftserverless.Namespace.property.env">env</a></code> | <code>aws-cdk-lib.ResourceEnvironment</code> | The environment this resource belongs to. |
+| <code><a href="#@open-constructs/aws-cdk.aws_redshiftserverless.Namespace.property.stack">stack</a></code> | <code>aws-cdk-lib.Stack</code> | The stack in which this resource is defined. |
+| <code><a href="#@open-constructs/aws-cdk.aws_redshiftserverless.Namespace.property.namespaceArn">namespaceArn</a></code> | <code>string</code> | The namespace Arn. |
+| <code><a href="#@open-constructs/aws-cdk.aws_redshiftserverless.Namespace.property.namespaceId">namespaceId</a></code> | <code>string</code> | The namespace id. |
+| <code><a href="#@open-constructs/aws-cdk.aws_redshiftserverless.Namespace.property.namespaceName">namespaceName</a></code> | <code>string</code> | The namespace name. |
 
 ---
 
-##### `node`<sup>Required</sup> <a name="node" id="@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpoint.property.node"></a>
+##### `node`<sup>Required</sup> <a name="node" id="@open-constructs/aws-cdk.aws_redshiftserverless.Namespace.property.node"></a>
 
 ```typescript
 public readonly node: Node;
@@ -471,7 +1171,7 @@ The tree node.
 
 ---
 
-##### `env`<sup>Required</sup> <a name="env" id="@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpoint.property.env"></a>
+##### `env`<sup>Required</sup> <a name="env" id="@open-constructs/aws-cdk.aws_redshiftserverless.Namespace.property.env"></a>
 
 ```typescript
 public readonly env: ResourceEnvironment;
@@ -490,7 +1190,7 @@ that might be different than the stack they were imported into.
 
 ---
 
-##### `stack`<sup>Required</sup> <a name="stack" id="@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpoint.property.stack"></a>
+##### `stack`<sup>Required</sup> <a name="stack" id="@open-constructs/aws-cdk.aws_redshiftserverless.Namespace.property.stack"></a>
 
 ```typescript
 public readonly stack: Stack;
@@ -502,81 +1202,80 @@ The stack in which this resource is defined.
 
 ---
 
-##### `connections`<sup>Required</sup> <a name="connections" id="@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpoint.property.connections"></a>
+##### `namespaceArn`<sup>Required</sup> <a name="namespaceArn" id="@open-constructs/aws-cdk.aws_redshiftserverless.Namespace.property.namespaceArn"></a>
 
 ```typescript
-public readonly connections: Connections;
+public readonly namespaceArn: string;
 ```
 
-- *Type:* aws-cdk-lib.aws_ec2.Connections
+- *Type:* string
 
-The connection object associated with the EC2 Instance Connect Endpoint.
+The namespace Arn.
 
 ---
 
-##### `instanceConnectEndpointId`<sup>Required</sup> <a name="instanceConnectEndpointId" id="@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpoint.property.instanceConnectEndpointId"></a>
+##### `namespaceId`<sup>Required</sup> <a name="namespaceId" id="@open-constructs/aws-cdk.aws_redshiftserverless.Namespace.property.namespaceId"></a>
 
 ```typescript
-public readonly instanceConnectEndpointId: string;
+public readonly namespaceId: string;
 ```
 
 - *Type:* string
 
-The ID of the EC2 Instance Connect Endpoint.
+The namespace id.
 
 ---
 
+##### `namespaceName`<sup>Required</sup> <a name="namespaceName" id="@open-constructs/aws-cdk.aws_redshiftserverless.Namespace.property.namespaceName"></a>
 
-### Namespace <a name="Namespace" id="@open-constructs/aws-cdk.aws_redshiftserverless.Namespace"></a>
+```typescript
+public readonly namespaceName: string;
+```
 
-- *Implements:* @open-constructs/aws-cdk.aws_redshiftserverless.INamespace
+- *Type:* string
 
-Represents a Redshift Serverless Namespace construct in AWS CDK.
+The namespace name.
 
-*Example*
+---
 
-```typescript
-const nameSpace = new Namespace(
-  stack,
-  'Namespace',
-  {
-    namespaceName: 'my-namespace',
-  },
-);
-```
 
+### OntapFileSystem <a name="OntapFileSystem" id="@open-constructs/aws-cdk.aws_fsx.OntapFileSystem"></a>
+
+The FSx for NetApp ONTAP File System implementation of IFileSystem.
 
-#### Initializers <a name="Initializers" id="@open-constructs/aws-cdk.aws_redshiftserverless.Namespace.Initializer"></a>
+> [https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fsx-filesystem.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fsx-filesystem.html)
+
+#### Initializers <a name="Initializers" id="@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.Initializer"></a>
 
 ```typescript
-import { aws_redshiftserverless } from '@open-constructs/aws-cdk'
+import { aws_fsx } from '@open-constructs/aws-cdk'
 
-new aws_redshiftserverless.Namespace(scope: Construct, id: string, props: NamespaceProps)
+new aws_fsx.OntapFileSystem(scope: Construct, id: string, props: OntapFileSystemProps)
 ```
 
 | **Name** | **Type** | **Description** |
 | --- | --- | --- |
-| <code><a href="#@open-constructs/aws-cdk.aws_redshiftserverless.Namespace.Initializer.parameter.scope">scope</a></code> | <code>constructs.Construct</code> | *No description.* |
-| <code><a href="#@open-constructs/aws-cdk.aws_redshiftserverless.Namespace.Initializer.parameter.id">id</a></code> | <code>string</code> | *No description.* |
-| <code><a href="#@open-constructs/aws-cdk.aws_redshiftserverless.Namespace.Initializer.parameter.props">props</a></code> | <code>@open-constructs/aws-cdk.aws_redshiftserverless.NamespaceProps</code> | *No description.* |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.Initializer.parameter.scope">scope</a></code> | <code>constructs.Construct</code> | *No description.* |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.Initializer.parameter.id">id</a></code> | <code>string</code> | *No description.* |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.Initializer.parameter.props">props</a></code> | <code>@open-constructs/aws-cdk.aws_fsx.OntapFileSystemProps</code> | *No description.* |
 
 ---
 
-##### `scope`<sup>Required</sup> <a name="scope" id="@open-constructs/aws-cdk.aws_redshiftserverless.Namespace.Initializer.parameter.scope"></a>
+##### `scope`<sup>Required</sup> <a name="scope" id="@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.Initializer.parameter.scope"></a>
 
 - *Type:* constructs.Construct
 
 ---
 
-##### `id`<sup>Required</sup> <a name="id" id="@open-constructs/aws-cdk.aws_redshiftserverless.Namespace.Initializer.parameter.id"></a>
+##### `id`<sup>Required</sup> <a name="id" id="@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.Initializer.parameter.id"></a>
 
 - *Type:* string
 
 ---
 
-##### `props`<sup>Required</sup> <a name="props" id="@open-constructs/aws-cdk.aws_redshiftserverless.Namespace.Initializer.parameter.props"></a>
+##### `props`<sup>Required</sup> <a name="props" id="@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.Initializer.parameter.props"></a>
 
-- *Type:* @open-constructs/aws-cdk.aws_redshiftserverless.NamespaceProps
+- *Type:* @open-constructs/aws-cdk.aws_fsx.OntapFileSystemProps
 
 ---
 
@@ -584,13 +1283,12 @@ new aws_redshiftserverless.Namespace(scope: Construct, id: string, props: Namesp
 
 | **Name** | **Description** |
 | --- | --- |
-| <code><a href="#@open-constructs/aws-cdk.aws_redshiftserverless.Namespace.toString">toString</a></code> | Returns a string representation of this construct. |
-| <code><a href="#@open-constructs/aws-cdk.aws_redshiftserverless.Namespace.applyRemovalPolicy">applyRemovalPolicy</a></code> | Apply the given removal policy to this resource. |
-| <code><a href="#@open-constructs/aws-cdk.aws_redshiftserverless.Namespace.addIamRole">addIamRole</a></code> | Adds a role to the namespace. |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.toString">toString</a></code> | Returns a string representation of this construct. |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.applyRemovalPolicy">applyRemovalPolicy</a></code> | Apply the given removal policy to this resource. |
 
 ---
 
-##### `toString` <a name="toString" id="@open-constructs/aws-cdk.aws_redshiftserverless.Namespace.toString"></a>
+##### `toString` <a name="toString" id="@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.toString"></a>
 
 ```typescript
 public toString(): string
@@ -598,7 +1296,7 @@ public toString(): string
 
 Returns a string representation of this construct.
 
-##### `applyRemovalPolicy` <a name="applyRemovalPolicy" id="@open-constructs/aws-cdk.aws_redshiftserverless.Namespace.applyRemovalPolicy"></a>
+##### `applyRemovalPolicy` <a name="applyRemovalPolicy" id="@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.applyRemovalPolicy"></a>
 
 ```typescript
 public applyRemovalPolicy(policy: RemovalPolicy): void
@@ -614,45 +1312,29 @@ to be replaced.
 The resource can be deleted (`RemovalPolicy.DESTROY`), or left in your AWS
 account for data recovery and cleanup later (`RemovalPolicy.RETAIN`).
 
-###### `policy`<sup>Required</sup> <a name="policy" id="@open-constructs/aws-cdk.aws_redshiftserverless.Namespace.applyRemovalPolicy.parameter.policy"></a>
+###### `policy`<sup>Required</sup> <a name="policy" id="@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.applyRemovalPolicy.parameter.policy"></a>
 
 - *Type:* aws-cdk-lib.RemovalPolicy
 
 ---
 
-##### `addIamRole` <a name="addIamRole" id="@open-constructs/aws-cdk.aws_redshiftserverless.Namespace.addIamRole"></a>
-
-```typescript
-public addIamRole(role: IRole): void
-```
-
-Adds a role to the namespace.
-
-###### `role`<sup>Required</sup> <a name="role" id="@open-constructs/aws-cdk.aws_redshiftserverless.Namespace.addIamRole.parameter.role"></a>
-
-- *Type:* aws-cdk-lib.aws_iam.IRole
-
-the role to add.
-
----
-
 #### Static Functions <a name="Static Functions" id="Static Functions"></a>
 
 | **Name** | **Description** |
 | --- | --- |
-| <code><a href="#@open-constructs/aws-cdk.aws_redshiftserverless.Namespace.isConstruct">isConstruct</a></code> | Checks if `x` is a construct. |
-| <code><a href="#@open-constructs/aws-cdk.aws_redshiftserverless.Namespace.isOwnedResource">isOwnedResource</a></code> | Returns true if the construct was created by CDK, and false otherwise. |
-| <code><a href="#@open-constructs/aws-cdk.aws_redshiftserverless.Namespace.isResource">isResource</a></code> | Check whether the given construct is a Resource. |
-| <code><a href="#@open-constructs/aws-cdk.aws_redshiftserverless.Namespace.fromNamespaceAttributes">fromNamespaceAttributes</a></code> | Imports an existing Namespace from attributes. |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.isConstruct">isConstruct</a></code> | Checks if `x` is a construct. |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.isOwnedResource">isOwnedResource</a></code> | Returns true if the construct was created by CDK, and false otherwise. |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.isResource">isResource</a></code> | Check whether the given construct is a Resource. |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.fromOntapFileSystemAttributes">fromOntapFileSystemAttributes</a></code> | Import an existing FSx for NetApp ONTAP file system from the given properties. |
 
 ---
 
-##### `isConstruct` <a name="isConstruct" id="@open-constructs/aws-cdk.aws_redshiftserverless.Namespace.isConstruct"></a>
+##### `isConstruct` <a name="isConstruct" id="@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.isConstruct"></a>
 
 ```typescript
-import { aws_redshiftserverless } from '@open-constructs/aws-cdk'
+import { aws_fsx } from '@open-constructs/aws-cdk'
 
-aws_redshiftserverless.Namespace.isConstruct(x: any)
+aws_fsx.OntapFileSystem.isConstruct(x: any)
 ```
 
 Checks if `x` is a construct.
@@ -671,7 +1353,7 @@ library can be accidentally installed, and `instanceof` will behave
 unpredictably. It is safest to avoid using `instanceof`, and using
 this type-testing method instead.
 
-###### `x`<sup>Required</sup> <a name="x" id="@open-constructs/aws-cdk.aws_redshiftserverless.Namespace.isConstruct.parameter.x"></a>
+###### `x`<sup>Required</sup> <a name="x" id="@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.isConstruct.parameter.x"></a>
 
 - *Type:* any
 
@@ -679,63 +1361,63 @@ Any object.
 
 ---
 
-##### `isOwnedResource` <a name="isOwnedResource" id="@open-constructs/aws-cdk.aws_redshiftserverless.Namespace.isOwnedResource"></a>
+##### `isOwnedResource` <a name="isOwnedResource" id="@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.isOwnedResource"></a>
 
 ```typescript
-import { aws_redshiftserverless } from '@open-constructs/aws-cdk'
+import { aws_fsx } from '@open-constructs/aws-cdk'
 
-aws_redshiftserverless.Namespace.isOwnedResource(construct: IConstruct)
+aws_fsx.OntapFileSystem.isOwnedResource(construct: IConstruct)
 ```
 
 Returns true if the construct was created by CDK, and false otherwise.
 
-###### `construct`<sup>Required</sup> <a name="construct" id="@open-constructs/aws-cdk.aws_redshiftserverless.Namespace.isOwnedResource.parameter.construct"></a>
+###### `construct`<sup>Required</sup> <a name="construct" id="@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.isOwnedResource.parameter.construct"></a>
 
 - *Type:* constructs.IConstruct
 
 ---
 
-##### `isResource` <a name="isResource" id="@open-constructs/aws-cdk.aws_redshiftserverless.Namespace.isResource"></a>
+##### `isResource` <a name="isResource" id="@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.isResource"></a>
 
 ```typescript
-import { aws_redshiftserverless } from '@open-constructs/aws-cdk'
+import { aws_fsx } from '@open-constructs/aws-cdk'
 
-aws_redshiftserverless.Namespace.isResource(construct: IConstruct)
+aws_fsx.OntapFileSystem.isResource(construct: IConstruct)
 ```
 
 Check whether the given construct is a Resource.
 
-###### `construct`<sup>Required</sup> <a name="construct" id="@open-constructs/aws-cdk.aws_redshiftserverless.Namespace.isResource.parameter.construct"></a>
+###### `construct`<sup>Required</sup> <a name="construct" id="@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.isResource.parameter.construct"></a>
 
 - *Type:* constructs.IConstruct
 
 ---
 
-##### `fromNamespaceAttributes` <a name="fromNamespaceAttributes" id="@open-constructs/aws-cdk.aws_redshiftserverless.Namespace.fromNamespaceAttributes"></a>
+##### `fromOntapFileSystemAttributes` <a name="fromOntapFileSystemAttributes" id="@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.fromOntapFileSystemAttributes"></a>
 
 ```typescript
-import { aws_redshiftserverless } from '@open-constructs/aws-cdk'
+import { aws_fsx } from '@open-constructs/aws-cdk'
 
-aws_redshiftserverless.Namespace.fromNamespaceAttributes(scope: Construct, id: string, attrs: NamespaceAttributes)
+aws_fsx.OntapFileSystem.fromOntapFileSystemAttributes(scope: Construct, id: string, attrs: FileSystemAttributes)
 ```
 
-Imports an existing Namespace from attributes.
+Import an existing FSx for NetApp ONTAP file system from the given properties.
 
-###### `scope`<sup>Required</sup> <a name="scope" id="@open-constructs/aws-cdk.aws_redshiftserverless.Namespace.fromNamespaceAttributes.parameter.scope"></a>
+###### `scope`<sup>Required</sup> <a name="scope" id="@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.fromOntapFileSystemAttributes.parameter.scope"></a>
 
 - *Type:* constructs.Construct
 
 ---
 
-###### `id`<sup>Required</sup> <a name="id" id="@open-constructs/aws-cdk.aws_redshiftserverless.Namespace.fromNamespaceAttributes.parameter.id"></a>
+###### `id`<sup>Required</sup> <a name="id" id="@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.fromOntapFileSystemAttributes.parameter.id"></a>
 
 - *Type:* string
 
 ---
 
-###### `attrs`<sup>Required</sup> <a name="attrs" id="@open-constructs/aws-cdk.aws_redshiftserverless.Namespace.fromNamespaceAttributes.parameter.attrs"></a>
+###### `attrs`<sup>Required</sup> <a name="attrs" id="@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.fromOntapFileSystemAttributes.parameter.attrs"></a>
 
-- *Type:* @open-constructs/aws-cdk.aws_redshiftserverless.NamespaceAttributes
+- *Type:* aws-cdk-lib.aws_fsx.FileSystemAttributes
 
 ---
 
@@ -743,16 +1425,17 @@ Imports an existing Namespace from attributes.
 
 | **Name** | **Type** | **Description** |
 | --- | --- | --- |
-| <code><a href="#@open-constructs/aws-cdk.aws_redshiftserverless.Namespace.property.node">node</a></code> | <code>constructs.Node</code> | The tree node. |
-| <code><a href="#@open-constructs/aws-cdk.aws_redshiftserverless.Namespace.property.env">env</a></code> | <code>aws-cdk-lib.ResourceEnvironment</code> | The environment this resource belongs to. |
-| <code><a href="#@open-constructs/aws-cdk.aws_redshiftserverless.Namespace.property.stack">stack</a></code> | <code>aws-cdk-lib.Stack</code> | The stack in which this resource is defined. |
-| <code><a href="#@open-constructs/aws-cdk.aws_redshiftserverless.Namespace.property.namespaceArn">namespaceArn</a></code> | <code>string</code> | The namespace Arn. |
-| <code><a href="#@open-constructs/aws-cdk.aws_redshiftserverless.Namespace.property.namespaceId">namespaceId</a></code> | <code>string</code> | The namespace id. |
-| <code><a href="#@open-constructs/aws-cdk.aws_redshiftserverless.Namespace.property.namespaceName">namespaceName</a></code> | <code>string</code> | The namespace name. |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.property.node">node</a></code> | <code>constructs.Node</code> | The tree node. |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.property.env">env</a></code> | <code>aws-cdk-lib.ResourceEnvironment</code> | The environment this resource belongs to. |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.property.stack">stack</a></code> | <code>aws-cdk-lib.Stack</code> | The stack in which this resource is defined. |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.property.connections">connections</a></code> | <code>aws-cdk-lib.aws_ec2.Connections</code> | The security groups/rules used to allow network connections to the file system. |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.property.dnsName">dnsName</a></code> | <code>string</code> | The management endpoint DNS name assigned to this file system. |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.property.fileSystemId">fileSystemId</a></code> | <code>string</code> | The ID that AWS assigns to the file system. |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.property.interClusterDnsName">interClusterDnsName</a></code> | <code>string</code> | The inter cluster endpoint DNS name assigned to this file system. |
 
 ---
 
-##### `node`<sup>Required</sup> <a name="node" id="@open-constructs/aws-cdk.aws_redshiftserverless.Namespace.property.node"></a>
+##### `node`<sup>Required</sup> <a name="node" id="@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.property.node"></a>
 
 ```typescript
 public readonly node: Node;
@@ -764,7 +1447,7 @@ The tree node.
 
 ---
 
-##### `env`<sup>Required</sup> <a name="env" id="@open-constructs/aws-cdk.aws_redshiftserverless.Namespace.property.env"></a>
+##### `env`<sup>Required</sup> <a name="env" id="@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.property.env"></a>
 
 ```typescript
 public readonly env: ResourceEnvironment;
@@ -783,7 +1466,7 @@ that might be different than the stack they were imported into.
 
 ---
 
-##### `stack`<sup>Required</sup> <a name="stack" id="@open-constructs/aws-cdk.aws_redshiftserverless.Namespace.property.stack"></a>
+##### `stack`<sup>Required</sup> <a name="stack" id="@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.property.stack"></a>
 
 ```typescript
 public readonly stack: Stack;
@@ -795,80 +1478,92 @@ The stack in which this resource is defined.
 
 ---
 
-##### `namespaceArn`<sup>Required</sup> <a name="namespaceArn" id="@open-constructs/aws-cdk.aws_redshiftserverless.Namespace.property.namespaceArn"></a>
+##### `connections`<sup>Required</sup> <a name="connections" id="@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.property.connections"></a>
+
+```typescript
+public readonly connections: Connections;
+```
+
+- *Type:* aws-cdk-lib.aws_ec2.Connections
+
+The security groups/rules used to allow network connections to the file system.
+
+---
+
+##### `dnsName`<sup>Required</sup> <a name="dnsName" id="@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.property.dnsName"></a>
 
 ```typescript
-public readonly namespaceArn: string;
+public readonly dnsName: string;
 ```
 
 - *Type:* string
 
-The namespace Arn.
+The management endpoint DNS name assigned to this file system.
 
 ---
 
-##### `namespaceId`<sup>Required</sup> <a name="namespaceId" id="@open-constructs/aws-cdk.aws_redshiftserverless.Namespace.property.namespaceId"></a>
+##### `fileSystemId`<sup>Required</sup> <a name="fileSystemId" id="@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.property.fileSystemId"></a>
 
 ```typescript
-public readonly namespaceId: string;
+public readonly fileSystemId: string;
 ```
 
 - *Type:* string
 
-The namespace id.
+The ID that AWS assigns to the file system.
 
 ---
 
-##### `namespaceName`<sup>Required</sup> <a name="namespaceName" id="@open-constructs/aws-cdk.aws_redshiftserverless.Namespace.property.namespaceName"></a>
+##### `interClusterDnsName`<sup>Required</sup> <a name="interClusterDnsName" id="@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.property.interClusterDnsName"></a>
 
 ```typescript
-public readonly namespaceName: string;
+public readonly interClusterDnsName: string;
 ```
 
 - *Type:* string
 
-The namespace name.
+The inter cluster endpoint DNS name assigned to this file system.
 
 ---
 
 
-### OntapFileSystem <a name="OntapFileSystem" id="@open-constructs/aws-cdk.aws_fsx.OntapFileSystem"></a>
+### Repository <a name="Repository" id="@open-constructs/aws-cdk.aws_codeartifact.Repository"></a>
 
-The FSx for NetApp ONTAP File System implementation of IFileSystem.
+- *Implements:* @open-constructs/aws-cdk.aws_codeartifact.IRepository
 
-> [https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fsx-filesystem.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fsx-filesystem.html)
+Deploys a CodeArtifact repository.
 
-#### Initializers <a name="Initializers" id="@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.Initializer"></a>
+#### Initializers <a name="Initializers" id="@open-constructs/aws-cdk.aws_codeartifact.Repository.Initializer"></a>
 
 ```typescript
-import { aws_fsx } from '@open-constructs/aws-cdk'
+import { aws_codeartifact } from '@open-constructs/aws-cdk'
 
-new aws_fsx.OntapFileSystem(scope: Construct, id: string, props: OntapFileSystemProps)
+new aws_codeartifact.Repository(scope: Construct, id: string, props: RepositoryProps)
 ```
 
 | **Name** | **Type** | **Description** |
 | --- | --- | --- |
-| <code><a href="#@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.Initializer.parameter.scope">scope</a></code> | <code>constructs.Construct</code> | *No description.* |
-| <code><a href="#@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.Initializer.parameter.id">id</a></code> | <code>string</code> | *No description.* |
-| <code><a href="#@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.Initializer.parameter.props">props</a></code> | <code>@open-constructs/aws-cdk.aws_fsx.OntapFileSystemProps</code> | *No description.* |
+| <code><a href="#@open-constructs/aws-cdk.aws_codeartifact.Repository.Initializer.parameter.scope">scope</a></code> | <code>constructs.Construct</code> | *No description.* |
+| <code><a href="#@open-constructs/aws-cdk.aws_codeartifact.Repository.Initializer.parameter.id">id</a></code> | <code>string</code> | *No description.* |
+| <code><a href="#@open-constructs/aws-cdk.aws_codeartifact.Repository.Initializer.parameter.props">props</a></code> | <code>@open-constructs/aws-cdk.aws_codeartifact.RepositoryProps</code> | *No description.* |
 
 ---
 
-##### `scope`<sup>Required</sup> <a name="scope" id="@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.Initializer.parameter.scope"></a>
+##### `scope`<sup>Required</sup> <a name="scope" id="@open-constructs/aws-cdk.aws_codeartifact.Repository.Initializer.parameter.scope"></a>
 
 - *Type:* constructs.Construct
 
 ---
 
-##### `id`<sup>Required</sup> <a name="id" id="@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.Initializer.parameter.id"></a>
+##### `id`<sup>Required</sup> <a name="id" id="@open-constructs/aws-cdk.aws_codeartifact.Repository.Initializer.parameter.id"></a>
 
 - *Type:* string
 
 ---
 
-##### `props`<sup>Required</sup> <a name="props" id="@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.Initializer.parameter.props"></a>
+##### `props`<sup>Required</sup> <a name="props" id="@open-constructs/aws-cdk.aws_codeartifact.Repository.Initializer.parameter.props"></a>
 
-- *Type:* @open-constructs/aws-cdk.aws_fsx.OntapFileSystemProps
+- *Type:* @open-constructs/aws-cdk.aws_codeartifact.RepositoryProps
 
 ---
 
@@ -876,12 +1571,16 @@ new aws_fsx.OntapFileSystem(scope: Construct, id: string, props: OntapFileSystem
 
 | **Name** | **Description** |
 | --- | --- |
-| <code><a href="#@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.toString">toString</a></code> | Returns a string representation of this construct. |
-| <code><a href="#@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.applyRemovalPolicy">applyRemovalPolicy</a></code> | Apply the given removal policy to this resource. |
+| <code><a href="#@open-constructs/aws-cdk.aws_codeartifact.Repository.toString">toString</a></code> | Returns a string representation of this construct. |
+| <code><a href="#@open-constructs/aws-cdk.aws_codeartifact.Repository.applyRemovalPolicy">applyRemovalPolicy</a></code> | Apply the given removal policy to this resource. |
+| <code><a href="#@open-constructs/aws-cdk.aws_codeartifact.Repository.addToResourcePolicy">addToResourcePolicy</a></code> | Adds a statement to the CodeArtifact repository resource policy. |
+| <code><a href="#@open-constructs/aws-cdk.aws_codeartifact.Repository.grant">grant</a></code> | Grants permissions to the specified grantee on this CodeArtifact repository. |
+| <code><a href="#@open-constructs/aws-cdk.aws_codeartifact.Repository.grantRead">grantRead</a></code> | Grants read permissions to the specified grantee on this CodeArtifact repository. |
+| <code><a href="#@open-constructs/aws-cdk.aws_codeartifact.Repository.grantReadAndPublish">grantReadAndPublish</a></code> | Grants read and publish permissions to the specified grantee on this CodeArtifact repository. |
 
 ---
 
-##### `toString` <a name="toString" id="@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.toString"></a>
+##### `toString` <a name="toString" id="@open-constructs/aws-cdk.aws_codeartifact.Repository.toString"></a>
 
 ```typescript
 public toString(): string
@@ -889,7 +1588,7 @@ public toString(): string
 
 Returns a string representation of this construct.
 
-##### `applyRemovalPolicy` <a name="applyRemovalPolicy" id="@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.applyRemovalPolicy"></a>
+##### `applyRemovalPolicy` <a name="applyRemovalPolicy" id="@open-constructs/aws-cdk.aws_codeartifact.Repository.applyRemovalPolicy"></a>
 
 ```typescript
 public applyRemovalPolicy(policy: RemovalPolicy): void
@@ -905,29 +1604,102 @@ to be replaced.
 The resource can be deleted (`RemovalPolicy.DESTROY`), or left in your AWS
 account for data recovery and cleanup later (`RemovalPolicy.RETAIN`).
 
-###### `policy`<sup>Required</sup> <a name="policy" id="@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.applyRemovalPolicy.parameter.policy"></a>
+###### `policy`<sup>Required</sup> <a name="policy" id="@open-constructs/aws-cdk.aws_codeartifact.Repository.applyRemovalPolicy.parameter.policy"></a>
 
 - *Type:* aws-cdk-lib.RemovalPolicy
 
 ---
 
+##### `addToResourcePolicy` <a name="addToResourcePolicy" id="@open-constructs/aws-cdk.aws_codeartifact.Repository.addToResourcePolicy"></a>
+
+```typescript
+public addToResourcePolicy(statement: PolicyStatement): AddToResourcePolicyResult
+```
+
+Adds a statement to the CodeArtifact repository resource policy.
+
+###### `statement`<sup>Required</sup> <a name="statement" id="@open-constructs/aws-cdk.aws_codeartifact.Repository.addToResourcePolicy.parameter.statement"></a>
+
+- *Type:* aws-cdk-lib.aws_iam.PolicyStatement
+
+The policy statement to add.
+
+---
+
+##### `grant` <a name="grant" id="@open-constructs/aws-cdk.aws_codeartifact.Repository.grant"></a>
+
+```typescript
+public grant(grantee: IGrantable, actions: ...string[]): Grant
+```
+
+Grants permissions to the specified grantee on this CodeArtifact repository.
+
+###### `grantee`<sup>Required</sup> <a name="grantee" id="@open-constructs/aws-cdk.aws_codeartifact.Repository.grant.parameter.grantee"></a>
+
+- *Type:* aws-cdk-lib.aws_iam.IGrantable
+
+The principal to grant permissions to.
+
+---
+
+###### `actions`<sup>Required</sup> <a name="actions" id="@open-constructs/aws-cdk.aws_codeartifact.Repository.grant.parameter.actions"></a>
+
+- *Type:* ...string[]
+
+The actions to grant.
+
+---
+
+##### `grantRead` <a name="grantRead" id="@open-constructs/aws-cdk.aws_codeartifact.Repository.grantRead"></a>
+
+```typescript
+public grantRead(grantee: IGrantable): Grant
+```
+
+Grants read permissions to the specified grantee on this CodeArtifact repository.
+
+###### `grantee`<sup>Required</sup> <a name="grantee" id="@open-constructs/aws-cdk.aws_codeartifact.Repository.grantRead.parameter.grantee"></a>
+
+- *Type:* aws-cdk-lib.aws_iam.IGrantable
+
+The principal to grant read permissions to.
+
+---
+
+##### `grantReadAndPublish` <a name="grantReadAndPublish" id="@open-constructs/aws-cdk.aws_codeartifact.Repository.grantReadAndPublish"></a>
+
+```typescript
+public grantReadAndPublish(grantee: IGrantable): Grant
+```
+
+Grants read and publish permissions to the specified grantee on this CodeArtifact repository.
+
+###### `grantee`<sup>Required</sup> <a name="grantee" id="@open-constructs/aws-cdk.aws_codeartifact.Repository.grantReadAndPublish.parameter.grantee"></a>
+
+- *Type:* aws-cdk-lib.aws_iam.IGrantable
+
+The principal to grant read and publish permissions to.
+
+---
+
 #### Static Functions <a name="Static Functions" id="Static Functions"></a>
 
 | **Name** | **Description** |
 | --- | --- |
-| <code><a href="#@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.isConstruct">isConstruct</a></code> | Checks if `x` is a construct. |
-| <code><a href="#@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.isOwnedResource">isOwnedResource</a></code> | Returns true if the construct was created by CDK, and false otherwise. |
-| <code><a href="#@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.isResource">isResource</a></code> | Check whether the given construct is a Resource. |
-| <code><a href="#@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.fromOntapFileSystemAttributes">fromOntapFileSystemAttributes</a></code> | Import an existing FSx for NetApp ONTAP file system from the given properties. |
+| <code><a href="#@open-constructs/aws-cdk.aws_codeartifact.Repository.isConstruct">isConstruct</a></code> | Checks if `x` is a construct. |
+| <code><a href="#@open-constructs/aws-cdk.aws_codeartifact.Repository.isOwnedResource">isOwnedResource</a></code> | Returns true if the construct was created by CDK, and false otherwise. |
+| <code><a href="#@open-constructs/aws-cdk.aws_codeartifact.Repository.isResource">isResource</a></code> | Check whether the given construct is a Resource. |
+| <code><a href="#@open-constructs/aws-cdk.aws_codeartifact.Repository.fromRepositoryArn">fromRepositoryArn</a></code> | Creates an IRepository object from an existing repository ARN. |
+| <code><a href="#@open-constructs/aws-cdk.aws_codeartifact.Repository.fromRepositoryAttributes">fromRepositoryAttributes</a></code> | Creates an IRepository object from existing repository attributes. |
 
 ---
 
-##### `isConstruct` <a name="isConstruct" id="@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.isConstruct"></a>
+##### `isConstruct` <a name="isConstruct" id="@open-constructs/aws-cdk.aws_codeartifact.Repository.isConstruct"></a>
 
 ```typescript
-import { aws_fsx } from '@open-constructs/aws-cdk'
+import { aws_codeartifact } from '@open-constructs/aws-cdk'
 
-aws_fsx.OntapFileSystem.isConstruct(x: any)
+aws_codeartifact.Repository.isConstruct(x: any)
 ```
 
 Checks if `x` is a construct.
@@ -946,7 +1718,7 @@ library can be accidentally installed, and `instanceof` will behave
 unpredictably. It is safest to avoid using `instanceof`, and using
 this type-testing method instead.
 
-###### `x`<sup>Required</sup> <a name="x" id="@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.isConstruct.parameter.x"></a>
+###### `x`<sup>Required</sup> <a name="x" id="@open-constructs/aws-cdk.aws_codeartifact.Repository.isConstruct.parameter.x"></a>
 
 - *Type:* any
 
@@ -954,63 +1726,103 @@ Any object.
 
 ---
 
-##### `isOwnedResource` <a name="isOwnedResource" id="@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.isOwnedResource"></a>
+##### `isOwnedResource` <a name="isOwnedResource" id="@open-constructs/aws-cdk.aws_codeartifact.Repository.isOwnedResource"></a>
 
 ```typescript
-import { aws_fsx } from '@open-constructs/aws-cdk'
+import { aws_codeartifact } from '@open-constructs/aws-cdk'
 
-aws_fsx.OntapFileSystem.isOwnedResource(construct: IConstruct)
+aws_codeartifact.Repository.isOwnedResource(construct: IConstruct)
 ```
 
 Returns true if the construct was created by CDK, and false otherwise.
 
-###### `construct`<sup>Required</sup> <a name="construct" id="@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.isOwnedResource.parameter.construct"></a>
+###### `construct`<sup>Required</sup> <a name="construct" id="@open-constructs/aws-cdk.aws_codeartifact.Repository.isOwnedResource.parameter.construct"></a>
 
 - *Type:* constructs.IConstruct
 
 ---
 
-##### `isResource` <a name="isResource" id="@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.isResource"></a>
+##### `isResource` <a name="isResource" id="@open-constructs/aws-cdk.aws_codeartifact.Repository.isResource"></a>
 
 ```typescript
-import { aws_fsx } from '@open-constructs/aws-cdk'
+import { aws_codeartifact } from '@open-constructs/aws-cdk'
 
-aws_fsx.OntapFileSystem.isResource(construct: IConstruct)
+aws_codeartifact.Repository.isResource(construct: IConstruct)
 ```
 
 Check whether the given construct is a Resource.
 
-###### `construct`<sup>Required</sup> <a name="construct" id="@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.isResource.parameter.construct"></a>
+###### `construct`<sup>Required</sup> <a name="construct" id="@open-constructs/aws-cdk.aws_codeartifact.Repository.isResource.parameter.construct"></a>
 
 - *Type:* constructs.IConstruct
 
 ---
 
-##### `fromOntapFileSystemAttributes` <a name="fromOntapFileSystemAttributes" id="@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.fromOntapFileSystemAttributes"></a>
+##### `fromRepositoryArn` <a name="fromRepositoryArn" id="@open-constructs/aws-cdk.aws_codeartifact.Repository.fromRepositoryArn"></a>
 
 ```typescript
-import { aws_fsx } from '@open-constructs/aws-cdk'
+import { aws_codeartifact } from '@open-constructs/aws-cdk'
 
-aws_fsx.OntapFileSystem.fromOntapFileSystemAttributes(scope: Construct, id: string, attrs: FileSystemAttributes)
+aws_codeartifact.Repository.fromRepositoryArn(scope: Construct, id: string, repositoryArn: string)
 ```
 
-Import an existing FSx for NetApp ONTAP file system from the given properties.
+Creates an IRepository object from an existing repository ARN.
 
-###### `scope`<sup>Required</sup> <a name="scope" id="@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.fromOntapFileSystemAttributes.parameter.scope"></a>
+###### `scope`<sup>Required</sup> <a name="scope" id="@open-constructs/aws-cdk.aws_codeartifact.Repository.fromRepositoryArn.parameter.scope"></a>
 
 - *Type:* constructs.Construct
 
+The parent construct in which to create this repository reference.
+
 ---
 
-###### `id`<sup>Required</sup> <a name="id" id="@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.fromOntapFileSystemAttributes.parameter.id"></a>
+###### `id`<sup>Required</sup> <a name="id" id="@open-constructs/aws-cdk.aws_codeartifact.Repository.fromRepositoryArn.parameter.id"></a>
 
 - *Type:* string
 
+The identifier of the construct.
+
 ---
 
-###### `attrs`<sup>Required</sup> <a name="attrs" id="@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.fromOntapFileSystemAttributes.parameter.attrs"></a>
+###### `repositoryArn`<sup>Required</sup> <a name="repositoryArn" id="@open-constructs/aws-cdk.aws_codeartifact.Repository.fromRepositoryArn.parameter.repositoryArn"></a>
 
-- *Type:* aws-cdk-lib.aws_fsx.FileSystemAttributes
+- *Type:* string
+
+The ARN of the repository to import.
+
+---
+
+##### `fromRepositoryAttributes` <a name="fromRepositoryAttributes" id="@open-constructs/aws-cdk.aws_codeartifact.Repository.fromRepositoryAttributes"></a>
+
+```typescript
+import { aws_codeartifact } from '@open-constructs/aws-cdk'
+
+aws_codeartifact.Repository.fromRepositoryAttributes(scope: Construct, id: string, attrs: RepositoryAttributes)
+```
+
+Creates an IRepository object from existing repository attributes.
+
+###### `scope`<sup>Required</sup> <a name="scope" id="@open-constructs/aws-cdk.aws_codeartifact.Repository.fromRepositoryAttributes.parameter.scope"></a>
+
+- *Type:* constructs.Construct
+
+The parent construct in which to create this repository reference.
+
+---
+
+###### `id`<sup>Required</sup> <a name="id" id="@open-constructs/aws-cdk.aws_codeartifact.Repository.fromRepositoryAttributes.parameter.id"></a>
+
+- *Type:* string
+
+The identifier of the construct.
+
+---
+
+###### `attrs`<sup>Required</sup> <a name="attrs" id="@open-constructs/aws-cdk.aws_codeartifact.Repository.fromRepositoryAttributes.parameter.attrs"></a>
+
+- *Type:* @open-constructs/aws-cdk.aws_codeartifact.RepositoryAttributes
+
+The attributes of the repository to import.
 
 ---
 
@@ -1018,17 +1830,18 @@ Import an existing FSx for NetApp ONTAP file system from the given properties.
 
 | **Name** | **Type** | **Description** |
 | --- | --- | --- |
-| <code><a href="#@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.property.node">node</a></code> | <code>constructs.Node</code> | The tree node. |
-| <code><a href="#@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.property.env">env</a></code> | <code>aws-cdk-lib.ResourceEnvironment</code> | The environment this resource belongs to. |
-| <code><a href="#@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.property.stack">stack</a></code> | <code>aws-cdk-lib.Stack</code> | The stack in which this resource is defined. |
-| <code><a href="#@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.property.connections">connections</a></code> | <code>aws-cdk-lib.aws_ec2.Connections</code> | The security groups/rules used to allow network connections to the file system. |
-| <code><a href="#@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.property.dnsName">dnsName</a></code> | <code>string</code> | The management endpoint DNS name assigned to this file system. |
-| <code><a href="#@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.property.fileSystemId">fileSystemId</a></code> | <code>string</code> | The ID that AWS assigns to the file system. |
-| <code><a href="#@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.property.interClusterDnsName">interClusterDnsName</a></code> | <code>string</code> | The inter cluster endpoint DNS name assigned to this file system. |
+| <code><a href="#@open-constructs/aws-cdk.aws_codeartifact.Repository.property.node">node</a></code> | <code>constructs.Node</code> | The tree node. |
+| <code><a href="#@open-constructs/aws-cdk.aws_codeartifact.Repository.property.env">env</a></code> | <code>aws-cdk-lib.ResourceEnvironment</code> | The environment this resource belongs to. |
+| <code><a href="#@open-constructs/aws-cdk.aws_codeartifact.Repository.property.stack">stack</a></code> | <code>aws-cdk-lib.Stack</code> | The stack in which this resource is defined. |
+| <code><a href="#@open-constructs/aws-cdk.aws_codeartifact.Repository.property.domain">domain</a></code> | <code>@open-constructs/aws-cdk.aws_codeartifact.IDomain</code> | The domain that contains this repository. |
+| <code><a href="#@open-constructs/aws-cdk.aws_codeartifact.Repository.property.repositoryArn">repositoryArn</a></code> | <code>string</code> | The ARN (Amazon Resource Name) of this CodeArtifact repository. |
+| <code><a href="#@open-constructs/aws-cdk.aws_codeartifact.Repository.property.repositoryDomainName">repositoryDomainName</a></code> | <code>string</code> | The domain that contains this repository. |
+| <code><a href="#@open-constructs/aws-cdk.aws_codeartifact.Repository.property.repositoryDomainOwner">repositoryDomainOwner</a></code> | <code>string</code> | The domain owner of this repository. |
+| <code><a href="#@open-constructs/aws-cdk.aws_codeartifact.Repository.property.repositoryName">repositoryName</a></code> | <code>string</code> | The name of this CodeArtifact repository. |
 
 ---
 
-##### `node`<sup>Required</sup> <a name="node" id="@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.property.node"></a>
+##### `node`<sup>Required</sup> <a name="node" id="@open-constructs/aws-cdk.aws_codeartifact.Repository.property.node"></a>
 
 ```typescript
 public readonly node: Node;
@@ -1040,7 +1853,7 @@ The tree node.
 
 ---
 
-##### `env`<sup>Required</sup> <a name="env" id="@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.property.env"></a>
+##### `env`<sup>Required</sup> <a name="env" id="@open-constructs/aws-cdk.aws_codeartifact.Repository.property.env"></a>
 
 ```typescript
 public readonly env: ResourceEnvironment;
@@ -1059,7 +1872,7 @@ that might be different than the stack they were imported into.
 
 ---
 
-##### `stack`<sup>Required</sup> <a name="stack" id="@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.property.stack"></a>
+##### `stack`<sup>Required</sup> <a name="stack" id="@open-constructs/aws-cdk.aws_codeartifact.Repository.property.stack"></a>
 
 ```typescript
 public readonly stack: Stack;
@@ -1071,51 +1884,63 @@ The stack in which this resource is defined.
 
 ---
 
-##### `connections`<sup>Required</sup> <a name="connections" id="@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.property.connections"></a>
+##### `domain`<sup>Required</sup> <a name="domain" id="@open-constructs/aws-cdk.aws_codeartifact.Repository.property.domain"></a>
 
 ```typescript
-public readonly connections: Connections;
+public readonly domain: IDomain;
 ```
 
-- *Type:* aws-cdk-lib.aws_ec2.Connections
+- *Type:* @open-constructs/aws-cdk.aws_codeartifact.IDomain
 
-The security groups/rules used to allow network connections to the file system.
+The domain that contains this repository.
 
 ---
 
-##### `dnsName`<sup>Required</sup> <a name="dnsName" id="@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.property.dnsName"></a>
+##### `repositoryArn`<sup>Required</sup> <a name="repositoryArn" id="@open-constructs/aws-cdk.aws_codeartifact.Repository.property.repositoryArn"></a>
 
 ```typescript
-public readonly dnsName: string;
+public readonly repositoryArn: string;
 ```
 
 - *Type:* string
 
-The management endpoint DNS name assigned to this file system.
+The ARN (Amazon Resource Name) of this CodeArtifact repository.
 
 ---
 
-##### `fileSystemId`<sup>Required</sup> <a name="fileSystemId" id="@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.property.fileSystemId"></a>
+##### `repositoryDomainName`<sup>Required</sup> <a name="repositoryDomainName" id="@open-constructs/aws-cdk.aws_codeartifact.Repository.property.repositoryDomainName"></a>
 
 ```typescript
-public readonly fileSystemId: string;
+public readonly repositoryDomainName: string;
 ```
 
 - *Type:* string
 
-The ID that AWS assigns to the file system.
+The domain that contains this repository.
 
 ---
 
-##### `interClusterDnsName`<sup>Required</sup> <a name="interClusterDnsName" id="@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.property.interClusterDnsName"></a>
+##### `repositoryDomainOwner`<sup>Required</sup> <a name="repositoryDomainOwner" id="@open-constructs/aws-cdk.aws_codeartifact.Repository.property.repositoryDomainOwner"></a>
 
 ```typescript
-public readonly interClusterDnsName: string;
+public readonly repositoryDomainOwner: string;
 ```
 
 - *Type:* string
 
-The inter cluster endpoint DNS name assigned to this file system.
+The domain owner of this repository.
+
+---
+
+##### `repositoryName`<sup>Required</sup> <a name="repositoryName" id="@open-constructs/aws-cdk.aws_codeartifact.Repository.property.repositoryName"></a>
+
+```typescript
+public readonly repositoryName: string;
+```
+
+- *Type:* string
+
+The name of this CodeArtifact repository.
 
 ---
 
@@ -1556,46 +2381,163 @@ The granularity of the line items in the report.
 
 ### DailyAutomaticBackupStartTimeProps <a name="DailyAutomaticBackupStartTimeProps" id="@open-constructs/aws-cdk.aws_fsx.DailyAutomaticBackupStartTimeProps"></a>
 
-Properties required for setting up a daily automatic backup time.
+Properties required for setting up a daily automatic backup time.
+
+#### Initializer <a name="Initializer" id="@open-constructs/aws-cdk.aws_fsx.DailyAutomaticBackupStartTimeProps.Initializer"></a>
+
+```typescript
+import { aws_fsx } from '@open-constructs/aws-cdk'
+
+const dailyAutomaticBackupStartTimeProps: aws_fsx.DailyAutomaticBackupStartTimeProps = { ... }
+```
+
+#### Properties <a name="Properties" id="Properties"></a>
+
+| **Name** | **Type** | **Description** |
+| --- | --- | --- |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.DailyAutomaticBackupStartTimeProps.property.hour">hour</a></code> | <code>number</code> | The hour of the day (from 0-23) for automatic backup starts. |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.DailyAutomaticBackupStartTimeProps.property.minute">minute</a></code> | <code>number</code> | The minute of the hour (from 0-59) for automatic backup starts. |
+
+---
+
+##### `hour`<sup>Required</sup> <a name="hour" id="@open-constructs/aws-cdk.aws_fsx.DailyAutomaticBackupStartTimeProps.property.hour"></a>
+
+```typescript
+public readonly hour: number;
+```
+
+- *Type:* number
+
+The hour of the day (from 0-23) for automatic backup starts.
+
+---
+
+##### `minute`<sup>Required</sup> <a name="minute" id="@open-constructs/aws-cdk.aws_fsx.DailyAutomaticBackupStartTimeProps.property.minute"></a>
+
+```typescript
+public readonly minute: number;
+```
+
+- *Type:* number
+
+The minute of the hour (from 0-59) for automatic backup starts.
+
+---
+
+### DomainAttributes <a name="DomainAttributes" id="@open-constructs/aws-cdk.aws_codeartifact.DomainAttributes"></a>
+
+Interface representing the attributes of a CodeArtifact domain.
+
+#### Initializer <a name="Initializer" id="@open-constructs/aws-cdk.aws_codeartifact.DomainAttributes.Initializer"></a>
+
+```typescript
+import { aws_codeartifact } from '@open-constructs/aws-cdk'
+
+const domainAttributes: aws_codeartifact.DomainAttributes = { ... }
+```
+
+#### Properties <a name="Properties" id="Properties"></a>
+
+| **Name** | **Type** | **Description** |
+| --- | --- | --- |
+| <code><a href="#@open-constructs/aws-cdk.aws_codeartifact.DomainAttributes.property.domainArn">domainArn</a></code> | <code>string</code> | The ARN (Amazon Resource Name) of the CodeArtifact domain. |
+| <code><a href="#@open-constructs/aws-cdk.aws_codeartifact.DomainAttributes.property.domainName">domainName</a></code> | <code>string</code> | The name of the CodeArtifact domain. |
+| <code><a href="#@open-constructs/aws-cdk.aws_codeartifact.DomainAttributes.property.domainOwner">domainOwner</a></code> | <code>string</code> | The AWS account ID that owns the domain. |
+| <code><a href="#@open-constructs/aws-cdk.aws_codeartifact.DomainAttributes.property.encryptionKey">encryptionKey</a></code> | <code>aws-cdk-lib.aws_kms.IKey</code> | The AWS KMS encryption key associated with the domain, if any. |
+
+---
+
+##### `domainArn`<sup>Required</sup> <a name="domainArn" id="@open-constructs/aws-cdk.aws_codeartifact.DomainAttributes.property.domainArn"></a>
+
+```typescript
+public readonly domainArn: string;
+```
+
+- *Type:* string
+
+The ARN (Amazon Resource Name) of the CodeArtifact domain.
+
+---
+
+##### `domainName`<sup>Required</sup> <a name="domainName" id="@open-constructs/aws-cdk.aws_codeartifact.DomainAttributes.property.domainName"></a>
+
+```typescript
+public readonly domainName: string;
+```
+
+- *Type:* string
+
+The name of the CodeArtifact domain.
+
+---
+
+##### `domainOwner`<sup>Required</sup> <a name="domainOwner" id="@open-constructs/aws-cdk.aws_codeartifact.DomainAttributes.property.domainOwner"></a>
+
+```typescript
+public readonly domainOwner: string;
+```
+
+- *Type:* string
+
+The AWS account ID that owns the domain.
+
+---
+
+##### `encryptionKey`<sup>Optional</sup> <a name="encryptionKey" id="@open-constructs/aws-cdk.aws_codeartifact.DomainAttributes.property.encryptionKey"></a>
+
+```typescript
+public readonly encryptionKey: IKey;
+```
+
+- *Type:* aws-cdk-lib.aws_kms.IKey
+
+The AWS KMS encryption key associated with the domain, if any.
+
+---
+
+### DomainProps <a name="DomainProps" id="@open-constructs/aws-cdk.aws_codeartifact.DomainProps"></a>
+
+Construction properties for `Domain`.
 
-#### Initializer <a name="Initializer" id="@open-constructs/aws-cdk.aws_fsx.DailyAutomaticBackupStartTimeProps.Initializer"></a>
+#### Initializer <a name="Initializer" id="@open-constructs/aws-cdk.aws_codeartifact.DomainProps.Initializer"></a>
 
 ```typescript
-import { aws_fsx } from '@open-constructs/aws-cdk'
+import { aws_codeartifact } from '@open-constructs/aws-cdk'
 
-const dailyAutomaticBackupStartTimeProps: aws_fsx.DailyAutomaticBackupStartTimeProps = { ... }
+const domainProps: aws_codeartifact.DomainProps = { ... }
 ```
 
 #### Properties <a name="Properties" id="Properties"></a>
 
 | **Name** | **Type** | **Description** |
 | --- | --- | --- |
-| <code><a href="#@open-constructs/aws-cdk.aws_fsx.DailyAutomaticBackupStartTimeProps.property.hour">hour</a></code> | <code>number</code> | The hour of the day (from 0-23) for automatic backup starts. |
-| <code><a href="#@open-constructs/aws-cdk.aws_fsx.DailyAutomaticBackupStartTimeProps.property.minute">minute</a></code> | <code>number</code> | The minute of the hour (from 0-59) for automatic backup starts. |
+| <code><a href="#@open-constructs/aws-cdk.aws_codeartifact.DomainProps.property.domainName">domainName</a></code> | <code>string</code> | The name of the Domain. |
+| <code><a href="#@open-constructs/aws-cdk.aws_codeartifact.DomainProps.property.encryptionKey">encryptionKey</a></code> | <code>aws-cdk-lib.aws_kms.IKey</code> | The key used to encrypt the Domain. |
 
 ---
 
-##### `hour`<sup>Required</sup> <a name="hour" id="@open-constructs/aws-cdk.aws_fsx.DailyAutomaticBackupStartTimeProps.property.hour"></a>
+##### `domainName`<sup>Required</sup> <a name="domainName" id="@open-constructs/aws-cdk.aws_codeartifact.DomainProps.property.domainName"></a>
 
 ```typescript
-public readonly hour: number;
+public readonly domainName: string;
 ```
 
-- *Type:* number
+- *Type:* string
 
-The hour of the day (from 0-23) for automatic backup starts.
+The name of the Domain.
 
 ---
 
-##### `minute`<sup>Required</sup> <a name="minute" id="@open-constructs/aws-cdk.aws_fsx.DailyAutomaticBackupStartTimeProps.property.minute"></a>
+##### `encryptionKey`<sup>Optional</sup> <a name="encryptionKey" id="@open-constructs/aws-cdk.aws_codeartifact.DomainProps.property.encryptionKey"></a>
 
 ```typescript
-public readonly minute: number;
+public readonly encryptionKey: IKey;
 ```
 
-- *Type:* number
+- *Type:* aws-cdk-lib.aws_kms.IKey
+- *Default:* An AWS managed KMS key is used
 
-The minute of the hour (from 0-59) for automatic backup starts.
+The key used to encrypt the Domain.
 
 ---
 
@@ -2340,6 +3282,159 @@ Specify one of these subnets as the preferred subnet using `OntapConfiguration.p
 
 ---
 
+### RepositoryAttributes <a name="RepositoryAttributes" id="@open-constructs/aws-cdk.aws_codeartifact.RepositoryAttributes"></a>
+
+Represents the attributes of an existing CodeArtifact repository.
+
+#### Initializer <a name="Initializer" id="@open-constructs/aws-cdk.aws_codeartifact.RepositoryAttributes.Initializer"></a>
+
+```typescript
+import { aws_codeartifact } from '@open-constructs/aws-cdk'
+
+const repositoryAttributes: aws_codeartifact.RepositoryAttributes = { ... }
+```
+
+#### Properties <a name="Properties" id="Properties"></a>
+
+| **Name** | **Type** | **Description** |
+| --- | --- | --- |
+| <code><a href="#@open-constructs/aws-cdk.aws_codeartifact.RepositoryAttributes.property.domain">domain</a></code> | <code>@open-constructs/aws-cdk.aws_codeartifact.IDomain</code> | The CodeArtifact domain associated with this repository. |
+| <code><a href="#@open-constructs/aws-cdk.aws_codeartifact.RepositoryAttributes.property.repositoryArn">repositoryArn</a></code> | <code>string</code> | The ARN (Amazon Resource Name) of the CodeArtifact repository. |
+| <code><a href="#@open-constructs/aws-cdk.aws_codeartifact.RepositoryAttributes.property.repositoryName">repositoryName</a></code> | <code>string</code> | The name of the CodeArtifact repository. |
+
+---
+
+##### `domain`<sup>Required</sup> <a name="domain" id="@open-constructs/aws-cdk.aws_codeartifact.RepositoryAttributes.property.domain"></a>
+
+```typescript
+public readonly domain: IDomain;
+```
+
+- *Type:* @open-constructs/aws-cdk.aws_codeartifact.IDomain
+
+The CodeArtifact domain associated with this repository.
+
+---
+
+##### `repositoryArn`<sup>Required</sup> <a name="repositoryArn" id="@open-constructs/aws-cdk.aws_codeartifact.RepositoryAttributes.property.repositoryArn"></a>
+
+```typescript
+public readonly repositoryArn: string;
+```
+
+- *Type:* string
+
+The ARN (Amazon Resource Name) of the CodeArtifact repository.
+
+---
+
+##### `repositoryName`<sup>Required</sup> <a name="repositoryName" id="@open-constructs/aws-cdk.aws_codeartifact.RepositoryAttributes.property.repositoryName"></a>
+
+```typescript
+public readonly repositoryName: string;
+```
+
+- *Type:* string
+
+The name of the CodeArtifact repository.
+
+---
+
+### RepositoryProps <a name="RepositoryProps" id="@open-constructs/aws-cdk.aws_codeartifact.RepositoryProps"></a>
+
+Properties for creating a new CodeArtifact repository.
+
+#### Initializer <a name="Initializer" id="@open-constructs/aws-cdk.aws_codeartifact.RepositoryProps.Initializer"></a>
+
+```typescript
+import { aws_codeartifact } from '@open-constructs/aws-cdk'
+
+const repositoryProps: aws_codeartifact.RepositoryProps = { ... }
+```
+
+#### Properties <a name="Properties" id="Properties"></a>
+
+| **Name** | **Type** | **Description** |
+| --- | --- | --- |
+| <code><a href="#@open-constructs/aws-cdk.aws_codeartifact.RepositoryProps.property.domain">domain</a></code> | <code>@open-constructs/aws-cdk.aws_codeartifact.IDomain</code> | The domain that contains the repository. |
+| <code><a href="#@open-constructs/aws-cdk.aws_codeartifact.RepositoryProps.property.description">description</a></code> | <code>string</code> | The description of the repository. |
+| <code><a href="#@open-constructs/aws-cdk.aws_codeartifact.RepositoryProps.property.externalConnection">externalConnection</a></code> | <code>@open-constructs/aws-cdk.aws_codeartifact.RepositoryConnection</code> | The connections to external repositories (like npmjs, pypi, etc.). |
+| <code><a href="#@open-constructs/aws-cdk.aws_codeartifact.RepositoryProps.property.repositoryName">repositoryName</a></code> | <code>string</code> | The name of the repository. |
+| <code><a href="#@open-constructs/aws-cdk.aws_codeartifact.RepositoryProps.property.upstreams">upstreams</a></code> | <code>@open-constructs/aws-cdk.aws_codeartifact.IRepository[]</code> | A list of upstream Codeartifact repositories to associate with the repository. |
+
+---
+
+##### `domain`<sup>Required</sup> <a name="domain" id="@open-constructs/aws-cdk.aws_codeartifact.RepositoryProps.property.domain"></a>
+
+```typescript
+public readonly domain: IDomain;
+```
+
+- *Type:* @open-constructs/aws-cdk.aws_codeartifact.IDomain
+
+The domain that contains the repository.
+
+---
+
+##### `description`<sup>Optional</sup> <a name="description" id="@open-constructs/aws-cdk.aws_codeartifact.RepositoryProps.property.description"></a>
+
+```typescript
+public readonly description: string;
+```
+
+- *Type:* string
+- *Default:* No description
+
+The description of the repository.
+
+---
+
+##### `externalConnection`<sup>Optional</sup> <a name="externalConnection" id="@open-constructs/aws-cdk.aws_codeartifact.RepositoryProps.property.externalConnection"></a>
+
+```typescript
+public readonly externalConnection: RepositoryConnection;
+```
+
+- *Type:* @open-constructs/aws-cdk.aws_codeartifact.RepositoryConnection
+- *Default:* No external connections
+
+The connections to external repositories (like npmjs, pypi, etc.).
+
+You can use the AWS CLI to connect your CodeArtifact repository to an external repository by adding an external connection directly to the repository.
+This will allow users connected to the CodeArtifact repository, or any of its downstream repositories, to fetch packages from the configured external repository.
+Each CodeArtifact repository can only have one external connection.
+
+---
+
+##### `repositoryName`<sup>Optional</sup> <a name="repositoryName" id="@open-constructs/aws-cdk.aws_codeartifact.RepositoryProps.property.repositoryName"></a>
+
+```typescript
+public readonly repositoryName: string;
+```
+
+- *Type:* string
+- *Default:* A name is automatically generated
+
+The name of the repository.
+
+---
+
+##### `upstreams`<sup>Optional</sup> <a name="upstreams" id="@open-constructs/aws-cdk.aws_codeartifact.RepositoryProps.property.upstreams"></a>
+
+```typescript
+public readonly upstreams: IRepository[];
+```
+
+- *Type:* @open-constructs/aws-cdk.aws_codeartifact.IRepository[]
+- *Default:* No upstream repositories
+
+A list of upstream Codeartifact repositories to associate with the repository.
+
+The order of the upstream repositories in the list determines their priority order when CodeArtifact looks for a requested package version.
+see https://docs.aws.amazon.com/codeartifact/latest/ug/repo-upstream-behavior.html#package-retention-intermediate-repositories
+
+---
+
 ### WorkgroupAttributes <a name="WorkgroupAttributes" id="@open-constructs/aws-cdk.aws_redshiftserverless.WorkgroupAttributes"></a>
 
 Attributes for importing a Redshift Serverless Workgroup.
@@ -3460,47 +4555,245 @@ new aws_fsx.ThroughputCapacityPerHaPair(capacity: number)
 
 ---
 
-##### `capacity`<sup>Required</sup> <a name="capacity" id="@open-constructs/aws-cdk.aws_fsx.ThroughputCapacityPerHaPair.Initializer.parameter.capacity"></a>
+##### `capacity`<sup>Required</sup> <a name="capacity" id="@open-constructs/aws-cdk.aws_fsx.ThroughputCapacityPerHaPair.Initializer.parameter.capacity"></a>
+
+- *Type:* number
+
+---
+
+
+
+#### Properties <a name="Properties" id="Properties"></a>
+
+| **Name** | **Type** | **Description** |
+| --- | --- | --- |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.ThroughputCapacityPerHaPair.property.capacity">capacity</a></code> | <code>number</code> | *No description.* |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.ThroughputCapacityPerHaPair.property.deploymentType">deploymentType</a></code> | <code>@open-constructs/aws-cdk.aws_fsx.OntapDeploymentType</code> | The deployment type of the throughput capacity. |
+
+---
+
+##### `capacity`<sup>Required</sup> <a name="capacity" id="@open-constructs/aws-cdk.aws_fsx.ThroughputCapacityPerHaPair.property.capacity"></a>
+
+```typescript
+public readonly capacity: number;
+```
+
+- *Type:* number
+
+---
+
+##### `deploymentType`<sup>Required</sup> <a name="deploymentType" id="@open-constructs/aws-cdk.aws_fsx.ThroughputCapacityPerHaPair.property.deploymentType"></a>
+
+```typescript
+public readonly deploymentType: OntapDeploymentType;
+```
+
+- *Type:* @open-constructs/aws-cdk.aws_fsx.OntapDeploymentType
+
+The deployment type of the throughput capacity.
+
+---
+
+
+## Protocols <a name="Protocols" id="Protocols"></a>
+
+### IDomain <a name="IDomain" id="@open-constructs/aws-cdk.aws_codeartifact.IDomain"></a>
+
+- *Extends:* aws-cdk-lib.IResource
+
+- *Implemented By:* @open-constructs/aws-cdk.aws_codeartifact.Domain, @open-constructs/aws-cdk.aws_codeartifact.IDomain
+
+Represents a CodeArtifact Domain.
+
+#### Methods <a name="Methods" id="Methods"></a>
+
+| **Name** | **Description** |
+| --- | --- |
+| <code><a href="#@open-constructs/aws-cdk.aws_codeartifact.IDomain.addToResourcePolicy">addToResourcePolicy</a></code> | Adds a statement to the Codeartifact domain resource policy. |
+| <code><a href="#@open-constructs/aws-cdk.aws_codeartifact.IDomain.grant">grant</a></code> | Grants permissions to the specified grantee on this CodeArtifact domain. |
+| <code><a href="#@open-constructs/aws-cdk.aws_codeartifact.IDomain.grantContribute">grantContribute</a></code> | Grants contribute permissions to the specified grantee on this CodeArtifact domain. |
+
+---
+
+##### `addToResourcePolicy` <a name="addToResourcePolicy" id="@open-constructs/aws-cdk.aws_codeartifact.IDomain.addToResourcePolicy"></a>
+
+```typescript
+public addToResourcePolicy(statement: PolicyStatement): AddToResourcePolicyResult
+```
+
+Adds a statement to the Codeartifact domain resource policy.
+
+###### `statement`<sup>Required</sup> <a name="statement" id="@open-constructs/aws-cdk.aws_codeartifact.IDomain.addToResourcePolicy.parameter.statement"></a>
+
+- *Type:* aws-cdk-lib.aws_iam.PolicyStatement
+
+The policy statement to add.
+
+---
+
+##### `grant` <a name="grant" id="@open-constructs/aws-cdk.aws_codeartifact.IDomain.grant"></a>
+
+```typescript
+public grant(grantee: IGrantable, actions: ...string[]): Grant
+```
+
+Grants permissions to the specified grantee on this CodeArtifact domain.
+
+It handles both same-environment and cross-environment scenarios:
+- For same-environment grants, it adds the permissions to the principal or resource.
+- For cross-environment grants, it adds the permissions to both the principal and the resource.
+
+###### `grantee`<sup>Required</sup> <a name="grantee" id="@open-constructs/aws-cdk.aws_codeartifact.IDomain.grant.parameter.grantee"></a>
+
+- *Type:* aws-cdk-lib.aws_iam.IGrantable
+
+The principal to grant permissions to.
+
+---
+
+###### `actions`<sup>Required</sup> <a name="actions" id="@open-constructs/aws-cdk.aws_codeartifact.IDomain.grant.parameter.actions"></a>
+
+- *Type:* ...string[]
+
+The actions to grant.
+
+These should be valid CodeArtifact actions.
+
+---
+
+##### `grantContribute` <a name="grantContribute" id="@open-constructs/aws-cdk.aws_codeartifact.IDomain.grantContribute"></a>
+
+```typescript
+public grantContribute(grantee: IGrantable): Grant
+```
+
+Grants contribute permissions to the specified grantee on this CodeArtifact domain.
+
+###### `grantee`<sup>Required</sup> <a name="grantee" id="@open-constructs/aws-cdk.aws_codeartifact.IDomain.grantContribute.parameter.grantee"></a>
+
+- *Type:* aws-cdk-lib.aws_iam.IGrantable
+
+The principal to grant contribute permissions to.
+
+---
+
+#### Properties <a name="Properties" id="Properties"></a>
+
+| **Name** | **Type** | **Description** |
+| --- | --- | --- |
+| <code><a href="#@open-constructs/aws-cdk.aws_codeartifact.IDomain.property.node">node</a></code> | <code>constructs.Node</code> | The tree node. |
+| <code><a href="#@open-constructs/aws-cdk.aws_codeartifact.IDomain.property.env">env</a></code> | <code>aws-cdk-lib.ResourceEnvironment</code> | The environment this resource belongs to. |
+| <code><a href="#@open-constructs/aws-cdk.aws_codeartifact.IDomain.property.stack">stack</a></code> | <code>aws-cdk-lib.Stack</code> | The stack in which this resource is defined. |
+| <code><a href="#@open-constructs/aws-cdk.aws_codeartifact.IDomain.property.domainArn">domainArn</a></code> | <code>string</code> | The ARN of the Domain. |
+| <code><a href="#@open-constructs/aws-cdk.aws_codeartifact.IDomain.property.domainName">domainName</a></code> | <code>string</code> | The name of the Domain. |
+| <code><a href="#@open-constructs/aws-cdk.aws_codeartifact.IDomain.property.domainOwner">domainOwner</a></code> | <code>string</code> | 12-digit account number of the AWS account that owns the domain that contains the Domain. |
+| <code><a href="#@open-constructs/aws-cdk.aws_codeartifact.IDomain.property.domainEncryptionKey">domainEncryptionKey</a></code> | <code>string</code> | The ARN of the key used to encrypt the Domain. |
+| <code><a href="#@open-constructs/aws-cdk.aws_codeartifact.IDomain.property.encryptionKey">encryptionKey</a></code> | <code>aws-cdk-lib.aws_kms.IKey</code> | The KMS key used to encrypt the Domain. |
+
+---
+
+##### `node`<sup>Required</sup> <a name="node" id="@open-constructs/aws-cdk.aws_codeartifact.IDomain.property.node"></a>
+
+```typescript
+public readonly node: Node;
+```
+
+- *Type:* constructs.Node
+
+The tree node.
+
+---
+
+##### `env`<sup>Required</sup> <a name="env" id="@open-constructs/aws-cdk.aws_codeartifact.IDomain.property.env"></a>
+
+```typescript
+public readonly env: ResourceEnvironment;
+```
+
+- *Type:* aws-cdk-lib.ResourceEnvironment
+
+The environment this resource belongs to.
+
+For resources that are created and managed by the CDK
+(generally, those created by creating new class instances like Role, Bucket, etc.),
+this is always the same as the environment of the stack they belong to;
+however, for imported resources
+(those obtained from static methods like fromRoleArn, fromBucketName, etc.),
+that might be different than the stack they were imported into.
+
+---
+
+##### `stack`<sup>Required</sup> <a name="stack" id="@open-constructs/aws-cdk.aws_codeartifact.IDomain.property.stack"></a>
+
+```typescript
+public readonly stack: Stack;
+```
+
+- *Type:* aws-cdk-lib.Stack
+
+The stack in which this resource is defined.
+
+---
+
+##### `domainArn`<sup>Required</sup> <a name="domainArn" id="@open-constructs/aws-cdk.aws_codeartifact.IDomain.property.domainArn"></a>
+
+```typescript
+public readonly domainArn: string;
+```
+
+- *Type:* string
 
-- *Type:* number
+The ARN of the Domain.
 
 ---
 
+##### `domainName`<sup>Required</sup> <a name="domainName" id="@open-constructs/aws-cdk.aws_codeartifact.IDomain.property.domainName"></a>
 
+```typescript
+public readonly domainName: string;
+```
 
-#### Properties <a name="Properties" id="Properties"></a>
+- *Type:* string
 
-| **Name** | **Type** | **Description** |
-| --- | --- | --- |
-| <code><a href="#@open-constructs/aws-cdk.aws_fsx.ThroughputCapacityPerHaPair.property.capacity">capacity</a></code> | <code>number</code> | *No description.* |
-| <code><a href="#@open-constructs/aws-cdk.aws_fsx.ThroughputCapacityPerHaPair.property.deploymentType">deploymentType</a></code> | <code>@open-constructs/aws-cdk.aws_fsx.OntapDeploymentType</code> | The deployment type of the throughput capacity. |
+The name of the Domain.
 
 ---
 
-##### `capacity`<sup>Required</sup> <a name="capacity" id="@open-constructs/aws-cdk.aws_fsx.ThroughputCapacityPerHaPair.property.capacity"></a>
+##### `domainOwner`<sup>Required</sup> <a name="domainOwner" id="@open-constructs/aws-cdk.aws_codeartifact.IDomain.property.domainOwner"></a>
 
 ```typescript
-public readonly capacity: number;
+public readonly domainOwner: string;
 ```
 
-- *Type:* number
+- *Type:* string
+
+12-digit account number of the AWS account that owns the domain that contains the Domain.
 
 ---
 
-##### `deploymentType`<sup>Required</sup> <a name="deploymentType" id="@open-constructs/aws-cdk.aws_fsx.ThroughputCapacityPerHaPair.property.deploymentType"></a>
+##### `domainEncryptionKey`<sup>Optional</sup> <a name="domainEncryptionKey" id="@open-constructs/aws-cdk.aws_codeartifact.IDomain.property.domainEncryptionKey"></a>
 
 ```typescript
-public readonly deploymentType: OntapDeploymentType;
+public readonly domainEncryptionKey: string;
 ```
 
-- *Type:* @open-constructs/aws-cdk.aws_fsx.OntapDeploymentType
+- *Type:* string
 
-The deployment type of the throughput capacity.
+The ARN of the key used to encrypt the Domain.
 
 ---
 
+##### `encryptionKey`<sup>Optional</sup> <a name="encryptionKey" id="@open-constructs/aws-cdk.aws_codeartifact.IDomain.property.encryptionKey"></a>
 
-## Protocols <a name="Protocols" id="Protocols"></a>
+```typescript
+public readonly encryptionKey: IKey;
+```
+
+- *Type:* aws-cdk-lib.aws_kms.IKey
+
+The KMS key used to encrypt the Domain.
+
+---
 
 ### IInstanceConnectEndpoint <a name="IInstanceConnectEndpoint" id="@open-constructs/aws-cdk.aws_ec2.IInstanceConnectEndpoint"></a>
 
@@ -3691,6 +4984,215 @@ The namespace name.
 
 ---
 
+### IRepository <a name="IRepository" id="@open-constructs/aws-cdk.aws_codeartifact.IRepository"></a>
+
+- *Extends:* aws-cdk-lib.IResource
+
+- *Implemented By:* @open-constructs/aws-cdk.aws_codeartifact.Repository, @open-constructs/aws-cdk.aws_codeartifact.IRepository
+
+Represents an CodeArtifact Repository.
+
+#### Methods <a name="Methods" id="Methods"></a>
+
+| **Name** | **Description** |
+| --- | --- |
+| <code><a href="#@open-constructs/aws-cdk.aws_codeartifact.IRepository.addToResourcePolicy">addToResourcePolicy</a></code> | Adds a statement to the CodeArtifact repository resource policy. |
+| <code><a href="#@open-constructs/aws-cdk.aws_codeartifact.IRepository.grant">grant</a></code> | Grants the given principal identity permissions to perform the actions on the repository. |
+| <code><a href="#@open-constructs/aws-cdk.aws_codeartifact.IRepository.grantRead">grantRead</a></code> | Grants the given principal identity permissions to perform the actions on the repository. |
+| <code><a href="#@open-constructs/aws-cdk.aws_codeartifact.IRepository.grantReadAndPublish">grantReadAndPublish</a></code> | Grants the given principal identity permissions to perform the actions on the repository. |
+
+---
+
+##### `addToResourcePolicy` <a name="addToResourcePolicy" id="@open-constructs/aws-cdk.aws_codeartifact.IRepository.addToResourcePolicy"></a>
+
+```typescript
+public addToResourcePolicy(statement: PolicyStatement): AddToResourcePolicyResult
+```
+
+Adds a statement to the CodeArtifact repository resource policy.
+
+###### `statement`<sup>Required</sup> <a name="statement" id="@open-constructs/aws-cdk.aws_codeartifact.IRepository.addToResourcePolicy.parameter.statement"></a>
+
+- *Type:* aws-cdk-lib.aws_iam.PolicyStatement
+
+The policy statement to add.
+
+---
+
+##### `grant` <a name="grant" id="@open-constructs/aws-cdk.aws_codeartifact.IRepository.grant"></a>
+
+```typescript
+public grant(grantee: IGrantable, actions: ...string[]): Grant
+```
+
+Grants the given principal identity permissions to perform the actions on the repository.
+
+###### `grantee`<sup>Required</sup> <a name="grantee" id="@open-constructs/aws-cdk.aws_codeartifact.IRepository.grant.parameter.grantee"></a>
+
+- *Type:* aws-cdk-lib.aws_iam.IGrantable
+
+The principal to grant permissions to.
+
+---
+
+###### `actions`<sup>Required</sup> <a name="actions" id="@open-constructs/aws-cdk.aws_codeartifact.IRepository.grant.parameter.actions"></a>
+
+- *Type:* ...string[]
+
+The actions to grant.
+
+---
+
+##### `grantRead` <a name="grantRead" id="@open-constructs/aws-cdk.aws_codeartifact.IRepository.grantRead"></a>
+
+```typescript
+public grantRead(grantee: IGrantable): Grant
+```
+
+Grants the given principal identity permissions to perform the actions on the repository.
+
+###### `grantee`<sup>Required</sup> <a name="grantee" id="@open-constructs/aws-cdk.aws_codeartifact.IRepository.grantRead.parameter.grantee"></a>
+
+- *Type:* aws-cdk-lib.aws_iam.IGrantable
+
+The principal to grant permissions to.
+
+---
+
+##### `grantReadAndPublish` <a name="grantReadAndPublish" id="@open-constructs/aws-cdk.aws_codeartifact.IRepository.grantReadAndPublish"></a>
+
+```typescript
+public grantReadAndPublish(grantee: IGrantable): Grant
+```
+
+Grants the given principal identity permissions to perform the actions on the repository.
+
+###### `grantee`<sup>Required</sup> <a name="grantee" id="@open-constructs/aws-cdk.aws_codeartifact.IRepository.grantReadAndPublish.parameter.grantee"></a>
+
+- *Type:* aws-cdk-lib.aws_iam.IGrantable
+
+The principal to grant permissions to.
+
+---
+
+#### Properties <a name="Properties" id="Properties"></a>
+
+| **Name** | **Type** | **Description** |
+| --- | --- | --- |
+| <code><a href="#@open-constructs/aws-cdk.aws_codeartifact.IRepository.property.node">node</a></code> | <code>constructs.Node</code> | The tree node. |
+| <code><a href="#@open-constructs/aws-cdk.aws_codeartifact.IRepository.property.env">env</a></code> | <code>aws-cdk-lib.ResourceEnvironment</code> | The environment this resource belongs to. |
+| <code><a href="#@open-constructs/aws-cdk.aws_codeartifact.IRepository.property.stack">stack</a></code> | <code>aws-cdk-lib.Stack</code> | The stack in which this resource is defined. |
+| <code><a href="#@open-constructs/aws-cdk.aws_codeartifact.IRepository.property.domain">domain</a></code> | <code>@open-constructs/aws-cdk.aws_codeartifact.IDomain</code> | The domain that contains the repository. |
+| <code><a href="#@open-constructs/aws-cdk.aws_codeartifact.IRepository.property.repositoryArn">repositoryArn</a></code> | <code>string</code> | The ARN of the repository. |
+| <code><a href="#@open-constructs/aws-cdk.aws_codeartifact.IRepository.property.repositoryDomainName">repositoryDomainName</a></code> | <code>string</code> | The domain that contains the repository. |
+| <code><a href="#@open-constructs/aws-cdk.aws_codeartifact.IRepository.property.repositoryDomainOwner">repositoryDomainOwner</a></code> | <code>string</code> | The domain owner of the repository. |
+| <code><a href="#@open-constructs/aws-cdk.aws_codeartifact.IRepository.property.repositoryName">repositoryName</a></code> | <code>string</code> | The name of the repository. |
+
+---
+
+##### `node`<sup>Required</sup> <a name="node" id="@open-constructs/aws-cdk.aws_codeartifact.IRepository.property.node"></a>
+
+```typescript
+public readonly node: Node;
+```
+
+- *Type:* constructs.Node
+
+The tree node.
+
+---
+
+##### `env`<sup>Required</sup> <a name="env" id="@open-constructs/aws-cdk.aws_codeartifact.IRepository.property.env"></a>
+
+```typescript
+public readonly env: ResourceEnvironment;
+```
+
+- *Type:* aws-cdk-lib.ResourceEnvironment
+
+The environment this resource belongs to.
+
+For resources that are created and managed by the CDK
+(generally, those created by creating new class instances like Role, Bucket, etc.),
+this is always the same as the environment of the stack they belong to;
+however, for imported resources
+(those obtained from static methods like fromRoleArn, fromBucketName, etc.),
+that might be different than the stack they were imported into.
+
+---
+
+##### `stack`<sup>Required</sup> <a name="stack" id="@open-constructs/aws-cdk.aws_codeartifact.IRepository.property.stack"></a>
+
+```typescript
+public readonly stack: Stack;
+```
+
+- *Type:* aws-cdk-lib.Stack
+
+The stack in which this resource is defined.
+
+---
+
+##### `domain`<sup>Required</sup> <a name="domain" id="@open-constructs/aws-cdk.aws_codeartifact.IRepository.property.domain"></a>
+
+```typescript
+public readonly domain: IDomain;
+```
+
+- *Type:* @open-constructs/aws-cdk.aws_codeartifact.IDomain
+
+The domain that contains the repository.
+
+---
+
+##### `repositoryArn`<sup>Required</sup> <a name="repositoryArn" id="@open-constructs/aws-cdk.aws_codeartifact.IRepository.property.repositoryArn"></a>
+
+```typescript
+public readonly repositoryArn: string;
+```
+
+- *Type:* string
+
+The ARN of the repository.
+
+---
+
+##### `repositoryDomainName`<sup>Required</sup> <a name="repositoryDomainName" id="@open-constructs/aws-cdk.aws_codeartifact.IRepository.property.repositoryDomainName"></a>
+
+```typescript
+public readonly repositoryDomainName: string;
+```
+
+- *Type:* string
+
+The domain that contains the repository.
+
+---
+
+##### `repositoryDomainOwner`<sup>Required</sup> <a name="repositoryDomainOwner" id="@open-constructs/aws-cdk.aws_codeartifact.IRepository.property.repositoryDomainOwner"></a>
+
+```typescript
+public readonly repositoryDomainOwner: string;
+```
+
+- *Type:* string
+
+The domain owner of the repository.
+
+---
+
+##### `repositoryName`<sup>Required</sup> <a name="repositoryName" id="@open-constructs/aws-cdk.aws_codeartifact.IRepository.property.repositoryName"></a>
+
+```typescript
+public readonly repositoryName: string;
+```
+
+- *Type:* string
+
+The name of the repository.
+
+---
+
 ### IWorkgroup <a name="IWorkgroup" id="@open-constructs/aws-cdk.aws_redshiftserverless.IWorkgroup"></a>
 
 - *Extends:* aws-cdk-lib.IResource, aws-cdk-lib.aws_ec2.IConnectable
@@ -3918,3 +5420,126 @@ This is a second-generation FSx for ONTAP file system.
 
 ---
 
+
+### RepositoryConnection <a name="RepositoryConnection" id="@open-constructs/aws-cdk.aws_codeartifact.RepositoryConnection"></a>
+
+Represents the supported external connections for CodeArtifact repositories.
+
+#### Members <a name="Members" id="Members"></a>
+
+| **Name** | **Description** |
+| --- | --- |
+| <code><a href="#@open-constructs/aws-cdk.aws_codeartifact.RepositoryConnection.PYTHON">PYTHON</a></code> | Python Package Index (PyPI). |
+| <code><a href="#@open-constructs/aws-cdk.aws_codeartifact.RepositoryConnection.NPM">NPM</a></code> | Node Package Manager (npm). |
+| <code><a href="#@open-constructs/aws-cdk.aws_codeartifact.RepositoryConnection.NUGET">NUGET</a></code> | NuGet Gallery. |
+| <code><a href="#@open-constructs/aws-cdk.aws_codeartifact.RepositoryConnection.RUBY">RUBY</a></code> | RubyGems. |
+| <code><a href="#@open-constructs/aws-cdk.aws_codeartifact.RepositoryConnection.RUST">RUST</a></code> | Crates.io (Rust). |
+| <code><a href="#@open-constructs/aws-cdk.aws_codeartifact.RepositoryConnection.MAVEN_CENTRAL">MAVEN_CENTRAL</a></code> | Maven Central Repository. |
+| <code><a href="#@open-constructs/aws-cdk.aws_codeartifact.RepositoryConnection.GRADLE_PLUGINS">GRADLE_PLUGINS</a></code> | Gradle Plugins. |
+| <code><a href="#@open-constructs/aws-cdk.aws_codeartifact.RepositoryConnection.MAVEN_GOOGLE">MAVEN_GOOGLE</a></code> | Maven Google. |
+| <code><a href="#@open-constructs/aws-cdk.aws_codeartifact.RepositoryConnection.MAVEN_APACHE">MAVEN_APACHE</a></code> | Maven Apache. |
+| <code><a href="#@open-constructs/aws-cdk.aws_codeartifact.RepositoryConnection.MAVEN_ATLASSIAN">MAVEN_ATLASSIAN</a></code> | Maven Atlassian. |
+| <code><a href="#@open-constructs/aws-cdk.aws_codeartifact.RepositoryConnection.MAVEN_ECLIPSE">MAVEN_ECLIPSE</a></code> | Maven Eclipse. |
+| <code><a href="#@open-constructs/aws-cdk.aws_codeartifact.RepositoryConnection.MAVEN_JBOSS">MAVEN_JBOSS</a></code> | Maven JBoss. |
+| <code><a href="#@open-constructs/aws-cdk.aws_codeartifact.RepositoryConnection.MAVEN_SPRING">MAVEN_SPRING</a></code> | Maven Spring. |
+| <code><a href="#@open-constructs/aws-cdk.aws_codeartifact.RepositoryConnection.MAVEN_SPRING_PLUGINS">MAVEN_SPRING_PLUGINS</a></code> | Maven Spring Plugins. |
+
+---
+
+##### `PYTHON` <a name="PYTHON" id="@open-constructs/aws-cdk.aws_codeartifact.RepositoryConnection.PYTHON"></a>
+
+Python Package Index (PyPI).
+
+---
+
+
+##### `NPM` <a name="NPM" id="@open-constructs/aws-cdk.aws_codeartifact.RepositoryConnection.NPM"></a>
+
+Node Package Manager (npm).
+
+---
+
+
+##### `NUGET` <a name="NUGET" id="@open-constructs/aws-cdk.aws_codeartifact.RepositoryConnection.NUGET"></a>
+
+NuGet Gallery.
+
+---
+
+
+##### `RUBY` <a name="RUBY" id="@open-constructs/aws-cdk.aws_codeartifact.RepositoryConnection.RUBY"></a>
+
+RubyGems.
+
+---
+
+
+##### `RUST` <a name="RUST" id="@open-constructs/aws-cdk.aws_codeartifact.RepositoryConnection.RUST"></a>
+
+Crates.io (Rust).
+
+---
+
+
+##### `MAVEN_CENTRAL` <a name="MAVEN_CENTRAL" id="@open-constructs/aws-cdk.aws_codeartifact.RepositoryConnection.MAVEN_CENTRAL"></a>
+
+Maven Central Repository.
+
+---
+
+
+##### `GRADLE_PLUGINS` <a name="GRADLE_PLUGINS" id="@open-constructs/aws-cdk.aws_codeartifact.RepositoryConnection.GRADLE_PLUGINS"></a>
+
+Gradle Plugins.
+
+---
+
+
+##### `MAVEN_GOOGLE` <a name="MAVEN_GOOGLE" id="@open-constructs/aws-cdk.aws_codeartifact.RepositoryConnection.MAVEN_GOOGLE"></a>
+
+Maven Google.
+
+---
+
+
+##### `MAVEN_APACHE` <a name="MAVEN_APACHE" id="@open-constructs/aws-cdk.aws_codeartifact.RepositoryConnection.MAVEN_APACHE"></a>
+
+Maven Apache.
+
+---
+
+
+##### `MAVEN_ATLASSIAN` <a name="MAVEN_ATLASSIAN" id="@open-constructs/aws-cdk.aws_codeartifact.RepositoryConnection.MAVEN_ATLASSIAN"></a>
+
+Maven Atlassian.
+
+---
+
+
+##### `MAVEN_ECLIPSE` <a name="MAVEN_ECLIPSE" id="@open-constructs/aws-cdk.aws_codeartifact.RepositoryConnection.MAVEN_ECLIPSE"></a>
+
+Maven Eclipse.
+
+---
+
+
+##### `MAVEN_JBOSS` <a name="MAVEN_JBOSS" id="@open-constructs/aws-cdk.aws_codeartifact.RepositoryConnection.MAVEN_JBOSS"></a>
+
+Maven JBoss.
+
+---
+
+
+##### `MAVEN_SPRING` <a name="MAVEN_SPRING" id="@open-constructs/aws-cdk.aws_codeartifact.RepositoryConnection.MAVEN_SPRING"></a>
+
+Maven Spring.
+
+---
+
+
+##### `MAVEN_SPRING_PLUGINS` <a name="MAVEN_SPRING_PLUGINS" id="@open-constructs/aws-cdk.aws_codeartifact.RepositoryConnection.MAVEN_SPRING_PLUGINS"></a>
+
+Maven Spring Plugins.
+
+---
+
diff --git a/src/aws-codeartifact/README.md b/src/aws-codeartifact/README.md
new file mode 100644
index 0000000..1d8f607
--- /dev/null
+++ b/src/aws-codeartifact/README.md
@@ -0,0 +1,40 @@
+Constructs for the AWS CodeArtifact service
+
+# CDK Constructs for CodeArtifact Service
+
+## Overview
+
+The `Domain` and `Repository` constructs simplify the creation and management of AWS CodeArtifact domains and repositories within AWS CDK
+applications. These constructs allow users to manage private repositories for software packages and define domains to group repositories,
+facilitating secure sharing and version control across teams.
+
+## Usage
+
+Import the `Domain` and `Repository` constructs and create a new CodeArtifact domain & repository within your AWS CDK stack.
+
+```ts
+import { App, Stack } from 'aws-cdk-lib';
+import { Domain, Repository } from '@open-constructs/aws-cdk/aws-codeartifact';
+
+const app = new App();
+const stack = new Stack(app, 'CodeArtifactDomainStack');
+
+const domain = new Domain(stack, 'MyDomain', {
+  domainName: 'my-domain',
+});
+
+const repository = new Repository(this, 'MyRepo', {
+  domain: domain,
+  repositoryName: 'my-repo',
+});
+```
+
+### Importing existing resources
+
+If you need to manage an existing CodeArtifact repository, you can import it into your CDK stack. Since the domain is implicit in the ARN of the repository it will be automatically imported as well.
+
+```ts
+import { Repository } from '@open-constructs/aws-cdk/aws-codeartifact';
+
+const existingRepo = Repository.fromRepositoryArn(stack, 'ImportedRepo', 'arn:aws:codeartifact:us-east-1:123456789012:repository/my-domain/my-repo');
+```
\ No newline at end of file
diff --git a/src/aws-codeartifact/domain.ts b/src/aws-codeartifact/domain.ts
new file mode 100644
index 0000000..6606883
--- /dev/null
+++ b/src/aws-codeartifact/domain.ts
@@ -0,0 +1,332 @@
+import { Annotations, ArnFormat, IResource, Lazy, Resource, Stack, Token, TokenComparison } from 'aws-cdk-lib';
+import { CfnDomain, CfnDomainProps } from 'aws-cdk-lib/aws-codeartifact';
+import {
+  AddToResourcePolicyResult,
+  Grant,
+  GrantWithResourceOptions,
+  IGrantable,
+  PolicyDocument,
+  PolicyStatement,
+  principalIsOwnedResource,
+} from 'aws-cdk-lib/aws-iam';
+import { IKey } from 'aws-cdk-lib/aws-kms';
+import { Construct } from 'constructs';
+
+/**
+ * Represents a CodeArtifact Domain
+ */
+export interface IDomain extends IResource {
+  /**
+   * The ARN of the Domain
+   *
+   * @attribute
+   */
+  readonly domainArn: string;
+
+  /**
+   * The name of the Domain
+   *
+   * @attribute
+   */
+  readonly domainName: string;
+
+  /**
+   * The ARN of the key used to encrypt the Domain
+   *
+   * @attribute
+   */
+  readonly domainEncryptionKey?: string;
+
+  /**
+   * 12-digit account number of the AWS account that owns the domain that contains the Domain.
+   *
+   * @attribute
+   */
+  readonly domainOwner: string;
+
+  /**
+   * The KMS key used to encrypt the Domain
+   */
+  readonly encryptionKey?: IKey;
+
+  /**
+   * Adds a statement to the Codeartifact domain resource policy.
+   * @param statement The policy statement to add
+   */
+  addToResourcePolicy(statement: PolicyStatement): AddToResourcePolicyResult;
+
+  /**
+   * Grants permissions to the specified grantee on this CodeArtifact domain.
+   *
+   * It handles both same-environment and cross-environment scenarios:
+   * - For same-environment grants, it adds the permissions to the principal or resource.
+   * - For cross-environment grants, it adds the permissions to both the principal and the resource.
+   *
+   * @param grantee - The principal to grant permissions to.
+   * @param actions - The actions to grant. These should be valid CodeArtifact actions.
+   */
+  grant(grantee: IGrantable, ...actions: string[]): Grant;
+
+  /**
+   * Grants contribute permissions to the specified grantee on this CodeArtifact domain.
+   *
+   * @param grantee - The principal to grant contribute permissions to.
+   */
+  grantContribute(grantee: IGrantable): Grant;
+}
+
+/**
+ * A new or imported CodeArtifact Domain.
+ */
+abstract class DomainBase extends Resource implements IDomain {
+  /**
+   * The ARN (Amazon Resource Name) of the CodeArtifact domain.
+   */
+  public abstract readonly domainArn: string;
+
+  /**
+   * The name of the CodeArtifact domain.
+   */
+  public abstract readonly domainName: string;
+
+  /**
+   * The AWS KMS encryption key associated with the domain, if any.
+   */
+  public abstract readonly encryptionKey?: IKey;
+
+  /**
+   * The ARN of the key used to encrypt the Domain
+   */
+  public abstract readonly domainEncryptionKey?: string;
+
+  /**
+   * The AWS account ID that owns the domain.
+   */
+  public abstract readonly domainOwner: string;
+
+  protected abstract policy?: PolicyDocument;
+
+  /**
+   * Adds a statement to the Codeartifact domain resource policy.
+   * @param statement The policy statement to add
+   */
+  public addToResourcePolicy(statement: PolicyStatement): AddToResourcePolicyResult {
+    if (!Resource.isOwnedResource(this)) {
+      Annotations.of(this).addWarningV2(
+        'NoResourcePolicyStatementAdded',
+        `No statements added to imported resource ${this.domainArn}.`,
+      );
+      return { statementAdded: false };
+    }
+
+    if (!this.policy) {
+      this.policy = new PolicyDocument();
+    }
+    this.policy.addStatements(statement);
+    return { statementAdded: true, policyDependable: this.policy };
+  }
+
+  private isCrossEnvironmentGrantee(grantee: IGrantable): boolean {
+    if (!principalIsOwnedResource(grantee.grantPrincipal)) {
+      return false;
+    }
+    const thisStack = Stack.of(this);
+    const identityStack = Stack.of(grantee.grantPrincipal);
+    return (
+      Token.compareStrings(thisStack.region, identityStack.region) === TokenComparison.DIFFERENT ||
+      Token.compareStrings(thisStack.account, identityStack.account) === TokenComparison.DIFFERENT
+    );
+  }
+
+  /**
+   * Grants permissions to the specified grantee on this CodeArtifact domain.
+   *
+   * It handles both same-environment and cross-environment scenarios:
+   * - For same-environment grants, it adds the permissions to the principal or resource.
+   * - For cross-environment grants, it adds the permissions to both the principal and the resource.
+   *
+   * @param grantee - The principal to grant permissions to.
+   * @param actions - The actions to grant. These should be valid CodeArtifact actions.
+   */
+  public grant(grantee: IGrantable, ...actions: string[]): Grant {
+    const crossEnvironment = this.isCrossEnvironmentGrantee(grantee);
+    const grantOptions: GrantWithResourceOptions = {
+      grantee,
+      actions,
+      resource: this,
+      resourceArns: [this.domainArn],
+      resourceSelfArns: crossEnvironment ? undefined : ['*'],
+    };
+    if (!crossEnvironment) {
+      return Grant.addToPrincipalOrResource(grantOptions);
+    } else {
+      return Grant.addToPrincipalAndResource({
+        ...grantOptions,
+        resourceArns: [this.domainArn],
+        resourcePolicyPrincipal: grantee.grantPrincipal,
+      });
+    }
+  }
+
+  /**
+   * Grants contribute permissions to the specified grantee on this CodeArtifact domain.
+   *
+   * @param grantee - The principal to grant contribute permissions to.
+   */
+  public grantContribute(grantee: IGrantable) {
+    return this.grant(
+      grantee,
+      'codeartifact:CreateRepository',
+      'codeartifact:DescribeDomain',
+      'codeartifact:GetAuthorizationToken',
+      'codeartifact:GetDomainPermissionsPolicy',
+      'codeartifact:ListRepositoriesInDomain',
+      'sts:GetServiceBearerToken',
+    );
+  }
+}
+
+/**
+ * Interface representing the attributes of a CodeArtifact domain.
+ */
+export interface DomainAttributes {
+  /**
+   * The ARN (Amazon Resource Name) of the CodeArtifact domain.
+   */
+  readonly domainArn: string;
+
+  /**
+   * The name of the CodeArtifact domain.
+   */
+  readonly domainName: string;
+
+  /**
+   * The AWS KMS encryption key associated with the domain, if any.
+   */
+  readonly encryptionKey?: IKey;
+
+  /**
+   * The AWS account ID that owns the domain.
+   */
+  readonly domainOwner: string;
+}
+
+/**
+ * Construction properties for `Domain`.
+ */
+export interface DomainProps {
+  /**
+   * The name of the Domain
+   */
+  readonly domainName: string;
+  /**
+   * The key used to encrypt the Domain
+   *
+   * @default - An AWS managed KMS key is used
+   */
+  readonly encryptionKey?: IKey;
+}
+
+/**
+ * Deploys a CodeArtifact domain.
+ */
+export class Domain extends DomainBase implements IDomain {
+  /**
+   * Creates a Domain object from existing domain attributes.
+   *
+   * @param scope The parent construct.
+   * @param id The construct id.
+   * @param attrs The attributes of the domain to import.
+   */
+  public static fromDomainAttributes(scope: Construct, id: string, attrs: DomainAttributes): IDomain {
+    class Import extends DomainBase {
+      public readonly domainArn = attrs.domainArn;
+      public readonly domainName = attrs.domainName;
+      public readonly encryptionKey = attrs.encryptionKey;
+      public readonly domainOwner = attrs.domainOwner;
+      public readonly domainEncryptionKey = attrs.encryptionKey?.keyArn;
+      protected readonly policy?: PolicyDocument | undefined = undefined;
+    }
+
+    return new Import(scope, id);
+  }
+
+  /**
+   * Creates an IDomain object from an existing CodeArtifact domain ARN.
+   *
+   * @param scope The parent construct.
+   * @param id The construct id.
+   * @param domainArn - The ARN (Amazon Resource Name) of the existing CodeArtifact domain.
+   */
+  public static fromDomainArn(scope: Construct, id: string, domainArn: string): IDomain {
+    const domainResourceArnParts = Stack.of(scope).splitArn(domainArn, ArnFormat.SLASH_RESOURCE_NAME);
+    if (
+      domainResourceArnParts.resource !== 'domain' ||
+      domainResourceArnParts.account === undefined ||
+      domainResourceArnParts.resourceName === undefined
+    ) {
+      throw new Error(`Expected a domain ARN, but got ${domainArn}`);
+    }
+    return Domain.fromDomainAttributes(scope, id, {
+      domainArn,
+      domainName: domainResourceArnParts.resourceName,
+      domainOwner: domainResourceArnParts.account,
+    });
+  }
+
+  /**
+   * (internal) The CloudFormation resource representing this CodeArtifact domain.
+   */
+  protected cfnResource: CfnDomain;
+  /**
+   * The properties used to create the CloudFormation resource for this domain.
+   */
+  private cfnResourceProps: CfnDomainProps;
+
+  /**
+   * The ARN (Amazon Resource Name) of this CodeArtifact domain.
+   */
+  readonly domainArn: string;
+  /**
+   * The name of this CodeArtifact domain.
+   */
+  readonly domainName: string;
+  /**
+   * The AWS KMS encryption key associated with this domain, if any.
+   */
+  readonly encryptionKey?: IKey;
+  /**
+   * The AWS account ID that owns this domain.
+   */
+  readonly domainOwner: string;
+
+  /**
+   * The ARN of the key used to encrypt the Domain
+   */
+  readonly domainEncryptionKey?: string;
+
+  protected policy?: PolicyDocument;
+
+  constructor(scope: Construct, id: string, props: DomainProps) {
+    super(scope, id);
+
+    const encryptionKey = props.encryptionKey;
+
+    this.cfnResourceProps = {
+      domainName: props.domainName,
+      encryptionKey: encryptionKey?.keyArn,
+      permissionsPolicyDocument: Lazy.any({ produce: () => this.policy?.toJSON() }),
+    };
+    this.cfnResource = this.createResource(this, 'Resource');
+
+    this.domainName = this.cfnResource.attrName;
+    this.domainArn = this.cfnResource.attrArn;
+    this.encryptionKey = encryptionKey;
+    this.domainOwner = this.cfnResource.attrOwner;
+    this.domainEncryptionKey = this.cfnResource.attrEncryptionKey;
+  }
+
+  protected createResource(scope: Construct, id: string): CfnDomain {
+    return new CfnDomain(scope, id, this.cfnResourceProps);
+  }
+}
diff --git a/src/aws-codeartifact/index.ts b/src/aws-codeartifact/index.ts
new file mode 100644
index 0000000..aa21712
--- /dev/null
+++ b/src/aws-codeartifact/index.ts
@@ -0,0 +1,2 @@
+export * from './domain';
+export * from './repository';
diff --git a/src/aws-codeartifact/repository.ts b/src/aws-codeartifact/repository.ts
new file mode 100644
index 0000000..a660729
--- /dev/null
+++ b/src/aws-codeartifact/repository.ts
@@ -0,0 +1,437 @@
+import { Annotations, ArnFormat, IResource, Lazy, Names, Resource, Stack, Token, TokenComparison } from 'aws-cdk-lib';
+import { CfnRepository, CfnRepositoryProps } from 'aws-cdk-lib/aws-codeartifact';
+import {
+  AddToResourcePolicyResult,
+  Grant,
+  GrantWithResourceOptions,
+  IGrantable,
+  PolicyDocument,
+  PolicyStatement,
+  principalIsOwnedResource,
+} from 'aws-cdk-lib/aws-iam';
+import { Construct } from 'constructs';
+import { Domain, IDomain } from './domain';
+
+const READ_ACTIONS = [
+  'codeartifact:DescribePackageVersion',
+  'codeartifact:DescribeRepository',
+  'codeartifact:GetPackageVersionReadme',
+  'codeartifact:GetRepositoryEndpoint',
+  'codeartifact:ListPackageVersionAssets',
+  'codeartifact:ListPackageVersionDependencies',
+  'codeartifact:ListPackageVersions',
+  'codeartifact:ListPackages',
+  'codeartifact:ReadFromRepository',
+];
+
+const PUBLISH_ACTIONS = ['codeartifact:PublishPackageVersion', 'codeartifact:PutPackageMetadata'];
+
+/**
+ * Represents the supported external connections for CodeArtifact repositories.
+ */
+export enum RepositoryConnection {
+  /** Python Package Index (PyPI) */
+  PYTHON = 'public:pypi',
+  /** Node Package Manager (npm) */
+  NPM = 'public:npmjs',
+  /** NuGet Gallery */
+  NUGET = 'public:nuget-org',
+  /** RubyGems */
+  RUBY = 'public:ruby-gems-org',
+  /** Crates.io (Rust) */
+  RUST = 'public:crates-io',
+  /** Maven Central Repository */
+  MAVEN_CENTRAL = 'public:maven-central',
+  /** Gradle Plugins */
+  GRADLE_PLUGINS = 'public:gradle-plugins',
+  /** Maven Google */
+  MAVEN_GOOGLE = 'public:maven-google',
+  /** Maven Apache */
+  MAVEN_APACHE = 'public:maven-apache',
+  /** Maven Atlassian */
+  MAVEN_ATLASSIAN = 'public:maven-atlassian',
+  /** Maven Eclipse */
+  MAVEN_ECLIPSE = 'public:maven-eclipse',
+  /** Maven JBoss */
+  MAVEN_JBOSS = 'public:maven-jboss',
+  /** Maven Spring */
+  MAVEN_SPRING = 'public:maven-spring',
+  /** Maven Spring Plugins */
+  MAVEN_SPRING_PLUGINS = 'public:maven-spring-plugins',
+}
+
+/**
+ * Represents an CodeArtifact Repository
+ */
+export interface IRepository extends IResource {
+  /**
+   * The ARN of the repository
+   *
+   * @attribute
+   */
+  readonly repositoryArn: string;
+
+  /**
+   * The name of the repository
+   *
+   * @attribute
+   */
+  readonly repositoryName: string;
+
+  /**
+   * The domain that contains the repository
+   *
+   * @attribute
+   */
+  readonly repositoryDomainName: string;
+
+  /**
+   * The domain owner of the repository
+   *
+   * @attribute
+   */
+  readonly repositoryDomainOwner: string;
+
+  /**
+   * The domain that contains the repository
+   *
+   */
+  readonly domain: IDomain;
+
+  /**
+   * Adds a statement to the CodeArtifact repository resource policy.
+   *
+   * @param statement The policy statement to add
+   */
+  addToResourcePolicy(statement: PolicyStatement): AddToResourcePolicyResult;
+
+  /**
+   * Grants the given principal identity permissions to perform the actions on the repository.
+   *
+   * @param grantee The principal to grant permissions to
+   * @param actions The actions to grant
+   */
+  grant(grantee: IGrantable, ...actions: string[]): Grant;
+
+  /**
+   * Grants the given principal identity permissions to perform the actions on the repository.
+   *
+   * @param grantee The principal to grant permissions to
+   */
+  grantReadAndPublish(grantee: IGrantable): Grant;
+
+  /**
+   * Grants the given principal identity permissions to perform the actions on the repository.
+   *
+   * @param grantee The principal to grant permissions to
+   */
+  grantRead(grantee: IGrantable): Grant;
+}
+
+/**
+ * Properties for creating a new CodeArtifact repository.
+ *
+ */
+export interface RepositoryProps {
+  /**
+   * The name of the repository
+   *
+   * @default - A name is automatically generated
+   */
+  readonly repositoryName?: string;
+  /**
+   * The domain that contains the repository
+   */
+  readonly domain: IDomain;
+  /**
+   * The description of the repository
+   *
+   * @default - No description
+   */
+  readonly description?: string;
+  /**
+   * The connections to external repositories (like npmjs, pypi, etc.)
+   *
+   * You can use the AWS CLI to connect your CodeArtifact repository to an external repository by adding an external connection directly to the repository.
+   * This will allow users connected to the CodeArtifact repository, or any of its downstream repositories, to fetch packages from the configured external repository.
+   * Each CodeArtifact repository can only have one external connection.
+   *
+   * @default - No external connections
+   */
+  readonly externalConnection?: RepositoryConnection;
+  /**
+   * A list of upstream Codeartifact repositories to associate with the repository.
+   * The order of the upstream repositories in the list determines their priority order when CodeArtifact looks for a requested package version.
+   * see https://docs.aws.amazon.com/codeartifact/latest/ug/repo-upstream-behavior.html#package-retention-intermediate-repositories
+   *
+   * @default - No upstream repositories
+   */
+  readonly upstreams?: IRepository[];
+}
+
+/**
+ * A new or imported Codeartifact Repository.
+ */
+abstract class RepositoryBase extends Resource implements IRepository {
+  /**
+   * The ARN of the repository
+   */
+  public abstract readonly repositoryArn: string;
+  /**
+   * The name of the repository
+   */
+  public abstract readonly repositoryName: string;
+  /**
+   * The domain that contains the repository
+   */
+  public abstract readonly repositoryDomainName: string;
+  /**
+   * The domain owner of the repository
+   */
+  public abstract readonly repositoryDomainOwner: string;
+  /**
+   * The domain that contains the repository
+   */
+  public abstract readonly domain: IDomain;
+
+  protected abstract policy?: PolicyDocument;
+
+  private isCrossEnvironmentGrantee(grantee: IGrantable): boolean {
+    if (!principalIsOwnedResource(grantee.grantPrincipal)) {
+      return false;
+    }
+    const thisStack = Stack.of(this);
+    const identityStack = Stack.of(grantee.grantPrincipal);
+    return (
+      Token.compareStrings(thisStack.region, identityStack.region) === TokenComparison.DIFFERENT ||
+      Token.compareStrings(thisStack.account, identityStack.account) === TokenComparison.DIFFERENT
+    );
+  }
+
+  /**
+   * Adds a statement to the CodeArtifact repository resource policy.
+   * @param statement The policy statement to add
+   */
+  public addToResourcePolicy(statement: PolicyStatement): AddToResourcePolicyResult {
+    if (!Resource.isOwnedResource(this)) {
+      Annotations.of(this).addWarningV2(
+        'NoResourcePolicyStatementAdded',
+        `No statements added to imported resource ${this.repositoryArn}.`,
+      );
+      return { statementAdded: false };
+    }
+
+    if (!this.policy) {
+      this.policy = new PolicyDocument();
+    }
+    this.policy.addStatements(statement);
+    return { statementAdded: true, policyDependable: this.policy };
+  }
+
+  /**
+   * Grants permissions to the specified grantee on this CodeArtifact repository.
+   *
+   * @param grantee The principal to grant permissions to
+   * @param actions The actions to grant
+   */
+  public grant(grantee: IGrantable, ...actions: string[]): Grant {
+    const crossEnvironment = this.isCrossEnvironmentGrantee(grantee);
+    const grantOptions: GrantWithResourceOptions = {
+      grantee,
+      actions,
+      resource: this,
+      resourceArns: [this.repositoryArn],
+      resourceSelfArns: crossEnvironment ? undefined : ['*'],
+    };
+    if (!crossEnvironment) {
+      return Grant.addToPrincipalOrResource(grantOptions);
+    } else {
+      return Grant.addToPrincipalAndResource({
+        ...grantOptions,
+        resourceArns: [this.repositoryArn],
+        resourcePolicyPrincipal: grantee.grantPrincipal,
+      });
+    }
+  }
+
+  /**
+   * Grants read permissions to the specified grantee on this CodeArtifact repository.
+   *
+   * @param grantee The principal to grant read permissions to
+   */
+  public grantRead(grantee: IGrantable) {
+    return this.grant(grantee, ...READ_ACTIONS);
+  }
+
+  /**
+   * Grants read and publish permissions to the specified grantee on this CodeArtifact repository.
+   *
+   * @param grantee The principal to grant read and publish permissions to
+   */
+  public grantReadAndPublish(grantee: IGrantable) {
+    return this.grant(grantee, ...READ_ACTIONS, ...PUBLISH_ACTIONS);
+  }
+}
+
+/**
+ * Represents the attributes of an existing CodeArtifact repository.
+ */
+export interface RepositoryAttributes {
+  /**
+   * The ARN (Amazon Resource Name) of the CodeArtifact repository.
+   */
+  readonly repositoryArn: string;
+  /**
+   * The name of the CodeArtifact repository.
+   */
+  readonly repositoryName: string;
+  /**
+   * The CodeArtifact domain associated with this repository.
+   */
+  readonly domain: IDomain;
+}
+
+/**
+ * Deploys a CodeArtifact repository
+ */
+export class Repository extends RepositoryBase implements IRepository {
+  /**
+   * Creates an IRepository object from existing repository attributes.
+   *
+   * @param scope - The parent construct in which to create this repository reference.
+   * @param id - The identifier of the construct.
+   * @param attrs - The attributes of the repository to import.
+   */
+  public static fromRepositoryAttributes(scope: Construct, id: string, attrs: RepositoryAttributes): IRepository {
+    class Import extends RepositoryBase {
+      public readonly repositoryArn = attrs.repositoryArn;
+      public readonly repositoryName = attrs.repositoryName;
+      public readonly repositoryDomainName = attrs.domain.domainName;
+      public readonly repositoryDomainOwner = attrs.domain.domainOwner;
+      public readonly domain = attrs.domain;
+      protected readonly policy?: PolicyDocument;
+    }
+
+    return new Import(scope, id);
+  }
+
+  /**
+   * Creates an IRepository object from an existing repository ARN.
+   *
+   * @param scope - The parent construct in which to create this repository reference.
+   * @param id - The identifier of the construct.
+   * @param repositoryArn - The ARN of the repository to import.
+   */
+  public static fromRepositoryArn(scope: Construct, id: string, repositoryArn: string): IRepository {
+    const repositoryResourceArnParts = Stack.of(scope).splitArn(repositoryArn, ArnFormat.SLASH_RESOURCE_NAME);
+    if (
+      repositoryResourceArnParts.resource !== 'repository' ||
+      repositoryResourceArnParts.account === '' ||
+      repositoryResourceArnParts.resourceName === undefined
+    ) {
+      throw new Error(`Expected a repository ARN, but got ${repositoryArn}`);
+    }
+    const repositoryNameParts = repositoryResourceArnParts.resourceName.split('/');
+    if (repositoryNameParts.length !== 2) {
+      throw new Error(
+        `Expected a repository ARN with a domain and repository name (arn:aws:codeartifact:region-ID:account-ID:repository/my_domain/my_repo), but got ${repositoryArn}`,
+      );
+    }
+    const domainName = repositoryNameParts[0];
+    const repositoryName = repositoryNameParts[1];
+
+    const domain = Domain.fromDomainArn(
+      scope,
+      'Domain',
+      Stack.of(scope).formatArn({
+        resource: 'domain',
+        service: 'codeartifact',
+        resourceName: domainName,
+      }),
+    );
+
+    return Repository.fromRepositoryAttributes(scope, id, {
+      repositoryArn: repositoryArn,
+      repositoryName: repositoryName,
+      domain,
+    });
+  }
+
+  /**
+   * (internal) The CloudFormation resource representing this CodeArtifact repository.
+   */
+  protected cfnResource: CfnRepository;
+  /**
+   * The properties used to create the CloudFormation resource for this repository.
+   */
+  protected cfnResourceProps: CfnRepositoryProps;
+
+  /**
+   * The ARN (Amazon Resource Name) of this CodeArtifact repository.
+   */
+  readonly repositoryArn: string;
+  /**
+   * The name of this CodeArtifact repository.
+   */
+  readonly repositoryName: string;
+  /**
+   * The domain that contains this repository.
+   */
+  readonly repositoryDomainName: string;
+  /**
+   * The domain owner of this repository.
+   */
+  readonly repositoryDomainOwner: string;
+  /**
+   * The domain that contains this repository.
+   */
+  readonly domain: IDomain;
+  protected readonly policy?: PolicyDocument;
+  protected readonly upstreams: IRepository[];
+
+  constructor(scope: Construct, id: string, props: RepositoryProps) {
+    super(scope, id);
+
+    this.upstreams = props.upstreams ?? [];
+
+    this.cfnResourceProps = {
+      domainName: props.domain.domainName,
+      repositoryName:
+        props.repositoryName ??
+        Lazy.string({
+          produce: () => Names.uniqueResourceName(this, { maxLength: 100 }),
+        }),
+      description: props.description,
+      domainOwner: props.domain.domainOwner,
+      externalConnections: props.externalConnection !== undefined ? [props.externalConnection] : undefined, // only 1 allowed
+      permissionsPolicyDocument: Lazy.any({ produce: () => this.policy?.toJSON() }),
+      upstreams: Lazy.list({ produce: () => this.renderUpstreams() }, { omitEmpty: true }),
+    };
+
+    this.cfnResource = this.createResource(this, 'Resource');
+
+    this.repositoryArn = this.cfnResource.attrArn;
+    this.repositoryName = this.cfnResource.attrName;
+    this.repositoryDomainName = this.cfnResource.attrDomainName;
+    this.repositoryDomainOwner = this.cfnResource.attrDomainOwner;
+
+    this.domain = Domain.fromDomainArn(
+      this,
+      'Domain',
+      Stack.of(this).formatArn({
+        resource: 'domain',
+        service: 'codeartifact',
+        account: this.repositoryDomainOwner,
+        resourceName: this.repositoryDomainName,
+      }),
+    );
+  }
+
+  protected createResource(scope: Construct, id: string): CfnRepository {
+    return new CfnRepository(scope, id, this.cfnResourceProps);
+  }
+
+  protected renderUpstreams(): string[] {
+    return this.upstreams.map(repo => repo.repositoryName);
+  }
+}
diff --git a/src/index.ts b/src/index.ts
index f08201b..28e99b7 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -1,5 +1,6 @@
 // Export constructs here
 export * as aws_cur from './aws-cur';
 export * as aws_ec2 from './aws-ec2';
+export * as aws_codeartifact from './aws-codeartifact';
 export * as aws_fsx from './aws-fsx';
 export * as aws_redshiftserverless from './aws-redshiftserverless';


Test patch:
diff --git a/test/aws-codeartifact/domain.test.ts b/test/aws-codeartifact/domain.test.ts
new file mode 100644
index 0000000..8bb156f
--- /dev/null
+++ b/test/aws-codeartifact/domain.test.ts
@@ -0,0 +1,105 @@
+import { Stack, Tags } from 'aws-cdk-lib';
+import { Match, Template } from 'aws-cdk-lib/assertions';
+import { AccountPrincipal } from 'aws-cdk-lib/aws-iam';
+import { Key } from 'aws-cdk-lib/aws-kms';
+import { Domain } from '../../src/aws-codeartifact';
+
+let stack: Stack;
+
+beforeEach(() => {
+  stack = testStack();
+});
+
+test('Domain: Instantiation works and defaults are adhered to', () => {
+  // WHEN
+  const domain = new Domain(stack, 'domain', {
+    domainName: 'dummy',
+  });
+  Tags.of(domain).add('tag1', 'value1');
+
+  Template.fromStack(stack).hasResource('AWS::CodeArtifact::Domain', {
+    Properties: {
+      DomainName: 'dummy',
+      EncryptionKey: Match.absent(),
+      PermissionsPolicyDocument: Match.absent(),
+      Tags: [{ Key: 'tag1', Value: 'value1' }],
+    },
+  });
+});
+
+test('Domain: Can use provided key', () => {
+  // WHEN
+  const key = new Key(stack, 'key');
+  const domain = new Domain(stack, 'domain', {
+    domainName: 'dummy',
+    encryptionKey: key,
+  });
+  Tags.of(domain).add('tag1', 'value1');
+
+  Template.fromStack(stack).hasResource('AWS::CodeArtifact::Domain', {
+    Properties: {
+      DomainName: 'dummy',
+      EncryptionKey: {
+        'Fn::GetAtt': ['keyFEDD6EC0', 'Arn'],
+      },
+      PermissionsPolicyDocument: Match.absent(),
+      Tags: [{ Key: 'tag1', Value: 'value1' }],
+    },
+  });
+});
+
+test('Domain: Can import Domain', () => {
+  // WHEN
+  const domain = Domain.fromDomainArn(stack, 'domain', 'arn:aws:codeartifact:us-east-1:12345:domain/dummy');
+
+  expect(domain.domainArn).toEqual('arn:aws:codeartifact:us-east-1:12345:domain/dummy');
+  expect(domain.domainName).toEqual('dummy');
+  expect(domain.encryptionKey).toBeUndefined();
+  expect(domain.domainOwner).toEqual('12345');
+});
+
+test('Domain: can grant access', () => {
+  // GIVEN
+  const domain = new Domain(stack, 'domain', {
+    domainName: 'dummy',
+  });
+  const principal = new AccountPrincipal('123456789012');
+  // WHEN
+  domain.grantContribute(principal);
+
+  Template.fromStack(stack).hasResource('AWS::CodeArtifact::Domain', {
+    Properties: {
+      DomainName: 'dummy',
+      EncryptionKey: Match.absent(),
+      PermissionsPolicyDocument: {
+        Statement: [
+          {
+            Action: [
+              'codeartifact:CreateRepository',
+              'codeartifact:DescribeDomain',
+              'codeartifact:GetAuthorizationToken',
+              'codeartifact:GetDomainPermissionsPolicy',
+              'codeartifact:ListRepositoriesInDomain',
+              'sts:GetServiceBearerToken',
+            ],
+            Effect: 'Allow',
+            Principal: {
+              AWS: {
+                'Fn::Join': ['', ['arn:', { Ref: 'AWS::Partition' }, ':iam::123456789012:root']],
+              },
+            },
+            Resource: '*',
+          },
+        ],
+        Version: '2012-10-17',
+      },
+      Tags: Match.absent(),
+    },
+  });
+});
+
+function testStack() {
+  const newTestStack = new Stack(undefined, undefined, { env: { account: '12345', region: 'us-test-1' } });
+  newTestStack.node.setContext('availability-zones:12345:us-test-1', ['us-test-1a', 'us-test-1b']);
+  return newTestStack;
+}
diff --git a/test/aws-codeartifact/integ.codeartifact.ts b/test/aws-codeartifact/integ.codeartifact.ts
new file mode 100644
index 0000000..69fe796
--- /dev/null
+++ b/test/aws-codeartifact/integ.codeartifact.ts
@@ -0,0 +1,27 @@
+import { IntegTest } from '@aws-cdk/integ-tests-alpha';
+import * as cdk from 'aws-cdk-lib';
+import { Construct } from 'constructs';
+import * as ocf from '../../src';
+
+class CodeArtifactStack extends cdk.Stack {
+  constructor(scope: Construct) {
+    super(scope, 'CodeArtifactDomainAndRepository');
+
+    const domain = new ocf.aws_codeartifact.Domain(this, 'domain', {
+      domainName: 'test-domain',
+    });
+
+    new ocf.aws_codeartifact.Repository(this, 'repository', {
+      domain,
+      repositoryName: 'repo1',
+    });
+  }
+}
+
+const app = new cdk.App();
+const testCase = new CodeArtifactStack(app);
+new IntegTest(app, 'CodeArtifactDomainAndRepositoryInteg', {
+  testCases: [testCase],
+});
+
+app.synth();
diff --git a/test/aws-codeartifact/integ.codeartifact.ts.snapshot/CodeArtifactDomainAndRepository.assets.json b/test/aws-codeartifact/integ.codeartifact.ts.snapshot/CodeArtifactDomainAndRepository.assets.json
new file mode 100644
index 0000000..a6322b2
--- /dev/null
+++ b/test/aws-codeartifact/integ.codeartifact.ts.snapshot/CodeArtifactDomainAndRepository.assets.json
@@ -0,0 +1,19 @@
+{
+  "version": "36.0.0",
+  "files": {
+    "d7f06cae3ee8a4bbe39e606a1874c7a4241b88c1eef5bef6aea676c794e33b65": {
+      "source": {
+        "path": "CodeArtifactDomainAndRepository.template.json",
+        "packaging": "file"
+      },
+      "destinations": {
+        "current_account-current_region": {
+          "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}",
+          "objectKey": "d7f06cae3ee8a4bbe39e606a1874c7a4241b88c1eef5bef6aea676c794e33b65.json",
+          "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}"
+        }
+      }
+    }
+  },
+  "dockerImages": {}
+}
\ No newline at end of file
diff --git a/test/aws-codeartifact/integ.codeartifact.ts.snapshot/CodeArtifactDomainAndRepository.template.json b/test/aws-codeartifact/integ.codeartifact.ts.snapshot/CodeArtifactDomainAndRepository.template.json
new file mode 100644
index 0000000..f1e13f0
--- /dev/null
+++ b/test/aws-codeartifact/integ.codeartifact.ts.snapshot/CodeArtifactDomainAndRepository.template.json
@@ -0,0 +1,62 @@
+{
+ "Resources": {
+  "domainFBFFA2F6": {
+   "Type": "AWS::CodeArtifact::Domain",
+   "Properties": {
+    "DomainName": "test-domain"
+   }
+  },
+  "repository9F1A3F0B": {
+   "Type": "AWS::CodeArtifact::Repository",
+   "Properties": {
+    "DomainName": {
+     "Fn::GetAtt": [
+      "domainFBFFA2F6",
+      "Name"
+     ]
+    },
+    "DomainOwner": {
+     "Fn::GetAtt": [
+      "domainFBFFA2F6",
+      "Owner"
+     ]
+    },
+    "RepositoryName": "repo1"
+   }
+  }
+ },
+ "Parameters": {
+  "BootstrapVersion": {
+   "Type": "AWS::SSM::Parameter::Value<String>",
+   "Default": "/cdk-bootstrap/hnb659fds/version",
+   "Description": "Version of the CDK Bootstrap resources in this environment, automatically retrieved from SSM Parameter Store. [cdk:skip]"
+  }
+ },
+ "Rules": {
+  "CheckBootstrapVersion": {
+   "Assertions": [
+    {
+     "Assert": {
+      "Fn::Not": [
+       {
+        "Fn::Contains": [
+         [
+          "1",
+          "2",
+          "3",
+          "4",
+          "5"
+         ],
+         {
+          "Ref": "BootstrapVersion"
+         }
+        ]
+       }
+      ]
+     },
+     "AssertDescription": "CDK bootstrap stack version 6 required. Please run 'cdk bootstrap' with a recent version of the CDK CLI."
+    }
+   ]
+  }
+ }
+}
\ No newline at end of file
diff --git a/test/aws-codeartifact/integ.codeartifact.ts.snapshot/CodeArtifactDomainAndRepositoryIntegDefaultTestDeployAssert135F1932.assets.json b/test/aws-codeartifact/integ.codeartifact.ts.snapshot/CodeArtifactDomainAndRepositoryIntegDefaultTestDeployAssert135F1932.assets.json
new file mode 100644
index 0000000..7d2d97f
--- /dev/null
+++ b/test/aws-codeartifact/integ.codeartifact.ts.snapshot/CodeArtifactDomainAndRepositoryIntegDefaultTestDeployAssert135F1932.assets.json
@@ -0,0 +1,19 @@
+{
+  "version": "36.0.0",
+  "files": {
+    "21fbb51d7b23f6a6c262b46a9caee79d744a3ac019fd45422d988b96d44b2a22": {
+      "source": {
+        "path": "CodeArtifactDomainAndRepositoryIntegDefaultTestDeployAssert135F1932.template.json",
+        "packaging": "file"
+      },
+      "destinations": {
+        "current_account-current_region": {
+          "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}",
+          "objectKey": "21fbb51d7b23f6a6c262b46a9caee79d744a3ac019fd45422d988b96d44b2a22.json",
+          "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}"
+        }
+      }
+    }
+  },
+  "dockerImages": {}
+}
\ No newline at end of file
diff --git a/test/aws-codeartifact/integ.codeartifact.ts.snapshot/CodeArtifactDomainAndRepositoryIntegDefaultTestDeployAssert135F1932.template.json b/test/aws-codeartifact/integ.codeartifact.ts.snapshot/CodeArtifactDomainAndRepositoryIntegDefaultTestDeployAssert135F1932.template.json
new file mode 100644
index 0000000..ad9d0fb
--- /dev/null
+++ b/test/aws-codeartifact/integ.codeartifact.ts.snapshot/CodeArtifactDomainAndRepositoryIntegDefaultTestDeployAssert135F1932.template.json
@@ -0,0 +1,36 @@
+{
+ "Parameters": {
+  "BootstrapVersion": {
+   "Type": "AWS::SSM::Parameter::Value<String>",
+   "Default": "/cdk-bootstrap/hnb659fds/version",
+   "Description": "Version of the CDK Bootstrap resources in this environment, automatically retrieved from SSM Parameter Store. [cdk:skip]"
+  }
+ },
+ "Rules": {
+  "CheckBootstrapVersion": {
+   "Assertions": [
+    {
+     "Assert": {
+      "Fn::Not": [
+       {
+        "Fn::Contains": [
+         [
+          "1",
+          "2",
+          "3",
+          "4",
+          "5"
+         ],
+         {
+          "Ref": "BootstrapVersion"
+         }
+        ]
+       }
+      ]
+     },
+     "AssertDescription": "CDK bootstrap stack version 6 required. Please run 'cdk bootstrap' with a recent version of the CDK CLI."
+    }
+   ]
+  }
+ }
+}
\ No newline at end of file
diff --git a/test/aws-codeartifact/integ.codeartifact.ts.snapshot/cdk.out b/test/aws-codeartifact/integ.codeartifact.ts.snapshot/cdk.out
new file mode 100644
index 0000000..1f0068d
--- /dev/null
+++ b/test/aws-codeartifact/integ.codeartifact.ts.snapshot/cdk.out
@@ -0,0 +1,1 @@
+{"version":"36.0.0"}
\ No newline at end of file
diff --git a/test/aws-codeartifact/integ.codeartifact.ts.snapshot/integ.json b/test/aws-codeartifact/integ.codeartifact.ts.snapshot/integ.json
new file mode 100644
index 0000000..44c843b
--- /dev/null
+++ b/test/aws-codeartifact/integ.codeartifact.ts.snapshot/integ.json
@@ -0,0 +1,12 @@
+{
+  "version": "36.0.0",
+  "testCases": {
+    "CodeArtifactDomainAndRepositoryInteg/DefaultTest": {
+      "stacks": [
+        "CodeArtifactDomainAndRepository"
+      ],
+      "assertionStack": "CodeArtifactDomainAndRepositoryInteg/DefaultTest/DeployAssert",
+      "assertionStackName": "CodeArtifactDomainAndRepositoryIntegDefaultTestDeployAssert135F1932"
+    }
+  }
+}
\ No newline at end of file
diff --git a/test/aws-codeartifact/integ.codeartifact.ts.snapshot/manifest.json b/test/aws-codeartifact/integ.codeartifact.ts.snapshot/manifest.json
new file mode 100644
index 0000000..edfad0e
--- /dev/null
+++ b/test/aws-codeartifact/integ.codeartifact.ts.snapshot/manifest.json
@@ -0,0 +1,119 @@
+{
+  "version": "36.0.0",
+  "artifacts": {
+    "CodeArtifactDomainAndRepository.assets": {
+      "type": "cdk:asset-manifest",
+      "properties": {
+        "file": "CodeArtifactDomainAndRepository.assets.json",
+        "requiresBootstrapStackVersion": 6,
+        "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version"
+      }
+    },
+    "CodeArtifactDomainAndRepository": {
+      "type": "aws:cloudformation:stack",
+      "environment": "aws://unknown-account/unknown-region",
+      "properties": {
+        "templateFile": "CodeArtifactDomainAndRepository.template.json",
+        "terminationProtection": false,
+        "validateOnSynth": false,
+        "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-deploy-role-${AWS::AccountId}-${AWS::Region}",
+        "cloudFormationExecutionRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-cfn-exec-role-${AWS::AccountId}-${AWS::Region}",
+        "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/d7f06cae3ee8a4bbe39e606a1874c7a4241b88c1eef5bef6aea676c794e33b65.json",
+        "requiresBootstrapStackVersion": 6,
+        "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version",
+        "additionalDependencies": [
+          "CodeArtifactDomainAndRepository.assets"
+        ],
+        "lookupRole": {
+          "arn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-lookup-role-${AWS::AccountId}-${AWS::Region}",
+          "requiresBootstrapStackVersion": 8,
+          "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version"
+        }
+      },
+      "dependencies": [
+        "CodeArtifactDomainAndRepository.assets"
+      ],
+      "metadata": {
+        "/CodeArtifactDomainAndRepository/domain/Resource": [
+          {
+            "type": "aws:cdk:logicalId",
+            "data": "domainFBFFA2F6"
+          }
+        ],
+        "/CodeArtifactDomainAndRepository/repository/Resource": [
+          {
+            "type": "aws:cdk:logicalId",
+            "data": "repository9F1A3F0B"
+          }
+        ],
+        "/CodeArtifactDomainAndRepository/BootstrapVersion": [
+          {
+            "type": "aws:cdk:logicalId",
+            "data": "BootstrapVersion"
+          }
+        ],
+        "/CodeArtifactDomainAndRepository/CheckBootstrapVersion": [
+          {
+            "type": "aws:cdk:logicalId",
+            "data": "CheckBootstrapVersion"
+          }
+        ]
+      },
+      "displayName": "CodeArtifactDomainAndRepository"
+    },
+    "CodeArtifactDomainAndRepositoryIntegDefaultTestDeployAssert135F1932.assets": {
+      "type": "cdk:asset-manifest",
+      "properties": {
+        "file": "CodeArtifactDomainAndRepositoryIntegDefaultTestDeployAssert135F1932.assets.json",
+        "requiresBootstrapStackVersion": 6,
+        "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version"
+      }
+    },
+    "CodeArtifactDomainAndRepositoryIntegDefaultTestDeployAssert135F1932": {
+      "type": "aws:cloudformation:stack",
+      "environment": "aws://unknown-account/unknown-region",
+      "properties": {
+        "templateFile": "CodeArtifactDomainAndRepositoryIntegDefaultTestDeployAssert135F1932.template.json",
+        "terminationProtection": false,
+        "validateOnSynth": false,
+        "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-deploy-role-${AWS::AccountId}-${AWS::Region}",
+        "cloudFormationExecutionRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-cfn-exec-role-${AWS::AccountId}-${AWS::Region}",
+        "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/21fbb51d7b23f6a6c262b46a9caee79d744a3ac019fd45422d988b96d44b2a22.json",
+        "requiresBootstrapStackVersion": 6,
+        "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version",
+        "additionalDependencies": [
+          "CodeArtifactDomainAndRepositoryIntegDefaultTestDeployAssert135F1932.assets"
+        ],
+        "lookupRole": {
+          "arn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-lookup-role-${AWS::AccountId}-${AWS::Region}",
+          "requiresBootstrapStackVersion": 8,
+          "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version"
+        }
+      },
+      "dependencies": [
+        "CodeArtifactDomainAndRepositoryIntegDefaultTestDeployAssert135F1932.assets"
+      ],
+      "metadata": {
+        "/CodeArtifactDomainAndRepositoryInteg/DefaultTest/DeployAssert/BootstrapVersion": [
+          {
+            "type": "aws:cdk:logicalId",
+            "data": "BootstrapVersion"
+          }
+        ],
+        "/CodeArtifactDomainAndRepositoryInteg/DefaultTest/DeployAssert/CheckBootstrapVersion": [
+          {
+            "type": "aws:cdk:logicalId",
+            "data": "CheckBootstrapVersion"
+          }
+        ]
+      },
+      "displayName": "CodeArtifactDomainAndRepositoryInteg/DefaultTest/DeployAssert"
+    },
+    "Tree": {
+      "type": "cdk:tree",
+      "properties": {
+        "file": "tree.json"
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git a/test/aws-codeartifact/integ.codeartifact.ts.snapshot/tree.json b/test/aws-codeartifact/integ.codeartifact.ts.snapshot/tree.json
new file mode 100644
index 0000000..48f940f
--- /dev/null
+++ b/test/aws-codeartifact/integ.codeartifact.ts.snapshot/tree.json
@@ -0,0 +1,169 @@
+{
+  "version": "tree-0.1",
+  "tree": {
+    "id": "App",
+    "path": "",
+    "children": {
+      "CodeArtifactDomainAndRepository": {
+        "id": "CodeArtifactDomainAndRepository",
+        "path": "CodeArtifactDomainAndRepository",
+        "children": {
+          "domain": {
+            "id": "domain",
+            "path": "CodeArtifactDomainAndRepository/domain",
+            "children": {
+              "Resource": {
+                "id": "Resource",
+                "path": "CodeArtifactDomainAndRepository/domain/Resource",
+                "attributes": {
+                  "aws:cdk:cloudformation:type": "AWS::CodeArtifact::Domain",
+                  "aws:cdk:cloudformation:props": {
+                    "domainName": "test-domain"
+                  }
+                },
+                "constructInfo": {
+                  "fqn": "aws-cdk-lib.aws_codeartifact.CfnDomain",
+                  "version": "2.120.0"
+                }
+              }
+            },
+            "constructInfo": {
+              "fqn": "aws-cdk-lib.Resource",
+              "version": "2.120.0"
+            }
+          },
+          "repository": {
+            "id": "repository",
+            "path": "CodeArtifactDomainAndRepository/repository",
+            "children": {
+              "Resource": {
+                "id": "Resource",
+                "path": "CodeArtifactDomainAndRepository/repository/Resource",
+                "attributes": {
+                  "aws:cdk:cloudformation:type": "AWS::CodeArtifact::Repository",
+                  "aws:cdk:cloudformation:props": {
+                    "domainName": {
+                      "Fn::GetAtt": [
+                        "domainFBFFA2F6",
+                        "Name"
+                      ]
+                    },
+                    "domainOwner": {
+                      "Fn::GetAtt": [
+                        "domainFBFFA2F6",
+                        "Owner"
+                      ]
+                    },
+                    "repositoryName": "repo1"
+                  }
+                },
+                "constructInfo": {
+                  "fqn": "aws-cdk-lib.aws_codeartifact.CfnRepository",
+                  "version": "2.120.0"
+                }
+              },
+              "Domain": {
+                "id": "Domain",
+                "path": "CodeArtifactDomainAndRepository/repository/Domain",
+                "constructInfo": {
+                  "fqn": "aws-cdk-lib.Resource",
+                  "version": "2.120.0"
+                }
+              }
+            },
+            "constructInfo": {
+              "fqn": "aws-cdk-lib.Resource",
+              "version": "2.120.0"
+            }
+          },
+          "BootstrapVersion": {
+            "id": "BootstrapVersion",
+            "path": "CodeArtifactDomainAndRepository/BootstrapVersion",
+            "constructInfo": {
+              "fqn": "aws-cdk-lib.CfnParameter",
+              "version": "2.120.0"
+            }
+          },
+          "CheckBootstrapVersion": {
+            "id": "CheckBootstrapVersion",
+            "path": "CodeArtifactDomainAndRepository/CheckBootstrapVersion",
+            "constructInfo": {
+              "fqn": "aws-cdk-lib.CfnRule",
+              "version": "2.120.0"
+            }
+          }
+        },
+        "constructInfo": {
+          "fqn": "aws-cdk-lib.Stack",
+          "version": "2.120.0"
+        }
+      },
+      "CodeArtifactDomainAndRepositoryInteg": {
+        "id": "CodeArtifactDomainAndRepositoryInteg",
+        "path": "CodeArtifactDomainAndRepositoryInteg",
+        "children": {
+          "DefaultTest": {
+            "id": "DefaultTest",
+            "path": "CodeArtifactDomainAndRepositoryInteg/DefaultTest",
+            "children": {
+              "Default": {
+                "id": "Default",
+                "path": "CodeArtifactDomainAndRepositoryInteg/DefaultTest/Default",
+                "constructInfo": {
+                  "fqn": "constructs.Construct",
+                  "version": "10.3.0"
+                }
+              },
+              "DeployAssert": {
+                "id": "DeployAssert",
+                "path": "CodeArtifactDomainAndRepositoryInteg/DefaultTest/DeployAssert",
+                "children": {
+                  "BootstrapVersion": {
+                    "id": "BootstrapVersion",
+                    "path": "CodeArtifactDomainAndRepositoryInteg/DefaultTest/DeployAssert/BootstrapVersion",
+                    "constructInfo": {
+                      "fqn": "aws-cdk-lib.CfnParameter",
+                      "version": "2.120.0"
+                    }
+                  },
+                  "CheckBootstrapVersion": {
+                    "id": "CheckBootstrapVersion",
+                    "path": "CodeArtifactDomainAndRepositoryInteg/DefaultTest/DeployAssert/CheckBootstrapVersion",
+                    "constructInfo": {
+                      "fqn": "aws-cdk-lib.CfnRule",
+                      "version": "2.120.0"
+                    }
+                  }
+                },
+                "constructInfo": {
+                  "fqn": "aws-cdk-lib.Stack",
+                  "version": "2.120.0"
+                }
+              }
+            },
+            "constructInfo": {
+              "fqn": "@aws-cdk/integ-tests-alpha.IntegTestCase",
+              "version": "2.120.0-alpha.0"
+            }
+          }
+        },
+        "constructInfo": {
+          "fqn": "@aws-cdk/integ-tests-alpha.IntegTest",
+          "version": "2.120.0-alpha.0"
+        }
+      },
+      "Tree": {
+        "id": "Tree",
+        "path": "Tree",
+        "constructInfo": {
+          "fqn": "constructs.Construct",
+          "version": "10.3.0"
+        }
+      }
+    },
+    "constructInfo": {
+      "fqn": "aws-cdk-lib.App",
+      "version": "2.120.0"
+    }
+  }
+}
\ No newline at end of file
diff --git a/test/aws-codeartifact/repository.test.ts b/test/aws-codeartifact/repository.test.ts
new file mode 100644
index 0000000..f989b2b
--- /dev/null
+++ b/test/aws-codeartifact/repository.test.ts
@@ -0,0 +1,200 @@
+import { Stack, Tags } from 'aws-cdk-lib';
+import { Match, Template } from 'aws-cdk-lib/assertions';
+import { AccountPrincipal, Role, ServicePrincipal } from 'aws-cdk-lib/aws-iam';
+import { Construct } from 'constructs';
+import { Domain, Repository } from '../../src/aws-codeartifact';
+
+let stack: Stack;
+let domain: Domain;
+
+beforeEach(() => {
+  stack = testStack();
+  domain = new Domain(stack, 'domain', { domainName: 'dummy-domain' });
+});
+
+describe('Repository.fromRepositoryArn', () => {
+  let scope: Construct;
+
+  beforeEach(() => {
+    scope = new Construct(stack, 'Scope');
+  });
+
+  it('should create a repository from a valid ARN', () => {
+    const validArn = 'arn:aws:codeartifact:us-west-2:123456789012:repository/my-domain/my-repo';
+    expect(() => {
+      Repository.fromRepositoryArn(scope, 'ValidRepo', validArn);
+    }).not.toThrow();
+  });
+
+  it('should throw an error for an ARN with incorrect resource type', () => {
+    const invalidArn = 'arn:aws:codeartifact:us-west-2:123456789012:not-a-repository/my-domain/my-repo';
+    expect(() => {
+      Repository.fromRepositoryArn(scope, 'InvalidRepo', invalidArn);
+    }).toThrow('Expected a repository ARN, but got');
+  });
+
+  it('should throw an error for an ARN without an account', () => {
+    const invalidArn = 'arn:aws:codeartifact:us-west-2::repository/my-domain/my-repo';
+    expect(() => {
+      Repository.fromRepositoryArn(scope, 'InvalidRepo', invalidArn);
+    }).toThrow('Expected a repository ARN, but got');
+  });
+
+  it('should throw an error for an ARN without a resource name', () => {
+    const invalidArn = 'arn:aws:codeartifact:us-west-2:123456789012:repository';
+    expect(() => {
+      Repository.fromRepositoryArn(scope, 'InvalidRepo', invalidArn);
+    }).toThrow('Expected a repository ARN, but got');
+  });
+
+  it('should throw an error for an ARN with incorrect resource name format', () => {
+    const invalidArn = 'arn:aws:codeartifact:us-west-2:123456789012:repository/my-repo';
+    expect(() => {
+      Repository.fromRepositoryArn(scope, 'InvalidRepo', invalidArn);
+    }).toThrow('Expected a repository ARN with a domain and repository name');
+  });
+
+  it('should throw an error for an ARN with too many parts in the resource name', () => {
+    const invalidArn = 'arn:aws:codeartifact:us-west-2:123456789012:repository/my-domain/my-repo/extra-part';
+    expect(() => {
+      Repository.fromRepositoryArn(scope, 'InvalidRepo', invalidArn);
+    }).toThrow('Expected a repository ARN with a domain and repository name');
+  });
+});
+
+test('repository: Instantiation works and defaults are adhered to', () => {
+  // WHEN
+
+  const repository = new Repository(stack, 'repository', {
+    repositoryName: 'dummy-repo',
+    domain: domain,
+  });
+  Tags.of(repository).add('tag1', 'value1');
+
+  Template.fromStack(stack).hasResource('AWS::CodeArtifact::Repository', {
+    Properties: {
+      RepositoryName: 'dummy-repo',
+      DomainName: { 'Fn::GetAtt': ['domainFBFFA2F6', 'Name'] },
+      DomainOwner: { 'Fn::GetAtt': ['domainFBFFA2F6', 'Owner'] },
+      PermissionsPolicyDocument: Match.absent(),
+      Tags: [{ Key: 'tag1', Value: 'value1' }],
+    },
+  });
+});
+
+test('repository: can grant access', () => {
+  // GIVEN
+  const repository = new Repository(stack, 'repository', {
+    repositoryName: 'dummy-repo',
+    domain,
+  });
+  const principal = new AccountPrincipal('123456789012');
+  // WHEN
+  repository.grantRead(principal);
+
+  Template.fromStack(stack).hasResource('AWS::CodeArtifact::Repository', {
+    Properties: {
+      RepositoryName: 'dummy-repo',
+      DomainName: { 'Fn::GetAtt': ['domainFBFFA2F6', 'Name'] },
+      DomainOwner: { 'Fn::GetAtt': ['domainFBFFA2F6', 'Owner'] },
+      PermissionsPolicyDocument: {
+        Statement: [
+          {
+            Action: [
+              'codeartifact:DescribePackageVersion',
+              'codeartifact:DescribeRepository',
+              'codeartifact:GetPackageVersionReadme',
+              'codeartifact:GetRepositoryEndpoint',
+              'codeartifact:ListPackageVersionAssets',
+              'codeartifact:ListPackageVersionDependencies',
+              'codeartifact:ListPackageVersions',
+              'codeartifact:ListPackages',
+              'codeartifact:ReadFromRepository',
+            ],
+            Effect: 'Allow',
+            Principal: {
+              AWS: {
+                'Fn::Join': ['', ['arn:', { Ref: 'AWS::Partition' }, ':iam::123456789012:root']],
+              },
+            },
+            Resource: '*',
+          },
+        ],
+        Version: '2012-10-17',
+      },
+      Tags: Match.absent(),
+    },
+  });
+});
+
+test('repository: can add upstream repos', () => {
+  // GIVEN
+  const upstreamA = new Repository(stack, 'upstreamA', {
+    repositoryName: 'upstreamA',
+    domain,
+  });
+  const upstreamB = new Repository(stack, 'upstreamB', {
+    repositoryName: 'upstreamB',
+    domain,
+  });
+  // WHEN
+  new Repository(stack, 'repository', {
+    repositoryName: 'dummy-repo',
+    domain,
+    upstreams: [upstreamA, upstreamB],
+  });
+  // THEN
+  Template.fromStack(stack).hasResource('AWS::CodeArtifact::Repository', {
+    Properties: {
+      RepositoryName: 'dummy-repo',
+      DomainName: { 'Fn::GetAtt': ['domainFBFFA2F6', 'Name'] },
+      DomainOwner: { 'Fn::GetAtt': ['domainFBFFA2F6', 'Owner'] },
+      PermissionsPolicyDocument: Match.absent(),
+      Upstreams: [{ 'Fn::GetAtt': ['upstreamA899206B0', 'Name'] }, { 'Fn::GetAtt': ['upstreamBC1546A27', 'Name'] }],
+      Tags: Match.absent(),
+    },
+  });
+});
+
+test('Can import repository and grantRead to a same account principal', () => {
+  // GIVEN
+  const repoArn = 'arn:aws:codeartifact:us-west-2:123456789012:repository/my-domain/my-repo';
+  const importedRepo = Repository.fromRepositoryArn(stack, 'ImportedRepo', repoArn);
+  const functionRole = new Role(stack, 'FunctionRole', {
+    assumedBy: new ServicePrincipal('lambda.amazonaws.com'),
+  });
+  // WHEN
+  importedRepo.grantRead(functionRole);
+  // THEN
+  Template.fromStack(stack).hasResource('AWS::IAM::Policy', {
+    Properties: {
+      PolicyDocument: {
+        Statement: [
+          {
+            Action: [
+              'codeartifact:DescribePackageVersion',
+              'codeartifact:DescribeRepository',
+              'codeartifact:GetPackageVersionReadme',
+              'codeartifact:GetRepositoryEndpoint',
+              'codeartifact:ListPackageVersionAssets',
+              'codeartifact:ListPackageVersionDependencies',
+              'codeartifact:ListPackageVersions',
+              'codeartifact:ListPackages',
+              'codeartifact:ReadFromRepository',
+            ],
+            Effect: 'Allow',
+            Resource: repoArn,
+          },
+        ],
+        Version: '2012-10-17',
+      },
+      Roles: [{ Ref: 'FunctionRole111A5701' }],
+    },
+  });
+});
+
+function testStack() {
+  const newTestStack = new Stack(undefined, undefined, { env: { account: '12345', region: 'us-test-1' } });
+  newTestStack.node.setContext('availability-zones:12345:us-test-1', ['us-test-1a', 'us-test-1b']);
+  return newTestStack;
+}