module Cardano.Wasm.Api.InfoToTypeScript where
import Cardano.Wasm.Api.Info (tsTypeAsString)
import Cardano.Wasm.Api.Info qualified as Info
import Cardano.Wasm.Api.TypeScriptDefs qualified as TypeScript
import Data.List (nub)
import Data.Map (Map)
import Data.Map qualified as Map
import Data.Maybe (fromMaybe)
apiInfoToTypeScriptFile :: Info.ApiInfo -> [TypeScript.TypeScriptFile]
apiInfoToTypeScriptFile :: ApiInfo -> [TypeScriptFile]
apiInfoToTypeScriptFile ApiInfo
apiInfo =
( TypeScript.TypeScriptFile
{ typeScriptFileName :: String
TypeScript.typeScriptFileName = VirtualObjectInfo -> String
Info.dashCaseName (ApiInfo -> VirtualObjectInfo
Info.mainObject ApiInfo
apiInfo) String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
".d.ts"
, typeScriptFileContent :: [Declaration]
TypeScript.typeScriptFileContent =
Bool
-> Map String VirtualObjectInfo
-> VirtualObjectInfo
-> [Declaration]
virtualObjectInfoToInterfaceDecs
Bool
False
Map String VirtualObjectInfo
voMap
(ApiInfo -> VirtualObjectInfo
Info.mainObject ApiInfo
apiInfo)
[Declaration] -> [Declaration] -> [Declaration]
forall a. [a] -> [a] -> [a]
++ [ [String] -> DeclarationType -> Declaration
TypeScript.Declaration
[ ApiInfo -> String
Info.initialiseFunctionDoc ApiInfo
apiInfo
, String
"@returns " String -> String -> String
forall a. Semigroup a => a -> a -> a
<> ApiInfo -> String
Info.initialiseFunctionReturnDoc ApiInfo
apiInfo
]
( FunctionHeader -> DeclarationType
TypeScript.FunctionDec (FunctionHeader -> DeclarationType)
-> FunctionHeader -> DeclarationType
forall a b. (a -> b) -> a -> b
$
TypeScript.FunctionHeader
{ functionName :: String
TypeScript.functionName = String
"initialise"
, functionParams :: [FunctionParam]
TypeScript.functionParams = []
, functionReturnType :: String
TypeScript.functionReturnType =
String
"Promise<" String -> String -> String
forall a. Semigroup a => a -> a -> a
<> VirtualObjectInfo -> String
Info.virtualObjectName (ApiInfo -> VirtualObjectInfo
Info.mainObject ApiInfo
apiInfo) String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
">"
}
)
, [String] -> DeclarationType -> Declaration
TypeScript.Declaration [] (Bool -> String -> DeclarationType
TypeScript.ExportDec Bool
True String
"initialise")
]
}
)
TypeScriptFile -> [TypeScriptFile] -> [TypeScriptFile]
forall a. a -> [a] -> [a]
: [TypeScriptFile]
virtualObjectInterfaces
where
virtualObjectInterfaces :: [TypeScriptFile]
virtualObjectInterfaces =
(VirtualObjectInfo -> TypeScriptFile)
-> [VirtualObjectInfo] -> [TypeScriptFile]
forall a b. (a -> b) -> [a] -> [b]
map (Map String VirtualObjectInfo -> VirtualObjectInfo -> TypeScriptFile
virtualObjectInfoToTypeScriptFile Map String VirtualObjectInfo
voMap) (ApiInfo -> [VirtualObjectInfo]
Info.virtualObjects ApiInfo
apiInfo)
voMap :: Map String VirtualObjectInfo
voMap = [(String, VirtualObjectInfo)] -> Map String VirtualObjectInfo
forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList [(VirtualObjectInfo -> String
Info.virtualObjectName VirtualObjectInfo
vo, VirtualObjectInfo
vo) | VirtualObjectInfo
vo <- ApiInfo -> [VirtualObjectInfo]
Info.virtualObjects ApiInfo
apiInfo]
importDeclaration :: Info.VirtualObjectInfo -> TypeScript.Declaration
importDeclaration :: VirtualObjectInfo -> Declaration
importDeclaration VirtualObjectInfo
vo =
TypeScript.Declaration
{ declarationComment :: [String]
TypeScript.declarationComment = []
, declarationContent :: DeclarationType
TypeScript.declarationContent =
String -> String -> DeclarationType
TypeScript.ImportDec (VirtualObjectInfo -> String
Info.virtualObjectName VirtualObjectInfo
vo) (String -> DeclarationType) -> String -> DeclarationType
forall a b. (a -> b) -> a -> b
$ VirtualObjectInfo -> String
Info.dashCaseName VirtualObjectInfo
vo
}
importDeclarations
:: Map String Info.VirtualObjectInfo -> Info.VirtualObjectInfo -> [TypeScript.Declaration]
importDeclarations :: Map String VirtualObjectInfo -> VirtualObjectInfo -> [Declaration]
importDeclarations Map String VirtualObjectInfo
voMap (Info.VirtualObjectInfo{virtualObjectMethods :: VirtualObjectInfo -> [MethodHierarchy]
Info.virtualObjectMethods = [MethodHierarchy]
methods}) =
(VirtualObjectInfo -> Declaration)
-> [VirtualObjectInfo] -> [Declaration]
forall a b. (a -> b) -> [a] -> [b]
map
VirtualObjectInfo -> Declaration
importDeclaration
([VirtualObjectInfo] -> [Declaration])
-> [VirtualObjectInfo] -> [Declaration]
forall a b. (a -> b) -> a -> b
$ [VirtualObjectInfo] -> [VirtualObjectInfo]
forall a. Eq a => [a] -> [a]
nub
[ VirtualObjectInfo
vo
| Info.MethodInfo{methodReturnType :: MethodInfo -> MethodReturnTypeInfo
Info.methodReturnType = Info.NewObject String
returnType} <- [MethodHierarchy] -> [MethodInfo]
flattenMethods [MethodHierarchy]
methods
, Just VirtualObjectInfo
vo <- [String -> Map String VirtualObjectInfo -> Maybe VirtualObjectInfo
forall k a. Ord k => k -> Map k a -> Maybe a
Map.lookup String
returnType Map String VirtualObjectInfo
voMap]
]
flattenMethods :: [Info.MethodHierarchy] -> [Info.MethodInfo]
flattenMethods :: [MethodHierarchy] -> [MethodInfo]
flattenMethods = (MethodHierarchy -> [MethodInfo])
-> [MethodHierarchy] -> [MethodInfo]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap MethodHierarchy -> [MethodInfo]
flattenMethods'
where
flattenMethods' :: Info.MethodHierarchy -> [Info.MethodInfo]
flattenMethods' :: MethodHierarchy -> [MethodInfo]
flattenMethods' (Info.MethodInfoEntry MethodInfo
mi) = [MethodInfo
mi]
flattenMethods' (Info.MethodGroupEntry (Info.MethodGroup{groupMethods :: MethodGroup -> [MethodHierarchy]
Info.groupMethods = [MethodHierarchy]
methods})) = [MethodHierarchy] -> [MethodInfo]
flattenMethods [MethodHierarchy]
methods
virtualObjectInfoToTypeScriptFile
:: Map String Info.VirtualObjectInfo -> Info.VirtualObjectInfo -> TypeScript.TypeScriptFile
virtualObjectInfoToTypeScriptFile :: Map String VirtualObjectInfo -> VirtualObjectInfo -> TypeScriptFile
virtualObjectInfoToTypeScriptFile Map String VirtualObjectInfo
voMap VirtualObjectInfo
vo =
TypeScript.TypeScriptFile
{ typeScriptFileName :: String
TypeScript.typeScriptFileName = VirtualObjectInfo -> String
Info.dashCaseName VirtualObjectInfo
vo String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
".d.ts"
, typeScriptFileContent :: [Declaration]
TypeScript.typeScriptFileContent = Bool
-> Map String VirtualObjectInfo
-> VirtualObjectInfo
-> [Declaration]
virtualObjectInfoToInterfaceDecs Bool
True Map String VirtualObjectInfo
voMap VirtualObjectInfo
vo
}
virtualObjectInfoToInterfaceDecs
:: Bool -> Map String Info.VirtualObjectInfo -> Info.VirtualObjectInfo -> [TypeScript.Declaration]
virtualObjectInfoToInterfaceDecs :: Bool
-> Map String VirtualObjectInfo
-> VirtualObjectInfo
-> [Declaration]
virtualObjectInfoToInterfaceDecs Bool
isDefaultExport Map String VirtualObjectInfo
voMap VirtualObjectInfo
vo =
Map String VirtualObjectInfo -> VirtualObjectInfo -> [Declaration]
importDeclarations Map String VirtualObjectInfo
voMap VirtualObjectInfo
vo
[Declaration] -> [Declaration] -> [Declaration]
forall a. [a] -> [a] -> [a]
++ [ [String] -> DeclarationType -> Declaration
TypeScript.Declaration
[VirtualObjectInfo -> String
Info.virtualObjectDoc VirtualObjectInfo
vo]
( String -> [GroupedInterfaceContent] -> DeclarationType
TypeScript.InterfaceDec
(VirtualObjectInfo -> String
Info.virtualObjectName VirtualObjectInfo
vo)
( [ InterfaceContent -> GroupedInterfaceContent
TypeScript.SingleInterfaceContent (InterfaceContent -> GroupedInterfaceContent)
-> InterfaceContent -> GroupedInterfaceContent
forall a b. (a -> b) -> a -> b
$
[String] -> InterfaceContentType -> InterfaceContent
TypeScript.InterfaceContent
[ String
"The type of the object, used for identification (the \""
String -> String -> String
forall a. Semigroup a => a -> a -> a
<> VirtualObjectInfo -> String
Info.virtualObjectName VirtualObjectInfo
vo
String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
"\" string)."
]
(String -> String -> InterfaceContentType
TypeScript.InterfaceProperty String
"objectType" String
"string")
]
[GroupedInterfaceContent]
-> [GroupedInterfaceContent] -> [GroupedInterfaceContent]
forall a. Semigroup a => a -> a -> a
<> (MethodHierarchy -> GroupedInterfaceContent)
-> [MethodHierarchy] -> [GroupedInterfaceContent]
forall a b. (a -> b) -> [a] -> [b]
map
(String -> MethodHierarchy -> GroupedInterfaceContent
methodHierarchyToGroupedInterfaceContents (VirtualObjectInfo -> String
Info.virtualObjectName VirtualObjectInfo
vo))
(VirtualObjectInfo -> [MethodHierarchy]
Info.virtualObjectMethods VirtualObjectInfo
vo)
)
)
]
[Declaration] -> [Declaration] -> [Declaration]
forall a. [a] -> [a] -> [a]
++ [ [String] -> DeclarationType -> Declaration
TypeScript.Declaration [] (Bool -> String -> DeclarationType
TypeScript.ExportDec Bool
True (String -> DeclarationType) -> String -> DeclarationType
forall a b. (a -> b) -> a -> b
$ VirtualObjectInfo -> String
Info.virtualObjectName VirtualObjectInfo
vo) | Bool
isDefaultExport
]
methodHierarchyToGroupedInterfaceContents
:: String -> Info.MethodHierarchy -> TypeScript.GroupedInterfaceContent
methodHierarchyToGroupedInterfaceContents :: String -> MethodHierarchy -> GroupedInterfaceContent
methodHierarchyToGroupedInterfaceContents String
selfTypeName (Info.MethodInfoEntry MethodInfo
method) =
InterfaceContent -> GroupedInterfaceContent
TypeScript.SingleInterfaceContent (InterfaceContent -> GroupedInterfaceContent)
-> InterfaceContent -> GroupedInterfaceContent
forall a b. (a -> b) -> a -> b
$ String -> MethodInfo -> InterfaceContent
methodInfoToInterfaceContent String
selfTypeName MethodInfo
method
methodHierarchyToGroupedInterfaceContents String
selfTypeName (Info.MethodGroupEntry MethodGroup
group) =
InterfaceContentGroup -> GroupedInterfaceContent
TypeScript.GroupedInterfaceContent (InterfaceContentGroup -> GroupedInterfaceContent)
-> InterfaceContentGroup -> GroupedInterfaceContent
forall a b. (a -> b) -> a -> b
$
[String]
-> String -> [GroupedInterfaceContent] -> InterfaceContentGroup
TypeScript.InterfaceContentGroup
(MethodGroup -> [String]
Info.groupDoc MethodGroup
group)
(MethodGroup -> String
Info.groupName MethodGroup
group)
( (MethodHierarchy -> GroupedInterfaceContent)
-> [MethodHierarchy] -> [GroupedInterfaceContent]
forall a b. (a -> b) -> [a] -> [b]
map
(String -> MethodHierarchy -> GroupedInterfaceContent
methodHierarchyToGroupedInterfaceContents String
selfTypeName)
(MethodGroup -> [MethodHierarchy]
Info.groupMethods MethodGroup
group)
)
methodInfoToInterfaceContent :: String -> Info.MethodInfo -> TypeScript.InterfaceContent
methodInfoToInterfaceContent :: String -> MethodInfo -> InterfaceContent
methodInfoToInterfaceContent String
selfTypeName MethodInfo
method =
[String] -> InterfaceContentType -> InterfaceContent
TypeScript.InterfaceContent
( [MethodInfo -> String
Info.methodDoc MethodInfo
method]
[String] -> [String] -> [String]
forall a. Semigroup a => a -> a -> a
<> (ParamInfo -> String) -> [ParamInfo] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map (\ParamInfo
p -> String
"@param " String -> String -> String
forall a. Semigroup a => a -> a -> a
<> ParamInfo -> String
Info.paramName ParamInfo
p String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
" " String -> String -> String
forall a. Semigroup a => a -> a -> a
<> ParamInfo -> String
Info.paramDoc ParamInfo
p) (MethodInfo -> [ParamInfo]
Info.methodParams MethodInfo
method)
[String] -> [String] -> [String]
forall a. Semigroup a => a -> a -> a
<> [String
"@returns " String -> String -> String
forall a. Semigroup a => a -> a -> a
<> MethodInfo -> String
Info.methodReturnDoc MethodInfo
method]
)
( String -> [FunctionParam] -> String -> InterfaceContentType
TypeScript.InterfaceMethod
(String -> Maybe String -> String
forall a. a -> Maybe a -> a
fromMaybe (MethodInfo -> String
Info.methodName MethodInfo
method) (MethodInfo -> Maybe String
Info.methodSimpleName MethodInfo
method))
((ParamInfo -> FunctionParam) -> [ParamInfo] -> [FunctionParam]
forall a b. (a -> b) -> [a] -> [b]
map ParamInfo -> FunctionParam
paramInfoToFunctionParam ([ParamInfo] -> [FunctionParam]) -> [ParamInfo] -> [FunctionParam]
forall a b. (a -> b) -> a -> b
$ MethodInfo -> [ParamInfo]
Info.methodParams MethodInfo
method)
(String -> MethodReturnTypeInfo -> String
methodReturnTypeToString String
selfTypeName (MethodReturnTypeInfo -> String) -> MethodReturnTypeInfo -> String
forall a b. (a -> b) -> a -> b
$ MethodInfo -> MethodReturnTypeInfo
Info.methodReturnType MethodInfo
method)
)
paramInfoToFunctionParam :: Info.ParamInfo -> TypeScript.FunctionParam
paramInfoToFunctionParam :: ParamInfo -> FunctionParam
paramInfoToFunctionParam ParamInfo
p =
TypeScript.FunctionParam
{ paramName :: String
TypeScript.paramName = ParamInfo -> String
Info.paramName ParamInfo
p
, paramType :: String
TypeScript.paramType = TSType -> String
tsTypeAsString (TSType -> String) -> TSType -> String
forall a b. (a -> b) -> a -> b
$ ParamInfo -> TSType
Info.paramType ParamInfo
p
}
methodReturnTypeToString :: String -> Info.MethodReturnTypeInfo -> String
methodReturnTypeToString :: String -> MethodReturnTypeInfo -> String
methodReturnTypeToString String
selfTypeName MethodReturnTypeInfo
Info.Fluent = String
selfTypeName
methodReturnTypeToString String
_ (Info.NewObject String
objTypeName) = String
"Promise<" String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
objTypeName String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
">"
methodReturnTypeToString String
_ (Info.OtherType TSType
typeName) = String
"Promise<" String -> String -> String
forall a. Semigroup a => a -> a -> a
<> TSType -> String
tsTypeAsString TSType
typeName String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
">"