module Command.CreateNewProject ( createNewProject ) where import Control.Monad.Except (throwError) import Control.Monad.IO.Class (liftIO) import qualified Path as P import System.Directory (createDirectory, getCurrentDirectory) import qualified System.FilePath as FP import Text.Printf (printf) import Command (Command, CommandError (..)) import qualified Common import ExternalCode (SourceExternalCodeDir) import StrongPath (File, Path, Rel, (>)) import qualified StrongPath as SP import qualified Util.Terminal as Term createNewProject :: String -> Command () createNewProject projectName = do absCwd <- liftIO getCurrentDirectory waspProjectDir <- case SP.parseAbsDir $ absCwd FP.> projectName of Left err -> throwError $ CommandError ("Failed to parse absolute path to wasp project dir: " ++ show err) Right sp -> return sp liftIO $ do createDirectorySP waspProjectDir writeFileSP (waspProjectDir > mainWaspFileInWaspProjectDir) mainWaspFileContent writeFileSP (waspProjectDir > gitignoreFileInWaspProjectDir) gitignoreFileContent writeFileSP (waspProjectDir > Common.dotWaspRootFileInWaspProjectDir) "File marking the root of Wasp project." let extCodeDir = waspProjectDir > Common.extCodeDirInWaspProjectDir liftIO $ do createDirectorySP extCodeDir writeFileSP (extCodeDir > mainPageJsFileInExtCodeDir) mainPageJsFileContent liftIO $ do putStrLn $ Term.applyStyles [Term.Green] ("Created new Wasp app in ./" ++ projectName ++ " directory!") putStrLn "To run it, do:" putStrLn "" putStrLn $ Term.applyStyles [Term.Bold] (" cd " ++ projectName) putStrLn $ Term.applyStyles [Term.Bold] " wasp start" putStrLn "" where mainWaspFileInWaspProjectDir :: Path (Rel Common.WaspProjectDir) File mainWaspFileInWaspProjectDir = SP.fromPathRelFile [P.relfile|main.wasp|] mainWaspFileContent = unlines [ "app %s {" `printf` projectName , " title: \"%s\"" `printf` projectName , "}" , "" , "route \"/\" -> page Main" , "page Main {" , " component: import Main from \"@ext/MainPage.js\"" , "}" ] gitignoreFileInWaspProjectDir :: Path (Rel Common.WaspProjectDir) File gitignoreFileInWaspProjectDir = SP.fromPathRelFile [P.relfile|.gitignore|] gitignoreFileContent = unlines [ "/.wasp/" ] mainPageJsFileInExtCodeDir :: Path (Rel SourceExternalCodeDir) File mainPageJsFileInExtCodeDir = SP.fromPathRelFile [P.relfile|MainPage.js|] mainPageJsFileContent = unlines [ "import React from 'react'" , "" , "const MainPage = () => {" , " return
Hello world!
" , "}" , "" , "export default MainPage" ] writeFileSP = writeFile . SP.toFilePath createDirectorySP = createDirectory . SP.toFilePath