style: some minor style improvements

This commit is contained in:
2026-03-06 20:53:05 +02:00
parent 10661f3127
commit 437ae2c16c
10 changed files with 44 additions and 29 deletions

View File

@@ -27,21 +27,26 @@ export default tseslint.config(
"react-refresh/only-export-components": ["warn", { allowConstantExport: true }], "react-refresh/only-export-components": ["warn", { allowConstantExport: true }],
// imports // imports
"simple-import-sort/imports": "error",
"simple-import-sort/exports": "error", "simple-import-sort/exports": "error",
"simple-import-sort/imports": "error",
// brackets // core
"curly": "error", "curly": "error",
"@stylistic/brace-style": ["error", "1tbs"], "eqeqeq": "error",
"no-console": "error",
"no-eval": "error",
// stylistic // stylistic
"@stylistic/array-bracket-spacing": ["error", "never"], "@stylistic/array-bracket-spacing": ["error", "never"],
"@stylistic/arrow-parens": ["error", "as-needed"], "@stylistic/arrow-parens": ["error", "as-needed"],
"@stylistic/brace-style": ["error", "1tbs"],
"@stylistic/comma-dangle": ["error", "always-multiline"], "@stylistic/comma-dangle": ["error", "always-multiline"],
"@stylistic/comma-spacing": ["error", { before: false, after: true }], "@stylistic/comma-spacing": ["error", { before: false, after: true }],
"@stylistic/eol-last": ["error", "always"], "@stylistic/eol-last": ["error", "always"],
"@stylistic/indent": ["error", 4], "@stylistic/indent": ["error", 4],
"@stylistic/jsx-curly-brace-presence": ["error", { props: "never", children: "never" }],
"@stylistic/jsx-quotes": ["error", "prefer-double"], "@stylistic/jsx-quotes": ["error", "prefer-double"],
"@stylistic/jsx-self-closing-comp": ["error", { component: true, html: true }],
"@stylistic/max-len": ["error", { "@stylistic/max-len": ["error", {
code: 120, code: 120,
ignoreComments: true, ignoreComments: true,
@@ -49,6 +54,7 @@ export default tseslint.config(
ignoreTemplateLiterals: true, ignoreTemplateLiterals: true,
ignoreUrls: true, ignoreUrls: true,
}], }],
"@stylistic/member-delimiter-style": ["error", { multiline: { delimiter: "semi" }, singleline: { delimiter: "semi" } }],
"@stylistic/no-extra-parens": ["error", "all"], "@stylistic/no-extra-parens": ["error", "all"],
"@stylistic/no-multi-spaces": "error", "@stylistic/no-multi-spaces": "error",
"@stylistic/no-multiple-empty-lines": ["error", { max: 1 }], "@stylistic/no-multiple-empty-lines": ["error", { max: 1 }],
@@ -58,10 +64,14 @@ export default tseslint.config(
"@stylistic/semi": ["error", "always"], "@stylistic/semi": ["error", "always"],
// typescript // typescript
"@typescript-eslint/consistent-type-definitions": ["error", "interface"],
"@typescript-eslint/consistent-type-imports": ["error", { prefer: "type-imports" }], "@typescript-eslint/consistent-type-imports": ["error", { prefer: "type-imports" }],
"@typescript-eslint/explicit-function-return-type": ["error", { allowExpressions: true }], "@typescript-eslint/explicit-function-return-type": ["error", { allowExpressions: true }],
"@typescript-eslint/no-deprecated": "error", "@typescript-eslint/no-deprecated": "error",
"@typescript-eslint/no-unused-vars": ["error", { argsIgnorePattern: "^_" }], "@typescript-eslint/no-unused-vars": ["error", { argsIgnorePattern: "^_" }],
"@typescript-eslint/prefer-nullish-coalescing": "error",
"@typescript-eslint/prefer-optional-chain": "error",
"@typescript-eslint/switch-exhaustiveness-check": "error",
}, },
}, },
); );

View File

@@ -11,30 +11,30 @@
"preview": "vite preview" "preview": "vite preview"
}, },
"dependencies": { "dependencies": {
"@emotion/react": "^11.11.0", "@emotion/react": "^11.14.0",
"@emotion/styled": "^11.11.0", "@emotion/styled": "^11.14.1",
"@mui/icons-material": "^7.3.8", "@mui/icons-material": "^7.3.9",
"@mui/material": "^7.3.8", "@mui/material": "^7.3.9",
"@mui/x-data-grid": "^8.27.3", "@mui/x-data-grid": "^8.27.4",
"@tanstack/react-query": "^5.0.0", "@tanstack/react-query": "^5.90.21",
"chart.js": "^4.5.0", "chart.js": "^4.5.1",
"react": "^19.2.4", "react": "^19.2.4",
"react-chartjs-2": "^5.2.0", "react-chartjs-2": "^5.3.1",
"react-dom": "^19.2.4", "react-dom": "^19.2.4",
"react-syntax-highlighter": "^16.1.1" "react-syntax-highlighter": "^16.1.1"
}, },
"devDependencies": { "devDependencies": {
"@eslint/js": "^9.39.3", "@eslint/js": "^9.39.3",
"@stylistic/eslint-plugin": "^5.9.0", "@stylistic/eslint-plugin": "^5.10.0",
"@types/react": "^19.2.14", "@types/react": "^19.2.14",
"@types/react-dom": "^19.2.3", "@types/react-dom": "^19.2.3",
"@types/react-syntax-highlighter": "^15.5.13", "@types/react-syntax-highlighter": "^15.5.13",
"@vitejs/plugin-react": "^5.0.0", "@vitejs/plugin-react": "^5.1.4",
"eslint": "^9.39.3", "eslint": "^9.39.3",
"eslint-plugin-react-hooks": "^7.0.1", "eslint-plugin-react-hooks": "^7.0.1",
"eslint-plugin-react-refresh": "^0.5.2", "eslint-plugin-react-refresh": "^0.5.2",
"eslint-plugin-simple-import-sort": "^12.1.1", "eslint-plugin-simple-import-sort": "^12.1.1",
"typescript": "^5.3.0", "typescript": "^5.9.3",
"typescript-eslint": "^8.56.1", "typescript-eslint": "^8.56.1",
"vite": "^7.3.1", "vite": "^7.3.1",
"vite-tsconfig-paths": "^6.1.1" "vite-tsconfig-paths": "^6.1.1"

View File

@@ -49,7 +49,7 @@ export class Client {
const timeoutId = setTimeout(() => controller.abort(), timeout); const timeoutId = setTimeout(() => controller.abort(), timeout);
const requestInit: RequestInit = { const requestInit: RequestInit = {
method: method || (json ? "POST" : "GET"), method: method ?? (json ? "POST" : "GET"),
headers, headers,
signal: controller.signal, signal: controller.signal,
}; };

View File

@@ -52,7 +52,7 @@ export default function AppLayout(): React.JSX.Element {
return <Container maxWidth="xl"> return <Container maxWidth="xl">
<Box sx={{ display: "flex", alignItems: "center", py: 1, gap: 1 }}> <Box sx={{ display: "flex", alignItems: "center", py: 1, gap: 1 }}>
<a href="https://github.com/arcan1s/ahriman" title="logo"> <a href="https://ahriman.readthedocs.io/" title="logo">
<img src="/static/logo.svg" width={30} height={30} alt="" /> <img src="/static/logo.svg" width={30} height={30} alt="" />
</a> </a>
<Box sx={{ flex: 1 }}> <Box sx={{ flex: 1 }}>

View File

@@ -1,22 +1,22 @@
import { defineConfig, type Plugin } from "vite";
import react from "@vitejs/plugin-react"; import react from "@vitejs/plugin-react";
import tsconfigPaths from "vite-tsconfig-paths";
import path from "path"; import path from "path";
import { defineConfig, type Plugin } from "vite";
import tsconfigPaths from "vite-tsconfig-paths";
function renameHtml(newName: string): Plugin { function rename(oldName: string, newName: string): Plugin {
return { return {
name: "rename-html", name: "rename",
enforce: "post", enforce: "post",
generateBundle(_, bundle) { generateBundle(_, bundle) {
if (bundle["index.html"]) { if (bundle[oldName]) {
bundle["index.html"].fileName = newName; bundle[oldName].fileName = newName;
} }
}, },
}; };
} }
export default defineConfig({ export default defineConfig({
plugins: [react(), tsconfigPaths(), renameHtml("build-status.jinja2")], plugins: [react(), tsconfigPaths(), rename("index.html", "build-status.jinja2")],
base: "/", base: "/",
build: { build: {
chunkSizeWarningLimit: 10000, chunkSizeWarningLimit: 10000,

View File

@@ -58,7 +58,7 @@ class Auth(LazyLogging):
Returns: Returns:
str: login control as html code to insert str: login control as html code to insert
""" """
return """<button type="button" class="btn btn-link" data-bs-toggle="modal" data-bs-target="#login-modal" style="text-decoration: none"><i class="bi bi-box-arrow-in-right"></i> login</button>""" return "<button type=\"button\" class=\"btn btn-link\" data-bs-toggle=\"modal\" data-bs-target=\"#login-modal\" style=\"text-decoration: none\"><i class=\"bi bi-box-arrow-in-right\"></i> login</button>"
@property @property
def is_external(self) -> bool: def is_external(self) -> bool:

View File

@@ -25,8 +25,10 @@ class AuthInfoSchema(Schema):
authorization information schema authorization information schema
""" """
control = fields.String(required=True, metadata={ control = fields.String(
metadata={
"description": "HTML control for login interface", "description": "HTML control for login interface",
"example": "<button type=\"button\" class=\"btn btn-link\" data-bs-toggle=\"modal\" data-bs-target=\"#login-modal\" style=\"text-decoration: none\"><i class=\"bi bi-box-arrow-in-right\"></i> login</button>",
}) })
enabled = fields.Boolean(required=True, metadata={ enabled = fields.Boolean(required=True, metadata={
"description": "Whether authentication is enabled or not", "description": "Whether authentication is enabled or not",
@@ -35,5 +37,5 @@ class AuthInfoSchema(Schema):
"description": "Whether authorization provider is external (e.g. OAuth)", "description": "Whether authorization provider is external (e.g. OAuth)",
}) })
username = fields.String(metadata={ username = fields.String(metadata={
"description": "Currently authenticated username if any", "description": "Currently authenticated username if available",
}) })

View File

@@ -27,10 +27,12 @@ class AutoRefreshIntervalSchema(Schema):
interval = fields.Integer(required=True, metadata={ interval = fields.Integer(required=True, metadata={
"description": "Auto refresh interval in milliseconds", "description": "Auto refresh interval in milliseconds",
"example": "60000",
}) })
is_active = fields.Boolean(required=True, metadata={ is_active = fields.Boolean(required=True, metadata={
"description": "Whether this interval is the default active one", "description": "Whether this interval is the default active one",
}) })
text = fields.String(required=True, metadata={ text = fields.String(required=True, metadata={
"description": "Human readable interval description", "description": "Human readable interval description",
"example": "1 minute",
}) })

View File

@@ -40,6 +40,7 @@ class InfoV2Schema(Schema):
}) })
index_url = fields.String(metadata={ index_url = fields.String(metadata={
"description": "URL to the repository index page", "description": "URL to the repository index page",
"example": "https://ahriman.readthedocs.io/",
}) })
repositories = fields.Nested(RepositoryIdSchema(many=True), required=True, metadata={ repositories = fields.Nested(RepositoryIdSchema(many=True), required=True, metadata={
"description": "List of loaded repositories", "description": "List of loaded repositories",

View File

@@ -31,7 +31,7 @@ class RepositoryIdSchema(Schema):
}) })
id = fields.String(metadata={ id = fields.String(metadata={
"description": "Unique repository identifier", "description": "Unique repository identifier",
"example": "aur-x86_64", "example": "x86_64-aur",
}) })
repository = fields.String(metadata={ repository = fields.String(metadata={
"description": "Repository name", "description": "Repository name",