ts: Make workspace metadata optional (#310)

This commit is contained in:
Armani Ferrante 2021-05-23 17:06:39 -07:00 committed by GitHub
parent 6da6ae22f8
commit 5b807d7804
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 17 additions and 6 deletions

View File

@ -11,6 +11,10 @@ incremented for features.
## [Unreleased]
## Features
* ts: Address metadata is now optional for `anchor.workspace` clients ([#310](https://github.com/project-serum/anchor/pull/310)).
## [0.6.0] - 2021-05-23
## Features

View File

@ -1,6 +1,6 @@
{
"name": "@project-serum/anchor",
"version": "0.6.0",
"version": "0.6.1-beta.1",
"description": "Anchor client",
"main": "dist/cjs/index.js",
"module": "dist/esm/index.js",

View File

@ -2,7 +2,7 @@ import camelCase from "camelcase";
import * as toml from "toml";
import { PublicKey } from "@solana/web3.js";
import { Program } from "./program";
import { getProvider } from "./";
import { Idl } from "./idl";
let _populatedWorkspace = false;
@ -40,11 +40,14 @@ const workspace = new Proxy({} as any, {
throw new Error("Could not find workspace root.");
}
const idlMap = new Map<string, Idl>();
find
.fileSync(/target\/idl\/.*\.json/, projectRoot)
.reduce((programs: any, path: string) => {
const idlStr = fs.readFileSync(path);
const idl = JSON.parse(idlStr);
idlMap.set(idl.name, idl);
const name = camelCase(idl.name, { pascalCase: true });
if (idl.metadata && idl.metadata.address) {
programs[name] = new Program(
@ -61,7 +64,11 @@ const workspace = new Proxy({} as any, {
);
const clusterId = anchorToml.provider.cluster;
if (anchorToml.clusters && anchorToml.clusters[clusterId]) {
attachWorkspaceOverride(workspaceCache, anchorToml.clusters[clusterId]);
attachWorkspaceOverride(
workspaceCache,
anchorToml.clusters[clusterId],
idlMap
);
}
_populatedWorkspace = true;
@ -73,14 +80,14 @@ const workspace = new Proxy({} as any, {
function attachWorkspaceOverride(
workspaceCache: { [key: string]: Program },
overrideConfig: { [key: string]: string }
overrideConfig: { [key: string]: string },
idlMap: Map<string, Idl>
) {
Object.keys(overrideConfig).forEach((programName) => {
const wsProgramName = camelCase(programName, { pascalCase: true });
const oldProgram = workspaceCache[wsProgramName];
const overrideAddress = new PublicKey(overrideConfig[programName]);
workspaceCache[wsProgramName] = new Program(
oldProgram.idl,
idlMap.get(programName),
overrideAddress
);
});