elm-init 0.1.2.1 → 1.0.0.0
raw patch · 4 files changed
+69/−17 lines, 4 filesdep ~base
Dependency ranges changed: base
Files
- elm-init.cabal +10/−3
- resources/Main.elm +1/−1
- resources/index.html +11/−0
- src/Main.hs +47/−13
elm-init.cabal view
@@ -2,14 +2,14 @@ -- documentation, see http://haskell.org/cabal/users-guide/ name: elm-init-version: 0.1.2.1+version: 1.0.0.0 synopsis: Set up basic structure for an elm project description: Initialize a new empty elm project with some basic scaffolding according to 'https://github.com/evancz/elm-architecture-tutorial'. license: MIT license-file: LICENSE author: justusadam-maintainer: development@justusadam.com+maintainer: dev@justus.science -- copyright: category: Development build-type: Simple@@ -23,6 +23,7 @@ resources/licenses/MIT resources/licenses/GPLv3 resources/licenses/GPLv2+ resources/index.html executable elm-init@@ -30,7 +31,7 @@ -- other-modules: -- other-extensions: build-depends:- base >=4.5 && <4.9,+ base >=4.8 && <5.0, filepath >= 1.4, directory >= 1.2, file-embed >= 0.0.8,@@ -47,3 +48,9 @@ source-repository head type: git location: git://github.com/JustusAdam/elm-init.git++source-repository this+ type: git+ branch: master+ location: git://github.com/JustusAdam/elm-init.git+ tag: 1.0.0.0
resources/Main.elm view
@@ -1,4 +1,4 @@-module Main where+module %s where -- MODEL
+ resources/index.html view
@@ -0,0 +1,11 @@+<head>+ <title>Elm Reactor</title>+ <script src="elm.js" charset="utf-8"></script>+</head>+<body>+ <script type="text/javascript">+ window.addEventListener("DOMContentLoaded", function (){+ Elm.fullscreen(Elm.%s, { });+ })+ </script>+</body>
src/Main.hs view
@@ -5,9 +5,11 @@ import Control.Arrow as Arrow (first)+import Control.Applicative ((<$>), (<*>)) import Data.Aeson.Encode.Pretty (encodePretty) import Data.Bool (bool)-import qualified Data.ByteString as ByteString (ByteString, hPut)+import qualified Data.ByteString as ByteString (ByteString, hPut,)+import qualified Data.ByteString.Char8 as CBS (pack, unpack) import qualified Data.ByteString.Lazy as LBS (hPut) import Data.FileEmbed (embedFile) import Data.Text as Text (Text, append, pack, unpack)@@ -17,14 +19,16 @@ doesDirectoryExist, doesFileExist, getCurrentDirectory, makeAbsolute) import System.Environment (getArgs)-import System.FilePath (isValid, takeBaseName, (</>))+import System.FilePath (isValid, takeBaseName, (</>), takeExtension) import System.IO (IOMode (WriteMode), withFile) import Data.Version (Version(..), showVersion, makeVersion) import ElmInit (Result, UserDecisions(..), CmdArgs(..), askChoicesWithOther, exists, verifyElmVersion, makePackage,- flattenMaybe)+ flattenMaybe, askChoices)+import Text.Printf (printf)+import Data.Char (isUpper) standardDirectories :: [FilePath]@@ -37,8 +41,14 @@ standardFiles = [ ("README.md", Nothing) ] standardSourceFiles :: [(FilePath, Maybe ByteString.ByteString)]-standardSourceFiles = [ ("Main.elm", Just $(embedFile "resources/Main.elm")) ]+standardSourceFiles = [] +mainFile :: String -> ByteString.ByteString+mainFile = CBS.pack . printf (CBS.unpack $(embedFile "resources/Main.elm"))++indexHtml :: String -> ByteString.ByteString+indexHtml = CBS.pack . printf (CBS.unpack $(embedFile "resources/index.html"))+ standardLicenses :: [(Text, Maybe ByteString.ByteString)] standardLicenses = [ ("None" , Nothing )@@ -103,32 +113,50 @@ <$> askChoicesWithOther "project name?" 0- (Just)+ return [pack $ takeBaseName wd] <*> askChoicesWithOther "choose a source folder name" 0- ((bool Nothing <$> Just <*> isValid) . unpack) -- filepath path verifier+ ((bool (Left "The filepath must be valid") <$> return <*> isValid) . unpack) -- filepath path verifier (map pack standardSourceFolders) <*> askChoicesWithOther "initial project version?" 0- (verifyElmVersion . unpack) -- TODO add verifier+ (verifyElmVersion . unpack) [pack $ showVersion defaultProjectVersion] <*> (putStrLn "a quick summary" >> getLine) <*> (putStrLn "project repository url" >> getLine) <*> askChoicesWithOther "choose a license" 0- Just+ return availableLicenses <*> askChoicesWithOther "select the elm-version" 0- (Just) -- add verifier?+ return [defaultElmVersion]+ <*> askChoicesWithOther+ "What sould be the Main file?"+ 0+ (isValidMainFile . unpack)+ ["Main.elm"]+ <*> ((== "Yes") <$> askChoices+ "Should I create an index.html file?"+ 0+ ["Yes", "No"]+ ) +isValidMainFile :: String -> Either Text String+isValidMainFile file+ | null file = Left "Filename cannot be 𝜖"+ | not $ isUpper (head file) = Left "Module names (and their files) have to start with uppercase"+ | ".elm" /= takeExtension file = Left "Elm modules (such as this main file) have to end with the fileending \".elm\""+ | otherwise = return file++ mkFiles :: [(FilePath, Maybe ByteString.ByteString)] -> IO [Result] mkFiles = mapM (uncurry mkFile) @@ -144,9 +172,15 @@ (return $ Left $ "file " `append` pack name `append` " already exists") -mkSourceFiles :: FilePath -> IO [Result]-mkSourceFiles =- mkFiles . flip map standardSourceFiles . Arrow.first . (</>)+mkSourceFiles :: FilePath -> UserDecisions -> IO [Result]+mkSourceFiles wd (Default { mainFileName = mfn, sourceFolder = sourceF, addIndex = makeIndex }) = do+ let mainModule = takeBaseName mfn+ mainFileRes <- mkFile (wd </> sourceF </> mfn) $ Just $ mainFile mainModule+ indexFileRes <- if makeIndex+ then mkFile (wd </> "index.html") $ Just $ indexHtml mainModule+ else return $ return ()+ others <- mkFiles $ flip map standardSourceFiles $ Arrow.first ((wd </> sourceF) </>)+ return $ mainFileRes:indexFileRes:others mkDirs :: FilePath -> [FilePath] -> IO ()@@ -192,7 +226,7 @@ resStatic <- mkFiles $ map (Arrow.first (wd </>)) standardFiles -- create Elm source files, collect errors- resSource <- mkSourceFiles $ wd </> sourceFolder decisions+ resSource <- mkSourceFiles wd decisions -- write the package config based on the user decisions writeConf wd decisions