elm-server 0.8 → 0.9
raw patch · 2 files changed
+37/−18 lines, 2 filesdep +directorydep +processdep ~Elmdep ~happstack-server
Dependencies added: directory, process
Dependency ranges changed: Elm, happstack-server
Files
- Server.hs +32/−15
- elm-server.cabal +5/−3
Server.hs view
@@ -3,37 +3,45 @@ import Control.Monad (msum,guard) import Control.Monad.Trans (MonadIO(liftIO))-import Data.List (isPrefixOf, isSuffixOf)+import Data.List (isPrefixOf, isSuffixOf, (\\)) import Data.Version (showVersion) import Happstack.Server import Happstack.Server.Compression+import System.Directory import System.Environment import System.FilePath+import System.Process import qualified Language.Elm as Elm import Paths_elm_server -runtime = "/elm-" ++ showVersion version ++ ".js"+runtime = "/elm-runtime.js" -serve :: String -> IO ()-serve libLoc = do- putStrLn ("Elm Server " ++ showVersion version ++- ": running at <http://localhost:8000>")+serve :: Int -> String -> IO ()+serve portNumber libLoc = do+ putStrLn $ "Elm Server " ++ showVersion version +++ ": running at <http://localhost:" ++ show portNumber ++ ">" putStrLn "Just refresh a page to recompile it!"- simpleHTTP nullConf $ do+ simpleHTTP httpConf $ do _ <- compressedResponseFilter msum [ uriRest serveElm , uriRest (serveLib libLoc) , serveDirectory EnableBrowsing [] "." ]+ where httpConf = nullConf { port = portNumber } pageTitle :: String -> String pageTitle = dropExtension . takeBaseName +serveElm :: FilePath -> ServerPartT IO Response serveElm fp = do guard (takeExtension fp == ".elm")- content <- liftIO (readFile (tail fp))- ok . toResponse $ Elm.toHtml runtime (pageTitle fp) content+ let file = tail fp+ liftIO $ rawSystem "elm" [ "--make" ,"--runtime=" ++ runtime+ , "--cache-dir=elm-server-cache", file ]+ liftIO $ removeDirectoryRecursive "elm-server-cache"+ serveFile (asContentType "text/html") ("build" </> replaceExtension file "html") +serveLib :: FilePath -> [Char] -> ServerPartT IO Response serveLib libLoc fp = do guard (fp == runtime) serveFile (asContentType "application/javascript") libLoc@@ -44,13 +52,19 @@ parse :: [String] -> IO () parse ("--help":_) = putStrLn usage parse ("--version":_) = putStrLn ("The Elm Server " ++ showVersion version)-parse [] = serve =<< Elm.runtime-parse [arg]- | "--runtime-location=" `isPrefixOf` arg =- serve . tail $ dropWhile (/='=') arg- | otherwise = putStrLn usageMini-parse _ = putStrLn usageMini+parse args =+ case null remainingArgs of+ True -> serve portNumber =<< elmRuntime+ False -> putStrLn usageMini+ where+ runtimeArg = filter (isPrefixOf "--runtime-location=") args+ portArg = filter (isPrefixOf "--port=") args+ remainingArgs = (args \\ runtimeArg) \\ portArg + argValue arg = tail $ dropWhile (/= '=') (head arg)+ portNumber = if null portArg then 8000 else read (argValue portArg) :: Int+ elmRuntime = if null runtimeArg then Elm.runtime else return $ argValue runtimeArg+ usageMini :: String usageMini = "Usage: elm-server [OPTIONS]\n\@@ -61,6 +75,9 @@ "Usage: elm-server [OPTIONS]\n\ \Compiles and serves .elm files from the current directory.\n\ \Example: elm-server\n\+ \\n\+ \Server configuration:\n\+ \ --port set the port to listen on (default: 8000)\n\ \\n\ \Resource Locations:\n\ \ --runtime-location set the location of the Elm runtime\n\
elm-server.cabal view
@@ -1,5 +1,5 @@ Name: elm-server-Version: 0.8+Version: 0.9 Synopsis: The Elm language server. Description: This package provides a standalone, Happstack-based Elm server. @@ -27,12 +27,14 @@ Main-is: Server.hs Build-depends: base >=4.2 && <5, containers >= 0.3,+ directory, transformers >= 0.2, mtl >= 2, parsec >= 3.1.1, blaze-html >= 0.5.1, HTTP >= 4000,- happstack-server == 7.1.1 || == 7.1.7 || == 7.0.2,+ happstack-server, deepseq, filepath,- Elm >= 0.8+ Elm >= 0.9.0.1,+ process