style: align oxfmt to trailing-comma 'all' and normalize code
All checks were successful
Build and Push Docker Image / build (push) Successful in 28s
All checks were successful
Build and Push Docker Image / build (push) Successful in 28s
The repo was authored prettier-style (trailing-comma 'all') but .oxfmtrc.json was set to 'es5', so every formatted file diverged. Switch the config to 'all' to match the existing code, ignore docs/** and **/drizzle/** (prose + generated snapshots the formatter should not own), and reformat the source tree once for consistency. No behavioural change; all suites green (api 60, worker 28, admin 21).
This commit is contained in:
@@ -6,10 +6,10 @@
|
||||
"semi": true,
|
||||
"singleQuote": true,
|
||||
"jsxSingleQuote": false,
|
||||
"trailingComma": "es5",
|
||||
"trailingComma": "all",
|
||||
"bracketSpacing": true,
|
||||
"bracketSameLine": false,
|
||||
"arrowParens": "always",
|
||||
"endOfLine": "lf",
|
||||
"ignorePatterns": ["examples/**/*"]
|
||||
"ignorePatterns": ["examples/**/*", "docs/**", "**/drizzle/**"]
|
||||
}
|
||||
|
||||
@@ -22,7 +22,7 @@ function renderApp() {
|
||||
return render(
|
||||
<QueryClientProvider client={queryClient}>
|
||||
<App />
|
||||
</QueryClientProvider>
|
||||
</QueryClientProvider>,
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -46,7 +46,7 @@ function renderHarness() {
|
||||
return render(
|
||||
<AuthProvider>
|
||||
<Harness />
|
||||
</AuthProvider>
|
||||
</AuthProvider>,
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@ export const API_URL = import.meta.env.VITE_API_URL ?? 'http://localhost:3000';
|
||||
export class ApiError extends Error {
|
||||
constructor(
|
||||
public status: number,
|
||||
message: string
|
||||
message: string,
|
||||
) {
|
||||
super(message);
|
||||
this.name = 'ApiError';
|
||||
|
||||
@@ -11,5 +11,5 @@ createRoot(document.getElementById('root')!).render(
|
||||
<QueryClientProvider client={queryClient}>
|
||||
<App />
|
||||
</QueryClientProvider>
|
||||
</React.StrictMode>
|
||||
</React.StrictMode>,
|
||||
);
|
||||
|
||||
@@ -41,7 +41,7 @@ function renderActivities() {
|
||||
return render(
|
||||
<QueryClientProvider client={queryClient}>
|
||||
<Activities />
|
||||
</QueryClientProvider>
|
||||
</QueryClientProvider>,
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -100,7 +100,7 @@ export default function Activities() {
|
||||
setNewName('');
|
||||
setNewTypes([...ALL_TYPES]);
|
||||
},
|
||||
}
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
@@ -118,13 +118,13 @@ export default function Activities() {
|
||||
if (editName.trim().length === 0 || editTypes.length === 0) return;
|
||||
updateActivity.mutate(
|
||||
{ id, input: { name: editName.trim(), insole_types: editTypes } },
|
||||
{ onSuccess: () => setEditingId(null) }
|
||||
{ onSuccess: () => setEditingId(null) },
|
||||
);
|
||||
}
|
||||
|
||||
function handleDelete(id: number, name: string) {
|
||||
const ok = window.confirm(
|
||||
`"${name}" verwijderen? Alle tijdsregistraties voor deze taak worden ook verwijderd.`
|
||||
`"${name}" verwijderen? Alle tijdsregistraties voor deze taak worden ook verwijderd.`,
|
||||
);
|
||||
if (ok) deleteActivity.mutate(id);
|
||||
}
|
||||
|
||||
@@ -38,7 +38,7 @@ function renderLive() {
|
||||
return render(
|
||||
<QueryClientProvider client={queryClient}>
|
||||
<Live />
|
||||
</QueryClientProvider>
|
||||
</QueryClientProvider>,
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -54,7 +54,7 @@ function LiveCard({ session, now }: { session: WorkSession; now: number }) {
|
||||
const base = session.paused_at ? Date.parse(session.paused_at) : now;
|
||||
const worked = Math.max(
|
||||
0,
|
||||
Math.floor((base - Date.parse(session.start_time)) / 1000) - session.paused_seconds
|
||||
Math.floor((base - Date.parse(session.start_time)) / 1000) - session.paused_seconds,
|
||||
);
|
||||
return (
|
||||
<article className="live-card">
|
||||
|
||||
@@ -16,7 +16,7 @@ export default function Login() {
|
||||
await signIn(email, password);
|
||||
} catch (err) {
|
||||
setError(
|
||||
err instanceof NotAdminError ? 'Geen toegang — alleen beheerders.' : 'Inloggen mislukt'
|
||||
err instanceof NotAdminError ? 'Geen toegang — alleen beheerders.' : 'Inloggen mislukt',
|
||||
);
|
||||
} finally {
|
||||
setBusy(false);
|
||||
|
||||
@@ -18,7 +18,7 @@ export function createApp(): Hono {
|
||||
allowHeaders: ['Content-Type', 'Authorization'],
|
||||
exposeHeaders: ['set-auth-token'], // so the SPA can read the bearer token on sign-in
|
||||
credentials: true,
|
||||
})
|
||||
}),
|
||||
);
|
||||
app.route('/', health);
|
||||
app.on(['POST', 'GET'], '/api/auth/*', (c) => auth.handler(c.req.raw));
|
||||
|
||||
@@ -45,7 +45,7 @@ export const session = sqliteTable(
|
||||
},
|
||||
(table) => ({
|
||||
sessionUserIdIdx: index('session_userId_idx').on(table.userId),
|
||||
})
|
||||
}),
|
||||
);
|
||||
|
||||
export const account = sqliteTable(
|
||||
@@ -73,7 +73,7 @@ export const account = sqliteTable(
|
||||
},
|
||||
(table) => ({
|
||||
accountUserIdIdx: index('account_userId_idx').on(table.userId),
|
||||
})
|
||||
}),
|
||||
);
|
||||
|
||||
export const verification = sqliteTable(
|
||||
@@ -93,7 +93,7 @@ export const verification = sqliteTable(
|
||||
},
|
||||
(table) => ({
|
||||
verificationIdentifierIdx: index('verification_identifier_idx').on(table.identifier),
|
||||
})
|
||||
}),
|
||||
);
|
||||
|
||||
export const userRelations = relations(user, ({ many }) => ({
|
||||
@@ -157,5 +157,5 @@ export const workSessions = sqliteTable(
|
||||
(table) => ({
|
||||
workSessionsUserIdIdx: index('work_sessions_userId_idx').on(table.userId),
|
||||
workSessionsStartTimeIdx: index('work_sessions_startTime_idx').on(table.startTime),
|
||||
})
|
||||
}),
|
||||
);
|
||||
|
||||
@@ -5,7 +5,7 @@ type WorkSessionRow = typeof workSessions.$inferSelect;
|
||||
|
||||
export function toWorkSession(
|
||||
row: WorkSessionRow,
|
||||
opts: { activityName?: string | null; userName?: string | null; userEmail?: string | null } = {}
|
||||
opts: { activityName?: string | null; userName?: string | null; userEmail?: string | null } = {},
|
||||
): WorkSession {
|
||||
return {
|
||||
id: row.id,
|
||||
|
||||
@@ -35,8 +35,8 @@ adminRoutes.get('/api/admin/sessions', async (c) => {
|
||||
activityName: r.activityName,
|
||||
userName: r.userName,
|
||||
userEmail: r.userEmail,
|
||||
})
|
||||
)
|
||||
}),
|
||||
),
|
||||
);
|
||||
});
|
||||
|
||||
@@ -54,7 +54,7 @@ adminRoutes.get('/api/admin/sessions/active', async (c) => {
|
||||
activityName: r.activityName,
|
||||
userName: r.userName,
|
||||
userEmail: r.userEmail,
|
||||
})
|
||||
)
|
||||
}),
|
||||
),
|
||||
);
|
||||
});
|
||||
|
||||
@@ -236,7 +236,7 @@ describe('activities routes', () => {
|
||||
expect(after.map((r) => r.id)).toEqual(ids);
|
||||
// In particular, b now precedes a.
|
||||
expect(after.findIndex((r) => r.id === b.id)).toBeLessThan(
|
||||
after.findIndex((r) => r.id === a.id)
|
||||
after.findIndex((r) => r.id === a.id),
|
||||
);
|
||||
});
|
||||
|
||||
|
||||
@@ -14,7 +14,7 @@ async function completedSession(
|
||||
token: string,
|
||||
activityId: number,
|
||||
insoleType: string,
|
||||
durationSeconds: number
|
||||
durationSeconds: number,
|
||||
): Promise<number> {
|
||||
const startRes = await app.request('/api/sessions/start', {
|
||||
method: 'POST',
|
||||
@@ -47,13 +47,13 @@ describe('csv export', () => {
|
||||
expect(res.status).toBe(200);
|
||||
expect(res.headers.get('content-type')).toContain('text/csv');
|
||||
expect(res.headers.get('content-disposition')).toBe(
|
||||
'attachment; filename="insole-production-report.csv"'
|
||||
'attachment; filename="insole-production-report.csv"',
|
||||
);
|
||||
|
||||
const text = await res.text();
|
||||
const lines = text.split('\n');
|
||||
expect(lines[0]).toBe(
|
||||
'"ID","Task","Insole Type","No. of Insoles","Date","Total Duration","Paused Duration","Start Time","End Time"'
|
||||
'"ID","Task","Insole Type","No. of Insoles","Date","Total Duration","Paused Duration","Start Time","End Time"',
|
||||
);
|
||||
expect(lines).toHaveLength(2);
|
||||
expect(lines[1]).toContain('"Frezen"');
|
||||
|
||||
@@ -27,7 +27,7 @@ export async function createTestUser(email: string, role: 'worker' | 'admin' = '
|
||||
export async function authToken(
|
||||
app: Hono,
|
||||
email: string,
|
||||
role: 'worker' | 'admin' = 'worker'
|
||||
role: 'worker' | 'admin' = 'worker',
|
||||
): Promise<string> {
|
||||
await createTestUser(email, role);
|
||||
const signin = await app.request('/api/auth/sign-in/email', {
|
||||
@@ -47,7 +47,7 @@ export function bearer(token: string): Record<string, string> {
|
||||
// Insert an activity straight into the DB (test setup that should not depend on authz).
|
||||
export async function seedActivity(
|
||||
name: string,
|
||||
insoleTypes: string[] = ['Kurk', 'Berk', '3D']
|
||||
insoleTypes: string[] = ['Kurk', 'Berk', '3D'],
|
||||
): Promise<number> {
|
||||
const [row] = await db.insert(activities).values({ name, insoleTypes }).returning();
|
||||
return row.id;
|
||||
|
||||
@@ -33,7 +33,7 @@ describe('seed', () => {
|
||||
|
||||
await seed();
|
||||
expect(await db.select().from(user).where(eq(user.email, 'admin@solelog.local'))).toHaveLength(
|
||||
1
|
||||
1,
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -378,7 +378,7 @@ describe('session reads', () => {
|
||||
const body = await res.json();
|
||||
expect(body).toHaveLength(2);
|
||||
expect(new Date(body[0].start_time).getTime()).toBeGreaterThan(
|
||||
new Date(body[1].start_time).getTime()
|
||||
new Date(body[1].start_time).getTime(),
|
||||
);
|
||||
expect(body[0].activity_name).toBe('Slijpen');
|
||||
expect(body[1].activity_name).toBe('Frezen');
|
||||
|
||||
@@ -18,7 +18,7 @@ function renderApp() {
|
||||
return render(
|
||||
<QueryClientProvider client={queryClient}>
|
||||
<App />
|
||||
</QueryClientProvider>
|
||||
</QueryClientProvider>,
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -39,7 +39,7 @@ describe('AuthContext signOut', () => {
|
||||
render(
|
||||
<AuthProvider>
|
||||
<SignOutButton />
|
||||
</AuthProvider>
|
||||
</AuthProvider>,
|
||||
);
|
||||
|
||||
await user.click(screen.getByRole('button', { name: 'Uitloggen' }));
|
||||
|
||||
@@ -28,10 +28,7 @@ describe('api client', () => {
|
||||
});
|
||||
|
||||
it('throws ApiError on a non-2xx response', async () => {
|
||||
vi.stubGlobal(
|
||||
'fetch',
|
||||
vi.fn().mockResolvedValue(new Response(null, { status: 401 })),
|
||||
);
|
||||
vi.stubGlobal('fetch', vi.fn().mockResolvedValue(new Response(null, { status: 401 })));
|
||||
|
||||
await expect(apiFetch('/api/me')).rejects.toMatchObject({ status: 401 });
|
||||
await expect(apiFetch('/api/me')).rejects.toBeInstanceOf(ApiError);
|
||||
|
||||
@@ -5,7 +5,7 @@ export const API_URL = import.meta.env.VITE_API_URL ?? 'http://localhost:3000';
|
||||
export class ApiError extends Error {
|
||||
constructor(
|
||||
public status: number,
|
||||
message: string
|
||||
message: string,
|
||||
) {
|
||||
super(message);
|
||||
this.name = 'ApiError';
|
||||
|
||||
@@ -21,7 +21,7 @@ function renderAccount() {
|
||||
<AuthProvider>
|
||||
<Account />
|
||||
</AuthProvider>
|
||||
</QueryClientProvider>
|
||||
</QueryClientProvider>,
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -46,7 +46,7 @@ function renderHistory() {
|
||||
return render(
|
||||
<QueryClientProvider client={queryClient}>
|
||||
<History />
|
||||
</QueryClientProvider>
|
||||
</QueryClientProvider>,
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -91,7 +91,7 @@ function renderStopwatch() {
|
||||
return render(
|
||||
<QueryClientProvider client={queryClient}>
|
||||
<Stopwatch />
|
||||
</QueryClientProvider>
|
||||
</QueryClientProvider>,
|
||||
);
|
||||
}
|
||||
|
||||
@@ -105,17 +105,17 @@ describe('Stopwatch', () => {
|
||||
mockedUseActivities.mockReturnValue(query<ReturnType<typeof useActivities>>([FREZEN, PRINTEN]));
|
||||
mockedUseActiveSessions.mockReturnValue(query<ReturnType<typeof useActiveSessions>>([]));
|
||||
mockedUseStartSession.mockReturnValue(
|
||||
mutation<ReturnType<typeof useStartSession>>(startMutate)
|
||||
mutation<ReturnType<typeof useStartSession>>(startMutate),
|
||||
);
|
||||
mockedUseStopSession.mockReturnValue(mutation<ReturnType<typeof useStopSession>>(stopMutate));
|
||||
mockedUseDiscardSession.mockReturnValue(
|
||||
mutation<ReturnType<typeof useDiscardSession>>(discardMutate)
|
||||
mutation<ReturnType<typeof useDiscardSession>>(discardMutate),
|
||||
);
|
||||
mockedUsePauseSession.mockReturnValue(
|
||||
mutation<ReturnType<typeof usePauseSession>>(pauseMutate)
|
||||
mutation<ReturnType<typeof usePauseSession>>(pauseMutate),
|
||||
);
|
||||
mockedUseResumeSession.mockReturnValue(
|
||||
mutation<ReturnType<typeof useResumeSession>>(resumeMutate)
|
||||
mutation<ReturnType<typeof useResumeSession>>(resumeMutate),
|
||||
);
|
||||
});
|
||||
|
||||
@@ -189,7 +189,7 @@ describe('Stopwatch', () => {
|
||||
const user = userEvent.setup();
|
||||
// Recover an active session so the screen renders the running UI.
|
||||
mockedUseActiveSessions.mockReturnValue(
|
||||
query<ReturnType<typeof useActiveSessions>>([activeSession()])
|
||||
query<ReturnType<typeof useActiveSessions>>([activeSession()]),
|
||||
);
|
||||
renderStopwatch();
|
||||
|
||||
@@ -197,7 +197,7 @@ describe('Stopwatch', () => {
|
||||
await user.click(cancel);
|
||||
|
||||
expect(
|
||||
screen.getByRole('button', { name: 'Nogmaals tikken ter bevestiging' })
|
||||
screen.getByRole('button', { name: 'Nogmaals tikken ter bevestiging' }),
|
||||
).toBeInTheDocument();
|
||||
|
||||
await user.click(screen.getByRole('button', { name: 'Nogmaals tikken ter bevestiging' }));
|
||||
@@ -208,7 +208,7 @@ describe('Stopwatch', () => {
|
||||
it('pauses via the server when the display is tapped while running', async () => {
|
||||
const user = userEvent.setup();
|
||||
mockedUseActiveSessions.mockReturnValue(
|
||||
query<ReturnType<typeof useActiveSessions>>([activeSession()])
|
||||
query<ReturnType<typeof useActiveSessions>>([activeSession()]),
|
||||
);
|
||||
renderStopwatch();
|
||||
|
||||
@@ -225,7 +225,7 @@ describe('Stopwatch', () => {
|
||||
mockedUseActiveSessions.mockReturnValue(
|
||||
query<ReturnType<typeof useActiveSessions>>([
|
||||
activeSession({ paused_at: new Date().toISOString(), paused_seconds: 30 }),
|
||||
])
|
||||
]),
|
||||
);
|
||||
renderStopwatch();
|
||||
|
||||
@@ -241,7 +241,7 @@ describe('Stopwatch', () => {
|
||||
mockedUseActiveSessions.mockReturnValue(
|
||||
query<ReturnType<typeof useActiveSessions>>([
|
||||
activeSession({ paused_at: new Date().toISOString(), paused_seconds: 30 }),
|
||||
])
|
||||
]),
|
||||
);
|
||||
renderStopwatch();
|
||||
|
||||
|
||||
@@ -118,7 +118,7 @@ export default function Stopwatch() {
|
||||
setPauseStartedMs(null);
|
||||
setNowMs(Date.now());
|
||||
},
|
||||
}
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user