Separate types so it's impossible to do the wrong thing

Have the naming reflect all of that
This commit is contained in:
Martijn Faassen 2022-02-18 12:43:51 +01:00
parent f0815466bf
commit de604a3982
6 changed files with 187 additions and 171 deletions

View File

@ -23,22 +23,22 @@ deps =
]
++ printDeps
"Server dependencies:"
( N.dependencies ServerGenerator.waspNpmDependencies
( N.waspDependencies ServerGenerator.npmDepsForWasp
)
++ [""]
++ printDeps
"Server devDependencies:"
( N.devDependencies ServerGenerator.waspNpmDependencies
( N.waspDevDependencies ServerGenerator.npmDepsForWasp
)
++ [""]
++ printDeps
"Webapp dependencies:"
( N.dependencies WebAppGenerator.waspNpmDependencies
( N.waspDependencies WebAppGenerator.npmDepsForWasp
)
++ [""]
++ printDeps
"Webapp devDependencies:"
( N.devDependencies WebAppGenerator.waspNpmDependencies
( N.waspDevDependencies WebAppGenerator.npmDepsForWasp
)
printDeps :: String -> [AS.Dependency.Dependency] -> [String]

View File

@ -4,13 +4,15 @@ module Wasp.Generator.NpmDependencies
( DependencyConflictError (..),
getDependenciesPackageJsonEntry,
getDevDependenciesPackageJsonEntry,
combineNpmDependencies,
NpmDependencies (..),
NpmDependenciesError (..),
combineNpmDepsForPackage,
NpmDepsForPackage (..),
NpmDepsForPackageError (..),
conflictErrorToMessage,
genNpmDependencies,
FullStackNpmDependencies,
buildFullStackNpmDependencies,
genNpmDepsForPackage,
NpmDepsForFullStack,
NpmDepsForWasp (..),
NpmDepsForUser (..),
buildNpmDepsForFullStack,
)
where
@ -26,29 +28,41 @@ import qualified Wasp.AppSpec.App as AS.App
import qualified Wasp.AppSpec.App.Dependency as D
import Wasp.Generator.Monad (Generator, GeneratorError (..), logAndThrowGeneratorError)
data FullStackNpmDependencies = FullStackNpmDependencies
{ serverDependencies :: NpmDependencies,
webAppDependencies :: NpmDependencies
data NpmDepsForFullStack = NpmDepsForFullStack
{ npmDepsForServer :: NpmDepsForPackage,
npmDepsForWebApp :: NpmDepsForPackage
}
deriving (Show, Eq, Generic)
instance ToJSON FullStackNpmDependencies where
instance ToJSON NpmDepsForFullStack where
toEncoding = genericToEncoding defaultOptions
instance FromJSON FullStackNpmDependencies
instance FromJSON NpmDepsForFullStack
data NpmDependencies = NpmDependencies
data NpmDepsForPackage = NpmDepsForPackage
{ dependencies :: [D.Dependency],
devDependencies :: [D.Dependency]
}
deriving (Show, Generic)
instance ToJSON NpmDependencies where
data NpmDepsForWasp = NpmDepsForWasp
{ waspDependencies :: [D.Dependency],
waspDevDependencies :: [D.Dependency]
}
deriving (Show)
data NpmDepsForUser = NpmDepsForUser
{ userDependencies :: [D.Dependency],
userDevDependencies :: [D.Dependency]
}
deriving (Show)
instance ToJSON NpmDepsForPackage where
toEncoding = genericToEncoding defaultOptions
instance FromJSON NpmDependencies
instance FromJSON NpmDepsForPackage
data NpmDependenciesError = NpmDependenciesError
data NpmDepsForPackageError = NpmDepsForPackageError
{ dependenciesConflictErrors :: [DependencyConflictError],
devDependenciesConflictErrors :: [DependencyConflictError]
}
@ -60,11 +74,11 @@ data DependencyConflictError = DependencyConflictError
}
deriving (Show, Eq)
-- | Generate a NpmDependencies by combining wasp dependencies with user dependencies
-- | Generate a NpmDepsForPackage by combining wasp dependencies with user dependencies
-- derived from AppSpec, or if there are conflicts, fail with error messages.
genNpmDependencies :: AppSpec -> NpmDependencies -> Generator NpmDependencies
genNpmDependencies spec waspDependencies =
case combineNpmDependencies waspDependencies (getUserNpmDependencies spec) of
genNpmDepsForPackage :: AppSpec -> NpmDepsForWasp -> Generator NpmDepsForPackage
genNpmDepsForPackage spec npmDepsForWasp =
case combineNpmDepsForPackage npmDepsForWasp (getUserNpmDepsForPackage spec) of
Right deps -> return deps
Left conflictErrorDeps ->
logAndThrowGeneratorError $
@ -76,27 +90,27 @@ genNpmDependencies spec waspDependencies =
++ devDependenciesConflictErrors conflictErrorDeps
)
buildFullStackNpmDependencies :: AppSpec -> NpmDependencies -> NpmDependencies -> Either String FullStackNpmDependencies
buildFullStackNpmDependencies spec serverWaspDependencies webAppWaspDependencies =
case (combinedServerDependencies, combinedWebAppDependencies) of
buildNpmDepsForFullStack :: AppSpec -> NpmDepsForWasp -> NpmDepsForWasp -> Either String NpmDepsForFullStack
buildNpmDepsForFullStack spec forServer forWebApp =
case (combinedServerDeps, combinedWebAppDeps) of
(Right a, Right b) ->
Right
FullStackNpmDependencies
{ serverDependencies = a,
webAppDependencies = b
NpmDepsForFullStack
{ npmDepsForServer = a,
npmDepsForWebApp = b
}
_ -> Left "Could not construct npm dependencies due to a previously reported conflict."
where
userDependencies = getUserNpmDependencies spec
combinedServerDependencies = combineNpmDependencies serverWaspDependencies userDependencies
combinedWebAppDependencies = combineNpmDependencies webAppWaspDependencies userDependencies
userDeps = getUserNpmDepsForPackage spec
combinedServerDeps = combineNpmDepsForPackage forServer userDeps
combinedWebAppDeps = combineNpmDepsForPackage forWebApp userDeps
getUserNpmDependencies :: AppSpec -> NpmDependencies
getUserNpmDependencies spec =
NpmDependencies
{ dependencies = fromMaybe [] $ AS.App.dependencies $ snd $ AS.getApp spec,
getUserNpmDepsForPackage :: AppSpec -> NpmDepsForUser
getUserNpmDepsForPackage spec =
NpmDepsForUser
{ userDependencies = fromMaybe [] $ AS.App.dependencies $ snd $ AS.getApp spec,
-- Should we allow user devDependencies? https://github.com/wasp-lang/wasp/issues/456
devDependencies = []
userDevDependencies = []
}
conflictErrorToMessage :: DependencyConflictError -> String
@ -110,38 +124,38 @@ conflictErrorToMessage DependencyConflictError {waspDependency = waspDep, userDe
++ " the one wasp is using: "
++ D.version waspDep
-- NpmDependencies are equal if their sorted dependencies
-- NpmDepsForPackage are equal if their sorted dependencies
-- are equal.
instance Eq NpmDependencies where
instance Eq NpmDepsForPackage where
(==) a b = sortedDependencies a == sortedDependencies b
sortedDependencies :: NpmDependencies -> ([D.Dependency], [D.Dependency])
sortedDependencies :: NpmDepsForPackage -> ([D.Dependency], [D.Dependency])
sortedDependencies a = (sort $ dependencies a, sort $ devDependencies a)
-- | Takes wasp npm dependencies and user npm dependencies and figures out how
-- to combine them together, returning (Right) a new NpmDependencies
-- that combines them, and on error (Left), returns a NpmDependenciesError
-- to combine them together, returning (Right) a new NpmDepsForPackage
-- that combines them, and on error (Left), returns a NpmDepsForPackageError
-- which describes which dependencies are in conflict.
combineNpmDependencies :: NpmDependencies -> NpmDependencies -> Either NpmDependenciesError NpmDependencies
combineNpmDependencies waspDependencies userDependencies =
combineNpmDepsForPackage :: NpmDepsForWasp -> NpmDepsForUser -> Either NpmDepsForPackageError NpmDepsForPackage
combineNpmDepsForPackage npmDepsForWasp npmDepsForUser =
if null conflictErrors && null devConflictErrors
then
Right $
NpmDependencies
{ dependencies = dependencies waspDependencies ++ remainingUserDeps,
devDependencies = devDependencies waspDependencies ++ remainingUserDevDeps
NpmDepsForPackage
{ dependencies = waspDependencies npmDepsForWasp ++ remainingUserDeps,
devDependencies = waspDevDependencies npmDepsForWasp ++ remainingUserDevDeps
}
else
Left $
NpmDependenciesError
NpmDepsForPackageError
{ dependenciesConflictErrors = conflictErrors,
devDependenciesConflictErrors = devConflictErrors
}
where
waspDepsByName = makeDepsByName $ dependencies waspDependencies
waspDevDepsByName = makeDepsByName $ devDependencies waspDependencies
userDepsByName = makeDepsByName $ dependencies userDependencies
userDevDepsByName = makeDepsByName $ devDependencies userDependencies
waspDepsByName = makeDepsByName $ waspDependencies npmDepsForWasp
waspDevDepsByName = makeDepsByName $ waspDevDependencies npmDepsForWasp
userDepsByName = makeDepsByName $ userDependencies npmDepsForUser
userDevDepsByName = makeDepsByName $ userDevDependencies npmDepsForUser
allWaspDepsByName = waspDepsByName `Map.union` waspDevDepsByName
conflictErrors = determineConflictErrors allWaspDepsByName userDepsByName
devConflictErrors = determineConflictErrors allWaspDepsByName userDevDepsByName
@ -176,11 +190,11 @@ makeDepsByName :: [D.Dependency] -> DepsByName
makeDepsByName = Map.fromList . fmap (\d -> (D.name d, d))
-- | Construct dependencies entry in package.json
getDependenciesPackageJsonEntry :: NpmDependencies -> String
getDependenciesPackageJsonEntry :: NpmDepsForPackage -> String
getDependenciesPackageJsonEntry = dependenciesToPackageJsonEntryWithKey "dependencies" . dependencies
-- | Construct devDependencies entry in package.json
getDevDependenciesPackageJsonEntry :: NpmDependencies -> String
getDevDependenciesPackageJsonEntry :: NpmDepsForPackage -> String
getDevDependenciesPackageJsonEntry = dependenciesToPackageJsonEntryWithKey "devDependencies" . devDependencies
dependenciesToPackageJsonEntryWithKey :: String -> [D.Dependency] -> String

View File

@ -43,30 +43,31 @@ import qualified Wasp.Generator.WebAppGenerator.Setup as WebAppSetup
-- from the record of what's in package.json.
ensureNpmInstall :: AppSpec -> Path' Abs (Dir ProjectRootDir) -> IO ([GeneratorWarning], [GeneratorError])
ensureNpmInstall spec dstDir = do
let errorOrFullStackNpmDependencies = N.buildFullStackNpmDependencies spec SG.waspNpmDependencies WG.waspNpmDependencies
case errorOrFullStackNpmDependencies of
let errorOrNpmDepsForFullStack = N.buildNpmDepsForFullStack spec SG.npmDepsForWasp WG.npmDepsForWasp
case errorOrNpmDepsForFullStack of
Left message -> return ([], [GenericGeneratorError ("npm install failed: " ++ message)])
Right fullStackNpmDependencies -> do
needed <- isNpmInstallDifferent fullStackNpmDependencies dstDir
Right npmDepsForFullStack -> do
needed <- isNpmInstallDifferent npmDepsForFullStack dstDir
if needed
then installNpmDependenciesWithInstallRecord fullStackNpmDependencies dstDir
then installNpmDependenciesWithInstallRecord npmDepsForFullStack dstDir
else return ([], [])
-- Run npm install for desired AppSpec dependencies, recording what we installed
-- Installation may fail, in which the installation record is removed.
installNpmDependenciesWithInstallRecord :: N.FullStackNpmDependencies -> Path' Abs (Dir ProjectRootDir) -> IO ([GeneratorWarning], [GeneratorError])
installNpmDependenciesWithInstallRecord appSpecFullStackNpmDependencies dstDir = do
installNpmDependenciesWithInstallRecord :: N.NpmDepsForFullStack -> Path' Abs (Dir ProjectRootDir) -> IO ([GeneratorWarning], [GeneratorError])
installNpmDependenciesWithInstallRecord npmDepsForFullStack dstDir = do
-- in case anything fails during installation that would leave node modules in
-- a broken state, we remove the file before we start npm install
fileExists <- doesFileExist dependenciesInstalledFp
when fileExists $ removeFile dependenciesInstalledFp
-- now actually do the installation
npmInstallResult <- installNpmDependencies dstDir
case npmInstallResult of
Left npmInstallError -> do
return ([], [GenericGeneratorError $ "npm install failed: " ++ npmInstallError])
Right () -> do
-- on successful npm install, record what we installed
B.writeFile dependenciesInstalledFp (Aeson.encode appSpecFullStackNpmDependencies)
B.writeFile dependenciesInstalledFp (Aeson.encode npmDepsForFullStack)
return ([], [])
where
dependenciesInstalledFp = SP.fromAbsFile $ dstDir </> installedFullStackNpmDependenciesFileInProjectRootDir
@ -74,7 +75,7 @@ installNpmDependenciesWithInstallRecord appSpecFullStackNpmDependencies dstDir =
-- Returns True only if the stored full stack dependencies are different from the
-- the full stack dependencies in the argument. If an installation record is missing
-- then it's always different.
isNpmInstallDifferent :: N.FullStackNpmDependencies -> Path' Abs (Dir ProjectRootDir) -> IO Bool
isNpmInstallDifferent :: N.NpmDepsForFullStack -> Path' Abs (Dir ProjectRootDir) -> IO Bool
isNpmInstallDifferent appSpecFullStackNpmDependencies dstDir = do
installedFullStackNpmDependencies <- loadInstalledFullStackNpmDependencies dstDir
return $ Just appSpecFullStackNpmDependencies /= installedFullStackNpmDependencies
@ -84,14 +85,14 @@ installedFullStackNpmDependenciesFileInProjectRootDir :: Path' (Rel ProjectRootD
installedFullStackNpmDependenciesFileInProjectRootDir = [relfile|installedFullStackNpmDependencies.json|]
-- Load the record of the dependencies we installed from disk.
loadInstalledFullStackNpmDependencies :: Path' Abs (Dir ProjectRootDir) -> IO (Maybe N.FullStackNpmDependencies)
loadInstalledFullStackNpmDependencies :: Path' Abs (Dir ProjectRootDir) -> IO (Maybe N.NpmDepsForFullStack)
loadInstalledFullStackNpmDependencies dstDir = do
let dependenciesInstalledFp = SP.fromAbsFile $ dstDir </> installedFullStackNpmDependenciesFileInProjectRootDir
fileExists <- doesFileExist dependenciesInstalledFp
if fileExists
then do
fileContents <- B.readFile dependenciesInstalledFp
return (Aeson.decode fileContents :: Maybe N.FullStackNpmDependencies)
return (Aeson.decode fileContents :: Maybe N.NpmDepsForFullStack)
else return Nothing
-- Run the individual `npm install` commands for both server and webapp projects

View File

@ -4,7 +4,7 @@ module Wasp.Generator.ServerGenerator
( genServer,
preCleanup,
operationsRouteInRootRouter,
waspNpmDependencies,
npmDepsForWasp,
)
where
@ -51,7 +51,7 @@ genServer :: AppSpec -> Generator [FileDraft]
genServer spec =
sequence
[ genReadme,
genPackageJson spec waspNpmDependencies,
genPackageJson spec npmDepsForWasp,
genNpmrc,
genNvmrc,
genGitignore
@ -91,9 +91,9 @@ dotEnvInServerRootDir = [relfile|.env|]
genReadme :: Generator FileDraft
genReadme = return $ C.mkTmplFd (asTmplFile [relfile|README.md|])
genPackageJson :: AppSpec -> N.NpmDependencies -> Generator FileDraft
genPackageJson :: AppSpec -> N.NpmDepsForWasp -> Generator FileDraft
genPackageJson spec waspDependencies = do
combinedDependencies <- N.genNpmDependencies spec waspDependencies
combinedDependencies <- N.genNpmDepsForPackage spec waspDependencies
return $
C.mkTmplFdWithDstAndData
(asTmplFile [relfile|package.json|])
@ -110,10 +110,10 @@ genPackageJson spec waspDependencies = do
]
)
waspNpmDependencies :: N.NpmDependencies
waspNpmDependencies =
N.NpmDependencies
{ N.dependencies =
npmDepsForWasp :: N.NpmDepsForWasp
npmDepsForWasp =
N.NpmDepsForWasp
{ N.waspDependencies =
AS.Dependency.fromList
[ ("cookie-parser", "~1.4.4"),
("cors", "^2.8.5"),
@ -126,7 +126,7 @@ waspNpmDependencies =
("dotenv", "8.2.0"),
("helmet", "^4.6.0")
],
N.devDependencies =
N.waspDevDependencies =
AS.Dependency.fromList
[ ("nodemon", "^2.0.4"),
("standard", "^14.3.4"),

View File

@ -1,6 +1,6 @@
module Wasp.Generator.WebAppGenerator
( generateWebApp,
waspNpmDependencies,
npmDepsForWasp,
)
where
@ -38,7 +38,7 @@ generateWebApp :: AppSpec -> Generator [FileDraft]
generateWebApp spec = do
sequence
[ generateReadme,
genPackageJson spec waspNpmDependencies,
genPackageJson spec npmDepsForWasp,
generateGitignore,
return $ C.mkTmplFd $ asTmplFile [relfile|netlify.toml|]
]
@ -49,9 +49,9 @@ generateWebApp spec = do
generateReadme :: Generator FileDraft
generateReadme = return $ C.mkTmplFd $ asTmplFile [relfile|README.md|]
genPackageJson :: AppSpec -> N.NpmDependencies -> Generator FileDraft
genPackageJson :: AppSpec -> N.NpmDepsForWasp -> Generator FileDraft
genPackageJson spec waspDependencies = do
combinedDependencies <- N.genNpmDependencies spec waspDependencies
combinedDependencies <- N.genNpmDepsForPackage spec waspDependencies
return $
C.mkTmplFdWithDstAndData
(C.asTmplFile [relfile|package.json|])
@ -64,10 +64,10 @@ genPackageJson spec waspDependencies = do
]
)
waspNpmDependencies :: N.NpmDependencies
waspNpmDependencies =
N.NpmDependencies
{ N.dependencies =
npmDepsForWasp :: N.NpmDepsForWasp
npmDepsForWasp =
N.NpmDepsForWasp
{ N.waspDependencies =
AS.Dependency.fromList
[ ("axios", "^0.21.1"),
("lodash", "^4.17.15"),
@ -78,7 +78,7 @@ waspNpmDependencies =
("react-scripts", "4.0.3"),
("uuid", "^3.4.0")
],
N.devDependencies =
N.waspDevDependencies =
AS.Dependency.fromList
[]
}

View File

@ -4,8 +4,8 @@ import Test.Tasty.Hspec
import qualified Wasp.AppSpec.App.Dependency as D
import Wasp.Generator.NpmDependencies
spec_combineNpmDependencies :: Spec
spec_combineNpmDependencies = do
spec_combineNpmDepsForPackage :: Spec
spec_combineNpmDepsForPackage = do
let waspDeps =
D.fromList
[ ("a", "1"),
@ -19,24 +19,24 @@ spec_combineNpmDependencies = do
]
it "a conflicting version number is detected" $ do
let waspNpmDependencies =
NpmDependencies
{ dependencies = waspDeps,
devDependencies = []
let npmDepsForWasp =
NpmDepsForWasp
{ waspDependencies = waspDeps,
waspDevDependencies = []
}
let userNpmDependencies =
NpmDependencies
{ dependencies =
let npmDepsForUser =
NpmDepsForUser
{ userDependencies =
D.fromList
[ ("a", "1"),
("b", "3")
],
devDependencies = []
userDevDependencies = []
}
combineNpmDependencies waspNpmDependencies userNpmDependencies
combineNpmDepsForPackage npmDepsForWasp npmDepsForUser
`shouldBe` Left
NpmDependenciesError
NpmDepsForPackageError
{ dependenciesConflictErrors =
[ DependencyConflictError
(D.make ("b", "2"))
@ -46,24 +46,24 @@ spec_combineNpmDependencies = do
}
it "wasp deps completely overlap with user deps, no duplication" $ do
let waspNpmDependencies =
NpmDependencies
{ dependencies = waspDeps,
devDependencies = []
let npmDepsForWasp =
NpmDepsForWasp
{ waspDependencies = waspDeps,
waspDevDependencies = []
}
let userNpmDependencies =
NpmDependencies
{ dependencies =
let npmDepsForUser =
NpmDepsForUser
{ userDependencies =
D.fromList
[ ("a", "1"),
("b", "2")
],
devDependencies = []
userDevDependencies = []
}
combineNpmDependencies waspNpmDependencies userNpmDependencies
combineNpmDepsForPackage npmDepsForWasp npmDepsForUser
`shouldBe` Right
NpmDependencies
NpmDepsForPackage
{ dependencies =
D.fromList
[ ("a", "1"),
@ -73,24 +73,24 @@ spec_combineNpmDependencies = do
}
it "user dependencies supplement wasp dependencies" $ do
let waspNpmDependencies =
NpmDependencies
{ dependencies = waspDeps,
devDependencies = []
let npmDepsForWasp =
NpmDepsForWasp
{ waspDependencies = waspDeps,
waspDevDependencies = []
}
let userNpmDependencies =
NpmDependencies
{ dependencies =
let npmDepsForUser =
NpmDepsForUser
{ userDependencies =
D.fromList
[ ("c", "3"),
("d", "4")
],
devDependencies = []
userDevDependencies = []
}
combineNpmDependencies waspNpmDependencies userNpmDependencies
combineNpmDepsForPackage npmDepsForWasp npmDepsForUser
`shouldBe` Right
NpmDependencies
NpmDepsForPackage
{ dependencies =
D.fromList
[ ("a", "1"),
@ -102,24 +102,24 @@ spec_combineNpmDependencies = do
}
it "user dependencies partially overlap wasp dependencies, so only non-overlapping supplement" $ do
let waspNpmDependencies =
NpmDependencies
{ dependencies = waspDeps,
devDependencies = []
let npmDepsForWasp =
NpmDepsForWasp
{ waspDependencies = waspDeps,
waspDevDependencies = []
}
let userNpmDependencies =
NpmDependencies
{ dependencies =
let npmDepsForUser =
NpmDepsForUser
{ userDependencies =
D.fromList
[ ("a", "1"),
("d", "4")
],
devDependencies = []
userDevDependencies = []
}
combineNpmDependencies waspNpmDependencies userNpmDependencies
combineNpmDepsForPackage npmDepsForWasp npmDepsForUser
`shouldBe` Right
NpmDependencies
NpmDepsForPackage
{ dependencies =
D.fromList
[ ("a", "1"),
@ -130,24 +130,24 @@ spec_combineNpmDependencies = do
}
it "report error if user dependency overlaps wasp dependency, different version" $ do
let waspNpmDependencies =
NpmDependencies
{ dependencies = waspDeps,
devDependencies = []
let npmDepsForWasp =
NpmDepsForWasp
{ waspDependencies = waspDeps,
waspDevDependencies = []
}
let userNpmDependencies =
NpmDependencies
{ dependencies =
let npmDepsForUser =
NpmDepsForUser
{ userDependencies =
D.fromList
[ ("a", "2"),
("foo", "bar")
],
devDependencies = []
userDevDependencies = []
}
combineNpmDependencies waspNpmDependencies userNpmDependencies
combineNpmDepsForPackage npmDepsForWasp npmDepsForUser
`shouldBe` Left
NpmDependenciesError
NpmDepsForPackageError
{ dependenciesConflictErrors =
[ DependencyConflictError
(D.make ("a", "1"))
@ -157,24 +157,24 @@ spec_combineNpmDependencies = do
}
it "a conflicting version number is detected with wasp devDependencies" $ do
let waspNpmDependencies =
NpmDependencies
{ dependencies = waspDeps,
devDependencies = waspDevDeps
let npmDepsForWasp =
NpmDepsForWasp
{ waspDependencies = waspDeps,
waspDevDependencies = waspDevDeps
}
let userNpmDependencies =
NpmDependencies
{ dependencies =
let npmDepsForUser =
NpmDepsForUser
{ userDependencies =
D.fromList
[ ("a", "1"),
("alpha", "70")
],
devDependencies = []
userDevDependencies = []
}
combineNpmDependencies waspNpmDependencies userNpmDependencies
combineNpmDepsForPackage npmDepsForWasp npmDepsForUser
`shouldBe` Left
NpmDependenciesError
NpmDepsForPackageError
{ dependenciesConflictErrors =
[ DependencyConflictError
(D.make ("alpha", "10"))
@ -184,28 +184,28 @@ spec_combineNpmDependencies = do
}
it "dev dependencies are also combined" $ do
let waspNpmDependencies =
NpmDependencies
{ dependencies = waspDeps,
devDependencies = waspDevDeps
let npmDepsForWasp =
NpmDepsForWasp
{ waspDependencies = waspDeps,
waspDevDependencies = waspDevDeps
}
let userNpmDependencies =
NpmDependencies
{ dependencies =
let npmDepsForUser =
NpmDepsForUser
{ userDependencies =
D.fromList
[ ("a", "1"),
("d", "4")
],
devDependencies =
userDevDependencies =
D.fromList
[ ("alpha", "10"),
("gamma", "30")
]
}
combineNpmDependencies waspNpmDependencies userNpmDependencies
combineNpmDepsForPackage npmDepsForWasp npmDepsForUser
`shouldBe` Right
NpmDependencies
NpmDepsForPackage
{ dependencies =
D.fromList
[ ("a", "1"),
@ -221,23 +221,24 @@ spec_combineNpmDependencies = do
}
it "wasp dev dependency overlaps with user dependency, should remain devDependency" $ do
let waspNpmDependencies =
NpmDependencies
{ dependencies = waspDeps,
devDependencies = waspDevDeps
let npmDepsForWasp =
NpmDepsForWasp
{ waspDependencies = waspDeps,
waspDevDependencies = waspDevDeps
}
let userNpmDependencies =
NpmDependencies
{ dependencies =
let npmDepsForUser =
NpmDepsForUser
{ userDependencies =
D.fromList
[ ("alpha", "10")
],
devDependencies = []
userDevDependencies = []
}
combineNpmDependencies waspNpmDependencies userNpmDependencies
combineNpmDepsForPackage npmDepsForWasp npmDepsForUser
`shouldBe` Right
NpmDependencies
NpmDepsForPackage
{ dependencies =
D.fromList
[ ("a", "1"),
@ -264,11 +265,11 @@ spec_combineNpmDependencies = do
it
"NpmDependencies are equal even if dependencies have different order"
$ do
NpmDependencies
NpmDepsForPackage
{ dependencies = waspDeps,
devDependencies = []
}
`shouldBe` NpmDependencies
`shouldBe` NpmDepsForPackage
{ dependencies = reverse waspDeps,
devDependencies = []
}
@ -276,11 +277,11 @@ spec_combineNpmDependencies = do
it
"NpmDependencies are equal even if dependencies have different order, with dev dependencies"
$ do
NpmDependencies
NpmDepsForPackage
{ dependencies = waspDeps,
devDependencies = reverse waspDeps
}
`shouldBe` NpmDependencies
`shouldBe` NpmDepsForPackage
{ dependencies = reverse waspDeps,
devDependencies = waspDeps
}
@ -288,11 +289,11 @@ spec_combineNpmDependencies = do
it
"NpmDependencies can be unequal"
$ do
NpmDependencies
NpmDepsForPackage
{ dependencies = waspDeps,
devDependencies = []
}
`shouldNotBe` NpmDependencies
`shouldNotBe` NpmDepsForPackage
{ dependencies = [],
devDependencies = []
}