{-# LANGUAGE NoImplicitPrelude, DeriveGeneric, OverloadedStrings, RecordWildCards #-}
module Distribution.Nixpkgs.Nodejs.FromPackage
( genTemplate
) where
import Protolude
import qualified Data.HashMap.Lazy as HML
import Nix.Expr
import Nix.Expr.Additions
import Distribution.Nixpkgs.Nodejs.Utils (packageKeyToSymbol)
import qualified Distribution.Nodejs.Package as NP
import qualified Yarn.Lock.Types as YLT
depsToPkgKeys :: NP.Dependencies -> [YLT.PackageKey]
depsToPkgKeys = map toPkgKey . HML.toList
where
toPkgKey (k, v) =
YLT.PackageKey (parsePackageKeyName k) v
parsePackageKeyName :: Text -> YLT.PackageKeyName
parsePackageKeyName k =
maybe (YLT.SimplePackageKey k) identity
$ YLT.parsePackageKeyName k
genTemplate :: NP.Package -> NExpr
genTemplate NP.Package{..} =
simpleParamSet []
==> Param nodeDepsSym
==> (mkNonRecSet
[ "name" $= nameStr
, "version" $= mkStr version
, "nodeBuildInputs" $= (letE "a" (mkSym nodeDepsSym)
$ mkList (map (pkgDep "a") depPkgKeys))
, "meta" $= (mkNonRecSet
$ may "description" description
<> may "license" license
<> may "homepage" homepage)
])
where
depPkgKeys = depsToPkgKeys (dependencies <> devDependencies)
pkgDep depsSym pk = mkSym depsSym !!. packageKeyToSymbol pk
nodeDepsSym = "allDeps"
nameStr = mkStrQ [StrQ
$ pkgKeyToName $ parsePackageKeyName name]
pkgKeyToName (YLT.SimplePackageKey n) = n
pkgKeyToName (YLT.ScopedPackageKey s n) = s <> "-" <> n
may k v = [k $= mkStr (fromMaybe mempty v)]