diff --git a/.eslintrc.js b/.eslintrc.cjs similarity index 91% rename from .eslintrc.js rename to .eslintrc.cjs index 2e93851..58a4de6 100644 --- a/.eslintrc.js +++ b/.eslintrc.cjs @@ -3,13 +3,16 @@ module.exports = { parser: '@typescript-eslint/parser', plugins: [ 'svelte3', - '@typescript-eslint' + '@typescript-eslint', + 'import', + 'simple-import-sort', ], parserOptions: { tsconfigRootDir: __dirname, project: [ './tsconfig.json', - './tsconfig.test.json' + './tsconfig.test.json', + './tsconfig.frontend.json', ] }, extends: [ @@ -40,6 +43,13 @@ module.exports = { 'no-extra-semi': 'error', 'eol-last': 'error', 'comma-dangle': 'off', + 'simple-import-sort/imports': 'error', + 'no-extra-parens': 'off', + 'no-nested-ternary': 'error', + 'no-return-await': 'off', + 'no-useless-return': 'error', + 'no-useless-constructor': 'off', + 'import/extensions': ['error', 'ignorePackages'], '@typescript-eslint/comma-dangle': [ 'error', { @@ -53,11 +63,9 @@ module.exports = { tuples: 'always-multiline' } ], - 'no-extra-parens': 'off', '@typescript-eslint/no-extra-parens': [ 'error' ], - 'no-nested-ternary': 'error', '@typescript-eslint/no-inferrable-types': 'off', '@typescript-eslint/explicit-module-boundary-types': 'error', '@typescript-eslint/no-unnecessary-condition': 'error', @@ -68,12 +76,9 @@ module.exports = { } ], '@typescript-eslint/no-non-null-assertion': 'error', - 'no-useless-return': 'error', - 'no-useless-constructor': 'off', '@typescript-eslint/no-useless-constructor': [ 'error' ], - 'no-return-await': 'off', '@typescript-eslint/return-await': [ 'error', 'always' @@ -84,7 +89,7 @@ module.exports = { accessibility: 'explicit' } ], - '@typescript-eslint/no-floating-promises': 'error' + '@typescript-eslint/no-floating-promises': 'error', }, ignorePatterns: [ '.eslintrc.js', diff --git a/.gitignore b/.gitignore index fb8a683..aa0623f 100644 --- a/.gitignore +++ b/.gitignore @@ -5,5 +5,4 @@ dist public yarn-error.log -src/package.json config/local.* diff --git a/package.json b/package.json index 73eb52f..060a199 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,7 @@ "access": "public" }, "main": "dist/main.js", + "type": "module", "types": "dist/index.d.ts", "scripts": { "test": "jest --verbose --runInBand", @@ -57,6 +58,7 @@ "eslint": "^7.9.0", "eslint-plugin-import": "^2.22.1", "eslint-plugin-node": "^11.1.0", + "eslint-plugin-simple-import-sort": "^7.0.0", "eslint-plugin-svelte3": "^3.1.2", "jest": "^26.1.0", "maildev": "^1.1.0", diff --git a/scripts/clean.js b/scripts/clean.js index 278cc11..6504ce6 100644 --- a/scripts/clean.js +++ b/scripts/clean.js @@ -1,4 +1,4 @@ -const fs = require('fs'); +import fs from "fs"; [ 'build', diff --git a/scripts/dist.js b/scripts/dist.js index c586008..ffda96f 100644 --- a/scripts/dist.js +++ b/scripts/dist.js @@ -1,5 +1,5 @@ -const fs = require('fs'); -const path = require('path'); +import fs from "fs"; +import path from "path"; function copyRecursively(file, destination) { const target = path.join(destination, path.basename(file)); diff --git a/scripts/prepare-sources.js b/scripts/prepare-sources.js index 5143276..d2ef3f8 100644 --- a/scripts/prepare-sources.js +++ b/scripts/prepare-sources.js @@ -1,7 +1,4 @@ -const fs = require('fs'); -const path = require('path'); - -fs.copyFileSync('package.json', path.join('src', 'package.json')); +import fs from "fs"; // These folders must exist for nodemon not to loop indefinitely. [ diff --git a/src/Application.ts b/src/Application.ts index ed55dc1..933d13e 100644 --- a/src/Application.ts +++ b/src/Application.ts @@ -1,24 +1,26 @@ -import express, {NextFunction, Request, Response, Router} from 'express'; -import {BadRequestError, HttpError, NotFoundHttpError, ServerError, ServiceUnavailableHttpError} from "./HttpError"; -import {lib} from "nunjucks"; -import WebSocketListener from "./WebSocketListener"; -import ApplicationComponent from "./ApplicationComponent"; -import Controller from "./Controller"; -import MysqlConnectionManager from "./db/MysqlConnectionManager"; -import Migration, {MigrationType} from "./db/Migration"; -import {Type} from "./Utils"; -import LogRequestsComponent from "./components/LogRequestsComponent"; -import {ValidationBag, ValidationError} from "./db/Validator"; import config from "config"; +import express, {NextFunction, Request, Response, Router} from 'express'; import * as fs from "fs"; -import SecurityError from "./SecurityError"; +import nunjucks from "nunjucks"; import * as path from "path"; -import CacheProvider from "./CacheProvider"; -import RedisComponent from "./components/RedisComponent"; -import Extendable from "./Extendable"; -import {logger, loggingContextMiddleware} from "./Logger"; -import FrontendToolsComponent from "./components/FrontendToolsComponent"; -import TemplateError = lib.TemplateError; +import url from "url"; + +import ApplicationComponent from "./ApplicationComponent.js"; +import CacheProvider from "./CacheProvider.js"; +import FrontendToolsComponent from "./components/FrontendToolsComponent.js"; +import LogRequestsComponent from "./components/LogRequestsComponent.js"; +import RedisComponent from "./components/RedisComponent.js"; +import Controller from "./Controller.js"; +import Migration, {MigrationType} from "./db/Migration.js"; +import MysqlConnectionManager from "./db/MysqlConnectionManager.js"; +import {ValidationBag, ValidationError} from "./db/Validator.js"; +import Extendable from "./Extendable.js"; +import {BadRequestError, HttpError, NotFoundHttpError, ServerError, ServiceUnavailableHttpError} from "./HttpError.js"; +import {logger, loggingContextMiddleware} from "./Logger.js"; +import SecurityError from "./SecurityError.js"; +import {Type} from "./Utils.js"; +import WebSocketListener from "./WebSocketListener.js"; +import TemplateError = nunjucks.lib.TemplateError; export default abstract class Application implements Extendable> { private readonly version: string; @@ -68,8 +70,8 @@ export default abstract class Application implements Extendable { as(type: Type): C; diff --git a/src/FileUploadMiddleware.ts b/src/FileUploadMiddleware.ts index 3d0f920..7e0ec5c 100644 --- a/src/FileUploadMiddleware.ts +++ b/src/FileUploadMiddleware.ts @@ -1,7 +1,8 @@ -import Formidable from "formidable"; -import Middleware from "./Middleware"; import {NextFunction, Request, Response} from "express"; -import {FileError, ValidationBag} from "./db/Validator"; +import Formidable from "formidable"; + +import {FileError, ValidationBag} from "./db/Validator.js"; +import Middleware from "./Middleware.js"; export default abstract class FileUploadMiddleware extends Middleware { protected abstract makeForm(): Formidable; diff --git a/src/HttpError.ts b/src/HttpError.ts index 7071665..1e9de0c 100644 --- a/src/HttpError.ts +++ b/src/HttpError.ts @@ -1,4 +1,4 @@ -import {WrappingError} from "./Utils"; +import {WrappingError} from "./Utils.js"; export abstract class HttpError extends WrappingError { public readonly instructions: string; diff --git a/src/Logger.ts b/src/Logger.ts index 6384fdd..e984530 100644 --- a/src/Logger.ts +++ b/src/Logger.ts @@ -1,7 +1,7 @@ -import {Logger as TsLogger} from "tslog"; import {AsyncLocalStorage} from "async_hooks"; import {RequestHandler} from "express"; import {nanoid} from "nanoid"; +import {Logger as TsLogger} from "tslog"; const requestIdStorage: AsyncLocalStorage = new AsyncLocalStorage(); diff --git a/src/Mails.ts b/src/Mails.ts index 0ab14a8..8cd0cd5 100644 --- a/src/Mails.ts +++ b/src/Mails.ts @@ -1,5 +1,6 @@ import config from "config"; -import MailTemplate from "./mail/MailTemplate"; + +import MailTemplate from "./mail/MailTemplate.js"; export const MAGIC_LINK_MAIL = new MailTemplate( 'magic_link', diff --git a/src/Middleware.ts b/src/Middleware.ts index a46cf3a..dd3d78c 100644 --- a/src/Middleware.ts +++ b/src/Middleware.ts @@ -1,7 +1,8 @@ import {RequestHandler} from "express"; import {NextFunction, Request, Response} from "express-serve-static-core"; -import Application from "./Application"; -import {Type} from "./Utils"; + +import Application from "./Application.js"; +import {Type} from "./Utils.js"; export default abstract class Middleware { public constructor( diff --git a/src/Pagination.ts b/src/Pagination.ts index 020a19e..e91368d 100644 --- a/src/Pagination.ts +++ b/src/Pagination.ts @@ -1,4 +1,4 @@ -import {WrappingError} from "./Utils"; +import {WrappingError} from "./Utils.js"; export default class Pagination { public readonly page: number; diff --git a/src/TestApp.ts b/src/TestApp.ts index b0f15ac..402bf6b 100644 --- a/src/TestApp.ts +++ b/src/TestApp.ts @@ -1,41 +1,41 @@ -import Application from "./Application"; -import Migration, {MigrationType} from "./db/Migration"; -import ExpressAppComponent from "./components/ExpressAppComponent"; -import RedisComponent from "./components/RedisComponent"; -import MysqlComponent from "./components/MysqlComponent"; -import LogRequestsComponent from "./components/LogRequestsComponent"; -import MailComponent from "./components/MailComponent"; -import SessionComponent from "./components/SessionComponent"; -import AuthComponent from "./auth/AuthComponent"; -import FormHelperComponent from "./components/FormHelperComponent"; -import ServeStaticDirectoryComponent from "./components/ServeStaticDirectoryComponent"; import {Express} from "express"; -import MagicLinkAuthMethod from "./auth/magic_link/MagicLinkAuthMethod"; -import PasswordAuthMethod from "./auth/password/PasswordAuthMethod"; -import {MAGIC_LINK_MAIL} from "./Mails"; -import CreateMigrationsTable from "./migrations/CreateMigrationsTable"; -import CreateUsersAndUserEmailsTableMigration from "./auth/migrations/CreateUsersAndUserEmailsTableMigration"; -import CreateMagicLinksTableMigration from "./auth/magic_link/CreateMagicLinksTableMigration"; -import AuthController from "./auth/AuthController"; -import MagicLinkWebSocketListener from "./auth/magic_link/MagicLinkWebSocketListener"; -import MagicLinkController from "./auth/magic_link/MagicLinkController"; -import AddPasswordToUsersMigration from "./auth/password/AddPasswordToUsersMigration"; -import AddNameToUsersMigration from "./auth/migrations/AddNameToUsersMigration"; -import CsrfProtectionComponent from "./components/CsrfProtectionComponent"; -import MailController from "./mail/MailController"; -import WebSocketServerComponent from "./components/WebSocketServerComponent"; -import Controller from "./Controller"; -import AccountController from "./auth/AccountController"; -import MakeMagicLinksSessionNotUniqueMigration from "./auth/magic_link/MakeMagicLinksSessionNotUniqueMigration"; -import AddUsedToMagicLinksMigration from "./auth/magic_link/AddUsedToMagicLinksMigration"; -import PreviousUrlComponent from "./components/PreviousUrlComponent"; -import AddNameChangedAtToUsersMigration from "./auth/migrations/AddNameChangedAtToUsersMigration"; -import BackendController from "./helpers/BackendController"; -import FrontendToolsComponent from "./components/FrontendToolsComponent"; -import SvelteViewEngine from "./frontend/SvelteViewEngine"; -import MailViewEngine from "./frontend/MailViewEngine"; -import NunjucksViewEngine from "./frontend/NunjucksViewEngine"; -import packageJson = require('./package.json'); + +import Application from "./Application.js"; +import AccountController from "./auth/AccountController.js"; +import AuthComponent from "./auth/AuthComponent.js"; +import AuthController from "./auth/AuthController.js"; +import AddUsedToMagicLinksMigration from "./auth/magic_link/AddUsedToMagicLinksMigration.js"; +import CreateMagicLinksTableMigration from "./auth/magic_link/CreateMagicLinksTableMigration.js"; +import MagicLinkAuthMethod from "./auth/magic_link/MagicLinkAuthMethod.js"; +import MagicLinkController from "./auth/magic_link/MagicLinkController.js"; +import MagicLinkWebSocketListener from "./auth/magic_link/MagicLinkWebSocketListener.js"; +import MakeMagicLinksSessionNotUniqueMigration from "./auth/magic_link/MakeMagicLinksSessionNotUniqueMigration.js"; +import AddNameChangedAtToUsersMigration from "./auth/migrations/AddNameChangedAtToUsersMigration.js"; +import AddNameToUsersMigration from "./auth/migrations/AddNameToUsersMigration.js"; +import CreateUsersAndUserEmailsTableMigration from "./auth/migrations/CreateUsersAndUserEmailsTableMigration.js"; +import AddPasswordToUsersMigration from "./auth/password/AddPasswordToUsersMigration.js"; +import PasswordAuthMethod from "./auth/password/PasswordAuthMethod.js"; +import CsrfProtectionComponent from "./components/CsrfProtectionComponent.js"; +import ExpressAppComponent from "./components/ExpressAppComponent.js"; +import FormHelperComponent from "./components/FormHelperComponent.js"; +import FrontendToolsComponent from "./components/FrontendToolsComponent.js"; +import LogRequestsComponent from "./components/LogRequestsComponent.js"; +import MailComponent from "./components/MailComponent.js"; +import MysqlComponent from "./components/MysqlComponent.js"; +import PreviousUrlComponent from "./components/PreviousUrlComponent.js"; +import RedisComponent from "./components/RedisComponent.js"; +import ServeStaticDirectoryComponent from "./components/ServeStaticDirectoryComponent.js"; +import SessionComponent from "./components/SessionComponent.js"; +import WebSocketServerComponent from "./components/WebSocketServerComponent.js"; +import Controller from "./Controller.js"; +import Migration, {MigrationType} from "./db/Migration.js"; +import MailViewEngine from "./frontend/MailViewEngine.js"; +import NunjucksViewEngine from "./frontend/NunjucksViewEngine.js"; +import SvelteViewEngine from "./frontend/SvelteViewEngine.js"; +import BackendController from "./helpers/BackendController.js"; +import MailController from "./mail/MailController.js"; +import {MAGIC_LINK_MAIL} from "./Mails.js"; +import CreateMigrationsTable from "./migrations/CreateMigrationsTable.js"; export const MIGRATIONS = [ CreateMigrationsTable, @@ -52,8 +52,8 @@ export default class TestApp extends Application { private readonly addr: string; private readonly port: number; - public constructor(addr: string, port: number, ignoreCommandLine: boolean = false) { - super(packageJson.version, ignoreCommandLine); + public constructor(version: string, addr: string, port: number, ignoreCommandLine: boolean = false) { + super(version, ignoreCommandLine); this.addr = addr; this.port = port; } diff --git a/src/Throttler.ts b/src/Throttler.ts index 863c467..a934ece 100644 --- a/src/Throttler.ts +++ b/src/Throttler.ts @@ -1,5 +1,5 @@ -import {TooManyRequestsHttpError} from "./HttpError"; -import {logger} from "./Logger"; +import {TooManyRequestsHttpError} from "./HttpError.js"; +import {logger} from "./Logger.js"; export default class Throttler { private static readonly throttles: Record = {}; diff --git a/src/WebSocketListener.ts b/src/WebSocketListener.ts index b3702d8..d934774 100644 --- a/src/WebSocketListener.ts +++ b/src/WebSocketListener.ts @@ -1,7 +1,8 @@ -import WebSocket from "ws"; -import {IncomingMessage} from "http"; -import Application from "./Application"; import {Session} from "express-session"; +import {IncomingMessage} from "http"; +import WebSocket from "ws"; + +import Application from "./Application.js"; export default abstract class WebSocketListener { private app!: T; diff --git a/src/auth/AccountController.ts b/src/auth/AccountController.ts index a29a81a..6b5ae4b 100644 --- a/src/auth/AccountController.ts +++ b/src/auth/AccountController.ts @@ -1,19 +1,20 @@ -import Controller from "../Controller"; -import {RequireAuthMiddleware} from "./AuthComponent"; -import {Request, Response} from "express"; -import {BadRequestError, ForbiddenHttpError, NotFoundHttpError} from "../HttpError"; import config from "config"; -import Validator, {EMAIL_REGEX, InvalidFormatValidationError} from "../db/Validator"; -import UserPasswordComponent from "./password/UserPasswordComponent"; -import User from "./models/User"; -import ModelFactory from "../db/ModelFactory"; -import UserEmail from "./models/UserEmail"; -import MagicLinkController from "./magic_link/MagicLinkController"; -import {ADD_EMAIL_MAIL_TEMPLATE, REMOVE_PASSWORD_MAIL_TEMPLATE} from "../Mails"; -import AuthMagicLinkActionType from "./magic_link/AuthMagicLinkActionType"; -import UserNameComponent from "./models/UserNameComponent"; -import Time from "../Time"; -import MailTemplate from "../mail/MailTemplate"; +import {Request, Response} from "express"; + +import Controller from "../Controller.js"; +import ModelFactory from "../db/ModelFactory.js"; +import Validator, {EMAIL_REGEX, InvalidFormatValidationError} from "../db/Validator.js"; +import {BadRequestError, ForbiddenHttpError, NotFoundHttpError} from "../HttpError.js"; +import MailTemplate from "../mail/MailTemplate.js"; +import {ADD_EMAIL_MAIL_TEMPLATE, REMOVE_PASSWORD_MAIL_TEMPLATE} from "../Mails.js"; +import Time from "../Time.js"; +import {RequireAuthMiddleware} from "./AuthComponent.js"; +import AuthMagicLinkActionType from "./magic_link/AuthMagicLinkActionType.js"; +import MagicLinkController from "./magic_link/MagicLinkController.js"; +import User from "./models/User.js"; +import UserEmail from "./models/UserEmail.js"; +import UserNameComponent from "./models/UserNameComponent.js"; +import UserPasswordComponent from "./password/UserPasswordComponent.js"; export default class AccountController extends Controller { diff --git a/src/auth/AuthComponent.ts b/src/auth/AuthComponent.ts index 552959b..312c7cf 100644 --- a/src/auth/AuthComponent.ts +++ b/src/auth/AuthComponent.ts @@ -1,13 +1,14 @@ -import ApplicationComponent from "../ApplicationComponent"; import {NextFunction, Request, Response} from "express"; -import AuthGuard from "./AuthGuard"; -import Controller from "../Controller"; -import {ForbiddenHttpError} from "../HttpError"; -import Middleware from "../Middleware"; -import User from "./models/User"; -import Application from "../Application"; -import AuthMethod from "./AuthMethod"; -import AuthProof from "./AuthProof"; + +import Application from "../Application.js"; +import ApplicationComponent from "../ApplicationComponent.js"; +import Controller from "../Controller.js"; +import {ForbiddenHttpError} from "../HttpError.js"; +import Middleware from "../Middleware.js"; +import AuthGuard from "./AuthGuard.js"; +import AuthMethod from "./AuthMethod.js"; +import AuthProof from "./AuthProof.js"; +import User from "./models/User.js"; export default class AuthComponent extends ApplicationComponent { private readonly authGuard: AuthGuard; diff --git a/src/auth/AuthController.ts b/src/auth/AuthController.ts index 81fd255..ef77732 100644 --- a/src/auth/AuthController.ts +++ b/src/auth/AuthController.ts @@ -1,14 +1,15 @@ -import Controller from "../Controller"; import {NextFunction, Request, Response} from "express"; -import AuthComponent, {AuthMiddleware, RequireAuthMiddleware, RequireGuestMiddleware} from "./AuthComponent"; -import {BadRequestError} from "../HttpError"; -import ModelFactory from "../db/ModelFactory"; -import User from "./models/User"; -import UserPasswordComponent from "./password/UserPasswordComponent"; -import UserNameComponent from "./models/UserNameComponent"; -import {UnknownRelationValidationError} from "../db/Validator"; -import AuthMethod from "./AuthMethod"; -import AuthProof from "./AuthProof"; + +import Controller from "../Controller.js"; +import ModelFactory from "../db/ModelFactory.js"; +import {UnknownRelationValidationError} from "../db/Validator.js"; +import {BadRequestError} from "../HttpError.js"; +import AuthComponent, {AuthMiddleware, RequireAuthMiddleware, RequireGuestMiddleware} from "./AuthComponent.js"; +import AuthMethod from "./AuthMethod.js"; +import AuthProof from "./AuthProof.js"; +import User from "./models/User.js"; +import UserNameComponent from "./models/UserNameComponent.js"; +import UserPasswordComponent from "./password/UserPasswordComponent.js"; export default class AuthController extends Controller { public getRoutesPrefix(): string { diff --git a/src/auth/AuthGuard.ts b/src/auth/AuthGuard.ts index d0e2e94..5d52752 100644 --- a/src/auth/AuthGuard.ts +++ b/src/auth/AuthGuard.ts @@ -1,17 +1,18 @@ -import AuthProof from "./AuthProof"; -import MysqlConnectionManager from "../db/MysqlConnectionManager"; -import User from "./models/User"; -import {Connection} from "mysql"; -import {Request, Response} from "express"; -import {PENDING_ACCOUNT_REVIEW_MAIL_TEMPLATE} from "../Mails"; -import Mail from "../mail/Mail"; -import Controller from "../Controller"; import config from "config"; -import Application from "../Application"; -import AuthMethod from "./AuthMethod"; +import {Request, Response} from "express"; import {Session, SessionData} from "express-session"; -import UserNameComponent from "./models/UserNameComponent"; -import MailComponent from "../components/MailComponent"; +import {Connection} from "mysql"; + +import Application from "../Application.js"; +import MailComponent from "../components/MailComponent.js"; +import Controller from "../Controller.js"; +import MysqlConnectionManager from "../db/MysqlConnectionManager.js"; +import Mail from "../mail/Mail.js"; +import {PENDING_ACCOUNT_REVIEW_MAIL_TEMPLATE} from "../Mails.js"; +import AuthMethod from "./AuthMethod.js"; +import AuthProof from "./AuthProof.js"; +import User from "./models/User.js"; +import UserNameComponent from "./models/UserNameComponent.js"; export default class AuthGuard { private readonly authMethods: AuthMethod>[]; diff --git a/src/auth/AuthMethod.ts b/src/auth/AuthMethod.ts index fa0179a..1be9b52 100644 --- a/src/auth/AuthMethod.ts +++ b/src/auth/AuthMethod.ts @@ -1,8 +1,9 @@ -import User from "./models/User"; -import AuthProof from "./AuthProof"; import {Request, Response} from "express"; import {Session} from "express-session"; +import AuthProof from "./AuthProof.js"; +import User from "./models/User.js"; + export default interface AuthMethod

> { /** diff --git a/src/auth/magic_link/AddUsedToMagicLinksMigration.ts b/src/auth/magic_link/AddUsedToMagicLinksMigration.ts index 2a0d141..2754c5f 100644 --- a/src/auth/magic_link/AddUsedToMagicLinksMigration.ts +++ b/src/auth/magic_link/AddUsedToMagicLinksMigration.ts @@ -1,4 +1,4 @@ -import Migration from "../../db/Migration"; +import Migration from "../../db/Migration.js"; export default class AddUsedToMagicLinksMigration extends Migration { public async install(): Promise { diff --git a/src/auth/magic_link/CreateMagicLinksTableMigration.ts b/src/auth/magic_link/CreateMagicLinksTableMigration.ts index 680bf5a..50abb06 100644 --- a/src/auth/magic_link/CreateMagicLinksTableMigration.ts +++ b/src/auth/magic_link/CreateMagicLinksTableMigration.ts @@ -1,6 +1,6 @@ -import Migration from "../../db/Migration"; -import ModelFactory from "../../db/ModelFactory"; -import MagicLink from "../models/MagicLink"; +import Migration from "../../db/Migration.js"; +import ModelFactory from "../../db/ModelFactory.js"; +import MagicLink from "../models/MagicLink.js"; export default class CreateMagicLinksTableMigration extends Migration { public async install(): Promise { diff --git a/src/auth/magic_link/MagicLinkAuthMethod.ts b/src/auth/magic_link/MagicLinkAuthMethod.ts index 99a11ed..ffa7fd8 100644 --- a/src/auth/magic_link/MagicLinkAuthMethod.ts +++ b/src/auth/magic_link/MagicLinkAuthMethod.ts @@ -1,19 +1,20 @@ -import AuthMethod from "../AuthMethod"; import {Request, Response} from "express"; -import User from "../models/User"; -import UserEmail from "../models/UserEmail"; -import MagicLink from "../models/MagicLink"; -import {WhereTest} from "../../db/ModelQuery"; -import Controller from "../../Controller"; -import geoip from "geoip-lite"; -import MagicLinkController from "./MagicLinkController"; -import Application from "../../Application"; -import AuthMagicLinkActionType from "./AuthMagicLinkActionType"; -import Validator, {EMAIL_REGEX} from "../../db/Validator"; -import ModelFactory from "../../db/ModelFactory"; -import UserNameComponent from "../models/UserNameComponent"; import {Session} from "express-session"; -import MailTemplate from "../../mail/MailTemplate"; +import geoip from "geoip-lite"; + +import Application from "../../Application.js"; +import Controller from "../../Controller.js"; +import ModelFactory from "../../db/ModelFactory.js"; +import {WhereTest} from "../../db/ModelQuery.js"; +import Validator, {EMAIL_REGEX} from "../../db/Validator.js"; +import MailTemplate from "../../mail/MailTemplate.js"; +import AuthMethod from "../AuthMethod.js"; +import MagicLink from "../models/MagicLink.js"; +import User from "../models/User.js"; +import UserEmail from "../models/UserEmail.js"; +import UserNameComponent from "../models/UserNameComponent.js"; +import AuthMagicLinkActionType from "./AuthMagicLinkActionType.js"; +import MagicLinkController from "./MagicLinkController.js"; export default class MagicLinkAuthMethod implements AuthMethod { public constructor( diff --git a/src/auth/magic_link/MagicLinkController.ts b/src/auth/magic_link/MagicLinkController.ts index 3747203..c6d7e9e 100644 --- a/src/auth/magic_link/MagicLinkController.ts +++ b/src/auth/magic_link/MagicLinkController.ts @@ -1,25 +1,26 @@ -import Controller from "../../Controller"; -import {Request, Response} from "express"; -import MagicLinkWebSocketListener from "./MagicLinkWebSocketListener"; -import {BadRequestError, NotFoundHttpError} from "../../HttpError"; -import Throttler from "../../Throttler"; -import Mail from "../../mail/Mail"; -import MagicLink from "../models/MagicLink"; import config from "config"; -import Application from "../../Application"; +import {Request, Response} from "express"; import {ParsedUrlQueryInput} from "querystring"; -import User from "../models/User"; -import AuthComponent, {AuthMiddleware} from "../AuthComponent"; -import {AuthError, PendingApprovalAuthError, RegisterCallback} from "../AuthGuard"; -import UserEmail from "../models/UserEmail"; -import AuthMagicLinkActionType from "./AuthMagicLinkActionType"; -import {QueryVariable} from "../../db/MysqlConnectionManager"; -import UserNameComponent from "../models/UserNameComponent"; -import MagicLinkUserNameComponent from "../models/MagicLinkUserNameComponent"; -import {logger} from "../../Logger"; -import UserPasswordComponent from "../password/UserPasswordComponent"; -import MailTemplate from "../../mail/MailTemplate"; -import MailComponent from "../../components/MailComponent"; + +import Application from "../../Application.js"; +import MailComponent from "../../components/MailComponent.js"; +import Controller from "../../Controller.js"; +import {QueryVariable} from "../../db/MysqlConnectionManager.js"; +import {BadRequestError, NotFoundHttpError} from "../../HttpError.js"; +import {logger} from "../../Logger.js"; +import Mail from "../../mail/Mail.js"; +import MailTemplate from "../../mail/MailTemplate.js"; +import Throttler from "../../Throttler.js"; +import AuthComponent, {AuthMiddleware} from "../AuthComponent.js"; +import {AuthError, PendingApprovalAuthError, RegisterCallback} from "../AuthGuard.js"; +import MagicLink from "../models/MagicLink.js"; +import MagicLinkUserNameComponent from "../models/MagicLinkUserNameComponent.js"; +import User from "../models/User.js"; +import UserEmail from "../models/UserEmail.js"; +import UserNameComponent from "../models/UserNameComponent.js"; +import UserPasswordComponent from "../password/UserPasswordComponent.js"; +import AuthMagicLinkActionType from "./AuthMagicLinkActionType.js"; +import MagicLinkWebSocketListener from "./MagicLinkWebSocketListener.js"; export default class MagicLinkController extends Controller { public static async sendMagicLink( diff --git a/src/auth/magic_link/MagicLinkWebSocketListener.ts b/src/auth/magic_link/MagicLinkWebSocketListener.ts index 78746f0..5eced34 100644 --- a/src/auth/magic_link/MagicLinkWebSocketListener.ts +++ b/src/auth/magic_link/MagicLinkWebSocketListener.ts @@ -1,9 +1,10 @@ -import WebSocket from "ws"; -import {IncomingMessage} from "http"; -import WebSocketListener from "../../WebSocketListener"; -import MagicLink from "../models/MagicLink"; -import Application from "../../Application"; import {Session} from "express-session"; +import {IncomingMessage} from "http"; +import WebSocket from "ws"; + +import Application from "../../Application.js"; +import WebSocketListener from "../../WebSocketListener.js"; +import MagicLink from "../models/MagicLink.js"; export default class MagicLinkWebSocketListener extends WebSocketListener { private readonly connections: { [p: string]: (() => void)[] | undefined } = {}; diff --git a/src/auth/magic_link/MakeMagicLinksSessionNotUniqueMigration.ts b/src/auth/magic_link/MakeMagicLinksSessionNotUniqueMigration.ts index ba6607e..45426fe 100644 --- a/src/auth/magic_link/MakeMagicLinksSessionNotUniqueMigration.ts +++ b/src/auth/magic_link/MakeMagicLinksSessionNotUniqueMigration.ts @@ -1,4 +1,4 @@ -import Migration from "../../db/Migration"; +import Migration from "../../db/Migration.js"; export default class MakeMagicLinksSessionNotUniqueMigration extends Migration { public async install(): Promise { diff --git a/src/auth/migrations/AddApprovedFieldToUsersTableMigration.ts b/src/auth/migrations/AddApprovedFieldToUsersTableMigration.ts index 65d199b..c4051b2 100644 --- a/src/auth/migrations/AddApprovedFieldToUsersTableMigration.ts +++ b/src/auth/migrations/AddApprovedFieldToUsersTableMigration.ts @@ -1,7 +1,7 @@ -import Migration from "../../db/Migration"; -import ModelFactory from "../../db/ModelFactory"; -import User from "../models/User"; -import UserApprovedComponent from "../models/UserApprovedComponent"; +import Migration from "../../db/Migration.js"; +import ModelFactory from "../../db/ModelFactory.js"; +import User from "../models/User.js"; +import UserApprovedComponent from "../models/UserApprovedComponent.js"; export default class AddApprovedFieldToUsersTableMigration extends Migration { public async install(): Promise { diff --git a/src/auth/migrations/AddNameChangedAtToUsersMigration.ts b/src/auth/migrations/AddNameChangedAtToUsersMigration.ts index c83d6f1..66c08a0 100644 --- a/src/auth/migrations/AddNameChangedAtToUsersMigration.ts +++ b/src/auth/migrations/AddNameChangedAtToUsersMigration.ts @@ -1,4 +1,4 @@ -import Migration from "../../db/Migration"; +import Migration from "../../db/Migration.js"; export default class AddNameChangedAtToUsersMigration extends Migration { public async install(): Promise { diff --git a/src/auth/migrations/AddNameToUsersMigration.ts b/src/auth/migrations/AddNameToUsersMigration.ts index cf513ab..eeedbb7 100644 --- a/src/auth/migrations/AddNameToUsersMigration.ts +++ b/src/auth/migrations/AddNameToUsersMigration.ts @@ -1,11 +1,12 @@ -import Migration from "../../db/Migration"; -import ModelFactory from "../../db/ModelFactory"; -import User from "../models/User"; -import UserNameComponent from "../models/UserNameComponent"; -import MagicLink from "../models/MagicLink"; -import MagicLinkUserNameComponent from "../models/MagicLinkUserNameComponent"; import {nanoid} from "nanoid"; +import Migration from "../../db/Migration.js"; +import ModelFactory from "../../db/ModelFactory.js"; +import MagicLink from "../models/MagicLink.js"; +import MagicLinkUserNameComponent from "../models/MagicLinkUserNameComponent.js"; +import User from "../models/User.js"; +import UserNameComponent from "../models/UserNameComponent.js"; + export default class AddNameToUsersMigration extends Migration { public async install(): Promise { await this.query(`ALTER TABLE users diff --git a/src/auth/migrations/CreateUsersAndUserEmailsTableMigration.ts b/src/auth/migrations/CreateUsersAndUserEmailsTableMigration.ts index 5aaf814..b26e8e6 100644 --- a/src/auth/migrations/CreateUsersAndUserEmailsTableMigration.ts +++ b/src/auth/migrations/CreateUsersAndUserEmailsTableMigration.ts @@ -1,7 +1,7 @@ -import Migration from "../../db/Migration"; -import ModelFactory from "../../db/ModelFactory"; -import User from "../models/User"; -import UserEmail from "../models/UserEmail"; +import Migration from "../../db/Migration.js"; +import ModelFactory from "../../db/ModelFactory.js"; +import User from "../models/User.js"; +import UserEmail from "../models/UserEmail.js"; export default class CreateUsersAndUserEmailsTableMigration extends Migration { public async install(): Promise { diff --git a/src/auth/migrations/DropNameFromUsers.ts b/src/auth/migrations/DropNameFromUsers.ts index bc3e0c5..2c17da7 100644 --- a/src/auth/migrations/DropNameFromUsers.ts +++ b/src/auth/migrations/DropNameFromUsers.ts @@ -1,4 +1,4 @@ -import Migration from "../../db/Migration"; +import Migration from "../../db/Migration.js"; /** * @deprecated - TODO may be remove at next major version >= 0.24, replace with DummyMigration. diff --git a/src/auth/migrations/FixUserMainEmailRelation.ts b/src/auth/migrations/FixUserMainEmailRelation.ts index db32337..6ec6a41 100644 --- a/src/auth/migrations/FixUserMainEmailRelation.ts +++ b/src/auth/migrations/FixUserMainEmailRelation.ts @@ -1,4 +1,4 @@ -import Migration from "../../db/Migration"; +import Migration from "../../db/Migration.js"; /** * @deprecated - TODO may be remove at next major version >= 0.24, replace with DummyMigration. diff --git a/src/auth/models/MagicLink.ts b/src/auth/models/MagicLink.ts index 7af67f4..b9c5d1b 100644 --- a/src/auth/models/MagicLink.ts +++ b/src/auth/models/MagicLink.ts @@ -1,11 +1,12 @@ -import crypto from "crypto"; -import config from "config"; -import Model from "../../db/Model"; -import AuthProof from "../AuthProof"; -import User from "./User"; import argon2 from "argon2"; -import UserEmail from "./UserEmail"; -import {EMAIL_REGEX} from "../../db/Validator"; +import config from "config"; +import crypto from "crypto"; + +import Model from "../../db/Model.js"; +import {EMAIL_REGEX} from "../../db/Validator.js"; +import AuthProof from "../AuthProof.js"; +import User from "./User.js"; +import UserEmail from "./UserEmail.js"; export default class MagicLink extends Model implements AuthProof { public static validityPeriod(): number { diff --git a/src/auth/models/MagicLinkUserNameComponent.ts b/src/auth/models/MagicLinkUserNameComponent.ts index f4fb2ca..5fda09d 100644 --- a/src/auth/models/MagicLinkUserNameComponent.ts +++ b/src/auth/models/MagicLinkUserNameComponent.ts @@ -1,7 +1,7 @@ -import ModelComponent from "../../db/ModelComponent"; -import MagicLink from "./MagicLink"; -import {USERNAME_REGEXP} from "./UserNameComponent"; -import User from "./User"; +import ModelComponent from "../../db/ModelComponent.js"; +import MagicLink from "./MagicLink.js"; +import User from "./User.js"; +import {USERNAME_REGEXP} from "./UserNameComponent.js"; export default class MagicLinkUserNameComponent extends ModelComponent { public readonly username?: string = undefined; diff --git a/src/auth/models/User.ts b/src/auth/models/User.ts index bbb648a..418fafd 100644 --- a/src/auth/models/User.ts +++ b/src/auth/models/User.ts @@ -1,11 +1,12 @@ -import Model from "../../db/Model"; -import MysqlConnectionManager from "../../db/MysqlConnectionManager"; -import AddApprovedFieldToUsersTableMigration from "../migrations/AddApprovedFieldToUsersTableMigration"; import config from "config"; -import {ManyModelRelation} from "../../db/ModelRelation"; -import UserEmail from "./UserEmail"; -import UserApprovedComponent from "./UserApprovedComponent"; -import UserNameComponent from "./UserNameComponent"; + +import Model from "../../db/Model.js"; +import {ManyModelRelation} from "../../db/ModelRelation.js"; +import MysqlConnectionManager from "../../db/MysqlConnectionManager.js"; +import AddApprovedFieldToUsersTableMigration from "../migrations/AddApprovedFieldToUsersTableMigration.js"; +import UserApprovedComponent from "./UserApprovedComponent.js"; +import UserEmail from "./UserEmail.js"; +import UserNameComponent from "./UserNameComponent.js"; export default class User extends Model { /** diff --git a/src/auth/models/UserApprovedComponent.ts b/src/auth/models/UserApprovedComponent.ts index 648dfa9..3b3e6a4 100644 --- a/src/auth/models/UserApprovedComponent.ts +++ b/src/auth/models/UserApprovedComponent.ts @@ -1,5 +1,5 @@ -import ModelComponent from "../../db/ModelComponent"; -import User from "./User"; +import ModelComponent from "../../db/ModelComponent.js"; +import User from "./User.js"; export default class UserApprovedComponent extends ModelComponent { public approved: boolean = false; diff --git a/src/auth/models/UserEmail.ts b/src/auth/models/UserEmail.ts index e3d58e8..a7e9387 100644 --- a/src/auth/models/UserEmail.ts +++ b/src/auth/models/UserEmail.ts @@ -1,7 +1,7 @@ -import User from "./User"; -import Model from "../../db/Model"; -import {OneModelRelation} from "../../db/ModelRelation"; -import {EMAIL_REGEX} from "../../db/Validator"; +import Model from "../../db/Model.js"; +import {OneModelRelation} from "../../db/ModelRelation.js"; +import {EMAIL_REGEX} from "../../db/Validator.js"; +import User from "./User.js"; export default class UserEmail extends Model { public readonly id?: number = undefined; diff --git a/src/auth/models/UserNameComponent.ts b/src/auth/models/UserNameComponent.ts index 9440329..58ece29 100644 --- a/src/auth/models/UserNameComponent.ts +++ b/src/auth/models/UserNameComponent.ts @@ -1,7 +1,8 @@ -import ModelComponent from "../../db/ModelComponent"; -import User from "../models/User"; import config from "config"; +import ModelComponent from "../../db/ModelComponent.js"; +import User from "../models/User.js"; + export const USERNAME_REGEXP = /^[0-9a-z_-]+$/; export default class UserNameComponent extends ModelComponent { diff --git a/src/auth/password/AddPasswordToUsersMigration.ts b/src/auth/password/AddPasswordToUsersMigration.ts index 520b4df..d43f958 100644 --- a/src/auth/password/AddPasswordToUsersMigration.ts +++ b/src/auth/password/AddPasswordToUsersMigration.ts @@ -1,7 +1,7 @@ -import Migration from "../../db/Migration"; -import ModelFactory from "../../db/ModelFactory"; -import User from "../models/User"; -import UserPasswordComponent from "./UserPasswordComponent"; +import Migration from "../../db/Migration.js"; +import ModelFactory from "../../db/ModelFactory.js"; +import User from "../models/User.js"; +import UserPasswordComponent from "./UserPasswordComponent.js"; export default class AddPasswordToUsersMigration extends Migration { public async install(): Promise { diff --git a/src/auth/password/PasswordAuthMethod.ts b/src/auth/password/PasswordAuthMethod.ts index 6372c2e..5aa89a1 100644 --- a/src/auth/password/PasswordAuthMethod.ts +++ b/src/auth/password/PasswordAuthMethod.ts @@ -1,20 +1,21 @@ -import AuthMethod from "../AuthMethod"; -import PasswordAuthProof from "./PasswordAuthProof"; -import User from "../models/User"; import {Request, Response} from "express"; -import UserEmail from "../models/UserEmail"; -import AuthComponent from "../AuthComponent"; -import Application from "../../Application"; -import Throttler from "../../Throttler"; -import {AuthError, PendingApprovalAuthError, RegisterCallback} from "../AuthGuard"; -import Validator, {InvalidFormatValidationError} from "../../db/Validator"; -import Controller from "../../Controller"; -import UserPasswordComponent from "./UserPasswordComponent"; -import UserNameComponent, {USERNAME_REGEXP} from "../models/UserNameComponent"; -import ModelFactory from "../../db/ModelFactory"; -import {ServerError} from "../../HttpError"; import {Session} from "express-session"; +import Application from "../../Application.js"; +import Controller from "../../Controller.js"; +import ModelFactory from "../../db/ModelFactory.js"; +import Validator, {InvalidFormatValidationError} from "../../db/Validator.js"; +import {ServerError} from "../../HttpError.js"; +import Throttler from "../../Throttler.js"; +import AuthComponent from "../AuthComponent.js"; +import {AuthError, PendingApprovalAuthError, RegisterCallback} from "../AuthGuard.js"; +import AuthMethod from "../AuthMethod.js"; +import User from "../models/User.js"; +import UserEmail from "../models/UserEmail.js"; +import UserNameComponent, {USERNAME_REGEXP} from "../models/UserNameComponent.js"; +import PasswordAuthProof from "./PasswordAuthProof.js"; +import UserPasswordComponent from "./UserPasswordComponent.js"; + export default class PasswordAuthMethod implements AuthMethod { public constructor( protected readonly app: Application, diff --git a/src/auth/password/PasswordAuthProof.ts b/src/auth/password/PasswordAuthProof.ts index 5149c0a..d086f77 100644 --- a/src/auth/password/PasswordAuthProof.ts +++ b/src/auth/password/PasswordAuthProof.ts @@ -1,8 +1,9 @@ -import AuthProof from "../AuthProof"; -import User from "../models/User"; -import UserPasswordComponent from "./UserPasswordComponent"; import {Session, SessionData} from "express-session"; +import AuthProof from "../AuthProof.js"; +import User from "../models/User.js"; +import UserPasswordComponent from "./UserPasswordComponent.js"; + export default class PasswordAuthProof implements AuthProof { public static getProofForSession(session: Session & Partial): PasswordAuthProof | null { diff --git a/src/auth/password/UserPasswordComponent.ts b/src/auth/password/UserPasswordComponent.ts index a8bbc13..4cafe64 100644 --- a/src/auth/password/UserPasswordComponent.ts +++ b/src/auth/password/UserPasswordComponent.ts @@ -1,7 +1,8 @@ -import argon2, {argon2id} from "argon2"; -import ModelComponent from "../../db/ModelComponent"; -import User from "../models/User"; -import Validator from "../../db/Validator"; +import argon2 from "argon2"; + +import ModelComponent from "../../db/ModelComponent.js"; +import Validator from "../../db/Validator.js"; +import User from "../models/User.js"; export default class UserPasswordComponent extends ModelComponent { public static readonly PASSWORD_MIN_LENGTH = 12; @@ -22,7 +23,7 @@ export default class UserPasswordComponent extends ModelComponent { timeCost: 10, memoryCost: 65536, parallelism: 4, - type: argon2id, + type: argon2.argon2id, hashLength: 32, }); } diff --git a/src/components/AutoUpdateComponent.ts b/src/components/AutoUpdateComponent.ts index 15cea80..74b4345 100644 --- a/src/components/AutoUpdateComponent.ts +++ b/src/components/AutoUpdateComponent.ts @@ -1,9 +1,10 @@ -import {Router} from "express"; -import config from "config"; import * as child_process from "child_process"; -import ApplicationComponent from "../ApplicationComponent"; -import {ForbiddenHttpError} from "../HttpError"; -import {logger} from "../Logger"; +import config from "config"; +import {Router} from "express"; + +import ApplicationComponent from "../ApplicationComponent.js"; +import {ForbiddenHttpError} from "../HttpError.js"; +import {logger} from "../Logger.js"; export default class AutoUpdateComponent extends ApplicationComponent { private static async runCommand(command: string): Promise { diff --git a/src/components/CsrfProtectionComponent.ts b/src/components/CsrfProtectionComponent.ts index 614f7fc..1d09236 100644 --- a/src/components/CsrfProtectionComponent.ts +++ b/src/components/CsrfProtectionComponent.ts @@ -1,10 +1,11 @@ -import ApplicationComponent from "../ApplicationComponent"; -import {Request, Router} from "express"; import crypto from "crypto"; -import {BadRequestError} from "../HttpError"; -import {AuthMiddleware} from "../auth/AuthComponent"; +import {Request, Router} from "express"; import {Session, SessionData} from "express-session"; +import ApplicationComponent from "../ApplicationComponent.js"; +import {AuthMiddleware} from "../auth/AuthComponent.js"; +import {BadRequestError} from "../HttpError.js"; + export default class CsrfProtectionComponent extends ApplicationComponent { private static readonly excluders: ((req: Request) => boolean)[] = []; diff --git a/src/components/ExpressAppComponent.ts b/src/components/ExpressAppComponent.ts index 5ab489a..778e48d 100644 --- a/src/components/ExpressAppComponent.ts +++ b/src/components/ExpressAppComponent.ts @@ -1,10 +1,11 @@ -import ApplicationComponent from "../ApplicationComponent"; -import express, {Express, Router} from "express"; -import {logger, preventContextCorruptionMiddleware} from "../Logger"; -import {Server} from "http"; import compression from "compression"; -import Middleware from "../Middleware"; -import {Type} from "../Utils"; +import express, {Express, Router} from "express"; +import {Server} from "http"; + +import ApplicationComponent from "../ApplicationComponent.js"; +import {logger, preventContextCorruptionMiddleware} from "../Logger.js"; +import Middleware from "../Middleware.js"; +import {Type} from "../Utils.js"; export default class ExpressAppComponent extends ApplicationComponent { private readonly addr: string; diff --git a/src/components/FormHelperComponent.ts b/src/components/FormHelperComponent.ts index 47527ca..800f296 100644 --- a/src/components/FormHelperComponent.ts +++ b/src/components/FormHelperComponent.ts @@ -1,6 +1,7 @@ -import ApplicationComponent from "../ApplicationComponent"; import {Router} from "express"; +import ApplicationComponent from "../ApplicationComponent.js"; + export default class FormHelperComponent extends ApplicationComponent { public async init(router: Router): Promise { router.use((req, res, next) => { diff --git a/src/components/FrontendToolsComponent.ts b/src/components/FrontendToolsComponent.ts index 30a6555..ca43bc6 100644 --- a/src/components/FrontendToolsComponent.ts +++ b/src/components/FrontendToolsComponent.ts @@ -1,17 +1,19 @@ +import "../../node_modules/svelte/register.js"; + +import config from "config"; import {Express, Router} from "express"; import path from "path"; -import config from "config"; -import ApplicationComponent from "../ApplicationComponent"; -import {logger} from "../Logger"; -import "svelte/register"; -import ViewEngine from "../frontend/ViewEngine"; -import {readdirRecursively} from "../Utils"; -import FileCache from "../utils/FileCache"; -import Controller, {RouteParams} from "../Controller"; import * as querystring from "querystring"; import {ParsedUrlQueryInput} from "querystring"; import util from "util"; +import ApplicationComponent from "../ApplicationComponent.js"; +import Controller, {RouteParams} from "../Controller.js"; +import ViewEngine from "../frontend/ViewEngine.js"; +import {logger} from "../Logger.js"; +import {readdirRecursively} from "../Utils.js"; +import FileCache from "../utils/FileCache.js"; + export default class FrontendToolsComponent extends ApplicationComponent { private readonly publicAssetsCache: FileCache = new FileCache(); private readonly viewEngines: ViewEngine[]; diff --git a/src/components/LogRequestsComponent.ts b/src/components/LogRequestsComponent.ts index 6be5560..38d358e 100644 --- a/src/components/LogRequestsComponent.ts +++ b/src/components/LogRequestsComponent.ts @@ -1,8 +1,9 @@ -import ApplicationComponent from "../ApplicationComponent"; -import onFinished from "on-finished"; -import {logger} from "../Logger"; import {Request, Response, Router} from "express"; -import {HttpError} from "../HttpError"; +import onFinished from "on-finished"; + +import ApplicationComponent from "../ApplicationComponent.js"; +import {HttpError} from "../HttpError.js"; +import {logger} from "../Logger.js"; export default class LogRequestsComponent extends ApplicationComponent { private static fullRequests: boolean = false; diff --git a/src/components/MailComponent.ts b/src/components/MailComponent.ts index 750a7eb..7f80d08 100644 --- a/src/components/MailComponent.ts +++ b/src/components/MailComponent.ts @@ -1,15 +1,16 @@ -import ApplicationComponent from "../ApplicationComponent"; -import {Express} from "express"; import config from "config"; -import SecurityError from "../SecurityError"; +import {Express} from "express"; import nodemailer, {SentMessageInfo, Transporter} from "nodemailer"; -import MailError from "../mail/MailError"; import util from "util"; -import {logger} from "../Logger"; -import Controller from "../Controller"; -import Mail from "../mail/Mail"; -import MailViewEngine from "../frontend/MailViewEngine"; -import ViewEngine from "../frontend/ViewEngine"; + +import ApplicationComponent from "../ApplicationComponent.js"; +import Controller from "../Controller.js"; +import MailViewEngine from "../frontend/MailViewEngine.js"; +import ViewEngine from "../frontend/ViewEngine.js"; +import {logger} from "../Logger.js"; +import Mail from "../mail/Mail.js"; +import MailError from "../mail/MailError.js"; +import SecurityError from "../SecurityError.js"; export default class MailComponent extends ApplicationComponent { private transporter?: Transporter; diff --git a/src/components/MaintenanceComponent.ts b/src/components/MaintenanceComponent.ts index ebfd8a3..d5edb5d 100644 --- a/src/components/MaintenanceComponent.ts +++ b/src/components/MaintenanceComponent.ts @@ -1,8 +1,9 @@ -import ApplicationComponent from "../ApplicationComponent"; -import {NextFunction, Request, Response, Router} from "express"; -import {ServiceUnavailableHttpError} from "../HttpError"; -import Application from "../Application"; import config from "config"; +import {NextFunction, Request, Response, Router} from "express"; + +import Application from "../Application.js"; +import ApplicationComponent from "../ApplicationComponent.js"; +import {ServiceUnavailableHttpError} from "../HttpError.js"; export default class MaintenanceComponent extends ApplicationComponent { private readonly application: Application; diff --git a/src/components/MysqlComponent.ts b/src/components/MysqlComponent.ts index 850ff1b..393a691 100644 --- a/src/components/MysqlComponent.ts +++ b/src/components/MysqlComponent.ts @@ -1,6 +1,7 @@ -import ApplicationComponent from "../ApplicationComponent"; import {Express} from "express"; -import MysqlConnectionManager from "../db/MysqlConnectionManager"; + +import ApplicationComponent from "../ApplicationComponent.js"; +import MysqlConnectionManager from "../db/MysqlConnectionManager.js"; export default class MysqlComponent extends ApplicationComponent { public async start(_app: Express): Promise { diff --git a/src/components/PreviousUrlComponent.ts b/src/components/PreviousUrlComponent.ts index 9e18ee7..8e6b6ba 100644 --- a/src/components/PreviousUrlComponent.ts +++ b/src/components/PreviousUrlComponent.ts @@ -1,8 +1,9 @@ -import ApplicationComponent from "../ApplicationComponent"; import {Router} from "express"; import onFinished from "on-finished"; -import {logger} from "../Logger"; -import SessionComponent from "./SessionComponent"; + +import ApplicationComponent from "../ApplicationComponent.js"; +import {logger} from "../Logger.js"; +import SessionComponent from "./SessionComponent.js"; export default class PreviousUrlComponent extends ApplicationComponent { diff --git a/src/components/RedisComponent.ts b/src/components/RedisComponent.ts index 85363e8..ac9f756 100644 --- a/src/components/RedisComponent.ts +++ b/src/components/RedisComponent.ts @@ -1,10 +1,11 @@ -import ApplicationComponent from "../ApplicationComponent"; -import {Express} from "express"; -import redis, {RedisClient} from "redis"; import config from "config"; -import {logger} from "../Logger"; +import {Express} from "express"; import session, {Store} from "express-session"; -import CacheProvider from "../CacheProvider"; +import redis, {RedisClient} from "redis"; + +import ApplicationComponent from "../ApplicationComponent.js"; +import CacheProvider from "../CacheProvider.js"; +import {logger} from "../Logger.js"; export default class RedisComponent extends ApplicationComponent implements CacheProvider { private redisClient?: RedisClient; diff --git a/src/components/ServeStaticDirectoryComponent.ts b/src/components/ServeStaticDirectoryComponent.ts index d81c8a0..02350ac 100644 --- a/src/components/ServeStaticDirectoryComponent.ts +++ b/src/components/ServeStaticDirectoryComponent.ts @@ -1,8 +1,9 @@ -import ApplicationComponent from "../ApplicationComponent"; import express, {Router} from "express"; import {PathParams} from "express-serve-static-core"; import * as path from "path"; -import {logger} from "../Logger"; + +import ApplicationComponent from "../ApplicationComponent.js"; +import {logger} from "../Logger.js"; export default class ServeStaticDirectoryComponent extends ApplicationComponent { private readonly root: string; @@ -15,7 +16,7 @@ export default class ServeStaticDirectoryComponent extends ApplicationComponent } public async init(router: Router): Promise { - const resolvedRoot = path.join(__dirname, this.getApp().isInNodeModules() ? '../../../' : '../../', this.root); + const resolvedRoot = path.resolve(this.root); if (this.path) { router.use(this.path, express.static(resolvedRoot, {maxAge: 1000 * 3600 * 72})); diff --git a/src/components/SessionComponent.ts b/src/components/SessionComponent.ts index 1c86fe6..f841f3d 100644 --- a/src/components/SessionComponent.ts +++ b/src/components/SessionComponent.ts @@ -1,10 +1,11 @@ -import ApplicationComponent from "../ApplicationComponent"; -import session from "express-session"; import config from "config"; -import RedisComponent from "./RedisComponent"; import flash from "connect-flash"; import {Router} from "express"; -import SecurityError from "../SecurityError"; +import session from "express-session"; + +import ApplicationComponent from "../ApplicationComponent.js"; +import SecurityError from "../SecurityError.js"; +import RedisComponent from "./RedisComponent.js"; export default class SessionComponent extends ApplicationComponent { private readonly storeComponent: RedisComponent; diff --git a/src/components/WebSocketServerComponent.ts b/src/components/WebSocketServerComponent.ts index 9d2444f..b72f722 100644 --- a/src/components/WebSocketServerComponent.ts +++ b/src/components/WebSocketServerComponent.ts @@ -1,16 +1,17 @@ -import ApplicationComponent from "../ApplicationComponent"; -import {Express, Request} from "express"; -import WebSocket, {Server as WebSocketServer} from "ws"; -import {logger} from "../Logger"; +import config from "config"; import cookie from "cookie"; import cookieParser from "cookie-parser"; -import config from "config"; -import ExpressAppComponent from "./ExpressAppComponent"; -import Application from "../Application"; -import RedisComponent from "./RedisComponent"; -import WebSocketListener from "../WebSocketListener"; +import {Express, Request} from "express"; import {Session} from "express-session"; -import ViewEngine from "../frontend/ViewEngine"; +import WebSocket from "ws"; + +import Application from "../Application.js"; +import ApplicationComponent from "../ApplicationComponent.js"; +import ViewEngine from "../frontend/ViewEngine.js"; +import {logger} from "../Logger.js"; +import WebSocketListener from "../WebSocketListener.js"; +import ExpressAppComponent from "./ExpressAppComponent.js"; +import RedisComponent from "./RedisComponent.js"; export default class WebSocketServerComponent extends ApplicationComponent { private wss?: WebSocket.Server; @@ -27,7 +28,7 @@ export default class WebSocketServerComponent extends ApplicationComponent { public async start(_app: Express): Promise { const listeners: { [p: string]: WebSocketListener } = this.application.getWebSocketListeners(); - this.wss = new WebSocketServer({ + this.wss = new WebSocket.Server({ server: this.expressAppComponent.getServer(), }, () => { logger.info(`Websocket server started over webserver.`); diff --git a/src/db/Migration.ts b/src/db/Migration.ts index cfa94ff..fc6ca51 100644 --- a/src/db/Migration.ts +++ b/src/db/Migration.ts @@ -1,6 +1,7 @@ import {Connection} from "mysql"; -import MysqlConnectionManager from "./MysqlConnectionManager"; -import {Type} from "../Utils"; + +import {Type} from "../Utils.js"; +import MysqlConnectionManager from "./MysqlConnectionManager.js"; export default abstract class Migration { public readonly version: number; diff --git a/src/db/Model.ts b/src/db/Model.ts index 399d407..decee8f 100644 --- a/src/db/Model.ts +++ b/src/db/Model.ts @@ -1,13 +1,14 @@ -import MysqlConnectionManager from "./MysqlConnectionManager"; -import Validator from "./Validator"; -import {Connection} from "mysql"; -import ModelComponent from "./ModelComponent"; -import {Type} from "../Utils"; -import ModelFactory, {PrimaryKeyValue} from "./ModelFactory"; -import ModelRelation from "./ModelRelation"; -import ModelQuery, {ModelFieldData, ModelQueryResult, QueryFields} from "./ModelQuery"; import {Request} from "express"; -import Extendable from "../Extendable"; +import {Connection} from "mysql"; + +import Extendable from "../Extendable.js"; +import {Type} from "../Utils.js"; +import ModelComponent from "./ModelComponent.js"; +import ModelFactory, {PrimaryKeyValue} from "./ModelFactory.js"; +import ModelQuery, {ModelFieldData, ModelQueryResult, QueryFields} from "./ModelQuery.js"; +import ModelRelation from "./ModelRelation.js"; +import MysqlConnectionManager from "./MysqlConnectionManager.js"; +import Validator from "./Validator.js"; export default abstract class Model implements Extendable> { public static get table(): string { diff --git a/src/db/ModelComponent.ts b/src/db/ModelComponent.ts index 7983749..48d7a38 100644 --- a/src/db/ModelComponent.ts +++ b/src/db/ModelComponent.ts @@ -1,7 +1,7 @@ -import Model from "./Model"; -import Validator from "./Validator"; -import {getMethods} from "../Utils"; -import {ModelFieldData} from "./ModelQuery"; +import {getMethods} from "../Utils.js"; +import Model from "./Model.js"; +import {ModelFieldData} from "./ModelQuery.js"; +import Validator from "./Validator.js"; export default abstract class ModelComponent { protected readonly _model: M; diff --git a/src/db/ModelFactory.ts b/src/db/ModelFactory.ts index e24d2d2..9426d69 100644 --- a/src/db/ModelFactory.ts +++ b/src/db/ModelFactory.ts @@ -1,9 +1,10 @@ -import ModelComponent from "./ModelComponent"; -import Model, {ModelType} from "./Model"; -import ModelQuery, {ModelQueryResult, QueryFields} from "./ModelQuery"; import {Request} from "express"; -import {PageNotFoundError} from "../Pagination"; -import {NotFoundHttpError} from "../HttpError"; + +import {NotFoundHttpError} from "../HttpError.js"; +import {PageNotFoundError} from "../Pagination.js"; +import Model, {ModelType} from "./Model.js"; +import ModelComponent from "./ModelComponent.js"; +import ModelQuery, {ModelQueryResult, QueryFields} from "./ModelQuery.js"; export default class ModelFactory { private static readonly factories: { [modelType: string]: ModelFactory | undefined } = {}; diff --git a/src/db/ModelQuery.ts b/src/db/ModelQuery.ts index c70caf6..14e5aeb 100644 --- a/src/db/ModelQuery.ts +++ b/src/db/ModelQuery.ts @@ -1,9 +1,10 @@ -import {isQueryVariable, query, QueryResult, QueryVariable} from "./MysqlConnectionManager"; import {Connection} from "mysql"; -import Model from "./Model"; -import Pagination from "../Pagination"; -import ModelRelation, {RelationDatabaseProperties} from "./ModelRelation"; -import ModelFactory from "./ModelFactory"; + +import Pagination from "../Pagination.js"; +import Model from "./Model.js"; +import ModelFactory from "./ModelFactory.js"; +import ModelRelation, {RelationDatabaseProperties} from "./ModelRelation.js"; +import {isQueryVariable, query, QueryResult, QueryVariable} from "./MysqlConnectionManager.js"; export default class ModelQuery implements WhereFieldConsumer { diff --git a/src/db/ModelRelation.ts b/src/db/ModelRelation.ts index 1142995..c3d5116 100644 --- a/src/db/ModelRelation.ts +++ b/src/db/ModelRelation.ts @@ -1,6 +1,6 @@ -import ModelQuery, {ModelFieldData, ModelQueryResult, WhereTest} from "./ModelQuery"; -import Model, {ModelType} from "./Model"; -import ModelFactory from "./ModelFactory"; +import Model, {ModelType} from "./Model.js"; +import ModelFactory from "./ModelFactory.js"; +import ModelQuery, {ModelFieldData, ModelQueryResult, WhereTest} from "./ModelQuery.js"; export default abstract class ModelRelation { protected readonly model: S; diff --git a/src/db/MysqlConnectionManager.ts b/src/db/MysqlConnectionManager.ts index 1b973cb..f689745 100644 --- a/src/db/MysqlConnectionManager.ts +++ b/src/db/MysqlConnectionManager.ts @@ -1,8 +1,9 @@ -import mysql, {Connection, FieldInfo, MysqlError, Pool, PoolConnection} from 'mysql'; import config from 'config'; -import Migration, {MigrationType} from "./Migration"; -import {logger} from "../Logger"; -import {Type} from "../Utils"; +import mysql, {Connection, FieldInfo, MysqlError, Pool, PoolConnection} from 'mysql'; + +import {logger} from "../Logger.js"; +import {Type} from "../Utils.js"; +import Migration, {MigrationType} from "./Migration.js"; export interface QueryResult { readonly results: Record[]; diff --git a/src/db/Validator.ts b/src/db/Validator.ts index 9440456..72867db 100644 --- a/src/db/Validator.ts +++ b/src/db/Validator.ts @@ -1,7 +1,8 @@ -import Model, {ModelType} from "./Model"; -import ModelQuery, {WhereTest} from "./ModelQuery"; import {Connection} from "mysql"; -import {ServerError} from "../HttpError"; + +import {ServerError} from "../HttpError.js"; +import Model, {ModelType} from "./Model.js"; +import ModelQuery, {WhereTest} from "./ModelQuery.js"; export const EMAIL_REGEX = /^[a-zA-Z0-9.!#$%&'*+\\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$/; diff --git a/src/frontend/MailViewEngine.ts b/src/frontend/MailViewEngine.ts index d44afe7..ac89bd2 100644 --- a/src/frontend/MailViewEngine.ts +++ b/src/frontend/MailViewEngine.ts @@ -1,6 +1,7 @@ import mjml2html from "mjml"; -import MailError from "../mail/MailError"; -import NunjucksViewEngine from "./NunjucksViewEngine"; + +import MailError from "../mail/MailError.js"; +import NunjucksViewEngine from "./NunjucksViewEngine.js"; export default class MailViewEngine extends NunjucksViewEngine { public getExtension(): string { diff --git a/src/frontend/NunjucksViewEngine.ts b/src/frontend/NunjucksViewEngine.ts index 1df17dc..87cd3db 100644 --- a/src/frontend/NunjucksViewEngine.ts +++ b/src/frontend/NunjucksViewEngine.ts @@ -1,7 +1,8 @@ -import ViewEngine from "./ViewEngine"; import config from "config"; import nunjucks, {Environment} from "nunjucks"; +import ViewEngine from "./ViewEngine.js"; + export default class NunjucksViewEngine extends ViewEngine { private readonly environment: Environment; diff --git a/src/frontend/SvelteViewEngine.ts b/src/frontend/SvelteViewEngine.ts index 678d0eb..95af344 100644 --- a/src/frontend/SvelteViewEngine.ts +++ b/src/frontend/SvelteViewEngine.ts @@ -1,16 +1,18 @@ -import crypto from "crypto"; -import path from "path"; +import child_process from "child_process"; import config from "config"; -import ViewEngine from "./ViewEngine"; -import {logger} from "../Logger"; -import FileCache from "../utils/FileCache"; -import {afs} from "../Utils"; -import {compile, preprocess} from "svelte/compiler"; -import {sveltePreprocess} from "svelte-preprocess/dist/autoProcess"; -import requireFromString from "require-from-string"; -import {CssResult} from "svelte/types/compiler/interfaces"; -import * as child_process from "child_process"; +import crypto from "crypto"; import fs from "fs"; +import {nanoid} from "nanoid"; +import path from "path"; +import requireFromString from "require-from-string"; +import {compile, preprocess} from "svelte/compiler"; +import {CssResult} from "svelte/types/compiler/interfaces"; +import {sveltePreprocess} from "svelte-preprocess/dist/autoProcess.js"; + +import {logger} from "../Logger.js"; +import {afs} from "../Utils.js"; +import FileCache from "../utils/FileCache.js"; +import ViewEngine from "./ViewEngine.js"; const BACKEND_CODE_PREFIX = 'locals.'; const BACKEND_CODE_PREFIX_TEMPORARY_HOLDER = '$$locals$$'; @@ -321,7 +323,6 @@ export default class SvelteViewEngine extends ViewEngine { }); const globals = ViewEngine.getGlobals(); - delete require.cache[path.resolve(file)]; const localsFunction = (key: string, rawArgs?: string) => { if (!rawArgs) return globals[key]; const args = Function(`"use strict";const locals = Object.assign(arguments[0], arguments[1]);return (${rawArgs});`)(localsFunction, globals) as string[]; @@ -330,7 +331,7 @@ export default class SvelteViewEngine extends ViewEngine { if (typeof f !== 'function') throw new Error(key + ' is not a function.'); return f.call(globals, ...args); }; - return requireFromString(svelteSsr.js.code, file).default.render({ + return requireFromString(svelteSsr.js.code, file + nanoid()).default.render({ locals: localsFunction, }); } diff --git a/src/frontend/ViewEngine.ts b/src/frontend/ViewEngine.ts index 349fe5a..ec7e9c1 100644 --- a/src/frontend/ViewEngine.ts +++ b/src/frontend/ViewEngine.ts @@ -1,9 +1,10 @@ -import path from "path"; -import fs from "fs"; import chokidar, {FSWatcher} from "chokidar"; -import {logger} from "../Logger"; -import {afs, readdirRecursively} from "../Utils"; import {Express} from "express"; +import fs from "fs"; +import path from "path"; + +import {logger} from "../Logger.js"; +import {afs, readdirRecursively} from "../Utils.js"; export default abstract class ViewEngine { private static readonly globals: Record = {}; @@ -31,11 +32,11 @@ export default abstract class ViewEngine { ...additionalViewPaths: string[] ) { this.viewPaths = [ - ...additionalViewPaths.map(p => path.resolve(p)), - path.resolve(__dirname, '../../../views'), - path.resolve(__dirname, '../../views'), - path.resolve(__dirname, '../views'), - ].filter(dir => fs.existsSync(dir)); + ...additionalViewPaths, + 'views', + 'node_modules/swaf/views', + ].map(p => path.resolve(p)) + .filter(dir => fs.existsSync(dir)); } public abstract getExtension(): string; diff --git a/src/helpers/BackendController.ts b/src/helpers/BackendController.ts index f293556..f347f7f 100644 --- a/src/helpers/BackendController.ts +++ b/src/helpers/BackendController.ts @@ -1,16 +1,17 @@ import config from "config"; -import Controller from "../Controller"; -import User from "../auth/models/User"; import {Request, Response} from "express"; -import {BadRequestError, NotFoundHttpError} from "../HttpError"; -import Mail from "../mail/Mail"; -import {ACCOUNT_REVIEW_NOTICE_MAIL_TEMPLATE} from "../Mails"; -import UserEmail from "../auth/models/UserEmail"; -import UserApprovedComponent from "../auth/models/UserApprovedComponent"; -import {RequireAdminMiddleware, RequireAuthMiddleware} from "../auth/AuthComponent"; -import ModelFactory from "../db/ModelFactory"; -import UserNameComponent from "../auth/models/UserNameComponent"; -import MailComponent from "../components/MailComponent"; + +import {RequireAdminMiddleware, RequireAuthMiddleware} from "../auth/AuthComponent.js"; +import User from "../auth/models/User.js"; +import UserApprovedComponent from "../auth/models/UserApprovedComponent.js"; +import UserEmail from "../auth/models/UserEmail.js"; +import UserNameComponent from "../auth/models/UserNameComponent.js"; +import MailComponent from "../components/MailComponent.js"; +import Controller from "../Controller.js"; +import ModelFactory from "../db/ModelFactory.js"; +import {BadRequestError, NotFoundHttpError} from "../HttpError.js"; +import Mail from "../mail/Mail.js"; +import {ACCOUNT_REVIEW_NOTICE_MAIL_TEMPLATE} from "../Mails.js"; export default class BackendController extends Controller { private static readonly menu: BackendMenuElement[] = []; diff --git a/src/mail/Mail.ts b/src/mail/Mail.ts index 40175ef..7178cf6 100644 --- a/src/mail/Mail.ts +++ b/src/mail/Mail.ts @@ -1,7 +1,8 @@ import {Options} from "nodemailer/lib/mailer"; import {ParsedUrlQueryInput} from "querystring"; -import MailError from "./MailError"; -import MailTemplate from "./MailTemplate"; + +import MailError from "./MailError.js"; +import MailTemplate from "./MailTemplate.js"; export default class Mail { private readonly options: Options = {}; diff --git a/src/mail/MailController.ts b/src/mail/MailController.ts index 23016f6..bb302db 100644 --- a/src/mail/MailController.ts +++ b/src/mail/MailController.ts @@ -1,5 +1,6 @@ import {Request, Response} from "express"; -import Controller from "../Controller"; + +import Controller from "../Controller.js"; export default class MailController extends Controller { public routes(): void { diff --git a/src/mail/MailError.ts b/src/mail/MailError.ts index d08297c..8766b14 100644 --- a/src/mail/MailError.ts +++ b/src/mail/MailError.ts @@ -1,4 +1,4 @@ -import {WrappingError} from "../Utils"; +import {WrappingError} from "../Utils.js"; export default class MailError extends WrappingError { public constructor(message: string = 'An error occurred while sending mail.', cause?: Error) { diff --git a/src/main.ts b/src/main.ts index 640f431..45d2bac 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,19 +1,23 @@ -import {delimiter} from "path"; +import path from "path"; // Load config from specified path or default + swaf/config (default defaults) process.env['NODE_CONFIG_DIR'] = - __dirname + '/../node_modules/swaf/config/' - + delimiter - + (process.env['NODE_CONFIG_DIR'] || __dirname + '/../config/'); + path.resolve('node_modules/swaf/config') + + path.delimiter + + (process.env['NODE_CONFIG_DIR'] || path.resolve('config')); -import {logger} from "./Logger"; -import TestApp from "./TestApp"; import config from "config"; +import {logger} from "./Logger.js"; +import TestApp from "./TestApp.js"; +import {afs} from "./Utils.js"; + (async () => { logger.debug('Config path:', process.env['NODE_CONFIG_DIR']); - const app = new TestApp(config.get('listen_addr'), config.get('port')); + const packageJson = JSON.parse((await afs.readFile('package.json')).toString()); + + const app = new TestApp(packageJson.version, config.get('listen_addr'), config.get('port')); await app.start(); })().catch(err => { logger.error(err); diff --git a/src/migrations/CreateMigrationsTable.ts b/src/migrations/CreateMigrationsTable.ts index 0f1c6e8..26477ab 100644 --- a/src/migrations/CreateMigrationsTable.ts +++ b/src/migrations/CreateMigrationsTable.ts @@ -1,5 +1,5 @@ -import Migration from "../db/Migration"; -import {query} from "../db/MysqlConnectionManager"; +import Migration from "../db/Migration.js"; +import {query} from "../db/MysqlConnectionManager.js"; /** * Must be the first migration diff --git a/src/migrations/DropLegacyLogsTable.ts b/src/migrations/DropLegacyLogsTable.ts index c6c0cc1..b86e5fb 100644 --- a/src/migrations/DropLegacyLogsTable.ts +++ b/src/migrations/DropLegacyLogsTable.ts @@ -1,4 +1,4 @@ -import Migration from "../db/Migration"; +import Migration from "../db/Migration.js"; export default class DropLegacyLogsTable extends Migration { public async install(): Promise { diff --git a/src/migrations/DummyMigration.ts b/src/migrations/DummyMigration.ts index bfa47bc..2b83c2a 100644 --- a/src/migrations/DummyMigration.ts +++ b/src/migrations/DummyMigration.ts @@ -1,4 +1,4 @@ -import Migration from "../db/Migration"; +import Migration from "../db/Migration.js"; export default class DummyMigration extends Migration { public async install(): Promise { diff --git a/src/types/Express.d.ts b/src/types/Express.d.ts index 2d61e3c..3e1ae17 100644 --- a/src/types/Express.d.ts +++ b/src/types/Express.d.ts @@ -1,9 +1,10 @@ -import {Files} from "formidable"; -import {Type} from "../Utils"; -import Middleware from "../Middleware"; -import {FlashMessages} from "../components/SessionComponent"; import {Session, SessionData} from "express-session"; -import {PasswordAuthProofSessionData} from "../auth/password/PasswordAuthProof"; +import {Files} from "formidable"; + +import {PasswordAuthProofSessionData} from "../auth/password/PasswordAuthProof.js"; +import {FlashMessages} from "../components/SessionComponent.js"; +import Middleware from "../Middleware.js"; +import {Type} from "../Utils.js"; declare global { namespace Express { diff --git a/src/utils/FileCache.ts b/src/utils/FileCache.ts index d6e2d66..7b5f1d0 100644 --- a/src/utils/FileCache.ts +++ b/src/utils/FileCache.ts @@ -1,5 +1,6 @@ import fs from "fs"; -import {afs} from "../Utils"; + +import {afs} from "../Utils.js"; export default class FileCache { private readonly cache: Record = {}; diff --git a/test/Authentication.test.ts b/test/Authentication.test.ts index 1a3f7dc..bb5405d 100644 --- a/test/Authentication.test.ts +++ b/test/Authentication.test.ts @@ -1,12 +1,13 @@ -import useApp from "./_app"; -import supertest from "supertest"; -import User from "../src/auth/models/User"; -import UserNameComponent from "../src/auth/models/UserNameComponent"; -import UserPasswordComponent from "../src/auth/password/UserPasswordComponent"; -import {popEmail} from "./_mail_server"; -import {authAppProvider, followMagicLinkFromMail, testLogout} from "./_authentication_common"; -import UserEmail from "../src/auth/models/UserEmail"; import * as querystring from "querystring"; +import supertest from "supertest"; + +import User from "../src/auth/models/User.js"; +import UserEmail from "../src/auth/models/UserEmail.js"; +import UserNameComponent from "../src/auth/models/UserNameComponent.js"; +import UserPasswordComponent from "../src/auth/password/UserPasswordComponent.js"; +import useApp from "./_app.js"; +import {authAppProvider, followMagicLinkFromMail, testLogout} from "./_authentication_common.js"; +import {popEmail} from "./_mail_server.js"; const app = useApp(authAppProvider()); diff --git a/test/AuthenticationApprovalMode.test.ts b/test/AuthenticationApprovalMode.test.ts index 7440f11..3ddd350 100644 --- a/test/AuthenticationApprovalMode.test.ts +++ b/test/AuthenticationApprovalMode.test.ts @@ -1,10 +1,11 @@ -import useApp from "./_app"; -import supertest from "supertest"; -import {authAppProvider, followMagicLinkFromMail} from "./_authentication_common"; -import User from "../src/auth/models/User"; import querystring from "querystring"; -import UserApprovedComponent from "../src/auth/models/UserApprovedComponent"; -import {popEmail} from "./_mail_server"; +import supertest from "supertest"; + +import User from "../src/auth/models/User.js"; +import UserApprovedComponent from "../src/auth/models/UserApprovedComponent.js"; +import useApp from "./_app.js"; +import {authAppProvider, followMagicLinkFromMail} from "./_authentication_common.js"; +import {popEmail} from "./_mail_server.js"; const app = useApp(authAppProvider(true, true)); diff --git a/test/AuthenticationNoUsername.test.ts b/test/AuthenticationNoUsername.test.ts index 46842f2..60182d8 100644 --- a/test/AuthenticationNoUsername.test.ts +++ b/test/AuthenticationNoUsername.test.ts @@ -1,10 +1,11 @@ -import useApp from "./_app"; import supertest from "supertest"; -import UserPasswordComponent from "../src/auth/password/UserPasswordComponent"; -import {popEmail} from "./_mail_server"; -import {authAppProvider, followMagicLinkFromMail, testLogout} from "./_authentication_common"; -import UserEmail from "../src/auth/models/UserEmail"; -import User from "../src/auth/models/User"; + +import User from "../src/auth/models/User.js"; +import UserEmail from "../src/auth/models/UserEmail.js"; +import UserPasswordComponent from "../src/auth/password/UserPasswordComponent.js"; +import useApp from "./_app.js"; +import {authAppProvider, followMagicLinkFromMail, testLogout} from "./_authentication_common.js"; +import {popEmail} from "./_mail_server.js"; const app = useApp(authAppProvider(false)); diff --git a/test/Controller.test.ts b/test/Controller.test.ts index e296a68..e8f60f9 100644 --- a/test/Controller.test.ts +++ b/test/Controller.test.ts @@ -1,4 +1,4 @@ -import Controller from "../src/Controller"; +import Controller from "../src/Controller.js"; describe('Controller.route()', () => { new class extends Controller { diff --git a/test/CsrfProtectionComponent.test.ts b/test/CsrfProtectionComponent.test.ts index 1cc82f7..f4040e0 100644 --- a/test/CsrfProtectionComponent.test.ts +++ b/test/CsrfProtectionComponent.test.ts @@ -1,8 +1,9 @@ -import useApp from "./_app"; -import Controller from "../src/Controller"; import supertest from "supertest"; -import TestApp from "../src/TestApp"; -import CsrfProtectionComponent from "../src/components/CsrfProtectionComponent"; + +import CsrfProtectionComponent from "../src/components/CsrfProtectionComponent.js"; +import Controller from "../src/Controller.js"; +import TestApp from "../src/TestApp.js"; +import useApp from "./_app.js"; let app: TestApp; useApp(async (addr, port) => { @@ -24,7 +25,7 @@ useApp(async (addr, port) => { await super.init(); } - }(addr, port, true); + }('test', addr, port, true); }); describe('Test CSRF protection', () => { diff --git a/test/Model.test.ts b/test/Model.test.ts index 8342ef5..da8cbfe 100644 --- a/test/Model.test.ts +++ b/test/Model.test.ts @@ -1,12 +1,13 @@ -import MysqlConnectionManager from "../src/db/MysqlConnectionManager"; -import Model from "../src/db/Model"; -import ModelFactory from "../src/db/ModelFactory"; -import {ValidationBag} from "../src/db/Validator"; -import {logger} from "../src/Logger"; -import {ManyThroughModelRelation, OneModelRelation} from "../src/db/ModelRelation"; -import {MIGRATIONS} from "../src/TestApp"; import config from "config"; +import Model from "../src/db/Model.js"; +import ModelFactory from "../src/db/ModelFactory.js"; +import {ManyThroughModelRelation, OneModelRelation} from "../src/db/ModelRelation.js"; +import MysqlConnectionManager from "../src/db/MysqlConnectionManager.js"; +import {ValidationBag} from "../src/db/Validator.js"; +import {logger} from "../src/Logger.js"; +import {MIGRATIONS} from "../src/TestApp.js"; + class FakeDummyModel extends Model { public id?: number = undefined; public name?: string = undefined; diff --git a/test/ModelQuery.test.ts b/test/ModelQuery.test.ts index 92bc7df..7f468dc 100644 --- a/test/ModelQuery.test.ts +++ b/test/ModelQuery.test.ts @@ -1,6 +1,6 @@ -import ModelQuery, {SelectFieldValue, WhereOperator} from "../src/db/ModelQuery"; -import ModelFactory from "../src/db/ModelFactory"; -import Model from "../src/db/Model"; +import Model from "../src/db/Model.js"; +import ModelFactory from "../src/db/ModelFactory.js"; +import ModelQuery, {SelectFieldValue, WhereOperator} from "../src/db/ModelQuery.js"; describe('Test ModelQuery', () => { test('select', () => { diff --git a/test/Pagination.test.ts b/test/Pagination.test.ts index 3cf2bf9..a5a1a23 100644 --- a/test/Pagination.test.ts +++ b/test/Pagination.test.ts @@ -1,4 +1,4 @@ -import Pagination from "../src/Pagination"; +import Pagination from "../src/Pagination.js"; describe('Pagination', () => { const pagination = new Pagination(3, 5, 31); diff --git a/test/_app.ts b/test/_app.ts index 5e5ba04..91312b4 100644 --- a/test/_app.ts +++ b/test/_app.ts @@ -1,8 +1,9 @@ -import {setupMailServer, teardownMailServer} from "./_mail_server"; -import TestApp from "../src/TestApp"; -import MysqlConnectionManager from "../src/db/MysqlConnectionManager"; import config from "config"; +import MysqlConnectionManager from "../src/db/MysqlConnectionManager.js"; +import TestApp from "../src/TestApp.js"; +import {setupMailServer, teardownMailServer} from "./_mail_server.js"; + export default function useApp(appSupplier: AppSupplier): () => T { let app: T; diff --git a/test/_authentication_common.ts b/test/_authentication_common.ts index 4554683..29ca850 100644 --- a/test/_authentication_common.ts +++ b/test/_authentication_common.ts @@ -1,15 +1,16 @@ -import {popEmail} from "./_mail_server"; import supertest from "supertest"; -import {AppSupplier} from "./_app"; -import TestApp from "../src/TestApp"; -import Controller from "../src/Controller"; -import CsrfProtectionComponent from "../src/components/CsrfProtectionComponent"; -import AuthComponent from "../src/auth/AuthComponent"; -import Migration, {MigrationType} from "../src/db/Migration"; -import AddNameToUsersMigration from "../src/auth/migrations/AddNameToUsersMigration"; -import AddApprovedFieldToUsersTableMigration from "../src/auth/migrations/AddApprovedFieldToUsersTableMigration"; -import PasswordAuthProof from "../src/auth/password/PasswordAuthProof"; -import MagicLink from "../src/auth/models/MagicLink"; + +import AuthComponent from "../src/auth/AuthComponent.js"; +import AddApprovedFieldToUsersTableMigration from "../src/auth/migrations/AddApprovedFieldToUsersTableMigration.js"; +import AddNameToUsersMigration from "../src/auth/migrations/AddNameToUsersMigration.js"; +import MagicLink from "../src/auth/models/MagicLink.js"; +import PasswordAuthProof from "../src/auth/password/PasswordAuthProof.js"; +import CsrfProtectionComponent from "../src/components/CsrfProtectionComponent.js"; +import Controller from "../src/Controller.js"; +import Migration, {MigrationType} from "../src/db/Migration.js"; +import TestApp from "../src/TestApp.js"; +import {AppSupplier} from "./_app.js"; +import {popEmail} from "./_mail_server.js"; export async function followMagicLinkFromMail( agent: supertest.SuperTest, @@ -94,6 +95,6 @@ export function authAppProvider(withUsername: boolean = true, approvalMode: bool return migrations; } - }(addr, port, true); + }('test', addr, port, true); }; } diff --git a/tsconfig.json b/tsconfig.json index 99c5ead..81e9132 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,7 +1,7 @@ { "compilerOptions": { - "target": "ES6", - "module": "CommonJS", + "target": "ESNext", + "module": "ESNext", "declaration": true, "stripInternal": true, diff --git a/yarn.lock b/yarn.lock index ec934ed..a97d1ab 100644 --- a/yarn.lock +++ b/yarn.lock @@ -17,24 +17,24 @@ "@babel/highlight" "^7.12.13" "@babel/compat-data@^7.13.15": - version "7.13.15" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.13.15.tgz#7e8eea42d0b64fda2b375b22d06c605222e848f4" - integrity sha512-ltnibHKR1VnrU4ymHyQ/CXtNXI6yZC0oJThyW78Hft8XndANwi+9H+UIklBDraIjFEJzw8wmcM427oDd9KS5wA== + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.14.0.tgz#a901128bce2ad02565df95e6ecbf195cf9465919" + integrity sha512-vu9V3uMM/1o5Hl5OekMUowo3FqXLJSw+s+66nt0fSWVWTtmosdzn45JHOB3cPtZoe6CTBDzvSw0RdOY85Q37+Q== "@babel/core@^7.1.0", "@babel/core@^7.7.5": - version "7.13.16" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.13.16.tgz#7756ab24396cc9675f1c3fcd5b79fcce192ea96a" - integrity sha512-sXHpixBiWWFti0AV2Zq7avpTasr6sIAu7Y396c608541qAU2ui4a193m0KSQmfPSKFZLnQ3cvlKDOm3XkuXm3Q== + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.14.0.tgz#47299ff3ec8d111b493f1a9d04bf88c04e728d88" + integrity sha512-8YqpRig5NmIHlMLw09zMlPTvUVMILjqCOtVgu+TVNWEBvy9b5I3RRyhqnrV4hjgEK7n8P9OqvkWJAFmEL6Wwfw== dependencies: "@babel/code-frame" "^7.12.13" - "@babel/generator" "^7.13.16" + "@babel/generator" "^7.14.0" "@babel/helper-compilation-targets" "^7.13.16" - "@babel/helper-module-transforms" "^7.13.14" - "@babel/helpers" "^7.13.16" - "@babel/parser" "^7.13.16" + "@babel/helper-module-transforms" "^7.14.0" + "@babel/helpers" "^7.14.0" + "@babel/parser" "^7.14.0" "@babel/template" "^7.12.13" - "@babel/traverse" "^7.13.15" - "@babel/types" "^7.13.16" + "@babel/traverse" "^7.14.0" + "@babel/types" "^7.14.0" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" @@ -42,12 +42,12 @@ semver "^6.3.0" source-map "^0.5.0" -"@babel/generator@^7.13.16": - version "7.13.16" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.13.16.tgz#0befc287031a201d84cdfc173b46b320ae472d14" - integrity sha512-grBBR75UnKOcUWMp8WoDxNsWCFl//XCK6HWTrBQKTr5SV9f5g0pNOjdyzi/DTBv12S9GnYPInIXQBTky7OXEMg== +"@babel/generator@^7.14.0": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.14.0.tgz#0f35d663506c43e4f10898fbda0d752ec75494be" + integrity sha512-C6u00HbmsrNPug6A+CiNl8rEys7TsdcXwg12BHi2ca5rUfAs3+UwZsuDQSXnc+wCElCXMB8gMaJ3YXDdh8fAlg== dependencies: - "@babel/types" "^7.13.16" + "@babel/types" "^7.14.0" jsesc "^2.5.1" source-map "^0.5.0" @@ -91,19 +91,19 @@ dependencies: "@babel/types" "^7.13.12" -"@babel/helper-module-transforms@^7.13.14": - version "7.13.14" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.13.14.tgz#e600652ba48ccb1641775413cb32cfa4e8b495ef" - integrity sha512-QuU/OJ0iAOSIatyVZmfqB0lbkVP0kDRiKj34xy+QNsnVZi/PA6BoSoreeqnxxa9EHFAIL0R9XOaAR/G9WlIy5g== +"@babel/helper-module-transforms@^7.14.0": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.14.0.tgz#8fcf78be220156f22633ee204ea81f73f826a8ad" + integrity sha512-L40t9bxIuGOfpIGA3HNkJhU9qYrf4y5A5LUSw7rGMSn+pcG8dfJ0g6Zval6YJGd2nEjI7oP00fRdnhLKndx6bw== dependencies: "@babel/helper-module-imports" "^7.13.12" "@babel/helper-replace-supers" "^7.13.12" "@babel/helper-simple-access" "^7.13.12" "@babel/helper-split-export-declaration" "^7.12.13" - "@babel/helper-validator-identifier" "^7.12.11" + "@babel/helper-validator-identifier" "^7.14.0" "@babel/template" "^7.12.13" - "@babel/traverse" "^7.13.13" - "@babel/types" "^7.13.14" + "@babel/traverse" "^7.14.0" + "@babel/types" "^7.14.0" "@babel/helper-optimise-call-expression@^7.12.13": version "7.12.13" @@ -141,38 +141,38 @@ dependencies: "@babel/types" "^7.12.13" -"@babel/helper-validator-identifier@^7.12.11": - version "7.12.11" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz#c9a1f021917dcb5ccf0d4e453e399022981fc9ed" - integrity sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw== +"@babel/helper-validator-identifier@^7.14.0": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz#d26cad8a47c65286b15df1547319a5d0bcf27288" + integrity sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A== "@babel/helper-validator-option@^7.12.17": version "7.12.17" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz#d1fbf012e1a79b7eebbfdc6d270baaf8d9eb9831" integrity sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw== -"@babel/helpers@^7.13.16": - version "7.13.17" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.13.17.tgz#b497c7a00e9719d5b613b8982bda6ed3ee94caf6" - integrity sha512-Eal4Gce4kGijo1/TGJdqp3WuhllaMLSrW6XcL0ulyUAQOuxHcCafZE8KHg9857gcTehsm/v7RcOx2+jp0Ryjsg== +"@babel/helpers@^7.14.0": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.14.0.tgz#ea9b6be9478a13d6f961dbb5f36bf75e2f3b8f62" + integrity sha512-+ufuXprtQ1D1iZTO/K9+EBRn+qPWMJjZSw/S0KlFrxCw4tkrzv9grgpDHkY9MeQTjTY8i2sp7Jep8DfU6tN9Mg== dependencies: "@babel/template" "^7.12.13" - "@babel/traverse" "^7.13.17" - "@babel/types" "^7.13.17" + "@babel/traverse" "^7.14.0" + "@babel/types" "^7.14.0" "@babel/highlight@^7.10.4", "@babel/highlight@^7.12.13": - version "7.13.10" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.13.10.tgz#a8b2a66148f5b27d666b15d81774347a731d52d1" - integrity sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg== + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.0.tgz#3197e375711ef6bf834e67d0daec88e4f46113cf" + integrity sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg== dependencies: - "@babel/helper-validator-identifier" "^7.12.11" + "@babel/helper-validator-identifier" "^7.14.0" chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.12.13", "@babel/parser@^7.13.16": - version "7.13.16" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.13.16.tgz#0f18179b0448e6939b1f3f5c4c355a3a9bcdfd37" - integrity sha512-6bAg36mCwuqLO0hbR+z7PHuqWiCeP7Dzg73OpQwsAB1Eb8HnGEz5xYBzCfbu+YjoaJsJs+qheDxVAuqbt3ILEw== +"@babel/parser@^7.1.0", "@babel/parser@^7.12.13", "@babel/parser@^7.14.0": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.14.0.tgz#2f0ebfed92bcddcc8395b91f1895191ce2760380" + integrity sha512-AHbfoxesfBALg33idaTBVUkLnfXtsgvJREf93p4p0Lwsz4ppfE7g1tpEXVm4vrxUcH4DVhAa9Z1m1zqf9WUC7Q== "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" @@ -259,9 +259,9 @@ "@babel/helper-plugin-utils" "^7.12.13" "@babel/runtime@^7.8.7": - version "7.13.17" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.13.17.tgz#8966d1fc9593bf848602f0662d6b4d0069e3a7ec" - integrity sha512-NCdgJEelPTSh+FEFylhnP1ylq848l1z9t9N0j1Lfbcw0+KXGjsTvUmkxy+voLLXB5SOKMbLLx4jxYliGrYQseA== + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.14.0.tgz#46794bc20b612c5f75e62dd071e24dfd95f1cbe6" + integrity sha512-JELkvo/DlpNdJ7dlyw/eY7E0suy5i5GQH+Vlxaq1nsNJ+H7f4Vtv3jMeCEgRhZZQFXTjldYfQgv2qmM6M1v5wA== dependencies: regenerator-runtime "^0.13.4" @@ -274,26 +274,26 @@ "@babel/parser" "^7.12.13" "@babel/types" "^7.12.13" -"@babel/traverse@^7.1.0", "@babel/traverse@^7.13.0", "@babel/traverse@^7.13.13", "@babel/traverse@^7.13.15", "@babel/traverse@^7.13.17": - version "7.13.17" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.13.17.tgz#c85415e0c7d50ac053d758baec98b28b2ecfeea3" - integrity sha512-BMnZn0R+X6ayqm3C3To7o1j7Q020gWdqdyP50KEoVqaCO2c/Im7sYZSmVgvefp8TTMQ+9CtwuBp0Z1CZ8V3Pvg== +"@babel/traverse@^7.1.0", "@babel/traverse@^7.13.0", "@babel/traverse@^7.14.0": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.14.0.tgz#cea0dc8ae7e2b1dec65f512f39f3483e8cc95aef" + integrity sha512-dZ/a371EE5XNhTHomvtuLTUyx6UEoJmYX+DT5zBCQN3McHemsuIaKKYqsc/fs26BEkHs/lBZy0J571LP5z9kQA== dependencies: "@babel/code-frame" "^7.12.13" - "@babel/generator" "^7.13.16" + "@babel/generator" "^7.14.0" "@babel/helper-function-name" "^7.12.13" "@babel/helper-split-export-declaration" "^7.12.13" - "@babel/parser" "^7.13.16" - "@babel/types" "^7.13.17" + "@babel/parser" "^7.14.0" + "@babel/types" "^7.14.0" debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.12.13", "@babel/types@^7.13.12", "@babel/types@^7.13.14", "@babel/types@^7.13.16", "@babel/types@^7.13.17", "@babel/types@^7.3.0", "@babel/types@^7.3.3": - version "7.13.17" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.13.17.tgz#48010a115c9fba7588b4437dd68c9469012b38b4" - integrity sha512-RawydLgxbOPDlTLJNtoIypwdmAy//uQIzlKt2+iBiJaRlVuI6QLUxVAyWGNfOzp8Yu4L4lLIacoCyTNtpb4wiA== +"@babel/types@^7.0.0", "@babel/types@^7.12.13", "@babel/types@^7.13.12", "@babel/types@^7.14.0", "@babel/types@^7.3.0", "@babel/types@^7.3.3": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.14.0.tgz#3fc3fc74e0cdad878182e5f66cc6bcab1915a802" + integrity sha512-O2LVLdcnWplaGxiPBz12d0HcdN8QdxdsWYhz5LSeuukV/5mn2xUUc3gBeU4QBYPJ18g/UToe8F532XJ608prmg== dependencies: - "@babel/helper-validator-identifier" "^7.12.11" + "@babel/helper-validator-identifier" "^7.14.0" to-fast-properties "^2.0.0" "@bcoe/v8-coverage@^0.2.3": @@ -788,9 +788,9 @@ "@types/istanbul-lib-report" "*" "@types/jest@^26.0.4": - version "26.0.22" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-26.0.22.tgz#8308a1debdf1b807aa47be2838acdcd91e88fbe6" - integrity sha512-eeWwWjlqxvBxc4oQdkueW5OF/gtfSceKk4OnOAGlUSwS/liBRtZppbJuz1YkgbrbfGOoeBHun9fOvXnjNwrSOw== + version "26.0.23" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-26.0.23.tgz#a1b7eab3c503b80451d019efb588ec63522ee4e7" + integrity sha512-ZHLmWMJ9jJ9PTiT58juykZpL7KjwJywFN3Rr2pTSkyQfydf/rk22yS7W8p5DaVUMQ2BQC7oYiU3FjbTM/mYrOA== dependencies: jest-diff "^26.0.0" pretty-format "^26.0.0" @@ -845,9 +845,9 @@ form-data "^3.0.0" "@types/node@*": - version "14.14.41" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.41.tgz#d0b939d94c1d7bd53d04824af45f1139b8c45615" - integrity sha512-dueRKfaJL4RTtSa7bWeTK1M+VH+Gns73oCgzvYfHZywRCoPSd8EkXBL0mZ9unPTveBn+D9phZBaxuzpwjWkW0g== + version "15.0.1" + resolved "https://registry.yarnpkg.com/@types/node/-/node-15.0.1.tgz#ef34dea0881028d11398be5bf4e856743e3dc35a" + integrity sha512-TMkXt0Ck1y0KKsGr9gJtWGjttxlZnnvDtphxUOSd0bfaR6Q1jle+sPvrzNR1urqYTWMinoKvjKfXUGsumaO1PA== "@types/nodemailer@^6.4.0": version "6.4.1" @@ -953,9 +953,9 @@ integrity sha512-eQ9qFW/fhfGJF8WKHGEHZEyVWfZxrT+6CLIJGBcZPfxUh/+BnEj+UCGYMlr9qZuX/2AltsvwrGqp0LhEW8D0zQ== "@types/ws@^7.2.4": - version "7.4.1" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-7.4.1.tgz#49eacb15a0534663d53a36fbf5b4d98f5ae9a73a" - integrity sha512-ISCK1iFnR+jYv7+jLNX0wDqesZ/5RAeY3wUx6QaphmocphU61h+b+PHjS18TF4WIPTu/MMzxIq2PHr32o2TS5Q== + version "7.4.2" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-7.4.2.tgz#bfe739b5f8b3a39742605fbe415ae7e88ee614c8" + integrity sha512-PbeN0Eydl7LQl4OIav29YmkO2LxbVuz3nZD/kb19lOS+wLgIkRbWMNmU/QQR7ABpOJ7D7xDOU8co7iohObewrw== dependencies: "@types/node" "*" @@ -1088,9 +1088,9 @@ acorn@^7.1.1, acorn@^7.4.0: integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== acorn@^8.1.0: - version "8.1.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.1.1.tgz#fb0026885b9ac9f48bac1e185e4af472971149ff" - integrity sha512-xYiIVjNuqtKXMxlRMDc6mZUhXehod4a3gbZ1qRlM7icK4EbxUFNLhWoPblCvFtB2Y9CIqHP3CF/rdxLItaQv8g== + version "8.2.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.2.2.tgz#c4574e4fea298d6e6ed4b85ab844b06dd59f26d6" + integrity sha512-VrMS8kxT0e7J1EX0p6rI/E0FbfOVcvBpbIqHThFv+f8YrZIlMfVotYcXKVPmTvPW8sW5miJzfUFrrvthUZg8VQ== addressparser@^1.0.1: version "1.0.1" @@ -1120,9 +1120,9 @@ ajv@^6.10.0, ajv@^6.12.3, ajv@^6.12.4: uri-js "^4.2.2" ajv@^8.0.1: - version "8.1.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.1.0.tgz#45d5d3d36c7cdd808930cc3e603cf6200dbeb736" - integrity sha512-B/Sk2Ix7A36fs/ZkuGLIR86EdjbgR6fsAcbx9lOP/QBSXujDNbVmIS/U4Itz5k8fPFDeVZl/zQ/gJW4Jrq6XjQ== + version "8.2.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.2.0.tgz#c89d3380a784ce81b2085f48811c4c101df4c602" + integrity sha512-WSNGFuyWd//XO8n/m/EaOlNLtO0yL8EXT/74LqT4khdhpZjP7lkj/kT5uwRmGitKEVp/Oj7ZUHeGfPtgHhQ5CA== dependencies: fast-deep-equal "^3.1.1" json-schema-traverse "^1.0.0" @@ -1552,13 +1552,13 @@ browser-process-hrtime@^1.0.0: integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== browserslist@^4.14.5: - version "4.16.5" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.5.tgz#952825440bca8913c62d0021334cbe928ef062ae" - integrity sha512-C2HAjrM1AI/djrpAUU/tr4pml1DqLIzJKSLDBXBrNErl9ZCCTXdhwxdJjYc16953+mBWf7Lw+uUJgpgb8cN71A== + version "4.16.6" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.6.tgz#d7901277a5a88e554ed305b183ec9b0c08f66fa2" + integrity sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ== dependencies: - caniuse-lite "^1.0.30001214" + caniuse-lite "^1.0.30001219" colorette "^1.2.2" - electron-to-chromium "^1.3.719" + electron-to-chromium "^1.3.723" escalade "^3.1.1" node-releases "^1.1.71" @@ -1665,10 +1665,10 @@ camelcase@^6.0.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809" integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== -caniuse-lite@^1.0.30001214: - version "1.0.30001214" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001214.tgz#70f153c78223515c6d37a9fde6cd69250da9d872" - integrity sha512-O2/SCpuaU3eASWVaesQirZv1MSjUNOvmugaD8zNSJqw6Vv5SGwoOpA9LJs3pNPfM745nxqPvfZY3MQKY4AKHYg== +caniuse-lite@^1.0.30001219: + version "1.0.30001220" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001220.tgz#c080e1c8eefb99f6cc9685da6313840bdbaf4c36" + integrity sha512-pjC2T4DIDyGAKTL4dMvGUQaMUHRmhvPpAgNNTa14jaBWHu+bLQgvpFqElxh9L4829Fdx0PlKiMp3wnYldRtECA== capture-exit@^2.0.0: version "2.0.0" @@ -2485,10 +2485,10 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= -electron-to-chromium@^1.3.719: - version "1.3.720" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.720.tgz#f5d66df8754d993006b7b2ded15ff7738c58bd94" - integrity sha512-B6zLTxxaOFP4WZm6DrvgRk8kLFYWNhQ5TrHMC0l5WtkMXhU5UbnvWoTfeEwqOruUSlNMhVLfYak7REX6oC5Yfw== +electron-to-chromium@^1.3.723: + version "1.3.725" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.725.tgz#04fc83f9189169aff50f0a00c6b4090b910cba85" + integrity sha512-2BbeAESz7kc6KBzs7WVrMc1BY5waUphk4D4DX5dSQXJhsc3tP5ZFaiyuL0AB7vUKzDYpIeYwTYlEfxyjsGUrhw== emittery@^0.7.1: version "0.7.2" @@ -2709,10 +2709,15 @@ eslint-plugin-node@^11.1.0: resolve "^1.10.1" semver "^6.1.0" +eslint-plugin-simple-import-sort@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-simple-import-sort/-/eslint-plugin-simple-import-sort-7.0.0.tgz#a1dad262f46d2184a90095a60c66fef74727f0f8" + integrity sha512-U3vEDB5zhYPNfxT5TYR7u01dboFZp+HNpnGhkDB2g/2E4wZ/g1Q9Ton8UwCLfRV9yAKyYqDh62oHOamvkFxsvw== + eslint-plugin-svelte3@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-svelte3/-/eslint-plugin-svelte3-3.1.2.tgz#3fb394a0f368ad7a77b76c0de2d68f1e4db8d407" - integrity sha512-+aGgYFC/yjhGXmBevzwICFVif8tu++C9/lRg8cE6TTS45Hw8qZ6t5wItSXVNPqnxJ212ik+bad1F0Y9A3Swo0Q== + version "3.2.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-svelte3/-/eslint-plugin-svelte3-3.2.0.tgz#a6deb4ead4b31a647ea88a3823d7c96578f74683" + integrity sha512-qdWB1QN21dEozsJFdR8XlEhMnsS6aKHjsXWuNmchYwxoet5I6QdCr1Xcq62++IzRBMCNCeH4waXqSOAdqrZzgA== eslint-scope@^5.0.0, eslint-scope@^5.1.1: version "5.1.1" @@ -2740,9 +2745,9 @@ eslint-visitor-keys@^2.0.0: integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ== eslint@^7.9.0: - version "7.24.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.24.0.tgz#2e44fa62d93892bfdb100521f17345ba54b8513a" - integrity sha512-k9gaHeHiFmGCDQ2rEfvULlSLruz6tgfA8DEn+rY9/oYPFFTlz55mM/Q/Rij1b2Y42jwZiK3lXvNTw6w6TXzcKQ== + version "7.25.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.25.0.tgz#1309e4404d94e676e3e831b3a3ad2b050031eb67" + integrity sha512-TVpSovpvCNpLURIScDRB6g5CYu/ZFq9GfX2hLNIV4dSBKxIWojeDODvYl3t0k0VtMxYeR8OXPCFE5+oHMlGfhw== dependencies: "@babel/code-frame" "7.12.11" "@eslint/eslintrc" "^0.4.0" @@ -3723,9 +3728,9 @@ is-ci@^2.0.0: ci-info "^2.0.0" is-core-module@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.2.0.tgz#97037ef3d52224d85163f5597b2b63d9afed981a" - integrity sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ== + version "2.3.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.3.0.tgz#d341652e3408bca69c4671b79a0954a3d349f887" + integrity sha512-xSphU2KG9867tsYdLD4RWQ1VqdFl4HTO9Thf3I/3dLEfr0dbPTWKsuCKrgqMljg4nPE+Gq0VCnzT3gr0CyBmsw== dependencies: has "^1.0.3" @@ -4888,46 +4893,46 @@ mixin-deep@^1.2.0: for-in "^1.0.2" is-extendable "^1.0.1" -mjml-accordion@4.9.1: - version "4.9.1" - resolved "https://registry.yarnpkg.com/mjml-accordion/-/mjml-accordion-4.9.1.tgz#d3ef75d52c9ad8f90cdc7a69da9ad003e42c0fca" - integrity sha512-IEPtf0EgMBHr2mg4wXuuN574idIiTR6XUmLnhF9EsKlJVVKabxSybLWJv81kAUqm2ld2dc/B2kT2ujLDWoQRFw== +mjml-accordion@4.9.3: + version "4.9.3" + resolved "https://registry.yarnpkg.com/mjml-accordion/-/mjml-accordion-4.9.3.tgz#d43fc306ca1a734a443d63e7445e95871af7ae57" + integrity sha512-mPpNtTs9dz14wiq/46hYxT37xGZi3PHwggZyLokj5d2GgqlQADhYoO7/TSqfKR6zIhzco0gDLjNJL5COXxOAeQ== dependencies: "@babel/runtime" "^7.8.7" lodash "^4.17.15" - mjml-core "4.9.1" + mjml-core "4.9.3" -mjml-body@4.9.1: - version "4.9.1" - resolved "https://registry.yarnpkg.com/mjml-body/-/mjml-body-4.9.1.tgz#6002edc62d57a44786e3ecc41e785fc5dba6d5d1" - integrity sha512-P6WaVsFzHC3KTpyjZ5axsEQpiozKeOqhaykE2CV8dSrDjn3uHbDY26Bzd2eg5B1pQrwDubfAUY84I86DaktZUg== +mjml-body@4.9.3: + version "4.9.3" + resolved "https://registry.yarnpkg.com/mjml-body/-/mjml-body-4.9.3.tgz#8cf918e1a92789d1934a23bcd6121b7bb82741be" + integrity sha512-PaClGgS86XtZvX3XLAOt96gob4PwwFr9o2EwRem3KgGlEtd1HLIiYAmfhwkPJtNTY8rO9qZubNqIg2iB9LfHyA== dependencies: "@babel/runtime" "^7.8.7" lodash "^4.17.15" - mjml-core "4.9.1" + mjml-core "4.9.3" -mjml-button@4.9.1: - version "4.9.1" - resolved "https://registry.yarnpkg.com/mjml-button/-/mjml-button-4.9.1.tgz#61b500b62a28ef7792a47932c1b39504c97df930" - integrity sha512-WicqC7LAuKtv+erIrTq8Q8vb3QD/fANg61sW7k1q86p1t3Co9wl6KWlMYc/9Otz/6tazSAeCxX4/AZS2ibs7Kw== +mjml-button@4.9.3: + version "4.9.3" + resolved "https://registry.yarnpkg.com/mjml-button/-/mjml-button-4.9.3.tgz#71be5942c7985af945194de241a7f2b73f98527a" + integrity sha512-KbPxXSbHboXubS6Wo8pnc+co9dB1gL+fRTmBzeSBfy8uZhv+6AaU7iIvDvMOQQ4gSbtLb6AG9yranWtQCM8YTg== dependencies: "@babel/runtime" "^7.8.7" lodash "^4.17.15" - mjml-core "4.9.1" + mjml-core "4.9.3" -mjml-carousel@4.9.1: - version "4.9.1" - resolved "https://registry.yarnpkg.com/mjml-carousel/-/mjml-carousel-4.9.1.tgz#9a357b536e5bfcf0fca8f8d686e995dc66370f74" - integrity sha512-RLIfe1V5x/KCVdJOQhCqR7FOa9GA5Lnw0t/Qe7OPgf2hUNnzs2qchQy5HHFRhQ5s5w2NfRaasXHJL48ZtihExQ== +mjml-carousel@4.9.3: + version "4.9.3" + resolved "https://registry.yarnpkg.com/mjml-carousel/-/mjml-carousel-4.9.3.tgz#ff714a329acf0247ab5ed5bf63eb115cdba5b362" + integrity sha512-9obd5NTnGVIDHWF+fmRBg19gawyI6min+2mawZbKG3ze5aUkqr308UTNOYcAWX1+E0UnSHksw570RCQhWnGFyA== dependencies: "@babel/runtime" "^7.8.7" lodash "^4.17.15" - mjml-core "4.9.1" + mjml-core "4.9.3" -mjml-cli@4.9.1: - version "4.9.1" - resolved "https://registry.yarnpkg.com/mjml-cli/-/mjml-cli-4.9.1.tgz#a0c8714ee0bfc73e1e6ace74c83b11992c04c0e8" - integrity sha512-591NX8QpvjBGjsgq1nQdXL20TqSiSo+QbFLcx+1DRac6eP4zJbkk3PSZgOUbPcpT0p9V35Og832lfl/hXWCQSw== +mjml-cli@4.9.3: + version "4.9.3" + resolved "https://registry.yarnpkg.com/mjml-cli/-/mjml-cli-4.9.3.tgz#9fe2be711cb43c110b4657fc6008ed4be988ce26" + integrity sha512-85Zw5PFhGImb3yhrnnsbl6FMDUpS5oR6HnSpyhuPNt5Z/E9fA2ilZ1sRqezjxIhh9IHhLTpmqgZZcRINFXVUKw== dependencies: "@babel/runtime" "^7.8.7" chokidar "^3.0.0" @@ -4935,25 +4940,25 @@ mjml-cli@4.9.1: html-minifier "^4.0.0" js-beautify "^1.6.14" lodash "^4.17.15" - mjml-core "4.9.1" - mjml-migrate "4.9.1" - mjml-parser-xml "4.9.1" - mjml-validator "4.9.1" + mjml-core "4.9.3" + mjml-migrate "4.9.3" + mjml-parser-xml "4.9.3" + mjml-validator "4.9.3" yargs "^16.1.0" -mjml-column@4.9.1: - version "4.9.1" - resolved "https://registry.yarnpkg.com/mjml-column/-/mjml-column-4.9.1.tgz#9706f782f32dcae09a6d8b00867a862994bb4333" - integrity sha512-XQ4cT+SQMg67dDRD1PDsNO77tgnPOwvwjThOETI35L3pN1WB3te3pkQjL1kkuzRYVebr+Qw6lJeTkIYS4TStZA== +mjml-column@4.9.3: + version "4.9.3" + resolved "https://registry.yarnpkg.com/mjml-column/-/mjml-column-4.9.3.tgz#0a983baa6092b457dfb5b2dce24598db8ffa7ee9" + integrity sha512-vEpHwLBhFCP+g+sqUvKPoLk9FZ3NeYXhKyoJwCn/o/sPrSiibUsGFEMN77ypx/ekKV3QGj6iE6dAf696NZctvw== dependencies: "@babel/runtime" "^7.8.7" lodash "^4.17.15" - mjml-core "4.9.1" + mjml-core "4.9.3" -mjml-core@4.9.1: - version "4.9.1" - resolved "https://registry.yarnpkg.com/mjml-core/-/mjml-core-4.9.1.tgz#19d6a829fbb741f869e3b634496fef4bb06bb763" - integrity sha512-+xVnK7zxqFreP1EHPsT9BTmzT9N8/aCSsSG/hhnXHf08Mo/PSNXwrbsb4tAFcC4jC/Gl9qqaRI/94Ysasmk9EA== +mjml-core@4.9.3: + version "4.9.3" + resolved "https://registry.yarnpkg.com/mjml-core/-/mjml-core-4.9.3.tgz#e79a63106abcb469f1a50df989f8489aba2187e7" + integrity sha512-MFuM6557R/brQoDALmd6SaQ1K/0t3frCvJAloL8KGOBocvJID8xN5/4iL87+KJg7k0fqXj1WSsIl9lLXtaEZfA== dependencies: "@babel/runtime" "^7.8.7" cheerio "1.0.0-rc.3" @@ -4962,263 +4967,263 @@ mjml-core@4.9.1: js-beautify "^1.6.14" juice "^7.0.0" lodash "^4.17.15" - mjml-migrate "4.9.1" - mjml-parser-xml "4.9.1" - mjml-validator "4.9.1" + mjml-migrate "4.9.3" + mjml-parser-xml "4.9.3" + mjml-validator "4.9.3" -mjml-divider@4.9.1: - version "4.9.1" - resolved "https://registry.yarnpkg.com/mjml-divider/-/mjml-divider-4.9.1.tgz#adace01da74af3514c08be10d3d96ac0378e91db" - integrity sha512-LMRdZYwYYoS7mOhjPQHC5ZG26EumXxYt5JOO8Pe+qhQlsOvXdbCEmzDn5CrfB6R/jeSJBfQ5DiCijFwZhG5Vew== +mjml-divider@4.9.3: + version "4.9.3" + resolved "https://registry.yarnpkg.com/mjml-divider/-/mjml-divider-4.9.3.tgz#3e0b13d93f8e78a4969e895937cb6d768c76c689" + integrity sha512-NSc+MksfFv+6O4ERLWn2HG8h6w1AKKGdYbT3d2cNazNeUG9GIW4C7vuUaaguy4IBjVQqZTu55vo2/GhLRVL5eA== dependencies: "@babel/runtime" "^7.8.7" lodash "^4.17.15" - mjml-core "4.9.1" + mjml-core "4.9.3" -mjml-group@4.9.1: - version "4.9.1" - resolved "https://registry.yarnpkg.com/mjml-group/-/mjml-group-4.9.1.tgz#7080c0fe4cfa442dd62ecb37f593541220651d6d" - integrity sha512-ckf6cAKZH8tkS9+uHUmW+X7l/dLrP+TIEbj1XWp0hmVDpZOlSBkrJAODxQB4bYVptlkuNGExN+d7zzGBL+edmw== +mjml-group@4.9.3: + version "4.9.3" + resolved "https://registry.yarnpkg.com/mjml-group/-/mjml-group-4.9.3.tgz#a424a5de85c194ae33aef23d6927eadbf0139800" + integrity sha512-TB8+Of4mYcJuT5Huq/RTtFyKUJ8jtk/p4QoZLGhbVo2Q6w5oWLLbp1qcTWj7B3GagLdhYfrtBrr0JRWiVaq6Kg== dependencies: "@babel/runtime" "^7.8.7" lodash "^4.17.15" - mjml-core "4.9.1" + mjml-core "4.9.3" -mjml-head-attributes@4.9.1: - version "4.9.1" - resolved "https://registry.yarnpkg.com/mjml-head-attributes/-/mjml-head-attributes-4.9.1.tgz#df64224a9eb0ba50be735a48810e4e406fc19999" - integrity sha512-C5xGhRYZHQQzZobEkM38haaBOHG41+ov+tBiUHaGnCvhlc5YRcW9QKkFq4syn8MzTpZKE3SQfEELYU6LvC480A== +mjml-head-attributes@4.9.3: + version "4.9.3" + resolved "https://registry.yarnpkg.com/mjml-head-attributes/-/mjml-head-attributes-4.9.3.tgz#6544089be53f8a68cdfc7c10c8161b284e3da232" + integrity sha512-3EqQHe081uWoQEfnozwV1tEygzeTlRPLc87+D+cfB/fB0RxfOnyXNU2SZVyvfb1hzl2LmRO4TdujxKzQvI0sow== dependencies: "@babel/runtime" "^7.8.7" lodash "^4.17.15" - mjml-core "4.9.1" + mjml-core "4.9.3" -mjml-head-breakpoint@4.9.1: - version "4.9.1" - resolved "https://registry.yarnpkg.com/mjml-head-breakpoint/-/mjml-head-breakpoint-4.9.1.tgz#5a33952923864700dbf08cd0a9957babcec6b0cd" - integrity sha512-iYTZvM1hcmSsy0ydW7puc4ACdJ4wdndezvw+FtDmPLfwIagGMTmsYUTX0E2K/x96EHdLurwpu0jl0iTrhbzsVw== +mjml-head-breakpoint@4.9.3: + version "4.9.3" + resolved "https://registry.yarnpkg.com/mjml-head-breakpoint/-/mjml-head-breakpoint-4.9.3.tgz#4caa8db156287d013b560ceb3b3f8620e48e2a07" + integrity sha512-1ZCEK14yiLOp3tnk0riPMH6myNWWOTSsIl3ScTYQcr6KEsJrAXW+MpDwr2Ri2zOmuSqCDJorEMAsb8rAHxirCQ== dependencies: "@babel/runtime" "^7.8.7" lodash "^4.17.15" - mjml-core "4.9.1" + mjml-core "4.9.3" -mjml-head-font@4.9.1: - version "4.9.1" - resolved "https://registry.yarnpkg.com/mjml-head-font/-/mjml-head-font-4.9.1.tgz#01f1b2d08d002df1595ec5027d79109ad4beeddd" - integrity sha512-EmFvuOORi7n3nz3Xjx+ZyJGPw2l190Sd5aKuNKjrfx2JswHT7UTLKbb+cOV1se3s7XprKiXtRoe5dsoD3+uDPA== +mjml-head-font@4.9.3: + version "4.9.3" + resolved "https://registry.yarnpkg.com/mjml-head-font/-/mjml-head-font-4.9.3.tgz#37956ee4945d214610dbff0d05aafc3a995365aa" + integrity sha512-ciWMNT7ZFniJDXXyXpfQy0Ep2Xvr09BPpPCVx6DfjzWcfJwLjZdIuIK3Go6NgEY7PweflrZYVorE3FUdqVEWKQ== dependencies: "@babel/runtime" "^7.8.7" lodash "^4.17.15" - mjml-core "4.9.1" + mjml-core "4.9.3" -mjml-head-html-attributes@4.9.1: - version "4.9.1" - resolved "https://registry.yarnpkg.com/mjml-head-html-attributes/-/mjml-head-html-attributes-4.9.1.tgz#2d5efdc22612471fd70d9182fc57c2dd667fdb78" - integrity sha512-VNqL6rA9AcG4DXIu4xm5K0P1XZj9dXpry6G98XeBTzmZDbxZWsS07qyrj15YWyEHGHVktXw5nZP6K3wDm8tRJQ== +mjml-head-html-attributes@4.9.3: + version "4.9.3" + resolved "https://registry.yarnpkg.com/mjml-head-html-attributes/-/mjml-head-html-attributes-4.9.3.tgz#feab7386ca3597f75e97732a5dba31623a5c1b2d" + integrity sha512-DpyJrPPJibtwHZ32l9jLSb6B06dJouOf48hU59tcfeZRWkOBsr+FfYvbNktZbmfC6+lQOOjomDGzUybIJRjFbw== dependencies: "@babel/runtime" "^7.8.7" lodash "^4.17.15" - mjml-core "4.9.1" + mjml-core "4.9.3" -mjml-head-preview@4.9.1: - version "4.9.1" - resolved "https://registry.yarnpkg.com/mjml-head-preview/-/mjml-head-preview-4.9.1.tgz#3d93ba5cd6b30c4bc03036def725207087fe8b18" - integrity sha512-38M0UqVRRPsBIU3MmH2B7sErKnMG5WdhpIQJ0LzqTOS7eQYWp4lsR7uNOV6NJZpld//6LhgglgyMvn/7t6HVqw== +mjml-head-preview@4.9.3: + version "4.9.3" + resolved "https://registry.yarnpkg.com/mjml-head-preview/-/mjml-head-preview-4.9.3.tgz#9439e930a72bbc612ea00c353d281b26d2d8be2e" + integrity sha512-4Ki+I7GREU5fFqTJBJbPwuoVeK5Azwp5lo++nYHA0LXkc3N5Zm9USOLNlvxao4PEQFZ5uS+wz3qQInjoW983TA== dependencies: "@babel/runtime" "^7.8.7" lodash "^4.17.15" - mjml-core "4.9.1" + mjml-core "4.9.3" -mjml-head-style@4.9.1: - version "4.9.1" - resolved "https://registry.yarnpkg.com/mjml-head-style/-/mjml-head-style-4.9.1.tgz#ff08678b981666a5b624a26a12c5558cdf4f5386" - integrity sha512-OxCkGzi0fNOSpTKAjjZGcjgWkgws93BzWFE0c0qr+g+LlioC6FYBLQfV6LAnke64t58Sint4ExG6guEMRPQ/Bw== +mjml-head-style@4.9.3: + version "4.9.3" + resolved "https://registry.yarnpkg.com/mjml-head-style/-/mjml-head-style-4.9.3.tgz#d657ba910c2cd3028997afd3073645ae0729ebb6" + integrity sha512-8E/8SAv0Ba3GBuz8P2raDUU7oOjwfq2uIgPCGBQNreN3cVlxBAHQBNErlv3HY5YxH36Ep0Cn0v18FxKkiADlUA== dependencies: "@babel/runtime" "^7.8.7" lodash "^4.17.15" - mjml-core "4.9.1" + mjml-core "4.9.3" -mjml-head-title@4.9.1: - version "4.9.1" - resolved "https://registry.yarnpkg.com/mjml-head-title/-/mjml-head-title-4.9.1.tgz#58d132c322d0402106e4ccb73d66fd0d42ff3faf" - integrity sha512-Myr3x8cCMyw2GUW4DL/r+jkc5oLskn/lRxsZN88GOFIka0BDK3HZnsYvMF7SAJnyIXsm+pZsdWj4tW6yrFAwcQ== +mjml-head-title@4.9.3: + version "4.9.3" + resolved "https://registry.yarnpkg.com/mjml-head-title/-/mjml-head-title-4.9.3.tgz#43f2eaca1da33a5848b1a519926349c9166a6a03" + integrity sha512-IW2Zjlujz5Wl85RsIaAzCRcItDjsTpYH6GC0qRaNvbrg28J4jc/Z34uzdwtCBvt7Q+SDnHm780HLwKRvoW5Lyg== dependencies: "@babel/runtime" "^7.8.7" lodash "^4.17.15" - mjml-core "4.9.1" + mjml-core "4.9.3" -mjml-head@4.9.1: - version "4.9.1" - resolved "https://registry.yarnpkg.com/mjml-head/-/mjml-head-4.9.1.tgz#74260a3ddb892c1120d0091677b73f2dfd716adc" - integrity sha512-xkLhofCMPNHsg6ouf3gFCJVueEPTDBkbf4s4FS65Yn5rl/Ni46fyRSRnbdgh00UyZeOQVkkkGE8EpLrZOLcgYw== +mjml-head@4.9.3: + version "4.9.3" + resolved "https://registry.yarnpkg.com/mjml-head/-/mjml-head-4.9.3.tgz#215aca27397a536f24bc774191b4963964099b1a" + integrity sha512-Mw7tcmuMhkruvDAqLHgR1M+WdjKj77Fp6YG3+j6aMTzkeCUP8eT6wQLoBVwKG8Y1XLHWVJccwFCp5ITsKG6E2A== dependencies: "@babel/runtime" "^7.8.7" lodash "^4.17.15" - mjml-core "4.9.1" + mjml-core "4.9.3" -mjml-hero@4.9.1: - version "4.9.1" - resolved "https://registry.yarnpkg.com/mjml-hero/-/mjml-hero-4.9.1.tgz#ef9e502b2f291ed38629a97b42b6f678cff07aa8" - integrity sha512-2xHYhFdDhPTNXH9TAzCKgdYPwWu0Q49/uedxnbASWQa6LbxEB1AZFplTvyx3vru7scd9zpIGS04+dELJw5Zw+Q== +mjml-hero@4.9.3: + version "4.9.3" + resolved "https://registry.yarnpkg.com/mjml-hero/-/mjml-hero-4.9.3.tgz#24ea7a472d1dc57868e21127d083a8044d341174" + integrity sha512-apzmRj2sHvmgE7qbyjiATDAUXHT6K6Ku+LUrrzerwdgxmeKmXHeeLduGQ7g4IhfNtbkB/IOqjit9e0Att6sQKg== dependencies: "@babel/runtime" "^7.8.7" lodash "^4.17.15" - mjml-core "4.9.1" + mjml-core "4.9.3" -mjml-image@4.9.1: - version "4.9.1" - resolved "https://registry.yarnpkg.com/mjml-image/-/mjml-image-4.9.1.tgz#3a81bfd0191f92f94726a8813242f030b31aa665" - integrity sha512-gWevdnpur0ctUgKuIUHZodGVZg8dUOKHASP4BOTKiDNS+PlKoBnmmZwxzBNRnFfj+ol4BZbexc5WOy1zqoQyrQ== +mjml-image@4.9.3: + version "4.9.3" + resolved "https://registry.yarnpkg.com/mjml-image/-/mjml-image-4.9.3.tgz#c8c038356f291a04c5c4cd591c74fe349e4d3224" + integrity sha512-LchR36jOcQYiOqkmIaw+lZY43+fQnO7oT3c14wEMhfyycted/cXYrOYa0gqW7pBWZAA+uLgrQ8v9PB51+Wa7OA== dependencies: "@babel/runtime" "^7.8.7" lodash "^4.17.15" - mjml-core "4.9.1" + mjml-core "4.9.3" -mjml-migrate@4.9.1: - version "4.9.1" - resolved "https://registry.yarnpkg.com/mjml-migrate/-/mjml-migrate-4.9.1.tgz#246b75e80165b84fc3f27c9befa93980d046f735" - integrity sha512-1uxxx7O2UEyP4Vvmz6peLTMlrguuOOFdMxXwoMc2c3HidfwUtqEJvQy6b357xXMcBHWmm4bBrYjWCYQ+Y1ixPA== +mjml-migrate@4.9.3: + version "4.9.3" + resolved "https://registry.yarnpkg.com/mjml-migrate/-/mjml-migrate-4.9.3.tgz#6b997e7548f22a9d6ed5c21fe0b4ffc7ad652a96" + integrity sha512-O14+3bJB+ZlwlWIx4gvmz0uu6V3ANV8WJ/dZy0hF0PRETDjr/zAjmbmtP9/qMKQTtTB/GjmMaIxvDlfR39hIYQ== dependencies: "@babel/runtime" "^7.8.7" js-beautify "^1.6.14" lodash "^4.17.15" - mjml-core "4.9.1" - mjml-parser-xml "4.9.1" + mjml-core "4.9.3" + mjml-parser-xml "4.9.3" yargs "^16.1.0" -mjml-navbar@4.9.1: - version "4.9.1" - resolved "https://registry.yarnpkg.com/mjml-navbar/-/mjml-navbar-4.9.1.tgz#07f9c1269b62fb5bc5bf6b838e383b3b836cf2cf" - integrity sha512-p9PIxpx7fIFzJKzLEouqXxJ1ZojypcZUloLgFwoz+gRZa3z3XaxsoUcLCZLVl2QK+xwbTL6kZk9PRpxSeyPi1g== +mjml-navbar@4.9.3: + version "4.9.3" + resolved "https://registry.yarnpkg.com/mjml-navbar/-/mjml-navbar-4.9.3.tgz#3c02e95a9e8de44827807bf5a8d74b7e1d4a49b8" + integrity sha512-8BjfQFszHBBa1/dHImwvUOC1xV+LkP3XeB2VA6vLAf+wd65Zw4gDd7muKNARUcHhoLqe039rbDEHbj0FOlOLhw== dependencies: "@babel/runtime" "^7.8.7" lodash "^4.17.15" - mjml-core "4.9.1" + mjml-core "4.9.3" -mjml-parser-xml@4.9.1: - version "4.9.1" - resolved "https://registry.yarnpkg.com/mjml-parser-xml/-/mjml-parser-xml-4.9.1.tgz#971b09b3071233b44a9d1027c25123a024eaf429" - integrity sha512-zHzsB3/hiFUMX/TTkcyLXR7ztIOZUsOjjkqUbSbYjwY/+qTPzYlvIBx0XCAMByLr2Wr+/YmLGkhqhXdbNX8f6Q== +mjml-parser-xml@4.9.3: + version "4.9.3" + resolved "https://registry.yarnpkg.com/mjml-parser-xml/-/mjml-parser-xml-4.9.3.tgz#919722118ac73ace483d001ba11924055960f9dc" + integrity sha512-hEwMWBIKtS7YvA9Nt+nqc5SmILzHH20MZ6P5RY8d6AKQnBR0uxZAlYR7rqC8KYjblITILuNO54dVkPrpuB/VKg== dependencies: "@babel/runtime" "^7.8.7" detect-node "2.0.4" htmlparser2 "^4.1.0" lodash "^4.17.15" -mjml-preset-core@4.9.1: - version "4.9.1" - resolved "https://registry.yarnpkg.com/mjml-preset-core/-/mjml-preset-core-4.9.1.tgz#7e121fc86e9711c957731bc22e620af6aa32e42a" - integrity sha512-cX74oaXvPkwBY/OaqL6UaBgt5BLRxNCQP/pd1jW5Yaw/9hKciWKnGm7iCl2MjalZ7dwJTlYHbU6L3sRCR/P3Og== +mjml-preset-core@4.9.3: + version "4.9.3" + resolved "https://registry.yarnpkg.com/mjml-preset-core/-/mjml-preset-core-4.9.3.tgz#2718cc405c5491a9cc27bf4733d470f9f5d35c10" + integrity sha512-A28CiAZAMYaiKQ12JGI2bQ654piYXfVcmA+NkjNlZRDC9n0C38Ey4mGrVUMXg38v2ElpvMMpjA23CW368XZwLw== dependencies: "@babel/runtime" "^7.8.7" - mjml-accordion "4.9.1" - mjml-body "4.9.1" - mjml-button "4.9.1" - mjml-carousel "4.9.1" - mjml-column "4.9.1" - mjml-divider "4.9.1" - mjml-group "4.9.1" - mjml-head "4.9.1" - mjml-head-attributes "4.9.1" - mjml-head-breakpoint "4.9.1" - mjml-head-font "4.9.1" - mjml-head-html-attributes "4.9.1" - mjml-head-preview "4.9.1" - mjml-head-style "4.9.1" - mjml-head-title "4.9.1" - mjml-hero "4.9.1" - mjml-image "4.9.1" - mjml-navbar "4.9.1" - mjml-raw "4.9.1" - mjml-section "4.9.1" - mjml-social "4.9.1" - mjml-spacer "4.9.1" - mjml-table "4.9.1" - mjml-text "4.9.1" - mjml-wrapper "4.9.1" + mjml-accordion "4.9.3" + mjml-body "4.9.3" + mjml-button "4.9.3" + mjml-carousel "4.9.3" + mjml-column "4.9.3" + mjml-divider "4.9.3" + mjml-group "4.9.3" + mjml-head "4.9.3" + mjml-head-attributes "4.9.3" + mjml-head-breakpoint "4.9.3" + mjml-head-font "4.9.3" + mjml-head-html-attributes "4.9.3" + mjml-head-preview "4.9.3" + mjml-head-style "4.9.3" + mjml-head-title "4.9.3" + mjml-hero "4.9.3" + mjml-image "4.9.3" + mjml-navbar "4.9.3" + mjml-raw "4.9.3" + mjml-section "4.9.3" + mjml-social "4.9.3" + mjml-spacer "4.9.3" + mjml-table "4.9.3" + mjml-text "4.9.3" + mjml-wrapper "4.9.3" -mjml-raw@4.9.1: - version "4.9.1" - resolved "https://registry.yarnpkg.com/mjml-raw/-/mjml-raw-4.9.1.tgz#1dbe8691341dd0e859495036640c07002d2a6de9" - integrity sha512-ADFJJLoQ0guQ61+p2uJbkM2pb+P1YGjnaz3bm13DCbntcEnFxQthAqgLROxT3URT/O93OSGVkrNGClqYesAG0A== +mjml-raw@4.9.3: + version "4.9.3" + resolved "https://registry.yarnpkg.com/mjml-raw/-/mjml-raw-4.9.3.tgz#c47c33dfe70c3e37f65adf12b0cfc343157ea72f" + integrity sha512-e2OknBwuiQvaLxHOH9OXSlmHEx7EqczkWdNS//TE1rsRcTQvLXzuajuMt+Oa72UZY85B/vw/iNk/Gm/jRSvieA== dependencies: "@babel/runtime" "^7.8.7" lodash "^4.17.15" - mjml-core "4.9.1" + mjml-core "4.9.3" -mjml-section@4.9.1: - version "4.9.1" - resolved "https://registry.yarnpkg.com/mjml-section/-/mjml-section-4.9.1.tgz#6031b1c6bd967fc2e8974a9e232ade8c3cb7a2c7" - integrity sha512-BsmyAebmIsxa11RUM7juNHWuPwWyqZFDU45ozKL1X1nfayy/S9YLWMAipsZvlM9WvarS5DvLQSeW6TOiZE2/WQ== +mjml-section@4.9.3: + version "4.9.3" + resolved "https://registry.yarnpkg.com/mjml-section/-/mjml-section-4.9.3.tgz#b0bb01902c948aac3fc114a5a874f87bc81c9cf2" + integrity sha512-B7mXgT5yrNhPHTrMRHyPTiKs8rfiM9VRUEL078PCEqczrUtlIQUTVBrfDkwxUIXbNPDhpB8yUxs4i89DA+vX4g== dependencies: "@babel/runtime" "^7.8.7" lodash "^4.17.15" - mjml-core "4.9.1" + mjml-core "4.9.3" -mjml-social@4.9.1: - version "4.9.1" - resolved "https://registry.yarnpkg.com/mjml-social/-/mjml-social-4.9.1.tgz#4da32cbced1ea47f35b389e6c6614edc6b05e761" - integrity sha512-RcNGXKRKvBWwO4uPN9OL4xMEAqjAx1zpplLWjaxS+q4ADjlQs+DKDQpAXQEMNGUcwQSAN40hTNt/eZWuwZOxsg== +mjml-social@4.9.3: + version "4.9.3" + resolved "https://registry.yarnpkg.com/mjml-social/-/mjml-social-4.9.3.tgz#c561d0bcc767091e52ffb8a32878db9e74f963a5" + integrity sha512-kslVluCHXbXTpL7bclOVHUfHIwhLy+HaEHXilJtyxo0YfH68APRe5y9ikJqTZ6zVa2ziAjvHPMU5f200eZjqdA== dependencies: "@babel/runtime" "^7.8.7" lodash "^4.17.15" - mjml-core "4.9.1" + mjml-core "4.9.3" -mjml-spacer@4.9.1: - version "4.9.1" - resolved "https://registry.yarnpkg.com/mjml-spacer/-/mjml-spacer-4.9.1.tgz#9a9067c0408609e059e4eab396b43cac95f2b5be" - integrity sha512-+Rabasldc5dqLuTE6LESIMSVsc1v2AiqVqWwYbV8kWHCVjbpITeUd9b9ouueW5XOXQsSQ0nabKjkk39F0BW+mw== +mjml-spacer@4.9.3: + version "4.9.3" + resolved "https://registry.yarnpkg.com/mjml-spacer/-/mjml-spacer-4.9.3.tgz#41f95fe58c9b1f5eb51269073747e1276232fb9c" + integrity sha512-fqF0qbDoTjq24D4t0kX+CiMEn5MAoxDG+fHz3k6ruwIsijs/77LiumkOL97H9tnFapnw8jJNJUC6UIT0LQTC1A== dependencies: "@babel/runtime" "^7.8.7" lodash "^4.17.15" - mjml-core "4.9.1" + mjml-core "4.9.3" -mjml-table@4.9.1: - version "4.9.1" - resolved "https://registry.yarnpkg.com/mjml-table/-/mjml-table-4.9.1.tgz#0c7f9417f8dbb6a93b322bb1f92b93cf66645f98" - integrity sha512-u1oGV6gBqKG59vkXb86ziVEqFU5/GB5RvfCuqGw33HzZn4jvlnGlGPoUrQt/pY/xEEy0EhkbP+XhoNql5ZeO3g== +mjml-table@4.9.3: + version "4.9.3" + resolved "https://registry.yarnpkg.com/mjml-table/-/mjml-table-4.9.3.tgz#e66e1fcd644e144edb383af94ff88508a0cf5f27" + integrity sha512-5dlpAisy2GgteLZ5DhYrfjCiQKcoDHDd8h7idvdQWAx0/8cbbjo+t+EHLfIuxkhcm8cDlJLOjb//AVk2qxBuVw== dependencies: "@babel/runtime" "^7.8.7" lodash "^4.17.15" - mjml-core "4.9.1" + mjml-core "4.9.3" -mjml-text@4.9.1: - version "4.9.1" - resolved "https://registry.yarnpkg.com/mjml-text/-/mjml-text-4.9.1.tgz#49135c5a7630974479d2bc53c921ea6dadd49888" - integrity sha512-0Hig1vU5tHXN+s5Scta/UoJQuVQI2GUPgUnrRoPoFC+ZX0XPHT7wRhHJMPYokrZ+RF3kpOSoQd/4UKyBs0yYDA== +mjml-text@4.9.3: + version "4.9.3" + resolved "https://registry.yarnpkg.com/mjml-text/-/mjml-text-4.9.3.tgz#55b1424f04c252dbbbf5d793932b5496f5e88005" + integrity sha512-X30kIUhjF4cH2eF4yZcMgkhbHIOTfbcOqDMjav/i6FRnIXJXNkAHoNZ/bGsEYqOcN7pECTwDwFgZK5Igres/dg== dependencies: "@babel/runtime" "^7.8.7" lodash "^4.17.15" - mjml-core "4.9.1" + mjml-core "4.9.3" -mjml-validator@4.9.1: - version "4.9.1" - resolved "https://registry.yarnpkg.com/mjml-validator/-/mjml-validator-4.9.1.tgz#4eadf8ab400545cbc0d08fb4329eb410713d213b" - integrity sha512-DElsLG529ZcGGx6BcIi9UMV0LBKvrV/r1nWDlER1mG29rBaDfBtGKV1jR2Ipeu0/37rnd8ldS8Ici8cMNC8W0A== +mjml-validator@4.9.3: + version "4.9.3" + resolved "https://registry.yarnpkg.com/mjml-validator/-/mjml-validator-4.9.3.tgz#e5dacf58b15032086c2a779472bc6c5d715bc1f5" + integrity sha512-k6qH9Sd7fwIklYh1LFjTFSB36vkIte41iC5XhAyMTYG3x9I03Cjw3KkEmGOrlbV0T1nOAuz3Iy+2rMcW26U6zQ== dependencies: "@babel/runtime" "^7.8.7" -mjml-wrapper@4.9.1: - version "4.9.1" - resolved "https://registry.yarnpkg.com/mjml-wrapper/-/mjml-wrapper-4.9.1.tgz#25207bd58d1ffb3ab7dd51ee11adbd8281727866" - integrity sha512-y2gL0eEsYjX+obNCyVrZORxcE6FNJ+OzljT+a7gFWsRRHvJR45o06+OmlWJDmY2TajHuF1rrO1d1LMMpRsz0Dw== +mjml-wrapper@4.9.3: + version "4.9.3" + resolved "https://registry.yarnpkg.com/mjml-wrapper/-/mjml-wrapper-4.9.3.tgz#b26c38dd3332290030068308d04255fa37ba3081" + integrity sha512-F3PLghHqiusp2ax7eBtkjL0z1FJkQKHm1Jy9VCjCQSsqg8nqZ7iz6W2V/xo0pNeJWPQqoHW0bX0GK5aNP1aL2g== dependencies: "@babel/runtime" "^7.8.7" lodash "^4.17.15" - mjml-core "4.9.1" - mjml-section "4.9.1" + mjml-core "4.9.3" + mjml-section "4.9.3" mjml@^4.6.2: - version "4.9.1" - resolved "https://registry.yarnpkg.com/mjml/-/mjml-4.9.1.tgz#92746a50f72b9d9f3cf6e9237d48d125035f7254" - integrity sha512-tzwFdv2Mzt8PqC97F6L5Ci+vMXqoXhNJPfW+hFEUXgv5//buRSX+d2LOdraNGgKRi26bZ2SQA6JDXWpzNUKZLA== + version "4.9.3" + resolved "https://registry.yarnpkg.com/mjml/-/mjml-4.9.3.tgz#670dab24030ea7b40d92041c83db13e56e7b8290" + integrity sha512-l3KzyBj8EkdkBwdFTFUHbkAXLDfyyFSkcm9YwLbMTLa6kX7Wyfo26v62iVRKX9aUnys2JkoSgP0JNBx7i0+chg== dependencies: "@babel/runtime" "^7.8.7" - mjml-cli "4.9.1" - mjml-core "4.9.1" - mjml-migrate "4.9.1" - mjml-preset-core "4.9.1" - mjml-validator "4.9.1" + mjml-cli "4.9.3" + mjml-core "4.9.3" + mjml-migrate "4.9.3" + mjml-preset-core "4.9.3" + mjml-validator "4.9.3" mkdirp@1.x, mkdirp@^1.0.3, mkdirp@^1.0.4: version "1.0.4" @@ -5347,9 +5352,9 @@ nodemailer@^3.1.1: integrity sha1-/r+sy0vSc2eEc6MJxstLSi88SOM= nodemailer@^6.4.6: - version "6.5.0" - resolved "https://registry.yarnpkg.com/nodemailer/-/nodemailer-6.5.0.tgz#d12c28d8d48778918e25f1999d97910231b175d9" - integrity sha512-Tm4RPrrIZbnqDKAvX+/4M+zovEReiKlEXWDzG4iwtpL9X34MJY+D5LnQPH/+eghe8DLlAVshHAJZAZWBGhkguw== + version "6.6.0" + resolved "https://registry.yarnpkg.com/nodemailer/-/nodemailer-6.6.0.tgz#ed47bb572b48d9d0dca3913fdc156203f438f427" + integrity sha512-ikSMDU1nZqpo2WUPE0wTTw/NGGImTkwpJKDIFPZT+YvvR9Sj+ze5wzu95JHkBMglQLoG2ITxU21WukCC/XsFkg== nodemon@^2.0.6: version "2.0.7" @@ -6292,9 +6297,9 @@ rollup-pluginutils@^2.8.2: estree-walker "^0.6.1" rollup@^2.42.3: - version "2.45.2" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.45.2.tgz#8fb85917c9f35605720e92328f3ccbfba6f78b48" - integrity sha512-kRRU7wXzFHUzBIv0GfoFFIN3m9oteY4uAsKllIpQDId5cfnkWF2J130l+27dzDju0E6MScKiV0ZM5Bw8m4blYQ== + version "2.46.0" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.46.0.tgz#8cacf89d2ee31a34755f1af40a665168f592b829" + integrity sha512-qPGoUBNl+Z8uNu0z7pD3WPTABWRbcOwIrO/5ccDJzmrtzn0LVf6Lj91+L5CcWhXl6iWf23FQ6m8Jkl2CmN1O7Q== optionalDependencies: fsevents "~2.3.1" @@ -6947,9 +6952,9 @@ supports-hyperlinks@^2.0.0: supports-color "^7.0.0" svelte-check@^1.2.3: - version "1.5.0" - resolved "https://registry.yarnpkg.com/svelte-check/-/svelte-check-1.5.0.tgz#d0ee742ef9969f8b88c10919076e254802d81736" - integrity sha512-DdzUGxd5MLryW80sr695XIRCps8YS0E2VRJj9cXA3g/hXldozoxc/RDx0ZGV/sxoAU5nxgcH3A2kN0jJhnJKdg== + version "1.5.2" + resolved "https://registry.yarnpkg.com/svelte-check/-/svelte-check-1.5.2.tgz#783f48a8e3b3e484b3bcfb990ff5102348c63a23" + integrity sha512-x9Pc13r814TKrMXY70IyqDEmPzuFiqNSpBmsrMKrFpi995MiG+lmqYnyw8iQC+DGh7H3eUt3LIFXbNd396XIFw== dependencies: chalk "^4.0.0" chokidar "^3.4.1" @@ -6971,9 +6976,9 @@ svelte-preprocess@4.6.9: strip-indent "^3.0.0" svelte-preprocess@^4.0.0: - version "4.7.2" - resolved "https://registry.yarnpkg.com/svelte-preprocess/-/svelte-preprocess-4.7.2.tgz#e16bf5cc152df8097485ce8c7842073a83a12b1e" - integrity sha512-EToG+08rEsA33btv+C5g2qnRArwpTc5AoU0QBB3ZEkYagxAb2yPNsy0qsmtvbJOTBMy6o3oyijDdl3DMpMvpEg== + version "4.7.3" + resolved "https://registry.yarnpkg.com/svelte-preprocess/-/svelte-preprocess-4.7.3.tgz#454fa059c2400b15e7a3caeca18993cff9df0e96" + integrity sha512-Zx1/xLeGOIBlZMGPRCaXtlMe4ZA0faato5Dc3CosEqwu75MIEPuOstdkH6cy+RYTUYynoxzNaDxkPX4DbrPwRA== dependencies: "@types/pug" "^2.0.4" "@types/sass" "^1.16.0" @@ -6981,9 +6986,9 @@ svelte-preprocess@^4.0.0: strip-indent "^3.0.0" svelte@^3.35.0: - version "3.37.0" - resolved "https://registry.yarnpkg.com/svelte/-/svelte-3.37.0.tgz#dc7cd24bcc275cdb3f8c684ada89e50489144ccd" - integrity sha512-TRF30F4W4+d+Jr2KzUUL1j8Mrpns/WM/WacxYlo5MMb2E5Qy2Pk1Guj6GylxsW9OnKQl1tnF8q3hG/hQ3h6VUA== + version "3.38.1" + resolved "https://registry.yarnpkg.com/svelte/-/svelte-3.38.1.tgz#5d856a9d643f56a8d3e281f6dd8b4f8962155ca5" + integrity sha512-N3XLAyfzqrFxwRLevBeW7Dke9ZlHRVGSIed5abo4Drvj+zvd2OyWpFa1x4nQUc8Lnvt4Kcn8/5le1peRDybNqg== symbol-tree@^3.2.4: version "3.2.4" @@ -6991,9 +6996,9 @@ symbol-tree@^3.2.4: integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== table@^6.0.4: - version "6.3.4" - resolved "https://registry.yarnpkg.com/table/-/table-6.3.4.tgz#5d8a7fa1c887bd1ef08741751ec36246255a80b6" - integrity sha512-fhKcZ3+oAYG/ld3seJEZ9+fGSsy+yeoPzLQUrwbOzNYdhrU+6TzObhJ2Sp76ZfUGIrDTrxsXz5NSCZJIUOJb4Q== + version "6.6.0" + resolved "https://registry.yarnpkg.com/table/-/table-6.6.0.tgz#905654b79df98d9e9a973de1dd58682532c40e8e" + integrity sha512-iZMtp5tUvcnAdtHpZTWLPF0M7AgiQsURR2DwmxnJwSy8I3+cY+ozzVvYha3BOLG2TB+L0CqjIz+91htuj6yCXg== dependencies: ajv "^8.0.1" lodash.clonedeep "^4.5.0" @@ -7001,6 +7006,7 @@ table@^6.0.4: lodash.truncate "^4.4.2" slice-ansi "^4.0.0" string-width "^4.2.0" + strip-ansi "^6.0.0" tar@^6.1.0: version "6.1.0" @@ -7028,9 +7034,9 @@ terminal-link@^2.0.0: supports-hyperlinks "^2.0.0" terser@^5.0.0: - version "5.6.1" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.6.1.tgz#a48eeac5300c0a09b36854bf90d9c26fb201973c" - integrity sha512-yv9YLFQQ+3ZqgWCUk+pvNJwgUTdlIxUk1WTN+RnaFJe2L7ipG2csPT0ra2XRm7Cs8cxN7QXmK1rFzEwYEQkzXw== + version "5.7.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.7.0.tgz#a761eeec206bc87b605ab13029876ead938ae693" + integrity sha512-HP5/9hp2UaZt5fYkuhNBR8YyRcT8juw8+uFbAme53iN9hblvKnLUTKkmwJG6ocWpIKf8UK4DoeWG4ty0J6S6/g== dependencies: commander "^2.20.0" source-map "~0.7.2" @@ -7277,9 +7283,9 @@ typescript@*, typescript@^4.0.2: integrity sha512-V+evlYHZnQkaz8TRBuxTA92yZBPotr5H+WhQ7bD3hZUndx5tGOa1fuCgeSjxAzM1RiN5IzvadIXTVefuuwZCRg== uglify-js@^3.5.1: - version "3.13.4" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.13.4.tgz#592588bb9f47ae03b24916e2471218d914955574" - integrity sha512-kv7fCkIXyQIilD5/yQy8O+uagsYIOt5cZvs890W40/e/rvjMSzJw81o9Bg0tkURxzZBROtDQhW2LFjOGoK3RZw== + version "3.13.5" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.13.5.tgz#5d71d6dbba64cf441f32929b1efce7365bb4f113" + integrity sha512-xtB8yEqIkn7zmOyS2zUNBsYCBRhDkvlNxMMY2smuJ/qA8NCHeQvKCF3i9Z4k8FJH4+PJvZRtMrPynfZ75+CSZw== uid-safe@~2.1.5: version "2.1.5"