From 7f205aca7ce61e720ae39a75ac0be4e6779bb567 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Sodi=C4=87?= Date: Thu, 6 Feb 2025 18:09:59 +0100 Subject: [PATCH 01/14] Reference the correct user tsconfig from server tsconfig --- .../data/Generator/templates/server/tsconfig.json | 2 +- waspc/src/Wasp/Generator/ServerGenerator.hs | 15 +++++++++++---- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/waspc/data/Generator/templates/server/tsconfig.json b/waspc/data/Generator/templates/server/tsconfig.json index 6d0f513a17..f624171a6d 100644 --- a/waspc/data/Generator/templates/server/tsconfig.json +++ b/waspc/data/Generator/templates/server/tsconfig.json @@ -30,6 +30,6 @@ "src" ], "references": [ - { "path": "../../../tsconfig.json" } + { "path": "{= srcTsConfigPath =}" } ] } diff --git a/waspc/src/Wasp/Generator/ServerGenerator.hs b/waspc/src/Wasp/Generator/ServerGenerator.hs index e40797511c..52f07f01f0 100644 --- a/waspc/src/Wasp/Generator/ServerGenerator.hs +++ b/waspc/src/Wasp/Generator/ServerGenerator.hs @@ -19,6 +19,7 @@ import Data.Maybe ) import StrongPath ( Dir, + File, File', Path, Path', @@ -28,6 +29,7 @@ import StrongPath relfile, (), ) +import qualified StrongPath as SP import Wasp.AppSpec (AppSpec) import qualified Wasp.AppSpec as AS import qualified Wasp.AppSpec.App as AS.App @@ -57,6 +59,7 @@ import Wasp.Generator.ServerGenerator.OperationsG (genOperations) import Wasp.Generator.ServerGenerator.OperationsRoutesG (genOperationsRoutes) import Wasp.Generator.ServerGenerator.WebSocketG (depsRequiredByWebSockets, genWebSockets, mkWebSocketFnImport) import qualified Wasp.Node.Version as NodeVersion +import Wasp.Project.Common (SrcTsConfigFile, waspProjectDirFromAppComponentDir) import Wasp.Project.Db (databaseUrlEnvVarName) import qualified Wasp.SemanticVersion as SV import Wasp.Util ((<++>)) @@ -67,7 +70,7 @@ genServer spec = [ genFileCopy [relfile|README.md|], genFileCopy [relfile|nodemon.json|], genRollupConfigJs spec, - genTsConfigJson, + genTsConfigJson spec, genPackageJson spec (npmDepsForWasp spec), genNpmrc, genGitignore @@ -101,17 +104,21 @@ genDotEnv spec = dotEnvInServerRootDir :: Path' (Rel ServerRootDir) File' dotEnvInServerRootDir = [relfile|.env|] -genTsConfigJson :: Generator FileDraft -genTsConfigJson = do +genTsConfigJson :: AppSpec -> Generator FileDraft +genTsConfigJson spec = do return $ C.mkTmplFdWithDstAndData (C.asTmplFile [relfile|tsconfig.json|]) (C.asServerFile [relfile|tsconfig.json|]) ( Just $ object - [ "majorNodeVersion" .= show (SV.major NodeVersion.oldestWaspSupportedNodeVersion) + [ "majorNodeVersion" .= show (SV.major NodeVersion.oldestWaspSupportedNodeVersion), + "srcTsConfigPath" .= SP.fromRelFile srcTsConfigPath ] ) + where + srcTsConfigPath :: Path' (Rel C.ServerRootDir) (File SrcTsConfigFile) = + waspProjectDirFromAppComponentDir AS.srcTsConfigPath spec genPackageJson :: AppSpec -> N.NpmDepsForWasp -> Generator FileDraft genPackageJson spec waspDependencies = do From f5790de15dc68f63067150c1ec4e1f67cb48d05b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Sodi=C4=87?= Date: Mon, 10 Feb 2025 16:01:05 +0100 Subject: [PATCH 02/14] Add comment explaining outDir to tsconfig --- waspc/data/Cli/templates/skeleton/tsconfig.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/waspc/data/Cli/templates/skeleton/tsconfig.json b/waspc/data/Cli/templates/skeleton/tsconfig.json index 506b0e2fc1..8341c73377 100644 --- a/waspc/data/Cli/templates/skeleton/tsconfig.json +++ b/waspc/data/Cli/templates/skeleton/tsconfig.json @@ -40,6 +40,9 @@ // Source 2: https://github.com/testing-library/jest-dom/issues/546#issuecomment-1889884843 "node_modules/@types" ], + // Wasp internally uses TypeScript's project references to compile the + // code. Referenced projects may not disable emit, so we must specify an + // outDir. "outDir": ".wasp/out/user" }, "include": [ From 4e2c7f924127649871d85db6c11f53863959e0a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Sodi=C4=87?= Date: Mon, 10 Feb 2025 21:40:51 +0100 Subject: [PATCH 03/14] Add clarifying comment for rootDir --- waspc/data/Generator/templates/server/tsconfig.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/waspc/data/Generator/templates/server/tsconfig.json b/waspc/data/Generator/templates/server/tsconfig.json index f624171a6d..64133aead4 100644 --- a/waspc/data/Generator/templates/server/tsconfig.json +++ b/waspc/data/Generator/templates/server/tsconfig.json @@ -12,6 +12,10 @@ // make project references work for the TS config), then I believe the // correct configuration is "rootDir": "." (the project reference should // take care of the user code), but we should double-check. + // + // Before changing this property, ensure you're aware of the implications: + // - https://github.com/wasp-lang/wasp/pull/1584#discussion_r1404019301 + // - https://github.com/wasp-lang/wasp/pull/1713/files#diff-58191eecd9cc55f71c73de89420df8b1866dce38ad35f4ef0f6f8874616eda77R32 "rootDir": ".", // Overriding this because we want to use top-level await "module": "esnext", From 6bb81dcfc8065c3d373acb275a1bccb1dc3b47e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Sodi=C4=87?= Date: Mon, 10 Feb 2025 21:41:23 +0100 Subject: [PATCH 04/14] Add clarifying comment for project references --- waspc/data/Generator/templates/react-app/tsconfig.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/waspc/data/Generator/templates/react-app/tsconfig.json b/waspc/data/Generator/templates/react-app/tsconfig.json index c529e779ec..e90681634f 100644 --- a/waspc/data/Generator/templates/react-app/tsconfig.json +++ b/waspc/data/Generator/templates/react-app/tsconfig.json @@ -1,4 +1,7 @@ { + // Wasp's TS config arrangement is based on Vite's tsconfig arrangement We + // have an extra top-level file because the two projects are independent. The + // empty files array is necessary to allow `noEmit` in referenced projects. "files": [], "references": [ { "path": "./tsconfig.app.json" }, From 6806f27302a750a834ed0aaee8619a30a5c747e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Sodi=C4=87?= Date: Mon, 10 Feb 2025 21:42:55 +0100 Subject: [PATCH 05/14] Restore ts-ignore to enable project build --- waspc/data/Generator/templates/react-app/package.json | 2 +- waspc/data/Generator/templates/react-app/vite.config.ts | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/waspc/data/Generator/templates/react-app/package.json b/waspc/data/Generator/templates/react-app/package.json index 9d87242f08..66fe4f447e 100644 --- a/waspc/data/Generator/templates/react-app/package.json +++ b/waspc/data/Generator/templates/react-app/package.json @@ -8,7 +8,7 @@ {=& devDepsChunk =}, "scripts": { "start": "vite", - "build": "tsc && vite build" + "build": "tsc --build && vite build" }, "engineStrict": true, "engines": { diff --git a/waspc/data/Generator/templates/react-app/vite.config.ts b/waspc/data/Generator/templates/react-app/vite.config.ts index 7f598b68a6..ab4224729f 100644 --- a/waspc/data/Generator/templates/react-app/vite.config.ts +++ b/waspc/data/Generator/templates/react-app/vite.config.ts @@ -6,6 +6,7 @@ import { defaultExclude } from "vitest/config" {=# customViteConfig.isDefined =} // Ignoring the TS error because we are importing a file outside of TS root dir. +// @ts-ignore {=& customViteConfig.importStatement =} const _waspUserProvidedConfig = {=& customViteConfig.importIdentifier =} {=/ customViteConfig.isDefined =} From 1921aa85e91370117eb9c48799efb60785169b5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Sodi=C4=87?= Date: Tue, 11 Feb 2025 19:04:13 +0100 Subject: [PATCH 06/14] Add default value for NODE_ENV --- waspc/data/Generator/templates/sdk/wasp/server/env.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/waspc/data/Generator/templates/sdk/wasp/server/env.ts b/waspc/data/Generator/templates/sdk/wasp/server/env.ts index 94efc3b60f..e5da1b1128 100644 --- a/waspc/data/Generator/templates/sdk/wasp/server/env.ts +++ b/waspc/data/Generator/templates/sdk/wasp/server/env.ts @@ -150,7 +150,10 @@ const serverEnvSchema = z.discriminatedUnion('NODE_ENV', [ ]) // PUBLIC API -export const env = ensureEnvSchema(process.env, serverEnvSchema) +export const env = ensureEnvSchema( + { NODE_ENV: serverDevSchema.shape.NODE_ENV.value, ...process.env }, + serverEnvSchema, +) function getRequiredEnvVarErrorMessage(featureName: string, envVarName: string) { return `${envVarName} is required when using ${featureName}` From fe484ea5bf28031f7ca7d6e8fb2d9cbc5f37f365 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Sodi=C4=87?= Date: Tue, 11 Feb 2025 19:04:40 +0100 Subject: [PATCH 07/14] Add apps for testing folder in .gitignore --- waspc/.gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/waspc/.gitignore b/waspc/.gitignore index f0b0addec0..e2c6093a0e 100644 --- a/waspc/.gitignore +++ b/waspc/.gitignore @@ -16,3 +16,6 @@ module-graph.png # macOS related .DS_Store + +# apps for testing +examples/ignored From 4d28982dd586a7894542356e902d127f1bdb7eb7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Sodi=C4=87?= Date: Wed, 12 Feb 2025 13:04:51 +0100 Subject: [PATCH 08/14] Refactor JsImport code in SdkGenerator --- .../src/Wasp/Generator/SdkGenerator/CrudG.hs | 2 +- .../Generator/SdkGenerator/EnvValidation.hs | 2 +- .../Wasp/Generator/SdkGenerator/JsImport.hs | 38 +++++++++++++++++++ .../Server/OperationsGenerator.hs | 35 ++--------------- .../SdkGenerator/WebSocketGenerator.hs | 2 +- waspc/waspc.cabal | 1 + 6 files changed, 46 insertions(+), 34 deletions(-) create mode 100644 waspc/src/Wasp/Generator/SdkGenerator/JsImport.hs diff --git a/waspc/src/Wasp/Generator/SdkGenerator/CrudG.hs b/waspc/src/Wasp/Generator/SdkGenerator/CrudG.hs index 5bf7354974..dfa6407166 100644 --- a/waspc/src/Wasp/Generator/SdkGenerator/CrudG.hs +++ b/waspc/src/Wasp/Generator/SdkGenerator/CrudG.hs @@ -21,7 +21,7 @@ import Wasp.Generator.FileDraft (FileDraft) import qualified Wasp.Generator.JsImport as GJI import Wasp.Generator.Monad (Generator) import qualified Wasp.Generator.SdkGenerator.Common as C -import Wasp.Generator.SdkGenerator.Server.OperationsGenerator (extImportToJsImport) +import Wasp.Generator.SdkGenerator.JsImport (extImportToJsImport) genCrud :: AppSpec -> Generator [FileDraft] genCrud spec = diff --git a/waspc/src/Wasp/Generator/SdkGenerator/EnvValidation.hs b/waspc/src/Wasp/Generator/SdkGenerator/EnvValidation.hs index d6d5c163d8..5125a6cac7 100644 --- a/waspc/src/Wasp/Generator/SdkGenerator/EnvValidation.hs +++ b/waspc/src/Wasp/Generator/SdkGenerator/EnvValidation.hs @@ -19,7 +19,7 @@ import Wasp.Generator.FileDraft (FileDraft) import qualified Wasp.Generator.JsImport as GJI import Wasp.Generator.Monad (Generator) import qualified Wasp.Generator.SdkGenerator.Common as C -import Wasp.Generator.SdkGenerator.Server.OperationsGenerator (extImportToJsImport) +import Wasp.Generator.SdkGenerator.JsImport (extImportToJsImport) import qualified Wasp.Generator.ServerGenerator.Common as Server import qualified Wasp.Generator.WebAppGenerator.Common as WebApp import qualified Wasp.Project.Db as Db diff --git a/waspc/src/Wasp/Generator/SdkGenerator/JsImport.hs b/waspc/src/Wasp/Generator/SdkGenerator/JsImport.hs new file mode 100644 index 0000000000..944886b9dd --- /dev/null +++ b/waspc/src/Wasp/Generator/SdkGenerator/JsImport.hs @@ -0,0 +1,38 @@ +module Wasp.Generator.SdkGenerator.JsImport + ( extImportToJsImport, + extOperationImportToImportJson, + ) +where + +import qualified Data.Aeson as Aeson +import Data.Maybe (fromJust) +import StrongPath (()) +import qualified StrongPath as SP +import qualified Wasp.AppSpec.ExtImport as EI +import Wasp.Generator.Common (dropExtensionFromImportPath) +import qualified Wasp.Generator.JsImport as GJI +import qualified Wasp.Generator.SdkGenerator.Common as C +import Wasp.JsImport (JsImport (..), JsImportPath (..)) +import qualified Wasp.JsImport as JI + +extImportToJsImport :: EI.ExtImport -> JsImport +extImportToJsImport extImport@(EI.ExtImport extImportName extImportPath) = + JsImport + { _path = ModuleImportPath importPath, + _name = importName, + _importAlias = Just $ EI.importIdentifier extImport ++ "_ext" + } + where + importPath = C.makeSdkImportPath $ dropExtensionFromImportPath $ extCodeDirP SP.castRel extImportPath + extCodeDirP = fromJust $ SP.relDirToPosix C.extSrcDirInSdkRootDir + importName = GJI.extImportNameToJsImportName extImportName + +extOperationImportToImportJson :: EI.ExtImport -> Aeson.Value +extOperationImportToImportJson = + GJI.jsImportToImportJson + . Just + . applyExtImportAlias + . extImportToJsImport + where + applyExtImportAlias jsImport = + jsImport {_importAlias = Just $ JI.getImportIdentifier jsImport ++ "_ext"} diff --git a/waspc/src/Wasp/Generator/SdkGenerator/Server/OperationsGenerator.hs b/waspc/src/Wasp/Generator/SdkGenerator/Server/OperationsGenerator.hs index e22ca0141f..6652f54389 100644 --- a/waspc/src/Wasp/Generator/SdkGenerator/Server/OperationsGenerator.hs +++ b/waspc/src/Wasp/Generator/SdkGenerator/Server/OperationsGenerator.hs @@ -1,8 +1,7 @@ {-# LANGUAGE TypeApplications #-} module Wasp.Generator.SdkGenerator.Server.OperationsGenerator - ( extImportToJsImport, - serverOperationsDirInSdkRootDir, + ( serverOperationsDirInSdkRootDir, genOperations, ) where @@ -10,25 +9,22 @@ where import Data.Aeson (object, (.=)) import qualified Data.Aeson as Aeson import Data.List (nub) -import Data.Maybe (fromJust, fromMaybe) +import Data.Maybe (fromMaybe) import StrongPath (Dir, Dir', File', Path', Rel, reldir, relfile, ()) import qualified StrongPath as SP import Wasp.AppSpec (AppSpec) import qualified Wasp.AppSpec as AS import qualified Wasp.AppSpec.Action as AS.Action -import qualified Wasp.AppSpec.ExtImport as EI import Wasp.AppSpec.Operation (getName) import qualified Wasp.AppSpec.Operation as AS.Operation import qualified Wasp.AppSpec.Query as AS.Query import Wasp.AppSpec.Valid (isAuthEnabled) -import Wasp.Generator.Common (dropExtensionFromImportPath, makeJsonWithEntityData) +import Wasp.Generator.Common (makeJsonWithEntityData) import Wasp.Generator.FileDraft (FileDraft) -import qualified Wasp.Generator.JsImport as GJI import Wasp.Generator.Monad (Generator) import Wasp.Generator.SdkGenerator.Common (SdkTemplatesDir, getOperationTypeName, mkTmplFdWithData, serverTemplatesDirInSdkTemplatesDir) import qualified Wasp.Generator.SdkGenerator.Common as C -import Wasp.JsImport (JsImport (..), JsImportPath (..)) -import qualified Wasp.JsImport as JI +import Wasp.Generator.SdkGenerator.JsImport (extOperationImportToImportJson) import Wasp.Util (toUpperFirst) data ServerOpsTemplatesDir @@ -153,26 +149,3 @@ getOperationTmplData isAuthEnabledGlobally operation = .= maybe [] (map (makeJsonWithEntityData . AS.refName)) (AS.Operation.getEntities operation), "usesAuth" .= fromMaybe isAuthEnabledGlobally (AS.Operation.getAuth operation) ] - -extOperationImportToImportJson :: EI.ExtImport -> Aeson.Value -extOperationImportToImportJson = - GJI.jsImportToImportJson - . Just - . applyExtImportAlias - . extImportToJsImport - -applyExtImportAlias :: JsImport -> JsImport -applyExtImportAlias jsImport = - jsImport {_importAlias = Just $ JI.getImportIdentifier jsImport ++ "_ext"} - -extImportToJsImport :: EI.ExtImport -> JsImport -extImportToJsImport extImport@(EI.ExtImport extImportName extImportPath) = - JsImport - { _path = ModuleImportPath importPath, - _name = importName, - _importAlias = Just $ EI.importIdentifier extImport ++ "_ext" - } - where - importPath = C.makeSdkImportPath $ dropExtensionFromImportPath $ extCodeDirP SP.castRel extImportPath - extCodeDirP = fromJust $ SP.relDirToPosix C.extSrcDirInSdkRootDir - importName = GJI.extImportNameToJsImportName extImportName diff --git a/waspc/src/Wasp/Generator/SdkGenerator/WebSocketGenerator.hs b/waspc/src/Wasp/Generator/SdkGenerator/WebSocketGenerator.hs index 8feeed8e02..2603cc8700 100644 --- a/waspc/src/Wasp/Generator/SdkGenerator/WebSocketGenerator.hs +++ b/waspc/src/Wasp/Generator/SdkGenerator/WebSocketGenerator.hs @@ -18,7 +18,7 @@ import Wasp.Generator.FileDraft (FileDraft) import qualified Wasp.Generator.JsImport as GJI import Wasp.Generator.Monad (Generator) import qualified Wasp.Generator.SdkGenerator.Common as C -import Wasp.Generator.SdkGenerator.Server.OperationsGenerator (extImportToJsImport) +import Wasp.Generator.SdkGenerator.JsImport (extImportToJsImport) import qualified Wasp.Generator.WebSocket as AS.WS genWebSockets :: AppSpec -> Generator [FileDraft] diff --git a/waspc/waspc.cabal b/waspc/waspc.cabal index f138405935..fc7af211b9 100644 --- a/waspc/waspc.cabal +++ b/waspc/waspc.cabal @@ -319,6 +319,7 @@ library Wasp.Generator.SdkGenerator.CrudG Wasp.Generator.SdkGenerator.EmailSender.Providers Wasp.Generator.SdkGenerator.EnvValidation + Wasp.Generator.SdkGenerator.JsImport Wasp.Generator.SdkGenerator.Server.AuthG Wasp.Generator.SdkGenerator.Server.OAuthG Wasp.Generator.SdkGenerator.Server.CrudG From dc71f03037e49e08685bbb37aeb3b80419dcd127 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Sodi=C4=87?= Date: Wed, 12 Feb 2025 20:55:43 +0100 Subject: [PATCH 09/14] Fix listDirectory's signature --- waspc/src/Wasp/Util/IO.hs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/waspc/src/Wasp/Util/IO.hs b/waspc/src/Wasp/Util/IO.hs index f91aaf8e0e..079994f576 100644 --- a/waspc/src/Wasp/Util/IO.hs +++ b/waspc/src/Wasp/Util/IO.hs @@ -29,7 +29,7 @@ import Data.Text (Text) import qualified Data.Text.IO as T.IO import qualified Data.Text.IO as Text.IO import qualified Path.IO as PathIO -import StrongPath (Abs, Dir, Dir', File, Path', Rel, basename, parseRelDir, parseRelFile, toFilePath, ()) +import StrongPath (Abs, Dir, File, Path', Rel, basename, parseRelDir, parseRelFile, toFilePath, ()) import qualified StrongPath as SP import qualified StrongPath.Path as SP.Path import qualified System.Directory as SD @@ -66,7 +66,7 @@ listDirectoryDeep absDirPath = do -- TODO: write tests. -- | Lists files and directories at top lvl of the directory. -listDirectory :: forall d f. Path' Abs (Dir d) -> IO ([Path' (Rel d) (File f)], [Path' (Rel d) Dir']) +listDirectory :: forall r d f. Path' Abs (Dir r) -> IO ([Path' (Rel r) (File f)], [Path' (Rel r) (Dir d)]) listDirectory absDirPath = do fpRelItemPaths <- SD.listDirectory fpAbsDirPath relFilePaths <- filterFiles fpAbsDirPath fpRelItemPaths @@ -76,12 +76,12 @@ listDirectory absDirPath = do fpAbsDirPath :: FilePath fpAbsDirPath = toFilePath absDirPath - filterFiles :: FilePath -> [FilePath] -> IO [Path' (Rel d) (File f)] + filterFiles :: FilePath -> [FilePath] -> IO [Path' (Rel r) (File f)] filterFiles absDir relItems = filterM (SD.doesFileExist . (absDir FilePath.)) relItems >>= mapM parseRelFile - filterDirs :: FilePath -> [FilePath] -> IO [Path' (Rel d) Dir'] + filterDirs :: FilePath -> [FilePath] -> IO [Path' (Rel r) (Dir d)] filterDirs absDir relItems = filterM (SD.doesDirectoryExist . (absDir FilePath.)) relItems >>= mapM parseRelDir From 808d2ed43ff06dcbdc2bbf25ecf18d452a469e53 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Sodi=C4=87?= Date: Wed, 12 Feb 2025 21:31:50 +0100 Subject: [PATCH 10/14] Improve tsconfig parse error message --- waspc/src/Wasp/Project/ExternalConfig/TsConfig.hs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/waspc/src/Wasp/Project/ExternalConfig/TsConfig.hs b/waspc/src/Wasp/Project/ExternalConfig/TsConfig.hs index 3423f9ce35..072c372042 100644 --- a/waspc/src/Wasp/Project/ExternalConfig/TsConfig.hs +++ b/waspc/src/Wasp/Project/ExternalConfig/TsConfig.hs @@ -7,7 +7,7 @@ import Control.Arrow (left) import Control.Monad.Except (ExceptT (ExceptT), runExceptT, throwError) import qualified Data.ByteString.Lazy.UTF8 as BS import Data.Either.Extra (maybeToEither) -import StrongPath (Abs, Dir, File, Path', Rel, toFilePath) +import StrongPath (Abs, Dir, File, Path', Rel, basename, fromRelFile, toFilePath) import qualified Wasp.ExternalConfig.TsConfig as T import Wasp.Generator.ExternalConfig.TsConfig (validateSrcTsConfig) import Wasp.Project.Common @@ -15,6 +15,7 @@ import Wasp.Project.Common WaspProjectDir, findFileInWaspProjectDir, ) +import Wasp.Util (indent) import qualified Wasp.Util.IO as IOUtil import Wasp.Util.Json (parseJsonWithComments) @@ -37,4 +38,7 @@ readTsConfigFile :: Path' Abs (File f) -> IO (Either String T.TsConfig) readTsConfigFile tsConfigFile = do tsConfigContent <- IOUtil.readFileBytes tsConfigFile parseResult <- parseJsonWithComments . BS.toString $ tsConfigContent - return $ left ("Failed to parse tsconfig file: " ++) parseResult + return $ left ((errorMessagePrefix ++) . indent 2) parseResult + where + errorMessagePrefix = "Failed to parse '" ++ baseTsConfigFilePath ++ "':\n" + baseTsConfigFilePath = fromRelFile (basename tsConfigFile) From a56e22615883692ebe507df5e87488c8e83131fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Sodi=C4=87?= Date: Wed, 12 Feb 2025 21:35:35 +0100 Subject: [PATCH 11/14] Improve TS config validation messages --- waspc/src/Wasp/Generator/ExternalConfig/TsConfig.hs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/waspc/src/Wasp/Generator/ExternalConfig/TsConfig.hs b/waspc/src/Wasp/Generator/ExternalConfig/TsConfig.hs index 4790700385..cb62318327 100644 --- a/waspc/src/Wasp/Generator/ExternalConfig/TsConfig.hs +++ b/waspc/src/Wasp/Generator/ExternalConfig/TsConfig.hs @@ -73,7 +73,7 @@ validateFieldValue fullyQualifiedFieldName expectedValue actualValue = unwords [ "Invalid value for the", "\"" ++ show fullyQualifiedFieldName ++ "\"", - "field in tsconfig.json, you must set it to:", + "field in TS config, you must set it to:", showAsJsValue expected ++ "." ] @@ -81,13 +81,13 @@ validateFieldValue fullyQualifiedFieldName expectedValue actualValue = unwords [ "The", "\"" ++ show fullyQualifiedFieldName ++ "\"", - "field in tsconfig.json must be unset." + "field in TS Config must be left unspecified." ] makeMissingFieldErrorMessage expected = unwords [ "The", "\"" ++ show fullyQualifiedFieldName ++ "\"", - "field is missing in tsconfig.json, you must set it to:", + "field is missing in TS config, you must set it to:", showAsJsValue expected ++ "." ] From 1890fca631efed65a639c286acf1aac713c1b6cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Sodi=C4=87?= Date: Wed, 12 Feb 2025 22:33:58 +0100 Subject: [PATCH 12/14] Revert "Restore ts-ignore to enable project build" This reverts commit 6806f27302a750a834ed0aaee8619a30a5c747e7. --- waspc/data/Generator/templates/react-app/package.json | 2 +- waspc/data/Generator/templates/react-app/vite.config.ts | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/waspc/data/Generator/templates/react-app/package.json b/waspc/data/Generator/templates/react-app/package.json index 66fe4f447e..9d87242f08 100644 --- a/waspc/data/Generator/templates/react-app/package.json +++ b/waspc/data/Generator/templates/react-app/package.json @@ -8,7 +8,7 @@ {=& devDepsChunk =}, "scripts": { "start": "vite", - "build": "tsc --build && vite build" + "build": "tsc && vite build" }, "engineStrict": true, "engines": { diff --git a/waspc/data/Generator/templates/react-app/vite.config.ts b/waspc/data/Generator/templates/react-app/vite.config.ts index 048236b7db..620d22ebf6 100644 --- a/waspc/data/Generator/templates/react-app/vite.config.ts +++ b/waspc/data/Generator/templates/react-app/vite.config.ts @@ -7,7 +7,6 @@ import { detectServerImports } from "./vite/detectServerImports" {=# customViteConfig.isDefined =} // Ignoring the TS error because we are importing a file outside of TS root dir. -// @ts-ignore {=& customViteConfig.importStatement =} const _waspUserProvidedConfig = {=& customViteConfig.importIdentifier =} {=/ customViteConfig.isDefined =} From 6e9ae10cae80e0a182d558bc9f23256390f17259 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Sodi=C4=87?= Date: Wed, 12 Feb 2025 22:39:16 +0100 Subject: [PATCH 13/14] Revert "Add default value for NODE_ENV" This reverts commit 1921aa85e91370117eb9c48799efb60785169b5c. --- waspc/data/Generator/templates/sdk/wasp/server/env.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/waspc/data/Generator/templates/sdk/wasp/server/env.ts b/waspc/data/Generator/templates/sdk/wasp/server/env.ts index e5da1b1128..94efc3b60f 100644 --- a/waspc/data/Generator/templates/sdk/wasp/server/env.ts +++ b/waspc/data/Generator/templates/sdk/wasp/server/env.ts @@ -150,10 +150,7 @@ const serverEnvSchema = z.discriminatedUnion('NODE_ENV', [ ]) // PUBLIC API -export const env = ensureEnvSchema( - { NODE_ENV: serverDevSchema.shape.NODE_ENV.value, ...process.env }, - serverEnvSchema, -) +export const env = ensureEnvSchema(process.env, serverEnvSchema) function getRequiredEnvVarErrorMessage(featureName: string, envVarName: string) { return `${envVarName} is required when using ${featureName}` From bb481f916aa95f4cf4b05d2eaa261fb345b3c1a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Sodi=C4=87?= Date: Wed, 12 Feb 2025 22:56:08 +0100 Subject: [PATCH 14/14] Add srcTsConfigPath to tests to silence warnings --- waspc/test/AppSpec/ValidTest.hs | 4 +++- waspc/test/Generator/WebAppGeneratorTest.hs | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/waspc/test/AppSpec/ValidTest.hs b/waspc/test/AppSpec/ValidTest.hs index 7de28824ab..5fbc092722 100644 --- a/waspc/test/AppSpec/ValidTest.hs +++ b/waspc/test/AppSpec/ValidTest.hs @@ -6,6 +6,7 @@ import qualified Data.Map as M import Data.Maybe (fromJust) import Fixtures (systemSPRoot) import NeatInterpolation (trimming) +import StrongPath (relfile) import qualified StrongPath as SP import Test.Tasty.Hspec import qualified Util.Prisma as Util @@ -489,7 +490,8 @@ spec_AppSpecValid = do AS.userDockerfileContents = Nothing, AS.configFiles = [], AS.devDatabaseUrl = Nothing, - AS.customViteConfigPath = Nothing + AS.customViteConfigPath = Nothing, + AS.srcTsConfigPath = [relfile|tsconfig.json|] } getPrismaSchemaWithConfig restOfPrismaSource = diff --git a/waspc/test/Generator/WebAppGeneratorTest.hs b/waspc/test/Generator/WebAppGeneratorTest.hs index 72614b05f5..fee58c56d3 100644 --- a/waspc/test/Generator/WebAppGeneratorTest.hs +++ b/waspc/test/Generator/WebAppGeneratorTest.hs @@ -2,6 +2,7 @@ module Generator.WebAppGeneratorTest where import qualified Data.Map as M import Fixtures +import StrongPath (relfile) import qualified StrongPath as SP import System.FilePath (()) import Test.Tasty.Hspec @@ -64,7 +65,8 @@ spec_WebAppGenerator = do AS.userDockerfileContents = Nothing, AS.configFiles = [], AS.devDatabaseUrl = Nothing, - AS.customViteConfigPath = Nothing + AS.customViteConfigPath = Nothing, + AS.srcTsConfigPath = [relfile|tsconfig.json|] } describe "genWebApp" $ do