Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 0 additions & 3 deletions apps/dashboard/.eslintrc.json

This file was deleted.

8 changes: 6 additions & 2 deletions apps/dashboard/app/globals.css
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
@import "tw-animate-css";
@import "shadcn/tailwind.css";
/* Explicit paths into dist/ rather than the bare package names.
Both packages expose their CSS through an "exports" -> "style"
condition. webpack resolved that; Turbopack, which Next 16 uses for
builds by default, does not, and fails with Module not found. */
@import "../node_modules/tw-animate-css/dist/tw-animate.css";
@import "../node_modules/shadcn/dist/tailwind.css";
@tailwind base;
@tailwind components;
@tailwind utilities;
Expand Down
45 changes: 45 additions & 0 deletions apps/dashboard/eslint.config.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
// Flat config, replacing .eslintrc.json.
//
// Next 16 removed `next lint`. Running it there does not warn, it parses the
// word "lint" as a project directory and exits 1 with "Invalid project
// directory provided, no such directory: .../lint", which reads like a broken
// path rather than a removed command. `package.json` now calls eslint directly.
//
// eslint-config-next@16 requires eslint >= 9 and exports a flat config array
// rather than an object to `extends`, so the shape here is a spread rather than
// the one-line `"extends": "next/core-web-vitals"` this replaces.
import nextCoreWebVitals from "eslint-config-next/core-web-vitals";

const config = [
{
// eslint 9 has no .eslintignore. Without this, `eslint .` walks the build
// output and reports thousands of findings in generated code.
ignores: ["**/.next/**", "**/out/**", "**/node_modules/**", "next-env.d.ts"],
},
...nextCoreWebVitals,
{
rules: {
// New in eslint-config-next 16, and it lands on 12 existing call sites.
//
// It is not wrong: calling setState synchronously inside an effect does
// cause a second render. But the pattern it flags most often here is the
// hydration guard next-themes documents:
//
// const [mounted, setMounted] = useState(false);
// useEffect(() => setMounted(true), []);
//
// which exists precisely to avoid a server/client mismatch and has no
// one-line replacement. Refactoring twelve effects inside a framework
// migration would mix a mechanical upgrade with a dozen behaviour-adjacent
// changes in a live dashboard, and make the whole thing unreviewable.
//
// Downgraded rather than disabled, so the sites stay visible and countable
// instead of disappearing. Tracked in blitzcrieg1/agentmetry#95: work
// through them one at a time, then delete this block and let the rule
// error again.
"react-hooks/set-state-in-effect": "warn",
},
},
];

export default config;
3 changes: 2 additions & 1 deletion apps/dashboard/next-env.d.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
/// <reference types="next" />
/// <reference types="next/image-types/global" />
/// <reference path="./.next/types/routes.d.ts" />
import "./.next/dev/types/routes.d.ts";
import "./.next/dev/types/root-params.d.ts";

// NOTE: This file should not be edited
// see https://nextjs.org/docs/app/api-reference/config/typescript for more information.
Loading
Loading