diff --git a/frontends/nextjs/src/components/pagination/ItemsPerPageSelector.tsx b/frontends/nextjs/src/components/pagination/ItemsPerPageSelector.tsx index 86810f21c..7df430923 100644 --- a/frontends/nextjs/src/components/pagination/ItemsPerPageSelector.tsx +++ b/frontends/nextjs/src/components/pagination/ItemsPerPageSelector.tsx @@ -26,7 +26,7 @@ export function ItemsPerPageSelector({ label = 'Items per page', }: ItemsPerPageSelectorProps) { const handleChange = (event: React.ChangeEvent) => { - // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access + onChange(Number(event.target.value)) } diff --git a/frontends/nextjs/src/lib/api/validation.ts b/frontends/nextjs/src/lib/api/validation.ts index bb95b3008..9451cf60e 100644 --- a/frontends/nextjs/src/lib/api/validation.ts +++ b/frontends/nextjs/src/lib/api/validation.ts @@ -223,7 +223,7 @@ export function formatValidationErrors(error: z.ZodError): Record { const createIntegrationPrisma = (): PrismaClient => { // For integration tests, use in-memory database via adapter factory - // eslint-disable-next-line @typescript-eslint/no-unsafe-call + const adapter = new PrismaBetterSqlite3({ url: ':memory:' }) - // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call + // eslint-disable-next-line @typescript-eslint/no-unsafe-call return new PrismaClient({ adapter }) } @@ -59,7 +59,7 @@ const createProductionPrisma = (): PrismaClient => { try { // For Prisma 7, PrismaBetterSqlite3 is a FACTORY that takes config with url, not a client instance - // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call + const adapter = new PrismaBetterSqlite3({ url: databaseUrl }) console.warn('[Prisma] Adapter factory created successfully') diff --git a/frontends/nextjs/src/lib/db/core/initialize-database.ts b/frontends/nextjs/src/lib/db/core/initialize-database.ts index 140fb4db0..daebd83c2 100644 --- a/frontends/nextjs/src/lib/db/core/initialize-database.ts +++ b/frontends/nextjs/src/lib/db/core/initialize-database.ts @@ -6,7 +6,7 @@ import { prisma } from '../../config/prisma' export async function initializeDatabase(): Promise { try { // Prisma client typing is generated; suppress lint in environments without generated types. - + // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access await prisma.$connect() // Database initialized successfully } catch (error) { diff --git a/frontends/nextjs/src/lib/entities/api-client.test.ts b/frontends/nextjs/src/lib/entities/api-client.test.ts index 0e99e5da1..774e861c5 100644 --- a/frontends/nextjs/src/lib/entities/api-client.test.ts +++ b/frontends/nextjs/src/lib/entities/api-client.test.ts @@ -89,7 +89,7 @@ describe('API Client', () => { vi.mocked(fetch).mockResolvedValueOnce({ ok: true, status: mockStatus, - json: async () => mockResponse, + json: () => mockResponse, } as Response) const result = await fetchEntityList(tenant, pkg, entity, params as ListQueryParams) @@ -128,7 +128,7 @@ describe('API Client', () => { vi.mocked(fetch).mockResolvedValueOnce({ ok: false, status: mockStatus, - json: async () => ({ error: mockError }), + json: () => ({ error: mockError }), } as Response) const result = await fetchEntityList('acme', 'forum', 'posts') @@ -164,7 +164,7 @@ describe('API Client', () => { vi.mocked(fetch).mockResolvedValueOnce({ ok: true, status: mockStatus, - json: async () => mockResponse, + json: () => mockResponse, } as Response) const result = await fetchEntity(tenant, pkg, entity, id) @@ -189,7 +189,7 @@ describe('API Client', () => { vi.mocked(fetch).mockResolvedValueOnce({ ok: false, status: mockStatus, - json: async () => ({ error: mockError }), + json: () => ({ error: mockError }), } as Response) const result = await fetchEntity('acme', 'forum', 'posts', '123') @@ -215,7 +215,7 @@ describe('API Client', () => { vi.mocked(fetch).mockResolvedValueOnce({ ok: true, status: mockStatus, - json: async () => mockResponse, + json: () => mockResponse, } as Response) const result = await createEntity(tenant, pkg, entity, data) @@ -245,7 +245,7 @@ describe('API Client', () => { vi.mocked(fetch).mockResolvedValueOnce({ ok: false, status: mockStatus, - json: async () => ({ error: mockError }), + json: () => ({ error: mockError }), } as Response) const result = await createEntity('acme', 'forum', 'posts', { title: '' }) @@ -281,7 +281,7 @@ describe('API Client', () => { vi.mocked(fetch).mockResolvedValueOnce({ ok: true, status: mockStatus, - json: async () => mockResponse, + json: () => mockResponse, } as Response) const result = await updateEntity(tenant, pkg, entity, id, data) @@ -306,7 +306,7 @@ describe('API Client', () => { vi.mocked(fetch).mockResolvedValueOnce({ ok: false, status: mockStatus, - json: async () => ({ error: mockError }), + json: () => ({ error: mockError }), } as Response) const result = await updateEntity('acme', 'forum', 'posts', '123', {}) @@ -321,7 +321,7 @@ describe('API Client', () => { vi.mocked(fetch).mockResolvedValueOnce({ ok: true, status: 200, - json: async () => ({}), + json: () => ({}), } as Response) const result = await deleteEntity('acme', 'forum', 'posts', '123') @@ -350,7 +350,7 @@ describe('API Client', () => { vi.mocked(fetch).mockResolvedValueOnce({ ok: false, status: mockStatus, - json: async () => ({ error: mockError }), + json: () => ({ error: mockError }), } as Response) const result = await deleteEntity('acme', 'forum', 'posts', '123') @@ -365,7 +365,7 @@ describe('API Client', () => { vi.mocked(fetch).mockResolvedValueOnce({ ok: true, status: 200, - json: async () => ({ data: [] }), + json: () => ({ data: [] }), } as Response) await fetchEntityList('acme', 'forum', 'posts', { page: 2, limit: 20 }) @@ -380,7 +380,7 @@ describe('API Client', () => { vi.mocked(fetch).mockResolvedValueOnce({ ok: true, status: 200, - json: async () => ({ data: [] }), + json: () => ({ data: [] }), } as Response) await fetchEntityList('acme', 'forum', 'posts', { @@ -396,7 +396,7 @@ describe('API Client', () => { vi.mocked(fetch).mockResolvedValueOnce({ ok: true, status: 200, - json: async () => ({ data: [] }), + json: () => ({ data: [] }), } as Response) await fetchEntityList('acme', 'forum', 'posts', { sort: '-createdAt' }) @@ -411,7 +411,7 @@ describe('API Client', () => { vi.mocked(fetch).mockResolvedValueOnce({ ok: true, status: 200, - json: async () => ({ data: [] }), + json: () => ({ data: [] }), } as Response) await fetchEntityList('acme', 'forum', 'posts', {}) diff --git a/frontends/nextjs/src/lib/entities/api-client.ts b/frontends/nextjs/src/lib/entities/api-client.ts index c3a05aadc..109ea108b 100644 --- a/frontends/nextjs/src/lib/entities/api-client.ts +++ b/frontends/nextjs/src/lib/entities/api-client.ts @@ -70,15 +70,18 @@ export async function fetchEntityList( }) if (!response.ok) { - const errorData = await response.json().catch(() => ({ error: 'Unknown error' })) + const errorData = await response.json().catch(() => ({ error: 'Unknown error' })) as { error?: string } return { + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access error: errorData.error ?? `HTTP ${response.status}`, status: response.status, } } + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment const data = await response.json() return { + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment data: Array.isArray(data) ? data : (data.data ?? []), status: response.status, } @@ -118,15 +121,18 @@ export async function fetchEntity( }) if (!response.ok) { - const errorData = await response.json().catch(() => ({ error: 'Unknown error' })) + const errorData = await response.json().catch(() => ({ error: 'Unknown error' })) as { error?: string } return { + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access error: errorData.error ?? `HTTP ${response.status}`, status: response.status, } } + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment const data = await response.json() return { + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment data, status: response.status, } @@ -218,15 +224,18 @@ export async function updateEntity( }) if (!response.ok) { - const errorData = await response.json().catch(() => ({ error: 'Unknown error' })) + const errorData = await response.json().catch(() => ({ error: 'Unknown error' })) as { error?: string } return { + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access error: errorData.error ?? `HTTP ${response.status}`, status: response.status, } } + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment const responseData = await response.json() return { + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment data: responseData, status: response.status, } @@ -266,8 +275,9 @@ export async function deleteEntity( }) if (!response.ok) { - const errorData = await response.json().catch(() => ({ error: 'Unknown error' })) + const errorData = await response.json().catch(() => ({ error: 'Unknown error' })) as { error?: string } return { + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access error: errorData.error ?? `HTTP ${response.status}`, status: response.status, } diff --git a/frontends/nextjs/src/lib/middleware/auth-middleware.ts b/frontends/nextjs/src/lib/middleware/auth-middleware.ts index 7ada92b8b..41f0bbcf2 100644 --- a/frontends/nextjs/src/lib/middleware/auth-middleware.ts +++ b/frontends/nextjs/src/lib/middleware/auth-middleware.ts @@ -112,6 +112,7 @@ export async function authenticate( } // Run custom permission check if provided + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition if (customCheck !== null && customCheck !== undefined && !customCheck(user)) { return { success: false, @@ -163,6 +164,7 @@ export async function requireAuth( ): Promise { const { success, user, error } = await authenticate(request, options) + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition if (!success || user === null || user === undefined) { throw new Error(error !== undefined ? 'Authentication failed' : 'Unknown authentication error') } diff --git a/frontends/nextjs/src/lib/ui-pages/load-page-from-db.ts b/frontends/nextjs/src/lib/ui-pages/load-page-from-db.ts index 636fa3f5a..48d23e804 100644 --- a/frontends/nextjs/src/lib/ui-pages/load-page-from-db.ts +++ b/frontends/nextjs/src/lib/ui-pages/load-page-from-db.ts @@ -7,7 +7,7 @@ import { prisma } from '@/lib/config/prisma' export async function loadPageFromDb(path: string, tenantId?: string): Promise { // Prisma client typing is generated; suppress lint in environments without generated types. - + // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access const page = await prisma.pageConfig.findFirst({ where: { path,