From bad6356e257cdacb369078faf384b7270037360e Mon Sep 17 00:00:00 2001 From: megakaban Date: Thu, 7 Oct 2021 13:25:14 +0700 Subject: [PATCH] Add generation script --- .../generate-typescript/Main.hs | 131 ++++++++++++++++++ MetaLamp/nft-marketplace/plutus-starter.cabal | 22 +++ 2 files changed, 153 insertions(+) create mode 100644 MetaLamp/nft-marketplace/generate-typescript/Main.hs diff --git a/MetaLamp/nft-marketplace/generate-typescript/Main.hs b/MetaLamp/nft-marketplace/generate-typescript/Main.hs new file mode 100644 index 000000000..7077546be --- /dev/null +++ b/MetaLamp/nft-marketplace/generate-typescript/Main.hs @@ -0,0 +1,131 @@ +{-# LANGUAGE DataKinds #-} +{-# LANGUAGE DerivingStrategies #-} +{-# LANGUAGE EmptyDataDecls #-} +{-# LANGUAGE FlexibleContexts #-} +{-# LANGUAGE FlexibleInstances #-} +{-# LANGUAGE MultiParamTypeClasses #-} +{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE ScopedTypeVariables #-} +{-# LANGUAGE TypeApplications #-} +{-# LANGUAGE TypeFamilies #-} +{-# LANGUAGE TemplateHaskell #-} + +module Main where + +import Control.Monad (when) +import System.Directory (doesDirectoryExist, + removeDirectoryRecursive) +import Control.Monad.Reader (MonadReader) +import Data.Proxy (Proxy (Proxy)) +import qualified Ext.Plutus.Contracts.Auction as Auction +import Plutus.Abstract.RemoteData (RemoteData) +import Plutus.Contract.StateMachine.ThreadToken (ThreadToken) +import qualified Plutus.Contracts.NftMarketplace.Endpoints as Marketplace +import qualified Plutus.Contracts.NftMarketplace.OnChain.Core as Marketplace +import qualified Plutus.Contracts.Services.Sale as Sale +import Plutus.PAB.Simulation (MarketplaceContracts (..)) +import Plutus.V1.Ledger.Time (DiffMilliSeconds) +import Data.Aeson.TypeScript.TH +import Data.Aeson.TypeScript.Internal +import qualified Data.Aeson.Types as Aeson + +import Plutus.V1.Ledger.Tx (TxOutRef) +import Plutus.V1.Ledger.TxId (TxId) +import PlutusTx.Builtins.Internal (BuiltinByteString) +import Data.ByteString (ByteString) +import Plutus.V1.Ledger.Value (CurrencySymbol, Value, TokenName) +import Plutus.V1.Ledger.Crypto (PubKeyHash) +import qualified PlutusTx.AssocMap as AssocMap +import Plutus.V1.Ledger.Ada (Ada) + +instance TypeScript BuiltinByteString where + getTypeScriptType _ = "string" + +$(deriveTypeScript Aeson.defaultOptions ''TxOutRef) +$(deriveTypeScript Aeson.defaultOptions ''TxId) +$(deriveTypeScript Aeson.defaultOptions ''CurrencySymbol) +$(deriveTypeScript Aeson.defaultOptions ''PubKeyHash) +$(deriveTypeScript Aeson.defaultOptions ''Value) +$(deriveTypeScript Aeson.defaultOptions ''AssocMap.Map) +$(deriveTypeScript Aeson.defaultOptions ''TokenName) +$(deriveTypeScript Aeson.defaultOptions ''Ada) + +-- TODO: write 'normally', if there is nothing else to do +instance (TypeScript a, TypeScript b) => TypeScript (RemoteData a b) where + getTypeScriptType _ = "RemoteData<" <> (getTypeScriptType (Proxy :: Proxy a)) <> "," <> (getTypeScriptType (Proxy :: Proxy b)) <> ">" + getTypeScriptDeclarations _ = [ + TSRawDeclaration "export type RemoteData = INotAsked | ILoading | IFailure | ISuccess;", + TSRawDeclaration "export interface INotAsked { tag: \"NotAsked\"; }", + TSRawDeclaration "export interface ILoading { tag: \"Loading\"; }", + TSRawDeclaration "export interface IFailure { tag: \"Failure\"; contents: T; }", + TSRawDeclaration "export interface ISuccess { tag: \"Success\"; contents: T; }"] + +$(deriveTypeScript Aeson.defaultOptions ''ThreadToken) +$(deriveTypeScript Aeson.defaultOptions ''DiffMilliSeconds) +$(deriveTypeScript Aeson.defaultOptions ''MarketplaceContracts) +$(deriveTypeScript Aeson.defaultOptions ''Marketplace.Marketplace) +$(deriveTypeScript Aeson.defaultOptions ''Marketplace.MarketplaceDatum) +$(deriveTypeScript Aeson.defaultOptions ''Marketplace.UserItemId) +$(deriveTypeScript Aeson.defaultOptions ''Marketplace.UserContractState) +$(deriveTypeScript Aeson.defaultOptions ''Marketplace.InfoContractState) +$(deriveTypeScript Aeson.defaultOptions ''Marketplace.OwnerContractState) +$(deriveTypeScript Aeson.defaultOptions ''Marketplace.NftInfo) +$(deriveTypeScript Aeson.defaultOptions ''Marketplace.NFT) +$(deriveTypeScript Aeson.defaultOptions ''Marketplace.Bundle) +$(deriveTypeScript Aeson.defaultOptions ''Marketplace.BundleInfo) +$(deriveTypeScript Aeson.defaultOptions ''Marketplace.NftBundle) +$(deriveTypeScript Aeson.defaultOptions ''Auction.AuctionState) +$(deriveTypeScript Aeson.defaultOptions ''Auction.HighestBid) +$(deriveTypeScript Aeson.defaultOptions ''Sale.Sale) +$(deriveTypeScript Aeson.defaultOptions ''Marketplace.CreateNftParams) +$(deriveTypeScript Aeson.defaultOptions ''Marketplace.OpenSaleParams) +$(deriveTypeScript Aeson.defaultOptions ''Marketplace.CloseLotParams) +$(deriveTypeScript Aeson.defaultOptions ''Marketplace.StartAnAuctionParams) +$(deriveTypeScript Aeson.defaultOptions ''Marketplace.BidOnAuctionParams) +$(deriveTypeScript Aeson.defaultOptions ''Marketplace.BundleUpParams) +$(deriveTypeScript Aeson.defaultOptions ''Marketplace.UnbundleParams) + +formattingOptions :: FormattingOptions +formattingOptions = FormattingOptions + { numIndentSpaces = 2 + , interfaceNameModifier = id + , typeNameModifier = id + , exportMode = ExportEach + , typeAlternativesFormat = TypeAlias + } + +main :: IO () +main = writeFile "generated.ts" $ formatTSDeclarations' formattingOptions ( + (getTypeScriptDeclarations (Proxy @ThreadToken)) <> + (getTypeScriptDeclarations (Proxy @DiffMilliSeconds)) <> + (getTypeScriptDeclarations (Proxy @MarketplaceContracts)) <> + (getTypeScriptDeclarations (Proxy @Marketplace.Marketplace)) <> + (getTypeScriptDeclarations (Proxy @(RemoteData T1 T2))) <> + (getTypeScriptDeclarations (Proxy @Marketplace.MarketplaceDatum)) <> + (getTypeScriptDeclarations (Proxy @Marketplace.UserItemId)) <> + (getTypeScriptDeclarations (Proxy @Marketplace.OwnerContractState)) <> + (getTypeScriptDeclarations (Proxy @Marketplace.UserContractState)) <> + (getTypeScriptDeclarations (Proxy @Marketplace.InfoContractState)) <> + (getTypeScriptDeclarations (Proxy @Marketplace.NftInfo)) <> + (getTypeScriptDeclarations (Proxy @Marketplace.NFT)) <> + (getTypeScriptDeclarations (Proxy @Marketplace.Bundle)) <> + (getTypeScriptDeclarations (Proxy @Marketplace.BundleInfo)) <> + (getTypeScriptDeclarations (Proxy @Marketplace.NftBundle)) <> + (getTypeScriptDeclarations (Proxy @Auction.AuctionState)) <> + (getTypeScriptDeclarations (Proxy @Auction.HighestBid)) <> + (getTypeScriptDeclarations (Proxy @Sale.Sale)) <> + (getTypeScriptDeclarations (Proxy @Marketplace.CreateNftParams)) <> + (getTypeScriptDeclarations (Proxy @Marketplace.OpenSaleParams)) <> + (getTypeScriptDeclarations (Proxy @Marketplace.CloseLotParams)) <> + (getTypeScriptDeclarations (Proxy @Marketplace.StartAnAuctionParams)) <> + (getTypeScriptDeclarations (Proxy @Marketplace.BidOnAuctionParams)) <> + (getTypeScriptDeclarations (Proxy @Marketplace.BundleUpParams)) <> + (getTypeScriptDeclarations (Proxy @Marketplace.UnbundleParams)) <> + (getTypeScriptDeclarations (Proxy @TxOutRef)) <> + (getTypeScriptDeclarations (Proxy @TxId)) <> + (getTypeScriptDeclarations (Proxy @CurrencySymbol)) <> + (getTypeScriptDeclarations (Proxy @PubKeyHash)) <> + (getTypeScriptDeclarations (Proxy @Value)) <> + (getTypeScriptDeclarations (Proxy @TokenName)) <> + (getTypeScriptDeclarations (Proxy @Ada)) <> + (getTypeScriptDeclarations (Proxy @(Either T1 T2)))) diff --git a/MetaLamp/nft-marketplace/plutus-starter.cabal b/MetaLamp/nft-marketplace/plutus-starter.cabal index 4a2642a8b..ea22d9645 100644 --- a/MetaLamp/nft-marketplace/plutus-starter.cabal +++ b/MetaLamp/nft-marketplace/plutus-starter.cabal @@ -111,6 +111,28 @@ executable generate-purs plutus-contract, plutus-ledger-api +executable generate-typescript + import: lang + main-is: Main.hs + hs-source-dirs: generate-typescript + ghc-options: + -threaded + build-depends: + base >= 4.9 && < 5, + aeson-typescript, + servant-purescript -any, + mtl, + directory, + lens, + aeson, + bytestring, + -- Plutus: + plutus-starter, + plutus-pab, + plutus-contract, + plutus-ledger-api, + plutus-tx + test-suite test import: lang type: exitcode-stdio-1.0