Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions .changeset/late-socks-accept.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
---
"@macalinao/codama-instruction-accounts-dedupe-visitor": patch
"@macalinao/codama-nodes-from-anchor-x": patch
"@macalinao/codama-renderers-markdown": patch
"@macalinao/codama-renderers-js-esm": patch
"@macalinao/codama-rename-visitor": patch
"@macalinao/clients-kamino-lending": patch
"coda-docs": patch
---

Update readmes
11 changes: 11 additions & 0 deletions .changeset/slow-tables-dance.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
---
"@macalinao/codama-instruction-accounts-dedupe-visitor": patch
"@macalinao/codama-nodes-from-anchor-x": patch
"@macalinao/codama-renderers-markdown": patch
"@macalinao/codama-renderers-js-esm": patch
"@macalinao/codama-rename-visitor": patch
"@macalinao/clients-kamino-lending": patch
"coda-docs": patch
---

Update docs and readmes
5 changes: 5 additions & 0 deletions .changeset/tasty-states-camp.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@macalinao/clients-kamino-lending": minor
---

Add an index.ts
12 changes: 12 additions & 0 deletions .changeset/tasty-taxes-fly.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
---
"@macalinao/codama-instruction-accounts-dedupe-visitor": patch
"@macalinao/codama-nodes-from-anchor-x": patch
"@macalinao/codama-renderers-markdown": patch
"@macalinao/codama-renderers-js-esm": patch
"@macalinao/codama-rename-visitor": patch
"@macalinao/clients-kamino-lending": patch
"@macalinao/coda": patch
"coda-docs": patch
---

docs
4 changes: 2 additions & 2 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co

## Project Overview

Coda is an automated client generation tool for Solana programs. Built on top of [Codama](https://github.com/codama-idl/codama), Coda provides a zero-config CLI that transforms Anchor IDLs into modern TypeScript clients with full type safety and ES modules support.
Coda is an automated client generation tool for Solana programs. Built on top of [Codama](https://github.com/codama-idl/codama), Coda provides a CLI that transforms Anchor IDLs into modern TypeScript clients with full type safety and ES modules support.

The monorepo contains:
- **Coda CLI** - The main tool for generating TypeScript clients from Anchor IDLs
Expand Down Expand Up @@ -71,7 +71,7 @@ coda/
## Core Packages

### 1. **@macalinao/coda** - CLI for client generation
- Zero-config by default (looks for `./idls/*.json`)
- Works out of the box (looks for `./idls/*.json` by default)
- Configurable via `coda.config.mjs`
- Generates TypeScript clients with full type safety
- Built on Codama for extensibility
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ Automated client generation for Solana programs.
<a href="https://www.npmjs.com/package/@macalinao/coda"><img src="https://img.shields.io/npm/dm/@macalinao/coda?color=377CC0" /></a>
</p>

Coda automatically generates type-safe TypeScript clients from your Anchor IDLs. Built on [Codama](https://github.com/codama-idl/codama), it provides a zero-config CLI that transforms Anchor IDLs into modern TypeScript clients with full type safety and ES modules support.
Coda automatically generates type-safe TypeScript clients from your Anchor IDLs. Built on [Codama](https://github.com/codama-idl/codama), it provides a CLI that transforms Anchor IDLs into modern TypeScript clients with full type safety and ES modules support.

## Documentation

Expand Down
2 changes: 1 addition & 1 deletion apps/docs/content/docs/configuration.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ title: Configuration
description: Customize Coda generation with coda.config.mjs
---

Coda works zero-config out of the box, but you can customize its behavior with a `coda.config.mjs` file.
Coda works out of the box with sensible defaults, but you can customize its behavior with a `coda.config.mjs` file.

## Initialize Configuration

Expand Down
3 changes: 1 addition & 2 deletions apps/docs/content/docs/meta.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,8 @@
"generating-clients",
"generating-docs",
"examples",
"---Packages---",
"packages",
"---Reference---",
"packages",
"api"
]
}
124 changes: 111 additions & 13 deletions apps/docs/content/docs/packages/coda.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ title: "@macalinao/coda"
description: The main CLI tool for automated client generation from Solana IDLs
---

The core Coda package provides a zero-config CLI that transforms Anchor IDLs into modern TypeScript clients with full type safety and ES modules support.
The core Coda package provides a CLI that transforms Anchor IDLs into modern TypeScript clients with full type safety and ES modules support.

## Installation

Expand All @@ -18,7 +18,7 @@ npm install -D @macalinao/coda

## Features

- 🚀 **Zero configuration** - Works out of the box with sensible defaults
- 🚀 **Minimal configuration** - Works out of the box with sensible defaults
- 🔧 **Fully customizable** - Extend and transform generated code with visitors
- 📦 **ES modules native** - Modern JavaScript with proper `.js` extensions
- 🎯 **Type-safe** - Full TypeScript support with precise types
Expand Down Expand Up @@ -54,7 +54,7 @@ Options:

## Configuration

### Zero-Config (Default)
### Default Configuration

Coda works without any configuration by looking for IDLs in `./idls/*.json`:

Expand Down Expand Up @@ -309,25 +309,123 @@ Use the dedupe visitor to flatten nested account structures:
```javascript
import { instructionAccountsDedupeVisitor } from "@macalinao/codama-instruction-accounts-dedupe-visitor";

export default defineConfig({
visitors: ({ idl }) => [
instructionAccountsDedupeVisitor(idl)
]
});
```

### Renaming Conflicts

Resolve naming conflicts between multiple programs:

```javascript
import { renameVisitor } from "@macalinao/codama-rename-visitor";

export default defineConfig({
visitors: [
instructionAccountsDedupeVisitor()
renameVisitor({
programA: {
instructions: {
transfer: "transferProgramA"
}
},
programB: {
instructions: {
transfer: "transferProgramB"
}
}
})
]
});
```

### Custom Renderers
## Documentation Generation

Generate markdown documentation alongside your TypeScript clients:

```bash
coda docs [options]

Options:
-i, --idl <path> Path to Anchor IDL file (default: "./idls/*.json")
-o, --output <path> Output directory (default: "./docs")
-c, --config <path> Path to config file (default: "./coda.config.mjs")
```

### Basic Usage

```bash
# Generate documentation
coda docs

# Custom output directory
coda docs -o ./api-docs
```

### With Configuration

Use alternative renderers for different output formats:
Add documentation generation to your config:

```javascript
import { renderJavaScriptEsmVisitor } from "@macalinao/codama-renderers-js-esm";
import { renderMarkdownVisitor } from "@macalinao/codama-renderers-markdown";

export default defineConfig({
visitors: ({ idl }) => {
const codama = createFromIdls([idl]);
codama.accept(renderJavaScriptEsmVisitor("./src/generated"));
return [];
}
visitors: [
renderMarkdownVisitor("./docs")
]
});
```
```

## Best Practices

1. **Keep IDLs up-to-date**: Run `anchor build` before generating clients
2. **Use TypeScript**: The generated code provides full type safety
3. **Add custom PDAs**: Define program-derived addresses in your config
4. **Document your programs**: Add descriptions in your Anchor programs
5. **Version your clients**: Generate clients for each program version

## Troubleshooting

### IDL Not Found

If Coda can't find your IDL:

1. Check the default location: `./idls/*.json`
2. Specify explicit path: `coda generate -i path/to/idl.json`
3. Ensure Anchor program is built: `anchor build`

### Import Errors

If you see module resolution errors:

1. Ensure `"type": "module"` is in your package.json
2. Check that tsconfig.json uses `"moduleResolution": "NodeNext"`
3. Verify all local imports use `.js` extensions

### Type Errors

If TypeScript shows errors:

1. Run `bun install` to ensure dependencies are installed
2. Check that `@solana/web3.js` is installed
3. Verify tsconfig includes the generated directory

## Examples

### Single Program

See the [token-metadata client](https://github.com/macalinao/coda/tree/master/clients/token-metadata) for a complete example of a single program setup.

### Multiple Programs

See the [Quarry client](https://github.com/macalinao/coda/tree/master/clients/quarry) for an example with multiple programs and custom visitors.

## Related Packages

- [@macalinao/codama-renderers-js-esm](/docs/packages/codama-renderers-js-esm) - ESM-native TypeScript renderer
- [@macalinao/codama-instruction-accounts-dedupe-visitor](/docs/packages/codama-instruction-accounts-dedupe-visitor) - Flatten nested accounts
- [@macalinao/codama-rename-visitor](/docs/packages/codama-rename-visitor) - Rename instructions and accounts
- [@macalinao/codama-renderers-markdown](/docs/packages/codama-renderers-markdown) - Generate documentation
- [@macalinao/codama-nodes-from-anchor-x](/docs/packages/codama-nodes-from-anchor-x) - Parse multiple IDLs
Original file line number Diff line number Diff line change
Expand Up @@ -54,12 +54,14 @@ Use it in your `coda.config.mjs`:
```javascript
import { defineConfig } from "@macalinao/coda";
import { instructionAccountsDedupeVisitor } from "@macalinao/codama-instruction-accounts-dedupe-visitor";
import fs from "fs";

export default defineConfig({
idlPath: "./idls/my_program.json",
outputDir: "./src/generated",
visitors: [
instructionAccountsDedupeVisitor()
visitors: (idl) => [
// Pass the IDL to the visitor
instructionAccountsDedupeVisitor(idl)
]
});
```
Expand Down Expand Up @@ -147,11 +149,11 @@ When flattening accounts, PDA seeds are also updated to reflect the new structur
Creates a visitor that flattens nested instruction accounts:

```typescript
function instructionAccountsDedupeVisitor(idl?: Idl): Visitor;
function instructionAccountsDedupeVisitor(idl: AnchorIdl): Visitor;
```

**Parameters:**
- `idl` (optional): The Anchor IDL to use for context during transformation
- `idl`: The Anchor IDL containing the instruction definitions with potentially nested accounts

**Returns:**
- A Codama visitor that can be applied to transform the AST
Expand Down
Loading