diff --git a/packages/core/src/contract/helper-types.ts b/packages/core/src/contract/helper-types.ts index 3f4ccac..c141155 100644 --- a/packages/core/src/contract/helper-types.ts +++ b/packages/core/src/contract/helper-types.ts @@ -92,6 +92,17 @@ export type ContractDeployArguments = Paramet type WithoutFirst = T extends [any, ...infer Rest] ? Rest : never; +type SnakeCaseHelper = S extends `${infer First}${infer Rest}` + ? `${First extends Capitalize ? `_${Lowercase}` : First}${SnakeCaseHelper}` + : S; +type SnakeCase = S extends `${infer First}${infer Rest}` // changes ThisLiteralType to this_literal_type + ? `${Lowercase}${SnakeCaseHelper}` + : S; + +export type CamelCase = S extends `${infer First}_${infer Next}${infer Rest}` + ? `${First}${Capitalize}${CamelCase}` // transforms snake_case to camelCase + : S; + type ExtractGetterNames = Exclude<{ [K in keyof GetExtendedContract]: GetExtendedContract[K] extends Function // Check if the property is a function ? K extends `get${string}` @@ -113,7 +124,7 @@ type GetCapitalizedGetter = ExtractGetterNames extends `get${infer REST}` // Check if the name starts with 'get' - ? Uncapitalize // Remove 'get' and uncapitalize the first letter of the rest + ? SnakeCase | Uncapitalize // Remove 'get' and uncapitalize the first letter of the rest + make the same type of snake_case because Tact compiler transforms such casing to camelCase : never; /** @@ -124,7 +135,7 @@ export type ContractGetterNames = * then the type will be `{ balance: [bigint], counter: [] }`. */ export type ContractGetters = { - [key in ContractGetterNames]: GetCapitalizedGetter> extends (...args: any) => any + [key in CamelCase>]: GetCapitalizedGetter> extends (...args: any) => any ? WithoutFirst>>> : never; } diff --git a/packages/core/src/contract/read-contract.ts b/packages/core/src/contract/read-contract.ts index dd73061..6284240 100644 --- a/packages/core/src/contract/read-contract.ts +++ b/packages/core/src/contract/read-contract.ts @@ -4,12 +4,12 @@ import { type DataOrTypedError, returnData, returnError } from '../shared/errors import { composeReadPayload } from './abi/compose-read-payload.js'; import { parseReadReturn } from './abi/parse-read-return.js'; -import type { CompiledContract, ContractGetterNames, ContractGetterReturn, ContractGetters } from './helper-types.js'; +import type { CamelCase, CompiledContract, ContractGetterNames, ContractGetterReturn, ContractGetters } from './helper-types.js'; import type { ContractClient } from './types.js'; export interface ReadContractOptions> { getter: GETTER; - arguments: ContractGetters[GETTER]; + arguments: ContractGetters[CamelCase]; } type ReadContractReturn> =