gen-typescript-from-tolk-dev
v0.1.0
Published
Currently, it uses a patched LSP to parse and Tolk source code (for MVP). Later, the compiler will be able to emit ABI of a contract, and LSP won't be used in this process.
Readme
Tolk-to-TypeScript wrappers generator (alpha)
Currently, it uses a patched LSP to parse and Tolk source code (for MVP). Later, the compiler will be able to emit ABI of a contract, and LSP won't be used in this process.
Main CLI
The main entrypoint accepts contract ABI as a JSON string and prints the generated TypeScript wrapper to stdout:
npx gen-typescript-from-tolk '{"contractName":"MyContract", ... }'This package no longer bundles a Tolk compiler. It only supports ABI JSON -> TypeScript wrapper.
Configuring TypeScript output
All structs/aliases/enums are generated to the output — it's unconfigurable currently. If a struct can't be serialized (contains
intfor example, not int32/uint64), itsfromSliceandstorejust containthrow new Errorwith a description.Default values of all structs are preserved:
struct WalletStorage {
jettonBalance: coins = 0 // <----
ownerAddress: address
minterAddress: address
}Then, jettonBalance key in WalletStorage.create() will be optional. If it's a storage or a message, it will also be optional in fromStorage and sendXXX.
- If your storage change shape after initialization (the case of NFT), you can specify an "uninited storage" shape:
type NOT_INITIALIZED_STORAGE = StorageStructNotInitializedThen, fromStorage will accept fields from this struct, not from STORAGE.
Known issues
- Generics behave incorrectly when
Tis used inside unions (because generics are not monomorphic, they are true TypeScript generics). For example, you havestruct A<T> { v: T | int8 }and instantiateA<int2 | int4>, then an actual prefix tree will be '00/01/10', but a TS wrapper serializes '0+T/1'; or, forA<int8>actually will be no union (int8 | int8=int8), but a TS wrapper will still serialize as '0+int8/1'. Similar corner cases appear in get methods that work via the stack. For example,struct MyNullable<T> { v: T? }, instantiated asMyNullable<Point>has no information about stack layout and type-id. - Non-standard keys for maps are unsupported, like
map<Point, ...>. Only intN/uintN/address are supported (99% use cases). Others can not be represented via@ton/corelibrary at all. - Custom serializers for generic structs
fun Some<T>.packToBuildernot supported (works perfectly for non-generic structs and aliases, but not for generic). - Default values for struct fields, if a field contains a union, not supported.
