Add ESLint + Prettier + EditorConfig tooling at repo root

v1.0 Phase 1.1 — repo-wide lint/format baseline.

- eslint.config.mjs (flat config) lints server, client, shared
- .prettierrc.json, .prettierignore, .editorconfig, .nvmrc
- Root package.json holds shared devDeps; per-package scripts keep
  their typecheck + test runners
- Fix 7 lint issues surfaced by the baseline run:
  - TicketDetail.tsx: replace ternary-with-side-effects with if/else
  - admin/Users.tsx: escape apostrophe in JSX
  - errorHandler.ts: typed err as unknown with ErrorLike refinement
  - users.ts: Prisma.UserUpdateInput instead of Record<string, any>
  - seed.ts: drop unused goddard binding
- Run prettier across tracked sources for a clean formatting baseline
This commit is contained in:
2026-04-18 14:47:34 -04:00
parent 2a6090e473
commit 27d2ab0f0d
48 changed files with 14460 additions and 1096 deletions
+20 -24
View File
@@ -1,28 +1,28 @@
import { useState } from 'react'
import { useNavigate } from 'react-router-dom'
import { useAuth } from '../contexts/AuthContext'
import { useState } from 'react';
import { useNavigate } from 'react-router-dom';
import { useAuth } from '../contexts/AuthContext';
export default function Login() {
const { login } = useAuth()
const navigate = useNavigate()
const [username, setUsername] = useState('')
const [password, setPassword] = useState('')
const [error, setError] = useState('')
const [loading, setLoading] = useState(false)
const { login } = useAuth();
const navigate = useNavigate();
const [username, setUsername] = useState('');
const [password, setPassword] = useState('');
const [error, setError] = useState('');
const [loading, setLoading] = useState(false);
const handleSubmit = async (e: React.FormEvent) => {
e.preventDefault()
setError('')
setLoading(true)
e.preventDefault();
setError('');
setLoading(true);
try {
await login(username, password)
navigate('/')
await login(username, password);
navigate('/');
} catch {
setError('Invalid username or password')
setError('Invalid username or password');
} finally {
setLoading(false)
setLoading(false);
}
}
};
return (
<div className="min-h-screen bg-gray-950 flex items-center justify-center px-4">
@@ -43,9 +43,7 @@ export default function Login() {
)}
<div>
<label className="block text-sm font-medium text-gray-300 mb-1">
Username
</label>
<label className="block text-sm font-medium text-gray-300 mb-1">Username</label>
<input
type="text"
value={username}
@@ -57,9 +55,7 @@ export default function Login() {
</div>
<div>
<label className="block text-sm font-medium text-gray-300 mb-1">
Password
</label>
<label className="block text-sm font-medium text-gray-300 mb-1">Password</label>
<input
type="password"
value={password}
@@ -79,5 +75,5 @@ export default function Login() {
</form>
</div>
</div>
)
);
}