* gnu/packages/patches/elm-compiler-disable-reactor.patch, gnu/packages/patches/elm-compiler-fix-map-key.patch: Delete files. * gnu/packages/patches/elm-reactor-static-files.patch: New file. * gnu/local.mk (dist_patch_DATA): Update accordingly. * gnu/packages/elm.scm (elm-compiler): Update to 0.19.1. [origin]<patches>: Remove stale patches. Add new patch. [arguments]: Use G-expressions. Add #:configure-flags for new patch. [inputs]: Remove ghc-file-embed. Add ghc-filelock. Signed-off-by: Ludovic Courtès <ludo@gnu.org>
		
			
				
	
	
		
			251 lines
		
	
	
	
		
			7.1 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			251 lines
		
	
	
	
		
			7.1 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| From 41d219a29b03f3114af7a0521c8b2dbbb487c3e1 Mon Sep 17 00:00:00 2001
 | |
| From: Philip McGrath <philip@philipmcgrath.com>
 | |
| Date: Wed, 13 Apr 2022 18:45:58 -0400
 | |
| Subject: [PATCH] reactor: look for static files relative to executable
 | |
| 
 | |
| Must built with `-DGUIX_REACTOR_STATIC_REL_ROOT="../path/to/reactor"`.
 | |
| 
 | |
| This lets us build a version of Elm without the `elm reactor` for
 | |
| bootstrapping, then simply put the files in place in the final package.
 | |
| ---
 | |
|  elm.cabal                                 |  2 +-
 | |
|  terminal/src/Develop.hs                   | 32 +++++++++++----
 | |
|  terminal/src/Develop/StaticFiles.hs       | 37 ++++++++++-------
 | |
|  terminal/src/Develop/StaticFiles/Build.hs | 50 ++++++++++++++---------
 | |
|  4 files changed, 79 insertions(+), 42 deletions(-)
 | |
| 
 | |
| diff --git a/elm.cabal b/elm.cabal
 | |
| index bf1cfcf0..93161072 100644
 | |
| --- a/elm.cabal
 | |
| +++ b/elm.cabal
 | |
| @@ -50,6 +50,7 @@ Executable elm
 | |
|  
 | |
|      other-extensions:
 | |
|          TemplateHaskell
 | |
| +        CPP
 | |
|  
 | |
|      Main-Is:
 | |
|          Main.hs
 | |
| @@ -211,7 +212,6 @@ Executable elm
 | |
|          containers >= 0.5.8.2 && < 0.6,
 | |
|          directory >= 1.2.3.0 && < 2.0,
 | |
|          edit-distance >= 0.2 && < 0.3,
 | |
| -        file-embed,
 | |
|          filelock,
 | |
|          filepath >= 1 && < 2.0,
 | |
|          ghc-prim >= 0.5.2,
 | |
| diff --git a/terminal/src/Develop.hs b/terminal/src/Develop.hs
 | |
| index 00339364..6855b03e 100644
 | |
| --- a/terminal/src/Develop.hs
 | |
| +++ b/terminal/src/Develop.hs
 | |
| @@ -33,6 +33,7 @@ import qualified Reporting.Exit as Exit
 | |
|  import qualified Reporting.Task as Task
 | |
|  import qualified Stuff
 | |
|  
 | |
| +import System.Exit as SysExit
 | |
|  
 | |
|  
 | |
|  -- RUN THE DEV SERVER
 | |
| @@ -45,13 +46,29 @@ data Flags =
 | |
|  
 | |
|  
 | |
|  run :: () -> Flags -> IO ()
 | |
| -run () (Flags maybePort) =
 | |
| +run () flags = do
 | |
| +  frontEnd <- StaticFiles.prepare
 | |
| +  case frontEnd of
 | |
| +    Right lookup ->
 | |
| +      reallyRun lookup flags
 | |
| +    Left missing ->
 | |
| +      SysExit.die $ unlines
 | |
| +      [ "The `reactor` command is not available."
 | |
| +      , ""
 | |
| +      , "On Guix, these files are needed for `elm reactor` to work,"
 | |
| +      , "but they are missing:"
 | |
| +      , ""
 | |
| +      , unlines (map (\pth -> "    " ++ (show pth)) missing)
 | |
| +      ]
 | |
| +
 | |
| +reallyRun :: StaticFiles.Lookup -> Flags -> IO ()
 | |
| +reallyRun lookup (Flags maybePort) =
 | |
|    do  let port = maybe 8000 id maybePort
 | |
|        putStrLn $ "Go to http://localhost:" ++ show port ++ " to see your project dashboard."
 | |
|        httpServe (config port) $
 | |
|          serveFiles
 | |
|          <|> serveDirectoryWith directoryConfig "."
 | |
| -        <|> serveAssets
 | |
| +        <|> serveAssets lookup
 | |
|          <|> error404
 | |
|  
 | |
|  
 | |
| @@ -169,16 +186,15 @@ compile path =
 | |
|  -- SERVE STATIC ASSETS
 | |
|  
 | |
|  
 | |
| -serveAssets :: Snap ()
 | |
| -serveAssets =
 | |
| +serveAssets :: StaticFiles.Lookup -> Snap ()
 | |
| +serveAssets lookup =
 | |
|    do  path <- getSafePath
 | |
| -      case StaticFiles.lookup path of
 | |
| +      case lookup path of
 | |
|          Nothing ->
 | |
|            pass
 | |
|  
 | |
| -        Just (content, mimeType) ->
 | |
| -          do  modifyResponse (setContentType (mimeType <> ";charset=utf-8"))
 | |
| -              writeBS content
 | |
| +        Just (fsPath, mimeType) ->
 | |
| +          serveFileAs (mimeType <> ";charset=utf-8") fsPath
 | |
|  
 | |
|  
 | |
|  
 | |
| diff --git a/terminal/src/Develop/StaticFiles.hs b/terminal/src/Develop/StaticFiles.hs
 | |
| index 94ee72dc..3227d617 100644
 | |
| --- a/terminal/src/Develop/StaticFiles.hs
 | |
| +++ b/terminal/src/Develop/StaticFiles.hs
 | |
| @@ -2,7 +2,8 @@
 | |
|  {-# LANGUAGE OverloadedStrings #-}
 | |
|  {-# LANGUAGE TemplateHaskell #-}
 | |
|  module Develop.StaticFiles
 | |
| -  ( lookup
 | |
| +  ( prepare
 | |
| +  , Lookup
 | |
|    , cssPath
 | |
|    , elmPath
 | |
|    , waitingPath
 | |
| @@ -11,9 +12,7 @@ module Develop.StaticFiles
 | |
|  
 | |
|  import Prelude hiding (lookup)
 | |
|  import qualified Data.ByteString as BS
 | |
| -import Data.FileEmbed (bsToExp)
 | |
|  import qualified Data.HashMap.Strict as HM
 | |
| -import Language.Haskell.TH (runIO)
 | |
|  import System.FilePath ((</>))
 | |
|  
 | |
|  import qualified Develop.StaticFiles.Build as Build
 | |
| @@ -26,20 +25,29 @@ import qualified Develop.StaticFiles.Build as Build
 | |
|  type MimeType =
 | |
|    BS.ByteString
 | |
|  
 | |
| +type Lookup = FilePath -> Maybe (FilePath, MimeType)
 | |
|  
 | |
| -lookup :: FilePath -> Maybe (BS.ByteString, MimeType)
 | |
| -lookup path =
 | |
| +prepare :: IO (Either [FilePath] Lookup)
 | |
| +prepare = do
 | |
| +  found <- Build.findReactorFrontEnd expectedFiles
 | |
| +  return $ case found of
 | |
| +    Left missing ->
 | |
| +      Left missing
 | |
| +    Right resolved ->
 | |
| +      Right (mkLookup (HM.fromList resolved))
 | |
| +
 | |
| +mkLookup :: HM.HashMap FilePath (FilePath, MimeType) -> Lookup
 | |
| +mkLookup dict path =
 | |
|    HM.lookup path dict
 | |
|  
 | |
|  
 | |
| -dict :: HM.HashMap FilePath (BS.ByteString, MimeType)
 | |
| -dict =
 | |
| -  HM.fromList
 | |
| -    [ faviconPath  ==> (favicon , "image/x-icon")
 | |
| -    , elmPath      ==> (elm     , "application/javascript")
 | |
| -    , cssPath      ==> (css     , "text/css")
 | |
| -    , codeFontPath ==> (codeFont, "font/ttf")
 | |
| -    , sansFontPath ==> (sansFont, "font/ttf")
 | |
| +expectedFiles :: [(FilePath, MimeType)]
 | |
| +expectedFiles =
 | |
| +    [ faviconPath  ==> "image/x-icon"
 | |
| +    , elmPath      ==> "application/javascript"
 | |
| +    , cssPath      ==> "text/css"
 | |
| +    , codeFontPath ==> "font/ttf"
 | |
| +    , sansFontPath ==> "font/ttf"
 | |
|      ]
 | |
|  
 | |
|  
 | |
| @@ -82,7 +90,7 @@ sansFontPath =
 | |
|    "_elm" </> "source-sans-pro.ttf"
 | |
|  
 | |
|  
 | |
| -
 | |
| +{-
 | |
|  -- ELM
 | |
|  
 | |
|  
 | |
| @@ -121,3 +129,4 @@ sansFont =
 | |
|  favicon :: BS.ByteString
 | |
|  favicon =
 | |
|    $(bsToExp =<< runIO (Build.readAsset "favicon.ico"))
 | |
| +-}
 | |
| diff --git a/terminal/src/Develop/StaticFiles/Build.hs b/terminal/src/Develop/StaticFiles/Build.hs
 | |
| index c61fae57..c39b08b0 100644
 | |
| --- a/terminal/src/Develop/StaticFiles/Build.hs
 | |
| +++ b/terminal/src/Develop/StaticFiles/Build.hs
 | |
| @@ -1,28 +1,39 @@
 | |
|  {-# LANGUAGE OverloadedStrings #-}
 | |
| +{-# LANGUAGE CPP #-}
 | |
|  module Develop.StaticFiles.Build
 | |
| -  ( readAsset
 | |
| -  , buildReactorFrontEnd
 | |
| +  ( findReactorFrontEnd
 | |
|    )
 | |
|    where
 | |
|  
 | |
| -
 | |
| -import qualified Data.ByteString as BS
 | |
| -import qualified Data.ByteString.Builder as B
 | |
| -import qualified Data.ByteString.Lazy as LBS
 | |
| -import qualified Data.NonEmptyList as NE
 | |
|  import qualified System.Directory as Dir
 | |
| -import System.FilePath ((</>))
 | |
| -
 | |
| -import qualified BackgroundWriter as BW
 | |
| -import qualified Build
 | |
| -import qualified Elm.Details as Details
 | |
| -import qualified Generate
 | |
| -import qualified Reporting
 | |
| -import qualified Reporting.Exit as Exit
 | |
| -import qualified Reporting.Task as Task
 | |
| -
 | |
| -
 | |
| -
 | |
| +import System.FilePath ((</>), takeDirectory)
 | |
| +import System.Environment (getExecutablePath)
 | |
| +import Data.Either as Either
 | |
| +
 | |
| +reactorStaticRelRoot :: FilePath
 | |
| +reactorStaticRelRoot = GUIX_REACTOR_STATIC_REL_ROOT
 | |
| +
 | |
| +type Resolved a = (FilePath, (FilePath, a))
 | |
| +
 | |
| +findReactorFrontEnd :: [(FilePath, a)] -> IO (Either [FilePath] [Resolved a])
 | |
| +findReactorFrontEnd specs = do
 | |
| +  exe <- getExecutablePath
 | |
| +  let dir = takeDirectory exe </> reactorStaticRelRoot
 | |
| +  dirExists <- Dir.doesDirectoryExist dir
 | |
| +  files <- sequence (map (findFile dir) specs)
 | |
| +  return $ case Either.lefts files of
 | |
| +           [] ->
 | |
| +             Right (Either.rights files)
 | |
| +           missing ->
 | |
| +             Left $ if dirExists then missing else [dir]
 | |
| +
 | |
| +findFile :: FilePath -> (FilePath, a) -> IO (Either FilePath (Resolved a))
 | |
| +findFile dir (rel, rhs) = do
 | |
| +  let abs = dir </> rel
 | |
| +  exists <- Dir.doesFileExist abs
 | |
| +  return $ if not exists then Left abs else Right (rel, (abs, rhs))
 | |
| +
 | |
| +{-
 | |
|  -- ASSETS
 | |
|  
 | |
|  
 | |
| @@ -71,3 +82,4 @@ runTaskUnsafe task =
 | |
|                  \\nCompile with `elm make` directly to figure it out faster\
 | |
|                  \\n--------------------------------------------------------\
 | |
|                  \\n"
 | |
| +-}
 | |
| -- 
 | |
| 2.32.0
 | |
| 
 |