on master help sign in
Update elm-server to work with 0.9, compiles multiple files
0f400daEvan Czaplicki
server/Server.hs+23−14
@@ -7,17 +7,19 @@ import Data.List (isPrefixOf, isSuffixOf, (\\))
7import Data.Version (showVersion)
7import Data.Version (showVersion)
8import Happstack.Server
8import Happstack.Server
9import Happstack.Server.Compression
9import Happstack.Server.Compression
10+import System.Directory
10import System.Environment
11import System.Environment
11import System.FilePath
12import System.FilePath
13+import System.Process
12import qualified Language.Elm as Elm
14import qualified Language.Elm as Elm
13import Paths_elm_server
15import Paths_elm_server
14
16
15−runtime = "/elm-" ++ showVersion version ++ ".js"
17+runtime = "/elm-runtime.js"
16
18
17serve :: Int -> String -> IO ()
19serve :: Int -> String -> IO ()
18serve portNumber libLoc = do
20serve portNumber libLoc = do
19− putStrLn ("Elm Server " ++ showVersion version ++
21+ putStrLn $ "Elm Server " ++ showVersion version ++
20− ": running at <http://localhost:" ++ (show portNumber) ++ ">")
22+ ": running at <http://localhost:" ++ show portNumber ++ ">"
21 putStrLn "Just refresh a page to recompile it!"
23 putStrLn "Just refresh a page to recompile it!"
22 simpleHTTP httpConf $ do
24 simpleHTTP httpConf $ do
23 _ <- compressedResponseFilter
25 _ <- compressedResponseFilter
@@ -30,11 +32,16 @@ serve portNumber libLoc = do
30pageTitle :: String -> String
32pageTitle :: String -> String
31pageTitle = dropExtension . takeBaseName
33pageTitle = dropExtension . takeBaseName
32
34
35+serveElm :: FilePath -> ServerPartT IO Response
33serveElm fp = do
36serveElm fp = do
34 guard (takeExtension fp == ".elm")
37 guard (takeExtension fp == ".elm")
35− content <- liftIO (readFile (tail fp))
38+ let file = tail fp
36− length content `seq` (ok . toResponse $ Elm.toHtml runtime (pageTitle fp) content)
39+ liftIO $ rawSystem "elm" [ "--make" ,"--runtime=" ++ runtime
40+ , "--cache-dir=elm-server-cache", file ]
41+ liftIO $ removeDirectoryRecursive "elm-server-cache"
42+ serveFile (asContentType "text/html") ("build" </> replaceExtension file "html")
37
43
44+serveLib :: FilePath -> [Char] -> ServerPartT IO Response
38serveLib libLoc fp = do
45serveLib libLoc fp = do
39 guard (fp == runtime)
46 guard (fp == runtime)
40 serveFile (asContentType "application/javascript") libLoc
47 serveFile (asContentType "application/javascript") libLoc
@@ -45,16 +52,18 @@ main = getArgs >>= parse
45parse :: [String] -> IO ()
52parse :: [String] -> IO ()
46parse ("--help":_) = putStrLn usage
53parse ("--help":_) = putStrLn usage
47parse ("--version":_) = putStrLn ("The Elm Server " ++ showVersion version)
54parse ("--version":_) = putStrLn ("The Elm Server " ++ showVersion version)
55+parse args =
48−parse args = if null remainingArgs
56+ case null remainingArgs of
49− then serve portNumber =<< elmRuntime
57+ True -> serve portNumber =<< elmRuntime
50− else putStrLn usageMini
58+ False -> putStrLn usageMini
59+ where
51− where runtimeArg = filter (isPrefixOf "--runtime-location=") args
60+ runtimeArg = filter (isPrefixOf "--runtime-location=") args
52− portArg = filter (isPrefixOf "--port=") args
61+ portArg = filter (isPrefixOf "--port=") args
53− remainingArgs = (args \\ runtimeArg) \\ portArg
62+ remainingArgs = (args \\ runtimeArg) \\ portArg
54
63
55− argValue arg = tail $ dropWhile (/= '=') (head arg)
64+ argValue arg = tail $ dropWhile (/= '=') (head arg)
56− portNumber = if null portArg then 8000 else read (argValue portArg) :: Int
65+ portNumber = if null portArg then 8000 else read (argValue portArg) :: Int
57− elmRuntime = if null runtimeArg then Elm.runtime else return $ argValue runtimeArg
66+ elmRuntime = if null runtimeArg then Elm.runtime else return $ argValue runtimeArg
58
67
59usageMini :: String
68usageMini :: String
60usageMini =
69usageMini =
server/elm-server.cabal+5−3
@@ -1,5 +1,5 @@
1Name: elm-server
1Name: elm-server
2−Version: 0.8
2+Version: 0.9
3Synopsis: The Elm language server.
3Synopsis: The Elm language server.
4Description: This package provides a standalone, Happstack-based Elm server.
4Description: This package provides a standalone, Happstack-based Elm server.
5
5
@@ -27,12 +27,14 @@ Executable elm-server
27 Main-is: Server.hs
27 Main-is: Server.hs
28 Build-depends: base >=4.2 && <5,
28 Build-depends: base >=4.2 && <5,
29 containers >= 0.3,
29 containers >= 0.3,
30+ directory,
30 transformers >= 0.2,
31 transformers >= 0.2,
31 mtl >= 2,
32 mtl >= 2,
32 parsec >= 3.1.1,
33 parsec >= 3.1.1,
33 blaze-html >= 0.5.1,
34 blaze-html >= 0.5.1,
34 HTTP >= 4000,
35 HTTP >= 4000,
35− happstack-server == 7.1.1 || == 7.1.7 || == 7.0.2,
36+ happstack-server,
36 deepseq,
37 deepseq,
37 filepath,
38 filepath,
38− Elm >= 0.8
39+ Elm >= 0.9.0.1,
40+ process