Skip to content

Commit

Permalink
First versino of code that compiles and passes tests.
Browse files Browse the repository at this point in the history
  • Loading branch information
Martinsos committed Oct 24, 2023
1 parent dd52280 commit fe65c13
Show file tree
Hide file tree
Showing 8 changed files with 81 additions and 67 deletions.
7 changes: 5 additions & 2 deletions waspc/cli/exe/Main.hs
Original file line number Diff line number Diff line change
Expand Up @@ -73,10 +73,13 @@ main = withUtf8 . (`E.catch` handleInternalErrors) $ do
-- to be more robust than trying to only check for commands that require it.
-- See https://github.com/wasp-lang/wasp/issues/1134#issuecomment-1554065668
NodeVersion.getAndCheckNodeVersion >>= \case
Left errorMsg -> do
NodeVersion.VersionCheckFail errorMsg -> do
cliSendMessage $ Message.Failure "Node requirement not met" errorMsg
exitFailure
Right _ -> pure ()
NodeVersion.VersionCheckSuccess maybeWarning _version ->
case maybeWarning of
Just warnMsg -> cliSendMessage $ Message.Warning "Node version warning" warnMsg
Nothing -> pure ()

case commandCall of
Command.Call.New newArgs -> runCommand $ createNewProject newArgs
Expand Down
5 changes: 3 additions & 2 deletions waspc/data/Generator/templates/server/tsconfig.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
{{={= =}=}}
{
"extends": "@tsconfig/node18/tsconfig.json",
"extends": "@tsconfig/node{= majorNodeVersion =}/tsconfig.json",
"compilerOptions": {
// Overriding this until we implement more complete TypeScript support.
"strict": false,
Expand All @@ -8,7 +9,7 @@
"target": "es2017",
// Enable source map for debugging
"sourceMap": true,
// The remaining settings should match node18/tsconfig.json, but I kept
// The remaining settings should match the extended nodeXY/tsconfig.json, but I kept
// them here to be explicit.

// Enable default imports in TypeScript.
Expand Down
4 changes: 2 additions & 2 deletions waspc/src/Wasp/Generator/DockerGenerator.hs
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ import Wasp.Generator.FileDraft (FileDraft (..), createTemplateFileDraft)
import qualified Wasp.Generator.FileDraft.TemplateFileDraft as TmplFD
import Wasp.Generator.Monad (Generator, GeneratorError, runGenerator)
import Wasp.Generator.Templates (TemplatesDir, compileAndRenderTemplate)
import Wasp.Node.Version (latestMajorNodeVersion)
import qualified Wasp.Node.Version as V
import qualified Wasp.SemanticVersion as SV
import Wasp.Util (getEnvVarDefinition)

Expand All @@ -49,7 +49,7 @@ genDockerfile spec = do
[ "usingPrisma" .= not (null $ AS.getDecls @AS.Entity.Entity spec),
"serverPrismaClientOutputDirEnv" .= getEnvVarDefinition serverPrismaClientOutputDirEnv,
"dbSchemaFileFromServerDir" .= SP.fromRelFile dbSchemaFileFromServerDir,
"nodeMajorVersion" .= show (SV.major latestMajorNodeVersion),
"nodeMajorVersion" .= show (SV.major V.oldestWaspSupportedNodeVersion),
"userDockerfile" .= fromMaybe "" (AS.userDockerfileContents spec)
]
)
Expand Down
10 changes: 6 additions & 4 deletions waspc/src/Wasp/Generator/Job/Process.hs
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ import qualified System.Info
import qualified System.Process as P
import UnliftIO.Exception (bracket)
import qualified Wasp.Generator.Job as J
import qualified Wasp.Node.Version as NodeVersion
import qualified Wasp.Node.Version as V

-- TODO:
-- Switch from Data.Conduit.Process to Data.Conduit.Process.Typed.
Expand Down Expand Up @@ -96,9 +96,11 @@ runNodeCommandAsJob = runNodeCommandAsJobWithExtraEnv []

runNodeCommandAsJobWithExtraEnv :: [(String, String)] -> Path' Abs (Dir a) -> String -> [String] -> J.JobType -> J.Job
runNodeCommandAsJobWithExtraEnv extraEnvVars fromDir command args jobType chan =
NodeVersion.getAndCheckNodeVersion >>= \case
Left errorMsg -> exitWithError (ExitFailure 1) (T.pack errorMsg)
Right _ -> do
V.getAndCheckNodeVersion >>= \case
V.VersionCheckFail errorMsg -> exitWithError (ExitFailure 1) (T.pack errorMsg)
-- We don't print the warning message here because `wasp CLI` already likely printed it,
-- so it would be too much noise.
V.VersionCheckSuccess _maybeWarning _version -> do
envVars <- getAllEnvVars
let nodeCommandProcess = (P.proc command args) {P.env = Just envVars, P.cwd = Just $ SP.fromAbsDir fromDir}
runProcessAsJob nodeCommandProcess jobType chan
Expand Down
22 changes: 18 additions & 4 deletions waspc/src/Wasp/Generator/ServerGenerator.hs
Original file line number Diff line number Diff line change
Expand Up @@ -74,8 +74,8 @@ genServer :: AppSpec -> Generator [FileDraft]
genServer spec =
sequence
[ genFileCopy [relfile|README.md|],
genFileCopy [relfile|tsconfig.json|],
genFileCopy [relfile|nodemon.json|],
genTsConfigJson,
genPackageJson spec (npmDepsForWasp spec),
genNpmrc,
genGitignore
Expand Down Expand Up @@ -116,6 +116,18 @@ genDotEnv spec =
dotEnvInServerRootDir :: Path' (Rel ServerRootDir) File'
dotEnvInServerRootDir = [relfile|.env|]

genTsConfigJson :: Generator FileDraft
genTsConfigJson = do
return $
C.mkTmplFdWithDstAndData
(C.asTmplFile [relfile|tsconfig.json|])
(C.asServerFile [relfile|tsconfig.json|])
( Just $
object
[ "majorNodeVersion" .= show (major NodeVersion.oldestWaspSupportedNodeVersion)
]
)

genPackageJson :: AppSpec -> N.NpmDepsForWasp -> Generator FileDraft
genPackageJson spec waspDependencies = do
combinedDependencies <- N.genNpmDepsForPackage spec waspDependencies
Expand All @@ -127,7 +139,7 @@ genPackageJson spec waspDependencies = do
object
[ "depsChunk" .= N.getDependenciesPackageJsonEntry combinedDependencies,
"devDepsChunk" .= N.getDevDependenciesPackageJsonEntry combinedDependencies,
"nodeVersionRange" .= show NodeVersion.nodeVersionRange,
"nodeVersionRange" .= (">=" <> show NodeVersion.oldestWaspSupportedNodeVersion),
"startProductionScript"
.= ( (if hasEntities then "npm run db-migrate-prod && " else "")
++ "NODE_ENV=production npm run start"
Expand Down Expand Up @@ -179,12 +191,14 @@ npmDepsForWasp spec =
("typescript", "^5.1.0"),
("@types/express", "^4.17.13"),
("@types/express-serve-static-core", "^4.17.13"),
("@types/node", "^18.11.9"),
("@tsconfig/node" ++ show (major NodeVersion.latestMajorNodeVersion), "^1.0.1"),
("@types/node", "^" <> majorNodeVersionStr <> ".0.0"), -- TODO: This is challenging hm, can we do something better?
("@tsconfig/node" <> majorNodeVersionStr, "^1.0.1"),
("@types/uuid", "^9.0.0"),
("@types/cors", "^2.8.5")
]
}
where
majorNodeVersionStr = show (major NodeVersion.oldestWaspSupportedNodeVersion)

genNpmrc :: Generator FileDraft
genNpmrc =
Expand Down
2 changes: 1 addition & 1 deletion waspc/src/Wasp/Generator/WebAppGenerator.hs
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,7 @@ genPackageJson spec waspDependencies = do
[ "appName" .= (fst (getApp spec) :: String),
"depsChunk" .= N.getDependenciesPackageJsonEntry combinedDependencies,
"devDepsChunk" .= N.getDevDependenciesPackageJsonEntry combinedDependencies,
"nodeVersionRange" .= show NodeVersion.nodeVersionRange
"nodeVersionRange" .= (">=" <> show NodeVersion.oldestWaspSupportedNodeVersion)
]
)

Expand Down
87 changes: 40 additions & 47 deletions waspc/src/Wasp/Node/Version.hs
Original file line number Diff line number Diff line change
@@ -1,10 +1,7 @@
module Wasp.Node.Version
( getAndCheckNodeVersion,
getNodeVersion,
nodeVersionRange,
latestMajorNodeVersion,
waspNodeRequirementMessage,
makeNodeVersionMismatchMessage,
VersionCheckResult (..),
oldestWaspSupportedNodeVersion,
)
where

Expand All @@ -16,26 +13,53 @@ import qualified Text.Regex.TDFA as R
import qualified Wasp.SemanticVersion as SV
import Wasp.Util (indent)

-- | Wasp supports any node version equal or greater to this version.
-- | We usually keep this one equal to the latest LTS.
oldestWaspSupportedNodeVersion :: SV.Version
oldestWaspSupportedNodeVersion = SV.Version 20 8 1

data VersionCheckResult
= VersionCheckFail !ErrorMessage
| VersionCheckSuccess !(Maybe WarningMessage) !SV.Version

type WarningMessage = String

type ErrorMessage = String

-- | Gets the installed node version, if any is installed, and checks that it
-- meets Wasp's version requirement.
--
-- Returns a string representing the error
-- condition if node's version could not be found or if the version does not
-- meet the requirements.
getAndCheckNodeVersion :: IO (Either String SV.Version)
getAndCheckNodeVersion :: IO VersionCheckResult
getAndCheckNodeVersion =
getNodeVersion >>= \case
Left errorMsg -> return $ Left errorMsg
Right nodeVersion ->
if SV.isVersionInRange nodeVersion nodeVersionRange
then return $ Right nodeVersion
else return $ Left $ makeNodeVersionMismatchMessage nodeVersion
Left errorMsg -> return $ VersionCheckFail errorMsg
Right userNodeVersion ->
return $
if SV.isVersionInRange userNodeVersion $ SV.Range [SV.gte oldestWaspSupportedNodeVersion]
then VersionCheckSuccess Nothing userNodeVersion
else VersionCheckFail $ makeNodeVersionMismatchMessage userNodeVersion

makeNodeVersionMismatchMessage :: SV.Version -> String
makeNodeVersionMismatchMessage nodeVersion =
unlines
[ unwords
[ "Your Node version does not meet Wasp's requirements!",
"You are running Node " ++ show nodeVersion ++ "."
],
waspNodeRequirementMessage
]

waspNodeRequirementMessage :: String
waspNodeRequirementMessage =
unwords
[ "Wasp requires Node >=" ++ show oldestWaspSupportedNodeVersion ++ " to be installed and in PATH.",
"Check Wasp documentation for more details: https://wasp-lang.dev/docs/quick-start#requirements."
]

-- | Gets the installed node version, if any is installed, and returns it.
--
-- Returns a string representing the error condition if node's version could
-- not be found.
getNodeVersion :: IO (Either String SV.Version)
getNodeVersion :: IO (Either ErrorMessage SV.Version)
getNodeVersion = do
-- Node result is one of:
-- 1. @Left processError@, when an error occurs trying to run the process
Expand Down Expand Up @@ -90,34 +114,3 @@ makeNodeUnknownErrorMessage err =
[ "An unknown error occured while trying to run `node --version`:",
indent 2 $ show err
]

waspNodeRequirementMessage :: String
waspNodeRequirementMessage =
unwords
[ "Wasp requires Node " ++ show nodeVersionRange ++ " to be installed and in PATH.",
"Check Wasp documentation for more details: https://wasp-lang.dev/docs/quick-start#requirements."
]

nodeVersionRange :: SV.Range
nodeVersionRange = SV.Range [SV.backwardsCompatibleWith latestNodeLTSVersion]

latestNodeLTSVersion :: SV.Version
latestNodeLTSVersion = SV.Version 18 12 0

-- | Latest concrete major node version supported by the nodeVersionRange, and
-- therefore by Wasp.
-- Here we assume that nodeVersionRange is using latestNodeLTSVersion as its basis.
-- TODO: instead of making assumptions, extract the latest major node version
-- directly from the nodeVersionRange.
latestMajorNodeVersion :: SV.Version
latestMajorNodeVersion = latestNodeLTSVersion

makeNodeVersionMismatchMessage :: SV.Version -> String
makeNodeVersionMismatchMessage nodeVersion =
unlines
[ unwords
[ "Your Node version does not meet Wasp's requirements!",
"You are running Node " ++ show nodeVersion ++ "."
],
waspNodeRequirementMessage
]
11 changes: 6 additions & 5 deletions waspc/src/Wasp/NodePackageFFI.hs
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ import System.IO (hPutStrLn, stderr)
import qualified System.Process as P
import Wasp.Data (DataDir)
import qualified Wasp.Data as Data
import Wasp.Node.Version (getAndCheckNodeVersion)
import qualified Wasp.Node.Version as V

data Package
= DeployPackage
Expand Down Expand Up @@ -53,10 +53,11 @@ scriptInPackageDir = [relfile|dist/index.js|]
-- the dependencies.
getPackageProcessOptions :: Package -> [String] -> IO P.CreateProcess
getPackageProcessOptions package args = do
getAndCheckNodeVersion >>= \case
Right _ -> pure ()
Left errorMsg -> do
-- Exit if valid node version is not installed
V.getAndCheckNodeVersion >>= \case
-- We don't print the warning message here because `wasp CLI` already likely printed it,
-- so it would be too much noise.
V.VersionCheckSuccess _maybeWarning _version -> pure ()
V.VersionCheckFail errorMsg -> do
hPutStrLn stderr errorMsg
exitFailure
packageDir <- getPackageDir package
Expand Down

0 comments on commit fe65c13

Please sign in to comment.