cli/project.nix
Rama main · réplica de lectura del repositorio original.
{
self,
pkgs,
nixops-lib,
}:
let
name = "cli";
description = "Nhost CLI";
version = "0.0.0-dev";
created = "1970-01-01T00:00:00Z";
submodule = "${name}";
fs = pkgs.lib.fileset;
src = fs.toSource {
root = ./..;
fileset = fs.unions [
../go.mod
../go.sum
../vendor
../.golangci.yaml
../govulncheck.yaml
(fs.fileFilter (f: f.hasExt "go") ./.)
./get_access_token.sh
./cert.sh
./test_certbot_magicdns_auth_hook.sh
./gqlgenc.yaml
./ssl/.ssl
./cmd/config/testdata
./cmd/project/templates
./nhostclient/graphql/query
(fs.fileFilter (f: f.hasExt "go") ../internal/lib/clidocs)
../internal/lib/clidocs/testdata
(fs.fileFilter (f: f.hasExt "go") ../internal/lib/nhostclient)
(fs.fileFilter (f: f.hasExt "go") ../internal/lib/oapi)
./cmd/configserver/logsapi/gqlgen.yml
./cmd/configserver/logsapi/schema.graphqls
./mcp/nhost/graphql/openapi.yaml
./mcp/resources/cloud_schema.graphql
./mcp/resources/cloud_schema-with-mutations.graphql
./mcp/resources/nhost_toml_schema.cue
./cmd/mcp/testdata
./mcp/graphql/testdata
# constellation (used by `nhost schema` for SDL dump/diff)
(fs.fileFilter (f: f.hasExt "go") ../services/constellation)
# auth email templates (embedded into the CLI binary by `nhost init`)
../services/auth/email-templates
# docs
../docs/embed.go
(fs.fileFilter (f: f.hasExt "mdx") ../docs/src/content/docs)
];
};
tags = [ ];
ldflags = [
"-X main.Version=${version}"
];
checkDeps = with pkgs; [
bash
dash
jq
curl
cacert
nhost.gqlgen
nhost.gqlgenc
nhost.oapi-codegen
];
buildInputs = [ ];
nativeBuildInputs = [ ];
in
rec {
check = nixops-lib.go.check {
inherit
src
submodule
ldflags
tags
buildInputs
nativeBuildInputs
checkDeps
;
impureEnvVars = {
NHOST_PAT = builtins.getEnv "NHOST_PAT";
};
preCheck = ''
export GOEXPERIMENT=jsonv2;
echo "➜ Running certificate hook harness with bash"
CERTBOT_SYSTEM_SHELL=${pkgs.bash}/bin/bash \
bash ${src}/cli/test_certbot_magicdns_auth_hook.sh
echo "➜ Running certificate hook harness with dash"
CERTBOT_SYSTEM_SHELL=${pkgs.dash}/bin/dash \
dash ${src}/cli/test_certbot_magicdns_auth_hook.sh
if [ -z "''${NHOST_PAT:-}" ]; then
echo "ERROR: NHOST_PAT environment variable is not set"
exit 1
fi
echo "➜ Getting access token"
export NHOST_ACCESS_TOKEN=$(bash ${src}/cli/get_access_token.sh)
'';
};
devShell = nixops-lib.go.devShell {
buildInputs =
with pkgs;
[
bash
dash
nhost.certbot-full
python312Packages.certbot-dns-route53
kubectl
dnsutils
shellcheck
nhost.gqlgen
# javascript
nhost.nodejs
nhost.pnpm
nhost.biome
]
++ checkDeps
++ buildInputs
++ nativeBuildInputs;
shellHook = "export GOEXPERIMENT=jsonv2";
};
package =
(nixops-lib.go.package {
inherit
name
description
version
src
submodule
ldflags
buildInputs
nativeBuildInputs
;
}).overrideAttrs
(
old:
old
// {
env = {
CGO_ENABLED = "0";
GOEXPERIMENT = "jsonv2";
};
}
);
dockerImage = nixops-lib.go.docker-image {
inherit
name
package
created
version
buildInputs
;
};
cli-arm64-darwin =
(nixops-lib.go.package {
inherit
name
submodule
description
src
version
ldflags
buildInputs
nativeBuildInputs
;
}).overrideAttrs
(
old:
old
// {
env = {
GOOS = "darwin";
GOARCH = "arm64";
CGO_ENABLED = "0";
GOEXPERIMENT = "jsonv2";
};
}
);
cli-amd64-darwin =
(nixops-lib.go.package {
inherit
name
submodule
description
src
version
ldflags
buildInputs
nativeBuildInputs
;
}).overrideAttrs
(
old:
old
// {
env = {
GOOS = "darwin";
GOARCH = "amd64";
CGO_ENABLED = "0";
GOEXPERIMENT = "jsonv2";
};
}
);
cli-arm64-linux =
(nixops-lib.go.package {
inherit
name
submodule
description
src
version
ldflags
buildInputs
nativeBuildInputs
;
}).overrideAttrs
(
old:
old
// {
env = {
GOOS = "linux";
GOARCH = "arm64";
CGO_ENABLED = "0";
GOEXPERIMENT = "jsonv2";
};
}
);
cli-amd64-linux =
(nixops-lib.go.package {
inherit
name
submodule
description
src
version
ldflags
buildInputs
nativeBuildInputs
;
}).overrideAttrs
(
old:
old
// {
env = {
GOOS = "linux";
GOARCH = "amd64";
CGO_ENABLED = "0";
GOEXPERIMENT = "jsonv2";
};
}
);
cli-multiplatform =
pkgs.runCommand "cli-multiplatform-${version}"
{
meta = {
description = "Multi-platform ${description} binaries";
};
}
''
mkdir -p $out/{darwin,linux}/{arm64,amd64}
cp ${cli-arm64-darwin}/bin/${name} $out/darwin/arm64/cli
cp ${cli-amd64-darwin}/bin/${name} $out/darwin/amd64/cli
cp ${cli-arm64-linux}/bin/${name} $out/linux/arm64/cli
cp ${cli-amd64-linux}/bin/${name} $out/linux/amd64/cli
'';
cli-npm =
pkgs.runCommand "cli-npm-${version}"
{
nativeBuildInputs = [ pkgs.jq ];
meta = {
description = "npm packages (main + platform binaries) for ${description}";
};
}
''
stage_platform() {
dir="$out/$1"
mkdir -p "$dir"
jq --arg v "${version}" '.version = $v' \
${./build/npm/platforms}/"$1"/package.json > "$dir/package.json"
cp ${cli-multiplatform}/"$2"/"$3"/cli "$dir/nhost"
chmod +x "$dir/nhost"
}
stage_platform darwin-arm64 darwin arm64
stage_platform darwin-x64 darwin amd64
stage_platform linux-arm64 linux arm64
stage_platform linux-x64 linux amd64
main="$out/main"
mkdir -p "$main/bin"
jq --arg v "${version}" \
'.version = $v | .optionalDependencies |= map_values($v)' \
${./build/npm/package.json} > "$main/package.json"
cp ${./build/npm/bin/nhost} "$main/bin/nhost"
chmod +x "$main/bin/nhost"
cp ${./build/npm/README.md} "$main/README.md"
validate_platform_metadata() {
main_name=$(jq -r '.name' "$main/package.json")
single_quote_prefix="const PKG_PREFIX = '$main_name';"
double_quote_prefix="const PKG_PREFIX = \"$main_name\";"
if ! grep -Fqx "$single_quote_prefix" "$main/bin/nhost" \
&& ! grep -Fqx "$double_quote_prefix" "$main/bin/nhost"; then
echo "ERROR: cli npm shim PKG_PREFIX must match main package name '$main_name'" >&2
exit 1
fi
if ! jq -e --arg v "${version}" '.version == $v' "$main/package.json" > /dev/null; then
echo "ERROR: main npm package version must be ${version}" >&2
exit 1
fi
if ! jq -e --arg v "${version}" \
'(.optionalDependencies | type == "object") and (.optionalDependencies | all(.[]; . == $v))' \
"$main/package.json" > /dev/null; then
echo "ERROR: main npm optionalDependencies must all use version ${version}" >&2
exit 1
fi
platform_names_file="$TMPDIR/cli-npm-platform-names"
optional_dependency_names_file="$TMPDIR/cli-npm-optional-dependency-names"
: > "$platform_names_file"
for platform in darwin-arm64 darwin-x64 linux-arm64 linux-x64; do
platform_package="$out/$platform/package.json"
if ! jq -e --arg v "${version}" '.version == $v' "$platform_package" > /dev/null; then
echo "ERROR: $platform npm package version must be ${version}" >&2
exit 1
fi
platform_name=$(jq -r '.name' "$platform_package")
case "$platform_name" in
"$main_name"-*) ;;
*)
echo "ERROR: $platform package name '$platform_name' must use prefix '$main_name-'" >&2
exit 1
;;
esac
echo "$platform_name" >> "$platform_names_file"
done
sort -o "$platform_names_file" "$platform_names_file"
jq -r '.optionalDependencies | keys[]' "$main/package.json" > "$optional_dependency_names_file"
sort -o "$optional_dependency_names_file" "$optional_dependency_names_file"
if ! cmp -s "$optional_dependency_names_file" "$platform_names_file"; then
echo "ERROR: main npm optionalDependencies must exactly match platform package names" >&2
echo "optionalDependencies:" >&2
cat "$optional_dependency_names_file" >&2
echo "platform package names:" >&2
cat "$platform_names_file" >&2
exit 1
fi
}
validate_platform_metadata
'';
}