Compare commits

..

10 Commits

Author SHA1 Message Date
github-actions[bot]
565aee6d34 release(dashboard): 2.38.1 (#3535)
Co-authored-by: dbarrosop <dbarrosop@users.noreply.github.com>
2025-09-30 13:21:54 +02:00
David Barroso
47013da462 chore(ci): validate PR title (#3537) 2025-09-30 13:20:02 +02:00
dependabot[bot]
2e701456d3 chore(ci): bump actions/checkout from 4 to 5 (#3526)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: David Barroso <dbarrosop@dravetech.com>
2025-09-30 11:41:42 +02:00
dependabot[bot]
f08bbc62f6 chore(ci): bump aws-actions/configure-aws-credentials from 4 to 5 (#3522)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: David Barroso <dbarrosop@dravetech.com>
2025-09-30 11:40:09 +02:00
robertkasza
93c233deb0 fix (dashboard): delay generating auth service url when creating users (#3530) 2025-09-30 09:22:46 +02:00
David Barroso
ff2a84aa37 chore(ci): use variables in gen_ai_review workflow to configure models (#3534) 2025-09-30 08:45:56 +02:00
github-actions[bot]
3ca082d368 release(cli): 1.32.1 (#3533)
Co-authored-by: dbarrosop <dbarrosop@users.noreply.github.com>
2025-09-29 17:51:37 +02:00
David Barroso
cec16c6b89 chore(cli): update schema (#3529) 2025-09-29 17:48:59 +02:00
David Barroso
543f2c2b0e fix(nixops): export correctly (#3531) 2025-09-29 17:20:51 +02:00
David Barroso
53ac9263c1 fix(ci): specify base when bumping the dashboard in the cli (#3532) 2025-09-29 14:46:29 +02:00
25 changed files with 207 additions and 102 deletions

View File

@@ -0,0 +1,41 @@
---
name: "Validate PR Title"
description: "Validates that PR title follows the required format: TYPE(PKG): SUMMARY"
inputs:
pr_title:
description: "The PR title to validate"
required: true
runs:
using: "composite"
steps:
- name: "Validate PR title format"
shell: bash
run: |
PR_TITLE="${{ inputs.pr_title }}"
echo "Validating PR title: $PR_TITLE"
# Define valid types and packages
VALID_TYPES="feat|fix|chore"
VALID_PKGS="ci|cli|codegen|dashboard|deps|docs|examples|mintlify-openapi|nhost-js|nixops|storage"
# Check if title matches the pattern TYPE(PKG): SUMMARY
if [[ ! "$PR_TITLE" =~ ^(${VALID_TYPES})\((${VALID_PKGS})\):\ .+ ]]; then
echo "❌ PR title does not follow the required format!"
echo ""
echo "Expected format: TYPE(PKG): SUMMARY"
echo ""
echo "Valid TYPEs:"
echo " - feat: mark this pull request as a feature"
echo " - fix: mark this pull request as a bug fix"
echo " - chore: mark this pull request as a maintenance item"
echo ""
echo "Valid PKGs:"
echo " - ci, cli, codegen, dashboard, deps, docs, examples,"
echo " - mintlify-openapi, nhost-js, nixops, storage"
echo ""
echo "Example: feat(cli): add new command for database migrations"
exit 1
fi
echo "✅ PR title is valid!"

View File

@@ -68,7 +68,7 @@ jobs:
ref: ${{ inputs.GIT_REF }}
- name: Configure aws
uses: aws-actions/configure-aws-credentials@v4
uses: aws-actions/configure-aws-credentials@v5
with:
role-to-assume: arn:aws:iam::${{ secrets.AWS_ACCOUNT_ID }}:role/github-actions-nhost-${{ github.event.repository.name }}
aws-region: eu-central-1

View File

@@ -50,7 +50,7 @@ jobs:
comment_on_pr: false
- name: Configure aws
uses: aws-actions/configure-aws-credentials@v4
uses: aws-actions/configure-aws-credentials@v5
with:
role-to-assume: arn:aws:iam::${{ secrets.AWS_ACCOUNT_ID }}:role/github-actions-nhost-${{ github.event.repository.name }}
aws-region: eu-central-1

View File

@@ -105,7 +105,7 @@ jobs:
comment_on_pr: false
- name: Configure aws
uses: aws-actions/configure-aws-credentials@v4
uses: aws-actions/configure-aws-credentials@v5
with:
role-to-assume: arn:aws:iam::${{ secrets.AWS_ACCOUNT_ID }}:role/github-actions-nhost-${{ github.event.repository.name }}
aws-region: eu-central-1

View File

@@ -98,6 +98,7 @@ jobs:
committer: GitHub <noreply@github.com>
author: ${{ github.actor }} <${{ github.actor }}@users.noreply.github.com>
body: |
This PR bumps the Nhost Dashboard Docker image to version ${{ needs.version.outputs.dashboardVersion }}.
This PR bumps the Nhost Dashboard Docker image to version ${{ inputs.VERSION }}.
branch: bump-dashboard-version
base: main
delete-branch: true

View File

@@ -21,6 +21,6 @@ jobs:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
OPENAI_KEY: ${{ secrets.OPENAI_API_KEY }}
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
config.model: "anthropic/claude-sonnet-4-20250514"
config.model_turbo: "anthropic/claude-sonnet-4-20250514"
config.model: ${{ vars.GEN_AI_MODEL }}
config.model_turbo: $${{ vars.GEN_AI_MODEL_TURBO }}
ignore.glob: "['pnpm-lock.yaml','**/pnpm-lock.yaml', 'vendor/**','**/client_gen.go','**/models_gen.go','**/generated.go','**/*.gen.go']"

View File

@@ -18,7 +18,7 @@ jobs:
uses: actions/checkout@v5
- name: Configure aws
uses: aws-actions/configure-aws-credentials@v4
uses: aws-actions/configure-aws-credentials@v5
with:
role-to-assume: arn:aws:iam::${{ secrets.AWS_PRODUCTION_CORE_ACCOUNT_ID }}:role/github-actions-nhost-${{ github.event.repository.name }}
aws-region: eu-central-1

View File

@@ -53,8 +53,14 @@ jobs:
with:
ref: ${{ inputs.GIT_REF }}
- name: "Validate PR title"
uses: ./.github/actions/validate-pr-title
with:
pr_title: ${{ github.event.pull_request.title }}
if: ${{ github.event_name == 'pull_request' }}
- name: Configure aws
uses: aws-actions/configure-aws-credentials@v4
uses: aws-actions/configure-aws-credentials@v5
with:
role-to-assume: arn:aws:iam::${{ secrets.AWS_ACCOUNT_ID }}:role/github-actions-nhost-${{ github.event.repository.name }}
aws-region: eu-central-1

View File

@@ -44,13 +44,19 @@ jobs:
with:
ref: ${{ inputs.GIT_REF }}
- name: "Validate PR title"
uses: ./.github/actions/validate-pr-title
with:
pr_title: ${{ github.event.pull_request.title }}
if: ${{ github.event_name == 'pull_request' }}
- name: Collect Workflow Telemetry
uses: catchpoint/workflow-telemetry-action@v2
with:
comment_on_pr: false
- name: Configure aws
uses: aws-actions/configure-aws-credentials@v4
uses: aws-actions/configure-aws-credentials@v5
with:
role-to-assume: arn:aws:iam::${{ secrets.AWS_ACCOUNT_ID }}:role/github-actions-nhost-${{ github.event.repository.name }}
aws-region: eu-central-1

View File

@@ -54,7 +54,7 @@ jobs:
ref: ${{ inputs.GIT_REF }}
- name: Configure aws
uses: aws-actions/configure-aws-credentials@v4
uses: aws-actions/configure-aws-credentials@v5
with:
role-to-assume: arn:aws:iam::${{ secrets.AWS_ACCOUNT_ID }}:role/github-actions-nhost-${{ github.event.repository.name }}
aws-region: eu-central-1

View File

@@ -33,13 +33,13 @@ jobs:
steps:
- name: "Check out repository"
uses: actions/checkout@v4
uses: actions/checkout@v5
with:
fetch-depth: 0
submodules: true
- name: Configure aws
uses: aws-actions/configure-aws-credentials@v4
uses: aws-actions/configure-aws-credentials@v5
with:
role-to-assume: arn:aws:iam::${{ secrets.AWS_ACCOUNT_ID }}:role/github-actions-nhost-${{ github.event.repository.name }}
aws-region: eu-central-1

View File

@@ -42,7 +42,7 @@ jobs:
uses: actions/checkout@v5
- name: Configure aws
uses: aws-actions/configure-aws-credentials@v4
uses: aws-actions/configure-aws-credentials@v5
with:
role-to-assume: arn:aws:iam::${{ secrets.AWS_ACCOUNT_ID }}:role/github-actions-nhost-${{ github.event.repository.name }}
aws-region: eu-central-1

11
cli/CHANGELOG.md Normal file
View File

@@ -0,0 +1,11 @@
# Changelog
All notable changes to this project will be documented in this file.
## [cli@1.32.1] - 2025-09-29
### ⚙️ Miscellaneous Tasks
- *(ci)* Minor improvements to the ci (#3527)
- *(cli)* Update schema (#3529)

View File

@@ -2,6 +2,17 @@
All notable changes to this project will be documented in this file.
## [@nhost/dashboard@2.38.1] - 2025-09-30
### 🐛 Bug Fixes
- *(dashboard)* Delay generating auth service url when creating users (#3530)
### ⚙️ Miscellaneous Tasks
- *(ci)* Bump aws-actions/configure-aws-credentials from 4 to 5 (#3522)
## [@nhost/dashboard@2.38.0] - 2025-09-29
### 🚀 Features

View File

@@ -10,6 +10,7 @@
"start": "next start",
"lint": "next lint --max-warnings 0",
"test": "vitest --run",
"test:watch": "vitest",
"generate": "echo 'This needs to be fixed.'",
"codegen": "DOTENV_CONFIG_PATH=./.env.local graphql-codegen -r dotenv/config --config graphql.config.yaml --errors-only",
"codegen-graphite": "graphql-codegen --config graphite.graphql.config.yaml --errors-only",

View File

@@ -13,7 +13,7 @@ export default defineConfig({
},
fullyParallel: false,
forbidOnly: !!process.env.CI,
retries: 0,
retries: 2,
workers: 1,
reporter: 'html',
use: {

View File

@@ -12,6 +12,7 @@ import { ApplicationUnpausing } from '@/features/orgs/projects/common/components
import { useAppState } from '@/features/orgs/projects/common/hooks/useAppState';
import { useIsPlatform } from '@/features/orgs/projects/common/hooks/useIsPlatform';
import { useProjectWithState } from '@/features/orgs/projects/hooks/useProjectWithState';
import { isEmptyValue } from '@/lib/utils';
import { useAuth } from '@/providers/Auth';
import { ApplicationStatus } from '@/types/application';
import { getConfigServerUrl, isPlatform as isPlatformFn } from '@/utils/env';
@@ -188,6 +189,15 @@ function ProjectLayoutContent({
throw error;
}
if (
isUserLoggedIn &&
isEmptyValue(project) &&
!loading &&
isEmptyValue(error)
) {
throw new Error('Could not load project. Please try again later.');
}
return (
<Box
component="main"

View File

@@ -65,37 +65,39 @@ export default function CreateUserForm({
onDirtyStateChange(isDirty, location);
}, [isDirty, location, onDirtyStateChange]);
const baseAuthUrl =
isNotEmptyValue(project?.subdomain) && isNotEmptyValue(project?.region)
? generateAppServiceUrl(project!.subdomain, project!.region, 'auth')
: '';
const signUpUrl = `${baseAuthUrl}/signup/email-password`;
async function handleCreateUser({ email, password }: CreateUserFormValues) {
setCreateUserFormError(null);
await execPromiseWithErrorToast(
async () => {
await fetch(signUpUrl, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ email, password }),
}).then(async (res) => {
if (isNotEmptyValue(project)) {
const baseAuthUrl = generateAppServiceUrl(
project.subdomain,
project.region,
'auth',
);
const signUpUrl = `${baseAuthUrl}/signup/email-password`;
const res = await fetch(signUpUrl, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ email, password }),
});
const data = await res.json();
if (res.ok) {
return data;
if (!res.ok) {
if (res.status === 409) {
setError('email', { message: data?.message });
}
throw new Error(data?.message || 'Something went wrong.');
}
if (res.status === 409) {
setError('email', { message: data?.message });
}
onSubmit?.();
throw new Error(data?.message || 'Something went wrong.');
});
onSubmit?.();
return data;
}
throw new Error('Something went wrong. Please try again later.');
},
{
loadingMessage: 'Creating user...',

View File

@@ -8,7 +8,11 @@
};
outputs = { self, nixpkgs, flake-utils, nix-filter, nix2container }:
flake-utils.lib.eachDefaultSystem (system:
{
#nixops
lib = import ./nixops/lib/lib.nix;
overlays.default = import ./nixops/overlays/default.nix;
} // flake-utils.lib.eachDefaultSystem (system:
let
pkgs = import nixpkgs {
inherit system;
@@ -17,10 +21,8 @@
];
};
lib = import ./nixops/lib/lib.nix;
nix2containerPkgs = nix2container.packages.${system};
nixops-lib = lib { inherit pkgs nix2containerPkgs; };
nixops-lib = (import ./nixops/lib/lib.nix) { inherit pkgs nix2containerPkgs; };
clif = import ./cli/project.nix {
inherit self pkgs nix-filter nixops-lib;
@@ -68,10 +70,6 @@
in
{
#nixops
overlays.default = import ./overlays/default.nix;
lib = lib;
checks = {
cli = clif.check;
codegen = codegenf.check;

2
go.mod
View File

@@ -22,7 +22,7 @@ require (
github.com/google/go-cmp v0.7.0
github.com/google/uuid v1.6.0
github.com/hashicorp/go-getter v1.8.1
github.com/nhost/be v0.0.0-20250826134155-48638c4b3f6a
github.com/nhost/be v0.0.0-20250929153845-6db3e5249d33
github.com/oapi-codegen/gin-middleware v1.0.2
github.com/oapi-codegen/runtime v1.1.1
github.com/pb33f/libopenapi v0.21.12

4
go.sum
View File

@@ -341,8 +341,8 @@ github.com/muesli/termenv v0.16.0 h1:S5AlUN9dENB57rsbnkPyfdGuWIlkmzJjbFf0Tf5FWUc
github.com/muesli/termenv v0.16.0/go.mod h1:ZRfOIKPFDYQoDFF4Olj7/QJbW60Ol/kL1pU3VfY/Cnk=
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
github.com/nhost/be v0.0.0-20250826134155-48638c4b3f6a h1:X0diMLIRQBKobQ4W5di8fPqwakLFchJdzAtamO97Vrs=
github.com/nhost/be v0.0.0-20250826134155-48638c4b3f6a/go.mod h1:iRPhO+qcQzTtNQ7PaQMJAcEw0tgWzgjzcGWgJ4ifrUo=
github.com/nhost/be v0.0.0-20250929153845-6db3e5249d33 h1:BNFN3Mw4zY6LEmVc7RXkHSVvHtovDSm7Oesb7IUt27o=
github.com/nhost/be v0.0.0-20250929153845-6db3e5249d33/go.mod h1:feVvqP3dft8hWbp9zNZExdGKbFEYv8aLYohfyAeINNQ=
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
github.com/oapi-codegen/gin-middleware v1.0.2 h1:/H99UzvHQAUxXK8pzdcGAZgjCVeXdFDAUUWaJT0k0eI=
github.com/oapi-codegen/gin-middleware v1.0.2/go.mod h1:2HJDQjH8jzK2/k/VKcWl+/T41H7ai2bKa6dN3AA2GpA=

View File

@@ -1,4 +1,27 @@
(final: prev: rec {
(final: prev:
let
biome_version = "2.2.4";
biome_dist = {
aarch64-darwin = {
url = "https://github.com/biomejs/biome/releases/download/%40biomejs%2Fbiome%40${biome_version}/biome-darwin-arm64";
sha256 = "1z0qb6a21qwk93gpqvfvi01w472fs982vn7hg5my1c0bandnmgy6";
};
x86_64-darwin = {
url = "https://github.com/biomejs/biome/releases/download/%40biomejs%2Fbiome%40${biome_version}/biome-darwin-x64";
sha256 = "1nx29wszaxnhs08gsljqw64z5hlbarnq6yvkvylh680q4nkirw93";
};
aarch64-linux = {
url = "https://github.com/biomejs/biome/releases/download/%40biomejs%2Fbiome%40${biome_version}/biome-linux-arm64";
sha256 = "1wy3za2h38ky358dac3jf3jhhqjqvz0x7cbqhc46j2821b8vr7i4";
};
x86_64-linux = {
url = "https://github.com/biomejs/biome/releases/download/%40biomejs%2Fbiome%40${biome_version}/biome-linux-x64";
sha256 = "1i63hawgaajnwadbhh3aq68kbgyvahk6px1iy096slcrbd423pid";
};
};
in
rec{
nodejs = final.nodejs_20;
nodePackages = nodejs.pkgs;
@@ -11,23 +34,22 @@
doCheck = false;
});
biome = prev.biome.overrideAttrs (finalAttrs: prevAttrs: rec {
biome = final.stdenv.mkDerivation {
pname = "biome";
version = "2.2.2";
version = biome_version;
src = final.fetchFromGitHub {
owner = "biomejs";
repo = "biome";
rev = "@biomejs/biome@${version}";
hash = "sha256-YmDHAsNGN5lsCgiciASdMUM6InbbjaGwyfyEX+XNOxs=";
src = final.fetchurl {
inherit (biome_dist.${final.stdenvNoCC.hostPlatform.system} or
(throw "Unsupported system: ${final.stdenvNoCC.hostPlatform.system}")) url sha256;
};
cargoHash = "sha256-l3BQMG/cCxzQizeFGwAEDP8mzLtf/21ojyd+7gzhbtU=";
dontUnpack = true;
installPhase = ''
mkdir -p $out/bin
cp $src $out/bin/biome
chmod +x $out/bin/biome
'';
};
cargoDeps = final.rustPlatform.fetchCargoVendor {
inherit (finalAttrs) pname src version;
hash = finalAttrs.cargoHash;
};
});
})

View File

@@ -1,17 +1,16 @@
final: prev: rec {
postgresql_14_18 = prev.postgresql_14.overrideAttrs
(finalAttrs: previousAttrs: rec {
pname = "postgresql";
version = "14.18";
postgresql_14_18 = (prev.postgresql_14.override { systemdSupport = false; }).overrideAttrs (finalAttrs: previousAttrs: rec {
pname = "postgresql";
version = "14.18";
src = final.fetchurl {
url = "mirror://postgresql/source/v${version}/${pname}-${version}.tar.bz2";
hash = "sha256-g6sp1r/D3Fiy7TxmQRT9++tqBFDEuNf6aa7pHjyhT44=";
};
src = final.fetchurl {
url = "mirror://postgresql/source/v${version}/${pname}-${version}.tar.bz2";
hash = "sha256-g6sp1r/D3Fiy7TxmQRT9++tqBFDEuNf6aa7pHjyhT44=";
};
doCheck = false;
doInstallCheck = false;
});
doCheck = false;
doInstallCheck = false;
});
postgresql_14_18-client = final.stdenv.mkDerivation {
pname = "postgresql-client";
@@ -28,16 +27,15 @@ final: prev: rec {
'';
};
postgresql_15_13 = prev.postgresql_15.overrideAttrs
(finalAttrs: previousAttrs: rec {
pname = "postgresql";
version = "15.13";
postgresql_15_13 = (prev.postgresql_15.override { systemdSupport = false; }).overrideAttrs (finalAttrs: previousAttrs: rec {
pname = "postgresql";
version = "15.13";
src = final.fetchurl {
url = "mirror://postgresql/source/v${version}/${pname}-${version}.tar.bz2";
hash = "sha256-T2LhM9IuoIoEAbCECSDiZphkTQGoDDQ0H7cy3QqQyl0=";
};
});
src = final.fetchurl {
url = "mirror://postgresql/source/v${version}/${pname}-${version}.tar.bz2";
hash = "sha256-T2LhM9IuoIoEAbCECSDiZphkTQGoDDQ0H7cy3QqQyl0=";
};
});
postgresql_15_13-client = final.stdenv.mkDerivation {
pname = "postgresql-client";
@@ -54,16 +52,15 @@ final: prev: rec {
'';
};
postgresql_16_9 = prev.postgresql_16.overrideAttrs
(finalAttrs: previousAttrs: rec {
pname = "postgresql";
version = "16.9";
postgresql_16_9 = (prev.postgresql_16.override { systemdSupport = false; }).overrideAttrs (finalAttrs: previousAttrs: rec {
pname = "postgresql";
version = "16.9";
src = final.fetchurl {
url = "mirror://postgresql/source/v${version}/${pname}-${version}.tar.bz2";
hash = "sha256-B8APuCTfCgwpXySfRGkbhuMmZ1OzgMlvYzwzEeEL0AU=";
};
});
src = final.fetchurl {
url = "mirror://postgresql/source/v${version}/${pname}-${version}.tar.bz2";
hash = "sha256-B8APuCTfCgwpXySfRGkbhuMmZ1OzgMlvYzwzEeEL0AU=";
};
});
postgresql_16_9-client = final.stdenv.mkDerivation {
pname = "postgresql-client";
@@ -80,16 +77,15 @@ final: prev: rec {
'';
};
postgresql_17_5 = prev.postgresql_17.overrideAttrs
(finalAttrs: previousAttrs: rec {
pname = "postgresql";
version = "17.5";
postgresql_17_5 = (prev.postgresql_17.override { systemdSupport = false; }).overrideAttrs (finalAttrs: previousAttrs: rec {
pname = "postgresql";
version = "17.5";
src = final.fetchurl {
url = "mirror://postgresql/source/v${version}/${pname}-${version}.tar.bz2";
hash = "sha256-/LerOOI7Jk0ZAssl5q2vtFJabry9AVQ0ru+e2oD1KNg=";
};
});
src = final.fetchurl {
url = "mirror://postgresql/source/v${version}/${pname}-${version}.tar.bz2";
hash = "sha256-/LerOOI7Jk0ZAssl5q2vtFJabry9AVQ0ru+e2oD1KNg=";
};
});
postgresql_17_5-client = final.stdenv.mkDerivation {
pname = "postgresql-client";

View File

@@ -133,9 +133,9 @@ import (
#ResourcesCompute: {
// milicpus, 1000 milicpus = 1 cpu
cpu: uint32 & >=250 & <=15000
cpu: uint32 & >=250 & <=30000
// MiB: 128MiB to 30GiB
memory: uint32 & >=128 & <=30720
memory: uint32 & >=128 & <=62464
// validate CPU steps of 250 milicpus
_validateCPUSteps250: (mod(cpu, 250) == 0) & true @cuegraph(skip)

2
vendor/modules.txt vendored
View File

@@ -823,7 +823,7 @@ github.com/muesli/termenv
# github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822
## explicit
github.com/munnerz/goautoneg
# github.com/nhost/be v0.0.0-20250826134155-48638c4b3f6a
# github.com/nhost/be v0.0.0-20250929153845-6db3e5249d33
## explicit; go 1.24.2
github.com/nhost/be/lib/graphql
github.com/nhost/be/lib/graphql/context