mirror of
https://github.com/BerriAI/litellm.git
synced 2026-08-28 05:25:59 +00:00
* chore(ui): add filename, size, JSX-handler, prefer-const, and antd lint rules Wires up five error-level ESLint rules on the dashboard, grandfathering every current offender into eslint-suppressions.json so the gate only bites new code and ratchets down as files are fixed - local/filename-pascal-case: new local rule requiring PascalCase .tsx names, exempting Next.js reserved files (page, layout, route, ...) and test/spec files (239 grandfathered) - max-lines: 800 lines over src/**, excluding tests, src/data, and generated schema.d.ts (20 grandfathered) - local/no-complex-jsx-arrow: new local rule flagging inline JSX arrow handlers with block bodies over two statements; each failure is a small extract-to-named -handler refactor (65 grandfathered) - prefer-const: flipped from off to error (103 grandfathered) - no-restricted-imports: added antd to the phase-out ban alongside tremor, and pointed both messages at shadcn/ui primitives (405 antd import sites grandfathered) Both new local rules ship with RuleTester coverage * fix(ui): preserve secondary extensions in filename-pascal-case suggestion The suggestion text built the rename from only the head segment, so a multi-dot file like my-component.utils.tsx was told to become MyComponent.tsx instead of MyComponent.utils.tsx. Rebuild it from the PascalCased head plus the untouched remaining segments, and add tests covering multi-dot filenames and the hyphenated Next.js reserved names (global-error, apple-icon, opengraph-image, twitter-image)
47 lines
2.1 KiB
TypeScript
47 lines
2.1 KiB
TypeScript
import { RuleTester } from "eslint";
|
|
import rule from "../../scripts/eslint-rules/filename-pascal-case.mjs";
|
|
|
|
const ruleTester = new RuleTester({
|
|
languageOptions: { ecmaVersion: "latest", sourceType: "module", parserOptions: { ecmaFeatures: { jsx: true } } },
|
|
});
|
|
|
|
ruleTester.run("filename-pascal-case", rule as never, {
|
|
valid: [
|
|
{ code: "export const x = 1;", filename: "src/components/TeamInfo.tsx" },
|
|
{ code: "export const x = 1;", filename: "src/components/Button.tsx" },
|
|
{ code: "export const x = 1;", filename: "src/app/teams/page.tsx" },
|
|
{ code: "export const x = 1;", filename: "src/app/teams/layout.tsx" },
|
|
{ code: "export const x = 1;", filename: "src/app/teams/not-found.tsx" },
|
|
{ code: "export const x = 1;", filename: "src/app/global-error.tsx" },
|
|
{ code: "export const x = 1;", filename: "src/app/apple-icon.tsx" },
|
|
{ code: "export const x = 1;", filename: "src/app/opengraph-image.tsx" },
|
|
{ code: "export const x = 1;", filename: "src/app/twitter-image.tsx" },
|
|
{ code: "export const x = 1;", filename: "src/components/TeamInfo.test.tsx" },
|
|
{ code: "export const x = 1;", filename: "src/components/view_users.test.tsx" },
|
|
{ code: "export const x = 1;", filename: "src/components/TeamInfo.spec.tsx" },
|
|
],
|
|
invalid: [
|
|
{
|
|
code: "export const x = 1;",
|
|
filename: "src/components/user_info_view.tsx",
|
|
errors: [{ messageId: "notPascalCase", data: { name: "user_info_view.tsx", suggestion: "UserInfoView" } }],
|
|
},
|
|
{
|
|
code: "export const x = 1;",
|
|
filename: "src/components/team-info.tsx",
|
|
errors: [{ messageId: "notPascalCase", data: { name: "team-info.tsx", suggestion: "TeamInfo" } }],
|
|
},
|
|
{
|
|
code: "export const x = 1;",
|
|
filename: "src/components/teamInfo.tsx",
|
|
errors: [{ messageId: "notPascalCase", data: { name: "teamInfo.tsx", suggestion: "TeamInfo" } }],
|
|
},
|
|
{
|
|
code: "export const x = 1;",
|
|
filename: "src/components/my-component.utils.tsx",
|
|
errors: [
|
|
{ messageId: "notPascalCase", data: { name: "my-component.utils.tsx", suggestion: "MyComponent.utils" } },
|
|
],
|
|
},
|
|
],
|
|
});
|