mirror of
https://github.com/wasp-lang/wasp.git
synced 2024-10-05 19:58:31 +03:00
Separate types so it's impossible to do the wrong thing
Have the naming reflect all of that
This commit is contained in:
parent
f0815466bf
commit
de604a3982
@ -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]
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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"),
|
||||
|
@ -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
|
||||
[]
|
||||
}
|
||||
|
@ -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 = []
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user