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 1/8] 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 2/8] 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 3/8] 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 4/8] 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 5/8] 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 6/8] 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 7/8] 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 8/8] 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