codama
Version:
A Solana framework for building standardised programs
99 lines (71 loc) • 3 kB
Markdown
# Codama ➤ Main Library
[![npm][npm-image]][npm-url]
[![npm-downloads][npm-downloads-image]][npm-url]
[npm-downloads-image]: https://img.shields.io/npm/dm/codama.svg?style=flat
[npm-image]: https://img.shields.io/npm/v/codama.svg?style=flat&label=%40codama%2Fnodes
[npm-url]: https://www.npmjs.com/package/codama
This package is the main library for Codama. It re-exports most of the other packages in the Codama monorepo and offers a `Codama` type with a few helpers to help bind everything together.
## Installation
```sh
pnpm install codama
```
## Packages included
This package includes the following packages. Note that some of them also re-export other packages.
- [`@codama/errors`](../errors)
- [`@codama/nodes`](../nodes)
- [`@codama/node-types`](../node-types)
- [`@codama/validators`](../validators)
- [`@codama/visitors`](../visitors)
- [`@codama/visitor-core`](../visitor-core)
## The Codama helper
Additionally, this package offers a `Codama` type and a few helper functions to help you work with Codama IDLs.
### `Codama`
The `Codama` interface wraps a `RootNode` and offers some helper methods to work with it.
```ts
export interface Codama {
accept<T>(visitor: Visitor<T>): T;
clone(): Codama;
getJson(): string;
getRoot(): RootNode;
update(visitor: Visitor<Node | null>): void;
}
```
The `accept` function allows us to visit the wrapped `RootNode` using the provided visitor.
```ts
// Log the Codama IDL in the console.
codama.accept(consoleLogVisitor(getDebugStringVisitor({ indent: true })));
```
The `update` function also accepts a visitor, but it uses the return value of that visitor to update the wrapped `RootNode`. This means that, given a `RootNode`, the provided visitor should also return a `RootNode`. An error will be thrown otherwise.
```ts
// Delete account nodes named "mint".
codama.update(deleteNodesVisitor(['[accountNode]mint']));
// Transform all number nodes into u64 number nodes.
codama.update(
bottomUpTransformerVisitor([
{
select: '[numberTypeNode]',
transform: () => numberTypeNode(u64),
},
]),
);
```
Other helper functions include:
- `clone()`: Creates a new instance of the `Codama` interface with a deep copy of the wrapped `RootNode`.
- `getJson()`: Returns the JSON representation of the Codama IDL.
- `getRoot()`: Returns the wrapped `RootNode`.
```ts
const clonedCodama = codama.clone();
const jsonIdl = codama.getJson();
const rootNode = codama.getRoot();
```
### `createFromRoot(rootNode)`
The `createFromRoot` function creates a new instance of the `Codama` interface from a `RootNode`.
```ts
const codama = createFromRoot(rootNode(programNode({ ... })));
```
### `createFromJson(jsonIdl)`
The `createFromJson` function creates a new instance of the `Codama` interface from a JSON representation of a `RootNode`.
```ts
const json: string = fs.readFileSync('path/to/codamaIdl.json', 'utf-8');
const codama = createFromJson(json);
```