nixpkgs mirror (for testing)
github.com/NixOS/nixpkgs
nix
1{
2 lib,
3 runCommand,
4 jq,
5 yq,
6}:
7
8{
9 pname ? null,
10
11 # A list of dependency package names.
12 dependencies,
13
14 # An attribute set of package names to sources.
15 dependencySources,
16}:
17
18let
19 packages = lib.genAttrs dependencies (dependency: rec {
20 src = dependencySources.${dependency};
21 inherit (src) packageRoot;
22 });
23in
24(runCommand "${lib.optionalString (pname != null) "${pname}-"}package-config.json" {
25 inherit packages;
26
27 nativeBuildInputs = [
28 jq
29 yq
30 ];
31
32 __structuredAttrs = true;
33})
34 ''
35 declare -A packageSources
36 declare -A packageRoots
37 while IFS=',' read -r name src packageRoot; do
38 packageSources["$name"]="$src"
39 packageRoots["$name"]="$packageRoot"
40 done < <(jq -r '.packages | to_entries | map("\(.key),\(.value.src),\(.value.packageRoot)") | .[]' "$NIX_ATTRS_JSON_FILE")
41
42 for package in "''${!packageSources[@]}"; do
43 pubspec="$(realpath --logical "''${packageSources["$package"]}/''${packageRoots["$package"]}/pubspec.yaml")"
44
45 if [ ! -e "$pubspec" ]; then
46 echo >&2 "The package sources for $package are missing. Is the following path inside the source derivation?"
47 echo >&2 "Source path: $pubspec"
48 exit 1
49 fi
50
51 languageConstraint="$(yq -r .environment.sdk "$pubspec")"
52 if [[ "$languageConstraint" =~ ^[[:space:]]*(\^|>=|>)?[[:space:]]*([[:digit:]]+\.[[:digit:]]+)\.[[:digit:]]+.*$ ]]; then
53 languageVersionJson="\"''${BASH_REMATCH[2]}\""
54 elif [ "$languageConstraint" = 'any' ]; then
55 languageVersionJson='null'
56 else
57 # https://github.com/dart-lang/pub/blob/68dc2f547d0a264955c1fa551fa0a0e158046494/lib/src/language_version.dart#L106C35-L106C35
58 languageVersionJson='"2.7"'
59 fi
60
61 jq --null-input \
62 --arg name "$package" \
63 --arg path "''${packageSources["$package"]}/''${packageRoots["$package"]}" \
64 --argjson languageVersion "$languageVersionJson" \
65 '{
66 name: $name,
67 rootUri: "file://\($path)",
68 packageUri: "lib/",
69 languageVersion: $languageVersion,
70 }'
71 done | jq > "$out" --slurp '{
72 configVersion: 2,
73 generator: "nixpkgs",
74 packages: .,
75 }'
76 ''