From 4e09b3427685f60c3119ec3501ff3fd11405c7b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Sodi=C4=87?= Date: Wed, 12 Oct 2022 15:28:50 +0200 Subject: [PATCH 01/35] Separate ext code to client and server --- waspc/cli/src/Wasp/Cli/Command/Build.hs | 3 +- waspc/cli/src/Wasp/Cli/Command/Compile.hs | 3 +- .../src/Wasp/Cli/Command/CreateNewProject.hs | 110 +++++++----------- waspc/cli/src/Wasp/Cli/Command/Watch.hs | 3 +- waspc/cli/src/Wasp/Cli/Common.hs | 10 +- .../data/Cli/templates/new/client/.waspignore | 3 + .../templates/new/{ext => client}/Main.css | 0 .../templates/new/{ext => client}/MainPage.js | 0 .../new/{ext => client}/waspLogo.png | Bin .../data/Cli/templates/new/server/.waspignore | 3 + waspc/src/Wasp/AppSpec.hs | 6 +- waspc/src/Wasp/CompileOptions.hs | 3 +- waspc/src/Wasp/Generator/ServerGenerator.hs | 2 +- waspc/src/Wasp/Generator/WebAppGenerator.hs | 2 +- waspc/src/Wasp/Lib.hs | 66 ++++++++--- waspc/test/AppSpec/ValidTest.hs | 5 +- waspc/test/Generator/WebAppGeneratorTest.hs | 5 +- 17 files changed, 123 insertions(+), 101 deletions(-) create mode 100644 waspc/data/Cli/templates/new/client/.waspignore rename waspc/data/Cli/templates/new/{ext => client}/Main.css (100%) rename waspc/data/Cli/templates/new/{ext => client}/MainPage.js (100%) rename waspc/data/Cli/templates/new/{ext => client}/waspLogo.png (100%) create mode 100644 waspc/data/Cli/templates/new/server/.waspignore diff --git a/waspc/cli/src/Wasp/Cli/Command/Build.hs b/waspc/cli/src/Wasp/Cli/Command/Build.hs index 1ba596f618..141d89ea66 100644 --- a/waspc/cli/src/Wasp/Cli/Command/Build.hs +++ b/waspc/cli/src/Wasp/Cli/Command/Build.hs @@ -55,7 +55,8 @@ buildIO waspProjectDir buildDir = compileIOWithOptions options waspProjectDir bu where options = CompileOptions - { externalCodeDirPath = waspProjectDir Common.extCodeDirInWaspProjectDir, + { externalClientCodeDirPath = waspProjectDir Common.extClientCodeDirInWaspProjectDir, + externalServerCodeDirPath = waspProjectDir Common.extServerCodeDirInWaspProjectDir, isBuild = True, sendMessage = cliSendMessage, -- Ignore "DB needs migration warnings" during build, as that is not a required step. diff --git a/waspc/cli/src/Wasp/Cli/Command/Compile.hs b/waspc/cli/src/Wasp/Cli/Command/Compile.hs index c9177705cf..d89cce4909 100644 --- a/waspc/cli/src/Wasp/Cli/Command/Compile.hs +++ b/waspc/cli/src/Wasp/Cli/Command/Compile.hs @@ -73,7 +73,8 @@ compileIOWithOptions options waspProjectDir outDir = do defaultCompileOptions :: Path' Abs (Dir WaspProjectDir) -> CompileOptions defaultCompileOptions waspProjectDir = CompileOptions - { externalCodeDirPath = waspProjectDir Common.extCodeDirInWaspProjectDir, + { externalServerCodeDirPath = waspProjectDir Common.extServerCodeDirInWaspProjectDir, + externalClientCodeDirPath = waspProjectDir Common.extClientCodeDirInWaspProjectDir, isBuild = False, sendMessage = cliSendMessage, generatorWarningsFilter = id diff --git a/waspc/cli/src/Wasp/Cli/Command/CreateNewProject.hs b/waspc/cli/src/Wasp/Cli/Command/CreateNewProject.hs index af11d6330b..4fa2af8353 100644 --- a/waspc/cli/src/Wasp/Cli/Command/CreateNewProject.hs +++ b/waspc/cli/src/Wasp/Cli/Command/CreateNewProject.hs @@ -6,10 +6,9 @@ where import Control.Monad.Except (throwError) import Control.Monad.IO.Class (liftIO) import Data.List (intercalate) -import StrongPath (Abs, Dir, File', Path', Rel, reldir, relfile, ()) +import StrongPath (Abs, Dir, Dir', File', Path', Rel, reldir, relfile, ()) import qualified StrongPath as SP import System.Directory (createDirectory, getCurrentDirectory) -import qualified System.Directory import qualified System.FilePath as FP import Text.Printf (printf) import Wasp.Analyzer.Parser (isValidWaspIdentifier) @@ -17,7 +16,8 @@ import Wasp.AppSpec.ExternalCode (SourceExternalCodeDir) import Wasp.Cli.Command (Command, CommandError (..)) import qualified Wasp.Cli.Command.Common as Command.Common import qualified Wasp.Cli.Common as Common -import qualified Wasp.Data +import qualified Wasp.Data as Data +import Wasp.Generator.FileDraft.WriteableMonad (WriteableMonad (copyDirectoryRecursive)) import Wasp.Util (indent, kebabToCamelCase) import qualified Wasp.Util.Terminal as Term @@ -33,14 +33,14 @@ parseProjectInfo :: String -> Either String ProjectInfo parseProjectInfo name | isValidWaspIdentifier appName = Right (ProjectInfo name appName) | otherwise = - Left $ - intercalate - "\n" - [ "The project's name is not in the valid format!", - indent 2 "- It can start with a letter or an underscore.", - indent 2 "- It can contain only letters, numbers, dashes, or underscores.", - indent 2 "- It can't be a Wasp keyword." - ] + Left $ + intercalate + "\n" + [ "The project's name is not in the valid format!", + indent 2 "- It can start with a letter or an underscore.", + indent 2 "- It can contain only letters, numbers, dashes, or underscores.", + indent 2 "- It can't be a Wasp keyword." + ] where appName = kebabToCamelCase name @@ -72,26 +72,7 @@ createNewProject' (ProjectInfo projectName appName) = do (waspProjectDir Common.dotWaspRootFileInWaspProjectDir) "File marking the root of Wasp project." - let extCodeDir = waspProjectDir Common.extCodeDirInWaspProjectDir - liftIO $ do - createDirectorySP extCodeDir - dataDir <- Wasp.Data.getAbsDataDirPath - - let copyTemplateFile' = copyTemplateFile dataDir extCodeDir - - writeFileSP (extCodeDir waspignoreFileInExtCodeDir) waspignoreFileContent - - copyTemplateFile' - [relfile|new/ext/MainPage.js|] - mainPageJsFileInExtCodeDir - - copyTemplateFile' - [relfile|new/ext/Main.css|] - mainCssFileInExtCodeDir - - copyTemplateFile' - [relfile|new/ext/waspLogo.png|] - waspLogoFileInExtCodeDir + liftIO $ initializeExternalCodeDirs waspProjectDir liftIO $ do putStrLn $ Term.applyStyles [Term.Green] ("Created new Wasp app in ./" ++ projectName ++ " directory!") @@ -102,20 +83,6 @@ createNewProject' (ProjectInfo projectName appName) = do putStrLn "" putStrLn Command.Common.alphaWarningMessage where - copyTemplateFile :: - Path' Abs (Dir Wasp.Data.DataDir) -> - Path' Abs (Dir SourceExternalCodeDir) -> - Path' (Rel Common.CliTemplatesDir) File' -> - Path' (Rel SourceExternalCodeDir) File' -> - IO () - copyTemplateFile dataDir extCodeDir srcTmplFile dstExtDirFile = - System.Directory.copyFile - (SP.fromAbsFile (dataDir cliTemplatesDirInDataDir srcTmplFile)) - (SP.fromAbsFile (extCodeDir dstExtDirFile)) - - cliTemplatesDirInDataDir :: Path' (Rel Wasp.Data.DataDir) (Dir Common.CliTemplatesDir) - cliTemplatesDirInDataDir = [reldir|Cli/templates|] - mainWaspFileInWaspProjectDir :: Path' (Rel Common.WaspProjectDir) File' mainWaspFileInWaspProjectDir = [relfile|main.wasp|] @@ -141,24 +108,35 @@ createNewProject' (ProjectInfo projectName appName) = do "/.env.client" ] - waspignoreFileInExtCodeDir :: Path' (Rel SourceExternalCodeDir) File' - waspignoreFileInExtCodeDir = [relfile|.waspignore|] - - waspignoreFileContent = - unlines - [ "# Ignore editor tmp files", - "**/*~", - "**/#*#" - ] - - mainPageJsFileInExtCodeDir :: Path' (Rel SourceExternalCodeDir) File' - mainPageJsFileInExtCodeDir = [relfile|MainPage.js|] - - mainCssFileInExtCodeDir :: Path' (Rel SourceExternalCodeDir) File' - mainCssFileInExtCodeDir = [relfile|Main.css|] - - waspLogoFileInExtCodeDir :: Path' (Rel SourceExternalCodeDir) File' - waspLogoFileInExtCodeDir = [relfile|waspLogo.png|] - - writeFileSP = writeFile . SP.fromAbsFile - createDirectorySP = createDirectory . SP.fromAbsDir +initializeExternalCodeDirs :: Path' Abs (Dir Common.WaspProjectDir) -> IO () +initializeExternalCodeDirs waspProjectDir = do + dataDir <- Data.getAbsDataDirPath + let copySkeletonDir' = copySkeletonDir dataDir waspProjectDir + copySkeletonDir' serverSkeletonDirInTemplatesDir Common.extServerCodeDirInWaspProjectDir + copySkeletonDir' clientSkeletonDirInTemplatesDir Common.extClientCodeDirInWaspProjectDir + +copySkeletonDir :: + Path' Abs (Dir Data.DataDir) -> + Path' Abs (Dir Common.WaspProjectDir) -> + Path' (Rel Common.CliTemplatesDir) (Dir a) -> + Path' (Rel Common.WaspProjectDir) (Dir SourceExternalCodeDir) -> + IO () +copySkeletonDir dataDir waspProjectDir skeletonDirinTemplatesDir extCodeDirInWaspProjectDir = do + let skeletonAbs = dataDir cliTemplatesDirInDataDir skeletonDirinTemplatesDir + let extCodeDirAbs = waspProjectDir extCodeDirInWaspProjectDir + copyDirectoryRecursive skeletonAbs extCodeDirAbs + +writeFileSP :: Path' Abs (SP.File f) -> String -> IO () +writeFileSP = writeFile . SP.fromAbsFile + +createDirectorySP :: Path' Abs (Dir d) -> IO () +createDirectorySP = createDirectory . SP.fromAbsDir + +cliTemplatesDirInDataDir :: Path' (Rel Data.DataDir) (Dir Common.CliTemplatesDir) +cliTemplatesDirInDataDir = [reldir|Cli/templates|] + +serverSkeletonDirInTemplatesDir :: Path' (Rel Common.CliTemplatesDir) Dir' +serverSkeletonDirInTemplatesDir = [reldir|new/server|] + +clientSkeletonDirInTemplatesDir :: Path' (Rel Common.CliTemplatesDir) Dir' +clientSkeletonDirInTemplatesDir = [reldir|new/client|] \ No newline at end of file diff --git a/waspc/cli/src/Wasp/Cli/Command/Watch.hs b/waspc/cli/src/Wasp/Cli/Command/Watch.hs index f9bd151379..37c45fdde8 100644 --- a/waspc/cli/src/Wasp/Cli/Command/Watch.hs +++ b/waspc/cli/src/Wasp/Cli/Command/Watch.hs @@ -39,7 +39,8 @@ watch waspProjectDir outDir = FSN.withManager $ \mgr -> do currentTime <- getCurrentTime chan <- newChan _ <- FSN.watchDirChan mgr (SP.fromAbsDir waspProjectDir) eventFilter chan - _ <- FSN.watchTreeChan mgr (SP.fromAbsDir $ waspProjectDir Common.extCodeDirInWaspProjectDir) eventFilter chan + _ <- FSN.watchTreeChan mgr (SP.fromAbsDir $ waspProjectDir Common.extClientCodeDirInWaspProjectDir) eventFilter chan + _ <- FSN.watchTreeChan mgr (SP.fromAbsDir $ waspProjectDir Common.extServerCodeDirInWaspProjectDir) eventFilter chan listenForEvents chan currentTime where listenForEvents :: Chan FSN.Event -> UTCTime -> IO () diff --git a/waspc/cli/src/Wasp/Cli/Common.hs b/waspc/cli/src/Wasp/Cli/Common.hs index dc60e6cbbd..5fe611f7e6 100644 --- a/waspc/cli/src/Wasp/Cli/Common.hs +++ b/waspc/cli/src/Wasp/Cli/Common.hs @@ -5,7 +5,8 @@ module Wasp.Cli.Common dotWaspDirInWaspProjectDir, dotWaspRootFileInWaspProjectDir, dotWaspInfoFileInGeneratedCodeDir, - extCodeDirInWaspProjectDir, + extClientCodeDirInWaspProjectDir, + extServerCodeDirInWaspProjectDir, generatedCodeDirInDotWaspDir, buildDirInDotWaspDir, waspSays, @@ -41,8 +42,11 @@ dotWaspRootFileInWaspProjectDir = [relfile|.wasproot|] dotWaspInfoFileInGeneratedCodeDir :: Path' (Rel Wasp.Generator.Common.ProjectRootDir) File' dotWaspInfoFileInGeneratedCodeDir = [relfile|.waspinfo|] -extCodeDirInWaspProjectDir :: Path' (Rel WaspProjectDir) (Dir SourceExternalCodeDir) -extCodeDirInWaspProjectDir = [reldir|ext|] +extServerCodeDirInWaspProjectDir :: Path' (Rel WaspProjectDir) (Dir SourceExternalCodeDir) +extServerCodeDirInWaspProjectDir = [reldir|server|] + +extClientCodeDirInWaspProjectDir :: Path' (Rel WaspProjectDir) (Dir SourceExternalCodeDir) +extClientCodeDirInWaspProjectDir = [reldir|client|] waspSays :: String -> IO () waspSays what = putStrLn $ Term.applyStyles [Term.Yellow] what diff --git a/waspc/data/Cli/templates/new/client/.waspignore b/waspc/data/Cli/templates/new/client/.waspignore new file mode 100644 index 0000000000..1c432f30d9 --- /dev/null +++ b/waspc/data/Cli/templates/new/client/.waspignore @@ -0,0 +1,3 @@ +# Ignore editor tmp files +**/*~ +**/#*# diff --git a/waspc/data/Cli/templates/new/ext/Main.css b/waspc/data/Cli/templates/new/client/Main.css similarity index 100% rename from waspc/data/Cli/templates/new/ext/Main.css rename to waspc/data/Cli/templates/new/client/Main.css diff --git a/waspc/data/Cli/templates/new/ext/MainPage.js b/waspc/data/Cli/templates/new/client/MainPage.js similarity index 100% rename from waspc/data/Cli/templates/new/ext/MainPage.js rename to waspc/data/Cli/templates/new/client/MainPage.js diff --git a/waspc/data/Cli/templates/new/ext/waspLogo.png b/waspc/data/Cli/templates/new/client/waspLogo.png similarity index 100% rename from waspc/data/Cli/templates/new/ext/waspLogo.png rename to waspc/data/Cli/templates/new/client/waspLogo.png diff --git a/waspc/data/Cli/templates/new/server/.waspignore b/waspc/data/Cli/templates/new/server/.waspignore new file mode 100644 index 0000000000..1c432f30d9 --- /dev/null +++ b/waspc/data/Cli/templates/new/server/.waspignore @@ -0,0 +1,3 @@ +# Ignore editor tmp files +**/*~ +**/#*# diff --git a/waspc/src/Wasp/AppSpec.hs b/waspc/src/Wasp/AppSpec.hs index c6ad3aab8b..d955c6c5b9 100644 --- a/waspc/src/Wasp/AppSpec.hs +++ b/waspc/src/Wasp/AppSpec.hs @@ -37,10 +37,10 @@ data AppSpec = AppSpec { -- | List of declarations like App, Page, Route, ... that describe the web app. decls :: [Decl], -- | List of external code files (they are referenced/used by the declarations). - externalCodeFiles :: [ExternalCode.File], + externalServerFiles :: [ExternalCode.File], + -- | List of external code files (they are referenced/used by the declarations). + externalClientFiles :: [ExternalCode.File], -- | Absolute path to the directory in wasp project source that contains external code files. - externalCodeDirPath :: !(Path' Abs (Dir ExternalCode.SourceExternalCodeDir)), - -- | Absolute path to the directory in wasp project source that contains database migrations. migrationsDir :: Maybe (Path' Abs (Dir DbMigrationsDir)), -- | Absolute path to the .env.server file in wasp project source. It contains env variables to be -- provided to the server only during the development. diff --git a/waspc/src/Wasp/CompileOptions.hs b/waspc/src/Wasp/CompileOptions.hs index 3624c24183..156fc6718b 100644 --- a/waspc/src/Wasp/CompileOptions.hs +++ b/waspc/src/Wasp/CompileOptions.hs @@ -12,7 +12,8 @@ import Wasp.Message (SendMessage) -- It would be easier to pass around if it is part of Wasp data. But is it semantically correct? -- Maybe it is, even more than this! data CompileOptions = CompileOptions - { externalCodeDirPath :: !(Path' Abs (Dir SourceExternalCodeDir)), + { externalServerCodeDirPath :: !(Path' Abs (Dir SourceExternalCodeDir)), + externalClientCodeDirPath :: !(Path' Abs (Dir SourceExternalCodeDir)), isBuild :: !Bool, -- We give the compiler the ability to send messages. The code that -- invokes the compiler (such as the CLI) can then implement a way diff --git a/waspc/src/Wasp/Generator/ServerGenerator.hs b/waspc/src/Wasp/Generator/ServerGenerator.hs index 24d0807af9..6c72d23bec 100644 --- a/waspc/src/Wasp/Generator/ServerGenerator.hs +++ b/waspc/src/Wasp/Generator/ServerGenerator.hs @@ -62,7 +62,7 @@ genServer spec = genGitignore ] <++> genSrcDir spec - <++> genExternalCodeDir ServerExternalCodeGenerator.generatorStrategy (AS.externalCodeFiles spec) + <++> genExternalCodeDir ServerExternalCodeGenerator.generatorStrategy (AS.externalServerFiles spec) <++> genDotEnv spec <++> genJobs spec <++> genJobExecutors diff --git a/waspc/src/Wasp/Generator/WebAppGenerator.hs b/waspc/src/Wasp/Generator/WebAppGenerator.hs index 58873728d2..58416587e9 100644 --- a/waspc/src/Wasp/Generator/WebAppGenerator.hs +++ b/waspc/src/Wasp/Generator/WebAppGenerator.hs @@ -50,7 +50,7 @@ genWebApp spec = do ] <++> genPublicDir spec <++> genSrcDir spec - <++> genExternalCodeDir WebAppExternalCodeGenerator.generatorStrategy (AS.externalCodeFiles spec) + <++> genExternalCodeDir WebAppExternalCodeGenerator.generatorStrategy (AS.externalClientFiles spec) <++> genDotEnv spec genDotEnv :: AppSpec -> Generator [FileDraft] diff --git a/waspc/src/Wasp/Lib.hs b/waspc/src/Wasp/Lib.hs index 9738833d84..6251f2059f 100644 --- a/waspc/src/Wasp/Lib.hs +++ b/waspc/src/Wasp/Lib.hs @@ -14,6 +14,7 @@ import qualified StrongPath as SP import System.Directory (doesDirectoryExist, doesFileExist) import qualified Wasp.Analyzer as Analyzer import Wasp.Analyzer.AnalyzeError (getErrorMessageAndCtx) +import Wasp.AppSpec (AppSpec (externalClientFiles), Decl) import qualified Wasp.AppSpec as AS import qualified Wasp.AppSpec.Valid as ASV import Wasp.Common (DbMigrationsDir, WaspProjectDir, dbMigrationsDirInWaspProjectDir) @@ -49,6 +50,33 @@ compile waspDir outDir options = do return ([], map show validationErrors) return $ (analyzerWarnings, []) <> compilerWarningsAndErrors +-- analyzeWaspProject2 :: +-- Path' Abs (Dir WaspProjectDir) -> +-- CompileOptions -> +-- IO (Either [CompileError] AppSpec) +-- analyzeWaspProject2 waspDir options = do +-- waspFilePath <- findWaspFilePath waspDir +-- result <- analyzeWaspFileContent waspFilePath +-- return $ createAppSpec waspDir options <$> result + +-- findWaspFilePath :: Path' Abs (Dir WaspProjectDir) -> IO (Either [CompileError] (Path' Abs File')) +-- findWaspFilePath waspDir = do +-- maybeWaspFilePath <- findWaspFile waspDir +-- case maybeWaspFilePath of +-- Nothing -> return $ Left ["Couldn't find a single *.wasp file."] +-- Just waspFilePath -> return $ return waspFilePath + +-- analyzeWaspFileContent :: Path' Abs File' -> IO (Either [CompileError] [Decl]) +-- analyzeWaspFileContent waspFilePath = do +-- waspFileContent <- readFile (SP.fromAbsFile waspFilePath) +-- case Analyzer.analyze waspFileContent of +-- Right decls -> return $ return decls +-- Left analyzeError -> return $ Left +-- [ showCompilerErrorForTerminal +-- (waspFilePath, waspFileContent) +-- (getErrorMessageAndCtx analyzeError) +-- ] + analyzeWaspProject :: Path' Abs (Dir WaspProjectDir) -> CompileOptions -> @@ -60,6 +88,7 @@ analyzeWaspProject waspDir options = do Just waspFilePath -> do waspFileContent <- readFile (SP.fromAbsFile waspFilePath) case Analyzer.analyze waspFileContent of + Right decls -> Right <$> createAppSpec waspDir options decls Left analyzeError -> return $ Left $ @@ -68,26 +97,29 @@ analyzeWaspProject waspDir options = do (waspFilePath, waspFileContent) (getErrorMessageAndCtx analyzeError) ] - Right decls -> do - externalCodeFiles <- - ExternalCode.readFiles (CompileOptions.externalCodeDirPath options) - maybeDotEnvServerFile <- findDotEnvServer waspDir - maybeDotEnvClientFile <- findDotEnvClient waspDir - maybeMigrationsDir <- findMigrationsDir waspDir - return $ - Right - AS.AppSpec - { AS.decls = decls, - AS.externalCodeFiles = externalCodeFiles, - AS.externalCodeDirPath = CompileOptions.externalCodeDirPath options, - AS.migrationsDir = maybeMigrationsDir, - AS.dotEnvServerFile = maybeDotEnvServerFile, - AS.dotEnvClientFile = maybeDotEnvClientFile, - AS.isBuild = CompileOptions.isBuild options - } analyzerWarnings <- warnIfDotEnvPresent waspDir return (analyzerWarnings, appSpecOrAnalyzerErrors) +createAppSpec :: Path' Abs (Dir WaspProjectDir) -> CompileOptions -> [Decl] -> IO AS.AppSpec +createAppSpec waspDir options decls = do + externalServerCodeFiles <- + ExternalCode.readFiles (CompileOptions.externalServerCodeDirPath options) + externalClientCodeFiles <- + ExternalCode.readFiles (CompileOptions.externalClientCodeDirPath options) + maybeDotEnvServerFile <- findDotEnvServer waspDir + maybeDotEnvClientFile <- findDotEnvClient waspDir + maybeMigrationsDir <- findMigrationsDir waspDir + return + AS.AppSpec + { AS.decls = decls, + AS.externalClientFiles = externalClientCodeFiles, + AS.externalServerFiles = externalServerCodeFiles, + AS.migrationsDir = maybeMigrationsDir, + AS.dotEnvServerFile = maybeDotEnvServerFile, + AS.dotEnvClientFile = maybeDotEnvClientFile, + AS.isBuild = CompileOptions.isBuild options + } + -- | Checks the wasp directory for potential problems, and issues warnings if any are found. warnIfDotEnvPresent :: Path' Abs (Dir WaspProjectDir) -> IO [CompileWarning] warnIfDotEnvPresent waspDir = do diff --git a/waspc/test/AppSpec/ValidTest.hs b/waspc/test/AppSpec/ValidTest.hs index 7f5894d2d8..b9e6ecb25e 100644 --- a/waspc/test/AppSpec/ValidTest.hs +++ b/waspc/test/AppSpec/ValidTest.hs @@ -3,7 +3,6 @@ module AppSpec.ValidTest where import Data.Maybe (fromJust) -import Fixtures (systemSPRoot) import qualified StrongPath as SP import Test.Tasty.Hspec import qualified Wasp.AppSpec as AS @@ -148,8 +147,8 @@ spec_AppSpecValid = do basicAppSpec = AS.AppSpec { AS.decls = [basicAppDecl], - AS.externalCodeDirPath = systemSPRoot SP. [SP.reldir|test/src|], - AS.externalCodeFiles = [], + AS.externalClientFiles = [], + AS.externalServerFiles = [], AS.isBuild = False, AS.migrationsDir = Nothing, AS.dotEnvServerFile = Nothing, diff --git a/waspc/test/Generator/WebAppGeneratorTest.hs b/waspc/test/Generator/WebAppGeneratorTest.hs index 0505d76ec5..99310e848e 100644 --- a/waspc/test/Generator/WebAppGeneratorTest.hs +++ b/waspc/test/Generator/WebAppGeneratorTest.hs @@ -1,6 +1,5 @@ module Generator.WebAppGeneratorTest where -import Fixtures (systemSPRoot) import qualified StrongPath as SP import System.FilePath (()) import Test.Tasty.Hspec @@ -36,8 +35,8 @@ spec_WebAppGenerator = do AS.App.head = Nothing } ], - AS.externalCodeDirPath = systemSPRoot SP. [SP.reldir|test/src|], - AS.externalCodeFiles = [], + AS.externalClientFiles = [], + AS.externalServerFiles = [], AS.isBuild = False, AS.migrationsDir = Nothing, AS.dotEnvServerFile = Nothing, From 86e70fe65d96ab2b5ef23ba0cd3b83439d3f10dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Sodi=C4=87?= Date: Fri, 14 Oct 2022 02:13:52 +0200 Subject: [PATCH 02/35] Use skeleton in createNewProject and refactor --- .../src/Wasp/Cli/Command/CreateNewProject.hs | 141 +++++++----------- waspc/data/Cli/templates/new/.gitignore | 3 + waspc/data/Cli/templates/new/.wasproot | 1 + 3 files changed, 54 insertions(+), 91 deletions(-) create mode 100644 waspc/data/Cli/templates/new/.gitignore create mode 100644 waspc/data/Cli/templates/new/.wasproot diff --git a/waspc/cli/src/Wasp/Cli/Command/CreateNewProject.hs b/waspc/cli/src/Wasp/Cli/Command/CreateNewProject.hs index 4fa2af8353..80c66b4f17 100644 --- a/waspc/cli/src/Wasp/Cli/Command/CreateNewProject.hs +++ b/waspc/cli/src/Wasp/Cli/Command/CreateNewProject.hs @@ -6,15 +6,15 @@ where import Control.Monad.Except (throwError) import Control.Monad.IO.Class (liftIO) import Data.List (intercalate) -import StrongPath (Abs, Dir, Dir', File', Path', Rel, reldir, relfile, ()) +import StrongPath (Abs, Dir, Path, Path', System, reldir, relfile, ()) import qualified StrongPath as SP -import System.Directory (createDirectory, getCurrentDirectory) +import System.Directory (getCurrentDirectory) import qualified System.FilePath as FP import Text.Printf (printf) import Wasp.Analyzer.Parser (isValidWaspIdentifier) -import Wasp.AppSpec.ExternalCode (SourceExternalCodeDir) import Wasp.Cli.Command (Command, CommandError (..)) import qualified Wasp.Cli.Command.Common as Command.Common +import Wasp.Cli.Common (WaspProjectDir) import qualified Wasp.Cli.Common as Common import qualified Wasp.Data as Data import Wasp.Generator.FileDraft.WriteableMonad (WriteableMonad (copyDirectoryRecursive)) @@ -26,66 +26,68 @@ data ProjectInfo = ProjectInfo _appName :: String } +createNewProject :: String -> Command () +createNewProject projectName = do + projectInfo <- parseProjectInfo projectName + createAndPopulateWaspProjectDir projectInfo + liftIO $ printInfoMessages projectInfo + -- Takes a project name String -- Returns either the ProjectInfo type that contains both the Project name -- and the App name (which might be the same), or an error describing why the name is invalid -parseProjectInfo :: String -> Either String ProjectInfo +parseProjectInfo :: String -> Command ProjectInfo parseProjectInfo name - | isValidWaspIdentifier appName = Right (ProjectInfo name appName) + | isValidWaspIdentifier appName = return $ ProjectInfo name appName | otherwise = - Left $ - intercalate - "\n" - [ "The project's name is not in the valid format!", - indent 2 "- It can start with a letter or an underscore.", - indent 2 "- It can contain only letters, numbers, dashes, or underscores.", - indent 2 "- It can't be a Wasp keyword." - ] + throwError $ + CommandError "Project creation failed" $ + intercalate + "\n" + [ "The project's name is not in the valid format!", + indent 2 "- It can start with a letter or an underscore.", + indent 2 "- It can contain only letters, numbers, dashes, or underscores.", + indent 2 "- It can't be a Wasp keyword." + ] where appName = kebabToCamelCase name -createNewProject :: String -> Command () -createNewProject name = - case parseProjectInfo name of - Right projectInfo -> createNewProject' projectInfo - Left parsedError -> - throwError $ - CommandError "Project creation failed" parsedError - -createNewProject' :: ProjectInfo -> Command () -createNewProject' (ProjectInfo projectName appName) = do +createAndPopulateWaspProjectDir :: ProjectInfo -> Command () +createAndPopulateWaspProjectDir projectInfo = do + absWaspProjectDir <- getAbsoluteWaspProjectDir projectInfo + liftIO $ initializeProjectFromSkeleton absWaspProjectDir + liftIO $ writeMainWaspFile absWaspProjectDir projectInfo + +printInfoMessages :: ProjectInfo -> IO () +printInfoMessages (ProjectInfo projectName _) = 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 "" + putStrLn Command.Common.alphaWarningMessage + +getAbsoluteWaspProjectDir :: ProjectInfo -> Command (Path System Abs (Dir WaspProjectDir)) +getAbsoluteWaspProjectDir (ProjectInfo projectName _) = do absCwd <- liftIO getCurrentDirectory - waspProjectDir <- case SP.parseAbsDir $ absCwd FP. projectName of + case SP.parseAbsDir $ absCwd FP. projectName of + Right sp -> return sp Left err -> throwError $ CommandError "Project creation failed" - ( "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." + ("Failed to parse absolute path to wasp project dir: " ++ show err) - liftIO $ initializeExternalCodeDirs waspProjectDir +initializeProjectFromSkeleton :: Path' Abs (Dir Common.WaspProjectDir) -> IO () +initializeProjectFromSkeleton absWaspProjectDir = do + dataDir <- Data.getAbsDataDirPath + let absSkeletonDir = dataDir [reldir|Cli/templates/new|] + copyDirectoryRecursive absSkeletonDir absWaspProjectDir - 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 "" - putStrLn Command.Common.alphaWarningMessage +writeMainWaspFile :: Path System Abs (Dir WaspProjectDir) -> ProjectInfo -> IO () +writeMainWaspFile waspProjectDir (ProjectInfo projectName appName) = writeFile mainWaspFileAbsPath mainWaspFileContent where - mainWaspFileInWaspProjectDir :: Path' (Rel Common.WaspProjectDir) File' - mainWaspFileInWaspProjectDir = [relfile|main.wasp|] - + mainWaspFileAbsPath = SP.fromAbsFile $ waspProjectDir [relfile|main.wasp|] mainWaspFileContent = unlines [ "app %s {" `printf` appName, @@ -96,47 +98,4 @@ createNewProject' (ProjectInfo projectName appName) = do "page MainPage {", " component: import Main from \"@ext/MainPage.js\"", "}" - ] - - gitignoreFileInWaspProjectDir :: Path' (Rel Common.WaspProjectDir) File' - gitignoreFileInWaspProjectDir = [relfile|.gitignore|] - - gitignoreFileContent = - unlines - [ "/.wasp/", - "/.env.server", - "/.env.client" - ] - -initializeExternalCodeDirs :: Path' Abs (Dir Common.WaspProjectDir) -> IO () -initializeExternalCodeDirs waspProjectDir = do - dataDir <- Data.getAbsDataDirPath - let copySkeletonDir' = copySkeletonDir dataDir waspProjectDir - copySkeletonDir' serverSkeletonDirInTemplatesDir Common.extServerCodeDirInWaspProjectDir - copySkeletonDir' clientSkeletonDirInTemplatesDir Common.extClientCodeDirInWaspProjectDir - -copySkeletonDir :: - Path' Abs (Dir Data.DataDir) -> - Path' Abs (Dir Common.WaspProjectDir) -> - Path' (Rel Common.CliTemplatesDir) (Dir a) -> - Path' (Rel Common.WaspProjectDir) (Dir SourceExternalCodeDir) -> - IO () -copySkeletonDir dataDir waspProjectDir skeletonDirinTemplatesDir extCodeDirInWaspProjectDir = do - let skeletonAbs = dataDir cliTemplatesDirInDataDir skeletonDirinTemplatesDir - let extCodeDirAbs = waspProjectDir extCodeDirInWaspProjectDir - copyDirectoryRecursive skeletonAbs extCodeDirAbs - -writeFileSP :: Path' Abs (SP.File f) -> String -> IO () -writeFileSP = writeFile . SP.fromAbsFile - -createDirectorySP :: Path' Abs (Dir d) -> IO () -createDirectorySP = createDirectory . SP.fromAbsDir - -cliTemplatesDirInDataDir :: Path' (Rel Data.DataDir) (Dir Common.CliTemplatesDir) -cliTemplatesDirInDataDir = [reldir|Cli/templates|] - -serverSkeletonDirInTemplatesDir :: Path' (Rel Common.CliTemplatesDir) Dir' -serverSkeletonDirInTemplatesDir = [reldir|new/server|] - -clientSkeletonDirInTemplatesDir :: Path' (Rel Common.CliTemplatesDir) Dir' -clientSkeletonDirInTemplatesDir = [reldir|new/client|] \ No newline at end of file + ] \ No newline at end of file diff --git a/waspc/data/Cli/templates/new/.gitignore b/waspc/data/Cli/templates/new/.gitignore new file mode 100644 index 0000000000..c51177f6dc --- /dev/null +++ b/waspc/data/Cli/templates/new/.gitignore @@ -0,0 +1,3 @@ +/.wasp/ +/.env.server +/.env.client diff --git a/waspc/data/Cli/templates/new/.wasproot b/waspc/data/Cli/templates/new/.wasproot new file mode 100644 index 0000000000..3caa053db5 --- /dev/null +++ b/waspc/data/Cli/templates/new/.wasproot @@ -0,0 +1 @@ +File marking the root of Wasp project. \ No newline at end of file From bb4107eadc15768aa406e2102d75f2b9e8a435d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Sodi=C4=87?= Date: Fri, 14 Oct 2022 02:14:38 +0200 Subject: [PATCH 03/35] Refactor Lib.hs to use ExceptT --- waspc/cli/src/Wasp/Cli/Command/Deps.hs | 4 +- waspc/src/Wasp/Lib.hs | 87 ++++++++++---------------- 2 files changed, 35 insertions(+), 56 deletions(-) diff --git a/waspc/cli/src/Wasp/Cli/Command/Deps.hs b/waspc/cli/src/Wasp/Cli/Command/Deps.hs index 68b3ca94be..d5451c7f46 100644 --- a/waspc/cli/src/Wasp/Cli/Command/Deps.hs +++ b/waspc/cli/src/Wasp/Cli/Command/Deps.hs @@ -21,7 +21,7 @@ import qualified Wasp.Util.Terminal as Term deps :: Command () deps = do waspProjectDir <- findWaspProjectRootDirFromCwd - (_, appSpecOrAnalyzerErrors) <- liftIO $ analyzeWaspProject waspProjectDir (defaultCompileOptions waspProjectDir) + appSpecOrAnalyzerErrors <- liftIO $ analyzeWaspProject waspProjectDir (defaultCompileOptions waspProjectDir) appSpec <- either (throwError . CommandError "Determining dependencies failed due to a compilation error in your Wasp project" . unwords . toList) @@ -65,4 +65,4 @@ printDep :: AS.Dependency.Dependency -> String printDep dep = Term.applyStyles [Term.Cyan] (AS.Dependency.name dep) ++ "@" - ++ Term.applyStyles [Term.Yellow] (AS.Dependency.version dep) + ++ Term.applyStyles [Term.Yellow] (AS.Dependency.version dep) \ No newline at end of file diff --git a/waspc/src/Wasp/Lib.hs b/waspc/src/Wasp/Lib.hs index 6251f2059f..3bc1bbe008 100644 --- a/waspc/src/Wasp/Lib.hs +++ b/waspc/src/Wasp/Lib.hs @@ -27,6 +27,7 @@ import Wasp.Generator.Common (ProjectRootDir) import Wasp.Generator.ServerGenerator.Common (dotEnvServer) import Wasp.Generator.WebAppGenerator.Common (dotEnvClient) import qualified Wasp.Util.IO as Util.IO +import Control.Monad.Except type CompileError = String @@ -38,7 +39,8 @@ compile :: CompileOptions -> IO ([CompileWarning], [CompileError]) compile waspDir outDir options = do - (analyzerWarnings, appSpecOrAnalyzerErrors) <- analyzeWaspProject waspDir options + appSpecOrAnalyzerErrors <- analyzeWaspProject waspDir options + analyzerWarnings <- warnIfDotEnvPresent waspDir compilerWarningsAndErrors <- case appSpecOrAnalyzerErrors of Left analyzerErrors -> return ([], toList analyzerErrors) Right appSpec -> @@ -46,59 +48,43 @@ compile waspDir outDir options = do [] -> do (generatorWarnings, generatorErrors) <- Generator.writeWebAppCode appSpec outDir (sendMessage options) return (map show $ generatorWarningsFilter options generatorWarnings, map show generatorErrors) - validationErrors -> do - return ([], map show validationErrors) + validationErrors -> return ([], map show validationErrors) return $ (analyzerWarnings, []) <> compilerWarningsAndErrors --- analyzeWaspProject2 :: --- Path' Abs (Dir WaspProjectDir) -> --- CompileOptions -> --- IO (Either [CompileError] AppSpec) --- analyzeWaspProject2 waspDir options = do --- waspFilePath <- findWaspFilePath waspDir --- result <- analyzeWaspFileContent waspFilePath --- return $ createAppSpec waspDir options <$> result - --- findWaspFilePath :: Path' Abs (Dir WaspProjectDir) -> IO (Either [CompileError] (Path' Abs File')) --- findWaspFilePath waspDir = do --- maybeWaspFilePath <- findWaspFile waspDir --- case maybeWaspFilePath of --- Nothing -> return $ Left ["Couldn't find a single *.wasp file."] --- Just waspFilePath -> return $ return waspFilePath - --- analyzeWaspFileContent :: Path' Abs File' -> IO (Either [CompileError] [Decl]) --- analyzeWaspFileContent waspFilePath = do --- waspFileContent <- readFile (SP.fromAbsFile waspFilePath) --- case Analyzer.analyze waspFileContent of --- Right decls -> return $ return decls --- Left analyzeError -> return $ Left --- [ showCompilerErrorForTerminal --- (waspFilePath, waspFileContent) --- (getErrorMessageAndCtx analyzeError) --- ] - analyzeWaspProject :: Path' Abs (Dir WaspProjectDir) -> CompileOptions -> - IO ([CompileWarning], Either (NonEmpty CompileError) AS.AppSpec) -analyzeWaspProject waspDir options = do + IO (Either (NonEmpty CompileError) AppSpec) +analyzeWaspProject waspDir options = runExceptT $ do + waspFilePath <- ExceptT $ findWaspFilePath waspDir + declarations <- ExceptT $ analyzeWaspFileContent waspFilePath + liftIO $ createAppSpec waspDir options declarations + +-- | Checks the wasp directory for potential problems, and issues warnings if any are found. +warnIfDotEnvPresent :: Path' Abs (Dir WaspProjectDir) -> IO [CompileWarning] +warnIfDotEnvPresent waspDir = do + maybeDotEnvFile <- findDotEnv waspDir + case maybeDotEnvFile of + Nothing -> return [] + Just _ -> return ["Wasp .env files should be named .env.server or .env.client, depending on their use."] + +findWaspFilePath :: Path' Abs (Dir WaspProjectDir) -> IO (Either (NonEmpty CompileError) (Path' Abs File')) +findWaspFilePath waspDir = do maybeWaspFilePath <- findWaspFile waspDir - appSpecOrAnalyzerErrors <- case maybeWaspFilePath of + case maybeWaspFilePath of Nothing -> return $ Left $ fromList ["Couldn't find a single *.wasp file."] - Just waspFilePath -> do - waspFileContent <- readFile (SP.fromAbsFile waspFilePath) - case Analyzer.analyze waspFileContent of - Right decls -> Right <$> createAppSpec waspDir options decls - Left analyzeError -> - return $ - Left $ - fromList - [ showCompilerErrorForTerminal - (waspFilePath, waspFileContent) - (getErrorMessageAndCtx analyzeError) - ] - analyzerWarnings <- warnIfDotEnvPresent waspDir - return (analyzerWarnings, appSpecOrAnalyzerErrors) + Just waspFilePath -> return $ return waspFilePath + +analyzeWaspFileContent :: Path' Abs File' -> IO (Either (NonEmpty CompileError) [Decl]) +analyzeWaspFileContent waspFilePath = do + waspFileContent <- readFile (SP.fromAbsFile waspFilePath) + return $ case Analyzer.analyze waspFileContent of + Right decls -> Right decls + Left analyzeError -> Left $ fromList + [ showCompilerErrorForTerminal + (waspFilePath, waspFileContent) + (getErrorMessageAndCtx analyzeError) + ] createAppSpec :: Path' Abs (Dir WaspProjectDir) -> CompileOptions -> [Decl] -> IO AS.AppSpec createAppSpec waspDir options decls = do @@ -120,13 +106,6 @@ createAppSpec waspDir options decls = do AS.isBuild = CompileOptions.isBuild options } --- | Checks the wasp directory for potential problems, and issues warnings if any are found. -warnIfDotEnvPresent :: Path' Abs (Dir WaspProjectDir) -> IO [CompileWarning] -warnIfDotEnvPresent waspDir = do - maybeDotEnvFile <- findDotEnv waspDir - case maybeDotEnvFile of - Nothing -> return [] - Just _ -> return ["Wasp .env files should be named .env.server or .env.client, depending on their use."] findWaspFile :: Path' Abs (Dir WaspProjectDir) -> IO (Maybe (Path' Abs File')) findWaspFile waspDir = do From cc7f353a4125acbdbd940c4bab42b19635b76bde Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Sodi=C4=87?= Date: Fri, 14 Oct 2022 03:03:59 +0200 Subject: [PATCH 04/35] Fix formatting --- waspc/cli/src/Wasp/Cli/Command/CreateNewProject.hs | 2 +- waspc/cli/src/Wasp/Cli/Command/Deps.hs | 2 +- waspc/data/Cli/templates/new/.wasproot | 2 +- waspc/src/Wasp/Lib.hs | 13 +++++++------ 4 files changed, 10 insertions(+), 9 deletions(-) diff --git a/waspc/cli/src/Wasp/Cli/Command/CreateNewProject.hs b/waspc/cli/src/Wasp/Cli/Command/CreateNewProject.hs index 80c66b4f17..b960b4b8e0 100644 --- a/waspc/cli/src/Wasp/Cli/Command/CreateNewProject.hs +++ b/waspc/cli/src/Wasp/Cli/Command/CreateNewProject.hs @@ -98,4 +98,4 @@ writeMainWaspFile waspProjectDir (ProjectInfo projectName appName) = writeFile m "page MainPage {", " component: import Main from \"@ext/MainPage.js\"", "}" - ] \ No newline at end of file + ] diff --git a/waspc/cli/src/Wasp/Cli/Command/Deps.hs b/waspc/cli/src/Wasp/Cli/Command/Deps.hs index d5451c7f46..5c90d68fdf 100644 --- a/waspc/cli/src/Wasp/Cli/Command/Deps.hs +++ b/waspc/cli/src/Wasp/Cli/Command/Deps.hs @@ -65,4 +65,4 @@ printDep :: AS.Dependency.Dependency -> String printDep dep = Term.applyStyles [Term.Cyan] (AS.Dependency.name dep) ++ "@" - ++ Term.applyStyles [Term.Yellow] (AS.Dependency.version dep) \ No newline at end of file + ++ Term.applyStyles [Term.Yellow] (AS.Dependency.version dep) diff --git a/waspc/data/Cli/templates/new/.wasproot b/waspc/data/Cli/templates/new/.wasproot index 3caa053db5..ca2cfdb482 100644 --- a/waspc/data/Cli/templates/new/.wasproot +++ b/waspc/data/Cli/templates/new/.wasproot @@ -1 +1 @@ -File marking the root of Wasp project. \ No newline at end of file +File marking the root of Wasp project. diff --git a/waspc/src/Wasp/Lib.hs b/waspc/src/Wasp/Lib.hs index 3bc1bbe008..cb4d2e0aac 100644 --- a/waspc/src/Wasp/Lib.hs +++ b/waspc/src/Wasp/Lib.hs @@ -7,6 +7,7 @@ module Wasp.Lib ) where +import Control.Monad.Except import Data.List (find, isSuffixOf) import Data.List.NonEmpty (NonEmpty, fromList, toList) import StrongPath (Abs, Dir, File', Path', relfile) @@ -27,7 +28,6 @@ import Wasp.Generator.Common (ProjectRootDir) import Wasp.Generator.ServerGenerator.Common (dotEnvServer) import Wasp.Generator.WebAppGenerator.Common (dotEnvClient) import qualified Wasp.Util.IO as Util.IO -import Control.Monad.Except type CompileError = String @@ -56,9 +56,9 @@ analyzeWaspProject :: CompileOptions -> IO (Either (NonEmpty CompileError) AppSpec) analyzeWaspProject waspDir options = runExceptT $ do - waspFilePath <- ExceptT $ findWaspFilePath waspDir - declarations <- ExceptT $ analyzeWaspFileContent waspFilePath - liftIO $ createAppSpec waspDir options declarations + waspFilePath <- ExceptT $ findWaspFilePath waspDir + declarations <- ExceptT $ analyzeWaspFileContent waspFilePath + liftIO $ createAppSpec waspDir options declarations -- | Checks the wasp directory for potential problems, and issues warnings if any are found. warnIfDotEnvPresent :: Path' Abs (Dir WaspProjectDir) -> IO [CompileWarning] @@ -80,7 +80,9 @@ analyzeWaspFileContent waspFilePath = do waspFileContent <- readFile (SP.fromAbsFile waspFilePath) return $ case Analyzer.analyze waspFileContent of Right decls -> Right decls - Left analyzeError -> Left $ fromList + Left analyzeError -> + Left $ + fromList [ showCompilerErrorForTerminal (waspFilePath, waspFileContent) (getErrorMessageAndCtx analyzeError) @@ -106,7 +108,6 @@ createAppSpec waspDir options decls = do AS.isBuild = CompileOptions.isBuild options } - findWaspFile :: Path' Abs (Dir WaspProjectDir) -> IO (Maybe (Path' Abs File')) findWaspFile waspDir = do files <- fst <$> Util.IO.listDirectory waspDir From 492f247181b0382db0e9bd2a00f7b91b2c5b2616 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Sodi=C4=87?= Date: Fri, 14 Oct 2022 03:18:20 +0200 Subject: [PATCH 05/35] Pop up returns --- waspc/src/Wasp/Lib.hs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/waspc/src/Wasp/Lib.hs b/waspc/src/Wasp/Lib.hs index cb4d2e0aac..187b106ab6 100644 --- a/waspc/src/Wasp/Lib.hs +++ b/waspc/src/Wasp/Lib.hs @@ -64,16 +64,16 @@ analyzeWaspProject waspDir options = runExceptT $ do warnIfDotEnvPresent :: Path' Abs (Dir WaspProjectDir) -> IO [CompileWarning] warnIfDotEnvPresent waspDir = do maybeDotEnvFile <- findDotEnv waspDir - case maybeDotEnvFile of - Nothing -> return [] - Just _ -> return ["Wasp .env files should be named .env.server or .env.client, depending on their use."] + return $ case maybeDotEnvFile of + Nothing -> [] + Just _ -> ["Wasp .env files should be named .env.server or .env.client, depending on their use."] findWaspFilePath :: Path' Abs (Dir WaspProjectDir) -> IO (Either (NonEmpty CompileError) (Path' Abs File')) findWaspFilePath waspDir = do maybeWaspFilePath <- findWaspFile waspDir - case maybeWaspFilePath of - Nothing -> return $ Left $ fromList ["Couldn't find a single *.wasp file."] - Just waspFilePath -> return $ return waspFilePath + return $ case maybeWaspFilePath of + Nothing -> Left $ fromList ["Couldn't find a single *.wasp file."] + Just waspFilePath -> Right waspFilePath analyzeWaspFileContent :: Path' Abs File' -> IO (Either (NonEmpty CompileError) [Decl]) analyzeWaspFileContent waspFilePath = do From d88e20418dd3f40677a2229e7370c712d02b1033 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Sodi=C4=87?= Date: Tue, 18 Oct 2022 01:21:37 +0200 Subject: [PATCH 06/35] Extract liftIO and add a do block Co-authored-by: Shayne Czyzewski <523636+shayneczyzewski@users.noreply.github.com> --- waspc/cli/src/Wasp/Cli/Command/CreateNewProject.hs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/waspc/cli/src/Wasp/Cli/Command/CreateNewProject.hs b/waspc/cli/src/Wasp/Cli/Command/CreateNewProject.hs index b960b4b8e0..397fbd2409 100644 --- a/waspc/cli/src/Wasp/Cli/Command/CreateNewProject.hs +++ b/waspc/cli/src/Wasp/Cli/Command/CreateNewProject.hs @@ -54,8 +54,9 @@ parseProjectInfo name createAndPopulateWaspProjectDir :: ProjectInfo -> Command () createAndPopulateWaspProjectDir projectInfo = do absWaspProjectDir <- getAbsoluteWaspProjectDir projectInfo - liftIO $ initializeProjectFromSkeleton absWaspProjectDir - liftIO $ writeMainWaspFile absWaspProjectDir projectInfo + liftIO $ do + initializeProjectFromSkeleton absWaspProjectDir + writeMainWaspFile absWaspProjectDir projectInfo printInfoMessages :: ProjectInfo -> IO () printInfoMessages (ProjectInfo projectName _) = do From 51b426aab879bef1a1c514995ea6eb7ee8cad2f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Sodi=C4=87?= Date: Mon, 24 Oct 2022 23:36:10 +0200 Subject: [PATCH 07/35] Address some review comments --- .../src/Wasp/Cli/Command/CreateNewProject.hs | 54 +++++++------- waspc/cli/src/Wasp/Cli/Command/Deps.hs | 6 +- waspc/cli/src/Wasp/Cli/Command/Info.hs | 70 ++++++++----------- waspc/src/Wasp/Lib.hs | 52 ++++++-------- waspc/src/Wasp/Util.hs | 6 ++ 5 files changed, 89 insertions(+), 99 deletions(-) diff --git a/waspc/cli/src/Wasp/Cli/Command/CreateNewProject.hs b/waspc/cli/src/Wasp/Cli/Command/CreateNewProject.hs index 397fbd2409..288fdaa4e0 100644 --- a/waspc/cli/src/Wasp/Cli/Command/CreateNewProject.hs +++ b/waspc/cli/src/Wasp/Cli/Command/CreateNewProject.hs @@ -6,18 +6,18 @@ where import Control.Monad.Except (throwError) import Control.Monad.IO.Class (liftIO) import Data.List (intercalate) -import StrongPath (Abs, Dir, Path, Path', System, reldir, relfile, ()) -import qualified StrongPath as SP +import Path.IO (copyDirRecur, doesDirExist) +import StrongPath (Abs, Dir, Path, Path', System, fromAbsFile, parseAbsDir, reldir, relfile, ()) +import StrongPath.Path (toPathAbsDir) import System.Directory (getCurrentDirectory) import qualified System.FilePath as FP import Text.Printf (printf) import Wasp.Analyzer.Parser (isValidWaspIdentifier) import Wasp.Cli.Command (Command, CommandError (..)) import qualified Wasp.Cli.Command.Common as Command.Common -import Wasp.Cli.Common (WaspProjectDir) -import qualified Wasp.Cli.Common as Common +import Wasp.Common (WaspProjectDir) +import qualified Wasp.Common as Common (WaspProjectDir) import qualified Wasp.Data as Data -import Wasp.Generator.FileDraft.WriteableMonad (WriteableMonad (copyDirectoryRecursive)) import Wasp.Util (indent, kebabToCamelCase) import qualified Wasp.Util.Terminal as Term @@ -29,8 +29,17 @@ data ProjectInfo = ProjectInfo createNewProject :: String -> Command () createNewProject projectName = do projectInfo <- parseProjectInfo projectName - createAndPopulateWaspProjectDir projectInfo - liftIO $ printInfoMessages projectInfo + createWaspProjectDir projectInfo + liftIO printGettingStartedInstructions + where + printGettingStartedInstructions = 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 "" + putStrLn Command.Common.alphaWarningMessage -- Takes a project name String -- Returns either the ProjectInfo type that contains both the Project name @@ -51,27 +60,20 @@ parseProjectInfo name where appName = kebabToCamelCase name -createAndPopulateWaspProjectDir :: ProjectInfo -> Command () -createAndPopulateWaspProjectDir projectInfo = do +createWaspProjectDir :: ProjectInfo -> Command () +createWaspProjectDir projectInfo = do absWaspProjectDir <- getAbsoluteWaspProjectDir projectInfo - liftIO $ do - initializeProjectFromSkeleton absWaspProjectDir - writeMainWaspFile absWaspProjectDir projectInfo - -printInfoMessages :: ProjectInfo -> IO () -printInfoMessages (ProjectInfo projectName _) = 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 "" - putStrLn Command.Common.alphaWarningMessage + dirExists <- doesDirExist $ toPathAbsDir absWaspProjectDir + if dirExists + then throwError $ CommandError "Project creation failed" $ show absWaspProjectDir ++ " is an existing directory" + else liftIO $ do + initializeProjectFromSkeleton absWaspProjectDir + writeMainWaspFile absWaspProjectDir projectInfo getAbsoluteWaspProjectDir :: ProjectInfo -> Command (Path System Abs (Dir WaspProjectDir)) getAbsoluteWaspProjectDir (ProjectInfo projectName _) = do absCwd <- liftIO getCurrentDirectory - case SP.parseAbsDir $ absCwd FP. projectName of + case parseAbsDir $ absCwd FP. projectName of Right sp -> return sp Left err -> throwError $ @@ -83,12 +85,12 @@ initializeProjectFromSkeleton :: Path' Abs (Dir Common.WaspProjectDir) -> IO () initializeProjectFromSkeleton absWaspProjectDir = do dataDir <- Data.getAbsDataDirPath let absSkeletonDir = dataDir [reldir|Cli/templates/new|] - copyDirectoryRecursive absSkeletonDir absWaspProjectDir + copyDirRecur (toPathAbsDir absSkeletonDir) (toPathAbsDir absWaspProjectDir) writeMainWaspFile :: Path System Abs (Dir WaspProjectDir) -> ProjectInfo -> IO () -writeMainWaspFile waspProjectDir (ProjectInfo projectName appName) = writeFile mainWaspFileAbsPath mainWaspFileContent +writeMainWaspFile waspProjectDir (ProjectInfo projectName appName) = writeFile absMainWaspFile mainWaspFileContent where - mainWaspFileAbsPath = SP.fromAbsFile $ waspProjectDir [relfile|main.wasp|] + absMainWaspFile = fromAbsFile $ waspProjectDir [relfile|main.wasp|] mainWaspFileContent = unlines [ "app %s {" `printf` appName, diff --git a/waspc/cli/src/Wasp/Cli/Command/Deps.hs b/waspc/cli/src/Wasp/Cli/Command/Deps.hs index 5c90d68fdf..e3c3262255 100644 --- a/waspc/cli/src/Wasp/Cli/Command/Deps.hs +++ b/waspc/cli/src/Wasp/Cli/Command/Deps.hs @@ -15,20 +15,20 @@ import Wasp.Cli.Terminal (title) import qualified Wasp.Generator.NpmDependencies as N import qualified Wasp.Generator.ServerGenerator as ServerGenerator import qualified Wasp.Generator.WebAppGenerator as WebAppGenerator -import Wasp.Lib (analyzeWaspProject) +import Wasp.Lib (findAndAnalyzeWaspFile) import qualified Wasp.Util.Terminal as Term deps :: Command () deps = do waspProjectDir <- findWaspProjectRootDirFromCwd - appSpecOrAnalyzerErrors <- liftIO $ analyzeWaspProject waspProjectDir (defaultCompileOptions waspProjectDir) + appSpecOrAnalyzerErrors <- liftIO $ findAndAnalyzeWaspFile waspProjectDir (defaultCompileOptions waspProjectDir) appSpec <- either (throwError . CommandError "Determining dependencies failed due to a compilation error in your Wasp project" . unwords . toList) return appSpecOrAnalyzerErrors - liftIO . putStrLn $ depsMessage appSpec + liftIO $ putStrLn $ depsMessage appSpec depsMessage :: AppSpec -> String depsMessage appSpec = diff --git a/waspc/cli/src/Wasp/Cli/Command/Info.hs b/waspc/cli/src/Wasp/Cli/Command/Info.hs index 92a533ecfa..97b670ffa7 100644 --- a/waspc/cli/src/Wasp/Cli/Command/Info.hs +++ b/waspc/cli/src/Wasp/Cli/Command/Info.hs @@ -5,14 +5,14 @@ module Wasp.Cli.Command.Info ) where -import Control.Arrow (ArrowChoice (left)) -import Control.Monad.IO.Class (liftIO) +import Control.Arrow +import Control.Monad.Except import StrongPath (Abs, Dir, Path', fromAbsFile, fromRelFile, toFilePath) import StrongPath.Operations import System.Directory (doesFileExist, getFileSize) import qualified Wasp.Analyzer as Analyzer -import qualified Wasp.AppSpec as AS import qualified Wasp.AppSpec.App as AS.App +import qualified Wasp.AppSpec.Core.Decl as AS (Decl, takeDecls) import Wasp.Cli.Command (Command) import Wasp.Cli.Command.Common (findWaspProjectRootDirFromCwd) import Wasp.Cli.Command.Message (cliSendMessageC) @@ -26,30 +26,23 @@ import Wasp.Util.IO (listDirectoryDeep) import qualified Wasp.Util.Terminal as Term info :: Command () -info = - do - waspDir <- findWaspProjectRootDirFromCwd - compileInfo <- liftIO $ readCompileInformation waspDir - projectSize <- liftIO $ readDirectorySizeMB waspDir - declsOrError <- liftIO $ parseWaspFile waspDir - case declsOrError of - Left err -> cliSendMessageC $ Msg.Failure "Info failed" err - Right decls -> do - cliSendMessageC $ - Msg.Info $ - unlines - [ "", - title "Project information", - printInfo - "Name" - (fst $ head $ AS.takeDecls @AS.App.App decls), - printInfo - "Last compile" - compileInfo, - printInfo - "Project size" - projectSize - ] +info = do + waspDir <- findWaspProjectRootDirFromCwd + compileInfo <- liftIO $ readCompileInformation waspDir + projectSize <- liftIO $ readDirectorySizeMB waspDir + declsOrError <- liftIO $ parseWaspFile waspDir + case declsOrError of + Left err -> cliSendMessageC $ Msg.Failure "Info failed" err + Right decls -> do + cliSendMessageC $ + Msg.Info $ + unlines + [ "", + title "Project information", + printInfo "Name" (fst $ head $ AS.takeDecls @AS.App.App decls), + printInfo "Last compile" compileInfo, + printInfo "Project size" projectSize + ] printInfo :: String -> String -> String printInfo key value = Term.applyStyles [Term.Cyan] key ++ ": " <> Term.applyStyles [Term.White] value @@ -70,17 +63,12 @@ readCompileInformation waspDir = do else return "No compile information found" parseWaspFile :: Path' Abs (Dir WaspProjectDir) -> IO (Either String [AS.Decl]) -parseWaspFile waspDir = do - maybeWaspFile <- findWaspFile waspDir - case maybeWaspFile of - Nothing -> return (Left "Couldn't find a single *.wasp file.") - Just waspFile -> - do - waspStr <- readFile (toFilePath waspFile) - return $ - left - ( ("Couldn't parse .wasp file:\n" <>) - . showCompilerErrorForTerminal (waspFile, waspStr) - . Analyzer.getErrorMessageAndCtx - ) - $ Analyzer.analyze waspStr +parseWaspFile waspDir = runExceptT $ do + waspFile <- ExceptT $ findWaspFile waspDir + waspStr <- liftIO $ readFile $ toFilePath waspFile + liftEither $ left (annotateErrorForCli waspFile waspStr) $ Analyzer.analyze waspStr + where + annotateErrorForCli waspFile waspStr = + ("Couldn't parse .wasp file:\n" ++) + . showCompilerErrorForTerminal (waspFile, waspStr) + . Analyzer.getErrorMessageAndCtx diff --git a/waspc/src/Wasp/Lib.hs b/waspc/src/Wasp/Lib.hs index 187b106ab6..ed0fe6699c 100644 --- a/waspc/src/Wasp/Lib.hs +++ b/waspc/src/Wasp/Lib.hs @@ -3,15 +3,15 @@ module Wasp.Lib Generator.start, ProjectRootDir, findWaspFile, - analyzeWaspProject, + findAndAnalyzeWaspFile, ) where +import Control.Arrow import Control.Monad.Except import Data.List (find, isSuffixOf) import Data.List.NonEmpty (NonEmpty, fromList, toList) -import StrongPath (Abs, Dir, File', Path', relfile) -import qualified StrongPath as SP +import StrongPath (Abs, Dir, File', Path', Rel, fromAbsDir, fromAbsFile, relfile, toFilePath, ()) import System.Directory (doesDirectoryExist, doesFileExist) import qualified Wasp.Analyzer as Analyzer import Wasp.Analyzer.AnalyzeError (getErrorMessageAndCtx) @@ -27,6 +27,7 @@ import qualified Wasp.Generator as Generator import Wasp.Generator.Common (ProjectRootDir) import Wasp.Generator.ServerGenerator.Common (dotEnvServer) import Wasp.Generator.WebAppGenerator.Common (dotEnvClient) +import Wasp.Util (maybeToEither) import qualified Wasp.Util.IO as Util.IO type CompileError = String @@ -39,8 +40,8 @@ compile :: CompileOptions -> IO ([CompileWarning], [CompileError]) compile waspDir outDir options = do - appSpecOrAnalyzerErrors <- analyzeWaspProject waspDir options - analyzerWarnings <- warnIfDotEnvPresent waspDir + appSpecOrAnalyzerErrors <- findAndAnalyzeWaspFile waspDir options + compileWarnings <- warnIfDotEnvPresent waspDir compilerWarningsAndErrors <- case appSpecOrAnalyzerErrors of Left analyzerErrors -> return ([], toList analyzerErrors) Right appSpec -> @@ -49,16 +50,16 @@ compile waspDir outDir options = do (generatorWarnings, generatorErrors) <- Generator.writeWebAppCode appSpec outDir (sendMessage options) return (map show $ generatorWarningsFilter options generatorWarnings, map show generatorErrors) validationErrors -> return ([], map show validationErrors) - return $ (analyzerWarnings, []) <> compilerWarningsAndErrors + return $ (compileWarnings, []) <> compilerWarningsAndErrors -analyzeWaspProject :: +findAndAnalyzeWaspFile :: Path' Abs (Dir WaspProjectDir) -> CompileOptions -> IO (Either (NonEmpty CompileError) AppSpec) -analyzeWaspProject waspDir options = runExceptT $ do - waspFilePath <- ExceptT $ findWaspFilePath waspDir +findAndAnalyzeWaspFile waspDir options = runExceptT $ do + waspFilePath <- ExceptT $ left pure <$> findWaspFile waspDir declarations <- ExceptT $ analyzeWaspFileContent waspFilePath - liftIO $ createAppSpec waspDir options declarations + liftIO $ constructAppSpec waspDir options declarations -- | Checks the wasp directory for potential problems, and issues warnings if any are found. warnIfDotEnvPresent :: Path' Abs (Dir WaspProjectDir) -> IO [CompileWarning] @@ -68,16 +69,9 @@ warnIfDotEnvPresent waspDir = do Nothing -> [] Just _ -> ["Wasp .env files should be named .env.server or .env.client, depending on their use."] -findWaspFilePath :: Path' Abs (Dir WaspProjectDir) -> IO (Either (NonEmpty CompileError) (Path' Abs File')) -findWaspFilePath waspDir = do - maybeWaspFilePath <- findWaspFile waspDir - return $ case maybeWaspFilePath of - Nothing -> Left $ fromList ["Couldn't find a single *.wasp file."] - Just waspFilePath -> Right waspFilePath - analyzeWaspFileContent :: Path' Abs File' -> IO (Either (NonEmpty CompileError) [Decl]) analyzeWaspFileContent waspFilePath = do - waspFileContent <- readFile (SP.fromAbsFile waspFilePath) + waspFileContent <- readFile (fromAbsFile waspFilePath) return $ case Analyzer.analyze waspFileContent of Right decls -> Right decls Left analyzeError -> @@ -88,8 +82,8 @@ analyzeWaspFileContent waspFilePath = do (getErrorMessageAndCtx analyzeError) ] -createAppSpec :: Path' Abs (Dir WaspProjectDir) -> CompileOptions -> [Decl] -> IO AS.AppSpec -createAppSpec waspDir options decls = do +constructAppSpec :: Path' Abs (Dir WaspProjectDir) -> CompileOptions -> [Decl] -> IO AS.AppSpec +constructAppSpec waspDir options decls = do externalServerCodeFiles <- ExternalCode.readFiles (CompileOptions.externalServerCodeDirPath options) externalClientCodeFiles <- @@ -108,14 +102,14 @@ createAppSpec waspDir options decls = do AS.isBuild = CompileOptions.isBuild options } -findWaspFile :: Path' Abs (Dir WaspProjectDir) -> IO (Maybe (Path' Abs File')) +findWaspFile :: Path' Abs (Dir WaspProjectDir) -> IO (Either String (Path' Abs File')) findWaspFile waspDir = do files <- fst <$> Util.IO.listDirectory waspDir - return $ (waspDir SP.) <$> find isWaspFile files + return $ maybeToEither "Couldn't find a single *.wasp file." $ (waspDir ) <$> find isWaspFile files where isWaspFile path = - ".wasp" `isSuffixOf` SP.toFilePath path - && (length (SP.toFilePath path) > length (".wasp" :: String)) + ".wasp" `isSuffixOf` toFilePath path + && (length (toFilePath path) > length (".wasp" :: String)) findDotEnvServer :: Path' Abs (Dir WaspProjectDir) -> IO (Maybe (Path' Abs File')) findDotEnvServer waspDir = findFileInWaspProjectDir waspDir dotEnvServer @@ -128,17 +122,17 @@ findDotEnv waspDir = findFileInWaspProjectDir waspDir [relfile|.env|] findFileInWaspProjectDir :: Path' Abs (Dir WaspProjectDir) -> - Path' (SP.Rel WaspProjectDir) File' -> + Path' (Rel WaspProjectDir) File' -> IO (Maybe (Path' Abs File')) findFileInWaspProjectDir waspDir file = do - let fileAbsFp = waspDir SP. file - fileExists <- doesFileExist $ SP.toFilePath fileAbsFp + let fileAbsFp = waspDir file + fileExists <- doesFileExist $ toFilePath fileAbsFp return $ if fileExists then Just fileAbsFp else Nothing findMigrationsDir :: Path' Abs (Dir WaspProjectDir) -> IO (Maybe (Path' Abs (Dir DbMigrationsDir))) findMigrationsDir waspDir = do - let migrationsAbsPath = waspDir SP. dbMigrationsDirInWaspProjectDir - migrationsExists <- doesDirectoryExist $ SP.fromAbsDir migrationsAbsPath + let migrationsAbsPath = waspDir dbMigrationsDirInWaspProjectDir + migrationsExists <- doesDirectoryExist $ fromAbsDir migrationsAbsPath return $ if migrationsExists then Just migrationsAbsPath else Nothing diff --git a/waspc/src/Wasp/Util.hs b/waspc/src/Wasp/Util.hs index 48168b9de6..a760db4687 100644 --- a/waspc/src/Wasp/Util.hs +++ b/waspc/src/Wasp/Util.hs @@ -29,6 +29,7 @@ module Wasp.Util orIfNothing, orIfNothingM, kebabToCamelCase, + maybeToEither ) where @@ -211,3 +212,8 @@ orIfNothing = flip fromMaybe orIfNothingM :: (Monad m) => m (Maybe a) -> m a -> m a orIfNothingM = flip fromMaybeM + +maybeToEither :: a -> Maybe b -> Either a b +maybeToEither leftValue = \case + Nothing -> Left leftValue + Just rightValue -> Right rightValue From 789dc8f607b5211bbc01c2d2ebe6b3b662f4217d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Sodi=C4=87?= Date: Mon, 24 Oct 2022 23:40:28 +0200 Subject: [PATCH 08/35] Add skeleton comment --- waspc/cli/src/Wasp/Cli/Command/CreateNewProject.hs | 1 + waspc/src/Wasp/Util.hs | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/waspc/cli/src/Wasp/Cli/Command/CreateNewProject.hs b/waspc/cli/src/Wasp/Cli/Command/CreateNewProject.hs index 288fdaa4e0..3296dcada1 100644 --- a/waspc/cli/src/Wasp/Cli/Command/CreateNewProject.hs +++ b/waspc/cli/src/Wasp/Cli/Command/CreateNewProject.hs @@ -81,6 +81,7 @@ getAbsoluteWaspProjectDir (ProjectInfo projectName _) = do "Project creation failed" ("Failed to parse absolute path to wasp project dir: " ++ show err) +-- To avoid creating a new project manually, we copy the project directory skeleton from our templates. initializeProjectFromSkeleton :: Path' Abs (Dir Common.WaspProjectDir) -> IO () initializeProjectFromSkeleton absWaspProjectDir = do dataDir <- Data.getAbsDataDirPath diff --git a/waspc/src/Wasp/Util.hs b/waspc/src/Wasp/Util.hs index a760db4687..7cb07349a8 100644 --- a/waspc/src/Wasp/Util.hs +++ b/waspc/src/Wasp/Util.hs @@ -29,7 +29,7 @@ module Wasp.Util orIfNothing, orIfNothingM, kebabToCamelCase, - maybeToEither + maybeToEither, ) where From 6d2960107963d506419d5085ec9de35b14eb4e8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Sodi=C4=87?= Date: Tue, 25 Oct 2022 00:01:33 +0200 Subject: [PATCH 09/35] Extract common CommandError message --- .../src/Wasp/Cli/Command/CreateNewProject.hs | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/waspc/cli/src/Wasp/Cli/Command/CreateNewProject.hs b/waspc/cli/src/Wasp/Cli/Command/CreateNewProject.hs index 3296dcada1..04f2bc9f77 100644 --- a/waspc/cli/src/Wasp/Cli/Command/CreateNewProject.hs +++ b/waspc/cli/src/Wasp/Cli/Command/CreateNewProject.hs @@ -48,15 +48,14 @@ parseProjectInfo :: String -> Command ProjectInfo parseProjectInfo name | isValidWaspIdentifier appName = return $ ProjectInfo name appName | otherwise = - throwError $ - CommandError "Project creation failed" $ - intercalate - "\n" - [ "The project's name is not in the valid format!", - indent 2 "- It can start with a letter or an underscore.", - indent 2 "- It can contain only letters, numbers, dashes, or underscores.", - indent 2 "- It can't be a Wasp keyword." - ] + throwProjectCreationError $ + intercalate + "\n" + [ "The project's name is not in the valid format!", + indent 2 "- It can start with a letter or an underscore.", + indent 2 "- It can contain only letters, numbers, dashes, or underscores.", + indent 2 "- It can't be a Wasp keyword." + ] where appName = kebabToCamelCase name @@ -65,7 +64,7 @@ createWaspProjectDir projectInfo = do absWaspProjectDir <- getAbsoluteWaspProjectDir projectInfo dirExists <- doesDirExist $ toPathAbsDir absWaspProjectDir if dirExists - then throwError $ CommandError "Project creation failed" $ show absWaspProjectDir ++ " is an existing directory" + then throwProjectCreationError $ show absWaspProjectDir ++ " is an existing directory" else liftIO $ do initializeProjectFromSkeleton absWaspProjectDir writeMainWaspFile absWaspProjectDir projectInfo @@ -76,10 +75,8 @@ getAbsoluteWaspProjectDir (ProjectInfo projectName _) = do case parseAbsDir $ absCwd FP. projectName of Right sp -> return sp Left err -> - throwError $ - CommandError - "Project creation failed" - ("Failed to parse absolute path to wasp project dir: " ++ show err) + throwProjectCreationError $ + "Failed to parse absolute path to wasp project dir: " ++ show err -- To avoid creating a new project manually, we copy the project directory skeleton from our templates. initializeProjectFromSkeleton :: Path' Abs (Dir Common.WaspProjectDir) -> IO () @@ -103,3 +100,6 @@ writeMainWaspFile waspProjectDir (ProjectInfo projectName appName) = writeFile a " component: import Main from \"@ext/MainPage.js\"", "}" ] + +throwProjectCreationError :: String -> Command a +throwProjectCreationError = throwError . CommandError "Project creation failed" From 11846e75eb76b56bdfd3a443a9b08fac79f1fb46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Sodi=C4=87?= Date: Tue, 25 Oct 2022 00:03:08 +0200 Subject: [PATCH 10/35] Separate skeleton comment into two rows --- waspc/cli/src/Wasp/Cli/Command/CreateNewProject.hs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/waspc/cli/src/Wasp/Cli/Command/CreateNewProject.hs b/waspc/cli/src/Wasp/Cli/Command/CreateNewProject.hs index 04f2bc9f77..eadf29c050 100644 --- a/waspc/cli/src/Wasp/Cli/Command/CreateNewProject.hs +++ b/waspc/cli/src/Wasp/Cli/Command/CreateNewProject.hs @@ -78,7 +78,8 @@ getAbsoluteWaspProjectDir (ProjectInfo projectName _) = do throwProjectCreationError $ "Failed to parse absolute path to wasp project dir: " ++ show err --- To avoid creating a new project manually, we copy the project directory skeleton from our templates. +-- To avoid creating the initial files for a new project dynamically, +-- we copy the project directory skeleton from our templates. initializeProjectFromSkeleton :: Path' Abs (Dir Common.WaspProjectDir) -> IO () initializeProjectFromSkeleton absWaspProjectDir = do dataDir <- Data.getAbsDataDirPath From 4f834ecfa99dc24a5d36277306dfe084da993dfd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Sodi=C4=87?= Date: Tue, 25 Oct 2022 00:08:49 +0200 Subject: [PATCH 11/35] Move server and client dirs into src --- waspc/cli/src/Wasp/Cli/Common.hs | 4 ++-- .../Cli/templates/new/{ => src}/client/.waspignore | 0 .../Cli/templates/new/{ => src}/client/Main.css | 0 .../Cli/templates/new/{ => src}/client/MainPage.js | 0 .../Cli/templates/new/{ => src}/client/waspLogo.png | Bin .../Cli/templates/new/{ => src}/server/.waspignore | 0 6 files changed, 2 insertions(+), 2 deletions(-) rename waspc/data/Cli/templates/new/{ => src}/client/.waspignore (100%) rename waspc/data/Cli/templates/new/{ => src}/client/Main.css (100%) rename waspc/data/Cli/templates/new/{ => src}/client/MainPage.js (100%) rename waspc/data/Cli/templates/new/{ => src}/client/waspLogo.png (100%) rename waspc/data/Cli/templates/new/{ => src}/server/.waspignore (100%) diff --git a/waspc/cli/src/Wasp/Cli/Common.hs b/waspc/cli/src/Wasp/Cli/Common.hs index 5fe611f7e6..33990c5287 100644 --- a/waspc/cli/src/Wasp/Cli/Common.hs +++ b/waspc/cli/src/Wasp/Cli/Common.hs @@ -43,10 +43,10 @@ dotWaspInfoFileInGeneratedCodeDir :: Path' (Rel Wasp.Generator.Common.ProjectRoo dotWaspInfoFileInGeneratedCodeDir = [relfile|.waspinfo|] extServerCodeDirInWaspProjectDir :: Path' (Rel WaspProjectDir) (Dir SourceExternalCodeDir) -extServerCodeDirInWaspProjectDir = [reldir|server|] +extServerCodeDirInWaspProjectDir = [reldir|src/server|] extClientCodeDirInWaspProjectDir :: Path' (Rel WaspProjectDir) (Dir SourceExternalCodeDir) -extClientCodeDirInWaspProjectDir = [reldir|client|] +extClientCodeDirInWaspProjectDir = [reldir|src/client|] waspSays :: String -> IO () waspSays what = putStrLn $ Term.applyStyles [Term.Yellow] what diff --git a/waspc/data/Cli/templates/new/client/.waspignore b/waspc/data/Cli/templates/new/src/client/.waspignore similarity index 100% rename from waspc/data/Cli/templates/new/client/.waspignore rename to waspc/data/Cli/templates/new/src/client/.waspignore diff --git a/waspc/data/Cli/templates/new/client/Main.css b/waspc/data/Cli/templates/new/src/client/Main.css similarity index 100% rename from waspc/data/Cli/templates/new/client/Main.css rename to waspc/data/Cli/templates/new/src/client/Main.css diff --git a/waspc/data/Cli/templates/new/client/MainPage.js b/waspc/data/Cli/templates/new/src/client/MainPage.js similarity index 100% rename from waspc/data/Cli/templates/new/client/MainPage.js rename to waspc/data/Cli/templates/new/src/client/MainPage.js diff --git a/waspc/data/Cli/templates/new/client/waspLogo.png b/waspc/data/Cli/templates/new/src/client/waspLogo.png similarity index 100% rename from waspc/data/Cli/templates/new/client/waspLogo.png rename to waspc/data/Cli/templates/new/src/client/waspLogo.png diff --git a/waspc/data/Cli/templates/new/server/.waspignore b/waspc/data/Cli/templates/new/src/server/.waspignore similarity index 100% rename from waspc/data/Cli/templates/new/server/.waspignore rename to waspc/data/Cli/templates/new/src/server/.waspignore From 385b35c5932884577a2de3efb706f9c943c5086a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Sodi=C4=87?= Date: Tue, 25 Oct 2022 15:21:58 +0200 Subject: [PATCH 12/35] Simplify maybeToEither --- waspc/src/Wasp/Util.hs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/waspc/src/Wasp/Util.hs b/waspc/src/Wasp/Util.hs index 7cb07349a8..b9b2179ed7 100644 --- a/waspc/src/Wasp/Util.hs +++ b/waspc/src/Wasp/Util.hs @@ -214,6 +214,4 @@ orIfNothingM :: (Monad m) => m (Maybe a) -> m a -> m a orIfNothingM = flip fromMaybeM maybeToEither :: a -> Maybe b -> Either a b -maybeToEither leftValue = \case - Nothing -> Left leftValue - Just rightValue -> Right rightValue +maybeToEither leftValue = maybe (Left leftValue) Right From a7753d245614c10c190cae033136ba9f4fa6cd90 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Sodi=C4=87?= Date: Tue, 25 Oct 2022 15:56:03 +0200 Subject: [PATCH 13/35] Further refactor Lib.hs --- waspc/cli/src/Wasp/Cli/Command/Deps.hs | 7 +- waspc/src/Wasp/Lib.hs | 99 ++++++++++++++------------ 2 files changed, 55 insertions(+), 51 deletions(-) diff --git a/waspc/cli/src/Wasp/Cli/Command/Deps.hs b/waspc/cli/src/Wasp/Cli/Command/Deps.hs index e3c3262255..9da61e9f1d 100644 --- a/waspc/cli/src/Wasp/Cli/Command/Deps.hs +++ b/waspc/cli/src/Wasp/Cli/Command/Deps.hs @@ -5,7 +5,6 @@ where import Control.Monad.Except (throwError) import Control.Monad.IO.Class (liftIO) -import Data.List.NonEmpty (toList) import Wasp.AppSpec (AppSpec) import qualified Wasp.AppSpec.App.Dependency as AS.Dependency import Wasp.Cli.Command (Command, CommandError (..)) @@ -15,16 +14,16 @@ import Wasp.Cli.Terminal (title) import qualified Wasp.Generator.NpmDependencies as N import qualified Wasp.Generator.ServerGenerator as ServerGenerator import qualified Wasp.Generator.WebAppGenerator as WebAppGenerator -import Wasp.Lib (findAndAnalyzeWaspFile) +import Wasp.Lib (analyzeProject) import qualified Wasp.Util.Terminal as Term deps :: Command () deps = do waspProjectDir <- findWaspProjectRootDirFromCwd - appSpecOrAnalyzerErrors <- liftIO $ findAndAnalyzeWaspFile waspProjectDir (defaultCompileOptions waspProjectDir) + appSpecOrAnalyzerErrors <- liftIO $ analyzeProject waspProjectDir (defaultCompileOptions waspProjectDir) appSpec <- either - (throwError . CommandError "Determining dependencies failed due to a compilation error in your Wasp project" . unwords . toList) + (throwError . CommandError "Determining dependencies failed due to a compilation error in your Wasp project" . unwords) return appSpecOrAnalyzerErrors diff --git a/waspc/src/Wasp/Lib.hs b/waspc/src/Wasp/Lib.hs index ed0fe6699c..0c1215bd7b 100644 --- a/waspc/src/Wasp/Lib.hs +++ b/waspc/src/Wasp/Lib.hs @@ -3,21 +3,20 @@ module Wasp.Lib Generator.start, ProjectRootDir, findWaspFile, - findAndAnalyzeWaspFile, + analyzeProject, ) where import Control.Arrow import Control.Monad.Except import Data.List (find, isSuffixOf) -import Data.List.NonEmpty (NonEmpty, fromList, toList) +import Data.Maybe (maybeToList) import StrongPath (Abs, Dir, File', Path', Rel, fromAbsDir, fromAbsFile, relfile, toFilePath, ()) import System.Directory (doesDirectoryExist, doesFileExist) import qualified Wasp.Analyzer as Analyzer import Wasp.Analyzer.AnalyzeError (getErrorMessageAndCtx) -import Wasp.AppSpec (AppSpec (externalClientFiles), Decl) import qualified Wasp.AppSpec as AS -import qualified Wasp.AppSpec.Valid as ASV +import Wasp.AppSpec.Valid (validateAppSpec) import Wasp.Common (DbMigrationsDir, WaspProjectDir, dbMigrationsDirInWaspProjectDir) import Wasp.CompileOptions (CompileOptions (generatorWarningsFilter), sendMessage) import qualified Wasp.CompileOptions as CompileOptions @@ -40,49 +39,52 @@ compile :: CompileOptions -> IO ([CompileWarning], [CompileError]) compile waspDir outDir options = do - appSpecOrAnalyzerErrors <- findAndAnalyzeWaspFile waspDir options - compileWarnings <- warnIfDotEnvPresent waspDir - compilerWarningsAndErrors <- case appSpecOrAnalyzerErrors of - Left analyzerErrors -> return ([], toList analyzerErrors) - Right appSpec -> - case ASV.validateAppSpec appSpec of - [] -> do - (generatorWarnings, generatorErrors) <- Generator.writeWebAppCode appSpec outDir (sendMessage options) - return (map show $ generatorWarningsFilter options generatorWarnings, map show generatorErrors) - validationErrors -> return ([], map show validationErrors) - return $ (compileWarnings, []) <> compilerWarningsAndErrors + compileWarnings <- maybeToList <$> warnIfDotEnvPresent waspDir + appSpecOrCompileErrors <- analyzeProject waspDir options + compileWarningsAndErrors <- case appSpecOrCompileErrors of + Left analyzerErrors -> return (compileWarnings, analyzerErrors) + Right appSpec -> generateCode appSpec outDir options + return $ (compileWarnings, []) <> compileWarningsAndErrors -findAndAnalyzeWaspFile :: +analyzeProject :: Path' Abs (Dir WaspProjectDir) -> CompileOptions -> - IO (Either (NonEmpty CompileError) AppSpec) -findAndAnalyzeWaspFile waspDir options = runExceptT $ do + IO (Either [CompileError] AS.AppSpec) +analyzeProject waspDir options = runExceptT $ do waspFilePath <- ExceptT $ left pure <$> findWaspFile waspDir - declarations <- ExceptT $ analyzeWaspFileContent waspFilePath - liftIO $ constructAppSpec waspDir options declarations + declarations <- ExceptT $ left pure <$> analyzeWaspFileContent waspFilePath + ExceptT $ constructAppSpec waspDir options declarations + +generateCode :: + AS.AppSpec -> + Path' Abs (Dir ProjectRootDir) -> + CompileOptions -> + IO ([CompileError], [CompileWarning]) +generateCode appSpec outDir options = do + (generatorWarnings, generatorErrors) <- Generator.writeWebAppCode appSpec outDir (sendMessage options) + let filteredWarnings = generatorWarningsFilter options generatorWarnings + return (map show filteredWarnings, map show generatorErrors) -- | Checks the wasp directory for potential problems, and issues warnings if any are found. -warnIfDotEnvPresent :: Path' Abs (Dir WaspProjectDir) -> IO [CompileWarning] -warnIfDotEnvPresent waspDir = do - maybeDotEnvFile <- findDotEnv waspDir - return $ case maybeDotEnvFile of - Nothing -> [] - Just _ -> ["Wasp .env files should be named .env.server or .env.client, depending on their use."] +warnIfDotEnvPresent :: Path' Abs (Dir WaspProjectDir) -> IO (Maybe CompileWarning) +warnIfDotEnvPresent waspDir = (warningMessage <$) <$> findDotEnv waspDir + where + warningMessage = "Wasp .env files should be named .env.server or .env.client, depending on their use." -analyzeWaspFileContent :: Path' Abs File' -> IO (Either (NonEmpty CompileError) [Decl]) +analyzeWaspFileContent :: Path' Abs File' -> IO (Either CompileError [AS.Decl]) analyzeWaspFileContent waspFilePath = do waspFileContent <- readFile (fromAbsFile waspFilePath) - return $ case Analyzer.analyze waspFileContent of - Right decls -> Right decls - Left analyzeError -> - Left $ - fromList - [ showCompilerErrorForTerminal - (waspFilePath, waspFileContent) - (getErrorMessageAndCtx analyzeError) - ] + let declsOrAnalyzeError = Analyzer.analyze waspFileContent + return $ + left + (showCompilerErrorForTerminal (waspFilePath, waspFileContent) . getErrorMessageAndCtx) + declsOrAnalyzeError -constructAppSpec :: Path' Abs (Dir WaspProjectDir) -> CompileOptions -> [Decl] -> IO AS.AppSpec +constructAppSpec :: + Path' Abs (Dir WaspProjectDir) -> + CompileOptions -> + [AS.Decl] -> + IO (Either [CompileError] AS.AppSpec) constructAppSpec waspDir options decls = do externalServerCodeFiles <- ExternalCode.readFiles (CompileOptions.externalServerCodeDirPath options) @@ -91,16 +93,19 @@ constructAppSpec waspDir options decls = do maybeDotEnvServerFile <- findDotEnvServer waspDir maybeDotEnvClientFile <- findDotEnvClient waspDir maybeMigrationsDir <- findMigrationsDir waspDir - return - AS.AppSpec - { AS.decls = decls, - AS.externalClientFiles = externalClientCodeFiles, - AS.externalServerFiles = externalServerCodeFiles, - AS.migrationsDir = maybeMigrationsDir, - AS.dotEnvServerFile = maybeDotEnvServerFile, - AS.dotEnvClientFile = maybeDotEnvClientFile, - AS.isBuild = CompileOptions.isBuild options - } + let appSpec = + AS.AppSpec + { AS.decls = decls, + AS.externalClientFiles = externalClientCodeFiles, + AS.externalServerFiles = externalServerCodeFiles, + AS.migrationsDir = maybeMigrationsDir, + AS.dotEnvServerFile = maybeDotEnvServerFile, + AS.dotEnvClientFile = maybeDotEnvClientFile, + AS.isBuild = CompileOptions.isBuild options + } + return $ case validateAppSpec appSpec of + [] -> Right appSpec + validationErrors -> Left $ map show validationErrors findWaspFile :: Path' Abs (Dir WaspProjectDir) -> IO (Either String (Path' Abs File')) findWaspFile waspDir = do From 53dc889ab9244a6038f0a85ccbb62afd4c321040 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Sodi=C4=87?= Date: Tue, 25 Oct 2022 15:59:24 +0200 Subject: [PATCH 14/35] Further simplify skeleton comment --- waspc/cli/src/Wasp/Cli/Command/CreateNewProject.hs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/waspc/cli/src/Wasp/Cli/Command/CreateNewProject.hs b/waspc/cli/src/Wasp/Cli/Command/CreateNewProject.hs index eadf29c050..752216b8cc 100644 --- a/waspc/cli/src/Wasp/Cli/Command/CreateNewProject.hs +++ b/waspc/cli/src/Wasp/Cli/Command/CreateNewProject.hs @@ -78,8 +78,7 @@ getAbsoluteWaspProjectDir (ProjectInfo projectName _) = do throwProjectCreationError $ "Failed to parse absolute path to wasp project dir: " ++ show err --- To avoid creating the initial files for a new project dynamically, --- we copy the project directory skeleton from our templates. +-- Copies prepared files to the new project directory. initializeProjectFromSkeleton :: Path' Abs (Dir Common.WaspProjectDir) -> IO () initializeProjectFromSkeleton absWaspProjectDir = do dataDir <- Data.getAbsDataDirPath From 40f56d242d25ede877ca6460560298ceb3f2f9a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Sodi=C4=87?= Date: Mon, 31 Oct 2022 10:40:48 +0100 Subject: [PATCH 15/35] Add shared code directory to project structure --- waspc/cli/src/Wasp/Cli/Command/Build.hs | 1 + waspc/cli/src/Wasp/Cli/Command/Compile.hs | 1 + waspc/cli/src/Wasp/Cli/Common.hs | 6 +++- .../new/src/{client => }/.waspignore | 0 .../Cli/templates/new/src/server/.waspignore | 3 -- waspc/src/Wasp/AppSpec.hs | 6 ++-- waspc/src/Wasp/CompileOptions.hs | 1 + waspc/src/Wasp/Generator/JsImport.hs | 2 +- waspc/src/Wasp/Generator/ServerGenerator.hs | 22 +++++++------- .../Wasp/Generator/ServerGenerator/AuthG.hs | 16 +++++----- .../ServerGenerator/ExternalCodeGenerator.hs | 29 ++++++++++++++----- .../Generator/ServerGenerator/JobGenerator.hs | 6 ++-- .../Generator/ServerGenerator/OperationsG.hs | 7 +++-- waspc/src/Wasp/Generator/WebAppGenerator.hs | 23 ++++++++------- .../WebAppGenerator/ExternalCodeGenerator.hs | 28 +++++++++++++----- .../WebAppGenerator/RouterGenerator.hs | 4 +-- waspc/src/Wasp/Lib.hs | 3 ++ 17 files changed, 97 insertions(+), 61 deletions(-) rename waspc/data/Cli/templates/new/src/{client => }/.waspignore (100%) delete mode 100644 waspc/data/Cli/templates/new/src/server/.waspignore diff --git a/waspc/cli/src/Wasp/Cli/Command/Build.hs b/waspc/cli/src/Wasp/Cli/Command/Build.hs index 141d89ea66..336973682a 100644 --- a/waspc/cli/src/Wasp/Cli/Command/Build.hs +++ b/waspc/cli/src/Wasp/Cli/Command/Build.hs @@ -57,6 +57,7 @@ buildIO waspProjectDir buildDir = compileIOWithOptions options waspProjectDir bu CompileOptions { externalClientCodeDirPath = waspProjectDir Common.extClientCodeDirInWaspProjectDir, externalServerCodeDirPath = waspProjectDir Common.extServerCodeDirInWaspProjectDir, + externalSharedCodeDirPath = waspProjectDir Common.extSharedCodeDirInWaspProjectDir, isBuild = True, sendMessage = cliSendMessage, -- Ignore "DB needs migration warnings" during build, as that is not a required step. diff --git a/waspc/cli/src/Wasp/Cli/Command/Compile.hs b/waspc/cli/src/Wasp/Cli/Command/Compile.hs index d89cce4909..27a1b89341 100644 --- a/waspc/cli/src/Wasp/Cli/Command/Compile.hs +++ b/waspc/cli/src/Wasp/Cli/Command/Compile.hs @@ -75,6 +75,7 @@ defaultCompileOptions waspProjectDir = CompileOptions { externalServerCodeDirPath = waspProjectDir Common.extServerCodeDirInWaspProjectDir, externalClientCodeDirPath = waspProjectDir Common.extClientCodeDirInWaspProjectDir, + externalSharedCodeDirPath = waspProjectDir Common.extSharedCodeDirInWaspProjectDir, isBuild = False, sendMessage = cliSendMessage, generatorWarningsFilter = id diff --git a/waspc/cli/src/Wasp/Cli/Common.hs b/waspc/cli/src/Wasp/Cli/Common.hs index 33990c5287..cece47fefc 100644 --- a/waspc/cli/src/Wasp/Cli/Common.hs +++ b/waspc/cli/src/Wasp/Cli/Common.hs @@ -5,8 +5,9 @@ module Wasp.Cli.Common dotWaspDirInWaspProjectDir, dotWaspRootFileInWaspProjectDir, dotWaspInfoFileInGeneratedCodeDir, - extClientCodeDirInWaspProjectDir, extServerCodeDirInWaspProjectDir, + extClientCodeDirInWaspProjectDir, + extSharedCodeDirInWaspProjectDir, generatedCodeDirInDotWaspDir, buildDirInDotWaspDir, waspSays, @@ -48,6 +49,9 @@ extServerCodeDirInWaspProjectDir = [reldir|src/server|] extClientCodeDirInWaspProjectDir :: Path' (Rel WaspProjectDir) (Dir SourceExternalCodeDir) extClientCodeDirInWaspProjectDir = [reldir|src/client|] +extSharedCodeDirInWaspProjectDir :: Path' (Rel WaspProjectDir) (Dir SourceExternalCodeDir) +extSharedCodeDirInWaspProjectDir = [reldir|src/shared|] + waspSays :: String -> IO () waspSays what = putStrLn $ Term.applyStyles [Term.Yellow] what diff --git a/waspc/data/Cli/templates/new/src/client/.waspignore b/waspc/data/Cli/templates/new/src/.waspignore similarity index 100% rename from waspc/data/Cli/templates/new/src/client/.waspignore rename to waspc/data/Cli/templates/new/src/.waspignore diff --git a/waspc/data/Cli/templates/new/src/server/.waspignore b/waspc/data/Cli/templates/new/src/server/.waspignore deleted file mode 100644 index 1c432f30d9..0000000000 --- a/waspc/data/Cli/templates/new/src/server/.waspignore +++ /dev/null @@ -1,3 +0,0 @@ -# Ignore editor tmp files -**/*~ -**/#*# diff --git a/waspc/src/Wasp/AppSpec.hs b/waspc/src/Wasp/AppSpec.hs index 0ff29ab1ca..f4a14d74d8 100644 --- a/waspc/src/Wasp/AppSpec.hs +++ b/waspc/src/Wasp/AppSpec.hs @@ -37,10 +37,12 @@ import Wasp.Common (DbMigrationsDir) data AppSpec = AppSpec { -- | List of declarations like App, Page, Route, ... that describe the web app. decls :: [Decl], - -- | List of external code files (they are referenced/used by the declarations). + -- | List of external server code files (they are referenced/used in the declarations). externalServerFiles :: [ExternalCode.File], - -- | List of external code files (they are referenced/used by the declarations). + -- | List of external client code files (they are referenced/used in the declarations). externalClientFiles :: [ExternalCode.File], + -- | List of files with external code shared between the server and the client. + externalSharedFiles :: [ExternalCode.File], -- | Absolute path to the directory in wasp project source that contains external code files. migrationsDir :: Maybe (Path' Abs (Dir DbMigrationsDir)), -- | Absolute path to the .env.server file in wasp project source. It contains env variables to be diff --git a/waspc/src/Wasp/CompileOptions.hs b/waspc/src/Wasp/CompileOptions.hs index 156fc6718b..d0174cd9b7 100644 --- a/waspc/src/Wasp/CompileOptions.hs +++ b/waspc/src/Wasp/CompileOptions.hs @@ -14,6 +14,7 @@ import Wasp.Message (SendMessage) data CompileOptions = CompileOptions { externalServerCodeDirPath :: !(Path' Abs (Dir SourceExternalCodeDir)), externalClientCodeDirPath :: !(Path' Abs (Dir SourceExternalCodeDir)), + externalSharedCodeDirPath :: !(Path' Abs (Dir SourceExternalCodeDir)), isBuild :: !Bool, -- We give the compiler the ability to send messages. The code that -- invokes the compiler (such as the CLI) can then implement a way diff --git a/waspc/src/Wasp/Generator/JsImport.hs b/waspc/src/Wasp/Generator/JsImport.hs index 260ed878c3..a4e1dfdaf2 100644 --- a/waspc/src/Wasp/Generator/JsImport.hs +++ b/waspc/src/Wasp/Generator/JsImport.hs @@ -10,7 +10,7 @@ import Wasp.Generator.ExternalCodeGenerator.Common (GeneratedExternalCodeDir) getJsImportDetailsForExtFnImport :: -- | Path to generated external code directory, relative to the directory in which file doing the importing is. - Path Posix (Rel (Dir a)) (Dir GeneratedExternalCodeDir) -> + Path Posix (Rel a) (Dir GeneratedExternalCodeDir) -> AS.ExtImport.ExtImport -> -- | (importIdentifier, importStmt) -- - importIdentifier -> Identifier via which you can access ext js function after you import it with importStmt. diff --git a/waspc/src/Wasp/Generator/ServerGenerator.hs b/waspc/src/Wasp/Generator/ServerGenerator.hs index 6c72d23bec..f4e05b4888 100644 --- a/waspc/src/Wasp/Generator/ServerGenerator.hs +++ b/waspc/src/Wasp/Generator/ServerGenerator.hs @@ -22,8 +22,8 @@ import StrongPath Path', Posix, Rel, + relDirToPosix, reldir, - reldirP, relfile, (), ) @@ -47,7 +47,7 @@ import qualified Wasp.Generator.NpmDependencies as N import Wasp.Generator.ServerGenerator.AuthG (genAuth) import qualified Wasp.Generator.ServerGenerator.Common as C import Wasp.Generator.ServerGenerator.ConfigG (genConfigFile) -import qualified Wasp.Generator.ServerGenerator.ExternalCodeGenerator as ServerExternalCodeGenerator +import Wasp.Generator.ServerGenerator.ExternalCodeGenerator (extServerCodeDirInServerSrcDir, extServerCodeGeneratorStrategy, extSharedCodeGeneratorStrategy) import Wasp.Generator.ServerGenerator.JobGenerator (depsRequiredByJobs, genJobExecutors, genJobs) import Wasp.Generator.ServerGenerator.OperationsG (genOperations) import Wasp.Generator.ServerGenerator.OperationsRoutesG (genOperationsRoutes) @@ -62,7 +62,8 @@ genServer spec = genGitignore ] <++> genSrcDir spec - <++> genExternalCodeDir ServerExternalCodeGenerator.generatorStrategy (AS.externalServerFiles spec) + <++> genExternalCodeDir extServerCodeGeneratorStrategy (AS.externalServerFiles spec) + <++> genExternalCodeDir extSharedCodeGeneratorStrategy (AS.externalSharedFiles spec) <++> genDotEnv spec <++> genJobs spec <++> genJobExecutors @@ -73,10 +74,10 @@ genDotEnv spec = return $ case AS.dotEnvServerFile spec of Just srcFilePath | not $ AS.isBuild spec -> - [ createCopyFileDraft - (C.serverRootDirInProjectRootDir dotEnvInServerRootDir) - srcFilePath - ] + [ createCopyFileDraft + (C.serverRootDirInProjectRootDir dotEnvInServerRootDir) + srcFilePath + ] _ -> [] dotEnvInServerRootDir :: Path' (Rel C.ServerRootDir) File' @@ -206,13 +207,12 @@ genServerJs spec = ) where maybeSetupJsFunction = AS.App.Server.setupFn =<< AS.App.server (snd $ getApp spec) - maybeSetupJsFnImportDetails = getJsImportDetailsForExtFnImport relPosixPathFromSrcDirToExtSrcDir <$> maybeSetupJsFunction + maybeSetupJsFnImportDetails = getJsImportDetailsForExtFnImport extServerCodeDirInServerSrcDirP <$> maybeSetupJsFunction (maybeSetupJsFnImportIdentifier, maybeSetupJsFnImportStmt) = (fst <$> maybeSetupJsFnImportDetails, snd <$> maybeSetupJsFnImportDetails) --- | TODO: Make this not hardcoded! -relPosixPathFromSrcDirToExtSrcDir :: Path Posix (Rel (Dir C.ServerSrcDir)) (Dir GeneratedExternalCodeDir) -relPosixPathFromSrcDirToExtSrcDir = [reldirP|./ext-src|] +extServerCodeDirInServerSrcDirP :: Path Posix (Rel C.ServerSrcDir) (Dir GeneratedExternalCodeDir) +extServerCodeDirInServerSrcDirP = fromJust $ relDirToPosix extServerCodeDirInServerSrcDir genRoutesDir :: AppSpec -> Generator [FileDraft] genRoutesDir spec = diff --git a/waspc/src/Wasp/Generator/ServerGenerator/AuthG.hs b/waspc/src/Wasp/Generator/ServerGenerator/AuthG.hs index c3a10fb783..20251f5805 100644 --- a/waspc/src/Wasp/Generator/ServerGenerator/AuthG.hs +++ b/waspc/src/Wasp/Generator/ServerGenerator/AuthG.hs @@ -4,7 +4,7 @@ module Wasp.Generator.ServerGenerator.AuthG where import Data.Aeson (object, (.=)) -import Data.Maybe (fromMaybe, isJust) +import Data.Maybe (fromJust, fromMaybe, isJust) import StrongPath ( Dir, File', @@ -28,6 +28,7 @@ import Wasp.Generator.FileDraft (FileDraft) import Wasp.Generator.JsImport (getJsImportDetailsForExtFnImport) import Wasp.Generator.Monad (Generator) import qualified Wasp.Generator.ServerGenerator.Common as C +import Wasp.Generator.ServerGenerator.ExternalCodeGenerator (extServerCodeDirInServerSrcDir) import Wasp.Util ((<++>)) import qualified Wasp.Util as Util @@ -174,11 +175,11 @@ genUtilsJs auth = return $ C.mkTmplFdWithDstAndData tmplFile dstFile (Just tmplD genGoogleAuth :: AS.Auth.Auth -> Generator [FileDraft] genGoogleAuth auth | AS.Auth.isGoogleAuthEnabled auth = - sequence - [ copyTmplFile [relfile|routes/auth/passport/google/google.js|], - copyTmplFile [relfile|routes/auth/passport/google/googleDefaults.js|], - genGoogleConfigJs auth - ] + sequence + [ copyTmplFile [relfile|routes/auth/passport/google/google.js|], + copyTmplFile [relfile|routes/auth/passport/google/googleDefaults.js|], + genGoogleConfigJs auth + ] | otherwise = return [] where copyTmplFile = return . C.mkSrcTmplFd @@ -209,9 +210,8 @@ genGoogleConfigJs auth = return $ C.mkTmplFdWithDstAndData tmplFile dstFile (Jus maybeOnSignInFnImportDetails = getJsImportDetailsForExtFnImport relPosixPathFromGoogleAuthDirToExtSrcDir <$> maybeGetUserFieldsFn (maybeOnSignInFnImportIdentifier, maybeOnSignInFnImportStmt) = (fst <$> maybeOnSignInFnImportDetails, snd <$> maybeOnSignInFnImportDetails) --- | TODO: Make this not hardcoded! relPosixPathFromGoogleAuthDirToExtSrcDir :: Path Posix (Rel (Dir C.ServerSrcDir)) (Dir GeneratedExternalCodeDir) -relPosixPathFromGoogleAuthDirToExtSrcDir = [reldirP|../../../../ext-src|] +relPosixPathFromGoogleAuthDirToExtSrcDir = [reldirP|../../../../|] fromJust (SP.relDirToPosix extServerCodeDirInServerSrcDir) getOnAuthSucceededRedirectToOrDefault :: AS.Auth.Auth -> String getOnAuthSucceededRedirectToOrDefault auth = fromMaybe "/" (AS.Auth.onAuthSucceededRedirectTo auth) diff --git a/waspc/src/Wasp/Generator/ServerGenerator/ExternalCodeGenerator.hs b/waspc/src/Wasp/Generator/ServerGenerator/ExternalCodeGenerator.hs index c72ef6debb..58b038f350 100644 --- a/waspc/src/Wasp/Generator/ServerGenerator/ExternalCodeGenerator.hs +++ b/waspc/src/Wasp/Generator/ServerGenerator/ExternalCodeGenerator.hs @@ -1,6 +1,7 @@ module Wasp.Generator.ServerGenerator.ExternalCodeGenerator - ( extCodeDirInServerSrcDir, - generatorStrategy, + ( extServerCodeGeneratorStrategy, + extServerCodeDirInServerSrcDir, + extSharedCodeGeneratorStrategy, ) where @@ -10,16 +11,28 @@ import Wasp.Generator.ExternalCodeGenerator.Common (ExternalCodeGeneratorStrateg import Wasp.Generator.ExternalCodeGenerator.Js (resolveJsFileWaspImportsForExtCodeDir) import qualified Wasp.Generator.ServerGenerator.Common as C --- | Relative path to directory where external code will be generated. -extCodeDirInServerSrcDir :: Path' (Rel C.ServerSrcDir) (Dir GeneratedExternalCodeDir) -extCodeDirInServerSrcDir = [reldir|ext-src|] +extServerCodeGeneratorStrategy :: ExternalCodeGeneratorStrategy +extServerCodeGeneratorStrategy = mkExtCodeGeneratorStrategy extServerCodeDirInServerSrcDir -generatorStrategy :: ExternalCodeGeneratorStrategy -generatorStrategy = +extSharedCodeGeneratorStrategy :: ExternalCodeGeneratorStrategy +extSharedCodeGeneratorStrategy = mkExtCodeGeneratorStrategy extSharedCodeDirInServerSrcDir + +-- | Relative path to the directory where external server code will be generated. +-- Relative to the server src dir. +extServerCodeDirInServerSrcDir :: Path' (Rel C.ServerSrcDir) (Dir GeneratedExternalCodeDir) +extServerCodeDirInServerSrcDir = [reldir|ext-src|] + +-- | Relative path to the directory where external shared code will be generated. +-- Relative to the server src dir. +extSharedCodeDirInServerSrcDir :: Path' (Rel C.ServerSrcDir) (Dir GeneratedExternalCodeDir) +extSharedCodeDirInServerSrcDir = [reldir|shared|] + +mkExtCodeGeneratorStrategy :: Path' (Rel C.ServerSrcDir) (Dir GeneratedExternalCodeDir) -> ExternalCodeGeneratorStrategy +mkExtCodeGeneratorStrategy extCodeDirInServerSrcDir = ExternalCodeGeneratorStrategy { _resolveJsFileWaspImports = resolveJsFileWaspImportsForExtCodeDir (SP.castRel extCodeDirInServerSrcDir), _extCodeDirInProjectRootDir = C.serverRootDirInProjectRootDir C.serverSrcDirInServerRootDir extCodeDirInServerSrcDir - } + } \ No newline at end of file diff --git a/waspc/src/Wasp/Generator/ServerGenerator/JobGenerator.hs b/waspc/src/Wasp/Generator/ServerGenerator/JobGenerator.hs index b1abae19d9..8288ec812d 100644 --- a/waspc/src/Wasp/Generator/ServerGenerator/JobGenerator.hs +++ b/waspc/src/Wasp/Generator/ServerGenerator/JobGenerator.hs @@ -43,6 +43,7 @@ import Wasp.Generator.ServerGenerator.Common srcDirInServerTemplatesDir, ) import qualified Wasp.Generator.ServerGenerator.Common as C +import Wasp.Generator.ServerGenerator.ExternalCodeGenerator (extServerCodeDirInServerSrcDir) import qualified Wasp.SemanticVersion as SV genJobs :: AppSpec -> Generator [FileDraft] @@ -107,9 +108,8 @@ genAllJobImports spec = [ "name" .= jobName ] --- | TODO: Make this not hardcoded! -relPosixPathFromJobFileToExtSrcDir :: Path Posix (Rel (Dir ServerSrcDir)) (Dir GeneratedExternalCodeDir) -relPosixPathFromJobFileToExtSrcDir = [reldirP|../ext-src|] +relPosixPathFromJobFileToExtSrcDir :: Path Posix (Rel ServerSrcDir) (Dir GeneratedExternalCodeDir) +relPosixPathFromJobFileToExtSrcDir = [reldirP|../|] SP. fromJust (SP.relDirToPosix extServerCodeDirInServerSrcDir) genJobExecutors :: Generator [FileDraft] genJobExecutors = return $ jobExecutorFds ++ jobExecutorHelperFds diff --git a/waspc/src/Wasp/Generator/ServerGenerator/OperationsG.hs b/waspc/src/Wasp/Generator/ServerGenerator/OperationsG.hs index 09f04bba7c..af9f1101c5 100644 --- a/waspc/src/Wasp/Generator/ServerGenerator/OperationsG.hs +++ b/waspc/src/Wasp/Generator/ServerGenerator/OperationsG.hs @@ -11,7 +11,7 @@ where import Data.Aeson (object, (.=)) import qualified Data.Aeson as Aeson import Data.Maybe (fromJust) -import StrongPath (Dir, Dir', File', Path, Path', Posix, Rel, reldir, reldirP, relfile, ()) +import StrongPath (Dir, Dir', File', Path, Path', Posix, Rel, relDirToPosix, reldir, reldirP, relfile, ()) import qualified StrongPath as SP import Wasp.AppSpec (AppSpec) import qualified Wasp.AppSpec as AS @@ -23,6 +23,7 @@ import Wasp.Generator.FileDraft (FileDraft) import Wasp.Generator.JsImport (getJsImportDetailsForExtFnImport) import Wasp.Generator.Monad (Generator) import qualified Wasp.Generator.ServerGenerator.Common as C +import Wasp.Generator.ServerGenerator.ExternalCodeGenerator (extServerCodeDirInServerSrcDir) import Wasp.Util ((<++>)) genOperations :: AppSpec -> Generator [FileDraft] @@ -70,9 +71,9 @@ operationFileInSrcDir :: AS.Operation.Operation -> Path' (Rel C.ServerSrcDir) Fi operationFileInSrcDir (AS.Operation.QueryOp name _) = queryFileInSrcDir name operationFileInSrcDir (AS.Operation.ActionOp name _) = actionFileInSrcDir name --- | TODO: Make this not hardcoded! relPosixPathFromOperationFileToExtSrcDir :: Path Posix (Rel Dir') (Dir GeneratedExternalCodeDir) -relPosixPathFromOperationFileToExtSrcDir = [reldirP|../ext-src/|] +relPosixPathFromOperationFileToExtSrcDir = + [reldirP|../|] fromJust (relDirToPosix extServerCodeDirInServerSrcDir) operationTmplData :: AS.Operation.Operation -> Aeson.Value operationTmplData operation = diff --git a/waspc/src/Wasp/Generator/WebAppGenerator.hs b/waspc/src/Wasp/Generator/WebAppGenerator.hs index 208b461487..ae0bb7d352 100644 --- a/waspc/src/Wasp/Generator/WebAppGenerator.hs +++ b/waspc/src/Wasp/Generator/WebAppGenerator.hs @@ -6,7 +6,7 @@ where import Data.Aeson (object, (.=)) import Data.List (intercalate) -import Data.Maybe (fromMaybe, isJust) +import Data.Maybe (fromJust, fromMaybe, isJust) import StrongPath ( Dir, File', @@ -14,10 +14,10 @@ import StrongPath Path', Posix, Rel, + relDirToPosix, relfile, (), ) -import StrongPath.TH (reldirP) import Wasp.AppSpec (AppSpec) import qualified Wasp.AppSpec as AS import qualified Wasp.AppSpec.App as AS.App @@ -34,7 +34,7 @@ import Wasp.Generator.Monad (Generator) import qualified Wasp.Generator.NpmDependencies as N import Wasp.Generator.WebAppGenerator.AuthG (genAuth) import qualified Wasp.Generator.WebAppGenerator.Common as C -import qualified Wasp.Generator.WebAppGenerator.ExternalCodeGenerator as WebAppExternalCodeGenerator +import Wasp.Generator.WebAppGenerator.ExternalCodeGenerator (extClientCodeDirInWebAppSrcDir, extClientCodeGeneratorStrategy, extSharedCodeGeneratorStrategy) import Wasp.Generator.WebAppGenerator.OperationsGenerator (genOperations) import Wasp.Generator.WebAppGenerator.RouterGenerator (genRouter) import Wasp.Util ((<++>)) @@ -50,7 +50,8 @@ genWebApp spec = do ] <++> genPublicDir spec <++> genSrcDir spec - <++> genExternalCodeDir WebAppExternalCodeGenerator.generatorStrategy (AS.externalClientFiles spec) + <++> genExternalCodeDir extClientCodeGeneratorStrategy (AS.externalClientFiles spec) + <++> genExternalCodeDir extSharedCodeGeneratorStrategy (AS.externalSharedFiles spec) <++> genDotEnv spec genDotEnv :: AppSpec -> Generator [FileDraft] @@ -58,10 +59,10 @@ genDotEnv spec = return $ case AS.dotEnvClientFile spec of Just srcFilePath | not $ AS.isBuild spec -> - [ createCopyFileDraft - (C.webAppRootDirInProjectRootDir dotEnvInWebAppRootDir) - srcFilePath - ] + [ createCopyFileDraft + (C.webAppRootDirInProjectRootDir dotEnvInWebAppRootDir) + srcFilePath + ] _ -> [] dotEnvInWebAppRootDir :: Path' (Rel C.WebAppRootDir) File' @@ -199,9 +200,9 @@ genIndexJs spec = ) where maybeSetupJsFunction = AS.App.Client.setupFn =<< AS.App.client (snd $ getApp spec) - maybeSetupJsFnImportDetails = getJsImportDetailsForExtFnImport relPosixPathFromSrcDirToExtSrcDir <$> maybeSetupJsFunction + maybeSetupJsFnImportDetails = getJsImportDetailsForExtFnImport extClientCodeDirInWebAppSrcDirP <$> maybeSetupJsFunction (maybeSetupJsFnImportIdentifier, maybeSetupJsFnImportStmt) = (fst <$> maybeSetupJsFnImportDetails, snd <$> maybeSetupJsFnImportDetails) -relPosixPathFromSrcDirToExtSrcDir :: Path Posix (Rel (Dir C.WebAppSrcDir)) (Dir GeneratedExternalCodeDir) -relPosixPathFromSrcDirToExtSrcDir = [reldirP|./ext-src|] +extClientCodeDirInWebAppSrcDirP :: Path Posix (Rel C.WebAppSrcDir) (Dir GeneratedExternalCodeDir) +extClientCodeDirInWebAppSrcDirP = fromJust $ relDirToPosix extClientCodeDirInWebAppSrcDir diff --git a/waspc/src/Wasp/Generator/WebAppGenerator/ExternalCodeGenerator.hs b/waspc/src/Wasp/Generator/WebAppGenerator/ExternalCodeGenerator.hs index 5f8ee5ac58..d1d2441325 100644 --- a/waspc/src/Wasp/Generator/WebAppGenerator/ExternalCodeGenerator.hs +++ b/waspc/src/Wasp/Generator/WebAppGenerator/ExternalCodeGenerator.hs @@ -1,6 +1,7 @@ module Wasp.Generator.WebAppGenerator.ExternalCodeGenerator - ( extCodeDirInWebAppSrcDir, - generatorStrategy, + ( extClientCodeGeneratorStrategy, + extSharedCodeGeneratorStrategy, + extClientCodeDirInWebAppSrcDir ) where @@ -10,17 +11,28 @@ import Wasp.Generator.ExternalCodeGenerator.Common (ExternalCodeGeneratorStrateg import Wasp.Generator.ExternalCodeGenerator.Js (resolveJsFileWaspImportsForExtCodeDir) import qualified Wasp.Generator.WebAppGenerator.Common as C --- | Relative path to directory where external code will be generated. +extClientCodeGeneratorStrategy :: ExternalCodeGeneratorStrategy +extClientCodeGeneratorStrategy = mkExtCodeGeneratorStrategy extClientCodeDirInWebAppSrcDir + +extSharedCodeGeneratorStrategy :: ExternalCodeGeneratorStrategy +extSharedCodeGeneratorStrategy = mkExtCodeGeneratorStrategy extSharedCodeDirInWebAppSrcDir + +-- | Relative path to the directory where external client code will be generated. +-- Relative to web app src dir. +extClientCodeDirInWebAppSrcDir :: Path' (Rel C.WebAppSrcDir) (Dir GeneratedExternalCodeDir) +extClientCodeDirInWebAppSrcDir = [reldir|ext-src|] + +-- | Relative path to the directory where external shared code will be generated. -- Relative to web app src dir. -extCodeDirInWebAppSrcDir :: Path' (Rel C.WebAppSrcDir) (Dir GeneratedExternalCodeDir) -extCodeDirInWebAppSrcDir = [reldir|ext-src|] +extSharedCodeDirInWebAppSrcDir :: Path' (Rel C.WebAppSrcDir) (Dir GeneratedExternalCodeDir) +extSharedCodeDirInWebAppSrcDir = [reldir|shared|] -generatorStrategy :: ExternalCodeGeneratorStrategy -generatorStrategy = +mkExtCodeGeneratorStrategy :: Path' (Rel C.WebAppSrcDir) (Dir GeneratedExternalCodeDir) -> ExternalCodeGeneratorStrategy +mkExtCodeGeneratorStrategy extCodeDirInWebAppSrcDir = ExternalCodeGeneratorStrategy { _resolveJsFileWaspImports = resolveJsFileWaspImportsForExtCodeDir (SP.castRel extCodeDirInWebAppSrcDir), _extCodeDirInProjectRootDir = C.webAppRootDirInProjectRootDir C.webAppSrcDirInWebAppRootDir extCodeDirInWebAppSrcDir - } + } \ No newline at end of file diff --git a/waspc/src/Wasp/Generator/WebAppGenerator/RouterGenerator.hs b/waspc/src/Wasp/Generator/WebAppGenerator/RouterGenerator.hs index 013a659686..f70a4185c6 100644 --- a/waspc/src/Wasp/Generator/WebAppGenerator/RouterGenerator.hs +++ b/waspc/src/Wasp/Generator/WebAppGenerator/RouterGenerator.hs @@ -23,6 +23,7 @@ import Wasp.Generator.FileDraft (FileDraft) import Wasp.Generator.Monad (Generator) import Wasp.Generator.WebAppGenerator.Common (asTmplFile, asWebAppSrcFile) import qualified Wasp.Generator.WebAppGenerator.Common as C +import Wasp.Generator.WebAppGenerator.ExternalCodeGenerator (extClientCodeDirInWebAppSrcDir) data RouterTemplateData = RouterTemplateData { _routes :: ![RouteTemplateData], @@ -135,8 +136,7 @@ createPageTemplateData page = AS.ExtImport.ExtImportField identifier -> "{ " ++ mkNamedImportExpr identifier pageName ++ " }" } where - relPathToExtSrcDir :: FilePath - relPathToExtSrcDir = "./ext-src/" + relPathToExtSrcDir = "./" FP. SP.toFilePath extClientCodeDirInWebAppSrcDir pageName :: String pageName = fst page diff --git a/waspc/src/Wasp/Lib.hs b/waspc/src/Wasp/Lib.hs index 41505d3132..cec54798b6 100644 --- a/waspc/src/Wasp/Lib.hs +++ b/waspc/src/Wasp/Lib.hs @@ -96,6 +96,8 @@ constructAppSpec waspDir options decls = do ExternalCode.readFiles (CompileOptions.externalServerCodeDirPath options) externalClientCodeFiles <- ExternalCode.readFiles (CompileOptions.externalClientCodeDirPath options) + externalSharedCodeFiles <- + ExternalCode.readFiles (CompileOptions.externalSharedCodeDirPath options) maybeDotEnvServerFile <- findDotEnvServer waspDir maybeDotEnvClientFile <- findDotEnvClient waspDir maybeMigrationsDir <- findMigrationsDir waspDir @@ -105,6 +107,7 @@ constructAppSpec waspDir options decls = do { AS.decls = decls, AS.externalClientFiles = externalClientCodeFiles, AS.externalServerFiles = externalServerCodeFiles, + AS.externalSharedFiles = externalSharedCodeFiles, AS.migrationsDir = maybeMigrationsDir, AS.dotEnvServerFile = maybeDotEnvServerFile, AS.dotEnvClientFile = maybeDotEnvClientFile, From 936116b7749a1137391279542861aa206954ee42 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Sodi=C4=87?= Date: Mon, 31 Oct 2022 12:06:06 +0100 Subject: [PATCH 16/35] Update e2e test inputs --- waspc/e2e-test/Tests/WaspJobTest.hs | 2 +- .../test-outputs/waspBuild-golden/files.manifest | 11 ++++------- .../waspBuild-golden/waspBuild/.wasproot | 2 +- .../waspBuild/{ext => src}/.waspignore | 0 .../waspBuild/{ext => src/client}/Main.css | 0 .../waspBuild/{ext => src/client}/MainPage.js | 0 .../waspBuild/{ext => src/client}/waspLogo.png | Bin .../waspCompile-golden/files.manifest | 11 ++++------- .../waspCompile-golden/waspCompile/.wasproot | 2 +- .../waspCompile/{ext => src}/.waspignore | 0 .../waspCompile/{ext => src/client}/Main.css | 0 .../waspCompile/{ext => src/client}/MainPage.js | 0 .../waspCompile/{ext => src/client}/waspLogo.png | Bin .../test-outputs/waspJob-golden/files.manifest | 14 +++++--------- .../test-outputs/waspJob-golden/waspJob/.wasproot | 2 +- .../waspJob/{ext => src}/.waspignore | 0 .../waspJob/{ext => src/client}/Main.css | 0 .../waspJob/{ext => src/client}/MainPage.js | 0 .../waspJob/{ext => src/client}/waspLogo.png | Bin .../waspJob/{ext => src/server}/jobs/bar.js | 0 .../waspMigrate-golden/files.manifest | 11 ++++------- .../waspMigrate-golden/waspMigrate/.wasproot | 2 +- .../waspMigrate/{ext => src}/.waspignore | 0 .../waspMigrate/{ext => src/client}/Main.css | 0 .../waspMigrate/{ext => src/client}/MainPage.js | 0 .../waspMigrate/{ext => src/client}/waspLogo.png | Bin .../test-outputs/waspNew-golden/files.manifest | 8 ++++---- .../test-outputs/waspNew-golden/waspNew/.wasproot | 2 +- .../waspNew/{ext => src}/.waspignore | 0 .../waspNew/{ext => src/client}/Main.css | 0 .../waspNew/{ext => src/client}/MainPage.js | 0 .../waspNew/{ext => src/client}/waspLogo.png | Bin 32 files changed, 27 insertions(+), 40 deletions(-) rename waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/{ext => src}/.waspignore (100%) rename waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/{ext => src/client}/Main.css (100%) rename waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/{ext => src/client}/MainPage.js (100%) rename waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/{ext => src/client}/waspLogo.png (100%) rename waspc/e2e-test/test-outputs/waspCompile-golden/waspCompile/{ext => src}/.waspignore (100%) rename waspc/e2e-test/test-outputs/waspCompile-golden/waspCompile/{ext => src/client}/Main.css (100%) rename waspc/e2e-test/test-outputs/waspCompile-golden/waspCompile/{ext => src/client}/MainPage.js (100%) rename waspc/e2e-test/test-outputs/waspCompile-golden/waspCompile/{ext => src/client}/waspLogo.png (100%) rename waspc/e2e-test/test-outputs/waspJob-golden/waspJob/{ext => src}/.waspignore (100%) rename waspc/e2e-test/test-outputs/waspJob-golden/waspJob/{ext => src/client}/Main.css (100%) rename waspc/e2e-test/test-outputs/waspJob-golden/waspJob/{ext => src/client}/MainPage.js (100%) rename waspc/e2e-test/test-outputs/waspJob-golden/waspJob/{ext => src/client}/waspLogo.png (100%) rename waspc/e2e-test/test-outputs/waspJob-golden/waspJob/{ext => src/server}/jobs/bar.js (100%) rename waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/{ext => src}/.waspignore (100%) rename waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/{ext => src/client}/Main.css (100%) rename waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/{ext => src/client}/MainPage.js (100%) rename waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/{ext => src/client}/waspLogo.png (100%) rename waspc/e2e-test/test-outputs/waspNew-golden/waspNew/{ext => src}/.waspignore (100%) rename waspc/e2e-test/test-outputs/waspNew-golden/waspNew/{ext => src/client}/Main.css (100%) rename waspc/e2e-test/test-outputs/waspNew-golden/waspNew/{ext => src/client}/MainPage.js (100%) rename waspc/e2e-test/test-outputs/waspNew-golden/waspNew/{ext => src/client}/waspLogo.png (100%) diff --git a/waspc/e2e-test/Tests/WaspJobTest.hs b/waspc/e2e-test/Tests/WaspJobTest.hs index 6faba23b1c..1ddf446701 100644 --- a/waspc/e2e-test/Tests/WaspJobTest.hs +++ b/waspc/e2e-test/Tests/WaspJobTest.hs @@ -31,6 +31,6 @@ waspJob = do cdIntoCurrentProject, setDbToPSQL, appendToWaspFile entityDecl, - createFile jobFile "./ext/jobs" "bar.js", + createFile jobFile "./src/server/jobs" "bar.js", waspCliCompile ] diff --git a/waspc/e2e-test/test-outputs/waspBuild-golden/files.manifest b/waspc/e2e-test/test-outputs/waspBuild-golden/files.manifest index ec424cd101..a5ba6207c4 100644 --- a/waspc/e2e-test/test-outputs/waspBuild-golden/files.manifest +++ b/waspc/e2e-test/test-outputs/waspBuild-golden/files.manifest @@ -11,9 +11,6 @@ waspBuild/.wasp/build/server/src/config.js waspBuild/.wasp/build/server/src/core/AuthError.js waspBuild/.wasp/build/server/src/core/HttpError.js waspBuild/.wasp/build/server/src/dbClient.js -waspBuild/.wasp/build/server/src/ext-src/Main.css -waspBuild/.wasp/build/server/src/ext-src/MainPage.js -waspBuild/.wasp/build/server/src/ext-src/waspLogo.png waspBuild/.wasp/build/server/src/jobs/core/Job.js waspBuild/.wasp/build/server/src/jobs/core/SubmittedJob.js waspBuild/.wasp/build/server/src/jobs/core/allJobs.js @@ -51,8 +48,8 @@ waspBuild/.wasp/build/web-app/src/router.js waspBuild/.wasp/build/web-app/src/serviceWorker.js waspBuild/.wasp/build/web-app/src/utils.js waspBuild/.wasproot -waspBuild/ext/.waspignore -waspBuild/ext/Main.css -waspBuild/ext/MainPage.js -waspBuild/ext/waspLogo.png waspBuild/main.wasp +waspBuild/src/.waspignore +waspBuild/src/client/Main.css +waspBuild/src/client/MainPage.js +waspBuild/src/client/waspLogo.png diff --git a/waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/.wasproot b/waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/.wasproot index 3caa053db5..ca2cfdb482 100644 --- a/waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/.wasproot +++ b/waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/.wasproot @@ -1 +1 @@ -File marking the root of Wasp project. \ No newline at end of file +File marking the root of Wasp project. diff --git a/waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/ext/.waspignore b/waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/src/.waspignore similarity index 100% rename from waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/ext/.waspignore rename to waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/src/.waspignore diff --git a/waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/ext/Main.css b/waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/src/client/Main.css similarity index 100% rename from waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/ext/Main.css rename to waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/src/client/Main.css diff --git a/waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/ext/MainPage.js b/waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/src/client/MainPage.js similarity index 100% rename from waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/ext/MainPage.js rename to waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/src/client/MainPage.js diff --git a/waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/ext/waspLogo.png b/waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/src/client/waspLogo.png similarity index 100% rename from waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/ext/waspLogo.png rename to waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/src/client/waspLogo.png diff --git a/waspc/e2e-test/test-outputs/waspCompile-golden/files.manifest b/waspc/e2e-test/test-outputs/waspCompile-golden/files.manifest index 7b2bb5a53e..5294497adf 100644 --- a/waspc/e2e-test/test-outputs/waspCompile-golden/files.manifest +++ b/waspc/e2e-test/test-outputs/waspCompile-golden/files.manifest @@ -11,9 +11,6 @@ waspCompile/.wasp/out/server/src/config.js waspCompile/.wasp/out/server/src/core/AuthError.js waspCompile/.wasp/out/server/src/core/HttpError.js waspCompile/.wasp/out/server/src/dbClient.js -waspCompile/.wasp/out/server/src/ext-src/Main.css -waspCompile/.wasp/out/server/src/ext-src/MainPage.js -waspCompile/.wasp/out/server/src/ext-src/waspLogo.png waspCompile/.wasp/out/server/src/jobs/core/Job.js waspCompile/.wasp/out/server/src/jobs/core/SubmittedJob.js waspCompile/.wasp/out/server/src/jobs/core/allJobs.js @@ -51,8 +48,8 @@ waspCompile/.wasp/out/web-app/src/router.js waspCompile/.wasp/out/web-app/src/serviceWorker.js waspCompile/.wasp/out/web-app/src/utils.js waspCompile/.wasproot -waspCompile/ext/.waspignore -waspCompile/ext/Main.css -waspCompile/ext/MainPage.js -waspCompile/ext/waspLogo.png waspCompile/main.wasp +waspCompile/src/.waspignore +waspCompile/src/client/Main.css +waspCompile/src/client/MainPage.js +waspCompile/src/client/waspLogo.png diff --git a/waspc/e2e-test/test-outputs/waspCompile-golden/waspCompile/.wasproot b/waspc/e2e-test/test-outputs/waspCompile-golden/waspCompile/.wasproot index 3caa053db5..ca2cfdb482 100644 --- a/waspc/e2e-test/test-outputs/waspCompile-golden/waspCompile/.wasproot +++ b/waspc/e2e-test/test-outputs/waspCompile-golden/waspCompile/.wasproot @@ -1 +1 @@ -File marking the root of Wasp project. \ No newline at end of file +File marking the root of Wasp project. diff --git a/waspc/e2e-test/test-outputs/waspCompile-golden/waspCompile/ext/.waspignore b/waspc/e2e-test/test-outputs/waspCompile-golden/waspCompile/src/.waspignore similarity index 100% rename from waspc/e2e-test/test-outputs/waspCompile-golden/waspCompile/ext/.waspignore rename to waspc/e2e-test/test-outputs/waspCompile-golden/waspCompile/src/.waspignore diff --git a/waspc/e2e-test/test-outputs/waspCompile-golden/waspCompile/ext/Main.css b/waspc/e2e-test/test-outputs/waspCompile-golden/waspCompile/src/client/Main.css similarity index 100% rename from waspc/e2e-test/test-outputs/waspCompile-golden/waspCompile/ext/Main.css rename to waspc/e2e-test/test-outputs/waspCompile-golden/waspCompile/src/client/Main.css diff --git a/waspc/e2e-test/test-outputs/waspCompile-golden/waspCompile/ext/MainPage.js b/waspc/e2e-test/test-outputs/waspCompile-golden/waspCompile/src/client/MainPage.js similarity index 100% rename from waspc/e2e-test/test-outputs/waspCompile-golden/waspCompile/ext/MainPage.js rename to waspc/e2e-test/test-outputs/waspCompile-golden/waspCompile/src/client/MainPage.js diff --git a/waspc/e2e-test/test-outputs/waspCompile-golden/waspCompile/ext/waspLogo.png b/waspc/e2e-test/test-outputs/waspCompile-golden/waspCompile/src/client/waspLogo.png similarity index 100% rename from waspc/e2e-test/test-outputs/waspCompile-golden/waspCompile/ext/waspLogo.png rename to waspc/e2e-test/test-outputs/waspCompile-golden/waspCompile/src/client/waspLogo.png diff --git a/waspc/e2e-test/test-outputs/waspJob-golden/files.manifest b/waspc/e2e-test/test-outputs/waspJob-golden/files.manifest index 58f98a9d7b..b69946ae23 100644 --- a/waspc/e2e-test/test-outputs/waspJob-golden/files.manifest +++ b/waspc/e2e-test/test-outputs/waspJob-golden/files.manifest @@ -11,10 +11,7 @@ waspJob/.wasp/out/server/src/config.js waspJob/.wasp/out/server/src/core/AuthError.js waspJob/.wasp/out/server/src/core/HttpError.js waspJob/.wasp/out/server/src/dbClient.js -waspJob/.wasp/out/server/src/ext-src/Main.css -waspJob/.wasp/out/server/src/ext-src/MainPage.js waspJob/.wasp/out/server/src/ext-src/jobs/bar.js -waspJob/.wasp/out/server/src/ext-src/waspLogo.png waspJob/.wasp/out/server/src/jobs/MySpecialJob.js waspJob/.wasp/out/server/src/jobs/core/Job.js waspJob/.wasp/out/server/src/jobs/core/SubmittedJob.js @@ -39,7 +36,6 @@ waspJob/.wasp/out/web-app/src/api.js waspJob/.wasp/out/web-app/src/config.js waspJob/.wasp/out/web-app/src/ext-src/Main.css waspJob/.wasp/out/web-app/src/ext-src/MainPage.js -waspJob/.wasp/out/web-app/src/ext-src/jobs/bar.js waspJob/.wasp/out/web-app/src/ext-src/waspLogo.png waspJob/.wasp/out/web-app/src/index.css waspJob/.wasp/out/web-app/src/index.js @@ -54,9 +50,9 @@ waspJob/.wasp/out/web-app/src/router.js waspJob/.wasp/out/web-app/src/serviceWorker.js waspJob/.wasp/out/web-app/src/utils.js waspJob/.wasproot -waspJob/ext/.waspignore -waspJob/ext/Main.css -waspJob/ext/MainPage.js -waspJob/ext/jobs/bar.js -waspJob/ext/waspLogo.png waspJob/main.wasp +waspJob/src/.waspignore +waspJob/src/client/Main.css +waspJob/src/client/MainPage.js +waspJob/src/client/waspLogo.png +waspJob/src/server/jobs/bar.js diff --git a/waspc/e2e-test/test-outputs/waspJob-golden/waspJob/.wasproot b/waspc/e2e-test/test-outputs/waspJob-golden/waspJob/.wasproot index 3caa053db5..ca2cfdb482 100644 --- a/waspc/e2e-test/test-outputs/waspJob-golden/waspJob/.wasproot +++ b/waspc/e2e-test/test-outputs/waspJob-golden/waspJob/.wasproot @@ -1 +1 @@ -File marking the root of Wasp project. \ No newline at end of file +File marking the root of Wasp project. diff --git a/waspc/e2e-test/test-outputs/waspJob-golden/waspJob/ext/.waspignore b/waspc/e2e-test/test-outputs/waspJob-golden/waspJob/src/.waspignore similarity index 100% rename from waspc/e2e-test/test-outputs/waspJob-golden/waspJob/ext/.waspignore rename to waspc/e2e-test/test-outputs/waspJob-golden/waspJob/src/.waspignore diff --git a/waspc/e2e-test/test-outputs/waspJob-golden/waspJob/ext/Main.css b/waspc/e2e-test/test-outputs/waspJob-golden/waspJob/src/client/Main.css similarity index 100% rename from waspc/e2e-test/test-outputs/waspJob-golden/waspJob/ext/Main.css rename to waspc/e2e-test/test-outputs/waspJob-golden/waspJob/src/client/Main.css diff --git a/waspc/e2e-test/test-outputs/waspJob-golden/waspJob/ext/MainPage.js b/waspc/e2e-test/test-outputs/waspJob-golden/waspJob/src/client/MainPage.js similarity index 100% rename from waspc/e2e-test/test-outputs/waspJob-golden/waspJob/ext/MainPage.js rename to waspc/e2e-test/test-outputs/waspJob-golden/waspJob/src/client/MainPage.js diff --git a/waspc/e2e-test/test-outputs/waspJob-golden/waspJob/ext/waspLogo.png b/waspc/e2e-test/test-outputs/waspJob-golden/waspJob/src/client/waspLogo.png similarity index 100% rename from waspc/e2e-test/test-outputs/waspJob-golden/waspJob/ext/waspLogo.png rename to waspc/e2e-test/test-outputs/waspJob-golden/waspJob/src/client/waspLogo.png diff --git a/waspc/e2e-test/test-outputs/waspJob-golden/waspJob/ext/jobs/bar.js b/waspc/e2e-test/test-outputs/waspJob-golden/waspJob/src/server/jobs/bar.js similarity index 100% rename from waspc/e2e-test/test-outputs/waspJob-golden/waspJob/ext/jobs/bar.js rename to waspc/e2e-test/test-outputs/waspJob-golden/waspJob/src/server/jobs/bar.js diff --git a/waspc/e2e-test/test-outputs/waspMigrate-golden/files.manifest b/waspc/e2e-test/test-outputs/waspMigrate-golden/files.manifest index 257fe7caf4..843a206145 100644 --- a/waspc/e2e-test/test-outputs/waspMigrate-golden/files.manifest +++ b/waspc/e2e-test/test-outputs/waspMigrate-golden/files.manifest @@ -16,9 +16,6 @@ waspMigrate/.wasp/out/server/src/config.js waspMigrate/.wasp/out/server/src/core/AuthError.js waspMigrate/.wasp/out/server/src/core/HttpError.js waspMigrate/.wasp/out/server/src/dbClient.js -waspMigrate/.wasp/out/server/src/ext-src/Main.css -waspMigrate/.wasp/out/server/src/ext-src/MainPage.js -waspMigrate/.wasp/out/server/src/ext-src/waspLogo.png waspMigrate/.wasp/out/server/src/jobs/core/Job.js waspMigrate/.wasp/out/server/src/jobs/core/SubmittedJob.js waspMigrate/.wasp/out/server/src/jobs/core/allJobs.js @@ -56,10 +53,10 @@ waspMigrate/.wasp/out/web-app/src/router.js waspMigrate/.wasp/out/web-app/src/serviceWorker.js waspMigrate/.wasp/out/web-app/src/utils.js waspMigrate/.wasproot -waspMigrate/ext/.waspignore -waspMigrate/ext/Main.css -waspMigrate/ext/MainPage.js -waspMigrate/ext/waspLogo.png waspMigrate/main.wasp waspMigrate/migrations/migration_lock.toml waspMigrate/migrations/no-date-foo/migration.sql +waspMigrate/src/.waspignore +waspMigrate/src/client/Main.css +waspMigrate/src/client/MainPage.js +waspMigrate/src/client/waspLogo.png diff --git a/waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/.wasproot b/waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/.wasproot index 3caa053db5..ca2cfdb482 100644 --- a/waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/.wasproot +++ b/waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/.wasproot @@ -1 +1 @@ -File marking the root of Wasp project. \ No newline at end of file +File marking the root of Wasp project. diff --git a/waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/ext/.waspignore b/waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/src/.waspignore similarity index 100% rename from waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/ext/.waspignore rename to waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/src/.waspignore diff --git a/waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/ext/Main.css b/waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/src/client/Main.css similarity index 100% rename from waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/ext/Main.css rename to waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/src/client/Main.css diff --git a/waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/ext/MainPage.js b/waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/src/client/MainPage.js similarity index 100% rename from waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/ext/MainPage.js rename to waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/src/client/MainPage.js diff --git a/waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/ext/waspLogo.png b/waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/src/client/waspLogo.png similarity index 100% rename from waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/ext/waspLogo.png rename to waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/src/client/waspLogo.png diff --git a/waspc/e2e-test/test-outputs/waspNew-golden/files.manifest b/waspc/e2e-test/test-outputs/waspNew-golden/files.manifest index d20fb91970..93901d86ab 100644 --- a/waspc/e2e-test/test-outputs/waspNew-golden/files.manifest +++ b/waspc/e2e-test/test-outputs/waspNew-golden/files.manifest @@ -1,6 +1,6 @@ waspNew/.wasproot -waspNew/ext/.waspignore -waspNew/ext/Main.css -waspNew/ext/MainPage.js -waspNew/ext/waspLogo.png waspNew/main.wasp +waspNew/src/.waspignore +waspNew/src/client/Main.css +waspNew/src/client/MainPage.js +waspNew/src/client/waspLogo.png diff --git a/waspc/e2e-test/test-outputs/waspNew-golden/waspNew/.wasproot b/waspc/e2e-test/test-outputs/waspNew-golden/waspNew/.wasproot index 3caa053db5..ca2cfdb482 100644 --- a/waspc/e2e-test/test-outputs/waspNew-golden/waspNew/.wasproot +++ b/waspc/e2e-test/test-outputs/waspNew-golden/waspNew/.wasproot @@ -1 +1 @@ -File marking the root of Wasp project. \ No newline at end of file +File marking the root of Wasp project. diff --git a/waspc/e2e-test/test-outputs/waspNew-golden/waspNew/ext/.waspignore b/waspc/e2e-test/test-outputs/waspNew-golden/waspNew/src/.waspignore similarity index 100% rename from waspc/e2e-test/test-outputs/waspNew-golden/waspNew/ext/.waspignore rename to waspc/e2e-test/test-outputs/waspNew-golden/waspNew/src/.waspignore diff --git a/waspc/e2e-test/test-outputs/waspNew-golden/waspNew/ext/Main.css b/waspc/e2e-test/test-outputs/waspNew-golden/waspNew/src/client/Main.css similarity index 100% rename from waspc/e2e-test/test-outputs/waspNew-golden/waspNew/ext/Main.css rename to waspc/e2e-test/test-outputs/waspNew-golden/waspNew/src/client/Main.css diff --git a/waspc/e2e-test/test-outputs/waspNew-golden/waspNew/ext/MainPage.js b/waspc/e2e-test/test-outputs/waspNew-golden/waspNew/src/client/MainPage.js similarity index 100% rename from waspc/e2e-test/test-outputs/waspNew-golden/waspNew/ext/MainPage.js rename to waspc/e2e-test/test-outputs/waspNew-golden/waspNew/src/client/MainPage.js diff --git a/waspc/e2e-test/test-outputs/waspNew-golden/waspNew/ext/waspLogo.png b/waspc/e2e-test/test-outputs/waspNew-golden/waspNew/src/client/waspLogo.png similarity index 100% rename from waspc/e2e-test/test-outputs/waspNew-golden/waspNew/ext/waspLogo.png rename to waspc/e2e-test/test-outputs/waspNew-golden/waspNew/src/client/waspLogo.png From 1d4e0d8aceafab028f5b7466f34f6d4212dcb692 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Sodi=C4=87?= Date: Mon, 31 Oct 2022 12:08:03 +0100 Subject: [PATCH 17/35] Update e2e test outputs --- .../waspBuild/.wasp/build/.waspchecksums | 21 ----- .../.wasp/build/server/src/ext-src/Main.css | 81 ------------------ .../build/server/src/ext-src/MainPage.js | 41 --------- .../build/server/src/ext-src/waspLogo.png | Bin 24877 -> 0 bytes .../waspCompile/.wasp/out/.waspchecksums | 21 ----- .../.wasp/out/server/src/ext-src/Main.css | 81 ------------------ .../.wasp/out/server/src/ext-src/MainPage.js | 41 --------- .../.wasp/out/server/src/ext-src/waspLogo.png | Bin 24877 -> 0 bytes .../waspJob/.wasp/out/.waspchecksums | 28 ------ .../.wasp/out/server/src/ext-src/Main.css | 81 ------------------ .../.wasp/out/server/src/ext-src/MainPage.js | 41 --------- .../.wasp/out/server/src/ext-src/waspLogo.png | Bin 24877 -> 0 bytes .../.wasp/out/web-app/src/ext-src/jobs/bar.js | 4 - .../waspMigrate/.wasp/out/.waspchecksums | 21 ----- .../.wasp/out/server/src/ext-src/Main.css | 81 ------------------ .../.wasp/out/server/src/ext-src/MainPage.js | 41 --------- .../.wasp/out/server/src/ext-src/waspLogo.png | Bin 24877 -> 0 bytes 17 files changed, 583 deletions(-) delete mode 100644 waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/.wasp/build/server/src/ext-src/Main.css delete mode 100644 waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/.wasp/build/server/src/ext-src/MainPage.js delete mode 100644 waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/.wasp/build/server/src/ext-src/waspLogo.png delete mode 100644 waspc/e2e-test/test-outputs/waspCompile-golden/waspCompile/.wasp/out/server/src/ext-src/Main.css delete mode 100644 waspc/e2e-test/test-outputs/waspCompile-golden/waspCompile/.wasp/out/server/src/ext-src/MainPage.js delete mode 100644 waspc/e2e-test/test-outputs/waspCompile-golden/waspCompile/.wasp/out/server/src/ext-src/waspLogo.png delete mode 100644 waspc/e2e-test/test-outputs/waspJob-golden/waspJob/.wasp/out/server/src/ext-src/Main.css delete mode 100644 waspc/e2e-test/test-outputs/waspJob-golden/waspJob/.wasp/out/server/src/ext-src/MainPage.js delete mode 100644 waspc/e2e-test/test-outputs/waspJob-golden/waspJob/.wasp/out/server/src/ext-src/waspLogo.png delete mode 100644 waspc/e2e-test/test-outputs/waspJob-golden/waspJob/.wasp/out/web-app/src/ext-src/jobs/bar.js delete mode 100644 waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/.wasp/out/server/src/ext-src/Main.css delete mode 100644 waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/.wasp/out/server/src/ext-src/MainPage.js delete mode 100644 waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/.wasp/out/server/src/ext-src/waspLogo.png diff --git a/waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/.wasp/build/.waspchecksums b/waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/.wasp/build/.waspchecksums index ccd4f55cb9..07d4000443 100644 --- a/waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/.wasp/build/.waspchecksums +++ b/waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/.wasp/build/.waspchecksums @@ -83,27 +83,6 @@ ], "20c67ca197da3de2d37528ceaff2e40af910be8177f346c6d5c2b2f983810c43" ], - [ - [ - "file", - "server/src/ext-src/Main.css" - ], - "4c1268c55a99589564123ebe1ebbea76ac545b85f4d17eaea76e981db269dba7" - ], - [ - [ - "file", - "server/src/ext-src/MainPage.js" - ], - "c9ed9b5271f648715373095f43d60a2ab3e47f159c6dd6f3337ed22e5b73e80c" - ], - [ - [ - "file", - "server/src/ext-src/waspLogo.png" - ], - "0f05a89eb945d6d7326110e88776e402833b356202b06d0a8bf652e118d3fd2f" - ], [ [ "file", diff --git a/waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/.wasp/build/server/src/ext-src/Main.css b/waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/.wasp/build/server/src/ext-src/Main.css deleted file mode 100644 index bd0bd36b1b..0000000000 --- a/waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/.wasp/build/server/src/ext-src/Main.css +++ /dev/null @@ -1,81 +0,0 @@ -* { - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - box-sizing: border-box; -} - -.container { - min-height: 100vh; - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; -} - -main { - padding: 5rem 0; - flex: 1; - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; -} - -main p { - font-size: 1.2rem; -} - -.logo { - margin-bottom: 2rem; -} - -.logo img { - max-height: 200px; -} - -.welcome-title { - font-weight: 500; -} - -.welcome-subtitle { - font-weight: 400; - margin-bottom: 3rem; -} - -.buttons { - display: flex; - flex-direction: row; -} - -.buttons .button:not(:last-child) { - margin-right: 0.5rem; -} - -.button { - border-radius: 3px; - font-size: 1.2rem; - padding: 1rem 2rem; - text-align: center; - font-weight: 700; - text-decoration: none; -} - -.button-filled { - border: 2px solid #bf9900; - background-color: #bf9900; - color: #f4f4f4; -} - -.button-outline { - border: 2px solid #8a9cff; - color: #8a9cff; - background-color: none; -} - -code { - border-radius: 5px; - padding: 0.2rem; - background: #efefef; - font-family: Menlo, Monaco, Lucida Console, Liberation Mono, DejaVu Sans Mono, - Bitstream Vera Sans Mono, Courier New, monospace; -} diff --git a/waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/.wasp/build/server/src/ext-src/MainPage.js b/waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/.wasp/build/server/src/ext-src/MainPage.js deleted file mode 100644 index 529a4f2860..0000000000 --- a/waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/.wasp/build/server/src/ext-src/MainPage.js +++ /dev/null @@ -1,41 +0,0 @@ -import React from 'react' -import waspLogo from './waspLogo.png' -import './Main.css' - -const MainPage = () => { - return ( -
-
-
- wasp -
- -

Welcome to Wasp - you just started a new app!

-

- This is page MainPage located at route /. - Open ext/MainPage.js to edit it. -

- - -
-
- ) -} -export default MainPage diff --git a/waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/.wasp/build/server/src/ext-src/waspLogo.png b/waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/.wasp/build/server/src/ext-src/waspLogo.png deleted file mode 100644 index d39a9443a8153b158b76f51dda2e42f3b34a9169..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24877 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 { - return ( -
-
-
- wasp -
- -

Welcome to Wasp - you just started a new app!

-

- This is page MainPage located at route /. - Open ext/MainPage.js to edit it. -

- - -
-
- ) -} -export default MainPage diff --git a/waspc/e2e-test/test-outputs/waspCompile-golden/waspCompile/.wasp/out/server/src/ext-src/waspLogo.png b/waspc/e2e-test/test-outputs/waspCompile-golden/waspCompile/.wasp/out/server/src/ext-src/waspLogo.png deleted file mode 100644 index d39a9443a8153b158b76f51dda2e42f3b34a9169..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24877 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 { - return ( -
-
-
- wasp -
- -

Welcome to Wasp - you just started a new app!

-

- This is page MainPage located at route /. - Open ext/MainPage.js to edit it. -

- - -
-
- ) -} -export default MainPage diff --git a/waspc/e2e-test/test-outputs/waspJob-golden/waspJob/.wasp/out/server/src/ext-src/waspLogo.png b/waspc/e2e-test/test-outputs/waspJob-golden/waspJob/.wasp/out/server/src/ext-src/waspLogo.png deleted file mode 100644 index d39a9443a8153b158b76f51dda2e42f3b34a9169..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24877 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 { - return 1 - } - diff --git a/waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/.wasp/out/.waspchecksums b/waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/.wasp/out/.waspchecksums index 0fde03b3e9..49caaef6fe 100644 --- a/waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/.wasp/out/.waspchecksums +++ b/waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/.wasp/out/.waspchecksums @@ -83,27 +83,6 @@ ], "20c67ca197da3de2d37528ceaff2e40af910be8177f346c6d5c2b2f983810c43" ], - [ - [ - "file", - "server/src/ext-src/Main.css" - ], - "4c1268c55a99589564123ebe1ebbea76ac545b85f4d17eaea76e981db269dba7" - ], - [ - [ - "file", - "server/src/ext-src/MainPage.js" - ], - "c9ed9b5271f648715373095f43d60a2ab3e47f159c6dd6f3337ed22e5b73e80c" - ], - [ - [ - "file", - "server/src/ext-src/waspLogo.png" - ], - "0f05a89eb945d6d7326110e88776e402833b356202b06d0a8bf652e118d3fd2f" - ], [ [ "file", diff --git a/waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/.wasp/out/server/src/ext-src/Main.css b/waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/.wasp/out/server/src/ext-src/Main.css deleted file mode 100644 index bd0bd36b1b..0000000000 --- a/waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/.wasp/out/server/src/ext-src/Main.css +++ /dev/null @@ -1,81 +0,0 @@ -* { - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - box-sizing: border-box; -} - -.container { - min-height: 100vh; - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; -} - -main { - padding: 5rem 0; - flex: 1; - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; -} - -main p { - font-size: 1.2rem; -} - -.logo { - margin-bottom: 2rem; -} - -.logo img { - max-height: 200px; -} - -.welcome-title { - font-weight: 500; -} - -.welcome-subtitle { - font-weight: 400; - margin-bottom: 3rem; -} - -.buttons { - display: flex; - flex-direction: row; -} - -.buttons .button:not(:last-child) { - margin-right: 0.5rem; -} - -.button { - border-radius: 3px; - font-size: 1.2rem; - padding: 1rem 2rem; - text-align: center; - font-weight: 700; - text-decoration: none; -} - -.button-filled { - border: 2px solid #bf9900; - background-color: #bf9900; - color: #f4f4f4; -} - -.button-outline { - border: 2px solid #8a9cff; - color: #8a9cff; - background-color: none; -} - -code { - border-radius: 5px; - padding: 0.2rem; - background: #efefef; - font-family: Menlo, Monaco, Lucida Console, Liberation Mono, DejaVu Sans Mono, - Bitstream Vera Sans Mono, Courier New, monospace; -} diff --git a/waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/.wasp/out/server/src/ext-src/MainPage.js b/waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/.wasp/out/server/src/ext-src/MainPage.js deleted file mode 100644 index 529a4f2860..0000000000 --- a/waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/.wasp/out/server/src/ext-src/MainPage.js +++ /dev/null @@ -1,41 +0,0 @@ -import React from 'react' -import waspLogo from './waspLogo.png' -import './Main.css' - -const MainPage = () => { - return ( -
-
-
- wasp -
- -

Welcome to Wasp - you just started a new app!

-

- This is page MainPage located at route /. - Open ext/MainPage.js to edit it. -

- - -
-
- ) -} -export default MainPage diff --git a/waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/.wasp/out/server/src/ext-src/waspLogo.png b/waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/.wasp/out/server/src/ext-src/waspLogo.png deleted file mode 100644 index d39a9443a8153b158b76f51dda2e42f3b34a9169..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24877 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 Date: Mon, 31 Oct 2022 13:43:41 +0100 Subject: [PATCH 18/35] Fix formatting --- .../cli/src/Wasp/Cli/Command/CreateNewProject.hs | 16 ++++++++-------- waspc/src/Wasp/Generator/ServerGenerator.hs | 8 ++++---- .../src/Wasp/Generator/ServerGenerator/AuthG.hs | 10 +++++----- .../ServerGenerator/ExternalCodeGenerator.hs | 2 +- waspc/src/Wasp/Generator/WebAppGenerator.hs | 8 ++++---- .../WebAppGenerator/ExternalCodeGenerator.hs | 4 ++-- 6 files changed, 24 insertions(+), 24 deletions(-) diff --git a/waspc/cli/src/Wasp/Cli/Command/CreateNewProject.hs b/waspc/cli/src/Wasp/Cli/Command/CreateNewProject.hs index 752216b8cc..1696ea6999 100644 --- a/waspc/cli/src/Wasp/Cli/Command/CreateNewProject.hs +++ b/waspc/cli/src/Wasp/Cli/Command/CreateNewProject.hs @@ -48,14 +48,14 @@ parseProjectInfo :: String -> Command ProjectInfo parseProjectInfo name | isValidWaspIdentifier appName = return $ ProjectInfo name appName | otherwise = - throwProjectCreationError $ - intercalate - "\n" - [ "The project's name is not in the valid format!", - indent 2 "- It can start with a letter or an underscore.", - indent 2 "- It can contain only letters, numbers, dashes, or underscores.", - indent 2 "- It can't be a Wasp keyword." - ] + throwProjectCreationError $ + intercalate + "\n" + [ "The project's name is not in the valid format!", + indent 2 "- It can start with a letter or an underscore.", + indent 2 "- It can contain only letters, numbers, dashes, or underscores.", + indent 2 "- It can't be a Wasp keyword." + ] where appName = kebabToCamelCase name diff --git a/waspc/src/Wasp/Generator/ServerGenerator.hs b/waspc/src/Wasp/Generator/ServerGenerator.hs index f4e05b4888..40f242d7e2 100644 --- a/waspc/src/Wasp/Generator/ServerGenerator.hs +++ b/waspc/src/Wasp/Generator/ServerGenerator.hs @@ -74,10 +74,10 @@ genDotEnv spec = return $ case AS.dotEnvServerFile spec of Just srcFilePath | not $ AS.isBuild spec -> - [ createCopyFileDraft - (C.serverRootDirInProjectRootDir dotEnvInServerRootDir) - srcFilePath - ] + [ createCopyFileDraft + (C.serverRootDirInProjectRootDir dotEnvInServerRootDir) + srcFilePath + ] _ -> [] dotEnvInServerRootDir :: Path' (Rel C.ServerRootDir) File' diff --git a/waspc/src/Wasp/Generator/ServerGenerator/AuthG.hs b/waspc/src/Wasp/Generator/ServerGenerator/AuthG.hs index 20251f5805..e83040820b 100644 --- a/waspc/src/Wasp/Generator/ServerGenerator/AuthG.hs +++ b/waspc/src/Wasp/Generator/ServerGenerator/AuthG.hs @@ -175,11 +175,11 @@ genUtilsJs auth = return $ C.mkTmplFdWithDstAndData tmplFile dstFile (Just tmplD genGoogleAuth :: AS.Auth.Auth -> Generator [FileDraft] genGoogleAuth auth | AS.Auth.isGoogleAuthEnabled auth = - sequence - [ copyTmplFile [relfile|routes/auth/passport/google/google.js|], - copyTmplFile [relfile|routes/auth/passport/google/googleDefaults.js|], - genGoogleConfigJs auth - ] + sequence + [ copyTmplFile [relfile|routes/auth/passport/google/google.js|], + copyTmplFile [relfile|routes/auth/passport/google/googleDefaults.js|], + genGoogleConfigJs auth + ] | otherwise = return [] where copyTmplFile = return . C.mkSrcTmplFd diff --git a/waspc/src/Wasp/Generator/ServerGenerator/ExternalCodeGenerator.hs b/waspc/src/Wasp/Generator/ServerGenerator/ExternalCodeGenerator.hs index 58b038f350..a146410b2b 100644 --- a/waspc/src/Wasp/Generator/ServerGenerator/ExternalCodeGenerator.hs +++ b/waspc/src/Wasp/Generator/ServerGenerator/ExternalCodeGenerator.hs @@ -35,4 +35,4 @@ mkExtCodeGeneratorStrategy extCodeDirInServerSrcDir = C.serverRootDirInProjectRootDir C.serverSrcDirInServerRootDir extCodeDirInServerSrcDir - } \ No newline at end of file + } diff --git a/waspc/src/Wasp/Generator/WebAppGenerator.hs b/waspc/src/Wasp/Generator/WebAppGenerator.hs index ae0bb7d352..f546e92e50 100644 --- a/waspc/src/Wasp/Generator/WebAppGenerator.hs +++ b/waspc/src/Wasp/Generator/WebAppGenerator.hs @@ -59,10 +59,10 @@ genDotEnv spec = return $ case AS.dotEnvClientFile spec of Just srcFilePath | not $ AS.isBuild spec -> - [ createCopyFileDraft - (C.webAppRootDirInProjectRootDir dotEnvInWebAppRootDir) - srcFilePath - ] + [ createCopyFileDraft + (C.webAppRootDirInProjectRootDir dotEnvInWebAppRootDir) + srcFilePath + ] _ -> [] dotEnvInWebAppRootDir :: Path' (Rel C.WebAppRootDir) File' diff --git a/waspc/src/Wasp/Generator/WebAppGenerator/ExternalCodeGenerator.hs b/waspc/src/Wasp/Generator/WebAppGenerator/ExternalCodeGenerator.hs index d1d2441325..f23ef787c2 100644 --- a/waspc/src/Wasp/Generator/WebAppGenerator/ExternalCodeGenerator.hs +++ b/waspc/src/Wasp/Generator/WebAppGenerator/ExternalCodeGenerator.hs @@ -1,7 +1,7 @@ module Wasp.Generator.WebAppGenerator.ExternalCodeGenerator ( extClientCodeGeneratorStrategy, extSharedCodeGeneratorStrategy, - extClientCodeDirInWebAppSrcDir + extClientCodeDirInWebAppSrcDir, ) where @@ -35,4 +35,4 @@ mkExtCodeGeneratorStrategy extCodeDirInWebAppSrcDir = C.webAppRootDirInProjectRootDir C.webAppSrcDirInWebAppRootDir extCodeDirInWebAppSrcDir - } \ No newline at end of file + } From 281c3cf7b42acf438863f642845ba5bf112e0e27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Sodi=C4=87?= Date: Mon, 31 Oct 2022 13:47:04 +0100 Subject: [PATCH 19/35] Fix bug in compile function MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Martin Šošić --- waspc/src/Wasp/Lib.hs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/waspc/src/Wasp/Lib.hs b/waspc/src/Wasp/Lib.hs index cec54798b6..ec9adb3dc5 100644 --- a/waspc/src/Wasp/Lib.hs +++ b/waspc/src/Wasp/Lib.hs @@ -45,12 +45,12 @@ compile :: CompileOptions -> IO ([CompileWarning], [CompileError]) compile waspDir outDir options = do - compileWarnings <- maybeToList <$> warnIfDotEnvPresent waspDir - appSpecOrCompileErrors <- analyzeProject waspDir options - compileWarningsAndErrors <- case appSpecOrCompileErrors of - Left analyzerErrors -> return (compileWarnings, analyzerErrors) - Right appSpec -> generateCode appSpec outDir options - return $ (compileWarnings, []) <> compileWarningsAndErrors + compileWarningsAndErrors <- + analyzeProject waspDir options >>= \case + Left analyzerErrors -> return ([], analyzerErrors) + Right appSpec -> generateCode appSpec outDir options + dotEnvWarnings <- maybeToList <$> warnIfDotEnvPresent waspDir + return $ (dotEnvWarnings, []) <> compileWarningsAndErrors analyzeProject :: Path' Abs (Dir WaspProjectDir) -> From a64832ca6f350172427cf410d28d62f604e61c8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Sodi=C4=87?= Date: Mon, 31 Oct 2022 13:52:11 +0100 Subject: [PATCH 20/35] Change map to fmap in compile function --- waspc/src/Wasp/Lib.hs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/waspc/src/Wasp/Lib.hs b/waspc/src/Wasp/Lib.hs index ec9adb3dc5..d1af0be321 100644 --- a/waspc/src/Wasp/Lib.hs +++ b/waspc/src/Wasp/Lib.hs @@ -69,7 +69,7 @@ generateCode :: generateCode appSpec outDir options = do (generatorWarnings, generatorErrors) <- Generator.writeWebAppCode appSpec outDir (sendMessage options) let filteredWarnings = generatorWarningsFilter options generatorWarnings - return (map show filteredWarnings, map show generatorErrors) + return (show <$> filteredWarnings, show <$> generatorErrors) -- | Checks the wasp directory for potential problems, and issues warnings if any are found. warnIfDotEnvPresent :: Path' Abs (Dir WaspProjectDir) -> IO (Maybe CompileWarning) From b30e3ded23a88f8c0732668cd22042aaaa82df29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Sodi=C4=87?= Date: Mon, 31 Oct 2022 13:54:13 +0100 Subject: [PATCH 21/35] Fix formatting --- waspc/src/Wasp/Lib.hs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/waspc/src/Wasp/Lib.hs b/waspc/src/Wasp/Lib.hs index d1af0be321..f880148608 100644 --- a/waspc/src/Wasp/Lib.hs +++ b/waspc/src/Wasp/Lib.hs @@ -46,7 +46,7 @@ compile :: IO ([CompileWarning], [CompileError]) compile waspDir outDir options = do compileWarningsAndErrors <- - analyzeProject waspDir options >>= \case + analyzeProject waspDir options >>= \case Left analyzerErrors -> return ([], analyzerErrors) Right appSpec -> generateCode appSpec outDir options dotEnvWarnings <- maybeToList <$> warnIfDotEnvPresent waspDir From f40a8ce44518915ab7f6c0b8c70d6967ea958e1c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Sodi=C4=87?= Date: Mon, 31 Oct 2022 14:26:28 +0100 Subject: [PATCH 22/35] Force git to include empty directories --- waspc/data/Cli/templates/new/src/client/.gitkeep | 2 ++ waspc/data/Cli/templates/new/src/server/.gitkeep | 2 ++ waspc/data/Cli/templates/new/src/shared/.gitkeep | 2 ++ 3 files changed, 6 insertions(+) create mode 100644 waspc/data/Cli/templates/new/src/client/.gitkeep create mode 100644 waspc/data/Cli/templates/new/src/server/.gitkeep create mode 100644 waspc/data/Cli/templates/new/src/shared/.gitkeep diff --git a/waspc/data/Cli/templates/new/src/client/.gitkeep b/waspc/data/Cli/templates/new/src/client/.gitkeep new file mode 100644 index 0000000000..5a5f457cef --- /dev/null +++ b/waspc/data/Cli/templates/new/src/client/.gitkeep @@ -0,0 +1,2 @@ +This file forces Git to commit an empty directory. + diff --git a/waspc/data/Cli/templates/new/src/server/.gitkeep b/waspc/data/Cli/templates/new/src/server/.gitkeep new file mode 100644 index 0000000000..5a5f457cef --- /dev/null +++ b/waspc/data/Cli/templates/new/src/server/.gitkeep @@ -0,0 +1,2 @@ +This file forces Git to commit an empty directory. + diff --git a/waspc/data/Cli/templates/new/src/shared/.gitkeep b/waspc/data/Cli/templates/new/src/shared/.gitkeep new file mode 100644 index 0000000000..5a5f457cef --- /dev/null +++ b/waspc/data/Cli/templates/new/src/shared/.gitkeep @@ -0,0 +1,2 @@ +This file forces Git to commit an empty directory. + From ddc8682c8c4299f8131ec6734b35c9ced1edcfc4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Sodi=C4=87?= Date: Mon, 31 Oct 2022 14:30:57 +0100 Subject: [PATCH 23/35] Remove extra empty line from .gitkeep files --- waspc/data/Cli/templates/new/src/client/.gitkeep | 1 - waspc/data/Cli/templates/new/src/server/.gitkeep | 1 - waspc/data/Cli/templates/new/src/shared/.gitkeep | 1 - 3 files changed, 3 deletions(-) diff --git a/waspc/data/Cli/templates/new/src/client/.gitkeep b/waspc/data/Cli/templates/new/src/client/.gitkeep index 5a5f457cef..878bca16e5 100644 --- a/waspc/data/Cli/templates/new/src/client/.gitkeep +++ b/waspc/data/Cli/templates/new/src/client/.gitkeep @@ -1,2 +1 @@ This file forces Git to commit an empty directory. - diff --git a/waspc/data/Cli/templates/new/src/server/.gitkeep b/waspc/data/Cli/templates/new/src/server/.gitkeep index 5a5f457cef..878bca16e5 100644 --- a/waspc/data/Cli/templates/new/src/server/.gitkeep +++ b/waspc/data/Cli/templates/new/src/server/.gitkeep @@ -1,2 +1 @@ This file forces Git to commit an empty directory. - diff --git a/waspc/data/Cli/templates/new/src/shared/.gitkeep b/waspc/data/Cli/templates/new/src/shared/.gitkeep index 5a5f457cef..878bca16e5 100644 --- a/waspc/data/Cli/templates/new/src/shared/.gitkeep +++ b/waspc/data/Cli/templates/new/src/shared/.gitkeep @@ -1,2 +1 @@ This file forces Git to commit an empty directory. - From eb29d50a4f339cb769e9a1a62f79c73f46600069 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Sodi=C4=87?= Date: Mon, 31 Oct 2022 14:48:40 +0100 Subject: [PATCH 24/35] Watch shared directory for changes --- waspc/cli/src/Wasp/Cli/Command/Watch.hs | 1 + 1 file changed, 1 insertion(+) diff --git a/waspc/cli/src/Wasp/Cli/Command/Watch.hs b/waspc/cli/src/Wasp/Cli/Command/Watch.hs index 37c45fdde8..f2a4504098 100644 --- a/waspc/cli/src/Wasp/Cli/Command/Watch.hs +++ b/waspc/cli/src/Wasp/Cli/Command/Watch.hs @@ -41,6 +41,7 @@ watch waspProjectDir outDir = FSN.withManager $ \mgr -> do _ <- FSN.watchDirChan mgr (SP.fromAbsDir waspProjectDir) eventFilter chan _ <- FSN.watchTreeChan mgr (SP.fromAbsDir $ waspProjectDir Common.extClientCodeDirInWaspProjectDir) eventFilter chan _ <- FSN.watchTreeChan mgr (SP.fromAbsDir $ waspProjectDir Common.extServerCodeDirInWaspProjectDir) eventFilter chan + _ <- FSN.watchTreeChan mgr (SP.fromAbsDir $ waspProjectDir Common.extSharedCodeDirInWaspProjectDir) eventFilter chan listenForEvents chan currentTime where listenForEvents :: Chan FSN.Event -> UTCTime -> IO () From 9fa7e9a05ef1162c5453b08ffe4cd306bc3006d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Sodi=C4=87?= Date: Mon, 31 Oct 2022 14:59:08 +0100 Subject: [PATCH 25/35] Fix regular and e2e tests --- .../waspBuild-golden/files.manifest | 7 +++++ .../waspBuild/.wasp/build/.waspchecksums | 28 +++++++++++++++++++ .../.wasp/build/server/src/ext-src/.gitkeep | 1 + .../.wasp/build/server/src/shared/.gitkeep | 1 + .../.wasp/build/web-app/src/ext-src/.gitkeep | 1 + .../.wasp/build/web-app/src/shared/.gitkeep | 1 + .../waspBuild/src/client/.gitkeep | 1 + .../waspBuild/src/server/.gitkeep | 1 + .../waspBuild/src/shared/.gitkeep | 1 + .../waspCompile-golden/files.manifest | 7 +++++ .../waspCompile/.wasp/out/.waspchecksums | 28 +++++++++++++++++++ .../.wasp/out/server/src/ext-src/.gitkeep | 1 + .../.wasp/out/server/src/shared/.gitkeep | 1 + .../.wasp/out/web-app/src/ext-src/.gitkeep | 1 + .../.wasp/out/web-app/src/shared/.gitkeep | 1 + .../waspCompile/src/client/.gitkeep | 1 + .../waspCompile/src/server/.gitkeep | 1 + .../waspCompile/src/shared/.gitkeep | 1 + .../waspJob-golden/files.manifest | 7 +++++ .../waspJob/.wasp/out/.waspchecksums | 28 +++++++++++++++++++ .../.wasp/out/server/src/ext-src/.gitkeep | 1 + .../.wasp/out/server/src/shared/.gitkeep | 1 + .../.wasp/out/web-app/src/ext-src/.gitkeep | 1 + .../.wasp/out/web-app/src/shared/.gitkeep | 1 + .../waspJob/src/client/.gitkeep | 1 + .../waspJob/src/server/.gitkeep | 1 + .../waspJob/src/shared/.gitkeep | 1 + .../waspMigrate-golden/files.manifest | 7 +++++ .../waspMigrate/.wasp/out/.waspchecksums | 28 +++++++++++++++++++ .../.wasp/out/server/src/ext-src/.gitkeep | 1 + .../.wasp/out/server/src/shared/.gitkeep | 1 + .../.wasp/out/web-app/src/ext-src/.gitkeep | 1 + .../.wasp/out/web-app/src/shared/.gitkeep | 1 + .../waspMigrate/src/client/.gitkeep | 1 + .../waspMigrate/src/server/.gitkeep | 1 + .../waspMigrate/src/shared/.gitkeep | 1 + .../waspNew-golden/files.manifest | 3 ++ .../waspNew/src/client/.gitkeep | 1 + .../waspNew/src/server/.gitkeep | 1 + .../waspNew/src/shared/.gitkeep | 1 + waspc/test/Generator/WebAppGeneratorTest.hs | 1 + 41 files changed, 175 insertions(+) create mode 100644 waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/.wasp/build/server/src/ext-src/.gitkeep create mode 100644 waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/.wasp/build/server/src/shared/.gitkeep create mode 100644 waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/.wasp/build/web-app/src/ext-src/.gitkeep create mode 100644 waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/.wasp/build/web-app/src/shared/.gitkeep create mode 100644 waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/src/client/.gitkeep create mode 100644 waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/src/server/.gitkeep create mode 100644 waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/src/shared/.gitkeep create mode 100644 waspc/e2e-test/test-outputs/waspCompile-golden/waspCompile/.wasp/out/server/src/ext-src/.gitkeep create mode 100644 waspc/e2e-test/test-outputs/waspCompile-golden/waspCompile/.wasp/out/server/src/shared/.gitkeep create mode 100644 waspc/e2e-test/test-outputs/waspCompile-golden/waspCompile/.wasp/out/web-app/src/ext-src/.gitkeep create mode 100644 waspc/e2e-test/test-outputs/waspCompile-golden/waspCompile/.wasp/out/web-app/src/shared/.gitkeep create mode 100644 waspc/e2e-test/test-outputs/waspCompile-golden/waspCompile/src/client/.gitkeep create mode 100644 waspc/e2e-test/test-outputs/waspCompile-golden/waspCompile/src/server/.gitkeep create mode 100644 waspc/e2e-test/test-outputs/waspCompile-golden/waspCompile/src/shared/.gitkeep create mode 100644 waspc/e2e-test/test-outputs/waspJob-golden/waspJob/.wasp/out/server/src/ext-src/.gitkeep create mode 100644 waspc/e2e-test/test-outputs/waspJob-golden/waspJob/.wasp/out/server/src/shared/.gitkeep create mode 100644 waspc/e2e-test/test-outputs/waspJob-golden/waspJob/.wasp/out/web-app/src/ext-src/.gitkeep create mode 100644 waspc/e2e-test/test-outputs/waspJob-golden/waspJob/.wasp/out/web-app/src/shared/.gitkeep create mode 100644 waspc/e2e-test/test-outputs/waspJob-golden/waspJob/src/client/.gitkeep create mode 100644 waspc/e2e-test/test-outputs/waspJob-golden/waspJob/src/server/.gitkeep create mode 100644 waspc/e2e-test/test-outputs/waspJob-golden/waspJob/src/shared/.gitkeep create mode 100644 waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/.wasp/out/server/src/ext-src/.gitkeep create mode 100644 waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/.wasp/out/server/src/shared/.gitkeep create mode 100644 waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/.wasp/out/web-app/src/ext-src/.gitkeep create mode 100644 waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/.wasp/out/web-app/src/shared/.gitkeep create mode 100644 waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/src/client/.gitkeep create mode 100644 waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/src/server/.gitkeep create mode 100644 waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/src/shared/.gitkeep create mode 100644 waspc/e2e-test/test-outputs/waspNew-golden/waspNew/src/client/.gitkeep create mode 100644 waspc/e2e-test/test-outputs/waspNew-golden/waspNew/src/server/.gitkeep create mode 100644 waspc/e2e-test/test-outputs/waspNew-golden/waspNew/src/shared/.gitkeep diff --git a/waspc/e2e-test/test-outputs/waspBuild-golden/files.manifest b/waspc/e2e-test/test-outputs/waspBuild-golden/files.manifest index a5ba6207c4..519e8f0a9a 100644 --- a/waspc/e2e-test/test-outputs/waspBuild-golden/files.manifest +++ b/waspc/e2e-test/test-outputs/waspBuild-golden/files.manifest @@ -11,6 +11,7 @@ waspBuild/.wasp/build/server/src/config.js waspBuild/.wasp/build/server/src/core/AuthError.js waspBuild/.wasp/build/server/src/core/HttpError.js waspBuild/.wasp/build/server/src/dbClient.js +waspBuild/.wasp/build/server/src/ext-src/.gitkeep waspBuild/.wasp/build/server/src/jobs/core/Job.js waspBuild/.wasp/build/server/src/jobs/core/SubmittedJob.js waspBuild/.wasp/build/server/src/jobs/core/allJobs.js @@ -20,6 +21,7 @@ waspBuild/.wasp/build/server/src/jobs/core/simpleJob.js waspBuild/.wasp/build/server/src/routes/index.js waspBuild/.wasp/build/server/src/routes/operations/index.js waspBuild/.wasp/build/server/src/server.js +waspBuild/.wasp/build/server/src/shared/.gitkeep waspBuild/.wasp/build/server/src/utils.js waspBuild/.wasp/build/web-app/.npmrc waspBuild/.wasp/build/web-app/README.md @@ -32,6 +34,7 @@ waspBuild/.wasp/build/web-app/src/actions/core.js waspBuild/.wasp/build/web-app/src/actions/index.js waspBuild/.wasp/build/web-app/src/api.js waspBuild/.wasp/build/web-app/src/config.js +waspBuild/.wasp/build/web-app/src/ext-src/.gitkeep waspBuild/.wasp/build/web-app/src/ext-src/Main.css waspBuild/.wasp/build/web-app/src/ext-src/MainPage.js waspBuild/.wasp/build/web-app/src/ext-src/waspLogo.png @@ -46,10 +49,14 @@ waspBuild/.wasp/build/web-app/src/queries/index.js waspBuild/.wasp/build/web-app/src/queryClient.js waspBuild/.wasp/build/web-app/src/router.js waspBuild/.wasp/build/web-app/src/serviceWorker.js +waspBuild/.wasp/build/web-app/src/shared/.gitkeep waspBuild/.wasp/build/web-app/src/utils.js waspBuild/.wasproot waspBuild/main.wasp waspBuild/src/.waspignore +waspBuild/src/client/.gitkeep waspBuild/src/client/Main.css waspBuild/src/client/MainPage.js waspBuild/src/client/waspLogo.png +waspBuild/src/server/.gitkeep +waspBuild/src/shared/.gitkeep diff --git a/waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/.wasp/build/.waspchecksums b/waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/.wasp/build/.waspchecksums index 07d4000443..b821e4b01d 100644 --- a/waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/.wasp/build/.waspchecksums +++ b/waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/.wasp/build/.waspchecksums @@ -83,6 +83,13 @@ ], "20c67ca197da3de2d37528ceaff2e40af910be8177f346c6d5c2b2f983810c43" ], + [ + [ + "file", + "server/src/ext-src/.gitkeep" + ], + "3c93961ee5013ddc0149b57c9eb7b469aea5f3cb197429bded0d20498a267b06" + ], [ [ "file", @@ -146,6 +153,13 @@ ], "3ee2212932180883fabe36bc22e18e2167a63cdbca8bde2dd595419ae2a34e95" ], + [ + [ + "file", + "server/src/shared/.gitkeep" + ], + "3c93961ee5013ddc0149b57c9eb7b469aea5f3cb197429bded0d20498a267b06" + ], [ [ "file", @@ -237,6 +251,13 @@ ], "a30d5ae7c1b317a7132cac93f4b5bffc3daf11f4f07b5e0d977d063810ffdd11" ], + [ + [ + "file", + "web-app/src/ext-src/.gitkeep" + ], + "3c93961ee5013ddc0149b57c9eb7b469aea5f3cb197429bded0d20498a267b06" + ], [ [ "file", @@ -335,6 +356,13 @@ ], "0b097cb6e2c83821630a33de933893bf75de49731b18ce3c25fc5384866fbac0" ], + [ + [ + "file", + "web-app/src/shared/.gitkeep" + ], + "3c93961ee5013ddc0149b57c9eb7b469aea5f3cb197429bded0d20498a267b06" + ], [ [ "file", diff --git a/waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/.wasp/build/server/src/ext-src/.gitkeep b/waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/.wasp/build/server/src/ext-src/.gitkeep new file mode 100644 index 0000000000..878bca16e5 --- /dev/null +++ b/waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/.wasp/build/server/src/ext-src/.gitkeep @@ -0,0 +1 @@ +This file forces Git to commit an empty directory. diff --git a/waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/.wasp/build/server/src/shared/.gitkeep b/waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/.wasp/build/server/src/shared/.gitkeep new file mode 100644 index 0000000000..878bca16e5 --- /dev/null +++ b/waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/.wasp/build/server/src/shared/.gitkeep @@ -0,0 +1 @@ +This file forces Git to commit an empty directory. diff --git a/waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/.wasp/build/web-app/src/ext-src/.gitkeep b/waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/.wasp/build/web-app/src/ext-src/.gitkeep new file mode 100644 index 0000000000..878bca16e5 --- /dev/null +++ b/waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/.wasp/build/web-app/src/ext-src/.gitkeep @@ -0,0 +1 @@ +This file forces Git to commit an empty directory. diff --git a/waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/.wasp/build/web-app/src/shared/.gitkeep b/waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/.wasp/build/web-app/src/shared/.gitkeep new file mode 100644 index 0000000000..878bca16e5 --- /dev/null +++ b/waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/.wasp/build/web-app/src/shared/.gitkeep @@ -0,0 +1 @@ +This file forces Git to commit an empty directory. diff --git a/waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/src/client/.gitkeep b/waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/src/client/.gitkeep new file mode 100644 index 0000000000..878bca16e5 --- /dev/null +++ b/waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/src/client/.gitkeep @@ -0,0 +1 @@ +This file forces Git to commit an empty directory. diff --git a/waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/src/server/.gitkeep b/waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/src/server/.gitkeep new file mode 100644 index 0000000000..878bca16e5 --- /dev/null +++ b/waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/src/server/.gitkeep @@ -0,0 +1 @@ +This file forces Git to commit an empty directory. diff --git a/waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/src/shared/.gitkeep b/waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/src/shared/.gitkeep new file mode 100644 index 0000000000..878bca16e5 --- /dev/null +++ b/waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/src/shared/.gitkeep @@ -0,0 +1 @@ +This file forces Git to commit an empty directory. diff --git a/waspc/e2e-test/test-outputs/waspCompile-golden/files.manifest b/waspc/e2e-test/test-outputs/waspCompile-golden/files.manifest index 5294497adf..b692e909f8 100644 --- a/waspc/e2e-test/test-outputs/waspCompile-golden/files.manifest +++ b/waspc/e2e-test/test-outputs/waspCompile-golden/files.manifest @@ -11,6 +11,7 @@ waspCompile/.wasp/out/server/src/config.js waspCompile/.wasp/out/server/src/core/AuthError.js waspCompile/.wasp/out/server/src/core/HttpError.js waspCompile/.wasp/out/server/src/dbClient.js +waspCompile/.wasp/out/server/src/ext-src/.gitkeep waspCompile/.wasp/out/server/src/jobs/core/Job.js waspCompile/.wasp/out/server/src/jobs/core/SubmittedJob.js waspCompile/.wasp/out/server/src/jobs/core/allJobs.js @@ -20,6 +21,7 @@ waspCompile/.wasp/out/server/src/jobs/core/simpleJob.js waspCompile/.wasp/out/server/src/routes/index.js waspCompile/.wasp/out/server/src/routes/operations/index.js waspCompile/.wasp/out/server/src/server.js +waspCompile/.wasp/out/server/src/shared/.gitkeep waspCompile/.wasp/out/server/src/utils.js waspCompile/.wasp/out/web-app/.npmrc waspCompile/.wasp/out/web-app/README.md @@ -32,6 +34,7 @@ waspCompile/.wasp/out/web-app/src/actions/core.js waspCompile/.wasp/out/web-app/src/actions/index.js waspCompile/.wasp/out/web-app/src/api.js waspCompile/.wasp/out/web-app/src/config.js +waspCompile/.wasp/out/web-app/src/ext-src/.gitkeep waspCompile/.wasp/out/web-app/src/ext-src/Main.css waspCompile/.wasp/out/web-app/src/ext-src/MainPage.js waspCompile/.wasp/out/web-app/src/ext-src/waspLogo.png @@ -46,10 +49,14 @@ waspCompile/.wasp/out/web-app/src/queries/index.js waspCompile/.wasp/out/web-app/src/queryClient.js waspCompile/.wasp/out/web-app/src/router.js waspCompile/.wasp/out/web-app/src/serviceWorker.js +waspCompile/.wasp/out/web-app/src/shared/.gitkeep waspCompile/.wasp/out/web-app/src/utils.js waspCompile/.wasproot waspCompile/main.wasp waspCompile/src/.waspignore +waspCompile/src/client/.gitkeep waspCompile/src/client/Main.css waspCompile/src/client/MainPage.js waspCompile/src/client/waspLogo.png +waspCompile/src/server/.gitkeep +waspCompile/src/shared/.gitkeep diff --git a/waspc/e2e-test/test-outputs/waspCompile-golden/waspCompile/.wasp/out/.waspchecksums b/waspc/e2e-test/test-outputs/waspCompile-golden/waspCompile/.wasp/out/.waspchecksums index 494e423a8a..2e899d885a 100644 --- a/waspc/e2e-test/test-outputs/waspCompile-golden/waspCompile/.wasp/out/.waspchecksums +++ b/waspc/e2e-test/test-outputs/waspCompile-golden/waspCompile/.wasp/out/.waspchecksums @@ -83,6 +83,13 @@ ], "20c67ca197da3de2d37528ceaff2e40af910be8177f346c6d5c2b2f983810c43" ], + [ + [ + "file", + "server/src/ext-src/.gitkeep" + ], + "3c93961ee5013ddc0149b57c9eb7b469aea5f3cb197429bded0d20498a267b06" + ], [ [ "file", @@ -146,6 +153,13 @@ ], "3ee2212932180883fabe36bc22e18e2167a63cdbca8bde2dd595419ae2a34e95" ], + [ + [ + "file", + "server/src/shared/.gitkeep" + ], + "3c93961ee5013ddc0149b57c9eb7b469aea5f3cb197429bded0d20498a267b06" + ], [ [ "file", @@ -237,6 +251,13 @@ ], "a30d5ae7c1b317a7132cac93f4b5bffc3daf11f4f07b5e0d977d063810ffdd11" ], + [ + [ + "file", + "web-app/src/ext-src/.gitkeep" + ], + "3c93961ee5013ddc0149b57c9eb7b469aea5f3cb197429bded0d20498a267b06" + ], [ [ "file", @@ -335,6 +356,13 @@ ], "0b097cb6e2c83821630a33de933893bf75de49731b18ce3c25fc5384866fbac0" ], + [ + [ + "file", + "web-app/src/shared/.gitkeep" + ], + "3c93961ee5013ddc0149b57c9eb7b469aea5f3cb197429bded0d20498a267b06" + ], [ [ "file", diff --git a/waspc/e2e-test/test-outputs/waspCompile-golden/waspCompile/.wasp/out/server/src/ext-src/.gitkeep b/waspc/e2e-test/test-outputs/waspCompile-golden/waspCompile/.wasp/out/server/src/ext-src/.gitkeep new file mode 100644 index 0000000000..878bca16e5 --- /dev/null +++ b/waspc/e2e-test/test-outputs/waspCompile-golden/waspCompile/.wasp/out/server/src/ext-src/.gitkeep @@ -0,0 +1 @@ +This file forces Git to commit an empty directory. diff --git a/waspc/e2e-test/test-outputs/waspCompile-golden/waspCompile/.wasp/out/server/src/shared/.gitkeep b/waspc/e2e-test/test-outputs/waspCompile-golden/waspCompile/.wasp/out/server/src/shared/.gitkeep new file mode 100644 index 0000000000..878bca16e5 --- /dev/null +++ b/waspc/e2e-test/test-outputs/waspCompile-golden/waspCompile/.wasp/out/server/src/shared/.gitkeep @@ -0,0 +1 @@ +This file forces Git to commit an empty directory. diff --git a/waspc/e2e-test/test-outputs/waspCompile-golden/waspCompile/.wasp/out/web-app/src/ext-src/.gitkeep b/waspc/e2e-test/test-outputs/waspCompile-golden/waspCompile/.wasp/out/web-app/src/ext-src/.gitkeep new file mode 100644 index 0000000000..878bca16e5 --- /dev/null +++ b/waspc/e2e-test/test-outputs/waspCompile-golden/waspCompile/.wasp/out/web-app/src/ext-src/.gitkeep @@ -0,0 +1 @@ +This file forces Git to commit an empty directory. diff --git a/waspc/e2e-test/test-outputs/waspCompile-golden/waspCompile/.wasp/out/web-app/src/shared/.gitkeep b/waspc/e2e-test/test-outputs/waspCompile-golden/waspCompile/.wasp/out/web-app/src/shared/.gitkeep new file mode 100644 index 0000000000..878bca16e5 --- /dev/null +++ b/waspc/e2e-test/test-outputs/waspCompile-golden/waspCompile/.wasp/out/web-app/src/shared/.gitkeep @@ -0,0 +1 @@ +This file forces Git to commit an empty directory. diff --git a/waspc/e2e-test/test-outputs/waspCompile-golden/waspCompile/src/client/.gitkeep b/waspc/e2e-test/test-outputs/waspCompile-golden/waspCompile/src/client/.gitkeep new file mode 100644 index 0000000000..878bca16e5 --- /dev/null +++ b/waspc/e2e-test/test-outputs/waspCompile-golden/waspCompile/src/client/.gitkeep @@ -0,0 +1 @@ +This file forces Git to commit an empty directory. diff --git a/waspc/e2e-test/test-outputs/waspCompile-golden/waspCompile/src/server/.gitkeep b/waspc/e2e-test/test-outputs/waspCompile-golden/waspCompile/src/server/.gitkeep new file mode 100644 index 0000000000..878bca16e5 --- /dev/null +++ b/waspc/e2e-test/test-outputs/waspCompile-golden/waspCompile/src/server/.gitkeep @@ -0,0 +1 @@ +This file forces Git to commit an empty directory. diff --git a/waspc/e2e-test/test-outputs/waspCompile-golden/waspCompile/src/shared/.gitkeep b/waspc/e2e-test/test-outputs/waspCompile-golden/waspCompile/src/shared/.gitkeep new file mode 100644 index 0000000000..878bca16e5 --- /dev/null +++ b/waspc/e2e-test/test-outputs/waspCompile-golden/waspCompile/src/shared/.gitkeep @@ -0,0 +1 @@ +This file forces Git to commit an empty directory. diff --git a/waspc/e2e-test/test-outputs/waspJob-golden/files.manifest b/waspc/e2e-test/test-outputs/waspJob-golden/files.manifest index b69946ae23..c298d62578 100644 --- a/waspc/e2e-test/test-outputs/waspJob-golden/files.manifest +++ b/waspc/e2e-test/test-outputs/waspJob-golden/files.manifest @@ -11,6 +11,7 @@ waspJob/.wasp/out/server/src/config.js waspJob/.wasp/out/server/src/core/AuthError.js waspJob/.wasp/out/server/src/core/HttpError.js waspJob/.wasp/out/server/src/dbClient.js +waspJob/.wasp/out/server/src/ext-src/.gitkeep waspJob/.wasp/out/server/src/ext-src/jobs/bar.js waspJob/.wasp/out/server/src/jobs/MySpecialJob.js waspJob/.wasp/out/server/src/jobs/core/Job.js @@ -22,6 +23,7 @@ waspJob/.wasp/out/server/src/jobs/core/simpleJob.js waspJob/.wasp/out/server/src/routes/index.js waspJob/.wasp/out/server/src/routes/operations/index.js waspJob/.wasp/out/server/src/server.js +waspJob/.wasp/out/server/src/shared/.gitkeep waspJob/.wasp/out/server/src/utils.js waspJob/.wasp/out/web-app/.npmrc waspJob/.wasp/out/web-app/README.md @@ -34,6 +36,7 @@ waspJob/.wasp/out/web-app/src/actions/core.js waspJob/.wasp/out/web-app/src/actions/index.js waspJob/.wasp/out/web-app/src/api.js waspJob/.wasp/out/web-app/src/config.js +waspJob/.wasp/out/web-app/src/ext-src/.gitkeep waspJob/.wasp/out/web-app/src/ext-src/Main.css waspJob/.wasp/out/web-app/src/ext-src/MainPage.js waspJob/.wasp/out/web-app/src/ext-src/waspLogo.png @@ -48,11 +51,15 @@ waspJob/.wasp/out/web-app/src/queries/index.js waspJob/.wasp/out/web-app/src/queryClient.js waspJob/.wasp/out/web-app/src/router.js waspJob/.wasp/out/web-app/src/serviceWorker.js +waspJob/.wasp/out/web-app/src/shared/.gitkeep waspJob/.wasp/out/web-app/src/utils.js waspJob/.wasproot waspJob/main.wasp waspJob/src/.waspignore +waspJob/src/client/.gitkeep waspJob/src/client/Main.css waspJob/src/client/MainPage.js waspJob/src/client/waspLogo.png +waspJob/src/server/.gitkeep waspJob/src/server/jobs/bar.js +waspJob/src/shared/.gitkeep diff --git a/waspc/e2e-test/test-outputs/waspJob-golden/waspJob/.wasp/out/.waspchecksums b/waspc/e2e-test/test-outputs/waspJob-golden/waspJob/.wasp/out/.waspchecksums index 457ac5651d..e3805e65c7 100644 --- a/waspc/e2e-test/test-outputs/waspJob-golden/waspJob/.wasp/out/.waspchecksums +++ b/waspc/e2e-test/test-outputs/waspJob-golden/waspJob/.wasp/out/.waspchecksums @@ -83,6 +83,13 @@ ], "20c67ca197da3de2d37528ceaff2e40af910be8177f346c6d5c2b2f983810c43" ], + [ + [ + "file", + "server/src/ext-src/.gitkeep" + ], + "3c93961ee5013ddc0149b57c9eb7b469aea5f3cb197429bded0d20498a267b06" + ], [ [ "file", @@ -160,6 +167,13 @@ ], "25cee89ea082bef40d13a6ba01718ecaa0933c92991c9d395dc8602215c61255" ], + [ + [ + "file", + "server/src/shared/.gitkeep" + ], + "3c93961ee5013ddc0149b57c9eb7b469aea5f3cb197429bded0d20498a267b06" + ], [ [ "file", @@ -251,6 +265,13 @@ ], "a30d5ae7c1b317a7132cac93f4b5bffc3daf11f4f07b5e0d977d063810ffdd11" ], + [ + [ + "file", + "web-app/src/ext-src/.gitkeep" + ], + "3c93961ee5013ddc0149b57c9eb7b469aea5f3cb197429bded0d20498a267b06" + ], [ [ "file", @@ -349,6 +370,13 @@ ], "0b097cb6e2c83821630a33de933893bf75de49731b18ce3c25fc5384866fbac0" ], + [ + [ + "file", + "web-app/src/shared/.gitkeep" + ], + "3c93961ee5013ddc0149b57c9eb7b469aea5f3cb197429bded0d20498a267b06" + ], [ [ "file", diff --git a/waspc/e2e-test/test-outputs/waspJob-golden/waspJob/.wasp/out/server/src/ext-src/.gitkeep b/waspc/e2e-test/test-outputs/waspJob-golden/waspJob/.wasp/out/server/src/ext-src/.gitkeep new file mode 100644 index 0000000000..878bca16e5 --- /dev/null +++ b/waspc/e2e-test/test-outputs/waspJob-golden/waspJob/.wasp/out/server/src/ext-src/.gitkeep @@ -0,0 +1 @@ +This file forces Git to commit an empty directory. diff --git a/waspc/e2e-test/test-outputs/waspJob-golden/waspJob/.wasp/out/server/src/shared/.gitkeep b/waspc/e2e-test/test-outputs/waspJob-golden/waspJob/.wasp/out/server/src/shared/.gitkeep new file mode 100644 index 0000000000..878bca16e5 --- /dev/null +++ b/waspc/e2e-test/test-outputs/waspJob-golden/waspJob/.wasp/out/server/src/shared/.gitkeep @@ -0,0 +1 @@ +This file forces Git to commit an empty directory. diff --git a/waspc/e2e-test/test-outputs/waspJob-golden/waspJob/.wasp/out/web-app/src/ext-src/.gitkeep b/waspc/e2e-test/test-outputs/waspJob-golden/waspJob/.wasp/out/web-app/src/ext-src/.gitkeep new file mode 100644 index 0000000000..878bca16e5 --- /dev/null +++ b/waspc/e2e-test/test-outputs/waspJob-golden/waspJob/.wasp/out/web-app/src/ext-src/.gitkeep @@ -0,0 +1 @@ +This file forces Git to commit an empty directory. diff --git a/waspc/e2e-test/test-outputs/waspJob-golden/waspJob/.wasp/out/web-app/src/shared/.gitkeep b/waspc/e2e-test/test-outputs/waspJob-golden/waspJob/.wasp/out/web-app/src/shared/.gitkeep new file mode 100644 index 0000000000..878bca16e5 --- /dev/null +++ b/waspc/e2e-test/test-outputs/waspJob-golden/waspJob/.wasp/out/web-app/src/shared/.gitkeep @@ -0,0 +1 @@ +This file forces Git to commit an empty directory. diff --git a/waspc/e2e-test/test-outputs/waspJob-golden/waspJob/src/client/.gitkeep b/waspc/e2e-test/test-outputs/waspJob-golden/waspJob/src/client/.gitkeep new file mode 100644 index 0000000000..878bca16e5 --- /dev/null +++ b/waspc/e2e-test/test-outputs/waspJob-golden/waspJob/src/client/.gitkeep @@ -0,0 +1 @@ +This file forces Git to commit an empty directory. diff --git a/waspc/e2e-test/test-outputs/waspJob-golden/waspJob/src/server/.gitkeep b/waspc/e2e-test/test-outputs/waspJob-golden/waspJob/src/server/.gitkeep new file mode 100644 index 0000000000..878bca16e5 --- /dev/null +++ b/waspc/e2e-test/test-outputs/waspJob-golden/waspJob/src/server/.gitkeep @@ -0,0 +1 @@ +This file forces Git to commit an empty directory. diff --git a/waspc/e2e-test/test-outputs/waspJob-golden/waspJob/src/shared/.gitkeep b/waspc/e2e-test/test-outputs/waspJob-golden/waspJob/src/shared/.gitkeep new file mode 100644 index 0000000000..878bca16e5 --- /dev/null +++ b/waspc/e2e-test/test-outputs/waspJob-golden/waspJob/src/shared/.gitkeep @@ -0,0 +1 @@ +This file forces Git to commit an empty directory. diff --git a/waspc/e2e-test/test-outputs/waspMigrate-golden/files.manifest b/waspc/e2e-test/test-outputs/waspMigrate-golden/files.manifest index 843a206145..38c2c80e25 100644 --- a/waspc/e2e-test/test-outputs/waspMigrate-golden/files.manifest +++ b/waspc/e2e-test/test-outputs/waspMigrate-golden/files.manifest @@ -16,6 +16,7 @@ waspMigrate/.wasp/out/server/src/config.js waspMigrate/.wasp/out/server/src/core/AuthError.js waspMigrate/.wasp/out/server/src/core/HttpError.js waspMigrate/.wasp/out/server/src/dbClient.js +waspMigrate/.wasp/out/server/src/ext-src/.gitkeep waspMigrate/.wasp/out/server/src/jobs/core/Job.js waspMigrate/.wasp/out/server/src/jobs/core/SubmittedJob.js waspMigrate/.wasp/out/server/src/jobs/core/allJobs.js @@ -25,6 +26,7 @@ waspMigrate/.wasp/out/server/src/jobs/core/simpleJob.js waspMigrate/.wasp/out/server/src/routes/index.js waspMigrate/.wasp/out/server/src/routes/operations/index.js waspMigrate/.wasp/out/server/src/server.js +waspMigrate/.wasp/out/server/src/shared/.gitkeep waspMigrate/.wasp/out/server/src/utils.js waspMigrate/.wasp/out/web-app/.npmrc waspMigrate/.wasp/out/web-app/README.md @@ -37,6 +39,7 @@ waspMigrate/.wasp/out/web-app/src/actions/core.js waspMigrate/.wasp/out/web-app/src/actions/index.js waspMigrate/.wasp/out/web-app/src/api.js waspMigrate/.wasp/out/web-app/src/config.js +waspMigrate/.wasp/out/web-app/src/ext-src/.gitkeep waspMigrate/.wasp/out/web-app/src/ext-src/Main.css waspMigrate/.wasp/out/web-app/src/ext-src/MainPage.js waspMigrate/.wasp/out/web-app/src/ext-src/waspLogo.png @@ -51,12 +54,16 @@ waspMigrate/.wasp/out/web-app/src/queries/index.js waspMigrate/.wasp/out/web-app/src/queryClient.js waspMigrate/.wasp/out/web-app/src/router.js waspMigrate/.wasp/out/web-app/src/serviceWorker.js +waspMigrate/.wasp/out/web-app/src/shared/.gitkeep waspMigrate/.wasp/out/web-app/src/utils.js waspMigrate/.wasproot waspMigrate/main.wasp waspMigrate/migrations/migration_lock.toml waspMigrate/migrations/no-date-foo/migration.sql waspMigrate/src/.waspignore +waspMigrate/src/client/.gitkeep waspMigrate/src/client/Main.css waspMigrate/src/client/MainPage.js waspMigrate/src/client/waspLogo.png +waspMigrate/src/server/.gitkeep +waspMigrate/src/shared/.gitkeep diff --git a/waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/.wasp/out/.waspchecksums b/waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/.wasp/out/.waspchecksums index 49caaef6fe..b37c7d6d7f 100644 --- a/waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/.wasp/out/.waspchecksums +++ b/waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/.wasp/out/.waspchecksums @@ -83,6 +83,13 @@ ], "20c67ca197da3de2d37528ceaff2e40af910be8177f346c6d5c2b2f983810c43" ], + [ + [ + "file", + "server/src/ext-src/.gitkeep" + ], + "3c93961ee5013ddc0149b57c9eb7b469aea5f3cb197429bded0d20498a267b06" + ], [ [ "file", @@ -146,6 +153,13 @@ ], "3ee2212932180883fabe36bc22e18e2167a63cdbca8bde2dd595419ae2a34e95" ], + [ + [ + "file", + "server/src/shared/.gitkeep" + ], + "3c93961ee5013ddc0149b57c9eb7b469aea5f3cb197429bded0d20498a267b06" + ], [ [ "file", @@ -237,6 +251,13 @@ ], "a30d5ae7c1b317a7132cac93f4b5bffc3daf11f4f07b5e0d977d063810ffdd11" ], + [ + [ + "file", + "web-app/src/ext-src/.gitkeep" + ], + "3c93961ee5013ddc0149b57c9eb7b469aea5f3cb197429bded0d20498a267b06" + ], [ [ "file", @@ -335,6 +356,13 @@ ], "0b097cb6e2c83821630a33de933893bf75de49731b18ce3c25fc5384866fbac0" ], + [ + [ + "file", + "web-app/src/shared/.gitkeep" + ], + "3c93961ee5013ddc0149b57c9eb7b469aea5f3cb197429bded0d20498a267b06" + ], [ [ "file", diff --git a/waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/.wasp/out/server/src/ext-src/.gitkeep b/waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/.wasp/out/server/src/ext-src/.gitkeep new file mode 100644 index 0000000000..878bca16e5 --- /dev/null +++ b/waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/.wasp/out/server/src/ext-src/.gitkeep @@ -0,0 +1 @@ +This file forces Git to commit an empty directory. diff --git a/waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/.wasp/out/server/src/shared/.gitkeep b/waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/.wasp/out/server/src/shared/.gitkeep new file mode 100644 index 0000000000..878bca16e5 --- /dev/null +++ b/waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/.wasp/out/server/src/shared/.gitkeep @@ -0,0 +1 @@ +This file forces Git to commit an empty directory. diff --git a/waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/.wasp/out/web-app/src/ext-src/.gitkeep b/waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/.wasp/out/web-app/src/ext-src/.gitkeep new file mode 100644 index 0000000000..878bca16e5 --- /dev/null +++ b/waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/.wasp/out/web-app/src/ext-src/.gitkeep @@ -0,0 +1 @@ +This file forces Git to commit an empty directory. diff --git a/waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/.wasp/out/web-app/src/shared/.gitkeep b/waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/.wasp/out/web-app/src/shared/.gitkeep new file mode 100644 index 0000000000..878bca16e5 --- /dev/null +++ b/waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/.wasp/out/web-app/src/shared/.gitkeep @@ -0,0 +1 @@ +This file forces Git to commit an empty directory. diff --git a/waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/src/client/.gitkeep b/waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/src/client/.gitkeep new file mode 100644 index 0000000000..878bca16e5 --- /dev/null +++ b/waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/src/client/.gitkeep @@ -0,0 +1 @@ +This file forces Git to commit an empty directory. diff --git a/waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/src/server/.gitkeep b/waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/src/server/.gitkeep new file mode 100644 index 0000000000..878bca16e5 --- /dev/null +++ b/waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/src/server/.gitkeep @@ -0,0 +1 @@ +This file forces Git to commit an empty directory. diff --git a/waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/src/shared/.gitkeep b/waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/src/shared/.gitkeep new file mode 100644 index 0000000000..878bca16e5 --- /dev/null +++ b/waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/src/shared/.gitkeep @@ -0,0 +1 @@ +This file forces Git to commit an empty directory. diff --git a/waspc/e2e-test/test-outputs/waspNew-golden/files.manifest b/waspc/e2e-test/test-outputs/waspNew-golden/files.manifest index 93901d86ab..0955538620 100644 --- a/waspc/e2e-test/test-outputs/waspNew-golden/files.manifest +++ b/waspc/e2e-test/test-outputs/waspNew-golden/files.manifest @@ -1,6 +1,9 @@ waspNew/.wasproot waspNew/main.wasp waspNew/src/.waspignore +waspNew/src/client/.gitkeep waspNew/src/client/Main.css waspNew/src/client/MainPage.js waspNew/src/client/waspLogo.png +waspNew/src/server/.gitkeep +waspNew/src/shared/.gitkeep diff --git a/waspc/e2e-test/test-outputs/waspNew-golden/waspNew/src/client/.gitkeep b/waspc/e2e-test/test-outputs/waspNew-golden/waspNew/src/client/.gitkeep new file mode 100644 index 0000000000..878bca16e5 --- /dev/null +++ b/waspc/e2e-test/test-outputs/waspNew-golden/waspNew/src/client/.gitkeep @@ -0,0 +1 @@ +This file forces Git to commit an empty directory. diff --git a/waspc/e2e-test/test-outputs/waspNew-golden/waspNew/src/server/.gitkeep b/waspc/e2e-test/test-outputs/waspNew-golden/waspNew/src/server/.gitkeep new file mode 100644 index 0000000000..878bca16e5 --- /dev/null +++ b/waspc/e2e-test/test-outputs/waspNew-golden/waspNew/src/server/.gitkeep @@ -0,0 +1 @@ +This file forces Git to commit an empty directory. diff --git a/waspc/e2e-test/test-outputs/waspNew-golden/waspNew/src/shared/.gitkeep b/waspc/e2e-test/test-outputs/waspNew-golden/waspNew/src/shared/.gitkeep new file mode 100644 index 0000000000..878bca16e5 --- /dev/null +++ b/waspc/e2e-test/test-outputs/waspNew-golden/waspNew/src/shared/.gitkeep @@ -0,0 +1 @@ +This file forces Git to commit an empty directory. diff --git a/waspc/test/Generator/WebAppGeneratorTest.hs b/waspc/test/Generator/WebAppGeneratorTest.hs index 87da105030..f48d731b7c 100644 --- a/waspc/test/Generator/WebAppGeneratorTest.hs +++ b/waspc/test/Generator/WebAppGeneratorTest.hs @@ -37,6 +37,7 @@ spec_WebAppGenerator = do ], AS.externalClientFiles = [], AS.externalServerFiles = [], + AS.externalSharedFiles = [], AS.isBuild = False, AS.migrationsDir = Nothing, AS.dotEnvServerFile = Nothing, From 8674887d83ac27b6b54330766b905d77d4bb2bc0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Sodi=C4=87?= Date: Fri, 4 Nov 2022 12:18:21 +0100 Subject: [PATCH 26/35] Fix cli template packaging and update todoApp --- .../src/Wasp/Cli/Command/CreateNewProject.hs | 2 +- waspc/examples/todoApp/.gitignore | 5 +-- waspc/examples/todoApp/.wasproot | 2 +- .../examples/todoApp/{ext => src}/.waspignore | 0 waspc/examples/todoApp/src/client/.gitkeep | 1 + .../todoApp/{ext => src/client}/Main.css | 0 .../todoApp/{ext => src/client}/Todo.js | 0 .../{ext => src/client}/clientSetup.js | 0 .../{ext => src/client}/pages/About.js | 0 .../todoApp/{ext => src/client}/pages/Main.js | 0 .../{ext => src/client}/pages/ProfilePage.js | 0 .../todoApp/{ext => src/client}/pages/Task.js | 0 .../{ext => src/client}/pages/auth/Login.js | 0 .../{ext => src/client}/pages/auth/Signup.js | 0 waspc/examples/todoApp/src/server/.gitkeep | 1 + .../todoApp/{ext => src/server}/actions.js | 0 .../{ext => src/server}/auth/google.js | 0 .../todoApp/{ext => src/server}/jobs/bar.js | 0 .../todoApp/{ext => src/server}/queries.js | 0 .../{ext => src/server}/serverSetup.js | 0 waspc/examples/todoApp/src/shared/.gitkeep | 1 + waspc/examples/todoApp/todoApp.wasp | 38 +++++++++---------- .../Evaluation/TypedExpr/Combinators.hs | 19 ++++++---- waspc/waspc.cabal | 7 ++++ 24 files changed, 44 insertions(+), 32 deletions(-) rename waspc/examples/todoApp/{ext => src}/.waspignore (100%) create mode 100644 waspc/examples/todoApp/src/client/.gitkeep rename waspc/examples/todoApp/{ext => src/client}/Main.css (100%) rename waspc/examples/todoApp/{ext => src/client}/Todo.js (100%) rename waspc/examples/todoApp/{ext => src/client}/clientSetup.js (100%) rename waspc/examples/todoApp/{ext => src/client}/pages/About.js (100%) rename waspc/examples/todoApp/{ext => src/client}/pages/Main.js (100%) rename waspc/examples/todoApp/{ext => src/client}/pages/ProfilePage.js (100%) rename waspc/examples/todoApp/{ext => src/client}/pages/Task.js (100%) rename waspc/examples/todoApp/{ext => src/client}/pages/auth/Login.js (100%) rename waspc/examples/todoApp/{ext => src/client}/pages/auth/Signup.js (100%) create mode 100644 waspc/examples/todoApp/src/server/.gitkeep rename waspc/examples/todoApp/{ext => src/server}/actions.js (100%) rename waspc/examples/todoApp/{ext => src/server}/auth/google.js (100%) rename waspc/examples/todoApp/{ext => src/server}/jobs/bar.js (100%) rename waspc/examples/todoApp/{ext => src/server}/queries.js (100%) rename waspc/examples/todoApp/{ext => src/server}/serverSetup.js (100%) create mode 100644 waspc/examples/todoApp/src/shared/.gitkeep diff --git a/waspc/cli/src/Wasp/Cli/Command/CreateNewProject.hs b/waspc/cli/src/Wasp/Cli/Command/CreateNewProject.hs index 1696ea6999..f2700ec2fb 100644 --- a/waspc/cli/src/Wasp/Cli/Command/CreateNewProject.hs +++ b/waspc/cli/src/Wasp/Cli/Command/CreateNewProject.hs @@ -97,7 +97,7 @@ writeMainWaspFile waspProjectDir (ProjectInfo projectName appName) = writeFile a "", "route RootRoute { path: \"/\", to: MainPage }", "page MainPage {", - " component: import Main from \"@ext/MainPage.js\"", + " component: import Main from \"@client/MainPage.js\"", "}" ] diff --git a/waspc/examples/todoApp/.gitignore b/waspc/examples/todoApp/.gitignore index d319a97e82..c51177f6dc 100644 --- a/waspc/examples/todoApp/.gitignore +++ b/waspc/examples/todoApp/.gitignore @@ -1,4 +1,3 @@ /.wasp/ -.env -.env.server -.env.client \ No newline at end of file +/.env.server +/.env.client diff --git a/waspc/examples/todoApp/.wasproot b/waspc/examples/todoApp/.wasproot index 3caa053db5..ca2cfdb482 100644 --- a/waspc/examples/todoApp/.wasproot +++ b/waspc/examples/todoApp/.wasproot @@ -1 +1 @@ -File marking the root of Wasp project. \ No newline at end of file +File marking the root of Wasp project. diff --git a/waspc/examples/todoApp/ext/.waspignore b/waspc/examples/todoApp/src/.waspignore similarity index 100% rename from waspc/examples/todoApp/ext/.waspignore rename to waspc/examples/todoApp/src/.waspignore diff --git a/waspc/examples/todoApp/src/client/.gitkeep b/waspc/examples/todoApp/src/client/.gitkeep new file mode 100644 index 0000000000..878bca16e5 --- /dev/null +++ b/waspc/examples/todoApp/src/client/.gitkeep @@ -0,0 +1 @@ +This file forces Git to commit an empty directory. diff --git a/waspc/examples/todoApp/ext/Main.css b/waspc/examples/todoApp/src/client/Main.css similarity index 100% rename from waspc/examples/todoApp/ext/Main.css rename to waspc/examples/todoApp/src/client/Main.css diff --git a/waspc/examples/todoApp/ext/Todo.js b/waspc/examples/todoApp/src/client/Todo.js similarity index 100% rename from waspc/examples/todoApp/ext/Todo.js rename to waspc/examples/todoApp/src/client/Todo.js diff --git a/waspc/examples/todoApp/ext/clientSetup.js b/waspc/examples/todoApp/src/client/clientSetup.js similarity index 100% rename from waspc/examples/todoApp/ext/clientSetup.js rename to waspc/examples/todoApp/src/client/clientSetup.js diff --git a/waspc/examples/todoApp/ext/pages/About.js b/waspc/examples/todoApp/src/client/pages/About.js similarity index 100% rename from waspc/examples/todoApp/ext/pages/About.js rename to waspc/examples/todoApp/src/client/pages/About.js diff --git a/waspc/examples/todoApp/ext/pages/Main.js b/waspc/examples/todoApp/src/client/pages/Main.js similarity index 100% rename from waspc/examples/todoApp/ext/pages/Main.js rename to waspc/examples/todoApp/src/client/pages/Main.js diff --git a/waspc/examples/todoApp/ext/pages/ProfilePage.js b/waspc/examples/todoApp/src/client/pages/ProfilePage.js similarity index 100% rename from waspc/examples/todoApp/ext/pages/ProfilePage.js rename to waspc/examples/todoApp/src/client/pages/ProfilePage.js diff --git a/waspc/examples/todoApp/ext/pages/Task.js b/waspc/examples/todoApp/src/client/pages/Task.js similarity index 100% rename from waspc/examples/todoApp/ext/pages/Task.js rename to waspc/examples/todoApp/src/client/pages/Task.js diff --git a/waspc/examples/todoApp/ext/pages/auth/Login.js b/waspc/examples/todoApp/src/client/pages/auth/Login.js similarity index 100% rename from waspc/examples/todoApp/ext/pages/auth/Login.js rename to waspc/examples/todoApp/src/client/pages/auth/Login.js diff --git a/waspc/examples/todoApp/ext/pages/auth/Signup.js b/waspc/examples/todoApp/src/client/pages/auth/Signup.js similarity index 100% rename from waspc/examples/todoApp/ext/pages/auth/Signup.js rename to waspc/examples/todoApp/src/client/pages/auth/Signup.js diff --git a/waspc/examples/todoApp/src/server/.gitkeep b/waspc/examples/todoApp/src/server/.gitkeep new file mode 100644 index 0000000000..878bca16e5 --- /dev/null +++ b/waspc/examples/todoApp/src/server/.gitkeep @@ -0,0 +1 @@ +This file forces Git to commit an empty directory. diff --git a/waspc/examples/todoApp/ext/actions.js b/waspc/examples/todoApp/src/server/actions.js similarity index 100% rename from waspc/examples/todoApp/ext/actions.js rename to waspc/examples/todoApp/src/server/actions.js diff --git a/waspc/examples/todoApp/ext/auth/google.js b/waspc/examples/todoApp/src/server/auth/google.js similarity index 100% rename from waspc/examples/todoApp/ext/auth/google.js rename to waspc/examples/todoApp/src/server/auth/google.js diff --git a/waspc/examples/todoApp/ext/jobs/bar.js b/waspc/examples/todoApp/src/server/jobs/bar.js similarity index 100% rename from waspc/examples/todoApp/ext/jobs/bar.js rename to waspc/examples/todoApp/src/server/jobs/bar.js diff --git a/waspc/examples/todoApp/ext/queries.js b/waspc/examples/todoApp/src/server/queries.js similarity index 100% rename from waspc/examples/todoApp/ext/queries.js rename to waspc/examples/todoApp/src/server/queries.js diff --git a/waspc/examples/todoApp/ext/serverSetup.js b/waspc/examples/todoApp/src/server/serverSetup.js similarity index 100% rename from waspc/examples/todoApp/ext/serverSetup.js rename to waspc/examples/todoApp/src/server/serverSetup.js diff --git a/waspc/examples/todoApp/src/shared/.gitkeep b/waspc/examples/todoApp/src/shared/.gitkeep new file mode 100644 index 0000000000..878bca16e5 --- /dev/null +++ b/waspc/examples/todoApp/src/shared/.gitkeep @@ -0,0 +1 @@ +This file forces Git to commit an empty directory. diff --git a/waspc/examples/todoApp/todoApp.wasp b/waspc/examples/todoApp/todoApp.wasp index 6bc48af3df..9ab76c9c56 100644 --- a/waspc/examples/todoApp/todoApp.wasp +++ b/waspc/examples/todoApp/todoApp.wasp @@ -12,18 +12,18 @@ app todoApp { methods: { usernameAndPassword: {}, // google: { - // configFn: import { config } from "@ext/auth/google.js", - // getUserFieldsFn: import { getUserFields } from "@ext/auth/google.js" + // configFn: import { config } from "@server/auth/google.js", + // getUserFieldsFn: import { getUserFields } from "@server/auth/google.js" // } }, onAuthFailedRedirectTo: "/login", onAuthSucceededRedirectTo: "/profile" }, server: { - setupFn: import setup from "@ext/serverSetup.js" + setupFn: import setup from "@server/serverSetup.js" }, client: { - setupFn: import setup from "@ext/clientSetup.js" + setupFn: import setup from "@client/clientSetup.js" }, db: { system: PostgreSQL @@ -58,29 +58,29 @@ psl=} route SignupRoute { path: "/signup", to: SignupPage } page SignupPage { - component: import Signup from "@ext/pages/auth/Signup" + component: import Signup from "@client/pages/auth/Signup" } route LoginRoute { path: "/login", to: LoginPage } page LoginPage { - component: import Login from "@ext/pages/auth/Login" + component: import Login from "@client/pages/auth/Login" } route HomeRoute { path: "/", to: MainPage } page MainPage { authRequired: true, - component: import Main from "@ext/pages/Main" + component: import Main from "@client/pages/Main" } route AboutRoute { path: "/about", to: AboutPage } page AboutPage { - component: import About from "@ext/pages/About" + component: import About from "@client/pages/About" } route ProfileRoute { path: "/profile", to: ProfilePage } page ProfilePage { authRequired: true, - component: import { ProfilePage } from "@ext/pages/ProfilePage" + component: import { ProfilePage } from "@client/pages/ProfilePage" } // Page for viewing a specific task @@ -88,53 +88,53 @@ page ProfilePage { route TaskRoute { path: "/task/:id", to: TaskPage } page TaskPage { authRequired: true, - component: import Task from "@ext/pages/Task" + component: import Task from "@client/pages/Task" } // --------- Queries --------- // query getTasks { - fn: import { getTasks } from "@ext/queries.js", + fn: import { getTasks } from "@server/queries.js", entities: [Task] } query getNumTasks { - fn: import { getNumTasks } from "@ext/queries.js", + fn: import { getNumTasks } from "@server/queries.js", entities: [Task], auth: false } query getTask { - fn: import { getTask } from "@ext/queries.js", + fn: import { getTask } from "@server/queries.js", entities: [Task] } // --------- Actions --------- // action createTask { - fn: import { createTask } from "@ext/actions.js", + fn: import { createTask } from "@server/actions.js", entities: [Task] } action updateTaskIsDone { - fn: import { updateTaskIsDone } from "@ext/actions.js", + fn: import { updateTaskIsDone } from "@server/actions.js", entities: [Task] } action deleteCompletedTasks { - fn: import { deleteCompletedTasks } from "@ext/actions.js", + fn: import { deleteCompletedTasks } from "@server/actions.js", entities: [Task] } action toggleAllTasks { - fn: import { toggleAllTasks } from "@ext/actions.js", + fn: import { toggleAllTasks } from "@server/actions.js", entities: [Task] } job mySpecialJob { executor: PgBoss, perform: { - fn: import { foo } from "@ext/jobs/bar.js", + fn: import { foo } from "@server/jobs/bar.js", executorOptions: { pgBoss: {=json { "retryLimit": 1 } json=} } @@ -145,7 +145,7 @@ job mySpecialJob { job mySpecialScheduledJob { executor: PgBoss, perform: { - fn: import { foo } from "@ext/jobs/bar.js" + fn: import { foo } from "@server/jobs/bar.js" }, schedule: { cron: "0 * * * *", diff --git a/waspc/src/Wasp/Analyzer/Evaluator/Evaluation/TypedExpr/Combinators.hs b/waspc/src/Wasp/Analyzer/Evaluator/Evaluation/TypedExpr/Combinators.hs index 5bdbbeca06..ff43a9102e 100644 --- a/waspc/src/Wasp/Analyzer/Evaluator/Evaluation/TypedExpr/Combinators.hs +++ b/waspc/src/Wasp/Analyzer/Evaluator/Evaluation/TypedExpr/Combinators.hs @@ -17,6 +17,7 @@ module Wasp.Analyzer.Evaluator.Evaluation.TypedExpr.Combinators ) where +import Control.Applicative ((<|>)) import Control.Arrow (left) import qualified Data.Aeson as Aeson import qualified Data.ByteString.Lazy.UTF8 as ByteStringLazyUTF8 @@ -155,24 +156,26 @@ tuple4 eval1 eval2 eval3 eval4 = evaluation $ \(typeDefs, bindings) -> withCtx $ -- | An evaluation that expects an "ExtImport". extImport :: TypedExprEvaluation AppSpec.ExtImport.ExtImport extImport = evaluation' . withCtx $ \ctx -> \case - TypedAST.ExtImport name extFileFP -> + TypedAST.ExtImport name extImportPath -> -- NOTE(martin): This parsing here could instead be done in Parser. -- I don't have a very good reason for doing it here instead of Parser, except -- for being somewhat simpler to implement. -- So we might want to move it to Parser at some point in the future, if we -- figure out that is better (it sounds/feels like it could be). - case stripPrefix extPrefix extFileFP of + case stripImportPrefix extImportPath of Just relFileFP -> case SP.parseRelFileP relFileFP of - Left err -> Left $ ER.mkEvaluationError ctx $ ER.ParseError $ ER.EvaluationParseError $ show err + Left err -> mkError ctx $ show err Right relFileSP -> pure $ AppSpec.ExtImport.ExtImport name relFileSP Nothing -> - Left $ - ER.mkEvaluationError ctx $ - ER.ParseError $ - ER.EvaluationParseError $ "Path in external import must start with \"" ++ extPrefix ++ "\"!" + mkError + ctx + $ "Path in external import must start with \"" ++ serverPrefix ++ "\"" ++ " or \"" ++ clientPrefix ++ "\"!" expr -> Left $ ER.mkEvaluationError ctx $ ER.ExpectedType T.ExtImportType (TypedAST.exprType expr) where - extPrefix = "@ext/" + mkError ctx msg = Left $ ER.mkEvaluationError ctx $ ER.ParseError $ ER.EvaluationParseError msg + stripImportPrefix importPath = stripPrefix serverPrefix importPath <|> stripPrefix clientPrefix importPath + serverPrefix = "@server/" + clientPrefix = "@client/" -- | An evaluation that expects a "JSON". json :: TypedExprEvaluation AppSpec.JSON.JSON diff --git a/waspc/waspc.cabal b/waspc/waspc.cabal index 43c7d717e0..a1bffc9b69 100644 --- a/waspc/waspc.cabal +++ b/waspc/waspc.cabal @@ -44,6 +44,13 @@ data-files: Cli/templates/**/*.css Cli/templates/**/*.js Cli/templates/**/*.png + Cli/templates/new/.gitignore + Cli/templates/new/.wasproot + Cli/templates/new/src/.waspignore + Cli/templates/new/src/client/.gitkeep + Cli/templates/new/src/server/.gitkeep + Cli/templates/new/src/shared/.gitkeep + data-dir: data/ source-repository head From 0cb63697fc049773bb183f2e8262a4a88151999c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Sodi=C4=87?= Date: Fri, 4 Nov 2022 12:39:23 +0100 Subject: [PATCH 27/35] Add a shared function demo to todoApp --- waspc/examples/todoApp/src/client/clientSetup.js | 3 +++ waspc/examples/todoApp/src/server/serverSetup.js | 2 ++ waspc/examples/todoApp/src/shared/util.js | 3 +++ 3 files changed, 8 insertions(+) create mode 100644 waspc/examples/todoApp/src/shared/util.js diff --git a/waspc/examples/todoApp/src/client/clientSetup.js b/waspc/examples/todoApp/src/client/clientSetup.js index d966d22d5e..827b0afad1 100644 --- a/waspc/examples/todoApp/src/client/clientSetup.js +++ b/waspc/examples/todoApp/src/client/clientSetup.js @@ -1,3 +1,6 @@ +import { sayHi } from '../shared/util' + export default function setup() { console.log("This was called from the client setup function") + sayHi() } diff --git a/waspc/examples/todoApp/src/server/serverSetup.js b/waspc/examples/todoApp/src/server/serverSetup.js index 9aecb64551..5eabe9b961 100644 --- a/waspc/examples/todoApp/src/server/serverSetup.js +++ b/waspc/examples/todoApp/src/server/serverSetup.js @@ -1,10 +1,12 @@ import { mySpecialJob } from '@wasp/jobs/mySpecialJob.js' +import { sayHi } from '../shared/util.js' let someResource = undefined export const getSomeResource = () => someResource const setup = async () => { + sayHi() await new Promise(resolve => setTimeout(resolve, 2000)) someResource = 'This resource is now set up.' console.log('Custom server setup done!') diff --git a/waspc/examples/todoApp/src/shared/util.js b/waspc/examples/todoApp/src/shared/util.js new file mode 100644 index 0000000000..76de186600 --- /dev/null +++ b/waspc/examples/todoApp/src/shared/util.js @@ -0,0 +1,3 @@ +export function sayHi() { + console.log("This is coming from shared function.") +} From 8bb94cc453a2c5e022105b6704871db0ac1f6528 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Sodi=C4=87?= Date: Fri, 4 Nov 2022 15:17:33 +0100 Subject: [PATCH 28/35] Update waspc and e2e tests --- waspc/e2e-test/Tests/WaspJobTest.hs | 2 +- .../waspBuild-golden/waspBuild/main.wasp | 2 +- .../waspCompile-golden/waspCompile/main.wasp | 2 +- .../waspJob-golden/waspJob/main.wasp | 4 ++-- .../waspMigrate-golden/waspMigrate/main.wasp | 2 +- .../waspNew-golden/waspNew/main.wasp | 2 +- waspc/test/Analyzer/EvaluatorTest.hs | 2 +- waspc/test/Analyzer/Parser/ConcreteParserTest.hs | 6 +++--- waspc/test/AnalyzerTest.hs | 16 ++++++++-------- 9 files changed, 19 insertions(+), 19 deletions(-) diff --git a/waspc/e2e-test/Tests/WaspJobTest.hs b/waspc/e2e-test/Tests/WaspJobTest.hs index 1ddf446701..bb2295fd53 100644 --- a/waspc/e2e-test/Tests/WaspJobTest.hs +++ b/waspc/e2e-test/Tests/WaspJobTest.hs @@ -16,7 +16,7 @@ waspJob = do " job MySpecialJob { \n\ \ executor: PgBoss, \n\ \ perform: { \n\ - \ fn: import { foo } from \"@ext/jobs/bar.js\" \n\ + \ fn: import { foo } from \"@server/jobs/bar.js\" \n\ \ } \n\ \ } \n" diff --git a/waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/main.wasp b/waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/main.wasp index a2d95169c5..4bbd625756 100644 --- a/waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/main.wasp +++ b/waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/main.wasp @@ -8,5 +8,5 @@ app waspBuild { route RootRoute { path: "/", to: MainPage } page MainPage { - component: import Main from "@ext/MainPage.js" + component: import Main from "@client/MainPage.js" } diff --git a/waspc/e2e-test/test-outputs/waspCompile-golden/waspCompile/main.wasp b/waspc/e2e-test/test-outputs/waspCompile-golden/waspCompile/main.wasp index fe8dec46a0..e1f9b611e7 100644 --- a/waspc/e2e-test/test-outputs/waspCompile-golden/waspCompile/main.wasp +++ b/waspc/e2e-test/test-outputs/waspCompile-golden/waspCompile/main.wasp @@ -7,5 +7,5 @@ app waspCompile { route RootRoute { path: "/", to: MainPage } page MainPage { - component: import Main from "@ext/MainPage.js" + component: import Main from "@client/MainPage.js" } diff --git a/waspc/e2e-test/test-outputs/waspJob-golden/waspJob/main.wasp b/waspc/e2e-test/test-outputs/waspJob-golden/waspJob/main.wasp index da739c9615..346854dd04 100644 --- a/waspc/e2e-test/test-outputs/waspJob-golden/waspJob/main.wasp +++ b/waspc/e2e-test/test-outputs/waspJob-golden/waspJob/main.wasp @@ -8,12 +8,12 @@ app waspJob { route RootRoute { path: "/", to: MainPage } page MainPage { - component: import Main from "@ext/MainPage.js" + component: import Main from "@client/MainPage.js" } job MySpecialJob { executor: PgBoss, perform: { - fn: import { foo } from "@ext/jobs/bar.js" + fn: import { foo } from "@server/jobs/bar.js" } } diff --git a/waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/main.wasp b/waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/main.wasp index 2a91066116..b5de396e50 100644 --- a/waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/main.wasp +++ b/waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/main.wasp @@ -7,7 +7,7 @@ app waspMigrate { route RootRoute { path: "/", to: MainPage } page MainPage { - component: import Main from "@ext/MainPage.js" + component: import Main from "@client/MainPage.js" } entity Task {=psl id Int @id @default(autoincrement()) diff --git a/waspc/e2e-test/test-outputs/waspNew-golden/waspNew/main.wasp b/waspc/e2e-test/test-outputs/waspNew-golden/waspNew/main.wasp index 711459104f..ce5e5d9ead 100644 --- a/waspc/e2e-test/test-outputs/waspNew-golden/waspNew/main.wasp +++ b/waspc/e2e-test/test-outputs/waspNew-golden/waspNew/main.wasp @@ -7,5 +7,5 @@ app waspNew { route RootRoute { path: "/", to: MainPage } page MainPage { - component: import Main from "@ext/MainPage.js" + component: import Main from "@client/MainPage.js" } diff --git a/waspc/test/Analyzer/EvaluatorTest.hs b/waspc/test/Analyzer/EvaluatorTest.hs index 62994f1010..7829c59f51 100644 --- a/waspc/test/Analyzer/EvaluatorTest.hs +++ b/waspc/test/Analyzer/EvaluatorTest.hs @@ -199,7 +199,7 @@ spec_Evaluator = do let typeDefs = TD.addDeclType @Special $ TD.empty let source = [ "special Test {", - " imps: [import { field } from \"@ext/main.js\", import main from \"@ext/main.js\"],", + " imps: [import { field } from \"@server/main.js\", import main from \"@server/main.js\"],", " json: {=json { \"key\": 1 } json=}", "}" ] diff --git a/waspc/test/Analyzer/Parser/ConcreteParserTest.hs b/waspc/test/Analyzer/Parser/ConcreteParserTest.hs index 42975544b8..0b71a9bfb5 100644 --- a/waspc/test/Analyzer/Parser/ConcreteParserTest.hs +++ b/waspc/test/Analyzer/Parser/ConcreteParserTest.hs @@ -41,15 +41,15 @@ spec_ParseCSTExpression = do parseCSTExpression [token T.KwFalse "false"] `shouldBeWithDiff` ([], [node BoolFalse 5 []]) it "Parses external imports" $ do - parseCSTExpression [token T.KwImport "import", token T.Identifier "main", token T.KwFrom "from", token T.String "\"@ext/main.js\""] + parseCSTExpression [token T.KwImport "import", token T.Identifier "main", token T.KwFrom "from", token T.String "\"@server/main.js\""] `shouldBeWithDiff` ( [], [ node ExtImport - 28 + 31 [ node (Token T.KwImport) 6 [], node ExtImportModule 4 [], node (Token T.KwFrom) 4 [], - node ExtImportPath 14 [] + node ExtImportPath 17 [] ] ] ) diff --git a/waspc/test/AnalyzerTest.hs b/waspc/test/AnalyzerTest.hs index 4a152d17c1..9b960b0092 100644 --- a/waspc/test/AnalyzerTest.hs +++ b/waspc/test/AnalyzerTest.hs @@ -54,10 +54,10 @@ spec_Analyzer = do " (\"redux\", \"^4.0.5\")", " ],", " server: {", - " setupFn: import { setupServer } from \"@ext/bar.js\"", + " setupFn: import { setupServer } from \"@server/bar.js\"", " },", " client: {", - " setupFn: import { setupClient } from \"@ext/baz.js\"", + " setupFn: import { setupClient } from \"@client/baz.js\"", " },", " db: {", " system: PostgreSQL", @@ -69,23 +69,23 @@ spec_Analyzer = do "psl=}", "", "page HomePage {", - " component: import Home from \"@ext/pages/Main\"", + " component: import Home from \"@client/pages/Main\"", "}", "", "page ProfilePage {", - " component: import { profilePage } from \"@ext/pages/Profile\",", + " component: import { profilePage } from \"@client/pages/Profile\",", " authRequired: true", "}", "", "route HomeRoute { path: \"/\", to: HomePage }", "", "query getUsers {", - " fn: import { getAllUsers } from \"@ext/foo.js\",", + " fn: import { getAllUsers } from \"@server/foo.js\",", " entities: [User]", "}", "", "action updateUser {", - " fn: import { updateUser } from \"@ext/foo.js\",", + " fn: import { updateUser } from \"@server/foo.js\",", " entities: [User],", " auth: true", "}", @@ -93,7 +93,7 @@ spec_Analyzer = do "job BackgroundJob {", " executor: PgBoss,", " perform: {", - " fn: import { backgroundJob } from \"@ext/jobs/baz.js\",", + " fn: import { backgroundJob } from \"@server/jobs/baz.js\",", " executorOptions: {", " pgBoss: {=json { \"retryLimit\": 1 } json=}", " }", @@ -291,7 +291,7 @@ spec_Analyzer = do let source = unlines [ "route HomeRoute { path: \"/\", to: HomePage }", - "page HomePage { component: import Home from \"@ext/HomePage.js\" }" + "page HomePage { component: import Home from \"@client/HomePage.js\" }" ] isRight (analyze source) `shouldBe` True From 5f478559204e4e74137a2312a31061e134a5fa95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Sodi=C4=87?= Date: Fri, 4 Nov 2022 16:58:30 +0100 Subject: [PATCH 29/35] Fix compiler warnings and rename function --- waspc/cli/src/Wasp/Cli/Command/Deps.hs | 4 ++-- waspc/src/Wasp/Lib.hs | 10 +++++----- waspc/test/AppSpec/ValidTest.hs | 1 + waspc/test/Generator/WebAppGeneratorTest.hs | 7 ++++++- 4 files changed, 14 insertions(+), 8 deletions(-) diff --git a/waspc/cli/src/Wasp/Cli/Command/Deps.hs b/waspc/cli/src/Wasp/Cli/Command/Deps.hs index 9da61e9f1d..ed7d5acd39 100644 --- a/waspc/cli/src/Wasp/Cli/Command/Deps.hs +++ b/waspc/cli/src/Wasp/Cli/Command/Deps.hs @@ -14,13 +14,13 @@ import Wasp.Cli.Terminal (title) import qualified Wasp.Generator.NpmDependencies as N import qualified Wasp.Generator.ServerGenerator as ServerGenerator import qualified Wasp.Generator.WebAppGenerator as WebAppGenerator -import Wasp.Lib (analyzeProject) +import Wasp.Lib (analyzeWaspProject) import qualified Wasp.Util.Terminal as Term deps :: Command () deps = do waspProjectDir <- findWaspProjectRootDirFromCwd - appSpecOrAnalyzerErrors <- liftIO $ analyzeProject waspProjectDir (defaultCompileOptions waspProjectDir) + appSpecOrAnalyzerErrors <- liftIO $ analyzeWaspProject waspProjectDir (defaultCompileOptions waspProjectDir) appSpec <- either (throwError . CommandError "Determining dependencies failed due to a compilation error in your Wasp project" . unwords) diff --git a/waspc/src/Wasp/Lib.hs b/waspc/src/Wasp/Lib.hs index 4422d4fba5..74405c0e9b 100644 --- a/waspc/src/Wasp/Lib.hs +++ b/waspc/src/Wasp/Lib.hs @@ -3,7 +3,7 @@ module Wasp.Lib Generator.start, ProjectRootDir, findWaspFile, - analyzeProject, + analyzeWaspProject, compileAndRenderDockerfile, CompileError, CompileWarning, @@ -48,17 +48,17 @@ compile :: IO ([CompileWarning], [CompileError]) compile waspDir outDir options = do compileWarningsAndErrors <- - analyzeProject waspDir options >>= \case + analyzeWaspProject waspDir options >>= \case Left analyzerErrors -> return ([], analyzerErrors) Right appSpec -> generateCode appSpec outDir options dotEnvWarnings <- maybeToList <$> warnIfDotEnvPresent waspDir return $ (dotEnvWarnings, []) <> compileWarningsAndErrors -analyzeProject :: +analyzeWaspProject :: Path' Abs (Dir WaspProjectDir) -> CompileOptions -> IO (Either [CompileError] AS.AppSpec) -analyzeProject waspDir options = runExceptT $ do +analyzeWaspProject waspDir options = runExceptT $ do waspFilePath <- ExceptT $ left pure <$> findWaspFile waspDir declarations <- ExceptT $ left pure <$> analyzeWaspFileContent waspFilePath ExceptT $ constructAppSpec waspDir options declarations @@ -162,7 +162,7 @@ loadUserDockerfileContents waspDir = do compileAndRenderDockerfile :: Path' Abs (Dir WaspProjectDir) -> CompileOptions -> IO (Either [CompileError] Text) compileAndRenderDockerfile waspDir compileOptions = do - appSpecOrAnalyzerErrors <- analyzeProject waspDir compileOptions + appSpecOrAnalyzerErrors <- analyzeWaspProject waspDir compileOptions case appSpecOrAnalyzerErrors of Left errors -> return $ Left errors Right appSpec -> do diff --git a/waspc/test/AppSpec/ValidTest.hs b/waspc/test/AppSpec/ValidTest.hs index c73523e614..1bb66f4f7a 100644 --- a/waspc/test/AppSpec/ValidTest.hs +++ b/waspc/test/AppSpec/ValidTest.hs @@ -189,6 +189,7 @@ spec_AppSpecValid = do { AS.decls = [basicAppDecl], AS.externalClientFiles = [], AS.externalServerFiles = [], + AS.externalSharedFiles = [], AS.isBuild = False, AS.migrationsDir = Nothing, AS.dotEnvServerFile = Nothing, diff --git a/waspc/test/Generator/WebAppGeneratorTest.hs b/waspc/test/Generator/WebAppGeneratorTest.hs index f48d731b7c..3409772066 100644 --- a/waspc/test/Generator/WebAppGeneratorTest.hs +++ b/waspc/test/Generator/WebAppGeneratorTest.hs @@ -14,6 +14,7 @@ import qualified Wasp.Generator.FileDraft.TextFileDraft as TextFD import Wasp.Generator.Monad (runGenerator) import Wasp.Generator.WebAppGenerator import qualified Wasp.Generator.WebAppGenerator.Common as Common +import qualified Wasp.AppSpec.App.Wasp as AS.App -- TODO(martin): We could maybe define Arbitrary instance for AppSpec, define properties -- over generator functions and then do property testing on them, that would be cool. @@ -26,7 +27,11 @@ spec_WebAppGenerator = do [ AS.Decl.makeDecl "TestApp" AS.App.App - { AS.App.title = "Test App", + { + AS.App.title = "Test App", + AS.App.wasp = AS.App.Wasp { + AS.App.version = "0.6.0.0" + }, AS.App.db = Nothing, AS.App.server = Nothing, AS.App.client = Nothing, From 54e0b023ee670c3be721d13cf2569beb2008556a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Sodi=C4=87?= Date: Fri, 4 Nov 2022 17:08:46 +0100 Subject: [PATCH 30/35] Rename mkError to mkParserError --- .../Analyzer/Evaluator/Evaluation/TypedExpr/Combinators.hs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/waspc/src/Wasp/Analyzer/Evaluator/Evaluation/TypedExpr/Combinators.hs b/waspc/src/Wasp/Analyzer/Evaluator/Evaluation/TypedExpr/Combinators.hs index ff43a9102e..e0da203357 100644 --- a/waspc/src/Wasp/Analyzer/Evaluator/Evaluation/TypedExpr/Combinators.hs +++ b/waspc/src/Wasp/Analyzer/Evaluator/Evaluation/TypedExpr/Combinators.hs @@ -164,15 +164,15 @@ extImport = evaluation' . withCtx $ \ctx -> \case -- figure out that is better (it sounds/feels like it could be). case stripImportPrefix extImportPath of Just relFileFP -> case SP.parseRelFileP relFileFP of - Left err -> mkError ctx $ show err + Left err -> mkParseError ctx $ show err Right relFileSP -> pure $ AppSpec.ExtImport.ExtImport name relFileSP Nothing -> - mkError + mkParseError ctx $ "Path in external import must start with \"" ++ serverPrefix ++ "\"" ++ " or \"" ++ clientPrefix ++ "\"!" expr -> Left $ ER.mkEvaluationError ctx $ ER.ExpectedType T.ExtImportType (TypedAST.exprType expr) where - mkError ctx msg = Left $ ER.mkEvaluationError ctx $ ER.ParseError $ ER.EvaluationParseError msg + mkParseError ctx msg = Left $ ER.mkEvaluationError ctx $ ER.ParseError $ ER.EvaluationParseError msg stripImportPrefix importPath = stripPrefix serverPrefix importPath <|> stripPrefix clientPrefix importPath serverPrefix = "@server/" clientPrefix = "@client/" From 0ae2631e5bd4e50a73e10217dbe19e29b649688b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Sodi=C4=87?= Date: Fri, 4 Nov 2022 17:14:31 +0100 Subject: [PATCH 31/35] Remove redundant empty line --- waspc/waspc.cabal | 1 - 1 file changed, 1 deletion(-) diff --git a/waspc/waspc.cabal b/waspc/waspc.cabal index fd580f2f93..b97770fa82 100644 --- a/waspc/waspc.cabal +++ b/waspc/waspc.cabal @@ -50,7 +50,6 @@ data-files: Cli/templates/new/src/client/.gitkeep Cli/templates/new/src/server/.gitkeep Cli/templates/new/src/shared/.gitkeep - data-dir: data/ source-repository head From fc76fb60dcf2642c0a8a2475efad495931a9fc3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Sodi=C4=87?= Date: Fri, 4 Nov 2022 18:25:46 +0100 Subject: [PATCH 32/35] Fix test warnings --- waspc/test/AppSpec/ValidTest.hs | 5 ++++- waspc/test/Generator/WebAppGeneratorTest.hs | 15 +++++++++------ 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/waspc/test/AppSpec/ValidTest.hs b/waspc/test/AppSpec/ValidTest.hs index 1bb66f4f7a..2b3e3172cc 100644 --- a/waspc/test/AppSpec/ValidTest.hs +++ b/waspc/test/AppSpec/ValidTest.hs @@ -18,6 +18,7 @@ import qualified Wasp.AppSpec.Valid as ASV import qualified Wasp.Psl.Ast.Model as PslM import qualified Wasp.SemanticVersion as SV import qualified Wasp.Version as WV +import StrongPath (parseAbsDir) spec_AppSpecValid :: Spec spec_AppSpecValid = do @@ -187,6 +188,7 @@ spec_AppSpecValid = do basicAppSpec = AS.AppSpec { AS.decls = [basicAppDecl], + AS.waspProjectDir = fromJust $ parseAbsDir "/wasp-project", AS.externalClientFiles = [], AS.externalServerFiles = [], AS.externalSharedFiles = [], @@ -194,7 +196,8 @@ spec_AppSpecValid = do AS.migrationsDir = Nothing, AS.dotEnvServerFile = Nothing, AS.dotEnvClientFile = Nothing, - AS.userDockerfileContents = Nothing + AS.userDockerfileContents = Nothing, + AS.configFiles = [] } basicPage = diff --git a/waspc/test/Generator/WebAppGeneratorTest.hs b/waspc/test/Generator/WebAppGeneratorTest.hs index b8b2c47119..4fe200493a 100644 --- a/waspc/test/Generator/WebAppGeneratorTest.hs +++ b/waspc/test/Generator/WebAppGeneratorTest.hs @@ -1,10 +1,13 @@ module Generator.WebAppGeneratorTest where +import Data.Maybe (fromJust) +import StrongPath (parseAbsDir) import qualified StrongPath as SP import System.FilePath (()) import Test.Tasty.Hspec import qualified Wasp.AppSpec as AS import qualified Wasp.AppSpec.App as AS.App +import qualified Wasp.AppSpec.App.Wasp as AS.App import qualified Wasp.AppSpec.Core.Decl as AS.Decl import Wasp.Generator.FileDraft import qualified Wasp.Generator.FileDraft.CopyDirFileDraft as CopyDirFD @@ -14,7 +17,6 @@ import qualified Wasp.Generator.FileDraft.TextFileDraft as TextFD import Wasp.Generator.Monad (runGenerator) import Wasp.Generator.WebAppGenerator import qualified Wasp.Generator.WebAppGenerator.Common as Common -import qualified Wasp.AppSpec.App.Wasp as AS.App -- TODO(martin): We could maybe define Arbitrary instance for AppSpec, define properties -- over generator functions and then do property testing on them, that would be cool. @@ -27,11 +29,11 @@ spec_WebAppGenerator = do [ AS.Decl.makeDecl "TestApp" AS.App.App - { - AS.App.title = "Test App", - AS.App.wasp = AS.App.Wasp { - AS.App.version = "0.6.0.0" - }, + { AS.App.title = "Test App", + AS.App.wasp = + AS.App.Wasp + { AS.App.version = "0.6.0.0" + }, AS.App.db = Nothing, AS.App.server = Nothing, AS.App.client = Nothing, @@ -40,6 +42,7 @@ spec_WebAppGenerator = do AS.App.head = Nothing } ], + AS.waspProjectDir = fromJust $ parseAbsDir "/wasp-project", AS.externalClientFiles = [], AS.externalServerFiles = [], AS.externalSharedFiles = [], From dc2914014407c905809d9bf5029e0d8f7a8b563e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Sodi=C4=87?= Date: Fri, 4 Nov 2022 18:33:40 +0100 Subject: [PATCH 33/35] Fix formatting --- waspc/test/AppSpec/ValidTest.hs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/waspc/test/AppSpec/ValidTest.hs b/waspc/test/AppSpec/ValidTest.hs index 2b3e3172cc..9a3b6027e2 100644 --- a/waspc/test/AppSpec/ValidTest.hs +++ b/waspc/test/AppSpec/ValidTest.hs @@ -3,6 +3,7 @@ module AppSpec.ValidTest where import Data.Maybe (fromJust) +import StrongPath (parseAbsDir) import qualified StrongPath as SP import Test.Tasty.Hspec import qualified Wasp.AppSpec as AS @@ -18,7 +19,6 @@ import qualified Wasp.AppSpec.Valid as ASV import qualified Wasp.Psl.Ast.Model as PslM import qualified Wasp.SemanticVersion as SV import qualified Wasp.Version as WV -import StrongPath (parseAbsDir) spec_AppSpecValid :: Spec spec_AppSpecValid = do From f384d140603eafc4d29546b917829209eae18fa2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Sodi=C4=87?= Date: Wed, 9 Nov 2022 13:40:35 +0100 Subject: [PATCH 34/35] Fix directory tree watching on wasp start --- waspc/cli/src/Wasp/Cli/Command/Watch.hs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/waspc/cli/src/Wasp/Cli/Command/Watch.hs b/waspc/cli/src/Wasp/Cli/Command/Watch.hs index ac92e22151..9dd10bb2c9 100644 --- a/waspc/cli/src/Wasp/Cli/Command/Watch.hs +++ b/waspc/cli/src/Wasp/Cli/Command/Watch.hs @@ -40,7 +40,7 @@ watch waspProjectDir outDir ongoingCompilationResultMVar = FSN.withManager $ \mg currentTime <- getCurrentTime chan <- newChan _ <- FSN.watchDirChan mgr (SP.fromAbsDir waspProjectDir) eventFilter chan - let watchProjectSubdirTree path = FSN.watchDirChan mgr (SP.fromAbsDir $ waspProjectDir path) eventFilter chan + let watchProjectSubdirTree path = FSN.watchTreeChan mgr (SP.fromAbsDir $ waspProjectDir path) eventFilter chan _ <- watchProjectSubdirTree Common.extClientCodeDirInWaspProjectDir _ <- watchProjectSubdirTree Common.extServerCodeDirInWaspProjectDir _ <- watchProjectSubdirTree Common.extSharedCodeDirInWaspProjectDir From d4a4c07b6946e102c082c5362fd5b401e6e4de9b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Sodi=C4=87?= Date: Wed, 9 Nov 2022 16:50:09 +0100 Subject: [PATCH 35/35] Implement review feedback --- waspc/cli/src/Wasp/Cli/Command/CreateNewProject.hs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/waspc/cli/src/Wasp/Cli/Command/CreateNewProject.hs b/waspc/cli/src/Wasp/Cli/Command/CreateNewProject.hs index e94393940f..d57c2637f1 100644 --- a/waspc/cli/src/Wasp/Cli/Command/CreateNewProject.hs +++ b/waspc/cli/src/Wasp/Cli/Command/CreateNewProject.hs @@ -28,12 +28,13 @@ data ProjectInfo = ProjectInfo } createNewProject :: String -> Command () -createNewProject projectName = do - projectInfo <- parseProjectInfo projectName +createNewProject projectNameCandidate = do + projectInfo <- parseProjectInfo projectNameCandidate createWaspProjectDir projectInfo - liftIO printGettingStartedInstructions + liftIO $ printGettingStartedInstructions $ _projectName projectInfo where - printGettingStartedInstructions = do + printGettingStartedInstructions :: String -> IO () + printGettingStartedInstructions projectName = do putStrLn $ Term.applyStyles [Term.Green] ("Created new Wasp app in ./" ++ projectName ++ " directory!") putStrLn "To run it, do:" putStrLn ""