-
Notifications
You must be signed in to change notification settings - Fork 2
/
Cli.purs
105 lines (91 loc) · 3.25 KB
/
Cli.purs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
-- | This module contains code that can turn a TsProgram into a CLI that writes
-- | it to the file system.
-- |
module TsBridge.Cli (mkTypeGenCli) where
import Prelude
import ArgParse.Basic (ArgParser)
import ArgParse.Basic as Arg
import DTS (TsProgram)
import DTS.Print (Path(..), TsSource(..), printTsProgram)
import Data.Array as Array
import Data.Either (Either(..))
import Data.Foldable (for_)
import Data.Map as Map
import Data.Newtype (un)
import Data.Tuple.Nested ((/\))
import Effect (Effect)
import Effect.Aff (Aff, launchAff_)
import Effect.Class (liftEffect)
import Effect.Class.Console (log)
import Effect.Class.Console as Console
import Node.Encoding (Encoding(..))
import Node.FS.Aff (mkdir', writeTextFile)
import Node.FS.Perms (all, mkPerms)
import Node.Path (dirname)
import Node.Process as Process
import TsBridge.Types (AppError, printError)
-------------------------------------------------------------------------------
-- Types
-------------------------------------------------------------------------------
type TsBridgeCliOpts =
{ outputDir :: Path
}
-------------------------------------------------------------------------------
-- CLI Options
-------------------------------------------------------------------------------
cliParser :: ArgParser TsBridgeCliOpts
cliParser = Arg.fromRecord
{ outputDir:
Arg.argument [ "--output-dir" ]
"Dictionary the CLI will write the output d.ts files to."
# Arg.default "output"
<#> Path
}
getArgs :: Effect TsBridgeCliOpts
getArgs = do
args <- Array.drop 2 <$> liftEffect Process.argv
let result = Arg.parseArgs "ts-bridge-cli" "Generates TypeScript Types from PureScript code" cliParser args
case result of
Left err -> do
Console.log $ Arg.printArgError err
case err of
Arg.ArgError _ Arg.ShowHelp ->
Process.exit' 0
Arg.ArgError _ (Arg.ShowInfo _) ->
Process.exit' 0
_ ->
Process.exit' 1
Right val -> pure val
-------------------------------------------------------------------------------
-- App
-------------------------------------------------------------------------------
mkTypeGenCliAff :: Either AppError TsProgram -> Aff Unit
mkTypeGenCliAff eitherTsProg = do
cliOpts <- liftEffect getArgs
case eitherTsProg of
Left err -> do
log ""
log "Cannot generate TypeScript Code. The following error happened:"
log ""
log $ {- show $ -} printError err
log ""
liftEffect $ Process.exit' 1
Right tsProg -> writeTsProgramToDisk cliOpts tsProg
writeTsProgramToDisk :: TsBridgeCliOpts -> TsProgram -> Aff Unit
writeTsProgramToDisk cliOpts tsProg = do
let files = Map.toUnfoldable $ printTsProgram tsProg :: Array _
for_ files
( \(modPath /\ source) -> do
let
filePath = cliOpts.outputDir <> Path "/" <> modPath
log $ un Path filePath
mkdir' (dirname $ un Path filePath)
{ recursive: true
, mode: mkPerms all all all
}
writeTextFile UTF8 (un Path filePath) (un TsSource source)
)
-- | Given a `TsProgram` returns an effectful CLI that can be used as an entry
-- | point for a type generator.
mkTypeGenCli :: Either AppError TsProgram -> Effect Unit
mkTypeGenCli tsProg = launchAff_ $ mkTypeGenCliAff tsProg