diff --git a/.eslintrc.cjs b/.eslintrc.cjs index 4582c86..4910a0e 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -13,7 +13,7 @@ module.exports = { './tsconfig.test.json', './src/tsconfig.json', './src/common/tsconfig.json', - './src/assets/ts/tsconfig.json', + './src/assets/ts/tsconfig.eslint.json', './src/assets/views/tsconfig.json', ] }, diff --git a/package.json b/package.json index 3440a47..1daa1ef 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "swaf", - "version": "0.24.0", + "version": "0.24.1", "description": "Structure Web Application Framework.", "repository": "https://eternae.ink/ashpie/swaf", "author": "Alice Gaudon ", diff --git a/src/FileUploadMiddleware.ts b/src/FileUploadMiddleware.ts index 7aa353e..e6159cf 100644 --- a/src/FileUploadMiddleware.ts +++ b/src/FileUploadMiddleware.ts @@ -23,9 +23,9 @@ export default abstract class FileUploadMiddleware extends Middleware { resolve(); }); }); - } catch (e: any) { + } catch (e) { const bag = new ValidationBag(); - const fileError = new FileError(e); + const fileError = new FileError(String(e)); fileError.thingName = this.getDefaultField(); bag.addMessage(fileError); next(bag); diff --git a/src/Utils.ts b/src/Utils.ts index b4920a7..443319b 100644 --- a/src/Utils.ts +++ b/src/Utils.ts @@ -1,4 +1,4 @@ -import {promises as fs} from "fs"; +import fs, {promises as afs} from "fs"; import path from "path"; export async function sleep(ms: number): Promise { @@ -49,10 +49,10 @@ export function getMethods(obj: T): string[] } export async function listFilesRecursively(dir: string): Promise { - const localFiles = await fs.readdir(dir); + const localFiles = await afs.readdir(dir); const files: string[] = []; for (const file of localFiles.map(file => path.join(dir, file))) { - const stat = await fs.stat(file); + const stat = await afs.stat(file); if (stat.isDirectory()) { files.push(...await listFilesRecursively(file)); @@ -65,14 +65,17 @@ export async function listFilesRecursively(dir: string): Promise { export async function doesFileExist(file: string): Promise { - try { - await fs.stat(file); - } catch (err: any) { - if (err?.code === 'ENOENT') { - return false; - } else { - throw err; - } - } - return true; + return await new Promise((resolve, reject) => { + fs.stat(file, err => { + if (err) { + if (err.code === 'ENOENT') { + return resolve(false); + } else { + return reject(err); + } + } else { + return resolve(true); + } + }); + }); } diff --git a/src/assets/ts/featherIcons.ts b/src/assets/ts/featherIcons.ts index 57af6f8..f67604a 100644 --- a/src/assets/ts/featherIcons.ts +++ b/src/assets/ts/featherIcons.ts @@ -2,7 +2,7 @@ import feather from "feather-icons"; let alreadyReplaced = false; -export function replaceIcons(once: boolean = true) { +export function replaceIcons(once: boolean = true): void { if (!once || !alreadyReplaced) { alreadyReplaced = true; feather.replace(); diff --git a/src/assets/ts/tsconfig.eslint.json b/src/assets/ts/tsconfig.eslint.json new file mode 100644 index 0000000..a12ab8a --- /dev/null +++ b/src/assets/ts/tsconfig.eslint.json @@ -0,0 +1,6 @@ +{ + "extends": "./tsconfig.json", + "include": [ + "./**/*" + ] +} diff --git a/src/auth/migrations/DropNameFromUsers.ts b/src/auth/migrations/DropNameFromUsers.ts deleted file mode 100644 index 2c17da7..0000000 --- a/src/auth/migrations/DropNameFromUsers.ts +++ /dev/null @@ -1,14 +0,0 @@ -import Migration from "../../db/Migration.js"; - -/** - * @deprecated - TODO may be remove at next major version >= 0.24, replace with DummyMigration. - */ -export default class DropNameFromUsers extends Migration { - public async install(): Promise { - await this.query('ALTER TABLE users DROP COLUMN IF EXISTS name'); - } - - public async rollback(): Promise { - await this.query('ALTER TABLE users ADD COLUMN name VARCHAR(64)'); - } -} diff --git a/src/auth/migrations/FixUserMainEmailRelation.ts b/src/auth/migrations/FixUserMainEmailRelation.ts deleted file mode 100644 index 6ec6a41..0000000 --- a/src/auth/migrations/FixUserMainEmailRelation.ts +++ /dev/null @@ -1,27 +0,0 @@ -import Migration from "../../db/Migration.js"; - -/** - * @deprecated - TODO may be remove at next major version >= 0.24, replace with DummyMigration. - */ -export default class FixUserMainEmailRelation extends Migration { - public async install(): Promise { - await this.query(`ALTER TABLE users - ADD COLUMN main_email_id INT, - ADD FOREIGN KEY main_user_email_fk (main_email_id) REFERENCES user_emails (id)`); - await this.query(`UPDATE users u LEFT JOIN user_emails ue ON u.id = ue.user_id - SET u.main_email_id=ue.id - WHERE ue.main = true`); - await this.query(`ALTER TABLE user_emails - DROP COLUMN main`); - } - - public async rollback(): Promise { - await this.query(`ALTER TABLE user_emails - ADD COLUMN main BOOLEAN DEFAULT false`); - await this.query(`UPDATE user_emails ue LEFT JOIN users u ON ue.id = u.main_email_id - SET ue.main = true`); - await this.query(`ALTER TABLE users - DROP FOREIGN KEY main_user_email_fk, - DROP COLUMN main_email_id`); - } -} diff --git a/src/components/MailComponent.ts b/src/components/MailComponent.ts index 391924d..4109c06 100644 --- a/src/components/MailComponent.ts +++ b/src/components/MailComponent.ts @@ -48,8 +48,12 @@ export default class MailComponent extends ApplicationComponent { try { await util.promisify(transporter.verify)(); this.transporter = transporter; - } catch (e: any) { - throw new MailError('Connection to mail service unsuccessful.', e); + } catch (e) { + if (e instanceof Error) { + throw new MailError('Connection to mail service unsuccessful.', e); + } else { + throw e; + } } logger.info(`Mail ready to be distributed via ${config.get('mail.host')}:${config.get('mail.port')}`); diff --git a/src/db/MysqlConnectionManager.ts b/src/db/MysqlConnectionManager.ts index 5183493..e5ee183 100644 --- a/src/db/MysqlConnectionManager.ts +++ b/src/db/MysqlConnectionManager.ts @@ -183,9 +183,14 @@ export default class MysqlConnectionManager { try { const result = await query('SELECT id FROM migrations ORDER BY id DESC LIMIT 1'); currentVersion = Number(result.results[0]?.id); - } catch (e: any) { - if (e.code === 'ECONNREFUSED' || e.code !== 'ER_NO_SUCH_TABLE') { - throw new Error('Cannot run migrations: ' + e.code); + } catch (e) { + if (e instanceof Error) { + const mysqlError = e as MysqlError; + if (mysqlError.code !== 'ER_NO_SUCH_TABLE') { + throw new Error('Cannot run migrations: ' + mysqlError.code); + } + } else { + throw e; } } diff --git a/src/db/Validator.ts b/src/db/Validator.ts index 18ea2b8..2a1136e 100644 --- a/src/db/Validator.ts +++ b/src/db/Validator.ts @@ -61,8 +61,12 @@ export default class Validator { if (result instanceof Promise) { result = await result; } - } catch (e: any) { - throw new ServerError(`An error occurred while validating ${thingName} with value "${value}".`, e); + } catch (e) { + if (e instanceof Error) { + throw new ServerError(`An error occurred while validating ${thingName} with value "${value}".`, e); + } else { + throw e; + } } if (result === false && step.throw) { diff --git a/src/migrations/CreateMigrationsTable.ts b/src/migrations/CreateMigrationsTable.ts index 21dadc3..22be569 100644 --- a/src/migrations/CreateMigrationsTable.ts +++ b/src/migrations/CreateMigrationsTable.ts @@ -1,3 +1,5 @@ +import {MysqlError} from "mysql"; + import Migration from "../db/Migration.js"; import {query} from "../db/MysqlConnectionManager.js"; @@ -8,8 +10,8 @@ export default class CreateMigrationsTable extends Migration { public async shouldRun(currentVersion: number): Promise { try { await query('SELECT 1 FROM migrations LIMIT 1'); - } catch (e: any) { - if (e.code !== 'ER_NO_SUCH_TABLE') { + } catch (e) { + if (!(e instanceof Error) || (e as MysqlError).code !== 'ER_NO_SUCH_TABLE') { return false; } }