From 6ff36405ba26ab27387094182885a99bf1ecb30d Mon Sep 17 00:00:00 2001 From: Yossi Hillali Date: Sun, 1 Sep 2024 16:40:22 +0300 Subject: [PATCH] feat: Prowlarr integration (#965) Co-authored-by: Manuel <30572287+manuel-rw@users.noreply.github.com> --- apps/nextjs/package.json | 8 +- apps/tasks/package.json | 18 ++-- apps/websocket/package.json | 16 +-- package.json | 24 ++--- packages/analytics/package.json | 16 +-- packages/api/package.json | 24 ++--- packages/auth/package.json | 16 +-- packages/cli/package.json | 16 +-- packages/common/package.json | 10 +- packages/cron-job-runner/package.json | 10 +- packages/cron-job-status/package.json | 10 +- packages/cron-jobs-core/package.json | 14 +-- packages/cron-jobs/package.json | 10 +- packages/db/package.json | 26 ++--- packages/definitions/package.json | 10 +- packages/definitions/src/integration.ts | 11 ++- packages/form/package.json | 14 +-- packages/icons/package.json | 14 +-- packages/integrations/package.json | 16 +-- packages/integrations/src/base/creator.ts | 2 + .../src/interfaces/indexer-manager/indexer.ts | 12 +++ .../src/prowlarr/prowlarr-integration.ts | 99 +++++++++++++++++++ .../src/prowlarr/prowlarr-types.ts | 14 +++ packages/log/package.json | 10 +- packages/modals/package.json | 16 +-- packages/notifications/package.json | 12 +-- packages/ping/package.json | 12 +-- packages/redis/package.json | 22 ++--- packages/server-settings/package.json | 12 +-- packages/spotlight/package.json | 12 +-- packages/translation/package.json | 10 +- packages/ui/package.json | 14 +-- packages/validation/package.json | 14 +-- packages/widgets/package.json | 14 +-- 34 files changed, 346 insertions(+), 212 deletions(-) create mode 100644 packages/integrations/src/interfaces/indexer-manager/indexer.ts create mode 100644 packages/integrations/src/prowlarr/prowlarr-integration.ts create mode 100644 packages/integrations/src/prowlarr/prowlarr-types.ts diff --git a/apps/nextjs/package.json b/apps/nextjs/package.json index 69a399841..c3f4200a1 100644 --- a/apps/nextjs/package.json +++ b/apps/nextjs/package.json @@ -7,12 +7,13 @@ "build": "pnpm with-env next build", "clean": "git clean -xdf .next .turbo node_modules", "dev": "pnpm with-env next dev", - "lint": "eslint", "format": "prettier --check . --ignore-path ../../.gitignore", + "lint": "eslint", "start": "pnpm with-env next start", "typecheck": "tsc --noEmit", "with-env": "dotenv -e ../../.env --" }, + "prettier": "@homarr/prettier-config", "dependencies": { "@homarr/analytics": "workspace:^0.1.0", "@homarr/api": "workspace:^0.1.0", @@ -40,10 +41,10 @@ "@mantine/tiptap": "^7.12.2", "@million/lint": "1.0.0-rc.84", "@t3-oss/env-nextjs": "^0.11.1", + "@tabler/icons-react": "^3.14.0", "@tanstack/react-query": "^5.53.1", "@tanstack/react-query-devtools": "^5.53.1", "@tanstack/react-query-next-experimental": "5.53.1", - "@tabler/icons-react": "^3.14.0", "@trpc/client": "next", "@trpc/next": "next", "@trpc/react-query": "next", @@ -86,6 +87,5 @@ "node-loader": "^2.0.0", "prettier": "^3.3.3", "typescript": "^5.5.4" - }, - "prettier": "@homarr/prettier-config" + } } diff --git a/apps/tasks/package.json b/apps/tasks/package.json index eda472148..11661ed3f 100644 --- a/apps/tasks/package.json +++ b/apps/tasks/package.json @@ -2,25 +2,29 @@ "name": "@homarr/tasks", "version": "0.1.0", "private": true, + "license": "MIT", + "type": "module", "exports": { ".": "./src/index.ts" }, "main": "./src/main.ts", "types": "./src/main.ts", - "license": "MIT", - "type": "module", "scripts": { - "dev": "pnpm with-env tsx ./src/main.ts", "build": "esbuild src/main.ts --bundle --platform=node --outfile=tasks.cjs", "clean": "rm -rf .turbo node_modules", - "lint": "eslint", + "dev": "pnpm with-env tsx ./src/main.ts", "format": "prettier --check . --ignore-path ../../.gitignore", + "lint": "eslint", "typecheck": "tsc --noEmit", "with-env": "dotenv -e ../../.env --" }, + "prettier": "@homarr/prettier-config", "dependencies": { "@homarr/analytics": "workspace:^0.1.0", "@homarr/common": "workspace:^0.1.0", + "@homarr/cron-job-runner": "workspace:^0.1.0", + "@homarr/cron-jobs": "workspace:^0.1.0", + "@homarr/cron-jobs-core": "workspace:^0.1.0", "@homarr/db": "workspace:^0.1.0", "@homarr/definitions": "workspace:^0.1.0", "@homarr/icons": "workspace:^0.1.0", @@ -30,11 +34,8 @@ "@homarr/redis": "workspace:^0.1.0", "@homarr/server-settings": "workspace:^0.1.0", "@homarr/validation": "workspace:^0.1.0", - "@homarr/cron-jobs-core": "workspace:^0.1.0", "@homarr/widgets": "workspace:^0.1.0", "dayjs": "^1.11.13", - "@homarr/cron-jobs": "workspace:^0.1.0", - "@homarr/cron-job-runner": "workspace:^0.1.0", "dotenv": "^16.4.5", "superjson": "2.2.1", "undici": "6.19.8" @@ -49,6 +50,5 @@ "prettier": "^3.3.3", "tsx": "4.13.3", "typescript": "^5.5.4" - }, - "prettier": "@homarr/prettier-config" + } } diff --git a/apps/websocket/package.json b/apps/websocket/package.json index 6e660dab3..b651380e7 100644 --- a/apps/websocket/package.json +++ b/apps/websocket/package.json @@ -2,19 +2,20 @@ "name": "@homarr/websocket", "version": "0.1.0", "private": true, - "main": "./src/main.ts", - "types": "./src/main.ts", "license": "MIT", "type": "module", + "main": "./src/main.ts", + "types": "./src/main.ts", "scripts": { - "dev": "pnpm with-env tsx ./src/main.ts", "build": "esbuild src/main.ts --bundle --platform=node --outfile=wssServer.cjs --external:bcrypt --external:cpu-features --loader:.html=text --loader:.node=text", "clean": "rm -rf .turbo node_modules", - "lint": "eslint", + "dev": "pnpm with-env tsx ./src/main.ts", "format": "prettier --check . --ignore-path ../../.gitignore", + "lint": "eslint", "typecheck": "tsc --noEmit", "with-env": "dotenv -e ../../.env --" }, + "prettier": "@homarr/prettier-config", "dependencies": { "@homarr/api": "workspace:^0.1.0", "@homarr/auth": "workspace:^0.1.0", @@ -24,9 +25,9 @@ "@homarr/log": "workspace:^", "@homarr/redis": "workspace:^0.1.0", "@homarr/validation": "workspace:^0.1.0", + "dotenv": "^16.4.5", "tsx": "4.13.3", - "ws": "^8.18.0", - "dotenv": "^16.4.5" + "ws": "^8.18.0" }, "devDependencies": { "@homarr/eslint-config": "workspace:^0.2.0", @@ -36,6 +37,5 @@ "eslint": "^9.9.1", "prettier": "^3.3.3", "typescript": "^5.5.4" - }, - "prettier": "@homarr/prettier-config" + } } diff --git a/package.json b/package.json index a9840365b..7e1dd0384 100644 --- a/package.json +++ b/package.json @@ -1,22 +1,17 @@ { "name": "homarr", "private": true, - "engines": { - "node": ">=20.17.0" - }, - "packageManager": "pnpm@9.9.0", "scripts": { "build": "turbo build", "clean": "git clean -xdf node_modules", "clean:workspaces": "turbo clean", + "cli": "pnpm with-env tsx packages/cli/index.ts", + "db:migration:mysql:generate": "pnpm -F db migration:mysql:generate", + "db:migration:mysql:run": "pnpm -F db migration:mysql:run", + "db:migration:sqlite:generate": "pnpm -F db migration:sqlite:generate", + "db:migration:sqlite:run": "pnpm -F db migration:sqlite:run", "db:push": "pnpm -F db push:sqlite", "db:studio": "pnpm -F db studio", - "db:migration:sqlite:generate": "pnpm -F db migration:sqlite:generate", - "db:migration:mysql:generate": "pnpm -F db migration:mysql:generate", - "db:migration:sqlite:run": "pnpm -F db migration:sqlite:run", - "db:migration:mysql:run": "pnpm -F db migration:mysql:run", - "cli": "pnpm with-env tsx packages/cli/index.ts", - "with-env": "dotenv -e .env --", "dev": "turbo dev --parallel", "docker:dev": "docker compose -f ./development/development.docker-compose.yml up", "format": "turbo format --continue -- --cache --cache-location node_modules/.cache/.prettiercache", @@ -26,8 +21,10 @@ "lint:ws": "pnpm dlx sherif@latest", "test": "cross-env NODE_ENV=development vitest run --coverage.enabled", "test:ui": "cross-env NODE_ENV=development vitest --ui --coverage.enabled", - "typecheck": "turbo typecheck" + "typecheck": "turbo typecheck", + "with-env": "dotenv -e .env --" }, + "prettier": "@homarr/prettier-config", "devDependencies": { "@homarr/prettier-config": "workspace:^0.1.0", "@turbo/gen": "^2.1.1", @@ -43,7 +40,10 @@ "vite-tsconfig-paths": "^5.0.1", "vitest": "^2.0.5" }, - "prettier": "@homarr/prettier-config", + "packageManager": "pnpm@9.9.0", + "engines": { + "node": ">=20.17.0" + }, "pnpm": { "patchedDependencies": { "trpc-swagger@1.2.6": "patches/trpc-swagger@1.2.6.patch" diff --git a/packages/analytics/package.json b/packages/analytics/package.json index 1c7422249..4870fdb28 100644 --- a/packages/analytics/package.json +++ b/packages/analytics/package.json @@ -1,7 +1,8 @@ { "name": "@homarr/analytics", - "private": true, "version": "0.1.0", + "private": true, + "license": "MIT", "type": "module", "exports": { ".": "./index.ts" @@ -13,19 +14,19 @@ ] } }, - "license": "MIT", "scripts": { "clean": "rm -rf .turbo node_modules", - "lint": "eslint", "format": "prettier --check . --ignore-path ../../.gitignore", + "lint": "eslint", "typecheck": "tsc --noEmit" }, + "prettier": "@homarr/prettier-config", "dependencies": { - "@umami/node": "^0.4.0", - "superjson": "2.2.1", "@homarr/db": "workspace:^0.1.0", "@homarr/log": "workspace:^0.1.0", - "@homarr/server-settings": "workspace:^0.1.0" + "@homarr/server-settings": "workspace:^0.1.0", + "@umami/node": "^0.4.0", + "superjson": "2.2.1" }, "devDependencies": { "@homarr/eslint-config": "workspace:^0.2.0", @@ -33,6 +34,5 @@ "@homarr/tsconfig": "workspace:^0.1.0", "eslint": "^9.9.1", "typescript": "^5.5.4" - }, - "prettier": "@homarr/prettier-config" + } } diff --git a/packages/api/package.json b/packages/api/package.json index 0c23cd94d..58ddc405d 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -1,45 +1,46 @@ { "name": "@homarr/api", "version": "0.1.0", + "private": true, + "license": "MIT", + "type": "module", "exports": { ".": "./src/index.ts", "./client": "./src/client.ts", "./server": "./src/server.ts", "./websocket": "./src/websocket.ts" }, - "private": true, "main": "./index.ts", "types": "./index.ts", - "license": "MIT", - "type": "module", "scripts": { "clean": "rm -rf .turbo node_modules", - "lint": "eslint", "format": "prettier --check . --ignore-path ../../.gitignore", + "lint": "eslint", "typecheck": "tsc --noEmit" }, + "prettier": "@homarr/prettier-config", "dependencies": { "@homarr/auth": "workspace:^0.1.0", "@homarr/common": "workspace:^0.1.0", - "@homarr/cron-jobs": "workspace:^0.1.0", "@homarr/cron-job-runner": "workspace:^0.1.0", "@homarr/cron-job-status": "workspace:^0.1.0", + "@homarr/cron-jobs": "workspace:^0.1.0", "@homarr/db": "workspace:^0.1.0", "@homarr/definitions": "workspace:^0.1.0", "@homarr/integrations": "workspace:^0.1.0", "@homarr/log": "workspace:^", "@homarr/ping": "workspace:^0.1.0", "@homarr/redis": "workspace:^0.1.0", - "@homarr/validation": "workspace:^0.1.0", "@homarr/server-settings": "workspace:^0.1.0", - "@trpc/react-query": "next", + "@homarr/validation": "workspace:^0.1.0", "@trpc/client": "next", + "@trpc/react-query": "next", "@trpc/server": "next", "dockerode": "^4.0.2", - "superjson": "2.2.1", - "trpc-swagger": "^1.2.6", "next": "^14.2.7", - "react": "^18.3.1" + "react": "^18.3.1", + "superjson": "2.2.1", + "trpc-swagger": "^1.2.6" }, "devDependencies": { "@homarr/eslint-config": "workspace:^0.2.0", @@ -49,6 +50,5 @@ "eslint": "^9.9.1", "prettier": "^3.3.3", "typescript": "^5.5.4" - }, - "prettier": "@homarr/prettier-config" + } } diff --git a/packages/auth/package.json b/packages/auth/package.json index 78f7ca546..f7dd80a61 100644 --- a/packages/auth/package.json +++ b/packages/auth/package.json @@ -1,6 +1,8 @@ { "name": "@homarr/auth", "version": "0.1.0", + "private": true, + "license": "MIT", "type": "module", "exports": { ".": "./index.ts", @@ -11,24 +13,23 @@ "./shared": "./shared.ts", "./env.mjs": "./env.mjs" }, - "private": true, "main": "./index.ts", "types": "./index.ts", - "license": "MIT", "scripts": { "clean": "rm -rf .turbo node_modules", - "lint": "eslint", "format": "prettier --check . --ignore-path ../../.gitignore", + "lint": "eslint", "typecheck": "tsc --noEmit" }, + "prettier": "@homarr/prettier-config", "dependencies": { - "@homarr/db": "workspace:^0.1.0", + "@auth/core": "^0.34.2", + "@auth/drizzle-adapter": "^1.4.2", "@homarr/common": "workspace:^0.1.0", + "@homarr/db": "workspace:^0.1.0", "@homarr/definitions": "workspace:^0.1.0", "@homarr/log": "workspace:^0.1.0", "@homarr/validation": "workspace:^0.1.0", - "@auth/core": "^0.34.2", - "@auth/drizzle-adapter": "^1.4.2", "@t3-oss/env-nextjs": "^0.11.1", "bcrypt": "^5.1.1", "cookies": "^0.9.1", @@ -47,6 +48,5 @@ "eslint": "^9.9.1", "prettier": "^3.3.3", "typescript": "^5.5.4" - }, - "prettier": "@homarr/prettier-config" + } } diff --git a/packages/cli/package.json b/packages/cli/package.json index b352cb868..6376fb9b9 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,7 +1,8 @@ { "name": "@homarr/cli", - "private": true, "version": "0.1.0", + "private": true, + "license": "MIT", "type": "module", "exports": { ".": "./index.ts" @@ -13,19 +14,19 @@ ] } }, - "license": "MIT", "scripts": { - "clean": "rm -rf .turbo node_modules", - "lint": "eslint", "build": "esbuild src/index.ts --bundle --platform=node --outfile=cli.cjs --external:bcrypt --external:cpu-features --loader:.html=text --loader:.node=text", + "clean": "rm -rf .turbo node_modules", "format": "prettier --check . --ignore-path ../../.gitignore", + "lint": "eslint", "typecheck": "tsc --noEmit" }, + "prettier": "@homarr/prettier-config", "dependencies": { "@drizzle-team/brocli": "^0.10.1", - "@homarr/db": "workspace:^0.1.0", - "@homarr/common": "workspace:^0.1.0", "@homarr/auth": "workspace:^0.1.0", + "@homarr/common": "workspace:^0.1.0", + "@homarr/db": "workspace:^0.1.0", "dotenv": "^16.4.5" }, "devDependencies": { @@ -34,6 +35,5 @@ "@homarr/tsconfig": "workspace:^0.1.0", "eslint": "^9.9.1", "typescript": "^5.5.4" - }, - "prettier": "@homarr/prettier-config" + } } diff --git a/packages/common/package.json b/packages/common/package.json index 343532534..075ef7f55 100644 --- a/packages/common/package.json +++ b/packages/common/package.json @@ -1,7 +1,8 @@ { "name": "@homarr/common", - "private": true, "version": "0.1.0", + "private": true, + "license": "MIT", "type": "module", "exports": { ".": "./index.ts", @@ -16,13 +17,13 @@ ] } }, - "license": "MIT", "scripts": { "clean": "rm -rf .turbo node_modules", - "lint": "eslint", "format": "prettier --check . --ignore-path ../../.gitignore", + "lint": "eslint", "typecheck": "tsc --noEmit" }, + "prettier": "@homarr/prettier-config", "dependencies": { "dayjs": "^1.11.13", "next": "^14.2.7", @@ -35,6 +36,5 @@ "@homarr/tsconfig": "workspace:^0.1.0", "eslint": "^9.9.1", "typescript": "^5.5.4" - }, - "prettier": "@homarr/prettier-config" + } } diff --git a/packages/cron-job-runner/package.json b/packages/cron-job-runner/package.json index 8fc5270fb..d4a18e976 100644 --- a/packages/cron-job-runner/package.json +++ b/packages/cron-job-runner/package.json @@ -1,7 +1,8 @@ { "name": "@homarr/cron-job-runner", - "private": true, "version": "0.1.0", + "private": true, + "license": "MIT", "type": "module", "exports": { ".": "./index.ts" @@ -13,13 +14,13 @@ ] } }, - "license": "MIT", "scripts": { "clean": "rm -rf .turbo node_modules", - "lint": "eslint", "format": "prettier --check . --ignore-path ../../.gitignore", + "lint": "eslint", "typecheck": "tsc --noEmit" }, + "prettier": "@homarr/prettier-config", "dependencies": { "@homarr/cron-jobs": "workspace:^0.1.0", "@homarr/log": "workspace:^0.1.0", @@ -31,6 +32,5 @@ "@homarr/tsconfig": "workspace:^0.1.0", "eslint": "^9.9.1", "typescript": "^5.5.4" - }, - "prettier": "@homarr/prettier-config" + } } diff --git a/packages/cron-job-status/package.json b/packages/cron-job-status/package.json index 484f270fb..d4e8b63c4 100644 --- a/packages/cron-job-status/package.json +++ b/packages/cron-job-status/package.json @@ -1,7 +1,8 @@ { "name": "@homarr/cron-job-status", - "private": true, "version": "0.1.0", + "private": true, + "license": "MIT", "type": "module", "exports": { ".": "./index.ts", @@ -14,13 +15,13 @@ ] } }, - "license": "MIT", "scripts": { "clean": "rm -rf .turbo node_modules", - "lint": "eslint", "format": "prettier --check . --ignore-path ../../.gitignore", + "lint": "eslint", "typecheck": "tsc --noEmit" }, + "prettier": "@homarr/prettier-config", "dependencies": { "@homarr/redis": "workspace:^0.1.0" }, @@ -30,6 +31,5 @@ "@homarr/tsconfig": "workspace:^0.1.0", "eslint": "^9.9.1", "typescript": "^5.5.4" - }, - "prettier": "@homarr/prettier-config" + } } diff --git a/packages/cron-jobs-core/package.json b/packages/cron-jobs-core/package.json index 4bdf5a97d..5b78de5fa 100644 --- a/packages/cron-jobs-core/package.json +++ b/packages/cron-jobs-core/package.json @@ -1,7 +1,8 @@ { "name": "@homarr/cron-jobs-core", - "private": true, "version": "0.1.0", + "private": true, + "license": "MIT", "type": "module", "exports": { ".": "./index.ts", @@ -15,16 +16,16 @@ ] } }, - "license": "MIT", "scripts": { "clean": "rm -rf .turbo node_modules", - "lint": "eslint", "format": "prettier --check . --ignore-path ../../.gitignore", + "lint": "eslint", "typecheck": "tsc --noEmit" }, + "prettier": "@homarr/prettier-config", "dependencies": { - "node-cron": "^3.0.3", - "@homarr/common": "workspace:^0.1.0" + "@homarr/common": "workspace:^0.1.0", + "node-cron": "^3.0.3" }, "devDependencies": { "@homarr/eslint-config": "workspace:^0.2.0", @@ -33,6 +34,5 @@ "@types/node-cron": "^3.0.11", "eslint": "^9.9.1", "typescript": "^5.5.4" - }, - "prettier": "@homarr/prettier-config" + } } diff --git a/packages/cron-jobs/package.json b/packages/cron-jobs/package.json index caf1eb442..3578badcd 100644 --- a/packages/cron-jobs/package.json +++ b/packages/cron-jobs/package.json @@ -1,7 +1,8 @@ { "name": "@homarr/cron-jobs", - "private": true, "version": "0.1.0", + "private": true, + "license": "MIT", "type": "module", "exports": { ".": "./index.ts" @@ -13,13 +14,13 @@ ] } }, - "license": "MIT", "scripts": { "clean": "rm -rf .turbo node_modules", - "lint": "eslint", "format": "prettier --check . --ignore-path ../../.gitignore", + "lint": "eslint", "typecheck": "tsc --noEmit" }, + "prettier": "@homarr/prettier-config", "dependencies": { "@extractus/feed-extractor": "^7.1.3", "@homarr/analytics": "workspace:^0.1.0", @@ -42,6 +43,5 @@ "@homarr/tsconfig": "workspace:^0.1.0", "eslint": "^9.9.1", "typescript": "^5.5.4" - }, - "prettier": "@homarr/prettier-config" + } } diff --git a/packages/db/package.json b/packages/db/package.json index 0769bcbdd..43497e5b3 100644 --- a/packages/db/package.json +++ b/packages/db/package.json @@ -1,6 +1,8 @@ { "name": "@homarr/db", "version": "0.1.0", + "private": true, + "license": "MIT", "type": "module", "exports": { ".": "./index.ts", @@ -9,37 +11,36 @@ "./test": "./test/index.ts", "./queries": "./queries/index.ts" }, - "private": true, "main": "./index.ts", "types": "./index.ts", - "license": "MIT", "scripts": { "build": "pnpm run build:sqlite && pnpm run build:mysql", - "build:sqlite": "esbuild migrations/sqlite/migrate.ts --bundle --platform=node --outfile=migrations/sqlite/migrate.cjs", "build:mysql": "esbuild migrations/mysql/migrate.ts --bundle --platform=node --outfile=migrations/mysql/migrate.cjs", + "build:sqlite": "esbuild migrations/sqlite/migrate.ts --bundle --platform=node --outfile=migrations/sqlite/migrate.cjs", "clean": "rm -rf .turbo node_modules", - "lint": "eslint", "format": "prettier --check . --ignore-path ../../.gitignore", - "migration:sqlite:generate": "drizzle-kit generate --config ./configs/sqlite.config.ts", - "migration:sqlite:run": "drizzle-kit migrate --config ./configs/sqlite.config.ts", + "lint": "eslint", "migration:mysql:generate": "drizzle-kit generate --config ./configs/mysql.config.ts", "migration:mysql:run": "drizzle-kit migrate --config ./configs/mysql.config.ts", - "push:sqlite": "drizzle-kit push --config ./configs/sqlite.config.ts", + "migration:sqlite:generate": "drizzle-kit generate --config ./configs/sqlite.config.ts", + "migration:sqlite:run": "drizzle-kit migrate --config ./configs/sqlite.config.ts", "push:mysql": "drizzle-kit push --config ./configs/mysql.config.ts", + "push:sqlite": "drizzle-kit push --config ./configs/sqlite.config.ts", "studio": "drizzle-kit studio --config ./configs/sqlite.config.ts", "typecheck": "tsc --noEmit" }, + "prettier": "@homarr/prettier-config", "dependencies": { + "@auth/core": "^0.34.2", "@homarr/common": "workspace:^0.1.0", "@homarr/definitions": "workspace:^0.1.0", "@homarr/log": "workspace:^0.1.0", "@paralleldrive/cuid2": "^2.2.2", - "@auth/core": "^0.34.2", "better-sqlite3": "^11.2.1", - "drizzle-orm": "^0.33.0", "dotenv": "^16.4.5", - "mysql2": "3.11.0", - "drizzle-kit": "^0.24.2" + "drizzle-kit": "^0.24.2", + "drizzle-orm": "^0.33.0", + "mysql2": "3.11.0" }, "devDependencies": { "@homarr/eslint-config": "workspace:^0.2.0", @@ -50,6 +51,5 @@ "eslint": "^9.9.1", "prettier": "^3.3.3", "typescript": "^5.5.4" - }, - "prettier": "@homarr/prettier-config" + } } diff --git a/packages/definitions/package.json b/packages/definitions/package.json index ce7a906d2..7b025b25f 100644 --- a/packages/definitions/package.json +++ b/packages/definitions/package.json @@ -1,7 +1,8 @@ { "name": "@homarr/definitions", - "private": true, "version": "0.1.0", + "private": true, + "license": "MIT", "type": "module", "exports": { ".": "./index.ts" @@ -13,13 +14,13 @@ ] } }, - "license": "MIT", "scripts": { "clean": "rm -rf .turbo node_modules", - "lint": "eslint", "format": "prettier --check . --ignore-path ../../.gitignore", + "lint": "eslint", "typecheck": "tsc --noEmit" }, + "prettier": "@homarr/prettier-config", "dependencies": { "@homarr/common": "workspace:^0.1.0" }, @@ -29,6 +30,5 @@ "@homarr/tsconfig": "workspace:^0.1.0", "eslint": "^9.9.1", "typescript": "^5.5.4" - }, - "prettier": "@homarr/prettier-config" + } } diff --git a/packages/definitions/src/integration.ts b/packages/definitions/src/integration.ts index 7564a6ae8..fbe355d6f 100644 --- a/packages/definitions/src/integration.ts +++ b/packages/definitions/src/integration.ts @@ -63,6 +63,12 @@ export const integrationDefs = { iconUrl: "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons@master/png/readarr.png", category: ["calendar"], }, + prowlarr: { + name: "Prowlarr", + secretKinds: [["apiKey"]], + iconUrl: "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons@master/png/prowlarr.png", + category: ["indexerManager"], + }, jellyfin: { name: "Jellyfin", secretKinds: [["username", "password"], ["apiKey"]], @@ -103,7 +109,7 @@ export const integrationDefs = { name: "Home Assistant", secretKinds: [["apiKey"]], iconUrl: "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons@master/png/home-assistant.png", - category: [], + category: ["smartHomeServer"], }, } satisfies Record< string, @@ -138,4 +144,5 @@ export type IntegrationCategory = | "mediaRequest" | "downloadClient" | "useNetClient" - | "smartHomeServer"; + | "smartHomeServer" + | "indexerManager"; diff --git a/packages/form/package.json b/packages/form/package.json index b61baaeb7..9c150c670 100644 --- a/packages/form/package.json +++ b/packages/form/package.json @@ -1,7 +1,8 @@ { "name": "@homarr/form", - "private": true, "version": "0.1.0", + "private": true, + "license": "MIT", "type": "module", "exports": { ".": "./index.ts" @@ -13,17 +14,17 @@ ] } }, - "license": "MIT", "scripts": { "clean": "rm -rf .turbo node_modules", - "lint": "eslint", "format": "prettier --check . --ignore-path ../../.gitignore", + "lint": "eslint", "typecheck": "tsc --noEmit" }, + "prettier": "@homarr/prettier-config", "dependencies": { - "@mantine/form": "^7.12.2", + "@homarr/translation": "workspace:^0.1.0", "@homarr/validation": "workspace:^0.1.0", - "@homarr/translation": "workspace:^0.1.0" + "@mantine/form": "^7.12.2" }, "devDependencies": { "@homarr/eslint-config": "workspace:^0.2.0", @@ -31,6 +32,5 @@ "@homarr/tsconfig": "workspace:^0.1.0", "eslint": "^9.9.1", "typescript": "^5.5.4" - }, - "prettier": "@homarr/prettier-config" + } } diff --git a/packages/icons/package.json b/packages/icons/package.json index c5801f318..3926129c9 100644 --- a/packages/icons/package.json +++ b/packages/icons/package.json @@ -1,7 +1,8 @@ { "name": "@homarr/icons", - "private": true, "version": "0.1.0", + "private": true, + "license": "MIT", "type": "module", "exports": { ".": "./index.ts" @@ -13,16 +14,16 @@ ] } }, - "license": "MIT", "scripts": { "clean": "rm -rf .turbo node_modules", - "lint": "eslint", "format": "prettier --check . --ignore-path ../../.gitignore", + "lint": "eslint", "typecheck": "tsc --noEmit" }, + "prettier": "@homarr/prettier-config", "dependencies": { - "@homarr/log": "workspace:^0.1.0", - "@homarr/common": "workspace:^0.1.0" + "@homarr/common": "workspace:^0.1.0", + "@homarr/log": "workspace:^0.1.0" }, "devDependencies": { "@homarr/eslint-config": "workspace:^0.2.0", @@ -30,6 +31,5 @@ "@homarr/tsconfig": "workspace:^0.1.0", "eslint": "^9.9.1", "typescript": "^5.5.4" - }, - "prettier": "@homarr/prettier-config" + } } diff --git a/packages/integrations/package.json b/packages/integrations/package.json index 1a42bc3b3..eef4cd8d2 100644 --- a/packages/integrations/package.json +++ b/packages/integrations/package.json @@ -1,7 +1,9 @@ { "name": "@homarr/integrations", - "private": true, "version": "0.1.0", + "private": true, + "license": "MIT", + "type": "module", "exports": { ".": "./index.ts", "./client": "./src/client.ts", @@ -14,21 +16,20 @@ ] } }, - "license": "MIT", - "type": "module", "scripts": { "clean": "rm -rf .turbo node_modules", - "lint": "eslint", "format": "prettier --check . --ignore-path ../../.gitignore", + "lint": "eslint", "typecheck": "tsc --noEmit" }, + "prettier": "@homarr/prettier-config", "dependencies": { "@homarr/common": "workspace:^0.1.0", "@homarr/definitions": "workspace:^0.1.0", "@homarr/log": "workspace:^0.1.0", + "@homarr/translation": "workspace:^0.1.0", "@homarr/validation": "workspace:^0.1.0", - "@jellyfin/sdk": "^0.10.0", - "@homarr/translation": "workspace:^0.1.0" + "@jellyfin/sdk": "^0.10.0" }, "devDependencies": { "@homarr/eslint-config": "workspace:^0.2.0", @@ -36,6 +37,5 @@ "@homarr/tsconfig": "workspace:^0.1.0", "eslint": "^9.9.1", "typescript": "^5.5.4" - }, - "prettier": "@homarr/prettier-config" + } } diff --git a/packages/integrations/src/base/creator.ts b/packages/integrations/src/base/creator.ts index 94f23b70f..27c289ef2 100644 --- a/packages/integrations/src/base/creator.ts +++ b/packages/integrations/src/base/creator.ts @@ -7,6 +7,7 @@ import { JellyseerrIntegration } from "../jellyseerr/jellyseerr-integration"; import { SonarrIntegration } from "../media-organizer/sonarr/sonarr-integration"; import { OverseerrIntegration } from "../overseerr/overseerr-integration"; import { PiHoleIntegration } from "../pi-hole/pi-hole-integration"; +import { ProwlarrIntegration } from "../prowlarr/prowlarr-integration"; import type { Integration, IntegrationInput } from "./integration"; export const integrationCreatorByKind = ( @@ -28,4 +29,5 @@ export const integrationCreators = { sonarr: SonarrIntegration, jellyseerr: JellyseerrIntegration, overseerr: OverseerrIntegration, + prowlarr: ProwlarrIntegration, } satisfies Partial Integration>>; diff --git a/packages/integrations/src/interfaces/indexer-manager/indexer.ts b/packages/integrations/src/interfaces/indexer-manager/indexer.ts new file mode 100644 index 000000000..81393d9e7 --- /dev/null +++ b/packages/integrations/src/interfaces/indexer-manager/indexer.ts @@ -0,0 +1,12 @@ +export interface Indexer { + id: number; + name: string; + url: string; + /** + * Enabled: when the user enable / disable the indexer. + * Status: when there is an error with the indexer site. + * If one of the options are false the indexer is off. + */ + enabled: boolean; + status: boolean; +} diff --git a/packages/integrations/src/prowlarr/prowlarr-integration.ts b/packages/integrations/src/prowlarr/prowlarr-integration.ts new file mode 100644 index 000000000..e023e21a5 --- /dev/null +++ b/packages/integrations/src/prowlarr/prowlarr-integration.ts @@ -0,0 +1,99 @@ +import { Integration } from "../base/integration"; +import { IntegrationTestConnectionError } from "../base/test-connection-error"; +import type { Indexer } from "../interfaces/indexer-manager/indexer"; +import { indexerResponseSchema, statusResponseSchema } from "./prowlarr-types"; + +export class ProwlarrIntegration extends Integration { + public async getIndexersAsync(): Promise { + const apiKey = super.getSecretValue("apiKey"); + + const indexerResponse = await fetch(`${this.integration.url}/api/v1/indexer`, { + headers: { + "X-Api-Key": apiKey, + }, + }); + if (!indexerResponse.ok) { + throw new Error( + `Failed to fetch indexers for ${this.integration.name} (${this.integration.id}): ${indexerResponse.statusText}`, + ); + } + + const statusResponse = await fetch(`${this.integration.url}/api/v1/indexerstatus`, { + headers: { + "X-Api-Key": apiKey, + }, + }); + if (!statusResponse.ok) { + throw new Error( + `Failed to fetch status for ${this.integration.name} (${this.integration.id}): ${statusResponse.statusText}`, + ); + } + + const indexersResult = indexerResponseSchema.array().safeParse(await indexerResponse.json()); + const statusResult = statusResponseSchema.safeParse(await statusResponse.json()); + + const errorMessages: string[] = []; + if (!indexersResult.success) { + errorMessages.push(`Indexers parsing error: ${indexersResult.error.message}`); + } + if (!statusResult.success) { + errorMessages.push(`Status parsing error: ${statusResult.error.message}`); + } + if (!indexersResult.success || !statusResult.success) { + throw new Error( + `Failed to parse indexers for ${this.integration.name} (${this.integration.id}), most likely your api key is wrong:\n${errorMessages.join("\n")}`, + ); + } + + const inactiveIndexerIds = new Set(statusResult.data.map((status: { id: number }) => status.id)); + + const indexers: Indexer[] = indexersResult.data.map((indexer) => ({ + id: indexer.id, + name: indexer.name, + url: indexer.indexerUrls[0] ?? "", + enabled: indexer.enable, + status: inactiveIndexerIds.has(indexer.id), + })); + + return indexers; + } + + public async testAllAsync(): Promise { + const apiKey = super.getSecretValue("apiKey"); + const response = await fetch(`${this.integration.url}/api/v1/indexer/testall`, { + headers: { + "X-Api-Key": apiKey, + }, + }); + + if (!response.ok) { + throw new Error( + `Failed to test all indexers for ${this.integration.name} (${this.integration.id}): ${response.statusText}`, + ); + } + } + + public async testConnectionAsync(): Promise { + const apiKey = super.getSecretValue("apiKey"); + + await super.handleTestConnectionResponseAsync({ + queryFunctionAsync: async () => { + return await fetch(`${this.integration.url}/api`, { + headers: { + "X-Api-Key": apiKey, + }, + }); + }, + handleResponseAsync: async (response) => { + try { + const result = (await response.json()) as unknown; + if (typeof result === "object" && result !== null) return; + } catch { + throw new IntegrationTestConnectionError("invalidJson"); + } + + throw new IntegrationTestConnectionError("invalidCredentials"); + }, + }); + } +} diff --git a/packages/integrations/src/prowlarr/prowlarr-types.ts b/packages/integrations/src/prowlarr/prowlarr-types.ts new file mode 100644 index 000000000..9b61f74f0 --- /dev/null +++ b/packages/integrations/src/prowlarr/prowlarr-types.ts @@ -0,0 +1,14 @@ +import { z } from "@homarr/validation"; + +export const indexerResponseSchema = z.object({ + id: z.number(), + indexerUrls: z.array(z.string()), + name: z.string(), + enable: z.boolean(), +}); + +export const statusResponseSchema = z.array( + z.object({ + id: z.number(), + }), +); diff --git a/packages/log/package.json b/packages/log/package.json index 6ab1677e8..b5830fbee 100644 --- a/packages/log/package.json +++ b/packages/log/package.json @@ -1,7 +1,8 @@ { "name": "@homarr/log", - "private": true, "version": "0.1.0", + "private": true, + "license": "MIT", "type": "module", "exports": { ".": { @@ -17,13 +18,13 @@ ] } }, - "license": "MIT", "scripts": { "clean": "rm -rf .turbo node_modules", - "lint": "eslint", "format": "prettier --check . --ignore-path ../../.gitignore", + "lint": "eslint", "typecheck": "tsc --noEmit" }, + "prettier": "@homarr/prettier-config", "dependencies": { "ioredis": "5.4.1", "superjson": "2.2.1", @@ -35,6 +36,5 @@ "@homarr/tsconfig": "workspace:^0.1.0", "eslint": "^9.9.1", "typescript": "^5.5.4" - }, - "prettier": "@homarr/prettier-config" + } } diff --git a/packages/modals/package.json b/packages/modals/package.json index 52cc86a17..d0065baa4 100644 --- a/packages/modals/package.json +++ b/packages/modals/package.json @@ -1,7 +1,8 @@ { "name": "@homarr/modals", - "private": true, "version": "0.1.0", + "private": true, + "license": "MIT", "type": "module", "exports": { ".": "./index.ts" @@ -13,19 +14,19 @@ ] } }, - "license": "MIT", "scripts": { "clean": "rm -rf .turbo node_modules", - "lint": "eslint", "format": "prettier --check . --ignore-path ../../.gitignore", + "lint": "eslint", "typecheck": "tsc --noEmit" }, + "prettier": "@homarr/prettier-config", "dependencies": { - "@homarr/ui": "workspace:^0.1.0", "@homarr/translation": "workspace:^0.1.0", - "react": "^18.3.1", + "@homarr/ui": "workspace:^0.1.0", "@mantine/core": "^7.12.2", - "@mantine/hooks": "^7.12.2" + "@mantine/hooks": "^7.12.2", + "react": "^18.3.1" }, "devDependencies": { "@homarr/eslint-config": "workspace:^0.2.0", @@ -33,6 +34,5 @@ "@homarr/tsconfig": "workspace:^0.1.0", "eslint": "^9.9.1", "typescript": "^5.5.4" - }, - "prettier": "@homarr/prettier-config" + } } diff --git a/packages/notifications/package.json b/packages/notifications/package.json index b8598aefa..499a5a89c 100644 --- a/packages/notifications/package.json +++ b/packages/notifications/package.json @@ -1,7 +1,8 @@ { "name": "@homarr/notifications", - "private": true, "version": "0.1.0", + "private": true, + "license": "MIT", "type": "module", "exports": { ".": "./index.ts", @@ -14,16 +15,16 @@ ] } }, - "license": "MIT", "scripts": { "clean": "rm -rf .turbo node_modules", - "lint": "eslint", "format": "prettier --check . --ignore-path ../../.gitignore", + "lint": "eslint", "typecheck": "tsc --noEmit" }, + "prettier": "@homarr/prettier-config", "dependencies": { - "@mantine/notifications": "^7.12.2", "@homarr/ui": "workspace:^0.1.0", + "@mantine/notifications": "^7.12.2", "@tabler/icons-react": "^3.14.0" }, "devDependencies": { @@ -32,6 +33,5 @@ "@homarr/tsconfig": "workspace:^0.1.0", "eslint": "^9.9.1", "typescript": "^5.5.4" - }, - "prettier": "@homarr/prettier-config" + } } diff --git a/packages/ping/package.json b/packages/ping/package.json index 3e3249610..741a63917 100644 --- a/packages/ping/package.json +++ b/packages/ping/package.json @@ -1,7 +1,9 @@ { "name": "@homarr/ping", - "private": true, "version": "0.1.0", + "private": true, + "license": "MIT", + "type": "module", "exports": { ".": "./index.ts" }, @@ -12,14 +14,13 @@ ] } }, - "license": "MIT", - "type": "module", "scripts": { "clean": "rm -rf .turbo node_modules", - "lint": "eslint", "format": "prettier --check . --ignore-path ../../.gitignore", + "lint": "eslint", "typecheck": "tsc --noEmit" }, + "prettier": "@homarr/prettier-config", "dependencies": { "@homarr/common": "workspace:^0.1.0", "@homarr/log": "workspace:^0.1.0" @@ -30,6 +31,5 @@ "@homarr/tsconfig": "workspace:^0.1.0", "eslint": "^9.9.1", "typescript": "^5.5.4" - }, - "prettier": "@homarr/prettier-config" + } } diff --git a/packages/redis/package.json b/packages/redis/package.json index 55f22c3a9..d6de9128d 100644 --- a/packages/redis/package.json +++ b/packages/redis/package.json @@ -1,7 +1,9 @@ { "name": "@homarr/redis", - "private": true, "version": "0.1.0", + "private": true, + "license": "MIT", + "type": "module", "exports": { ".": "./index.ts" }, @@ -12,21 +14,20 @@ ] } }, - "license": "MIT", - "type": "module", "scripts": { "clean": "rm -rf .turbo node_modules", - "lint": "eslint", "format": "prettier --check . --ignore-path ../../.gitignore", + "lint": "eslint", "typecheck": "tsc --noEmit" }, + "prettier": "@homarr/prettier-config", "dependencies": { - "ioredis": "5.4.1", - "superjson": "2.2.1", - "@homarr/log": "workspace:^", - "@homarr/db": "workspace:^", "@homarr/common": "workspace:^", - "@homarr/definitions": "workspace:^" + "@homarr/db": "workspace:^", + "@homarr/definitions": "workspace:^", + "@homarr/log": "workspace:^", + "ioredis": "5.4.1", + "superjson": "2.2.1" }, "devDependencies": { "@homarr/eslint-config": "workspace:^0.2.0", @@ -34,6 +35,5 @@ "@homarr/tsconfig": "workspace:^0.1.0", "eslint": "^9.9.1", "typescript": "^5.5.4" - }, - "prettier": "@homarr/prettier-config" + } } diff --git a/packages/server-settings/package.json b/packages/server-settings/package.json index 95d5e7272..b513928b9 100644 --- a/packages/server-settings/package.json +++ b/packages/server-settings/package.json @@ -1,7 +1,9 @@ { "name": "@homarr/server-settings", - "private": true, "version": "0.1.0", + "private": true, + "license": "MIT", + "type": "module", "exports": { ".": "./index.ts" }, @@ -12,20 +14,18 @@ ] } }, - "type": "module", - "license": "MIT", "scripts": { "clean": "rm -rf .turbo node_modules", - "lint": "eslint", "format": "prettier --check . --ignore-path ../../.gitignore", + "lint": "eslint", "typecheck": "tsc --noEmit" }, + "prettier": "@homarr/prettier-config", "devDependencies": { "@homarr/eslint-config": "workspace:^0.2.0", "@homarr/prettier-config": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0", "eslint": "^9.9.1", "typescript": "^5.5.4" - }, - "prettier": "@homarr/prettier-config" + } } diff --git a/packages/spotlight/package.json b/packages/spotlight/package.json index 9453fce54..03ce5844f 100644 --- a/packages/spotlight/package.json +++ b/packages/spotlight/package.json @@ -1,7 +1,8 @@ { "name": "@homarr/spotlight", - "private": true, "version": "0.1.0", + "private": true, + "license": "MIT", "type": "module", "exports": { ".": "./index.ts", @@ -14,16 +15,16 @@ ] } }, - "license": "MIT", "scripts": { "clean": "rm -rf .turbo node_modules", - "lint": "eslint", "format": "prettier --check . --ignore-path ../../.gitignore", + "lint": "eslint", "typecheck": "tsc --noEmit" }, + "prettier": "@homarr/prettier-config", "dependencies": { - "@homarr/ui": "workspace:^0.1.0", "@homarr/translation": "workspace:^0.1.0", + "@homarr/ui": "workspace:^0.1.0", "@mantine/core": "^7.12.2", "@mantine/hooks": "^7.12.2", "@mantine/spotlight": "^7.12.2", @@ -39,6 +40,5 @@ "@homarr/tsconfig": "workspace:^0.1.0", "eslint": "^9.9.1", "typescript": "^5.5.4" - }, - "prettier": "@homarr/prettier-config" + } } diff --git a/packages/translation/package.json b/packages/translation/package.json index 22418ea26..1afd60b4f 100644 --- a/packages/translation/package.json +++ b/packages/translation/package.json @@ -1,7 +1,8 @@ { "name": "@homarr/translation", - "private": true, "version": "0.1.0", + "private": true, + "license": "MIT", "type": "module", "exports": { ".": "./index.ts", @@ -16,13 +17,13 @@ ] } }, - "license": "MIT", "scripts": { "clean": "rm -rf .turbo node_modules", - "lint": "eslint", "format": "prettier --check . --ignore-path ../../.gitignore", + "lint": "eslint", "typecheck": "tsc --noEmit" }, + "prettier": "@homarr/prettier-config", "dependencies": { "dayjs": "^1.11.13", "mantine-react-table": "2.0.0-beta.6", @@ -34,6 +35,5 @@ "@homarr/tsconfig": "workspace:^0.1.0", "eslint": "^9.9.1", "typescript": "^5.5.4" - }, - "prettier": "@homarr/prettier-config" + } } diff --git a/packages/ui/package.json b/packages/ui/package.json index 7e954c306..c39c46238 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -1,7 +1,8 @@ { "name": "@homarr/ui", - "private": true, "version": "0.1.0", + "private": true, + "license": "MIT", "type": "module", "exports": { ".": "./index.ts", @@ -15,18 +16,18 @@ ] } }, - "license": "MIT", "scripts": { "clean": "rm -rf .turbo node_modules", - "lint": "eslint", "format": "prettier --check . --ignore-path ../../.gitignore", + "lint": "eslint", "typecheck": "tsc --noEmit" }, + "prettier": "@homarr/prettier-config", "dependencies": { - "@homarr/log": "workspace:^0.1.0", - "@homarr/validation": "workspace:^0.1.0", "@homarr/common": "workspace:^0.1.0", + "@homarr/log": "workspace:^0.1.0", "@homarr/translation": "workspace:^0.1.0", + "@homarr/validation": "workspace:^0.1.0", "@mantine/core": "^7.12.2", "@mantine/dates": "^7.12.2", "@mantine/hooks": "^7.12.2", @@ -42,6 +43,5 @@ "@types/css-modules": "^1.0.5", "eslint": "^9.9.1", "typescript": "^5.5.4" - }, - "prettier": "@homarr/prettier-config" + } } diff --git a/packages/validation/package.json b/packages/validation/package.json index b50247501..4e716b625 100644 --- a/packages/validation/package.json +++ b/packages/validation/package.json @@ -1,7 +1,8 @@ { "name": "@homarr/validation", - "private": true, "version": "0.1.0", + "private": true, + "license": "MIT", "type": "module", "exports": { ".": "./index.ts", @@ -14,17 +15,17 @@ ] } }, - "license": "MIT", "scripts": { "clean": "rm -rf .turbo node_modules", - "lint": "eslint", "format": "prettier --check . --ignore-path ../../.gitignore", + "lint": "eslint", "typecheck": "tsc --noEmit" }, + "prettier": "@homarr/prettier-config", "dependencies": { - "zod": "^3.23.8", "@homarr/definitions": "workspace:^0.1.0", - "@homarr/translation": "workspace:^0.1.0" + "@homarr/translation": "workspace:^0.1.0", + "zod": "^3.23.8" }, "devDependencies": { "@homarr/eslint-config": "workspace:^0.2.0", @@ -32,6 +33,5 @@ "@homarr/tsconfig": "workspace:^0.1.0", "eslint": "^9.9.1", "typescript": "^5.5.4" - }, - "prettier": "@homarr/prettier-config" + } } diff --git a/packages/widgets/package.json b/packages/widgets/package.json index 3b44765b7..02fe9acee 100644 --- a/packages/widgets/package.json +++ b/packages/widgets/package.json @@ -1,7 +1,8 @@ { "name": "@homarr/widgets", - "private": true, "version": "0.1.0", + "private": true, + "license": "MIT", "type": "module", "exports": { ".": "./index.ts", @@ -14,13 +15,13 @@ ] } }, - "license": "MIT", "scripts": { "clean": "rm -rf .turbo node_modules", - "lint": "eslint", "format": "prettier --check . --ignore-path ../../.gitignore", + "lint": "eslint", "typecheck": "tsc --noEmit" }, + "prettier": "@homarr/prettier-config", "dependencies": { "@extractus/feed-extractor": "^7.1.3", "@homarr/api": "workspace:^0.1.0", @@ -35,8 +36,8 @@ "@homarr/translation": "workspace:^0.1.0", "@homarr/ui": "workspace:^0.1.0", "@homarr/validation": "workspace:^0.1.0", - "@mantine/hooks": "^7.12.2", "@mantine/core": "^7.12.2", + "@mantine/hooks": "^7.12.2", "@tabler/icons-react": "^3.14.0", "@tiptap/extension-color": "2.6.6", "@tiptap/extension-highlight": "2.6.6", @@ -55,8 +56,8 @@ "@tiptap/starter-kit": "^2.6.6", "clsx": "^2.1.1", "dayjs": "^1.11.13", - "next": "^14.2.7", "mantine-react-table": "2.0.0-beta.6", + "next": "^14.2.7", "react": "^18.3.1", "video.js": "^8.17.3" }, @@ -67,6 +68,5 @@ "@types/video.js": "^7.3.58", "eslint": "^9.9.1", "typescript": "^5.5.4" - }, - "prettier": "@homarr/prettier-config" + } }