Telescope
usage
Advanced Install and Use

Advanced Installation and Usage

This document outlines all available methods to install and use Telescope.

Telescope CLI

Install Telescope globally:

npm install -g @cosmology/telescope

Generate a Package

Use the interactive prompt:

telescope generate

Or specify options directly:

telescope generate --access public --userfullname "Your Name" --useremail "your@email.com" --module-desc "Your module description" --username "your-username" --license MIT --module-name "your-module" --chain-name cosmos --use-npm-scoped

Available Options:

  • --userfullname: Your full name
  • --useremail: Your email
  • --module-desc: Module description
  • --username: GitHub username
  • --module-name: Module name
  • --chain-name: Chain name
  • --access: Package access (public or private)
  • --use-npm-scoped: Use npm scoped package (only works with --access public)
  • --license: License type

Download Protocol Buffers

Basic usage:

telescope download

With a config file:

telescope download --config ./protod.config.json --out ./git-modules

protod.config.json example:

{
  "repos": [
    { "owner": "cosmos", "repo": "cosmos-sdk", "branch": "release/v0.50.x" },
    { "owner": "cosmos", "repo": "ibc-go" },
  ],
  "protoDirMapping": {
    "gogo/protobuf/master": ".",
    "googleapis/googleapis/master": ".",
    "protocolbuffers/protobuf/main": "src"
  },
  "outDir": "protos",
  "ssh": true,
  "tempRepoDir": "git-modules",
  "targets": [
    "cosmos/**/*.proto",
    "cosmwasm/**/*.proto",
    "ibc/**/*.proto",
  ]
}

From a specific repository:

telescope download --git-repo owner/repository --targets cosmos/auth/v1beta1/auth.proto

Transpile Proto Files

With default options:

telescope transpile

With custom configuration:

telescope transpile --config telescope-config.json

telescope-config.json exmaple:

{
    "protoDirs": [
        "./protos/"
    ],
    "outPath": "./codegen/",
    "options": {
        "classesUseArrowFunctions": true,
        "env": "v-next",
        "useInterchainJs": true,
        "useSDKTypes": false,
        "prototypes": {
            "enableRegistryLoader": false,
            "enableMessageComposer": false,
            "enabled": true,
            "parser": {
                "keepCase": false
            },
            "methods": {
                "fromJSON": false,
                "toJSON": false,
                "encode": true,
                "decode": true,
                "fromPartial": true,
                "toAmino": true,
                "fromAmino": true,
                "fromProto": false,
                "toProto": false,
                "fromProtoMsg": false,
                "toProtoMsg": false,
                "toAminoMsg": true,
                "fromAminoMsg": true
            },
            "addTypeUrlToDecoders": false,
            "addTypeUrlToObjects": true,
            "addAminoTypeToObjects": true,
            "typingsFormat": {
                "duration": "duration",
                "timestamp": "date",
                "useExact": false,
                "useDeepPartial": true,
                "num64": "bigint",
                "customTypes": {
                    "useCosmosSDKDec": true,
                    "useEnhancedDecimal": false
                },
                "useTelescopeGeneratedType": true,
                "autoFixUndefinedEnumDefault": true
            }
        },
        "bundle": {
            "enabled": false
        },
        "stargateClients": {
            "enabled": false
        },
        "lcdClients": {
            "enabled": false
        },
        "rpcClients": {
            "enabled": false
        },
        "helperFunctions": {
            "enabled": true,
            "useGlobalDecoderRegistry": true,
            "hooks": {
              "react": true,
              "vue": false
            }
        },
        "interfaces": {
            "enabled": true,
            "useGlobalDecoderRegistry": true,
            "registerAllDecodersToGlobal": false,
            "useUnionTypes": true
        },
        "aminoEncoding": {
            "enabled": true,
            "useLegacyInlineEncoding": false,
            "disableMsgTypes": false,
            "useProtoOptionality": true,
            "customTypes": {
              "useCosmosSDKDec": true
            }
        }
    }
}

Create Interchain App (CIA)

Install CIA globally:

npm install -g create-interchain-app

Create a new project with the Telescope boilerplate:

cia --boilerplate telescope

Navigate to your project directory:

cd ./your-project/packages/your-module
yarn install

Download protos and generate code:

yarn download-protos
yarn codegen

Create Cosmos App (CCA)

Install CCA globally:

npm install -g create-cosmos-app

Create a new package with the Telescope boilerplate:

cca --boilerplate telescope

Navigate to your package directory:

cd ./your-project/packages/telescope
yarn install

Download protos and generate code:

telescope download --config ./your.config.json
yarn codegen

Manual Installation

Add Telescope to your project:

yarn add --dev @cosmology/telescope

Install required dependencies:

yarn add @cosmjs/amino @cosmjs/proto-signing @cosmjs/stargate @cosmjs/tendermint-rpc

Use either the programmatic API or the CLI with npm/yarn prefixes:

yarn telescope generate
npx telescope download

Programmatic Usage

First, add Telescope and dependencies:

yarn add --dev @cosmology/telescope
yarn add @cosmjs/amino @cosmjs/proto-signing @cosmjs/stargate @cosmjs/tendermint-rpc

Downloading Protos Programmatically

import downloadProtos from '@cosmology/telescope/main/commands/download'
 
const config = {
  repos: [
    { owner: "cosmos", repo: "cosmos-sdk", branch: "release/v0.50.x" },
    { owner: "cosmos", repo: "ibc-go" },
  ],
  protoDirMapping: {
    "gogo/protobuf/master": ".",
    "googleapis/googleapis/master": ".",
    "protocolbuffers/protobuf/main": "src"
  },
  outDir: "protos",
  ssh: false,
  tempRepoDir: "git-modules",
  targets: [
    "cosmos/**/*.proto",
    "ibc/**/*.proto",
  ]
};
 
downloadProtos(config)
  .then(() => console.log('✅ Proto download completed'))
  // @ts-ignore
  .catch((error) => {
    console.error('❌ Proto download failed:', error);
    process.exit(1);
  });

Generating Code Programmatically

import { join } from 'path';
import telescope from '@cosmology/telescope';
import { sync as rimraf } from 'rimraf';
 
// Define input and output paths
const protoDirs = [join(__dirname, '/../proto')];
const outPath = join(__dirname, '../src');
rimraf(outPath);
 
// Run Telescope with options
telescope({
  protoDirs,
  outPath,
  
  // all options are totally optional
  options: {
    aminoEncoding: {
      enabled: true
    },
    lcdClients: {
      enabled: false
    },
    rpcClients: {
      enabled: false,
      camelCase: true
    },
    
    // Package-specific options
    packages: {
      nebula: {
        prototypes: {
          typingsFormat: {
            useExact: false
          }
        }
      },
      akash: {
        stargateClients: {
          enabled: true,
          includeCosmosDefaultTypes: false
        },
        prototypes: {
          typingsFormat: {
            useExact: false
          }
        }
      }
    }
  }
}).then(() => {
  console.log('✨ all done!');
}).catch(e => {
  console.error(e);
  process.exit(1);
});

Example: Build Script Integration

// scripts/codegen.js
import { join } from 'path';
import telescope from '@cosmology/telescope';
import { sync as rimraf } from 'rimraf';
 
const protoDirs = [join(__dirname, '/../proto')];
const outPath = join(__dirname, '../src/generated');
rimraf(outPath);
 
telescope({
  protoDirs,
  outPath,
  options: {
    tsDisable: {
      disableAll: false,
      patterns: ['**/amino/**']
    },
    eslintDisable: {
      patterns: ['**/tx.amino.ts']
    },
    prototypes: {
      includePackageVar: true,
      typingsFormat: {
        useDeepPartial: true,
        timestamp: 'date',
        duration: 'duration'
      }
    }
  }
}).then(() => {
  console.log('✨ Code generation complete');
});