github-actions[bot] 36df852972 [1.x] Publish packages (#916) 2 dagar sedan
..
bin 14e1614e23 Include CLI in main Codama library (#777) 3 månader sedan
src 14e1614e23 Include CLI in main Codama library (#777) 3 månader sedan
test ce4936c031 Allow passing NodeStacks to nested visitors (#285) 1 år sedan
.gitignore 092b55b7f3 Design an empty monorepo setup (#1) 1 år sedan
.prettierignore 760dda5775 Inline scripts in packages (#842) 2 månader sedan
CHANGELOG.md 36df852972 [1.x] Publish packages (#916) 2 dagar sedan
LICENSE 1794ecdd3f Update license dates (#835) 2 månader sedan
README.md 159c18856d Fix CI (#330) 11 månader sedan
package.json 36df852972 [1.x] Publish packages (#916) 2 dagar sedan
tsconfig.declarations.json 092b55b7f3 Design an empty monorepo setup (#1) 1 år sedan
tsconfig.json 760dda5775 Inline scripts in packages (#842) 2 månader sedan
tsup.config.ts 760dda5775 Inline scripts in packages (#842) 2 månader sedan
vitest.config.mts 760dda5775 Inline scripts in packages (#842) 2 månader sedan

README.md

Codama ➤ Main Library

npm npm-downloads

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

pnpm install codama

Packages included

This package includes the following packages. Note that some of them also re-export other packages.

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.

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.

// 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.

// 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.

    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.

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.

const json: string = fs.readFileSync('path/to/codamaIdl.json', 'utf-8');
const codama = createFromJson(json);