Skip to content
Open
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
4 changes: 4 additions & 0 deletions js/token-idl/.prettierignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
node_modules
dist
build
coverage
10 changes: 10 additions & 0 deletions js/token-idl/.prettierrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"semi": true,
"trailingComma": "all",
"singleQuote": true,
"printWidth": 80,
"useTabs": false,
"tabWidth": 4,
"bracketSpacing": true,
"arrowParens": "avoid"
}
66 changes: 66 additions & 0 deletions js/token-idl/eslint.config.cjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
const js = require('@eslint/js');
const tseslint = require('@typescript-eslint/eslint-plugin');
const tsParser = require('@typescript-eslint/parser');

module.exports = [
{
ignores: [
'node_modules/**',
'dist/**',
'build/**',
'*.config.js',
'eslint.config.js',
'eslint.config.cjs',
],
},
js.configs.recommended,
{
files: ['**/*.js', '**/*.cjs', '**/*.mjs'],
languageOptions: {
ecmaVersion: 2022,
sourceType: 'module',
globals: {
require: 'readonly',
module: 'readonly',
process: 'readonly',
__dirname: 'readonly',
__filename: 'readonly',
exports: 'readonly',
console: 'readonly',
Buffer: 'readonly',
},
},
},
{
files: ['src/**/*.ts', 'scripts/**/*.ts'],
languageOptions: {
parser: tsParser,
parserOptions: {
ecmaVersion: 2022,
sourceType: 'module',
},
globals: {
process: 'readonly',
console: 'readonly',
__dirname: 'readonly',
__filename: 'readonly',
Buffer: 'readonly',
},
},
plugins: {
'@typescript-eslint': tseslint,
},
rules: {
...tseslint.configs.recommended.rules,
'@typescript-eslint/ban-ts-comment': 0,
'@typescript-eslint/no-explicit-any': 0,
'@typescript-eslint/no-var-requires': 0,
'@typescript-eslint/no-unused-vars': 0,
'@typescript-eslint/no-require-imports': 0,
'no-prototype-builtins': 0,
'no-undef': 0,
'no-unused-vars': 0,
'no-redeclare': 0,
},
},
];
27 changes: 27 additions & 0 deletions js/token-idl/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
{
"name": "@lightprotocol/token-idl",
"version": "0.1.0",
"description": "Light Protocol Token IDL and Codama client generation",
"type": "module",
"private": true,
"scripts": {
"generate": "tsx scripts/generate-clients.ts",
"build": "pnpm run generate",
"lint": "eslint .",
"format": "prettier --write ."
},
"devDependencies": {
"@codama/nodes": "^1.4.1",
"@codama/renderers-js": "^1.2.8",
"@codama/visitors": "^1.4.1",
"@codama/visitors-core": "^1.4.1",
"@eslint/js": "9.36.0",
"@typescript-eslint/eslint-plugin": "^8.44.0",
"@typescript-eslint/parser": "^8.44.0",
"codama": "^1.4.1",
"eslint": "^9.36.0",
"prettier": "^3.3.3",
"tsx": "^4.19.2",
"typescript": "^5.7.3"
}
}
57 changes: 57 additions & 0 deletions js/token-idl/scripts/generate-clients.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
/**
* Generate TypeScript clients from the Light Token IDL using Codama.
*/

import { createFromRoot } from 'codama';
import { renderJavaScriptVisitor } from '@codama/renderers-js';
import { setInstructionAccountDefaultValuesVisitor } from '@codama/visitors';
import { publicKeyValueNode } from 'codama';
import path from 'path';
import { fileURLToPath } from 'url';

import {
lightTokenIdl,
LIGHT_TOKEN_PROGRAM_ID,
SYSTEM_PROGRAM,
} from '../src/idl.js';

const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);

// Output directory for generated TypeScript
const typescriptOutputDir = path.resolve(
__dirname,
'../../token-sdk/src/generated',
);

console.log('Creating Codama instance from Light Token IDL...');
const codama = createFromRoot(lightTokenIdl);

// Apply default account values for common accounts
console.log('Applying default account values...');
codama.update(
setInstructionAccountDefaultValuesVisitor([
{
account: 'systemProgram',
defaultValue: publicKeyValueNode(SYSTEM_PROGRAM),
},
{
account: 'selfProgram',
defaultValue: publicKeyValueNode(LIGHT_TOKEN_PROGRAM_ID),
},
]),
);

// Generate TypeScript client
console.log(`Generating TypeScript client to ${typescriptOutputDir}...`);
codama.accept(
renderJavaScriptVisitor(typescriptOutputDir, {
formatCode: true,
dependencyMap: {
// Map codama codecs to @solana/codecs
generatedPackage: '@lightprotocol/token-sdk',
},
}),
);

console.log('Generation complete!');
Loading
Loading