style: add new rule for imports (#785)

This commit is contained in:
Trim21
2024-08-14 06:31:39 +08:00
committed by GitHub
parent 53ba39de72
commit 2a0d29c1f5
72 changed files with 353 additions and 306 deletions

View File

@@ -1,5 +1,6 @@
{ {
"extends": ["plugin:@typescript-eslint/recommended", "prettier"], "extends": ["plugin:@typescript-eslint/recommended", "prettier"],
"plugins": ["simple-import-sort", "n"],
"parserOptions": { "parserOptions": {
"project": "./tsconfig.json" "project": "./tsconfig.json"
@@ -11,6 +12,9 @@
}, },
"rules": { "rules": {
"n/prefer-node-protocol": "error",
"simple-import-sort/imports": "error",
"simple-import-sort/exports": "error",
"import/no-extraneous-dependencies": 0, "import/no-extraneous-dependencies": 0,
"no-underscore-dangle": ["error", {"allow": ["_id"]}], "no-underscore-dangle": ["error", {"allow": ["_id"]}],
"@typescript-eslint/lines-between-class-members": ["error", "always", {"exceptAfterSingleLine": true}], "@typescript-eslint/lines-between-class-members": ["error", "always", {"exceptAfterSingleLine": true}],

View File

@@ -1,4 +1,4 @@
const path = require('path'); const path = require('node:path');
const ESLintPlugin = require('eslint-webpack-plugin'); const ESLintPlugin = require('eslint-webpack-plugin');
const HtmlWebpackPlugin = require('html-webpack-plugin'); const HtmlWebpackPlugin = require('html-webpack-plugin');
const CaseSensitivePathsPlugin = require('case-sensitive-paths-webpack-plugin'); const CaseSensitivePathsPlugin = require('case-sensitive-paths-webpack-plugin');

View File

@@ -1,5 +1,5 @@
const autoprefixer = require('autoprefixer'); const autoprefixer = require('autoprefixer');
const path = require('path'); const path = require('node:path');
const webpack = require('webpack'); const webpack = require('webpack');
const CssMinimizerPlugin = require('css-minimizer-webpack-plugin'); const CssMinimizerPlugin = require('css-minimizer-webpack-plugin');
const HtmlWebpackPlugin = require('html-webpack-plugin'); const HtmlWebpackPlugin = require('html-webpack-plugin');

View File

@@ -13,7 +13,7 @@ const webpack = require('webpack');
const WebpackDevServer = require('webpack-dev-server'); const WebpackDevServer = require('webpack-dev-server');
const checkRequiredFiles = require('react-dev-utils/checkRequiredFiles'); const checkRequiredFiles = require('react-dev-utils/checkRequiredFiles');
const {choosePort, prepareUrls} = require('react-dev-utils/WebpackDevServerUtils'); const {choosePort, prepareUrls} = require('react-dev-utils/WebpackDevServerUtils');
const path = require('path'); const path = require('node:path');
const paths = require('../../shared/config/paths'); const paths = require('../../shared/config/paths');
const config = require('../config/webpack.config.dev'); const config = require('../config/webpack.config.dev');

View File

@@ -1,14 +1,13 @@
import {spawn} from 'child_process'; import {spawn} from 'node:child_process';
import crypto from 'crypto'; import crypto from 'node:crypto';
import fs from 'fs'; import fs from 'node:fs';
import os from 'os'; import os from 'node:os';
import path from 'path'; import path from 'node:path';
import yargs from 'yargs/yargs';
import {configSchema} from '@shared/schema/Config';
import type {Config} from '@shared/schema/Config';
import type {ClientConnectionSettings} from '@shared/schema/ClientConnectionSettings'; import type {ClientConnectionSettings} from '@shared/schema/ClientConnectionSettings';
import type {Config} from '@shared/schema/Config';
import {configSchema} from '@shared/schema/Config';
import yargs from 'yargs/yargs';
import {version} from './package.json'; import {version} from './package.json';

View File

@@ -144,6 +144,8 @@
"eslint-config-prettier": "^8.8.0", "eslint-config-prettier": "^8.8.0",
"eslint-config-react-app": "^7.0.1", "eslint-config-react-app": "^7.0.1",
"eslint-import-resolver-webpack": "^0.13.2", "eslint-import-resolver-webpack": "^0.13.2",
"eslint-plugin-n": "^17.10.2",
"eslint-plugin-simple-import-sort": "^12.1.1",
"eslint-webpack-plugin": "^3.2.0", "eslint-webpack-plugin": "^3.2.0",
"express": "^4.18.2", "express": "^4.18.2",
"express-rate-limit": "^6.7.0", "express-rate-limit": "^6.7.0",

71
pnpm-lock.yaml generated
View File

@@ -242,6 +242,12 @@ importers:
eslint-import-resolver-webpack: eslint-import-resolver-webpack:
specifier: ^0.13.2 specifier: ^0.13.2
version: 0.13.8(eslint-plugin-import@2.29.1)(webpack@5.93.0(esbuild@0.19.12)) version: 0.13.8(eslint-plugin-import@2.29.1)(webpack@5.93.0(esbuild@0.19.12))
eslint-plugin-n:
specifier: ^17.10.2
version: 17.10.2(eslint@8.57.0)
eslint-plugin-simple-import-sort:
specifier: ^12.1.1
version: 12.1.1(eslint@8.57.0)
eslint-webpack-plugin: eslint-webpack-plugin:
specifier: ^3.2.0 specifier: ^3.2.0
version: 3.2.0(eslint@8.57.0)(webpack@5.93.0(esbuild@0.19.12)) version: 3.2.0(eslint@8.57.0)(webpack@5.93.0(esbuild@0.19.12))
@@ -3573,6 +3579,12 @@ packages:
resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
engines: {node: '>=10'} engines: {node: '>=10'}
eslint-compat-utils@0.5.1:
resolution: {integrity: sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==}
engines: {node: '>=12'}
peerDependencies:
eslint: '>=6.0.0'
eslint-config-airbnb-base@15.0.0: eslint-config-airbnb-base@15.0.0:
resolution: {integrity: sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==} resolution: {integrity: sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==}
engines: {node: ^10.12.0 || >=12.0.0} engines: {node: ^10.12.0 || >=12.0.0}
@@ -3645,6 +3657,12 @@ packages:
eslint-import-resolver-webpack: eslint-import-resolver-webpack:
optional: true optional: true
eslint-plugin-es-x@7.8.0:
resolution: {integrity: sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==}
engines: {node: ^14.18.0 || >=16.0.0}
peerDependencies:
eslint: '>=8'
eslint-plugin-flowtype@8.0.3: eslint-plugin-flowtype@8.0.3:
resolution: {integrity: sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ==} resolution: {integrity: sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ==}
engines: {node: '>=12.0.0'} engines: {node: '>=12.0.0'}
@@ -3682,6 +3700,12 @@ packages:
peerDependencies: peerDependencies:
eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8
eslint-plugin-n@17.10.2:
resolution: {integrity: sha512-e+s4eAf5NtJaxPhTNu3qMO0Iz40WANS93w9LQgYcvuljgvDmWi/a3rh+OrNyMHeng6aOWGJO0rCg5lH4zi8yTw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: '>=8.23.0'
eslint-plugin-react-hooks@4.6.2: eslint-plugin-react-hooks@4.6.2:
resolution: {integrity: sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==} resolution: {integrity: sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==}
engines: {node: '>=10'} engines: {node: '>=10'}
@@ -3694,6 +3718,11 @@ packages:
peerDependencies: peerDependencies:
eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7
eslint-plugin-simple-import-sort@12.1.1:
resolution: {integrity: sha512-6nuzu4xwQtE3332Uz0to+TxDQYRLTKRESSc2hefVT48Zc8JthmN23Gx9lnYhu0FtkRSL1oxny3kJ2aveVhmOVA==}
peerDependencies:
eslint: '>=5.0.0'
eslint-plugin-testing-library@5.11.1: eslint-plugin-testing-library@5.11.1:
resolution: {integrity: sha512-5eX9e1Kc2PqVRed3taaLnAAqPZGEX75C+M/rXzUAI3wIg/ZxzUm1OVAwfe/O+vE+6YXOLetSe9g5GKD2ecXipw==} resolution: {integrity: sha512-5eX9e1Kc2PqVRed3taaLnAAqPZGEX75C+M/rXzUAI3wIg/ZxzUm1OVAwfe/O+vE+6YXOLetSe9g5GKD2ecXipw==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0, npm: '>=6'} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0, npm: '>=6'}
@@ -4118,6 +4147,10 @@ packages:
resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==}
engines: {node: '>=8'} engines: {node: '>=8'}
globals@15.9.0:
resolution: {integrity: sha512-SmSKyLLKFbSr6rptvP8izbyxJL4ILwqO9Jg23UA0sDlGlu58V59D1//I3vlc0KJphVdUR7vMjHIplYnzBxorQA==}
engines: {node: '>=18'}
globalthis@1.0.4: globalthis@1.0.4:
resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==}
engines: {node: '>= 0.4'} engines: {node: '>= 0.4'}
@@ -5068,6 +5101,10 @@ packages:
resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==}
engines: {node: '>=10'} engines: {node: '>=10'}
minimatch@9.0.5:
resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==}
engines: {node: '>=16 || 14 >=14.17'}
minimist@1.2.8: minimist@1.2.8:
resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
@@ -10515,6 +10552,11 @@ snapshots:
escape-string-regexp@4.0.0: {} escape-string-regexp@4.0.0: {}
eslint-compat-utils@0.5.1(eslint@8.57.0):
dependencies:
eslint: 8.57.0
semver: 7.6.3
eslint-config-airbnb-base@15.0.0(eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.0.4))(eslint-import-resolver-webpack@0.13.8)(eslint@8.57.0))(eslint@8.57.0): eslint-config-airbnb-base@15.0.0(eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.0.4))(eslint-import-resolver-webpack@0.13.8)(eslint@8.57.0))(eslint@8.57.0):
dependencies: dependencies:
confusing-browser-globals: 1.0.11 confusing-browser-globals: 1.0.11
@@ -10611,6 +10653,13 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
eslint-plugin-es-x@7.8.0(eslint@8.57.0):
dependencies:
'@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0)
'@eslint-community/regexpp': 4.11.0
eslint: 8.57.0
eslint-compat-utils: 0.5.1(eslint@8.57.0)
eslint-plugin-flowtype@8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.25.2))(@babel/plugin-transform-react-jsx@7.25.2(@babel/core@7.25.2))(eslint@8.57.0): eslint-plugin-flowtype@8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.25.2))(@babel/plugin-transform-react-jsx@7.25.2(@babel/core@7.25.2))(eslint@8.57.0):
dependencies: dependencies:
'@babel/plugin-syntax-flow': 7.24.7(@babel/core@7.25.2) '@babel/plugin-syntax-flow': 7.24.7(@babel/core@7.25.2)
@@ -10677,6 +10726,18 @@ snapshots:
safe-regex-test: 1.0.3 safe-regex-test: 1.0.3
string.prototype.includes: 2.0.0 string.prototype.includes: 2.0.0
eslint-plugin-n@17.10.2(eslint@8.57.0):
dependencies:
'@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0)
enhanced-resolve: 5.17.1
eslint: 8.57.0
eslint-plugin-es-x: 7.8.0(eslint@8.57.0)
get-tsconfig: 4.7.6
globals: 15.9.0
ignore: 5.3.1
minimatch: 9.0.5
semver: 7.6.3
eslint-plugin-react-hooks@4.6.2(eslint@8.57.0): eslint-plugin-react-hooks@4.6.2(eslint@8.57.0):
dependencies: dependencies:
eslint: 8.57.0 eslint: 8.57.0
@@ -10703,6 +10764,10 @@ snapshots:
string.prototype.matchall: 4.0.11 string.prototype.matchall: 4.0.11
string.prototype.repeat: 1.0.0 string.prototype.repeat: 1.0.0
eslint-plugin-simple-import-sort@12.1.1(eslint@8.57.0):
dependencies:
eslint: 8.57.0
eslint-plugin-testing-library@5.11.1(eslint@8.57.0)(typescript@5.0.4): eslint-plugin-testing-library@5.11.1(eslint@8.57.0)(typescript@5.0.4):
dependencies: dependencies:
'@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.0.4) '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.0.4)
@@ -11238,6 +11303,8 @@ snapshots:
dependencies: dependencies:
type-fest: 0.20.2 type-fest: 0.20.2
globals@15.9.0: {}
globalthis@1.0.4: globalthis@1.0.4:
dependencies: dependencies:
define-properties: 1.2.1 define-properties: 1.2.1
@@ -12345,6 +12412,10 @@ snapshots:
dependencies: dependencies:
brace-expansion: 2.0.1 brace-expansion: 2.0.1
minimatch@9.0.5:
dependencies:
brace-expansion: 2.0.1
minimist@1.2.8: {} minimist@1.2.8: {}
minipass@7.1.2: {} minipass@7.1.2: {}

View File

@@ -9,7 +9,7 @@ process.on('unhandledRejection', (err) => {
throw err; throw err;
}); });
const path = require('path'); const path = require('node:path');
const esbuild = require('esbuild'); const esbuild = require('esbuild');
const chalk = require('chalk'); const chalk = require('chalk');
const fs = require('fs-extra'); const fs = require('fs-extra');

View File

@@ -1,9 +1,9 @@
const chalk = require('chalk'); const chalk = require('chalk');
const crypto = require('crypto'); const crypto = require('node:crypto');
const fs = require('fs'); const fs = require('node:fs');
const os = require('os'); const os = require('node:os');
const path = require('path'); const path = require('node:path');
const {spawn} = require('child_process'); const {spawn} = require('node:child_process');
const temporaryRuntimeDirectory = path.resolve(os.tmpdir(), `flood.test.${crypto.randomBytes(12).toString('hex')}`); const temporaryRuntimeDirectory = path.resolve(os.tmpdir(), `flood.test.${crypto.randomBytes(12).toString('hex')}`);

View File

@@ -1,8 +1,8 @@
import fs from 'fs'; import fs from 'node:fs';
import path from 'path'; import path from 'node:path';
import {appDist} from '../../shared/config/paths';
import config from '../../config'; import config from '../../config';
import {appDist} from '../../shared/config/paths';
const staticAssets = [path.join(appDist, 'index.html')]; const staticAssets = [path.join(appDist, 'index.html')];

View File

@@ -1,8 +1,7 @@
import {AccessLevel} from '../../../shared/schema/constants/Auth';
import Users from '../../models/Users';
import type {Credentials} from '../../../shared/schema/Auth'; import type {Credentials} from '../../../shared/schema/Auth';
import type {RTorrentConnectionSettings} from '../../../shared/schema/ClientConnectionSettings'; import type {RTorrentConnectionSettings} from '../../../shared/schema/ClientConnectionSettings';
import {AccessLevel} from '../../../shared/schema/constants/Auth';
import Users from '../../models/Users';
import type {UserInDatabase1} from './types/UserInDatabase1'; import type {UserInDatabase1} from './types/UserInDatabase1';
const migrationError = (err?: Error) => { const migrationError = (err?: Error) => {

View File

@@ -1,5 +1,6 @@
import path from 'node:path';
import fs from 'fs-extra'; import fs from 'fs-extra';
import path from 'path';
import config from '../../../config'; import config from '../../../config';
import Users from '../../models/Users'; import Users from '../../models/Users';

View File

@@ -1,14 +1,14 @@
import chalk from 'chalk'; import fs from 'node:fs';
import fastify from 'fastify'; import type {Server} from 'node:http';
import fs from 'fs'; import type {Http2SecureServer} from 'node:http2';
import chalk from 'chalk';
import type {FastifyInstance} from 'fastify'; import type {FastifyInstance} from 'fastify';
import type {Http2SecureServer} from 'http2'; import fastify from 'fastify';
import type {Server} from 'http';
import config from '../../config'; import config from '../../config';
import constructRoutes from '../routes';
import packageJSON from '../../package.json'; import packageJSON from '../../package.json';
import constructRoutes from '../routes';
const startWebServer = async () => { const startWebServer = async () => {
const {ssl = false, floodServerHost: host, floodServerPort: port} = config; const {ssl = false, floodServerHost: host, floodServerPort: port} = config;

View File

@@ -1,8 +1,7 @@
import type {Request, Response, NextFunction} from 'express'; import type {NextFunction, Request, Response} from 'express';
import {getAllServices} from '../services';
import type {ServiceInstances} from '../services'; import type {ServiceInstances} from '../services';
import {getAllServices} from '../services';
declare global { declare global {
// eslint-disable-next-line @typescript-eslint/no-namespace // eslint-disable-next-line @typescript-eslint/no-namespace

View File

@@ -1,14 +1,13 @@
import type {EventMap} from 'typed-emitter';
import type {Operation} from 'fast-json-patch';
import type {Request, Response} from 'express'; import type {Request, Response} from 'express';
import type {Operation} from 'fast-json-patch';
import type {EventMap} from 'typed-emitter';
import type TypedEmitter from 'typed-emitter'; import type TypedEmitter from 'typed-emitter';
import DiskUsage from '../models/DiskUsage';
import {getAllServices} from '../services';
import ServerEvent from '../models/ServerEvent';
import type {DiskUsageSummary} from '../models/DiskUsage';
import type {TransferHistory} from '../../shared/types/TransferData'; import type {TransferHistory} from '../../shared/types/TransferData';
import type {DiskUsageSummary} from '../models/DiskUsage';
import DiskUsage from '../models/DiskUsage';
import ServerEvent from '../models/ServerEvent';
import {getAllServices} from '../services';
export default async (req: Request, res: Response) => { export default async (req: Request, res: Response) => {
const {user} = req; const {user} = req;

View File

@@ -1,4 +1,4 @@
import type {Request, Response, NextFunction} from 'express'; import type {NextFunction, Request, Response} from 'express';
export default (req: Request, res: Response, next: NextFunction) => { export default (req: Request, res: Response, next: NextFunction) => {
req.socket.setKeepAlive(true); req.socket.setKeepAlive(true);

View File

@@ -1,4 +1,4 @@
import type {Request, Response, NextFunction} from 'express'; import type {NextFunction, Request, Response} from 'express';
import {AccessLevel} from '../../shared/schema/constants/Auth'; import {AccessLevel} from '../../shared/schema/constants/Auth';

View File

@@ -1,11 +1,10 @@
import {EventEmitter} from 'events'; import {EventEmitter} from 'node:events';
import type TypedEmitter from 'typed-emitter';
import type {Disks} from '@shared/types/DiskUsage'; import type {Disks} from '@shared/types/DiskUsage';
import type TypedEmitter from 'typed-emitter';
import {isPlatformSupported, diskUsage} from '../util/diskUsageUtil';
import type {SupportedPlatform} from '../util/diskUsageUtil'; import type {SupportedPlatform} from '../util/diskUsageUtil';
import {diskUsage, isPlatformSupported} from '../util/diskUsageUtil';
export interface DiskUsageSummary { export interface DiskUsageSummary {
id: number; id: number;

View File

@@ -1,7 +1,7 @@
import type {TransferData, TransferSnapshot} from '@shared/types/TransferData'; import {setInterval} from 'node:timers';
import Datastore from '@seald-io/nedb'; import Datastore from '@seald-io/nedb';
import {setInterval} from 'timers'; import type {TransferData, TransferSnapshot} from '@shared/types/TransferData';
import config from '../../config'; import config from '../../config';

View File

@@ -1,6 +1,5 @@
import type {Response} from 'express';
import type {ServerEvents} from '@shared/types/ServerEvents'; import type {ServerEvents} from '@shared/types/ServerEvents';
import type {Response} from 'express';
class ServerEvent { class ServerEvent {
res: Response; res: Response;

View File

@@ -1,5 +1,5 @@
import fs from 'fs'; import fs from 'node:fs';
import path from 'path'; import path from 'node:path';
import config from '../../config'; import config from '../../config';

View File

@@ -1,15 +1,15 @@
import {argon2id, argon2Verify} from 'hash-wasm'; import crypto from 'node:crypto';
import crypto from 'crypto'; import fs from 'node:fs';
import path from 'node:path';
import Datastore from '@seald-io/nedb'; import Datastore from '@seald-io/nedb';
import fs from 'fs'; import {argon2id, argon2Verify} from 'hash-wasm';
import path from 'path';
import {AccessLevel} from '../../shared/schema/constants/Auth';
import config from '../../config'; import config from '../../config';
import {bootstrapServicesForUser, destroyUserServices} from '../services';
import type {ClientConnectionSettings} from '../../shared/schema/ClientConnectionSettings';
import type {Credentials, UserInDatabase} from '../../shared/schema/Auth'; import type {Credentials, UserInDatabase} from '../../shared/schema/Auth';
import type {ClientConnectionSettings} from '../../shared/schema/ClientConnectionSettings';
import {AccessLevel} from '../../shared/schema/constants/Auth';
import {bootstrapServicesForUser, destroyUserServices} from '../services';
const hashPassword = async (password: string): Promise<string> => { const hashPassword = async (password: string): Promise<string> => {
return argon2id({ return argon2id({

View File

@@ -1,18 +1,17 @@
import crypto from 'crypto'; import crypto from 'node:crypto';
import fastify from 'fastify'; import fastify from 'fastify';
import supertest from 'supertest'; import supertest from 'supertest';
import {AccessLevel} from '../../../shared/schema/constants/Auth';
import constructRoutes from '..';
import {getAuthToken} from '../../util/authUtil';
import type { import type {
AuthRegistrationOptions, AuthRegistrationOptions,
AuthUpdateUserOptions, AuthUpdateUserOptions,
AuthVerificationResponse, AuthVerificationResponse,
} from '../../../shared/schema/api/auth'; } from '../../../shared/schema/api/auth';
import type {ClientConnectionSettings} from '../../../shared/schema/ClientConnectionSettings'; import type {ClientConnectionSettings} from '../../../shared/schema/ClientConnectionSettings';
import {AccessLevel} from '../../../shared/schema/constants/Auth';
import {getAuthToken} from '../../util/authUtil';
import constructRoutes from '..';
const testConnectionSettings: ClientConnectionSettings = { const testConnectionSettings: ClientConnectionSettings = {
client: 'rTorrent', client: 'rTorrent',

View File

@@ -1,21 +1,9 @@
import express from 'express';
import passport from 'passport';
import rateLimit from 'express-rate-limit';
import type {Response} from 'express'; import type {Response} from 'express';
import express from 'express';
import rateLimit from 'express-rate-limit';
import passport from 'passport';
import {
authAuthenticationSchema,
authRegistrationSchema,
authUpdateUserSchema,
AuthVerificationPreloadConfigs,
} from '../../../shared/schema/api/auth';
import {bootstrapServicesForUser, destroyUserServices} from '../../services';
import config from '../../../config'; import config from '../../../config';
import {getAuthToken, getCookieOptions} from '../../util/authUtil';
import requireAdmin from '../../middleware/requireAdmin';
import Users from '../../models/Users';
import type { import type {
AuthAuthenticationOptions, AuthAuthenticationOptions,
AuthAuthenticationResponse, AuthAuthenticationResponse,
@@ -23,7 +11,17 @@ import type {
AuthUpdateUserOptions, AuthUpdateUserOptions,
AuthVerificationResponse, AuthVerificationResponse,
} from '../../../shared/schema/api/auth'; } from '../../../shared/schema/api/auth';
import {
authAuthenticationSchema,
authRegistrationSchema,
authUpdateUserSchema,
AuthVerificationPreloadConfigs,
} from '../../../shared/schema/api/auth';
import type {Credentials, UserInDatabase} from '../../../shared/schema/Auth'; import type {Credentials, UserInDatabase} from '../../../shared/schema/Auth';
import requireAdmin from '../../middleware/requireAdmin';
import Users from '../../models/Users';
import {bootstrapServicesForUser, destroyUserServices} from '../../services';
import {getAuthToken, getCookieOptions} from '../../util/authUtil';
const router = express.Router(); const router = express.Router();

View File

@@ -1,10 +1,9 @@
import fastify from 'fastify'; import fastify from 'fastify';
import supertest from 'supertest'; import supertest from 'supertest';
import constructRoutes from '..';
import {getAuthToken} from '../../util/authUtil';
import type {ClientSettings} from '../../../shared/types/ClientSettings'; import type {ClientSettings} from '../../../shared/types/ClientSettings';
import {getAuthToken} from '../../util/authUtil';
import constructRoutes from '..';
const app = fastify({disableRequestLogging: true, logger: true}); const app = fastify({disableRequestLogging: true, logger: true});
let request: supertest.SuperTest<supertest.Test>; let request: supertest.SuperTest<supertest.Test>;

View File

@@ -1,7 +1,6 @@
import express, {Response} from 'express';
import type {ClientSettings} from '@shared/types/ClientSettings';
import type {SetClientSettingsOptions} from '@shared/types/api/client'; import type {SetClientSettingsOptions} from '@shared/types/api/client';
import type {ClientSettings} from '@shared/types/ClientSettings';
import express, {Response} from 'express';
import requireAdmin from '../../middleware/requireAdmin'; import requireAdmin from '../../middleware/requireAdmin';

View File

@@ -1,13 +1,13 @@
import fastify from 'fastify'; import fs from 'node:fs';
import fs from 'fs';
import supertest from 'supertest';
import constructRoutes from '..'; import fastify from 'fastify';
import {getAuthToken} from '../../util/authUtil'; import supertest from 'supertest';
import {getTempPath} from '../../models/TemporaryStorage';
import type {AddFeedOptions, AddRuleOptions, ModifyFeedOptions} from '../../../shared/types/api/feed-monitor'; import type {AddFeedOptions, AddRuleOptions, ModifyFeedOptions} from '../../../shared/types/api/feed-monitor';
import type {Feed, Rule} from '../../../shared/types/Feed'; import type {Feed, Rule} from '../../../shared/types/Feed';
import {getTempPath} from '../../models/TemporaryStorage';
import {getAuthToken} from '../../util/authUtil';
import constructRoutes from '..';
const app = fastify({disableRequestLogging: true, logger: false}); const app = fastify({disableRequestLogging: true, logger: false});
let request: supertest.SuperTest<supertest.Test>; let request: supertest.SuperTest<supertest.Test>;

View File

@@ -1,6 +1,5 @@
import express, {Response} from 'express';
import type {AddFeedOptions, AddRuleOptions, ModifyFeedOptions} from '@shared/types/api/feed-monitor'; import type {AddFeedOptions, AddRuleOptions, ModifyFeedOptions} from '@shared/types/api/feed-monitor';
import express, {Response} from 'express';
import {accessDeniedError, isAllowedPath, sanitizePath} from '../../util/fileUtil'; import {accessDeniedError, isAllowedPath, sanitizePath} from '../../util/fileUtil';

View File

@@ -1,10 +1,9 @@
import fastify from 'fastify'; import fastify from 'fastify';
import supertest from 'supertest'; import supertest from 'supertest';
import constructRoutes from '..';
import {getAuthToken} from '../../util/authUtil';
import type {FloodSettings} from '../../../shared/types/FloodSettings'; import type {FloodSettings} from '../../../shared/types/FloodSettings';
import {getAuthToken} from '../../util/authUtil';
import constructRoutes from '..';
const app = fastify({disableRequestLogging: true, logger: false}); const app = fastify({disableRequestLogging: true, logger: false});
let request: supertest.SuperTest<supertest.Test>; let request: supertest.SuperTest<supertest.Test>;

View File

@@ -1,24 +1,23 @@
import express, {Response} from 'express'; import fs from 'node:fs';
import fs from 'fs'; import path from 'node:path';
import passport from 'passport';
import path from 'path';
import {contentTokenSchema} from '@shared/schema/api/torrents'; import {contentTokenSchema} from '@shared/schema/api/torrents';
import type {DirectoryListQuery, DirectoryListResponse, SetFloodSettingsOptions} from '@shared/types/api/index';
import type {FloodSettings} from '@shared/types/FloodSettings'; import type {FloodSettings} from '@shared/types/FloodSettings';
import type {NotificationFetchOptions, NotificationState} from '@shared/types/Notification'; import type {NotificationFetchOptions, NotificationState} from '@shared/types/Notification';
import type {DirectoryListQuery, DirectoryListResponse, SetFloodSettingsOptions} from '@shared/types/api/index'; import express, {Response} from 'express';
import passport from 'passport';
import {accessDeniedError, isAllowedPath, sanitizePath} from '../../util/fileUtil';
import appendUserServices from '../../middleware/appendUserServices'; import appendUserServices from '../../middleware/appendUserServices';
import authRoutes from './auth';
import clientRoutes from './client';
import clientActivityStream from '../../middleware/clientActivityStream'; import clientActivityStream from '../../middleware/clientActivityStream';
import eventStream from '../../middleware/eventStream'; import eventStream from '../../middleware/eventStream';
import feedMonitorRoutes from './feed-monitor';
import {getAuthToken, verifyToken} from '../../util/authUtil'; import {getAuthToken, verifyToken} from '../../util/authUtil';
import torrentsRoutes from './torrents'; import {accessDeniedError, isAllowedPath, sanitizePath} from '../../util/fileUtil';
import {rateLimit} from '../utils'; import {rateLimit} from '../utils';
import authRoutes from './auth';
import clientRoutes from './client';
import feedMonitorRoutes from './feed-monitor';
import torrentsRoutes from './torrents';
const router = express.Router(); const router = express.Router();

View File

@@ -1,25 +1,25 @@
import crypto from 'crypto'; import crypto from 'node:crypto';
import fastify from 'fastify'; import fs from 'node:fs';
import fs from 'fs'; import os from 'node:os';
import os from 'os'; import path from 'node:path';
import path from 'path'; import readline from 'node:readline';
import readline from 'readline'; import stream from 'node:stream';
import stream from 'stream';
import supertest from 'supertest';
import axios from 'axios'; import axios from 'axios';
import MockAdapter from 'axios-mock-adapter'; import MockAdapter from 'axios-mock-adapter';
import fastify from 'fastify';
import supertest from 'supertest';
import constructRoutes from '..';
import {getAuthToken} from '../../util/authUtil';
import {getTempPath} from '../../models/TemporaryStorage';
import paths from '../../../shared/config/paths'; import paths from '../../../shared/config/paths';
import type {TorrentStatus} from '../../../shared/constants/torrentStatusMap';
import type {AddTorrentByFileOptions, AddTorrentByURLOptions} from '../../../shared/schema/api/torrents'; import type {AddTorrentByFileOptions, AddTorrentByURLOptions} from '../../../shared/schema/api/torrents';
import type {MoveTorrentsOptions, SetTorrentsTrackersOptions} from '../../../shared/types/api/torrents'; import type {MoveTorrentsOptions, SetTorrentsTrackersOptions} from '../../../shared/types/api/torrents';
import type {TorrentContent} from '../../../shared/types/TorrentContent';
import type {TorrentList} from '../../../shared/types/Torrent'; import type {TorrentList} from '../../../shared/types/Torrent';
import type {TorrentStatus} from '../../../shared/constants/torrentStatusMap'; import type {TorrentContent} from '../../../shared/types/TorrentContent';
import type {TorrentTracker} from '../../../shared/types/TorrentTracker'; import type {TorrentTracker} from '../../../shared/types/TorrentTracker';
import {getTempPath} from '../../models/TemporaryStorage';
import {getAuthToken} from '../../util/authUtil';
import constructRoutes from '..';
const app = fastify({bodyLimit: 100 * 1024 * 1024 * 1024, disableRequestLogging: true, forceCloseConnections: true}); const app = fastify({bodyLimit: 100 * 1024 * 1024 * 1024, disableRequestLogging: true, forceCloseConnections: true});
let request: supertest.SuperTest<supertest.Test>; let request: supertest.SuperTest<supertest.Test>;

View File

@@ -1,11 +1,6 @@
import childProcess from 'child_process'; import childProcess from 'node:child_process';
import contentDisposition from 'content-disposition'; import fs from 'node:fs';
import createTorrent from 'create-torrent'; import path from 'node:path';
import express, {Response} from 'express';
import fs from 'fs';
import path from 'path';
import sanitize from 'sanitize-filename';
import tar, {Pack} from 'tar-fs';
import type { import type {
AddTorrentByFileOptions, AddTorrentByFileOptions,
@@ -27,6 +22,11 @@ import type {
StartTorrentsOptions, StartTorrentsOptions,
StopTorrentsOptions, StopTorrentsOptions,
} from '@shared/types/api/torrents'; } from '@shared/types/api/torrents';
import contentDisposition from 'content-disposition';
import createTorrent from 'create-torrent';
import express, {Response} from 'express';
import sanitize from 'sanitize-filename';
import tar, {Pack} from 'tar-fs';
import { import {
addTorrentByFileSchema, addTorrentByFileSchema,
@@ -34,6 +34,9 @@ import {
reannounceTorrentsSchema, reannounceTorrentsSchema,
setTorrentsTagsSchema, setTorrentsTagsSchema,
} from '../../../shared/schema/api/torrents'; } from '../../../shared/schema/api/torrents';
import {getTempPath} from '../../models/TemporaryStorage';
import {asyncFilter} from '../../util/async';
import {getToken} from '../../util/authUtil';
import { import {
accessDeniedError, accessDeniedError,
existAsync, existAsync,
@@ -42,9 +45,6 @@ import {
isAllowedPathAsync, isAllowedPathAsync,
sanitizePath, sanitizePath,
} from '../../util/fileUtil'; } from '../../util/fileUtil';
import {getTempPath} from '../../models/TemporaryStorage';
import {getToken} from '../../util/authUtil';
import {asyncFilter} from '../../util/async';
import {rateLimit} from '../utils'; import {rateLimit} from '../utils';
const getDestination = async ( const getDestination = async (

View File

@@ -1,23 +1,22 @@
import fs from 'fs'; import fs from 'node:fs';
import path from 'path'; import path from 'node:path';
import type {FastifyInstance} from 'fastify';
import fastifyCompress from '@fastify/compress';
import {fastifyExpress} from '@fastify/express';
import fastifyStatic from '@fastify/static';
import paths from '@shared/config/paths'; import paths from '@shared/config/paths';
import {Strategy} from 'passport-jwt';
import apiRoutes from './api';
import config from '../../config';
import Users from '../models/Users';
import {authTokenSchema, UserInDatabase} from '@shared/schema/Auth'; import {authTokenSchema, UserInDatabase} from '@shared/schema/Auth';
import express from 'express';
import morgan from 'morgan';
import passport from 'passport';
import bodyParser from 'body-parser'; import bodyParser from 'body-parser';
import cookieParser from 'cookie-parser'; import cookieParser from 'cookie-parser';
import {fastifyExpress} from '@fastify/express'; import express from 'express';
import fastifyCompress from '@fastify/compress'; import type {FastifyInstance} from 'fastify';
import fastifyStatic from '@fastify/static'; import morgan from 'morgan';
import passport from 'passport';
import {Strategy} from 'passport-jwt';
import config from '../../config';
import Users from '../models/Users';
import apiRoutes from './api';
declare global { declare global {
// eslint-disable-next-line @typescript-eslint/no-namespace // eslint-disable-next-line @typescript-eslint/no-namespace

View File

@@ -1,7 +1,7 @@
import config from '../../config';
import expressRateLimit, {Options} from 'express-rate-limit';
import {RequestHandler} from 'express'; import {RequestHandler} from 'express';
import expressRateLimit, {Options} from 'express-rate-limit';
import config from '../../config';
export function rateLimit(passedOptions?: Partial<Options>): RequestHandler { export function rateLimit(passedOptions?: Partial<Options>): RequestHandler {
if (config.disableRateLimit) { if (config.disableRateLimit) {

View File

@@ -1,8 +1,8 @@
import {EventEmitter} from 'events'; import {EventEmitter} from 'node:events';
import type {EventMap} from 'typed-emitter';
import type TypedEmitter from 'typed-emitter';
import type {UserInDatabase} from '@shared/schema/Auth'; import type {UserInDatabase} from '@shared/schema/Auth';
import type {EventMap} from 'typed-emitter';
import type TypedEmitter from 'typed-emitter';
import type {ServiceInstances} from '.'; import type {ServiceInstances} from '.';

View File

@@ -1,8 +1,5 @@
import {homedir} from 'os'; import {homedir} from 'node:os';
import path from 'path'; import path from 'node:path';
import {TorrentContentPriority} from '@shared/types/TorrentContent';
import {TorrentTrackerType} from '@shared/types/TorrentTracker';
import type { import type {
AddTorrentByFileOptions, AddTorrentByFileOptions,
@@ -10,6 +7,8 @@ import type {
ReannounceTorrentsOptions, ReannounceTorrentsOptions,
SetTorrentsTagsOptions, SetTorrentsTagsOptions,
} from '@shared/schema/api/torrents'; } from '@shared/schema/api/torrents';
import type {DelugeConnectionSettings} from '@shared/schema/ClientConnectionSettings';
import type {SetClientSettingsOptions} from '@shared/types/api/client';
import type { import type {
CheckTorrentsOptions, CheckTorrentsOptions,
DeleteTorrentsOptions, DeleteTorrentsOptions,
@@ -23,20 +22,19 @@ import type {
StopTorrentsOptions, StopTorrentsOptions,
} from '@shared/types/api/torrents'; } from '@shared/types/api/torrents';
import type {ClientSettings} from '@shared/types/ClientSettings'; import type {ClientSettings} from '@shared/types/ClientSettings';
import type {DelugeConnectionSettings} from '@shared/schema/ClientConnectionSettings';
import type {TorrentContent} from '@shared/types/TorrentContent';
import type {TorrentList, TorrentListSummary, TorrentProperties} from '@shared/types/Torrent'; import type {TorrentList, TorrentListSummary, TorrentProperties} from '@shared/types/Torrent';
import type {TorrentContent} from '@shared/types/TorrentContent';
import {TorrentContentPriority} from '@shared/types/TorrentContent';
import type {TorrentPeer} from '@shared/types/TorrentPeer'; import type {TorrentPeer} from '@shared/types/TorrentPeer';
import type {TorrentTracker} from '@shared/types/TorrentTracker'; import type {TorrentTracker} from '@shared/types/TorrentTracker';
import {TorrentTrackerType} from '@shared/types/TorrentTracker';
import type {TransferSummary} from '@shared/types/TransferData'; import type {TransferSummary} from '@shared/types/TransferData';
import type {SetClientSettingsOptions} from '@shared/types/api/client';
import {fetchUrls} from '../../util/fetchUtil'; import {fetchUrls} from '../../util/fetchUtil';
import {getTorrentStatusFromStatuses} from './util/torrentPropertiesUtil';
import ClientGatewayService from '../clientGatewayService'; import ClientGatewayService from '../clientGatewayService';
import ClientRequestManager from './clientRequestManager'; import ClientRequestManager from './clientRequestManager';
import {DelugeCoreTorrentFilePriority} from './types/DelugeCoreMethods'; import {DelugeCoreTorrentFilePriority} from './types/DelugeCoreMethods';
import {getTorrentStatusFromStatuses} from './util/torrentPropertiesUtil';
class DelugeClientGatewayService extends ClientGatewayService { class DelugeClientGatewayService extends ClientGatewayService {
private clientRequestManager = new ClientRequestManager(this.user.client as DelugeConnectionSettings); private clientRequestManager = new ClientRequestManager(this.user.client as DelugeConnectionSettings);

View File

@@ -1,15 +1,11 @@
import {deflate, inflate} from 'zlib'; import fs from 'node:fs';
import fs from 'fs'; import os from 'node:os';
import os from 'os'; import path from 'node:path';
import path from 'path'; import tls from 'node:tls';
import tls from 'tls'; import {deflate, inflate} from 'node:zlib';
import {decode, encode} from './util/rencode';
import type {DelugeConnectionSettings} from '@shared/schema/ClientConnectionSettings'; import type {DelugeConnectionSettings} from '@shared/schema/ClientConnectionSettings';
import type {RencodableArray, RencodableData, RencodableObject} from './util/rencode';
import type { import type {
DelugeCorePreferences, DelugeCorePreferences,
DelugeCoreSessionStatuses, DelugeCoreSessionStatuses,
@@ -17,6 +13,8 @@ import type {
DelugeCoreTorrentStatuses, DelugeCoreTorrentStatuses,
DelugeCoreTorrentTracker, DelugeCoreTorrentTracker,
} from './types/DelugeCoreMethods'; } from './types/DelugeCoreMethods';
import type {RencodableArray, RencodableData, RencodableObject} from './util/rencode';
import {decode, encode} from './util/rencode';
const DELUGE_RPC_PROTOCOL_VERSION = 0x01; const DELUGE_RPC_PROTOCOL_VERSION = 0x01;
const protocolVerBuf = Buffer.alloc(1); const protocolVerBuf = Buffer.alloc(1);

View File

@@ -451,4 +451,4 @@ function loads(data: Buffer, decodeUTF8 = true): RencodableData {
return decode(new Buff(data), decodeUTF8); return decode(new Buff(data), decodeUTF8);
} }
export {dumps as encode, dumps, loads as decode, loads}; export {loads as decode, dumps, dumps as encode, loads};

View File

@@ -1,4 +1,4 @@
import path from 'path'; import path from 'node:path';
import type { import type {
AddTorrentByFileOptions, AddTorrentByFileOptions,
@@ -6,6 +6,8 @@ import type {
ReannounceTorrentsOptions, ReannounceTorrentsOptions,
SetTorrentsTagsOptions, SetTorrentsTagsOptions,
} from '@shared/schema/api/torrents'; } from '@shared/schema/api/torrents';
import type {TransmissionConnectionSettings} from '@shared/schema/ClientConnectionSettings';
import type {SetClientSettingsOptions} from '@shared/types/api/client';
import type { import type {
CheckTorrentsOptions, CheckTorrentsOptions,
DeleteTorrentsOptions, DeleteTorrentsOptions,
@@ -17,24 +19,22 @@ import type {
StopTorrentsOptions, StopTorrentsOptions,
} from '@shared/types/api/torrents'; } from '@shared/types/api/torrents';
import type {ClientSettings} from '@shared/types/ClientSettings'; import type {ClientSettings} from '@shared/types/ClientSettings';
import type {TorrentContent} from '@shared/types/TorrentContent';
import type {TorrentList, TorrentListSummary, TorrentProperties} from '@shared/types/Torrent'; import type {TorrentList, TorrentListSummary, TorrentProperties} from '@shared/types/Torrent';
import type {TorrentContent} from '@shared/types/TorrentContent';
import type {TorrentPeer} from '@shared/types/TorrentPeer'; import type {TorrentPeer} from '@shared/types/TorrentPeer';
import type {TorrentTracker} from '@shared/types/TorrentTracker'; import type {TorrentTracker} from '@shared/types/TorrentTracker';
import type {TransferSummary} from '@shared/types/TransferData'; import type {TransferSummary} from '@shared/types/TransferData';
import type {TransmissionConnectionSettings} from '@shared/schema/ClientConnectionSettings';
import type {SetClientSettingsOptions} from '@shared/types/api/client';
import * as geoip from '../geoip'; import {TorrentPriority} from '../../../shared/types/Torrent';
import ClientGatewayService from '../clientGatewayService'; import {TorrentContentPriority} from '../../../shared/types/TorrentContent';
import ClientRequestManager from './clientRequestManager'; import {TorrentTrackerType} from '../../../shared/types/TorrentTracker';
import {fetchUrls} from '../../util/fetchUtil'; import {fetchUrls} from '../../util/fetchUtil';
import {getDomainsFromURLs} from '../../util/torrentPropertiesUtil'; import {getDomainsFromURLs} from '../../util/torrentPropertiesUtil';
import {TorrentContentPriority} from '../../../shared/types/TorrentContent'; import ClientGatewayService from '../clientGatewayService';
import {TorrentPriority} from '../../../shared/types/Torrent'; import * as geoip from '../geoip';
import torrentPropertiesUtil from './util/torrentPropertiesUtil'; import ClientRequestManager from './clientRequestManager';
import {TorrentTrackerType} from '../../../shared/types/TorrentTracker';
import {TransmissionPriority, TransmissionTorrentsSetArguments} from './types/TransmissionTorrentsMethods'; import {TransmissionPriority, TransmissionTorrentsSetArguments} from './types/TransmissionTorrentsMethods';
import torrentPropertiesUtil from './util/torrentPropertiesUtil';
class TransmissionClientGatewayService extends ClientGatewayService { class TransmissionClientGatewayService extends ClientGatewayService {
clientRequestManager = new ClientRequestManager(this.user.client as TransmissionConnectionSettings); clientRequestManager = new ClientRequestManager(this.user.client as TransmissionConnectionSettings);

View File

@@ -1,6 +1,5 @@
import axios, {AxiosError} from 'axios';
import type {TransmissionConnectionSettings} from '@shared/schema/ClientConnectionSettings'; import type {TransmissionConnectionSettings} from '@shared/schema/ClientConnectionSettings';
import axios, {AxiosError} from 'axios';
import type { import type {
TransmissionSessionGetArguments, TransmissionSessionGetArguments,
@@ -9,9 +8,9 @@ import type {
TransmissionSessionStats, TransmissionSessionStats,
} from './types/TransmissionSessionMethods'; } from './types/TransmissionSessionMethods';
import { import {
TransmissionTorrentAddArguments,
TransmissionTorrentIDs, TransmissionTorrentIDs,
TransmissionTorrentProperties, TransmissionTorrentProperties,
TransmissionTorrentAddArguments,
TransmissionTorrentsGetArguments, TransmissionTorrentsGetArguments,
TransmissionTorrentsRemoveArguments, TransmissionTorrentsRemoveArguments,
TransmissionTorrentsSetArguments, TransmissionTorrentsSetArguments,

View File

@@ -1,7 +1,6 @@
import {TransmissionTorrentError, TransmissionTorrentStatus} from '../types/TransmissionTorrentsMethods';
import type {TorrentProperties} from '../../../../shared/types/Torrent'; import type {TorrentProperties} from '../../../../shared/types/Torrent';
import type {TransmissionTorrentProperties} from '../types/TransmissionTorrentsMethods'; import type {TransmissionTorrentProperties} from '../types/TransmissionTorrentsMethods';
import {TransmissionTorrentError, TransmissionTorrentStatus} from '../types/TransmissionTorrentsMethods';
const getTorrentStatus = ( const getTorrentStatus = (
properties: Pick< properties: Pick<

View File

@@ -4,6 +4,8 @@ import type {
ReannounceTorrentsOptions, ReannounceTorrentsOptions,
SetTorrentsTagsOptions, SetTorrentsTagsOptions,
} from '@shared/schema/api/torrents'; } from '@shared/schema/api/torrents';
import type {UserInDatabase} from '@shared/schema/Auth';
import type {SetClientSettingsOptions} from '@shared/types/api/client';
import type { import type {
CheckTorrentsOptions, CheckTorrentsOptions,
DeleteTorrentsOptions, DeleteTorrentsOptions,
@@ -17,16 +19,14 @@ import type {
StopTorrentsOptions, StopTorrentsOptions,
} from '@shared/types/api/torrents'; } from '@shared/types/api/torrents';
import type {ClientSettings} from '@shared/types/ClientSettings'; import type {ClientSettings} from '@shared/types/ClientSettings';
import type {SetClientSettingsOptions} from '@shared/types/api/client';
import type {TorrentContent} from '@shared/types/TorrentContent';
import type {TorrentListSummary, TorrentProperties} from '@shared/types/Torrent'; import type {TorrentListSummary, TorrentProperties} from '@shared/types/Torrent';
import type {TorrentContent} from '@shared/types/TorrentContent';
import type {TorrentPeer} from '@shared/types/TorrentPeer'; import type {TorrentPeer} from '@shared/types/TorrentPeer';
import type {TorrentTracker} from '@shared/types/TorrentTracker'; import type {TorrentTracker} from '@shared/types/TorrentTracker';
import type {TransferSummary} from '@shared/types/TransferData'; import type {TransferSummary} from '@shared/types/TransferData';
import type {UserInDatabase} from '@shared/schema/Auth';
import BaseService from './BaseService';
import config from '../../config'; import config from '../../config';
import BaseService from './BaseService';
type ClientGatewayServiceEvents = { type ClientGatewayServiceEvents = {
CLIENT_CONNECTION_STATE_CHANGE: (isConnected: boolean) => void; CLIENT_CONNECTION_STATE_CHANGE: (isConnected: boolean) => void;

View File

@@ -1,16 +1,15 @@
import path from 'path'; import path from 'node:path';
import Datastore from '@seald-io/nedb';
import Datastore from '@seald-io/nedb';
import type {FeedItem} from 'feedsub'; import type {FeedItem} from 'feedsub';
import BaseService from './BaseService';
import config from '../../config'; import config from '../../config';
import FeedReader from '../models/FeedReader';
import {getFeedItemsMatchingRules, getTorrentUrlsFromFeedItem} from '../util/feedUtil';
import type {AddFeedOptions, AddRuleOptions, ModifyFeedOptions} from '../../shared/types/api/feed-monitor'; import type {AddFeedOptions, AddRuleOptions, ModifyFeedOptions} from '../../shared/types/api/feed-monitor';
import type {Feed, Item, MatchedTorrents, Rule} from '../../shared/types/Feed'; import type {Feed, Item, MatchedTorrents, Rule} from '../../shared/types/Feed';
import type {FeedReaderOptions} from '../models/FeedReader'; import type {FeedReaderOptions} from '../models/FeedReader';
import FeedReader from '../models/FeedReader';
import {getFeedItemsMatchingRules, getTorrentUrlsFromFeedItem} from '../util/feedUtil';
import BaseService from './BaseService';
class FeedService extends BaseService<Record<string, never>> { class FeedService extends BaseService<Record<string, never>> {
rules: Record<string, Array<Rule>> = {}; rules: Record<string, Array<Rule>> = {};

View File

@@ -1,8 +1,8 @@
import type {TransferHistory, TransferSummary} from '@shared/types/TransferData'; import type {TransferHistory, TransferSummary} from '@shared/types/TransferData';
import BaseService from './BaseService';
import config from '../../config'; import config from '../../config';
import HistoryEra from '../models/HistoryEra'; import HistoryEra from '../models/HistoryEra';
import BaseService from './BaseService';
type HistoryServiceEvents = { type HistoryServiceEvents = {
TRANSFER_SUMMARY_FULL_UPDATE: (payload: {id: number; summary: TransferSummary}) => void; TRANSFER_SUMMARY_FULL_UPDATE: (payload: {id: number; summary: TransferSummary}) => void;

View File

@@ -1,16 +1,15 @@
import type {UserInDatabase} from '@shared/schema/Auth'; import type {UserInDatabase} from '@shared/schema/Auth';
import ClientGatewayService from './clientGatewayService'; import ClientGatewayService from './clientGatewayService';
import DelugeClientGatewayService from './Deluge/clientGatewayService';
import FeedService from './feedService'; import FeedService from './feedService';
import HistoryService from './historyService'; import HistoryService from './historyService';
import NotificationService from './notificationService'; import NotificationService from './notificationService';
import QBittorrentClientGatewayService from './qBittorrent/clientGatewayService';
import RTorrentClientGatewayService from './rTorrent/clientGatewayService';
import SettingService from './settingService'; import SettingService from './settingService';
import TaxonomyService from './taxonomyService'; import TaxonomyService from './taxonomyService';
import TorrentService from './torrentService'; import TorrentService from './torrentService';
import DelugeClientGatewayService from './Deluge/clientGatewayService';
import QBittorrentClientGatewayService from './qBittorrent/clientGatewayService';
import RTorrentClientGatewayService from './rTorrent/clientGatewayService';
import TransmissionClientGatewayService from './Transmission/clientGatewayService'; import TransmissionClientGatewayService from './Transmission/clientGatewayService';
export interface ServiceInstances { export interface ServiceInstances {

View File

@@ -1,6 +1,6 @@
import Datastore from '@seald-io/nedb'; import path from 'node:path';
import path from 'path';
import Datastore from '@seald-io/nedb';
import type { import type {
Notification, Notification,
NotificationCount, NotificationCount,
@@ -8,8 +8,8 @@ import type {
NotificationState, NotificationState,
} from '@shared/types/Notification'; } from '@shared/types/Notification';
import BaseService from './BaseService';
import config from '../../config'; import config from '../../config';
import BaseService from './BaseService';
type NotificationServiceEvents = { type NotificationServiceEvents = {
NOTIFICATION_COUNT_CHANGE: (payload: {id: number; data: NotificationCount}) => void; NOTIFICATION_COUNT_CHANGE: (payload: {id: number; data: NotificationCount}) => void;

View File

@@ -1,7 +1,6 @@
import fs from 'fs'; import fs from 'node:fs';
import {homedir} from 'os'; import {homedir} from 'node:os';
import parseTorrent from 'parse-torrent'; import path from 'node:path';
import path from 'path';
import type { import type {
AddTorrentByFileOptions, AddTorrentByFileOptions,
@@ -9,6 +8,8 @@ import type {
ReannounceTorrentsOptions, ReannounceTorrentsOptions,
SetTorrentsTagsOptions, SetTorrentsTagsOptions,
} from '@shared/schema/api/torrents'; } from '@shared/schema/api/torrents';
import type {QBittorrentConnectionSettings} from '@shared/schema/ClientConnectionSettings';
import type {SetClientSettingsOptions} from '@shared/types/api/client';
import type { import type {
CheckTorrentsOptions, CheckTorrentsOptions,
DeleteTorrentsOptions, DeleteTorrentsOptions,
@@ -22,27 +23,26 @@ import type {
StopTorrentsOptions, StopTorrentsOptions,
} from '@shared/types/api/torrents'; } from '@shared/types/api/torrents';
import type {ClientSettings} from '@shared/types/ClientSettings'; import type {ClientSettings} from '@shared/types/ClientSettings';
import type {QBittorrentConnectionSettings} from '@shared/schema/ClientConnectionSettings';
import type {TorrentContent} from '@shared/types/TorrentContent';
import type {TorrentList, TorrentListSummary, TorrentProperties} from '@shared/types/Torrent'; import type {TorrentList, TorrentListSummary, TorrentProperties} from '@shared/types/Torrent';
import type {TorrentContent} from '@shared/types/TorrentContent';
import type {TorrentPeer} from '@shared/types/TorrentPeer'; import type {TorrentPeer} from '@shared/types/TorrentPeer';
import type {TorrentTracker} from '@shared/types/TorrentTracker'; import type {TorrentTracker} from '@shared/types/TorrentTracker';
import type {TransferSummary} from '@shared/types/TransferData'; import type {TransferSummary} from '@shared/types/TransferData';
import type {SetClientSettingsOptions} from '@shared/types/api/client'; import parseTorrent from 'parse-torrent';
import ClientGatewayService from '../clientGatewayService'; import {TorrentPriority} from '../../../shared/types/Torrent';
import ClientRequestManager from './clientRequestManager'; import {TorrentContentPriority} from '../../../shared/types/TorrentContent';
import {TorrentTrackerType} from '../../../shared/types/TorrentTracker';
import {fetchUrls} from '../../util/fetchUtil'; import {fetchUrls} from '../../util/fetchUtil';
import {getDomainsFromURLs} from '../../util/torrentPropertiesUtil'; import {getDomainsFromURLs} from '../../util/torrentPropertiesUtil';
import ClientGatewayService from '../clientGatewayService';
import ClientRequestManager from './clientRequestManager';
import {QBittorrentTorrentContentPriority, QBittorrentTorrentTrackerStatus} from './types/QBittorrentTorrentsMethods';
import { import {
getTorrentPeerPropertiesFromFlags, getTorrentPeerPropertiesFromFlags,
getTorrentStatusFromState, getTorrentStatusFromState,
getTorrentTrackerTypeFromURL, getTorrentTrackerTypeFromURL,
} from './util/torrentPropertiesUtil'; } from './util/torrentPropertiesUtil';
import {QBittorrentTorrentContentPriority, QBittorrentTorrentTrackerStatus} from './types/QBittorrentTorrentsMethods';
import {TorrentContentPriority} from '../../../shared/types/TorrentContent';
import {TorrentPriority} from '../../../shared/types/Torrent';
import {TorrentTrackerType} from '../../../shared/types/TorrentTracker';
class QBittorrentClientGatewayService extends ClientGatewayService { class QBittorrentClientGatewayService extends ClientGatewayService {
private clientRequestManager = new ClientRequestManager(this.user.client as QBittorrentConnectionSettings); private clientRequestManager = new ClientRequestManager(this.user.client as QBittorrentConnectionSettings);

View File

@@ -1,8 +1,8 @@
import axios from 'axios'; import {URLSearchParams} from 'node:url';
import FormData from 'form-data';
import {URLSearchParams} from 'url';
import type {QBittorrentConnectionSettings} from '@shared/schema/ClientConnectionSettings'; import type {QBittorrentConnectionSettings} from '@shared/schema/ClientConnectionSettings';
import axios from 'axios';
import FormData from 'form-data';
import type {QBittorrentAppPreferences} from './types/QBittorrentAppMethods'; import type {QBittorrentAppPreferences} from './types/QBittorrentAppMethods';
import type { import type {
@@ -11,7 +11,6 @@ import type {
QBittorrentSyncTorrentPeers, QBittorrentSyncTorrentPeers,
QBittorrentTorrentPeers, QBittorrentTorrentPeers,
} from './types/QBittorrentSyncMethods'; } from './types/QBittorrentSyncMethods';
import type {QBittorrentTransferInfo} from './types/QBittorrentTransferMethods';
import type { import type {
QBittorrentTorrentContentPriority, QBittorrentTorrentContentPriority,
QBittorrentTorrentContents, QBittorrentTorrentContents,
@@ -20,6 +19,7 @@ import type {
QBittorrentTorrentsAddOptions, QBittorrentTorrentsAddOptions,
QBittorrentTorrentTrackers, QBittorrentTorrentTrackers,
} from './types/QBittorrentTorrentsMethods'; } from './types/QBittorrentTorrentsMethods';
import type {QBittorrentTransferInfo} from './types/QBittorrentTransferMethods';
const EMPTY_SERVER_STATE = { const EMPTY_SERVER_STATE = {
dl_info_speed: 0, dl_info_speed: 0,

View File

@@ -1,9 +1,8 @@
import {TorrentPeer} from '../../../../shared/types/TorrentPeer';
import {TorrentTrackerType} from '../../../../shared/types/TorrentTracker';
import type {QBittorrentTorrentState} from '../types/QBittorrentTorrentsMethods';
import type {TorrentProperties} from '../../../../shared/types/Torrent'; import type {TorrentProperties} from '../../../../shared/types/Torrent';
import {TorrentPeer} from '../../../../shared/types/TorrentPeer';
import type {TorrentTracker} from '../../../../shared/types/TorrentTracker'; import type {TorrentTracker} from '../../../../shared/types/TorrentTracker';
import {TorrentTrackerType} from '../../../../shared/types/TorrentTracker';
import type {QBittorrentTorrentState} from '../types/QBittorrentTorrentsMethods';
export const getTorrentPeerPropertiesFromFlags = (flags: string): Pick<TorrentPeer, 'isEncrypted' | 'isIncoming'> => { export const getTorrentPeerPropertiesFromFlags = (flags: string): Pick<TorrentPeer, 'isEncrypted' | 'isIncoming'> => {
const flagsArray = flags.split(' '); const flagsArray = flags.split(' ');

View File

@@ -1,7 +1,5 @@
import fs from 'fs'; import fs from 'node:fs';
import {move} from 'fs-extra'; import path from 'node:path';
import path from 'path';
import sanitize from 'sanitize-filename';
import type { import type {
AddTorrentByFileOptions, AddTorrentByFileOptions,
@@ -9,6 +7,8 @@ import type {
ReannounceTorrentsOptions, ReannounceTorrentsOptions,
SetTorrentsTagsOptions, SetTorrentsTagsOptions,
} from '@shared/schema/api/torrents'; } from '@shared/schema/api/torrents';
import type {RTorrentConnectionSettings} from '@shared/schema/ClientConnectionSettings';
import type {SetClientSettingsOptions} from '@shared/types/api/client';
import type { import type {
CheckTorrentsOptions, CheckTorrentsOptions,
DeleteTorrentsOptions, DeleteTorrentsOptions,
@@ -22,28 +22,20 @@ import type {
StopTorrentsOptions, StopTorrentsOptions,
} from '@shared/types/api/torrents'; } from '@shared/types/api/torrents';
import type {ClientSettings} from '@shared/types/ClientSettings'; import type {ClientSettings} from '@shared/types/ClientSettings';
import type {RTorrentConnectionSettings} from '@shared/schema/ClientConnectionSettings';
import type {TorrentContent} from '@shared/types/TorrentContent';
import type {TorrentList, TorrentListSummary, TorrentProperties} from '@shared/types/Torrent'; import type {TorrentList, TorrentListSummary, TorrentProperties} from '@shared/types/Torrent';
import type {TorrentContent} from '@shared/types/TorrentContent';
import type {TorrentPeer} from '@shared/types/TorrentPeer'; import type {TorrentPeer} from '@shared/types/TorrentPeer';
import type {TorrentTracker} from '@shared/types/TorrentTracker'; import type {TorrentTracker} from '@shared/types/TorrentTracker';
import type {TransferSummary} from '@shared/types/TransferData'; import type {TransferSummary} from '@shared/types/TransferData';
import type {SetClientSettingsOptions} from '@shared/types/api/client'; import {move} from 'fs-extra';
import sanitize from 'sanitize-filename';
import * as geoip from '../geoip';
import {isAllowedPath, sanitizePath} from '../../util/fileUtil';
import ClientGatewayService from '../clientGatewayService';
import ClientRequestManager from './clientRequestManager';
import {fetchUrls} from '../../util/fetchUtil'; import {fetchUrls} from '../../util/fetchUtil';
import {getMethodCalls, processMethodCallResponse} from './util/rTorrentMethodCallUtil'; import {isAllowedPath, sanitizePath} from '../../util/fileUtil';
import {getComment, setCompleted, setTrackers} from '../../util/torrentFileUtil'; import {getComment, setCompleted, setTrackers} from '../../util/torrentFileUtil';
import { import ClientGatewayService from '../clientGatewayService';
encodeTags, import * as geoip from '../geoip';
getAddTorrentPropertiesCalls, import ClientRequestManager from './clientRequestManager';
getTorrentETAFromProperties,
getTorrentPercentCompleteFromProperties,
getTorrentStatusFromProperties,
} from './util/torrentPropertiesUtil';
import { import {
clientSettingMethodCallConfigs, clientSettingMethodCallConfigs,
torrentContentMethodCallConfigs, torrentContentMethodCallConfigs,
@@ -52,9 +44,16 @@ import {
torrentTrackerMethodCallConfigs, torrentTrackerMethodCallConfigs,
transferSummaryMethodCallConfigs, transferSummaryMethodCallConfigs,
} from './constants/methodCallConfigs'; } from './constants/methodCallConfigs';
import type {MultiMethodCalls} from './util/rTorrentMethodCallUtil';
import type {RPCError} from './types/RPCError'; import type {RPCError} from './types/RPCError';
import type {MultiMethodCalls} from './util/rTorrentMethodCallUtil';
import {getMethodCalls, processMethodCallResponse} from './util/rTorrentMethodCallUtil';
import {
encodeTags,
getAddTorrentPropertiesCalls,
getTorrentETAFromProperties,
getTorrentPercentCompleteFromProperties,
getTorrentStatusFromProperties,
} from './util/torrentPropertiesUtil';
class RTorrentClientGatewayService extends ClientGatewayService { class RTorrentClientGatewayService extends ClientGatewayService {
clientRequestManager = new ClientRequestManager(this.user.client as RTorrentConnectionSettings); clientRequestManager = new ClientRequestManager(this.user.client as RTorrentConnectionSettings);

View File

@@ -1,13 +1,12 @@
import type {NetConnectOpts} from 'net'; import type {NetConnectOpts} from 'node:net';
import type {RTorrentConnectionSettings} from '@shared/schema/ClientConnectionSettings'; import type {RTorrentConnectionSettings} from '@shared/schema/ClientConnectionSettings';
import {methodCallJSON, methodCallXML} from './util/scgiUtil';
import {sanitizePath} from '../../util/fileUtil';
import type {MultiMethodCalls} from './util/rTorrentMethodCallUtil';
import PQueue from 'p-queue'; import PQueue from 'p-queue';
import {sanitizePath} from '../../util/fileUtil';
import type {MultiMethodCalls} from './util/rTorrentMethodCallUtil';
import {methodCallJSON, methodCallXML} from './util/scgiUtil';
type MethodCallParameters = Array<string | Buffer | MultiMethodCalls>; type MethodCallParameters = Array<string | Buffer | MultiMethodCalls>;
class ClientRequestManager { class ClientRequestManager {

View File

@@ -1,4 +1,4 @@
import {stringTransformer, numberTransformer} from '../../util/rTorrentMethodCallUtil'; import {numberTransformer, stringTransformer} from '../../util/rTorrentMethodCallUtil';
const torrentContentMethodCallConfigs = { const torrentContentMethodCallConfigs = {
path: { path: {

View File

@@ -1,5 +1,5 @@
import {getDomainsFromURLs} from '../../../../util/torrentPropertiesUtil'; import {getDomainsFromURLs} from '../../../../util/torrentPropertiesUtil';
import {stringTransformer, booleanTransformer, numberTransformer} from '../../util/rTorrentMethodCallUtil'; import {booleanTransformer, numberTransformer, stringTransformer} from '../../util/rTorrentMethodCallUtil';
const torrentListMethodCallConfigs = { const torrentListMethodCallConfigs = {
hash: { hash: {

View File

@@ -1,4 +1,4 @@
import {stringTransformer, booleanTransformer, numberTransformer} from '../../util/rTorrentMethodCallUtil'; import {booleanTransformer, numberTransformer, stringTransformer} from '../../util/rTorrentMethodCallUtil';
const torrentPeerMethodCallConfigs = { const torrentPeerMethodCallConfigs = {
address: { address: {

View File

@@ -1,11 +1,10 @@
import net from 'net'; import net from 'node:net';
import deserializer from './XMLRPCDeserializer';
import serializer from './XMLRPCSerializer';
import {RPCError} from '../types/RPCError'; import {RPCError} from '../types/RPCError';
import type {MultiMethodCalls} from './rTorrentMethodCallUtil'; import type {MultiMethodCalls} from './rTorrentMethodCallUtil';
import deserializer from './XMLRPCDeserializer';
import type {XMLRPCValue} from './XMLRPCSerializer'; import type {XMLRPCValue} from './XMLRPCSerializer';
import serializer from './XMLRPCSerializer';
const NULL_CHAR = String.fromCharCode(0); const NULL_CHAR = String.fromCharCode(0);

View File

@@ -1,8 +1,8 @@
import truncateTo from './numberUtils'; import type {TorrentStatus} from '@shared/constants/torrentStatusMap';
import type {AddTorrentByFileOptions} from '@shared/schema/api/torrents'; import type {AddTorrentByFileOptions} from '@shared/schema/api/torrents';
import type {TorrentProperties} from '@shared/types/Torrent'; import type {TorrentProperties} from '@shared/types/Torrent';
import type {TorrentStatus} from '@shared/constants/torrentStatusMap';
import truncateTo from './numberUtils';
export const getTorrentETAFromProperties = ( export const getTorrentETAFromProperties = (
processingTorrentProperties: Record<string, unknown>, processingTorrentProperties: Record<string, unknown>,

View File

@@ -1,6 +1,6 @@
import Datastore from '@seald-io/nedb'; import path from 'node:path';
import path from 'path';
import Datastore from '@seald-io/nedb';
import type {FloodSettings} from '@shared/types/FloodSettings'; import type {FloodSettings} from '@shared/types/FloodSettings';
import config from '../../config'; import config from '../../config';

View File

@@ -1,11 +1,10 @@
import jsonpatch, {Operation} from 'fast-json-patch'; import jsonpatch, {Operation} from 'fast-json-patch';
import BaseService from './BaseService';
import torrentStatusMap from '../../shared/constants/torrentStatusMap';
import type {Taxonomy} from '../../shared/types/Taxonomy';
import type {TorrentStatus} from '../../shared/constants/torrentStatusMap'; import type {TorrentStatus} from '../../shared/constants/torrentStatusMap';
import type {TorrentProperties, TorrentList} from '../../shared/types/Torrent'; import torrentStatusMap from '../../shared/constants/torrentStatusMap';
import type {Taxonomy} from '../../shared/types/Taxonomy';
import type {TorrentList, TorrentProperties} from '../../shared/types/Torrent';
import BaseService from './BaseService';
type TaxonomyServiceEvents = { type TaxonomyServiceEvents = {
TAXONOMY_DIFF_CHANGE: (payload: {id: number; diff: Operation[]}) => void; TAXONOMY_DIFF_CHANGE: (payload: {id: number; diff: Operation[]}) => void;

View File

@@ -1,10 +1,9 @@
import type {TorrentListSummary, TorrentProperties} from '@shared/types/Torrent';
import jsonpatch, {Operation} from 'fast-json-patch'; import jsonpatch, {Operation} from 'fast-json-patch';
import type {TorrentProperties, TorrentListSummary} from '@shared/types/Torrent';
import BaseService from './BaseService';
import config from '../../config'; import config from '../../config';
import {hasTorrentFinished} from '../util/torrentPropertiesUtil'; import {hasTorrentFinished} from '../util/torrentPropertiesUtil';
import BaseService from './BaseService';
type TorrentServiceEvents = { type TorrentServiceEvents = {
FETCH_TORRENT_LIST_SUCCESS: () => void; FETCH_TORRENT_LIST_SUCCESS: () => void;

View File

@@ -1,8 +1,7 @@
import type {AuthToken} from '@shared/schema/Auth';
import {CookieOptions} from 'express'; import {CookieOptions} from 'express';
import jwt from 'jsonwebtoken'; import jwt from 'jsonwebtoken';
import type {AuthToken} from '@shared/schema/Auth';
import config from '../../config'; import config from '../../config';
const EXPIRATION_SECONDS = 60 * 60 * 24 * 7; // one week const EXPIRATION_SECONDS = 60 * 60 * 24 * 7; // one week

View File

@@ -1,4 +1,4 @@
import {spawn, SpawnOptions} from 'child_process'; import {spawn, SpawnOptions} from 'node:child_process';
import type {Disk} from '@shared/types/DiskUsage'; import type {Disk} from '@shared/types/DiskUsage';

View File

@@ -1,9 +1,8 @@
import type {FeedItem} from 'feedsub'; import type {FeedItem} from 'feedsub';
import {cdata as matchCDATA} from '../../shared/util/regEx';
import type {AddTorrentByURLOptions} from '../../shared/schema/api/torrents'; import type {AddTorrentByURLOptions} from '../../shared/schema/api/torrents';
import type {Rule} from '../../shared/types/Feed'; import type {Rule} from '../../shared/types/Feed';
import {cdata as matchCDATA} from '../../shared/util/regEx';
interface PendingDownloadItems interface PendingDownloadItems
extends Required<Pick<AddTorrentByURLOptions, 'urls' | 'destination' | 'tags' | 'start'>> { extends Required<Pick<AddTorrentByURLOptions, 'urls' | 'destination' | 'tags' | 'start'>> {

View File

@@ -1,6 +1,7 @@
import fs from 'node:fs';
import path from 'node:path';
import axios, {AxiosError} from 'axios'; import axios, {AxiosError} from 'axios';
import fs from 'fs';
import path from 'path';
import {isAllowedPath} from './fileUtil'; import {isAllowedPath} from './fileUtil';

View File

@@ -1,7 +1,7 @@
import fs from 'fs'; import fs from 'node:fs';
import {promises as fsp} from 'fs'; import {promises as fsp} from 'node:fs';
import {homedir} from 'os'; import {homedir} from 'node:os';
import path from 'path'; import path from 'node:path';
import config from '../../config'; import config from '../../config';

View File

@@ -1,10 +1,10 @@
import bencode from 'bencode'; import fs from 'node:fs';
import fs from 'fs'; import path from 'node:path';
import path from 'path';
import {LibTorrentFilePriority} from '../../shared/types/TorrentFile'; import bencode from 'bencode';
import type {LibTorrentResume, RTorrentFile, TorrentFile} from '../../shared/types/TorrentFile'; import type {LibTorrentResume, RTorrentFile, TorrentFile} from '../../shared/types/TorrentFile';
import {LibTorrentFilePriority} from '../../shared/types/TorrentFile';
const openAndDecodeTorrent = async (torrentPath: string): Promise<TorrentFile | null> => { const openAndDecodeTorrent = async (torrentPath: string): Promise<TorrentFile | null> => {
let torrentData: TorrentFile | null = null; let torrentData: TorrentFile | null = null;

View File

@@ -1,5 +1,5 @@
const fs = require('fs'); const fs = require('node:fs');
const path = require('path'); const path = require('node:path');
// Make sure any symlinks in the project folder are resolved: // Make sure any symlinks in the project folder are resolved:
// https://github.com/facebookincubator/create-react-app/issues/637 // https://github.com/facebookincubator/create-react-app/issues/637

View File

@@ -1,8 +1,8 @@
import {literal, nativeEnum, number, string, strictObject, union} from 'zod';
import type {infer as zodInfer} from 'zod'; import type {infer as zodInfer} from 'zod';
import {literal, nativeEnum, number, strictObject, string, union} from 'zod';
import {AccessLevel} from './constants/Auth';
import {clientConnectionSettingsSchema} from './ClientConnectionSettings'; import {clientConnectionSettingsSchema} from './ClientConnectionSettings';
import {AccessLevel} from './constants/Auth';
export const authMethodSchema = union([literal('default'), literal('none')]); export const authMethodSchema = union([literal('default'), literal('none')]);

View File

@@ -1,5 +1,5 @@
import {literal, number, string, strictObject, union} from 'zod';
import type {infer as zodInfer} from 'zod'; import type {infer as zodInfer} from 'zod';
import {literal, number, strictObject, string, union} from 'zod';
const delugeConnectionSettingsSchema = strictObject({ const delugeConnectionSettingsSchema = strictObject({
client: literal('Deluge'), client: literal('Deluge'),

View File

@@ -14,8 +14,8 @@
// env variable FLOOD_OPTION_port=80 is equivalent to argument --port 80. Use ',' to split // env variable FLOOD_OPTION_port=80 is equivalent to argument --port 80. Use ',' to split
// for arguments that take multiple inputs such as --allowedpath. // for arguments that take multiple inputs such as --allowedpath.
import {array, boolean, number, strictObject, string} from 'zod';
import type {infer as zodInfer} from 'zod'; import type {infer as zodInfer} from 'zod';
import {array, boolean, number, strictObject, string} from 'zod';
import {authMethodSchema} from './Auth'; import {authMethodSchema} from './Auth';
import {clientConnectionSettingsSchema} from './ClientConnectionSettings'; import {clientConnectionSettingsSchema} from './ClientConnectionSettings';

View File

@@ -1,9 +1,8 @@
import type {infer as zodInfer} from 'zod'; import type {infer as zodInfer} from 'zod';
import {AccessLevel} from '../constants/Auth';
import {credentialsSchema} from '../Auth';
import type {AuthMethod} from '../Auth'; import type {AuthMethod} from '../Auth';
import {credentialsSchema} from '../Auth';
import {AccessLevel} from '../constants/Auth';
// All auth requests are schema validated to ensure security. // All auth requests are schema validated to ensure security.

View File

@@ -1,7 +1,7 @@
import {array, boolean, number, record, strictObject, string} from 'zod';
import {noComma} from '../../util/regEx';
import type {infer as zodInfer} from 'zod'; import type {infer as zodInfer} from 'zod';
import {array, boolean, number, record, strictObject, string} from 'zod';
import {noComma} from '../../util/regEx';
const TAG_NO_COMMA_MESSAGE = { const TAG_NO_COMMA_MESSAGE = {
message: 'Tag must not contain comma', message: 'Tag must not contain comma',

View File

@@ -1,6 +1,6 @@
import type {TorrentStatus} from '../constants/torrentStatusMap';
import type {TorrentContent} from './TorrentContent'; import type {TorrentContent} from './TorrentContent';
import type {TorrentPeer} from './TorrentPeer'; import type {TorrentPeer} from './TorrentPeer';
import type {TorrentStatus} from '../constants/torrentStatusMap';
import type {TorrentTracker} from './TorrentTracker'; import type {TorrentTracker} from './TorrentTracker';
export interface TorrentDetails { export interface TorrentDetails {