Skip to content
Merged
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
59 changes: 14 additions & 45 deletions src/types/convertor/argsConvertor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,13 @@
* Convert Move type to TypeScript type,
* for input arguments of view function or entry function.
*/

import { AnyNumber, UnknownStruct } from '../common.js';
import { MoveNonStructTypes, MovePrimitive } from '../moveTypes.js';
import {
MoveObject,
MoveOption,
MovePrimitive,
MovePrimitiveMap,
} from '../moveTypes.js';

/**
* Convert an array of input arguments type.
Expand All @@ -16,46 +20,11 @@ export type ConvertArgs<T extends readonly string[]> = T extends readonly [
? [ConvertArgType<TArg>, ...ConvertArgs<TRest>]
: [];

/**
* Internal
*/
type ConvertArgType<TMoveType extends string> =
TMoveType extends MoveNonStructTypes
? // it's a non-struct type
ConvertNonStructArgType<TMoveType>
: // it's a struct type
UnknownStruct<TMoveType>;

type ConvertPrimitiveArgType<TMoveType extends MovePrimitive> =
TMoveType extends 'bool'
? boolean
: TMoveType extends 'u8'
? number
: TMoveType extends 'u16'
? number
: TMoveType extends 'u32'
? number
: TMoveType extends 'u64'
? AnyNumber
: TMoveType extends 'u128'
? AnyNumber
: TMoveType extends 'u256'
? AnyNumber
: TMoveType extends 'address'
? `0x${string}`
: TMoveType extends '0x1::string::String'
? string
: never;

type ConvertNonStructArgType<TMoveType extends MoveNonStructTypes> =
TMoveType extends MovePrimitive
? ConvertPrimitiveArgType<TMoveType>
: TMoveType extends `vector<u8>`
? string | number[] | Uint8Array
: TMoveType extends `vector<${infer TInner}>`
? ConvertArgType<TInner>[]
: TMoveType extends `0x1::object::Object<${string}>`
? `0x${string}`
: TMoveType extends `0x1::option::Option<${infer TInner}>`
? ConvertArgType<TInner> | undefined
: UnknownStruct<TMoveType>;
// Internal
type ConvertArgType<TMoveType extends string> = TMoveType extends MovePrimitive
? MovePrimitiveMap<AnyNumber>[TMoveType]
: TMoveType extends MoveObject
? `0x${string}`
: TMoveType extends MoveOption<infer TInner>
? ConvertArgType<TInner> | undefined
: UnknownStruct<TMoveType>;
49 changes: 12 additions & 37 deletions src/types/convertor/returnConvertor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,12 @@

import { UnknownStruct } from '../common.js';
import { DefaultABITable } from '../defaultABITable.js';
import { MoveNonStructTypes, MovePrimitive } from '../moveTypes.js';
import {
MoveObject,
MoveOption,
MovePrimitive,
MovePrimitiveMap,
} from '../moveTypes.js';
import { ConvertStructFieldOptionType } from './structConvertor.js';

/**
Expand All @@ -22,40 +27,10 @@ export type ConvertReturns<T extends readonly string[]> = T extends readonly [
* Internal
*/
type ConvertReturnType<TMoveType extends string> =
TMoveType extends MoveNonStructTypes
? // it's a non-struct type
ConvertNonStructReturnType<TMoveType>
: // it's a struct type
UnknownStruct<TMoveType>;

type ConvertPrimitiveReturnType<TMoveType extends MovePrimitive> =
TMoveType extends 'bool'
? boolean
: TMoveType extends 'u8'
? number
: TMoveType extends 'u16'
? number
: TMoveType extends 'u32'
? number
: TMoveType extends 'u64'
? string
: TMoveType extends 'u128'
? string
: TMoveType extends 'u256'
? string
: TMoveType extends 'address'
? `0x${string}`
: TMoveType extends '0x1::string::String'
? string
: never;

type ConvertNonStructReturnType<TMoveType extends MoveNonStructTypes> =
TMoveType extends MovePrimitive
? ConvertPrimitiveReturnType<TMoveType>
: TMoveType extends `vector<${infer TInner}>`
? ConvertReturnType<TInner>[]
: TMoveType extends `0x1::object::Object<${string}>`
? { inner: `0x${string}` }
: TMoveType extends `0x1::option::Option<${infer TInner}>`
? ConvertStructFieldOptionType<DefaultABITable, TInner>
: UnknownStruct<TMoveType>;
? MovePrimitiveMap<string>[TMoveType]
: TMoveType extends MoveObject
? { inner: `0x${string}` }
: TMoveType extends MoveOption<infer TInner>
? ConvertStructFieldOptionType<DefaultABITable, TInner>
: UnknownStruct<TMoveType>;
37 changes: 10 additions & 27 deletions src/types/convertor/structConvertor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,13 @@ import {
ExtractStructType,
ResourceStructName,
} from '../extractor/structExtractor.js';
import { MoveNonStructTypes, MovePrimitive } from '../moveTypes.js';
import {
MoveNonStructTypes,
MoveObject,
MovePrimitive,
MovePrimitiveMap,
MoveVector,
} from '../moveTypes.js';

// Convert a struct field Move type to a TypeScript type
export type ConvertStructFieldType<
Expand All @@ -19,38 +25,15 @@ export type ConvertStructFieldType<
: // it's a struct type
ConvertStructFieldStructType<TABITable, TMoveType>;

/**
* Internal
*/
type ConvertPrimitiveStructField<T extends MovePrimitive> = T extends 'bool'
? boolean
: T extends 'u8'
? number
: T extends 'u16'
? number
: T extends 'u32'
? number
: T extends 'u64'
? string
: T extends 'u128'
? string
: T extends 'u256'
? string
: T extends 'address'
? `0x${string}`
: T extends '0x1::string::String'
? string
: never;

// Convert a struct field non-struct Move type to a TypeScript type
type ConvertStructFieldNonStructType<
TABITable extends ABITable,
TMoveType extends MoveNonStructTypes,
> = TMoveType extends MovePrimitive
? ConvertPrimitiveStructField<TMoveType>
: TMoveType extends `vector<${infer TInner}>`
? MovePrimitiveMap<string>[TMoveType]
: TMoveType extends MoveVector<infer TInner> // Custom Vector type
? ConvertStructFieldType<TABITable, TInner>[]
: TMoveType extends `0x1::object::Object<${string}>`
: TMoveType extends MoveObject
? { inner: `0x${string}` }
: TMoveType extends `0x1::option::Option<${infer TInner}>`
? ConvertStructFieldOptionType<TABITable, TInner>
Expand Down
52 changes: 39 additions & 13 deletions src/types/moveTypes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,25 +2,51 @@
* Types from Move language
*/

import { AnyNumber } from './common.js';

export type MoveNonStructTypes =
| MovePrimitive
| MoveVector
| MoveObject
| MoveOption;

export type MovePrimitive =
| 'bool'
| 'u8'
| 'u16'
| 'u32'
| 'u64'
| 'u128'
| 'u256'
| 'address'
| '0x1::string::String';
/**
* All primitive simple types that are not complex, such as vector, object or struct
*
* @type {HighValue} - The type of high value number, in some cases can return just as string, or as AnyNumber, default as string
* @returns - A map of Move primitive types to their corresponding TypeScript types
*/
export type MovePrimitiveMap<HighValue extends AnyNumber | string = string> = {
bool: boolean;

address: `0x${string}`;
'0x1::string::String': string;

// Number
u8: number;
u16: number;
u32: number;
u64: HighValue;
u128: HighValue;
u256: HighValue;

'vector<bool>': boolean[];
'vector<u8>': string | number[] | Uint8Array;
'vector<u16>': number[];
'vector<u32>': number[];

'vector<u64>': HighValue[];
'vector<u128>': HighValue[];
'vector<u256>': HighValue[];
'vector<address>': `0x${string}`[];
'vector<string>': string[];
'vector<0x1::string::String>': string[];
};

export type MovePrimitive = keyof MovePrimitiveMap<AnyNumber | string>;

export type MoveVector = `vector<${string}>`;
export type MoveVector<I extends string = string> = `vector<${I}>`;

export type MoveObject = `0x1::object::Object<${string}>`;
export type MoveObject<I extends string = string> = `0x1::object::Object<${I}>`;

export type MoveOption = `0x1::option::Option<${string}>`;
export type MoveOption<I extends string = string> = `0x1::option::Option<${I}>`;