75 lines
2.2 KiB
Nix
75 lines
2.2 KiB
Nix
{
|
|
lib,
|
|
runCommand,
|
|
jq,
|
|
yq,
|
|
}:
|
|
|
|
{
|
|
pname ? null,
|
|
|
|
# A list of dependency package names.
|
|
dependencies,
|
|
|
|
# An attribute set of package names to sources.
|
|
dependencySources,
|
|
}:
|
|
|
|
let
|
|
packages = lib.genAttrs dependencies (dependency: rec {
|
|
src = dependencySources.${dependency};
|
|
inherit (src) packageRoot;
|
|
});
|
|
in
|
|
(runCommand "${lib.optionalString (pname != null) "${pname}-"}package-config.json" {
|
|
inherit packages;
|
|
|
|
nativeBuildInputs = [
|
|
jq
|
|
yq
|
|
];
|
|
|
|
__structuredAttrs = true;
|
|
})
|
|
''
|
|
declare -A packageSources
|
|
declare -A packageRoots
|
|
while IFS=',' read -r name src packageRoot; do
|
|
packageSources["$name"]="$src"
|
|
packageRoots["$name"]="$packageRoot"
|
|
done < <(jq -r '.packages | to_entries | map("\(.key),\(.value.src),\(.value.packageRoot)") | .[]' "$NIX_ATTRS_JSON_FILE")
|
|
|
|
for package in "''${!packageSources[@]}"; do
|
|
if [ ! -e "''${packageSources["$package"]}/''${packageRoots["$package"]}/pubspec.yaml" ]; then
|
|
echo >&2 "The package sources for $package are missing. Is the following path inside the source derivation?"
|
|
echo >&2 "Source path: ''${packageSources["$package"]}/''${packageRoots["$package"]}/pubspec.yaml"
|
|
exit 1
|
|
fi
|
|
|
|
languageConstraint="$(yq -r .environment.sdk "''${packageSources["$package"]}/''${packageRoots["$package"]}/pubspec.yaml")"
|
|
if [[ "$languageConstraint" =~ ^[[:space:]]*(\^|>=|>)?[[:space:]]*([[:digit:]]+\.[[:digit:]]+)\.[[:digit:]]+.*$ ]]; then
|
|
languageVersionJson="\"''${BASH_REMATCH[2]}\""
|
|
elif [ "$languageConstraint" = 'any' ]; then
|
|
languageVersionJson='null'
|
|
else
|
|
# https://github.com/dart-lang/pub/blob/68dc2f547d0a264955c1fa551fa0a0e158046494/lib/src/language_version.dart#L106C35-L106C35
|
|
languageVersionJson='"2.7"'
|
|
fi
|
|
|
|
jq --null-input \
|
|
--arg name "$package" \
|
|
--arg path "''${packageSources["$package"]}/''${packageRoots["$package"]}" \
|
|
--argjson languageVersion "$languageVersionJson" \
|
|
'{
|
|
name: $name,
|
|
rootUri: "file://\($path)",
|
|
packageUri: "lib/",
|
|
languageVersion: $languageVersion,
|
|
}'
|
|
done | jq > "$out" --slurp '{
|
|
configVersion: 2,
|
|
generator: "nixpkgs",
|
|
packages: .,
|
|
}'
|
|
''
|