Skip to content

Commit

Permalink
fix(core): add support for snake_case method types
Browse files Browse the repository at this point in the history
  • Loading branch information
VanishMax committed Jun 5, 2024
1 parent b055482 commit 7957067
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 4 deletions.
15 changes: 13 additions & 2 deletions packages/core/src/contract/helper-types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,17 @@ export type ContractDeployArguments<CONTRACT extends CompiledContract> = Paramet

type WithoutFirst<T extends any[]> = T extends [any, ...infer Rest] ? Rest : never;

type SnakeCaseHelper<S extends string> = S extends `${infer First}${infer Rest}`
? `${First extends Capitalize<First> ? `_${Lowercase<First>}` : First}${SnakeCaseHelper<Rest>}`
: S;
type SnakeCase<S extends string> = S extends `${infer First}${infer Rest}` // changes ThisLiteralType to this_literal_type
? `${Lowercase<First>}${SnakeCaseHelper<Rest>}`
: S;

export type CamelCase<S extends string> = S extends `${infer First}_${infer Next}${infer Rest}`
? `${First}${Capitalize<Next>}${CamelCase<Rest>}` // transforms snake_case to camelCase
: S;

type ExtractGetterNames<CONTRACT extends CompiledContract> = Exclude<{
[K in keyof GetExtendedContract<CONTRACT>]: GetExtendedContract<CONTRACT>[K] extends Function // Check if the property is a function
? K extends `get${string}`
Expand All @@ -113,7 +124,7 @@ type GetCapitalizedGetter<GETTER extends string, CONTRACT extends ExtendedContra
*/
export type ContractGetterNames<CONTRACT extends CompiledContract> =
ExtractGetterNames<CONTRACT> extends `get${infer REST}` // Check if the name starts with 'get'
? Uncapitalize<REST> // Remove 'get' and uncapitalize the first letter of the rest
? SnakeCase<REST> | Uncapitalize<REST> // 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;

/**
Expand All @@ -124,7 +135,7 @@ export type ContractGetterNames<CONTRACT extends CompiledContract> =
* then the type will be `{ balance: [bigint], counter: [] }`.
*/
export type ContractGetters<CONTRACT extends CompiledContract> = {
[key in ContractGetterNames<CONTRACT>]: GetCapitalizedGetter<key, GetExtendedContract<CONTRACT>> extends (...args: any) => any
[key in CamelCase<ContractGetterNames<CONTRACT>>]: GetCapitalizedGetter<key, GetExtendedContract<CONTRACT>> extends (...args: any) => any
? WithoutFirst<Parameters<GetCapitalizedGetter<key, GetExtendedContract<CONTRACT>>>>
: never;
}
Expand Down
4 changes: 2 additions & 2 deletions packages/core/src/contract/read-contract.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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<CONTRACT extends CompiledContract, GETTER extends ContractGetterNames<CONTRACT>> {
getter: GETTER;
arguments: ContractGetters<CONTRACT>[GETTER];
arguments: ContractGetters<CONTRACT>[CamelCase<GETTER>];
}

type ReadContractReturn<CONTRACT extends CompiledContract, GETTER extends ContractGetterNames<CONTRACT>> =
Expand Down

0 comments on commit 7957067

Please sign in to comment.