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
5 changes: 5 additions & 0 deletions .changeset/stale-lies-stare.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@codama/renderers-js': minor
---

Use `extendClient` from `@solana/plugin-core` in generated program plugins instead of manually spreading the client object. This improves type narrowing when composing plugins with overlapping keys. Bump minimum `@solana/kit` dependency to `^6.4.0`.
5 changes: 3 additions & 2 deletions src/fragments/programPlugin.ts
Original file line number Diff line number Diff line change
Expand Up @@ -189,6 +189,7 @@ function getProgramPluginFunctionFragment(
const programPluginType = nameApi.programPluginType(programNode.name);
const programPluginRequirementsType = nameApi.programPluginRequirementsType(programNode.name);
const programPluginKey = nameApi.programPluginKey(programNode.name);
const extendClient = use('extendClient', 'solanaPluginCore');

const fields = mergeFragments(
[
Expand All @@ -200,8 +201,8 @@ function getProgramPluginFunctionFragment(
);

return fragment`export function ${programPluginFunction}() {
return <T extends ${programPluginRequirementsType}>(client: T): T & { ${programPluginKey}: ${programPluginType} } => {
return { ...client, ${programPluginKey}: { ${fields} } };
return <T extends ${programPluginRequirementsType}>(client: T): Omit<T, "${programPluginKey}"> & { ${programPluginKey}: ${programPluginType} } => {
return ${extendClient}(client, { ${programPluginKey}: <${programPluginType}>{ ${fields} } });
};
}`;
}
Expand Down
28 changes: 14 additions & 14 deletions src/utils/packageJson.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,20 +24,20 @@ type PackageJson = {
};

export const DEFAULT_DEPENDENCY_VERSIONS: DependencyVersions = {
'@solana/accounts': '^6.1.0',
'@solana/addresses': '^6.1.0',
'@solana/codecs': '^6.1.0',
'@solana/errors': '^6.1.0',
'@solana/instruction-plans': '^6.1.0',
'@solana/instructions': '^6.1.0',
'@solana/kit': '^6.1.0',
'@solana/plugin-core': '^6.1.0',
'@solana/plugin-interfaces': '^6.1.0',
'@solana/program-client-core': '^6.1.0',
'@solana/programs': '^6.1.0',
'@solana/rpc-api': '^6.1.0',
'@solana/rpc-types': '^6.1.0',
'@solana/signers': '^6.1.0',
'@solana/accounts': '^6.4.0',
'@solana/addresses': '^6.4.0',
'@solana/codecs': '^6.4.0',
'@solana/errors': '^6.4.0',
'@solana/instruction-plans': '^6.4.0',
'@solana/instructions': '^6.4.0',
'@solana/kit': '^6.4.0',
'@solana/plugin-core': '^6.4.0',
'@solana/plugin-interfaces': '^6.4.0',
'@solana/program-client-core': '^6.4.0',
'@solana/programs': '^6.4.0',
'@solana/rpc-api': '^6.4.0',
'@solana/rpc-types': '^6.4.0',
'@solana/signers': '^6.4.0',
};

export async function syncPackageJson(
Expand Down
2 changes: 1 addition & 1 deletion test/e2e/anchor/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
"lint:fix": "eslint --fix --ext js,ts,tsx src && prettier --write src test"
},
"dependencies": {
"@solana/kit": "^6.1.0"
"@solana/kit": "^6.4.0"
},
"license": "MIT",
"ava": {
Expand Down
10 changes: 5 additions & 5 deletions test/e2e/anchor/src/generated/programs/wenTransferGuard.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import {
assertIsInstructionWithAccounts,
containsBytes,
extendClient,
fixEncoderSize,
getBytesEncoder,
SOLANA_ERROR__PROGRAM_CLIENTS__FAILED_TO_IDENTIFY_ACCOUNT,
Expand Down Expand Up @@ -205,10 +206,9 @@ export type WenTransferGuardPluginRequirements = ClientWithRpc<GetAccountInfoApi
export function wenTransferGuardProgram() {
return <T extends WenTransferGuardPluginRequirements>(
client: T,
): T & { wenTransferGuard: WenTransferGuardPlugin } => {
return {
...client,
wenTransferGuard: {
): Omit<T, 'wenTransferGuard'> & { wenTransferGuard: WenTransferGuardPlugin } => {
return extendClient(client, {
wenTransferGuard: <WenTransferGuardPlugin>{
accounts: { guardV1: addSelfFetchFunctions(client, getGuardV1Codec()) },
instructions: {
createGuard: input =>
Expand All @@ -225,7 +225,7 @@ export function wenTransferGuardProgram() {
updateGuard: input => addSelfPlanAndSendFunctions(client, getUpdateGuardInstructionAsync(input)),
},
},
};
});
};
}

Expand Down
2 changes: 1 addition & 1 deletion test/e2e/dummy/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
"lint:fix": "eslint --fix --ext js,ts,tsx src && prettier --write src test"
},
"dependencies": {
"@solana/kit": "^6.1.0"
"@solana/kit": "^6.4.0"
},
"license": "MIT",
"ava": {
Expand Down
10 changes: 5 additions & 5 deletions test/e2e/dummy/src/generated/programs/dummy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import {
assertIsInstructionWithAccounts,
containsBytes,
extendClient,
getU32Encoder,
SOLANA_ERROR__PROGRAM_CLIENTS__FAILED_TO_IDENTIFY_INSTRUCTION,
SOLANA_ERROR__PROGRAM_CLIENTS__UNRECOGNIZED_INSTRUCTION_TYPE,
Expand Down Expand Up @@ -194,10 +195,9 @@ export type DummyPluginInstructions = {
export type DummyPluginRequirements = ClientWithPayer & ClientWithTransactionPlanning & ClientWithTransactionSending;

export function dummyProgram() {
return <T extends DummyPluginRequirements>(client: T): T & { dummy: DummyPlugin } => {
return {
...client,
dummy: {
return <T extends DummyPluginRequirements>(client: T): Omit<T, 'dummy'> & { dummy: DummyPlugin } => {
return extendClient(client, {
dummy: <DummyPlugin>{
instructions: {
instruction1: input => addSelfPlanAndSendFunctions(client, getInstruction1Instruction(input)),
instruction2: input => addSelfPlanAndSendFunctions(client, getInstruction2Instruction(input)),
Expand All @@ -219,7 +219,7 @@ export function dummyProgram() {
instruction10: input => addSelfPlanAndSendFunctions(client, getInstruction10Instruction(input)),
},
},
};
});
};
}

Expand Down
2 changes: 1 addition & 1 deletion test/e2e/memo/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
"lint:fix": "eslint --fix --ext js,ts,tsx src && prettier --write src test"
},
"dependencies": {
"@solana/kit": "^6.1.0"
"@solana/kit": "^6.4.0"
},
"license": "MIT",
"ava": {
Expand Down
16 changes: 10 additions & 6 deletions test/e2e/memo/src/generated/programs/memo.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,12 @@
* @see https://github.com/codama-idl/codama
*/

import { type Address, type ClientWithTransactionPlanning, type ClientWithTransactionSending } from '@solana/kit';
import {
extendClient,
type Address,
type ClientWithTransactionPlanning,
type ClientWithTransactionSending,
} from '@solana/kit';
import { addSelfPlanAndSendFunctions, type SelfPlanAndSendFunctions } from '@solana/kit/program-client-core';
import { getAddMemoInstruction, type AddMemoInput, type ParsedAddMemoInstruction } from '../instructions';

Expand All @@ -30,12 +35,11 @@ export type MemoPluginInstructions = {
export type MemoPluginRequirements = ClientWithTransactionPlanning & ClientWithTransactionSending;

export function memoProgram() {
return <T extends MemoPluginRequirements>(client: T): T & { memo: MemoPlugin } => {
return {
...client,
memo: {
return <T extends MemoPluginRequirements>(client: T): Omit<T, 'memo'> & { memo: MemoPlugin } => {
return extendClient(client, {
memo: <MemoPlugin>{
instructions: { addMemo: input => addSelfPlanAndSendFunctions(client, getAddMemoInstruction(input)) },
},
};
});
};
}
Loading
Loading