From 4b7996f2c68c2d7a0758be011b72628817b37a3f Mon Sep 17 00:00:00 2001 From: Michael Goodnow Date: Tue, 28 Dec 2021 16:08:30 -0500 Subject: [PATCH] Fix some runtime errors --- package-lock.json | 23 +++++++++++++++++++---- package.json | 7 +++++-- src/cmd.ts | 13 ++++++------- src/configuration.ts | 20 ++++++++++---------- src/db.ts | 7 ++++--- src/logger.ts | 36 ++++++++++++++++++------------------ src/preFilter.ts | 2 +- src/searchee.ts | 2 +- src/server.ts | 2 +- src/torrent.ts | 15 +++++++++------ tsconfig.json | 2 +- 11 files changed, 75 insertions(+), 54 deletions(-) diff --git a/package-lock.json b/package-lock.json index 50b6305d..99f78ee0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,7 +13,7 @@ "chalk": "^5.0.0", "commander": "^8.3.0", "form-data": "^4.0.0", - "lodash": "^4.17.21", + "lodash-es": "^4.17.21", "lowdb": "^3.0.0", "node-fetch": "^3.1.0", "parse-torrent": "^9.1.3", @@ -23,7 +23,7 @@ "xmlrpc": "^1.3.2" }, "bin": { - "cross-seed": "dist/src/cmd.js" + "cross-seed": "dist/cmd.js" }, "devDependencies": { "@types/bencode": "^2.0.1", @@ -37,6 +37,9 @@ "np": "*", "prettier": "^2.0.5", "typescript": "^4.6.0-dev.20211227" + }, + "engines": { + "node": ">=14" } }, "node_modules/@babel/code-frame": { @@ -3851,7 +3854,13 @@ "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" }, "node_modules/lodash.isequal": { "version": "4.5.0", @@ -9260,7 +9269,13 @@ "lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" }, "lodash.isequal": { "version": "4.5.0", diff --git a/package.json b/package.json index e648cf00..47b5a05b 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,10 @@ "prepare": "rimraf dist && npm run build && husky install" }, "bin": { - "cross-seed": "dist/src/cmd.js" + "cross-seed": "dist/cmd.js" + }, + "engines": { + "node": ">=14" }, "files": [ "dist/" @@ -26,7 +29,7 @@ "chalk": "^5.0.0", "commander": "^8.3.0", "form-data": "^4.0.0", - "lodash": "^4.17.21", + "lodash-es": "^4.17.21", "lowdb": "^3.0.0", "node-fetch": "^3.1.0", "parse-torrent": "^9.1.3", diff --git a/src/cmd.ts b/src/cmd.ts index 1506a1cf..e3b41f12 100755 --- a/src/cmd.ts +++ b/src/cmd.ts @@ -1,8 +1,7 @@ #!/usr/bin/env node import chalk from "chalk"; import { Option, program } from "commander"; -// @ts-expect-error json imports are experimental -import packageDotJson from "../package.json.js"; +import { inspect } from "util"; import { generateConfig, getFileConfig } from "./configuration.js"; import { Action } from "./constants.js"; import { dropDatabase } from "./db.js"; @@ -11,15 +10,15 @@ import { initializeLogger, Label, logger } from "./logger.js"; import { main } from "./pipeline.js"; import { initializePushNotifier, - pushNotifier, sendTestNotification, } from "./pushNotifier.js"; import { setRuntimeConfig } from "./runtimeConfig.js"; import { serve } from "./server.js"; -import { inspect } from "util"; -import "./signalHandlers"; - +import "./signalHandlers.js"; import { doStartupValidation } from "./startup.js"; +import { createRequire } from "module"; +const require = createRequire(import.meta.url); +const packageDotJson = require("../package.json"); function fallback(...args) { for (const arg of args) { @@ -34,7 +33,7 @@ function processOptions(options) { } async function run() { - const fileConfig = getFileConfig(); + const fileConfig = await getFileConfig(); function createCommandWithSharedOptions(name, description) { return program diff --git a/src/configuration.ts b/src/configuration.ts index 2e921275..c57b930d 100644 --- a/src/configuration.ts +++ b/src/configuration.ts @@ -1,10 +1,11 @@ import chalk from "chalk"; -import fs from "fs"; +import { copyFileSync, existsSync, mkdirSync } from "fs"; import path from "path"; -// @ts-ignore -import packageDotJson from "../package.json.js"; import configTemplate from "./config.template.js"; import { Action, CONFIG_TEMPLATE_URL } from "./constants.js"; +import { createRequire } from "module"; +const require = createRequire(import.meta.url); +const packageDotJson = require("../package.json"); interface FileConfig { action?: Action; @@ -39,8 +40,8 @@ export function appDir(): string { } export function createAppDir(): void { - fs.mkdirSync(path.join(appDir(), "torrent_cache"), { recursive: true }); - fs.mkdirSync(path.join(appDir(), "logs"), { recursive: true }); + mkdirSync(path.join(appDir(), "torrent_cache"), { recursive: true }); + mkdirSync(path.join(appDir(), "logs"), { recursive: true }); } export function generateConfig({ @@ -53,11 +54,11 @@ export function generateConfig({ __dirname, `config.template${docker ? ".docker" : ""}.js` ); - if (!force && fs.existsSync(dest)) { + if (!force && existsSync(dest)) { console.log("Configuration file already exists."); return; } - fs.copyFileSync(templatePath, dest); + copyFileSync(templatePath, dest); console.log("Configuration file created at", chalk.yellow.bold(dest)); } @@ -72,12 +73,11 @@ function printUpdateInstructions(missingKeys) { `); } -export function getFileConfig(): FileConfig { +export async function getFileConfig(): Promise { const configPath = path.join(appDir(), "config.js"); try { - // eslint-disable-next-line @typescript-eslint/no-var-requires - const fileConfig = require(configPath); + const fileConfig = (await import(configPath)).default; const { configVersion = 0 } = fileConfig; if (configVersion < configVersion) { const missingKeys = Object.keys(configTemplate).filter( diff --git a/src/db.ts b/src/db.ts index 58c05c15..897609b8 100644 --- a/src/db.ts +++ b/src/db.ts @@ -1,7 +1,7 @@ import { unlinkSync } from "fs"; import { JSONFileSync, LowSync } from "lowdb"; import path from "path"; -import { sync as rimrafSync } from "rimraf"; +import rimraf from "rimraf"; import { appDir, createAppDir } from "./configuration.js"; import { Decision } from "./constants.js"; @@ -44,20 +44,21 @@ const emptyDatabase = { dbVersion: 3, }; +db.data ??= emptyDatabase; + const dbVersion = db.data.dbVersion; if (!dbVersion || dbVersion < emptyDatabase.dbVersion) { db.data = emptyDatabase; } -db.data ??= emptyDatabase; db.write(); export function dropDatabase(): void { db.data = emptyDatabase; db.write(); unlinkSync(path.join(appDir(), "cache.json")); - rimrafSync(path.join(appDir(), "torrent_cache")); + rimraf.rimrafSync(path.join(appDir(), "torrent_cache")); } export default db; diff --git a/src/logger.ts b/src/logger.ts index 2c0adaff..b0228799 100644 --- a/src/logger.ts +++ b/src/logger.ts @@ -1,5 +1,5 @@ import { join } from "path"; -import { createLogger, format, Logger, transports } from "winston"; +import winston from "winston"; import { appDir, createAppDir } from "./configuration.js"; import { getRuntimeConfig } from "./runtimeConfig.js"; @@ -14,7 +14,7 @@ export enum Label { STARTUP = "startup", } -export let logger: Logger; +export let logger: winston.Logger; const redactionMsg = "[REDACTED]"; @@ -51,40 +51,40 @@ function redactMessage(message) { export function initializeLogger(): void { createAppDir(); - logger = createLogger({ + logger = winston.createLogger({ level: "info", - format: format.combine( - format.timestamp({ + format: winston.format.combine( + winston.format.timestamp({ format: "YYYY-MM-DD HH:mm:ss", }), - format.errors({ stack: true }), - format.splat(), - format.colorize(), - format.printf(({ level, message, label, timestamp }) => { + winston.format.errors({ stack: true }), + winston.format.splat(), + winston.format.colorize(), + winston.format.printf(({ level, message, label, timestamp }) => { return `${timestamp} ${level}: ${ label ? `[${label}] ` : "" }${redactMessage(message)}`; }) ), transports: [ - new transports.File({ + new winston.transports.File({ filename: join(appDir(), "logs", "error.log"), level: "error", }), - new transports.File({ + new winston.transports.File({ filename: join(appDir(), "logs", "info.log"), }), - new transports.File({ + new winston.transports.File({ filename: join(appDir(), "logs", "verbose.log"), level: "silly", }), - new transports.Console({ + new winston.transports.Console({ level: getRuntimeConfig().verbose ? "silly" : "info", - format: format.combine( - format.errors({ stack: true }), - format.splat(), - format.colorize(), - format.printf(({ level, message, label }) => { + format: winston.format.combine( + winston.format.errors({ stack: true }), + winston.format.splat(), + winston.format.colorize(), + winston.format.printf(({ level, message, label }) => { return `${level}: ${ label ? `[${label}] ` : "" }${redactMessage(message)}`; diff --git a/src/preFilter.ts b/src/preFilter.ts index 3a21e9ca..90e0be2c 100644 --- a/src/preFilter.ts +++ b/src/preFilter.ts @@ -1,4 +1,4 @@ -import { uniqBy } from "lodash"; +import { uniqBy } from "lodash-es"; import { Metafile } from "parse-torrent"; import path from "path"; import { EP_REGEX, EXTENSIONS } from "./constants.js"; diff --git a/src/searchee.ts b/src/searchee.ts index 8e5d08c6..3e0531fa 100644 --- a/src/searchee.ts +++ b/src/searchee.ts @@ -1,4 +1,4 @@ -import { sortBy } from "lodash"; +import { sortBy } from "lodash-es"; import { Metafile } from "parse-torrent"; import path, { join } from "path"; import { getRuntimeConfig } from "./runtimeConfig.js"; diff --git a/src/server.ts b/src/server.ts index 818a0228..75a02086 100644 --- a/src/server.ts +++ b/src/server.ts @@ -1,5 +1,5 @@ import http from "http"; -import { pick } from "lodash"; +import { pick } from "lodash-es"; import { parse as qsParse } from "querystring"; import { inspect } from "util"; import { Label, logger } from "./logger.js"; diff --git a/src/torrent.ts b/src/torrent.ts index fa01294a..3f7f5141 100644 --- a/src/torrent.ts +++ b/src/torrent.ts @@ -1,7 +1,7 @@ import fs, { promises as fsPromises } from "fs"; import parseTorrent, { Metafile } from "parse-torrent"; import path from "path"; -import { concat } from "simple-get"; +import simpleGet from "simple-get"; import { inspect } from "util"; import db from "./db.js"; import { CrossSeedError } from "./errors.js"; @@ -26,11 +26,14 @@ export async function parseTorrentFromURL(url: string): Promise { let response; try { response = await new Promise((resolve, reject) => { - concat({ url, followRedirects: false }, (err, res, data) => { - if (err) return reject(err); - res.data = data; - return resolve(res); - }); + simpleGet.concat( + { url, followRedirects: false }, + (err, res, data) => { + if (err) return reject(err); + res.data = data; + return resolve(res); + } + ); }); } catch (e) { logger.error(`failed to access ${url}`); diff --git a/tsconfig.json b/tsconfig.json index 74afa442..3094be46 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -3,7 +3,7 @@ "outDir": "./dist", "allowJs": true, "target": "es2019", - "module": "node12", + "module": "nodenext", "esModuleInterop": true, "resolveJsonModule": true, "sourceMap": true