Skip to content

Commit

Permalink
Remove psc-package, combine remaining executables (purescript#2632)
Browse files Browse the repository at this point in the history
* Remove psc-package

* Single consolidated executable (purescript#2633)

* Single consolidated executable purescript#2336

* PSCi

* bundle

* docs

* hierarchy

* publish

* ide

* Remove some old options, fix purescript#2618

* Fix warning

* fix test failure and cabal warning (purescript#2634)

* fix test failure and cabal warning

* add missing files to cabal file

* Various

* Fix tests again
  • Loading branch information
paf31 committed Feb 8, 2017
1 parent 4599160 commit 74ca00d
Show file tree
Hide file tree
Showing 36 changed files with 408 additions and 1,219 deletions.
98 changes: 40 additions & 58 deletions psc-bundle/Main.hs → app/Command/Bundle.hs
Original file line number Diff line number Diff line change
Expand Up @@ -4,39 +4,30 @@
{-# LANGUAGE RecordWildCards #-}

-- | Bundles compiled PureScript modules for the browser.
module Main (main) where

import Data.Traversable (for)
import Data.Version (showVersion)
import Data.Monoid ((<>))
import Data.Aeson (encode)
import Data.Maybe (isNothing)

import Control.Applicative
import Control.Monad
import Control.Monad.Error.Class
import Control.Monad.Trans.Except
import Control.Monad.IO.Class

import System.FilePath (takeDirectory, (</>), (<.>), takeFileName)
import System.FilePath.Glob (glob)
import System.Exit (exitFailure)
import System.IO (stderr, stdout, hPutStrLn, hSetEncoding, utf8)
import System.IO.UTF8 (readUTF8File, writeUTF8File)
import System.Directory (createDirectoryIfMissing, getCurrentDirectory)

module Command.Bundle (command) where

import Data.Traversable (for)
import Data.Monoid ((<>))
import Data.Aeson (encode)
import Data.Maybe (isNothing)
import Control.Applicative
import Control.Monad
import Control.Monad.Error.Class
import Control.Monad.Trans.Except
import Control.Monad.IO.Class
import System.FilePath (takeDirectory, (</>), (<.>), takeFileName)
import System.FilePath.Glob (glob)
import System.Exit (exitFailure)
import System.IO (stderr, hPutStrLn)
import System.IO.UTF8 (readUTF8File, writeUTF8File)
import System.Directory (createDirectoryIfMissing, getCurrentDirectory)
import qualified Data.ByteString.Lazy as B
import qualified Data.ByteString.UTF8 as BU8

import Language.PureScript.Bundle

import Options.Applicative (Parser, ParseError (..))
import Language.PureScript.Bundle
import Options.Applicative (Parser)
import qualified Options.Applicative as Opts

import qualified Paths_purescript as Paths

import SourceMap
import SourceMap.Types
import SourceMap
import SourceMap.Types

-- | Command line options.
data Options = Options
Expand Down Expand Up @@ -117,31 +108,22 @@ options = Options <$> some inputFile
<> Opts.help "Whether to generate source maps for the bundle (requires --output)."

-- | Make it go.
main :: IO ()
main = do
hSetEncoding stdout utf8
hSetEncoding stderr utf8
opts <- Opts.execParser (Opts.info (version <*> Opts.helper <*> options) infoModList)
output <- runExceptT (app opts)
case output of
Left err -> do
hPutStrLn stderr (unlines (printErrorMessage err))
exitFailure
Right (sourcemap, js) ->
case optionsOutputFile opts of
Just outputFile -> do
createDirectoryIfMissing True (takeDirectory outputFile)
case sourcemap of
Just sm -> do
writeUTF8File outputFile $ js ++ "\n//# sourceMappingURL=" ++ (takeFileName outputFile <.> "map") ++ "\n"
writeUTF8File (outputFile <.> "map") $ BU8.toString . B.toStrict . encode $ generate sm
Nothing -> writeUTF8File outputFile js
Nothing -> putStrLn js
where
infoModList = Opts.fullDesc <> headerInfo <> footerInfo
headerInfo = Opts.header "psc-bundle - Bundles compiled PureScript modules for the browser"
footerInfo = Opts.footer $ "psc-bundle " ++ showVersion Paths.version

version :: Parser (a -> a)
version = Opts.abortOption (InfoMsg (showVersion Paths.version)) $
Opts.long "version" <> Opts.help "Show the version number" <> Opts.hidden
command :: Opts.Parser (IO ())
command = run <$> (Opts.helper <*> options) where
run :: Options -> IO ()
run opts = do
output <- runExceptT (app opts)
case output of
Left err -> do
hPutStrLn stderr (unlines (printErrorMessage err))
exitFailure
Right (sourcemap, js) ->
case optionsOutputFile opts of
Just outputFile -> do
createDirectoryIfMissing True (takeDirectory outputFile)
case sourcemap of
Just sm -> do
writeUTF8File outputFile $ js ++ "\n//# sourceMappingURL=" ++ (takeFileName outputFile <.> "map") ++ "\n"
writeUTF8File (outputFile <.> "map") $ BU8.toString . B.toStrict . encode $ generate sm
Nothing -> writeUTF8File outputFile js
Nothing -> putStrLn js
141 changes: 52 additions & 89 deletions psc/Main.hs → app/Command/Compile.hs
Original file line number Diff line number Diff line change
Expand Up @@ -4,32 +4,25 @@
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TupleSections #-}

module Main where
module Command.Compile (command) where

import Control.Applicative
import Control.Monad
import Control.Monad.Writer.Strict

import qualified Data.Aeson as A
import Data.Bool (bool)
import qualified Data.ByteString.Lazy as B
import qualified Data.ByteString.UTF8 as BU8
import qualified Data.Map as M
import Data.Text (Text)
import Data.Version (showVersion)

import qualified Language.PureScript as P
import Language.PureScript.Errors.JSON
import Language.PureScript.Make

import Options.Applicative as Opts

import qualified Paths_purescript as Paths

import qualified Options.Applicative as Opts
import qualified System.Console.ANSI as ANSI
import System.Exit (exitSuccess, exitFailure)
import System.FilePath.Glob (glob)
import System.IO (hSetEncoding, hPutStrLn, stdout, stderr, utf8)
import System.IO (hPutStrLn, stderr)
import System.IO.UTF8 (readUTF8FileT)

data PSCMakeOptions = PSCMakeOptions
Expand Down Expand Up @@ -89,94 +82,64 @@ globWarningOnMisses warn = concatMapM globWithWarning
readInput :: [FilePath] -> IO [(FilePath, Text)]
readInput inputFiles = forM inputFiles $ \inFile -> (inFile, ) <$> readUTF8FileT inFile

inputFile :: Parser FilePath
inputFile = strArgument $
metavar "FILE"
<> help "The input .purs file(s)"
inputFile :: Opts.Parser FilePath
inputFile = Opts.strArgument $
Opts.metavar "FILE"
<> Opts.help "The input .purs file(s)"

outputDirectory :: Parser FilePath
outputDirectory = strOption $
short 'o'
<> long "output"
outputDirectory :: Opts.Parser FilePath
outputDirectory = Opts.strOption $
Opts.short 'o'
<> Opts.long "output"
<> Opts.value "output"
<> showDefault
<> help "The output directory"

noTco :: Parser Bool
noTco = switch $
long "no-tco"
<> help "Disable tail call optimizations"

noMagicDo :: Parser Bool
noMagicDo = switch $
long "no-magic-do"
<> help "Disable the optimization that overloads the do keyword to generate efficient code specifically for the Eff monad"

noOpts :: Parser Bool
noOpts = switch $
long "no-opts"
<> help "Skip the optimization phase"

comments :: Parser Bool
comments = switch $
short 'c'
<> long "comments"
<> help "Include comments in the generated code"

verboseErrors :: Parser Bool
verboseErrors = switch $
short 'v'
<> long "verbose-errors"
<> help "Display verbose error messages"

noPrefix :: Parser Bool
noPrefix = switch $
short 'p'
<> long "no-prefix"
<> help "Do not include comment header"

jsonErrors :: Parser Bool
jsonErrors = switch $
long "json-errors"
<> help "Print errors to stderr as JSON"
sourceMaps :: Parser Bool
sourceMaps = switch $
long "source-maps"
<> help "Generate source maps"

dumpCoreFn :: Parser Bool
dumpCoreFn = switch $
long "dump-corefn"
<> help "Dump the (functional) core representation of the compiled code at output/*/corefn.json"


options :: Parser P.Options
options = P.Options <$> noTco
<*> noMagicDo
<*> pure Nothing
<*> noOpts
<*> verboseErrors
<> Opts.showDefault
<> Opts.help "The output directory"

comments :: Opts.Parser Bool
comments = Opts.switch $
Opts.short 'c'
<> Opts.long "comments"
<> Opts.help "Include comments in the generated code"

verboseErrors :: Opts.Parser Bool
verboseErrors = Opts.switch $
Opts.short 'v'
<> Opts.long "verbose-errors"
<> Opts.help "Display verbose error messages"

noPrefix :: Opts.Parser Bool
noPrefix = Opts.switch $
Opts.short 'p'
<> Opts.long "no-prefix"
<> Opts.help "Do not include comment header"

jsonErrors :: Opts.Parser Bool
jsonErrors = Opts.switch $
Opts.long "json-errors"
<> Opts.help "Print errors to stderr as JSON"

sourceMaps :: Opts.Parser Bool
sourceMaps = Opts.switch $
Opts.long "source-maps"
<> Opts.help "Generate source maps"

dumpCoreFn :: Opts.Parser Bool
dumpCoreFn = Opts.switch $
Opts.long "dump-corefn"
<> Opts.help "Dump the (functional) core representation of the compiled code at output/*/corefn.json"

options :: Opts.Parser P.Options
options = P.Options <$> verboseErrors
<*> (not <$> comments)
<*> sourceMaps
<*> dumpCoreFn

pscMakeOptions :: Parser PSCMakeOptions
pscMakeOptions :: Opts.Parser PSCMakeOptions
pscMakeOptions = PSCMakeOptions <$> many inputFile
<*> outputDirectory
<*> options
<*> (not <$> noPrefix)
<*> jsonErrors

main :: IO ()
main = do
hSetEncoding stdout utf8
hSetEncoding stderr utf8
execParser opts >>= compile
where
opts = info (version <*> helper <*> pscMakeOptions) infoModList
infoModList = fullDesc <> headerInfo <> footerInfo
headerInfo = header "psc - Compiles PureScript to Javascript"
footerInfo = footer $ "psc " ++ showVersion Paths.version

version :: Parser (a -> a)
version = abortOption (InfoMsg (showVersion Paths.version)) $ long "version" <> help "Show the version number" <> hidden
command :: Opts.Parser (IO ())
command = compile <$> (Opts.helper <*> pscMakeOptions)
Loading

0 comments on commit 74ca00d

Please sign in to comment.