From 202093bc0ab1342062dde57910fd03e791d94501 Mon Sep 17 00:00:00 2001 From: Reisen Date: Fri, 7 Jun 2019 12:07:34 +0100 Subject: [PATCH 1/3] Extend FormattingOptions to allow type name modifiers. --- src/Data/Aeson/TypeScript/Formatting.hs | 7 +++++-- src/Data/Aeson/TypeScript/Instances.hs | 2 +- src/Data/Aeson/TypeScript/Types.hs | 11 ++++++++--- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/Data/Aeson/TypeScript/Formatting.hs b/src/Data/Aeson/TypeScript/Formatting.hs index 4827295..04e71e3 100644 --- a/src/Data/Aeson/TypeScript/Formatting.hs +++ b/src/Data/Aeson/TypeScript/Formatting.hs @@ -13,11 +13,14 @@ formatTSDeclarations = formatTSDeclarations' defaultFormattingOptions -- | Format a single TypeScript declaration. This version accepts a FormattingOptions object in case you want more control over the output. formatTSDeclaration :: FormattingOptions -> TSDeclaration -> String -formatTSDeclaration (FormattingOptions {numIndentSpaces}) (TSTypeAlternatives name genericVariables names) = [i|type #{name}#{getGenericBrackets genericVariables} = #{alternatives};|] +formatTSDeclaration (FormattingOptions {..}) (TSTypeAlternatives name genericVariables names) = + [i|type #{interfaceNameModifier name}#{getGenericBrackets genericVariables} = #{alternatives};|] where alternatives = T.intercalate " | " (fmap T.pack names) -formatTSDeclaration (FormattingOptions {numIndentSpaces}) (TSInterfaceDeclaration interfaceName genericVariables members) = [i|interface #{interfaceName}#{getGenericBrackets genericVariables} { + +formatTSDeclaration (FormattingOptions {..}) (TSInterfaceDeclaration interfaceName genericVariables members) = [i|interface #{modifiedInterfaceName}#{getGenericBrackets genericVariables} { #{lines} }|] where lines = T.intercalate "\n" $ fmap T.pack [(replicate numIndentSpaces ' ') <> formatTSField member <> ";"| member <- members] + modifiedInterfaceName = (\(i, name) -> i <> interfaceNameModifier name) . splitAt 1 $ interfaceName -- | Format a list of TypeScript declarations into a string, suitable for putting directly into a @.d.ts@ file. formatTSDeclarations' :: FormattingOptions -> [TSDeclaration] -> String diff --git a/src/Data/Aeson/TypeScript/Instances.hs b/src/Data/Aeson/TypeScript/Instances.hs index fe7df5f..cbc0a08 100644 --- a/src/Data/Aeson/TypeScript/Instances.hs +++ b/src/Data/Aeson/TypeScript/Instances.hs @@ -1,4 +1,4 @@ -{-# LANGUAGE QuasiQuotes, OverloadedStrings, TemplateHaskell, RecordWildCards, ScopedTypeVariables, ExistentialQuantification, FlexibleInstances, OverlappingInstances #-} +{-# LANGUAGE QuasiQuotes, OverloadedStrings, TemplateHaskell, RecordWildCards, ScopedTypeVariables, ExistentialQuantification, FlexibleInstances #-} -- Note: the OverlappingInstances pragma is only here so the overlapping instances in this file -- will work on older GHCs, like GHC 7.8.4 diff --git a/src/Data/Aeson/TypeScript/Types.hs b/src/Data/Aeson/TypeScript/Types.hs index 4f95e65..4ecf3c1 100644 --- a/src/Data/Aeson/TypeScript/Types.hs +++ b/src/Data/Aeson/TypeScript/Types.hs @@ -69,12 +69,17 @@ instance IsString (TSString a) where -- * Formatting options -data FormattingOptions = FormattingOptions { - numIndentSpaces :: Int +data FormattingOptions = FormattingOptions + { numIndentSpaces :: Int -- ^ How many spaces to indent TypeScript blocks + , interfaceNameModifier :: String -> String + -- ^ How to modify an output interface or type name } -defaultFormattingOptions = FormattingOptions 2 +defaultFormattingOptions = FormattingOptions + { numIndentSpaces = 2 + , interfaceNameModifier = id + } -- | Convenience typeclass class you can use to "attach" a set of Aeson encoding options to a type. class HasJSONOptions a where From 9482e92a222df3594e8669b5e7d814db1d7209ef Mon Sep 17 00:00:00 2001 From: Reisen Date: Fri, 7 Jun 2019 12:21:59 +0100 Subject: [PATCH 2/3] Split interface/type modifiers into two functions. --- src/Data/Aeson/TypeScript/Formatting.hs | 2 +- src/Data/Aeson/TypeScript/Types.hs | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/Data/Aeson/TypeScript/Formatting.hs b/src/Data/Aeson/TypeScript/Formatting.hs index 04e71e3..9396403 100644 --- a/src/Data/Aeson/TypeScript/Formatting.hs +++ b/src/Data/Aeson/TypeScript/Formatting.hs @@ -14,7 +14,7 @@ formatTSDeclarations = formatTSDeclarations' defaultFormattingOptions -- | Format a single TypeScript declaration. This version accepts a FormattingOptions object in case you want more control over the output. formatTSDeclaration :: FormattingOptions -> TSDeclaration -> String formatTSDeclaration (FormattingOptions {..}) (TSTypeAlternatives name genericVariables names) = - [i|type #{interfaceNameModifier name}#{getGenericBrackets genericVariables} = #{alternatives};|] + [i|type #{typeNameModifier name}#{getGenericBrackets genericVariables} = #{alternatives};|] where alternatives = T.intercalate " | " (fmap T.pack names) formatTSDeclaration (FormattingOptions {..}) (TSInterfaceDeclaration interfaceName genericVariables members) = [i|interface #{modifiedInterfaceName}#{getGenericBrackets genericVariables} { diff --git a/src/Data/Aeson/TypeScript/Types.hs b/src/Data/Aeson/TypeScript/Types.hs index 4ecf3c1..113a25f 100644 --- a/src/Data/Aeson/TypeScript/Types.hs +++ b/src/Data/Aeson/TypeScript/Types.hs @@ -73,12 +73,15 @@ data FormattingOptions = FormattingOptions { numIndentSpaces :: Int -- ^ How many spaces to indent TypeScript blocks , interfaceNameModifier :: String -> String - -- ^ How to modify an output interface or type name + -- ^ How to modify an output interface name + , typeNameModifier :: String -> String + -- ^ How to modify an output type name } defaultFormattingOptions = FormattingOptions { numIndentSpaces = 2 , interfaceNameModifier = id + , typeNameModifier = id } -- | Convenience typeclass class you can use to "attach" a set of Aeson encoding options to a type. From 546b03d310941d2c9bd76c9167bf0fc7503951ea Mon Sep 17 00:00:00 2001 From: Reisen Date: Fri, 7 Jun 2019 14:51:09 +0100 Subject: [PATCH 3/3] Undo removal of Overlapping extension. --- src/Data/Aeson/TypeScript/Instances.hs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Data/Aeson/TypeScript/Instances.hs b/src/Data/Aeson/TypeScript/Instances.hs index cbc0a08..fe7df5f 100644 --- a/src/Data/Aeson/TypeScript/Instances.hs +++ b/src/Data/Aeson/TypeScript/Instances.hs @@ -1,4 +1,4 @@ -{-# LANGUAGE QuasiQuotes, OverloadedStrings, TemplateHaskell, RecordWildCards, ScopedTypeVariables, ExistentialQuantification, FlexibleInstances #-} +{-# LANGUAGE QuasiQuotes, OverloadedStrings, TemplateHaskell, RecordWildCards, ScopedTypeVariables, ExistentialQuantification, FlexibleInstances, OverlappingInstances #-} -- Note: the OverlappingInstances pragma is only here so the overlapping instances in this file -- will work on older GHCs, like GHC 7.8.4