Next.js 16, React 19.2, Identities page, Invitations identities step, PNPM Catalogs (#381)

* Upgraded to Next.js 16
* Refactored code to comply with React 19.2 ESLint rules
* Refactored some useEffect usages with the new useEffectEvent
* Added Identities page and added second step to set up an identity after accepting an invitation
* Updated all dependencies
* Introduced PNPM catalogs for some frequently updated dependencies
* Bugs fixing and improvements
This commit is contained in:
Giancarlo Buomprisco
2025-10-22 11:47:47 +09:00
committed by GitHub
parent ea0c1dde80
commit 2c0d0bf7a1
98 changed files with 4812 additions and 4394 deletions

View File

@@ -11,9 +11,9 @@
},
"author": "Makerkit",
"devDependencies": {
"@playwright/test": "^1.55.1",
"@supabase/supabase-js": "2.58.0",
"@types/node": "^24.6.2",
"@playwright/test": "^1.56.1",
"@supabase/supabase-js": "2.76.1",
"@types/node": "catalog:",
"dotenv": "17.2.3",
"node-html-parser": "^7.0.1",
"totp-generator": "^2.0.0"

View File

@@ -103,9 +103,6 @@ test.describe('Admin', () => {
),
]);
// TODO: remove when https://github.com/makerkit/next-supabase-saas-kit-turbo/issues/356 is solved
await page.reload();
await expect(page.getByText('Banned').first()).toBeVisible();
await page.context().clearCookies();
@@ -154,9 +151,6 @@ test.describe('Admin', () => {
await page.waitForTimeout(250);
// TODO: remove when https://github.com/makerkit/next-supabase-saas-kit-turbo/issues/356 is solved
await page.reload();
// Verify ban badge is removed
await expect(page.getByText('Banned')).not.toBeVisible();

View File

@@ -29,22 +29,15 @@ test.describe('Password Reset Flow', () => {
subject: 'Reset your password',
});
await page.waitForURL('/update-password');
await page.waitForURL(new RegExp('/update-password?.*'));
await auth.updatePassword(newPassword);
await page
.locator('a', {
hasText: 'Back to Home Page',
})
.click();
await page.waitForURL('/home');
}).toPass();
await page.context().clearCookies();
await page.waitForURL('/');
await page.reload();
await page.goto('/auth/sign-in');
await auth.loginAsUser({

View File

@@ -115,19 +115,37 @@ export class InvitationsPageObject {
async acceptInvitation() {
console.log('Accepting invitation...');
await Promise.all([
this.page
.locator('[data-test="join-team-form"] button[type="submit"]')
.click(),
this.page.waitForResponse((response) => {
return (
response.url().includes('/join') &&
response.request().method() === 'POST'
);
}),
]);
const click = this.page
.locator('[data-test="join-team-form"] button[type="submit"]')
.click();
console.log('Invitation accepted');
const response = this.page.waitForResponse((response) => {
return (
response.url().includes('/join') &&
response.request().method() === 'POST'
);
});
await Promise.all([click, response]);
// wait for animation to complete
await this.page.waitForTimeout(500);
// skip authentication setup
const skipIdentitiesButton = this.page.locator(
'[data-test="skip-identities-button"]',
);
if (
await skipIdentitiesButton.isVisible({
timeout: 1000,
})
) {
await skipIdentitiesButton.click();
}
// wait for redirect to account home
await this.page.waitForURL(new RegExp('/home/[a-z0-9-]+'));
}
private getInviteForm() {