module Command.CreateNewProject ( createNewProject ) where import System.Directory (createDirectory, getCurrentDirectory) import qualified System.FilePath as FP import qualified Path as P import Text.Printf (printf) import Control.Monad.Except (throwError) import Control.Monad.IO.Class (liftIO) import StrongPath (Path, Rel, File, ()) import qualified StrongPath as SP import ExternalCode (SourceExternalCodeDir) import Command (Command, CommandError(..)) import qualified Common 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 $ putStrLn $ "Created new Wasp project in ./" ++ projectName ++ " directory!" 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